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

```asm
<ffpsvc>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jle    L525
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  jmp    L376
L525:
  mov    -0x40(%rbp),%rax
  movb   $0x0,(%rax)
  cmpq   $0x0,-0x48(%rbp)
  je     L441
  mov    -0x48(%rbp),%rax
  movb   $0x0,(%rax)
L441:
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x48,%edx
  cmp    %dl,%al
  jl     L36
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x48,%edx
  cmp    %dl,%al
  jg     L36
  mov    -0x38(%rbp),%rax
  mov    $0x9,%edx
  lea    D56(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L36
  mov    -0x38(%rbp),%rax
  lea    D62(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcspn@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jne    L294
  cmpq   $0x0,-0x48(%rbp)
  je     L50
  cmpq   $0x8,-0x10(%rbp)
  jbe    L50
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x10(%rbp),%rax
  sub    $0x8,%eax
  mov    %eax,-0x24(%rbp)
  subl   $0x1,-0x24(%rbp)
  jmp    L626
L508:
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L319
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  subl   $0x1,-0x24(%rbp)
L626:
  cmpl   $0x0,-0x24(%rbp)
  jns    L508
  jmp    L50
L319:
  nop
L50:
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  jmp    L376
L294:
  addq   $0x1,-0x18(%rbp)
  jmp    L374
L36:
  cmpq   $0x8,-0x10(%rbp)
  jbe    L217
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x43,%edx
  cmp    %dl,%al
  jl     L554
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x43,%edx
  cmp    %dl,%al
  jg     L554
  mov    -0x38(%rbp),%rax
  mov    $0x8,%edx
  lea    D9(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L217
L554:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x48,%edx
  cmp    %dl,%al
  jl     L488
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x48,%edx
  cmp    %dl,%al
  jg     L488
  mov    -0x38(%rbp),%rax
  mov    $0x8,%edx
  lea    D43(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L217
L488:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x45,%edx
  cmp    %dl,%al
  jl     L639
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x45,%edx
  cmp    %dl,%al
  jg     L639
  mov    -0x38(%rbp),%rax
  mov    $0x8,%edx
  lea    D22(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L217
L639:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x20,%edx
  cmp    %dl,%al
  jl     L549
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  mov    $0x20,%edx
  cmp    %dl,%al
  jg     L549
  mov    -0x38(%rbp),%rax
  mov    $0x8,%edx
  lea    D18(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L217
L549:
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  movzbl (%rax),%eax
  mov    $0x3d,%edx
  cmp    %dl,%al
  jl     L217
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  movzbl (%rax),%eax
  mov    $0x3d,%edx
  cmp    %dl,%al
  jg     L217
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  mov    $0x2,%edx
  lea    D101(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L504
L217:
  cmpq   $0x0,-0x48(%rbp)
  je     L595
  cmpq   $0x8,-0x10(%rbp)
  jbe    L595
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x10(%rbp),%rax
  sub    $0x8,%eax
  mov    %eax,-0x24(%rbp)
  subl   $0x1,-0x24(%rbp)
  jmp    L492
L529:
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L632
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  subl   $0x1,-0x24(%rbp)
L492:
  cmpl   $0x0,-0x24(%rbp)
  jns    L529
  jmp    L595
L632:
  nop
L595:
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  jmp    L376
L504:
  movq   $0xa,-0x18(%rbp)
L374:
  mov    -0x38(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  lea    D3(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strspn@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x10(%rbp)
  jne    L138
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  jmp    L376
L138:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L121
  addq   $0x1,-0x20(%rbp)
  jmp    L422
L121:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x27,%al
  jne    L580
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x40(%rbp),%rax
  mov    %dl,(%rax)
  movl   $0x1,-0x24(%rbp)
  addq   $0x1,-0x20(%rbp)
  jmp    L606
L193:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x27,%al
  jne    L417
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x27,%al
  jne    L108
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addq   $0x1,-0x20(%rbp)
  addl   $0x1,-0x24(%rbp)
  jmp    L417
L108:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  jmp    L564
L417:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    -0x24(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addq   $0x1,-0x20(%rbp)
  addl   $0x1,-0x24(%rbp)
L606:
  mov    -0x20(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jb     L193
L564:
  mov    -0x20(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jne    L118
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  lea    D0(%rip),%rax
  mov    %rax,%rdi
  call   <ffpmsg@plt>
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <ffpmsg@plt>
  mov    -0x50(%rbp),%rax
  movl   $0xcd,(%rax)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  jmp    L376
L118:
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x20(%rbp)
  jmp    L422
L580:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x28,%al
  jne    L249
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    D38(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcspn@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    %rax,-0x8(%rbp)
  jne    L358
  lea    D59(%rip),%rax
  mov    %rax,%rdi
  call   <ffpmsg@plt>
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <ffpmsg@plt>
  mov    -0x50(%rbp),%rax
  movl   $0xcd,(%rax)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  jmp    L376
L358:
  addq   $0x1,-0x8(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x8(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x40(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x8(%rbp),%rax
  add    %rax,-0x20(%rbp)
  jmp    L422
L249:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    D91(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcspn@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x8(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x40(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x8(%rbp),%rax
  add    %rax,-0x20(%rbp)
L422:
  cmpq   $0x0,-0x48(%rbp)
  je     L484
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    D3(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strspn@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  add    %rax,-0x20(%rbp)
  cmpq   $0x4f,-0x20(%rbp)
  ja     L484
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L634
  addq   $0x1,-0x20(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L634
  addq   $0x1,-0x20(%rbp)
L634:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x24(%rbp)
  subl   $0x1,-0x24(%rbp)
  jmp    L220
L396:
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L393
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  subl   $0x1,-0x24(%rbp)
L220:
  cmpl   $0x0,-0x24(%rbp)
  jns    L396
  jmp    L484
L393:
  nop
L484:
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
L376:
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D56
data_type: string
name: parse_data
arguments: label: D62
data_type: string
name: parse_data
arguments: label: D9
data_type: string
name: parse_data
arguments: label: D43
data_type: string
name: parse_data
arguments: label: D22
data_type: string
name: parse_data
arguments: label: D18
data_type: string
name: parse_data
arguments: label: D101
data_type: string
name: parse_data
arguments: label: D3
data_type: string
name: parse_data
arguments: label: D0
data_type: string
name: parse_data
arguments: label: D38
data_type: string
name: parse_data
arguments: label: D59
data_type: string
name: parse_data
arguments: label: D91
data_type: string

tool: D56: HIERARCH 

tool: D62: =

tool: D9: COMMENT 

tool: D43: HISTORY 

tool: D22: END     

tool: D18:         

tool: D101: = 

tool: D3:  

tool: D0: This keyword string value has no closing quote:

tool: D38: )

tool: D59: This complex keyword value has no closing ')':

tool: D91:  /

assistant: ```c
int ffpsvc(char *card, char *value, char *comm, int *status) {
  int jj;
  size_t ii, cardlen, nblank, valpos;
  if (*status > 0)
    return (*status);
  value[0] = '\0';
  if (comm)
    comm[0] = '\0';
  cardlen = strlen(card);
  if (((card)[0] < ("HIERARCH ")[0] ? -1 : (card)[0] > ("HIERARCH ")[0] ? 1 : strncmp((card), ("HIERARCH "), (9))) == 0) {
    valpos = strcspn(card, "=");
    if (valpos == cardlen) {
      if (comm != NULL) {
        if (cardlen > 8) {
          strcpy(comm, &card[8]);
          jj = cardlen - 8;
          for (jj--; jj >= 0; jj--) {
            if (comm[jj] == ' ')
              comm[jj] = '\0';
            else
              break;
          }
        }
      }
      return (*status);
    }
    valpos++;
  } else if (cardlen < 9 || ((card)[0] < ("COMMENT ")[0] ? -1 : (card)[0] > ("COMMENT ")[0] ? 1 : strncmp((card), ("COMMENT "), (8))) == 0 || ((card)[0] < ("HISTORY ")[0] ? -1 : (card)[0] > ("HISTORY ")[0] ? 1 : strncmp((card), ("HISTORY "), (8))) == 0 || ((card)[0] < ("END     ")[0] ? -1 : (card)[0] > ("END     ")[0] ? 1 : strncmp((card), ("END     "), (8))) == 0 || ((card)[0] < ("        ")[0] ? -1 : (card)[0] > ("        ")[0] ? 1 : strncmp((card), ("        "), (8))) == 0 || ((&card[8])[0] < ("= ")[0] ? -1 : (&card[8])[0] > ("= ")[0] ? 1 : strncmp((&card[8]), ("= "), (2))) != 0) {
    if (comm != NULL) {
      if (cardlen > 8) {
        strcpy(comm, &card[8]);
        jj = cardlen - 8;
        for (jj--; jj >= 0; jj--) {
          if (comm[jj] == ' ')
            comm[jj] = '\0';
          else
            break;
        }
      }
    }
    return (*status);
  } else {
    valpos = 10;
  }
  nblank = strspn(&card[valpos], " ");
  if (nblank + valpos == cardlen) {
    return (*status);
  }
  ii = valpos + nblank;
  if (card[ii] == '/') {
    ii++;
  } else if (card[ii] == '\'') {
    value[0] = card[ii];
    for (jj = 1, ii++; ii < cardlen; ii++, jj++) {
      if (card[ii] == '\'') {
        if (card[ii + 1] == '\'') {
          value[jj] = card[ii];
          ii++;
          jj++;
        } else {
          value[jj] = card[ii];
          break;
        }
      }
      value[jj] = card[ii];
    }
    if (ii == cardlen) {
      value[jj] = '\0';
      ffpmsg("This keyword string value has no closing quote:");
      ffpmsg(card);
      return (*status = 205);
    } else {
      value[jj + 1] = '\0';
      ii++;
    }
  } else if (card[ii] == '(') {
    nblank = strcspn(&card[ii], ")");
    if (nblank == strlen(&card[ii])) {
      ffpmsg("This complex keyword value has no closing ')':");
      ffpmsg(card);
      return (*status = 205);
    }
    nblank++;
    strncpy(value, &card[ii], nblank);
    value[nblank] = '\0';
    ii = ii + nblank;
  } else {
    nblank = strcspn(&card[ii], " /");
    strncpy(value, &card[ii], nblank);
    value[nblank] = '\0';
    ii = ii + nblank;
  }
  if (comm) {
    nblank = strspn(&card[ii], " ");
    ii = ii + nblank;
    if (ii < 80) {
      if (card[ii] == '/') {
        ii++;
        if (card[ii] == ' ')
          ii++;
      }
      strcat(comm, &card[ii]);
      jj = strlen(comm);
      for (jj--; jj >= 0; jj--) {
        if (comm[jj] == ' ')
          comm[jj] = '\0';
        else
          break;
      }
    }
  }
  return (*status);
}
```