user: Please show me the C implementation that matches the assembly code listed below:

```asm
<isExpressionKeyword>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xd0,%rsp
  mov    %rdi,-0xc8(%rbp)
  mov    %rsi,-0xd0(%rbp)
  mov    -0xc8(%rbp),%rax
  mov    %rax,-0x80(%rbp)
  lea    D141(%rip),%rax
  mov    %rax,-0x78(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xbc(%rbp)
  lea    D57(%rip),%rax
  mov    %rax,-0x70(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xb8(%rbp)
  lea    D77(%rip),%rax
  mov    %rax,-0x68(%rbp)
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xb4(%rbp)
  lea    D56(%rip),%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x60(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xb0(%rbp)
  lea    D131(%rip),%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xac(%rbp)
  lea    D3(%rip),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xa8(%rbp)
  lea    D67(%rip),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xa4(%rbp)
  lea    D127(%rip),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xa0(%rbp)
  lea    D2(%rip),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x9c(%rbp)
  lea    D88(%rip),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x98(%rbp)
  lea    D91(%rip),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x94(%rbp)
  lea    D69(%rip),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x90(%rbp)
  lea    D48(%rip),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x8c(%rbp)
  lea    D32(%rip),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x88(%rbp)
  lea    D90(%rip),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x84(%rbp)
  cmpq   $0x0,-0xc8(%rbp)
  jne    L362
  mov    $0x0,%eax
  jmp    L423
L362:
  mov    -0xbc(%rbp),%edx
  mov    -0x78(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L306
  cmpq   $0x0,-0xd0(%rbp)
  je     L407
  mov    -0x78(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L407:
  mov    -0xbc(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L306:
  mov    -0xb8(%rbp),%edx
  mov    -0x70(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L0
  cmpq   $0x0,-0xd0(%rbp)
  je     L74
  mov    -0x70(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L74:
  mov    -0xb8(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L0:
  mov    -0xb4(%rbp),%edx
  mov    -0x68(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L292
  cmpq   $0x0,-0xd0(%rbp)
  je     L167
  mov    -0x68(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L167:
  mov    -0xb4(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L292:
  mov    -0xb0(%rbp),%edx
  mov    -0x60(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L377
  cmpq   $0x0,-0xd0(%rbp)
  je     L309
  mov    -0x60(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L309:
  mov    -0xb0(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L377:
  mov    -0xac(%rbp),%edx
  mov    -0x58(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L6
  cmpq   $0x0,-0xd0(%rbp)
  je     L360
  mov    -0x58(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L360:
  mov    -0xac(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L6:
  mov    -0xa8(%rbp),%edx
  mov    -0x50(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L94
  cmpq   $0x0,-0xd0(%rbp)
  je     L246
  mov    -0x50(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L246:
  mov    -0xa8(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L94:
  mov    -0xa4(%rbp),%edx
  mov    -0x48(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L216
  cmpq   $0x0,-0xd0(%rbp)
  je     L185
  mov    -0x48(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L185:
  mov    -0xa4(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L216:
  mov    -0xa0(%rbp),%edx
  mov    -0x40(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L20
  cmpq   $0x0,-0xd0(%rbp)
  je     L325
  mov    -0x40(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L325:
  mov    -0xa0(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L20:
  mov    -0x9c(%rbp),%edx
  mov    -0x38(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L403
  cmpq   $0x0,-0xd0(%rbp)
  je     L286
  mov    -0x38(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L286:
  mov    -0x9c(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L403:
  mov    -0x98(%rbp),%edx
  mov    -0x30(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L13
  cmpq   $0x0,-0xd0(%rbp)
  je     L370
  mov    -0x30(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L370:
  mov    -0x98(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L13:
  mov    -0x94(%rbp),%edx
  mov    -0x28(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L10
  cmpq   $0x0,-0xd0(%rbp)
  je     L351
  mov    -0x28(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L351:
  mov    -0x94(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L10:
  mov    -0x90(%rbp),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L250
  cmpq   $0x0,-0xd0(%rbp)
  je     L8
  mov    -0x20(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L8:
  mov    -0x90(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L250:
  mov    -0x8c(%rbp),%edx
  mov    -0x18(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L278
  cmpq   $0x0,-0xd0(%rbp)
  je     L364
  mov    -0x18(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L364:
  mov    -0x8c(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L278:
  mov    -0x88(%rbp),%edx
  mov    -0x10(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L326
  cmpq   $0x0,-0xd0(%rbp)
  je     L213
  mov    -0x10(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L213:
  mov    -0x88(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L326:
  mov    -0x84(%rbp),%edx
  mov    -0x8(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L314
  cmpq   $0x0,-0xd0(%rbp)
  je     L426
  mov    -0x8(%rbp),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L426:
  mov    -0x84(%rbp),%eax
  cltq
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  sub    -0x80(%rbp),%rax
  jmp    L423
L314:
  mov    $0x0,%eax
L423:
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D141
type: string
name: parse_data
arguments: label: D57
type: string
name: parse_data
arguments: label: D77
type: string
name: parse_data
arguments: label: D56
type: string
name: parse_data
arguments: label: D131
type: string
name: parse_data
arguments: label: D3
type: string
name: parse_data
arguments: label: D67
type: string
name: parse_data
arguments: label: D127
type: string
name: parse_data
arguments: label: D2
type: string
name: parse_data
arguments: label: D88
type: string
name: parse_data
arguments: label: D91
type: string
name: parse_data
arguments: label: D69
type: string
name: parse_data
arguments: label: D48
type: string
name: parse_data
arguments: label: D32
type: string
name: parse_data
arguments: label: D90
type: string

tool: D141: quote

tool: D57: lambda

tool: D77: if

tool: D56: set!

tool: D131: begin

tool: D3: cond

tool: D67: and

tool: D127: or

tool: D2: case

tool: D88: let

tool: D91: let*

tool: D69: letrec

tool: D48: do

tool: D32: delay

tool: D90: quasiquote

assistant: ```c
int isExpressionKeyword(const char *c, char *value) {
  const char *start = c;
  const char *QUOTE = "quote";
  const int QUOTE_SZ = strlen(QUOTE);
  const char *LAMBDA = "lambda";
  const int LAMBDA_SZ = strlen(LAMBDA);
  const char *IF = "if";
  const int IF_SZ = strlen(IF);
  const char *SET_BANG = "set!";
  const int SET_BANG_SZ = strlen(SET_BANG);
  const char *BEGIN = "begin";
  const int BEGIN_SZ = strlen(BEGIN);
  const char *COND = "cond";
  const int COND_SZ = strlen(COND);
  const char *AND = "and";
  const int AND_SZ = strlen(AND);
  const char *OR = "or";
  const int OR_SZ = strlen(OR);
  const char *CASE = "case";
  const int CASE_SZ = strlen(CASE);
  const char *LET = "let";
  const int LET_SZ = strlen(LET);
  const char *LET_STAR = "let*";
  const int LET_STAR_SZ = strlen(LET_STAR);
  const char *LETREC = "letrec";
  const int LETREC_SZ = strlen(LETREC);
  const char *DO = "do";
  const int DO_SZ = strlen(DO);
  const char *DELAY = "delay";
  const int DELAY_SZ = strlen(DELAY);
  const char *QUASIQUOTE = "quasiquote";
  const int QUASIQUOTE_SZ = strlen(QUASIQUOTE);
  if (c == NULL)
    return 0;
  if (strncmp(c, QUOTE, QUOTE_SZ) == 0) {
    if (value != NULL)
      strcpy(value, QUOTE);
    c += QUOTE_SZ;
    return c - start;
  } else if (strncmp(c, LAMBDA, LAMBDA_SZ) == 0) {
    if (value != NULL)
      strcpy(value, LAMBDA);
    c += LAMBDA_SZ;
    return c - start;
  } else if (strncmp(c, IF, IF_SZ) == 0) {
    if (value != NULL)
      strcpy(value, IF);
    c += IF_SZ;
    return c - start;
  } else if (strncmp(c, SET_BANG, SET_BANG_SZ) == 0) {
    if (value != NULL)
      strcpy(value, SET_BANG);
    c += SET_BANG_SZ;
    return c - start;
  } else if (strncmp(c, BEGIN, BEGIN_SZ) == 0) {
    if (value != NULL)
      strcpy(value, BEGIN);
    c += BEGIN_SZ;
    return c - start;
  } else if (strncmp(c, COND, COND_SZ) == 0) {
    if (value != NULL)
      strcpy(value, COND);
    c += COND_SZ;
    return c - start;
  } else if (strncmp(c, AND, AND_SZ) == 0) {
    if (value != NULL)
      strcpy(value, AND);
    c += AND_SZ;
    return c - start;
  } else if (strncmp(c, OR, OR_SZ) == 0) {
    if (value != NULL)
      strcpy(value, OR);
    c += OR_SZ;
    return c - start;
  } else if (strncmp(c, CASE, CASE_SZ) == 0) {
    if (value != NULL)
      strcpy(value, CASE);
    c += CASE_SZ;
    return c - start;
  } else if (strncmp(c, LET, LET_SZ) == 0) {
    if (value != NULL)
      strcpy(value, LET);
    c += LET_SZ;
    return c - start;
  } else if (strncmp(c, LET_STAR, LET_STAR_SZ) == 0) {
    if (value != NULL)
      strcpy(value, LET_STAR);
    c += LET_STAR_SZ;
    return c - start;
  } else if (strncmp(c, LETREC, LETREC_SZ) == 0) {
    if (value != NULL)
      strcpy(value, LETREC);
    c += LETREC_SZ;
    return c - start;
  } else if (strncmp(c, DO, DO_SZ) == 0) {
    if (value != NULL)
      strcpy(value, DO);
    c += DO_SZ;
    return c - start;
  } else if (strncmp(c, DELAY, DELAY_SZ) == 0) {
    if (value != NULL)
      strcpy(value, DELAY);
    c += DELAY_SZ;
    return c - start;
  } else if (strncmp(c, QUASIQUOTE, QUASIQUOTE_SZ) == 0) {
    if (value != NULL)
      strcpy(value, QUASIQUOTE);
    c += QUASIQUOTE_SZ;
    return c - start;
  } else
    return 0;
}
```