user: What is the c source code of the assembly code below?

```asm
<isExpressionKeyword>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%rbp
  mov    %rsi,%r12
  lea    D78(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,%ebx
  lea    D279(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,%r13d
  lea    D189(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,%r14d
  lea    D104(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,%r15d
  lea    D241(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x4(%rsp)
  lea    D366(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x8(%rsp)
  lea    D23(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0xc(%rsp)
  lea    D276(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x10(%rsp)
  lea    D242(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x14(%rsp)
  lea    D65(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x18(%rsp)
  lea    D4(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x1c(%rsp)
  lea    D194(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x20(%rsp)
  lea    D320(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x24(%rsp)
  lea    D139(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x28(%rsp)
  lea    D187(%rip),%rdi
  call   <strlen@plt>
  mov    %eax,0x2c(%rsp)
  test   %rbp,%rbp
  je     L284
  mov    %ebx,%edx
  lea    D78(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L342
  test   %r12,%r12
  je     L202
  lea    D78(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L342:
  mov    %r13d,%edx
  lea    D279(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L230
  mov    %r13d,%ebx
  test   %r12,%r12
  je     L202
  lea    D279(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L230:
  mov    %r14d,%edx
  lea    D189(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L354
  mov    %r14d,%ebx
  test   %r12,%r12
  je     L202
  lea    D189(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L354:
  mov    %r15d,%edx
  lea    D104(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L386
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D104(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L386:
  mov    0x4(%rsp),%r15d
  mov    %r15d,%edx
  lea    D241(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L149
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D241(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L149:
  mov    0x8(%rsp),%r15d
  mov    %r15d,%edx
  lea    D366(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L164
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D366(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L164:
  mov    0xc(%rsp),%r15d
  mov    %r15d,%edx
  lea    D23(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L159
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D23(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L159:
  mov    0x10(%rsp),%r15d
  mov    %r15d,%edx
  lea    D276(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L158
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D276(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L158:
  mov    0x14(%rsp),%r15d
  mov    %r15d,%edx
  lea    D242(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L368
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D242(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L368:
  mov    0x18(%rsp),%r15d
  mov    %r15d,%edx
  lea    D65(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L357
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D65(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L357:
  mov    0x1c(%rsp),%r15d
  mov    %r15d,%edx
  lea    D4(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L445
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D4(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L445:
  mov    0x20(%rsp),%r15d
  mov    %r15d,%edx
  lea    D194(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L1
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D194(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L1:
  mov    0x24(%rsp),%r15d
  mov    %r15d,%edx
  lea    D320(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L330
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D320(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L330:
  mov    0x28(%rsp),%r15d
  mov    %r15d,%edx
  lea    D139(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L106
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D139(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L106:
  mov    0x2c(%rsp),%r15d
  mov    %r15d,%edx
  lea    D187(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  mov    $0x0,%ebx
  test   %rax,%rax
  jne    L202
  mov    %r15d,%ebx
  test   %r12,%r12
  je     L202
  lea    D187(%rip),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  jmp    L202
L284:
  mov    $0x0,%ebx
L202:
  mov    %ebx,%eax
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D78
data_type: string
name: retrieve_data
arguments: tag: D279
data_type: string
name: retrieve_data
arguments: tag: D189
data_type: string
name: retrieve_data
arguments: tag: D104
data_type: string
name: retrieve_data
arguments: tag: D241
data_type: string
name: retrieve_data
arguments: tag: D366
data_type: string
name: retrieve_data
arguments: tag: D23
data_type: string
name: retrieve_data
arguments: tag: D276
data_type: string
name: retrieve_data
arguments: tag: D242
data_type: string
name: retrieve_data
arguments: tag: D65
data_type: string
name: retrieve_data
arguments: tag: D4
data_type: string
name: retrieve_data
arguments: tag: D194
data_type: string
name: retrieve_data
arguments: tag: D320
data_type: string
name: retrieve_data
arguments: tag: D139
data_type: string
name: retrieve_data
arguments: tag: D187
data_type: string

tool: D78: quote

tool: D279: lambda

tool: D189: if

tool: D104: set!

tool: D241: begin

tool: D366: cond

tool: D23: and

tool: D276: or

tool: D242: case

tool: D65: let

tool: D4: let*

tool: D194: letrec

tool: D320: do

tool: D139: delay

tool: D187: 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;
}
```