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

```asm
<microqr_expand_binary>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%r13
  mov    %rsi,%r14
  mov    %edx,%r12d
  call   <strlen@plt>
  mov    %rax,%r15
  mov    $0x0,%ebx
  jmp    L247
  lea    D104(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  add    $0x1,%ebx
  jmp    L69
  lea    D110(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  add    $0x1,%ebx
  jmp    L69
  cmp    $0x2,%r12d
  je     L189
  cmp    $0x3,%r12d
  je     L133
  cmp    $0x1,%r12d
  je     L93
L269:
  lea    0x3(%r12),%esi
  movsbl 0x1(%r13,%rbp,1),%edi
  mov    %r14,%rdx
  call   <bin_append@plt>
  add    $0x2,%ebx
  jmp    L69
L93:
  lea    D110(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L269
L189:
  lea    D58(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L269
L133:
  lea    D33(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L269
  cmp    $0x2,%r12d
  je     L260
  cmp    $0x3,%r12d
  je     L129
  cmp    $0x1,%r12d
  je     L48
L70:
  lea    0x2(%r12),%esi
  movsbl 0x1(%r13,%rbp,1),%edi
  mov    %r14,%rdx
  call   <bin_append@plt>
  add    $0x2,%ebx
  jmp    L69
L48:
  lea    D104(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L70
L260:
  lea    D36(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L70
L129:
  lea    D52(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L70
  cmp    $0x2,%r12d
  je     L165
  cmp    $0x3,%r12d
  je     L255
L130:
  lea    0x2(%r12),%esi
  movsbl 0x1(%r13,%rbp,1),%edi
  mov    %r14,%rdx
  call   <bin_append@plt>
  add    $0x2,%ebx
L69:
  movslq %ebx,%rax
  cmp    %r15,%rax
  jae    L265
L247:
  movslq %ebx,%rbp
  movzbl 0x0(%r13,%rbp,1),%eax
  sub    $0x30,%eax
  cmp    $0x1e,%al
  ja     L69
  movzbl %al,%eax
  lea    D90(%rip),%rcx
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
L165:
  lea    D7(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L130
L255:
  lea    D81(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L130
  cmp    $0x2,%r12d
  je     L66
  cmp    $0x3,%r12d
  je     L84
L273:
  lea    0x1(%r12),%esi
  movsbl 0x1(%r13,%rbp,1),%edi
  mov    %r14,%rdx
  call   <bin_append@plt>
  add    $0x2,%ebx
  jmp    L69
L66:
  lea    D1(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L273
L84:
  lea    D102(%rip),%rsi
  mov    %r14,%rdi
  call   <strcat@plt>
  jmp    L273
L265:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D104
type_guessed: string
name: parse_data
arguments: data_tag: D110
type_guessed: string
name: parse_data
arguments: data_tag: D58
type_guessed: string
name: parse_data
arguments: data_tag: D33
type_guessed: string
name: parse_data
arguments: data_tag: D36
type_guessed: string
name: parse_data
arguments: data_tag: D52
type_guessed: string
name: parse_data
arguments: data_tag: D7
type_guessed: string
name: parse_data
arguments: data_tag: D81
type_guessed: string
name: parse_data
arguments: data_tag: D1
type_guessed: string
name: parse_data
arguments: data_tag: D102
type_guessed: string

tool: D104: 1

tool: D110: 0

tool: D58: 00

tool: D33: 000

tool: D36: 01

tool: D52: 001

tool: D7: 10

tool: D81: 010

tool: D1: 11

tool: D102: 011

assistant: ```c
void microqr_expand_binary(const char binary_stream[], char full_stream[], const int version) {
  int i;
  size_t length;
  length = strlen(binary_stream);
  i = 0;
  do {
    switch (binary_stream[i]) {
    case '1':
      strcat(full_stream, "1");
      i++;
      break;
    case '0':
      strcat(full_stream, "0");
      i++;
      break;
    case 'N':
      switch (version) {
      case 1:
        strcat(full_stream, "0");
        break;
      case 2:
        strcat(full_stream, "00");
        break;
      case 3:
        strcat(full_stream, "000");
        break;
      }
      bin_append(binary_stream[i + 1], 3 + version, full_stream);
      i += 2;
      break;
    case 'A':
      switch (version) {
      case 1:
        strcat(full_stream, "1");
        break;
      case 2:
        strcat(full_stream, "01");
        break;
      case 3:
        strcat(full_stream, "001");
        break;
      }
      bin_append(binary_stream[i + 1], 2 + version, full_stream);
      i += 2;
      break;
    case 'B':
      switch (version) {
      case 2:
        strcat(full_stream, "10");
        break;
      case 3:
        strcat(full_stream, "010");
        break;
      }
      bin_append(binary_stream[i + 1], 2 + version, full_stream);
      i += 2;
      break;
    case 'K':
      switch (version) {
      case 2:
        strcat(full_stream, "11");
        break;
      case 3:
        strcat(full_stream, "011");
        break;
      }
      bin_append(binary_stream[i + 1], 1 + version, full_stream);
      i += 2;
      break;
    }
  } while (i < length);
}
```