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

```asm
<vp8_blit_text>:
  endbr64
  sub    $0x118,%rsp
  mov    %rdi,%r10
  mov    %rsi,%r8
  mov    $0x20,%ecx
  mov    %fs:0x28,%rax
  mov    %rax,0x108(%rsp)
  xor    %eax,%eax
  mov    %rsp,%rdi
  lea    D5(%rip),%rsi
  movzbl (%r10),%r9d
  rep movsq %ds:(%rsi),%es:(%rdi)
  mov    (%rsi),%eax
  mov    %eax,(%rdi)
  test   %r9b,%r9b
  je     L2
  lea    0x0(,%rdx,4),%edi
  movslq %edx,%rdx
  add    $0x1,%r10
  lea    (%r8,%rdx,1),%rsi
  movslq %edi,%rdi
  lea    (%rsi,%rdx,1),%rcx
  add    %rcx,%rdx
  nopl   0x0(%rax,%rax,1)
L14:
  lea    -0x20(%r9),%eax
  cmp    $0x3a,%al
  jbe    L40
  lea    -0x61(%r9),%r11d
  xor    %eax,%eax
  cmp    $0x19,%r11b
  ja     L41
  lea    -0x40(%r9),%eax
L40:
  movsbq %al,%rax
  mov    (%rsp,%rax,4),%eax
L41:
  mov    %eax,%r9d
  mov    %eax,%r11d
  sar    $0x1e,%r9d
  sar    $0x1f,%r11d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x6(%r8)
  mov    %eax,%r9d
  sar    $0x19,%r9d
  mov    %r11b,0x6(%rsi)
  and    $0x1,%r9d
  mov    %r11b,0x6(%rcx)
  neg    %r9d
  mov    %r11b,0x6(%rdx)
  mov    %r11b,0x6(%r8,%rdi,1)
  mov    %r9b,0x5(%r8)
  mov    %eax,%r9d
  sar    $0x1a,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x5(%rsi)
  mov    %eax,%r9d
  sar    $0x1b,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x5(%rcx)
  mov    %eax,%r9d
  sar    $0x1c,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x5(%rdx)
  mov    %eax,%r9d
  sar    $0x1d,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x5(%r8,%rdi,1)
  mov    %eax,%r9d
  sar    $0x14,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x4(%r8)
  mov    %eax,%r9d
  sar    $0x15,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x4(%rsi)
  mov    %eax,%r9d
  sar    $0x16,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x4(%rcx)
  mov    %eax,%r9d
  sar    $0x17,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x4(%rdx)
  mov    %eax,%r9d
  sar    $0x18,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x4(%r8,%rdi,1)
  mov    %eax,%r9d
  sar    $0xf,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x3(%r8)
  mov    %eax,%r9d
  sar    $0x10,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x3(%rsi)
  mov    %eax,%r9d
  sar    $0x11,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x3(%rcx)
  mov    %eax,%r9d
  sar    $0x12,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x3(%rdx)
  mov    %eax,%r9d
  sar    $0x13,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x3(%r8,%rdi,1)
  mov    %eax,%r9d
  sar    $0xa,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x2(%r8)
  mov    %eax,%r9d
  sar    $0xb,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x2(%rsi)
  mov    %eax,%r9d
  sar    $0xc,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x2(%rcx)
  mov    %eax,%r9d
  sar    $0xd,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x2(%rdx)
  mov    %eax,%r9d
  sar    $0xe,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,0x2(%r8,%rdi,1)
  mov    %eax,%r9d
  sar    $0x5,%r9d
  add    $0x7,%r8
  add    $0x7,%rsi
  add    $0x7,%rcx
  and    $0x1,%r9d
  add    $0x7,%rdx
  add    $0x1,%r10
  neg    %r9d
  mov    %r9b,-0x6(%r8)
  mov    %eax,%r9d
  sar    $0x6,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,-0x6(%rsi)
  mov    %eax,%r9d
  sar    $0x7,%r9b
  mov    %r9b,-0x6(%rcx)
  mov    %eax,%r9d
  sar    $0x8,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,-0x6(%rdx)
  mov    %eax,%r9d
  sar    $0x9,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,-0x6(%r8,%rdi,1)
  mov    %eax,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,-0x7(%r8)
  mov    %eax,%r9d
  sar    %r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,-0x7(%rsi)
  mov    %eax,%r9d
  sar    $0x2,%r9d
  and    $0x1,%r9d
  neg    %r9d
  mov    %r9b,-0x7(%rcx)
  mov    %eax,%r9d
  sar    $0x4,%eax
  sar    $0x3,%r9d
  and    $0x1,%eax
  and    $0x1,%r9d
  neg    %eax
  neg    %r9d
  mov    %r9b,-0x7(%rdx)
  mov    %al,-0x7(%r8,%rdi,1)
  movzbl -0x1(%r10),%r9d
  test   %r9b,%r9b
  jne    L14
L2:
  mov    0x108(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L44
  add    $0x118,%rsp
  ret
L44:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: tag: D5
datatype: string

tool: 

assistant: ```c
void vp8_blit_text(const char *msg, unsigned char *address, const int pitch) {
  int letter_bitmap;
  unsigned char *output_pos = address;
  int colpos;
  const int font[] = {0x0, 0x5C00, 0x8020, 0xAFABEA, 0xD7EC0, 0x1111111, 0x1855740, 0x18000, 0x45C0, 0x74400, 0x51140, 0x23880, 0xC4000, 0x21080, 0x80000, 0x111110, 0xE9D72E, 0x87E40, 0x12AD732, 0xAAD62A, 0x4F94C4, 0x4D6B7, 0x456AA, 0x3E8423, 0xAAD6AA, 0xAAD6A2, 0x2800, 0x2A00, 0x8A880, 0x52940, 0x22A20, 0x15422, 0x6AD62E, 0x1E4A53E, 0xAAD6BF, 0x8C62E, 0xE8C63F, 0x118D6BF, 0x1094BF, 0xCAC62E, 0x1F2109F, 0x118FE31, 0xF8C628, 0x8A89F, 0x108421F, 0x1F1105F, 0x1F4105F, 0xE8C62E, 0x2294BF, 0x164C62E, 0x12694BF, 0x8AD6A2, 0x10FC21, 0x1F8421F, 0x744107, 0xF8220F, 0x1151151, 0x117041, 0x119D731, 0x47E0, 0x1041041, 0xFC400, 0x10440, 0x1084210, 0x820};
  colpos = 0;
  while (msg[colpos] != 0) {
    char letter = msg[colpos];
    int fontcol, fontrow;
    if (letter <= 'Z' && letter >= ' ')
      letter_bitmap = font[letter - ' '];
    else if (letter <= 'z' && letter >= 'a')
      letter_bitmap = font[letter - 'a' + 'A' - ' '];
    else
      letter_bitmap = font[0];
    for (fontcol = 6; fontcol >= 0; fontcol--)
      for (fontrow = 0; fontrow < 5; fontrow++)
        output_pos[fontrow * pitch + fontcol] = ((letter_bitmap >> (fontcol * 5)) & (1 << fontrow) ? 255 : 0);
    output_pos += 7;
    colpos++;
  }
}
```