user: 请将以下的汇编代码转换成C语言代码：

```asm
<explodegophermapline>:
  endbr64
  sub    $0x38,%rsp
  mov    %rsi,%rax
  mov    %rcx,%rsi
  mov    %fs:0x28,%rcx
  mov    %rcx,0x28(%rsp)
  xor    %ecx,%ecx
  movb   $0x0,(%rax)
  movb   $0x0,(%rdx)
  movb   $0x0,(%rsi)
  movb   $0x0,(%r8)
  movq   $0x0,(%r9)
  movzbl (%rdi),%ecx
  test   %cl,%cl
  je     L62
  mov    %cl,(%rax)
  lea    0x1(%rdi),%rax
  add    $0x400,%rdi
  jmp    L105
  nopl   0x0(%rax)
L326:
  test   %cl,%cl
  je     L243
  add    $0x1,%rax
  mov    %cl,(%rdx)
  add    $0x1,%rdx
  movb   $0x0,(%rdx)
  cmp    %rdi,%rax
  je     L287
L105:
  movzbl (%rax),%ecx
  cmp    $0x9,%cl
  jne    L326
  lea    0x1(%rax),%rcx
  mov    %rsi,%rdx
  add    $0x400,%rax
  jmp    L321
  nopl   (%rax)
L65:
  test   %sil,%sil
  je     L243
  add    $0x1,%rcx
  mov    %sil,(%rdx)
  add    $0x1,%rdx
  movb   $0x0,(%rdx)
  cmp    %rax,%rcx
  je     L287
L321:
  movzbl (%rcx),%esi
  cmp    $0x9,%sil
  jne    L65
  lea    0x1(%rcx),%rax
  add    $0x40,%rcx
  jmp    L285
  nopl   0x0(%rax,%rax,1)
L260:
  test   %dl,%dl
  je     L243
  add    $0x1,%rax
  mov    %dl,(%r8)
  add    $0x1,%r8
  movb   $0x0,(%r8)
  cmp    %rcx,%rax
  je     L287
L285:
  movzbl (%rax),%edx
  cmp    $0x9,%dl
  jne    L260
  movzbl 0x1(%rax),%edx
  cmp    $0x9,%dl
  je     L231
  test   %dl,%dl
  je     L231
  mov    %dl,0x10(%rsp)
  movzbl 0x2(%rax),%edx
  movb   $0x0,0x11(%rsp)
  cmp    $0x9,%dl
  je     L231
  test   %dl,%dl
  je     L231
  mov    %dl,0x11(%rsp)
  movzbl 0x3(%rax),%edx
  movb   $0x0,0x12(%rsp)
  cmp    $0x9,%dl
  je     L231
  test   %dl,%dl
  je     L231
  mov    %dl,0x12(%rsp)
  movzbl 0x4(%rax),%edx
  movb   $0x0,0x13(%rsp)
  test   %dl,%dl
  je     L231
  cmp    $0x9,%dl
  je     L231
  mov    %dl,0x13(%rsp)
  movzbl 0x5(%rax),%edx
  movb   $0x0,0x14(%rsp)
  test   %dl,%dl
  je     L231
  cmp    $0x9,%dl
  je     L231
  mov    %dl,0x14(%rsp)
  movzbl 0x6(%rax),%edx
  movb   $0x0,0x15(%rsp)
  test   %dl,%dl
  je     L231
  cmp    $0x9,%dl
  je     L231
  mov    %dl,0x15(%rsp)
  movzbl 0x7(%rax),%edx
  movb   $0x0,0x16(%rsp)
  test   %dl,%dl
  je     L231
  cmp    $0x9,%dl
  je     L231
  movzbl 0x8(%rax),%eax
  mov    %dl,0x16(%rsp)
  movb   $0x0,0x17(%rsp)
  test   %al,%al
  je     L231
  cmp    $0x9,%al
  jne    L287
L231:
  lea    0x10(%rsp),%rdi
  mov    %r9,0x8(%rsp)
  call   <atol@plt>
  mov    0x8(%rsp),%r9
  lea    -0x1(%rax),%rdx
  cmp    $0xfffe,%rdx
  ja     L223
  mov    %rax,(%r9)
  nopw   0x0(%rax,%rax,1)
L243:
  xor    %eax,%eax
L216:
  mov    0x28(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L68
  add    $0x38,%rsp
  ret
  nop
L62:
  movb   $0x69,(%rax)
  xor    %eax,%eax
  jmp    L216
  nopw   0x0(%rax,%rax,1)
L287:
  mov    $0xffffffff,%eax
  jmp    L216
L223:
  movq   $0x0,(%r9)
  jmp    L243
L68:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int explodegophermapline(char *linebuff, char *itemtype, char *itemdesc, char *itemselector, char *itemserver, long *itemport) {
  int x;
  char tmpstring[16];
  *itemtype = 0;
  itemdesc[0] = 0;
  itemselector[0] = 0;
  itemserver[0] = 0;
  *itemport = 0;
  if (*linebuff == 0) {
    *itemtype = 'i';
    return (0);
  }
  *itemtype = *linebuff;
  linebuff += 1;
  for (x = 0;;) {
    if (x == 1023)
      return (-1);
    if (*linebuff == '\t')
      break;
    if (*linebuff == 0)
      return (0);
    itemdesc[x] = *linebuff;
    itemdesc[++x] = 0;
    linebuff += 1;
  }
  linebuff += 1;
  for (x = 0;;) {
    if (x == 1023)
      return (-1);
    if (*linebuff == '\t')
      break;
    if (*linebuff == 0)
      return (0);
    itemselector[x] = *linebuff;
    itemselector[++x] = 0;
    linebuff += 1;
  }
  linebuff += 1;
  for (x = 0;;) {
    if (x == 63)
      return (-1);
    if (*linebuff == '\t')
      break;
    if (*linebuff == 0)
      return (0);
    itemserver[x] = *linebuff;
    itemserver[++x] = 0;
    linebuff += 1;
  }
  linebuff += 1;
  for (x = 0;;) {
    if (x == 8)
      return (-1);
    if (*linebuff == '\t')
      break;
    if (*linebuff == 0)
      break;
    tmpstring[x] = *linebuff;
    tmpstring[++x] = 0;
    linebuff += 1;
  }
  *itemport = atol(tmpstring);
  if ((*itemport < 1) || (*itemport > 65535))
    *itemport = 0;
  return (0);
}
```