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

```asm
<parse_uint64>:
  endbr64
  push   %r14
  xor    %ecx,%ecx
  mov    %rsi,%r14
  lea    D56(%rip),%rdx
  push   %r13
  mov    $0x563,%esi
  mov    %rdi,%r13
  push   %r12
  push   %rbp
  lea    D19(%rip),%rbp
  push   %rbx
  cmpb   $0x0,(%rdi)
  mov    %rbp,%rdi
  setne  %cl
  call   <test_true@plt>
  test   %eax,%eax
  je     L49
  movl   $0x0,(%r14)
  xor    %eax,%eax
  cmpb   $0x0,0x0(%r13)
  mov    %r13,%rbx
  lea    D50(%rip),%r12
  je     L31
  nopw   0x0(%rax,%rax,1)
L0:
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  mov    %eax,(%r14)
  movzbl (%rbx),%edi
  call   <isdigit@plt>
  xor    %ecx,%ecx
  mov    %r12,%rdx
  mov    $0x56d,%esi
  test   %rax,%rax
  mov    %rbp,%rdi
  setne  %cl
  call   <test_true@plt>
  test   %eax,%eax
  je     L45
  movsbl (%rbx),%edx
  mov    (%r14),%eax
  add    $0x1,%rbx
  lea    -0x30(%rdx,%rax,1),%eax
  mov    %eax,(%r14)
  cmpb   $0x0,(%rbx)
  je     L31
  test   %eax,%eax
  jle    L0
  mov    %r13,%rcx
  mov    %rbp,%rdi
  mov    $0x569,%esi
  lea    D45(%rip),%rdx
  call   <test_error@plt>
  pop    %rbx
  mov    $0xffffffff,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax,%rax,1)
L31:
  pop    %rbx
  mov    $0x1,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  xchg   %ax,%ax
L45:
  mov    %r13,%rcx
  mov    %rbp,%rdi
  mov    $0x56e,%esi
  lea    D10(%rip),%rdx
  call   <test_error@plt>
  pop    %rbx
  mov    $0xffffffff,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   (%rax)
L49:
  mov    %rbp,%rdi
  lea    D32(%rip),%rdx
  mov    $0x564,%esi
  call   <test_info@plt>
  pop    %rbx
  mov    $0xffffffff,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

tool_calls: name: read_data
arguments: label: D56
type: string
name: read_data
arguments: label: D19
type: string
name: read_data
arguments: label: D50
type: string
name: read_data
arguments: label: D45
type: string
name: read_data
arguments: label: D10
type: string
name: read_data
arguments: label: D32
type: string

tool: D56: *p

tool: D19: /scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/papyrussolution/OpenPapyrus/refs/heads/master/Src/OSF/OpenSSL-111/test/evp_test.c

tool: D50: isdigit((unsigned char)*p)

tool: D45: Integer overflow in string %s

tool: D10: Invalid character in string %s

tool: D32: Invalid empty integer value

assistant: ```c
int parse_uint64(const char *value, uint64_t *pr) {
  const char *p = value;
  if (!test_true("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/papyrussolution/OpenPapyrus/refs/heads/master/Src/OSF/OpenSSL-111/test/evp_test.c", 1379, "*p", (*p) != 0)) {
    test_info("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/papyrussolution/OpenPapyrus/refs/heads/master/Src/OSF/OpenSSL-111/test/evp_test.c", 1380, "Invalid empty integer value");
    return -1;
  }
  for (*pr = 0; *p;) {
    if (*pr > ((uint64_t)-1) / 10) {
      test_error("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/papyrussolution/OpenPapyrus/refs/heads/master/Src/OSF/OpenSSL-111/test/evp_test.c", 1385, "Integer overflow in string %s", value);
      return -1;
    }
    *pr *= 10;
    if (!test_true("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/papyrussolution/OpenPapyrus/refs/heads/master/Src/OSF/OpenSSL-111/test/evp_test.c", 1389, "isdigit((unsigned char)*p)", (isdigit((unsigned char)*p)) != 0)) {
      test_error("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/papyrussolution/OpenPapyrus/refs/heads/master/Src/OSF/OpenSSL-111/test/evp_test.c", 1390, "Invalid character in string %s", value);
      return -1;
    }
    *pr += *p - '0';
    p++;
  }
  return 1;
}
```