user: Translate the below assembly code into C programming language:

```asm
<ceph_armor_line_break>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,0x18(%rsp)
  mov    %r8d,0xc(%rsp)
  cmp    %rcx,%rdx
  jae    L228
  mov    %rsi,%r12
  mov    %rdx,%rbp
  mov    %rcx,%r15
  movl   $0x0,0x8(%rsp)
  movl   $0x0,0x14(%rsp)
  lea    0x18(%rsp),%r13
  jmp    L165
L220:
  mov    0x10(%rsp),%edi
  shl    $0x2,%edi
  and    $0x3c,%edi
  call   <encode_bits@plt>
  movsbl %al,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
  mov    $0x3d,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  jns    L211
  jmp    L117
L189:
  mov    %ebx,%edi
  shl    $0x4,%edi
  and    $0x30,%edi
  call   <encode_bits@plt>
  movsbl %al,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
  mov    $0x3d,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
  mov    $0x3d,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
L211:
  mov    0x8(%rsp),%eax
  add    $0x4,%eax
  mov    0xc(%rsp),%ecx
  cmp    %ecx,%eax
  jne    L36
  test   %ecx,%ecx
  je     L36
L174:
  mov    $0xa,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
  addl   $0x5,0x14(%rsp)
  mov    %r14,%rbp
  movl   $0x0,0x8(%rsp)
L183:
  cmp    %rbp,%r15
  jbe    L10
L165:
  lea    0x1(%rbp),%r14
  movzbl 0x0(%rbp),%ebx
  mov    %ebx,%edi
  shr    $0x2,%dil
  movzbl %dil,%edi
  call   <encode_bits@plt>
  movsbl %al,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
  cmp    %r14,%r15
  jbe    L189
  lea    0x2(%rbp),%r14
  movzbl 0x1(%rbp),%eax
  shl    $0x4,%ebx
  mov    %ebx,%edi
  and    $0x30,%edi
  mov    %al,0x10(%rsp)
  shr    $0x4,%al
  or     %eax,%edi
  movzbl %dil,%edi
  call   <encode_bits@plt>
  movsbl %al,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
  cmp    %r14,%r15
  jbe    L220
  lea    0x3(%rbp),%r14
  movzbl 0x2(%rbp),%ebx
  movzbl 0x10(%rsp),%edi
  shl    $0x2,%edi
  and    $0x3c,%edi
  mov    %ebx,%eax
  shr    $0x6,%al
  or     %eax,%edi
  movzbl %dil,%edi
  call   <encode_bits@plt>
  movsbl %al,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
  mov    %ebx,%edi
  and    $0x3f,%edi
  call   <encode_bits@plt>
  movsbl %al,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L117
  mov    0x14(%rsp),%eax
  add    $0x4,%eax
  addl   $0x4,0x8(%rsp)
  mov    0x8(%rsp),%esi
  mov    0xc(%rsp),%ecx
  test   %ecx,%ecx
  je     L124
  cmp    %ecx,%esi
  je     L174
L124:
  mov    %r14,%rbp
  mov    %eax,0x14(%rsp)
  jmp    L183
L10:
  mov    0x14(%rsp),%eax
  jmp    L117
L228:
  mov    $0x0,%eax
  jmp    L117
L36:
  mov    0x14(%rsp),%eax
  add    $0x4,%eax
L117:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int ceph_armor_line_break(char *dst, const char *dst_end, const char *src, const char *end, int line_width) {
  int olen = 0;
  int line = 0;
  while (src < end) {
    unsigned char a;
    a = *src++;
    do {
      int __ret = set_str_val(&dst, dst_end, encode_bits(a >> 2));
      if (__ret < 0)
        return __ret;
    } while (0);
    ;
    if (src < end) {
      unsigned char b;
      b = *src++;
      do {
        int __ret = set_str_val(&dst, dst_end, encode_bits(((a & 3) << 4) | (b >> 4)));
        if (__ret < 0)
          return __ret;
      } while (0);
      ;
      if (src < end) {
        unsigned char c;
        c = *src++;
        do {
          int __ret = set_str_val(&dst, dst_end, encode_bits(((b & 15) << 2) | (c >> 6)));
          if (__ret < 0)
            return __ret;
        } while (0);
        ;
        do {
          int __ret = set_str_val(&dst, dst_end, encode_bits(c & 63));
          if (__ret < 0)
            return __ret;
        } while (0);
        ;
      } else {
        do {
          int __ret = set_str_val(&dst, dst_end, encode_bits((b & 15) << 2));
          if (__ret < 0)
            return __ret;
        } while (0);
        ;
        do {
          int __ret = set_str_val(&dst, dst_end, '=');
          if (__ret < 0)
            return __ret;
        } while (0);
        ;
      }
    } else {
      do {
        int __ret = set_str_val(&dst, dst_end, encode_bits(((a & 3) << 4)));
        if (__ret < 0)
          return __ret;
      } while (0);
      ;
      do {
        int __ret = set_str_val(&dst, dst_end, '=');
        if (__ret < 0)
          return __ret;
      } while (0);
      ;
      do {
        int __ret = set_str_val(&dst, dst_end, '=');
        if (__ret < 0)
          return __ret;
      } while (0);
      ;
    }
    olen += 4;
    line += 4;
    if (line_width && line == line_width) {
      line = 0;
      do {
        int __ret = set_str_val(&dst, dst_end, '\n');
        if (__ret < 0)
          return __ret;
      } while (0);
      ;
      olen++;
    }
  }
  return olen;
}
```