user: What would the C source look like for the assembly code provided here?

```asm
<expr_get_curr_symbol>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rcx,%r13
  test   %rdi,%rdi
  je     L220
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  mov    %rdx,%r12
  cmpb   $0x0,(%rdi)
  je     L220
  test   %rsi,%rsi
  je     L220
  test   %rdx,%rdx
  je     L220
  test   %rcx,%rcx
  je     L220
  cmp    %rsi,%rdi
  jae    L220
  movq   $0x0,(%rcx)
  movabs $0x100002600,%rdx
  jmp    L231
L220:
  mov    %r13,%rbp
  test   %r13,%r13
  je     L94
  movq   $0x0,0x0(%r13)
  mov    $0x0,%ebp
  jmp    L94
L9:
  bt     %rax,%rdx
  jae    L161
  add    $0x1,%rbx
  cmp    %rbx,%rbp
  je     L205
L231:
  movzbl (%rbx),%eax
  cmp    $0x20,%al
  jbe    L9
L161:
  cmp    %rbx,%rbp
  je     L232
  mov    $0x0,%r14d
  cmpb   $0x2d,(%rbx)
  je     L228
L41:
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L48
  lea    0x1(%rbx),%rax
  mov    %rax,(%r12)
  cmp    %rbp,%rax
  je     L263
L128:
  movsbl (%rax),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L263
  mov    (%r12),%rax
  add    $0x1,%rax
  mov    %rax,(%r12)
  cmp    %rbp,%rax
  jne    L128
L263:
  movslq %r14d,%r14
  sub    %r14,%rbx
L134:
  mov    (%r12),%rdi
  sub    %rbx,%rdi
  mov    %rdi,0x0(%r13)
  add    $0x1,%rdi
  call   <expr_alloc@plt>
  mov    %rax,%rbp
  mov    0x0(%r13),%rax
  lea    0x1(%rax),%rdx
  mov    $0x0,%esi
  mov    %rbp,%rdi
  call   <memset@plt>
  mov    0x0(%r13),%rdx
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <memcpy@plt>
L94:
  mov    %rbp,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L228:
  lea    0x1(%rbx),%r14
  cmp    %rbp,%r14
  je     L165
  movsbl 0x1(%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L20
  mov    %r14,%rbx
  mov    $0x1,%r14d
  jmp    L41
L205:
  mov    $0x0,%ebp
  jmp    L94
L232:
  mov    $0x0,%ebp
  jmp    L94
L20:
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L48
  lea    0x1(%rbx),%rax
  mov    %rax,(%r12)
  mov    $0x0,%r14d
  jmp    L128
L251:
  lea    0x1(%rbx),%rax
  mov    %rax,(%r12)
  mov    $0x0,%r14d
  jmp    L263
L165:
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L251
L48:
  lea    0x1(%rbx),%rax
  mov    %rax,(%r12)
  jmp    L134
```

assistant: ```c
char *expr_get_curr_symbol(const char *buffer, const char *buffer_end, const char **next, size_t *symbol_size) {
  const char *bp, *tbp;
  char *symbol = NULL;
  int neg = 0;
  if (buffer == NULL || *buffer == 0 || buffer_end == NULL || next == NULL || symbol_size == NULL || buffer >= buffer_end) {
    if (symbol_size != NULL) {
      *symbol_size = 0;
    }
    return NULL;
  }
  *symbol_size = 0;
  bp = buffer;
  while (bp != buffer_end && ((*bp) == ' ' || (*bp) == '\n' || (*bp) == '\r' || (*bp) == '\t')) {
    bp++;
  }
  if (bp == buffer_end) {
    return NULL;
  }
  if (*bp == '-' && (bp + 1) != buffer_end && isdigit(*(bp + 1))) {
    bp += 1;
    neg = 1;
  }
  if (isdigit(*bp)) {
    (*next) = bp + 1;
    while ((*next) != buffer_end && isdigit(**next)) {
      (*next)++;
    }
    bp -= neg;
  } else {
    (*next) = bp + 1;
  }
  *symbol_size = (*next) - bp;
  symbol = (char *)expr_alloc(*symbol_size + 1);
  memset(symbol, 0, *symbol_size + 1);
  memcpy(symbol, bp, *symbol_size);
  return symbol;
}
```