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

```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     L196
  mov    %cl,(%rax)
  lea    0x1(%rdi),%rax
  add    $0x400,%rdi
  jmp    L28
  nopl   0x0(%rax)
L201:
  test   %cl,%cl
  je     L153
  add    $0x1,%rax
  mov    %cl,(%rdx)
  add    $0x1,%rdx
  movb   $0x0,(%rdx)
  cmp    %rdi,%rax
  je     L18
L28:
  movzbl (%rax),%ecx
  cmp    $0x9,%cl
  jne    L201
  lea    0x1(%rax),%rcx
  mov    %rsi,%rdx
  add    $0x400,%rax
  jmp    L29
  nopl   (%rax)
L202:
  test   %sil,%sil
  je     L153
  add    $0x1,%rcx
  mov    %sil,(%rdx)
  add    $0x1,%rdx
  movb   $0x0,(%rdx)
  cmp    %rax,%rcx
  je     L18
L29:
  movzbl (%rcx),%esi
  cmp    $0x9,%sil
  jne    L202
  lea    0x1(%rcx),%rax
  add    $0x40,%rcx
  jmp    L107
  nopw   0x0(%rax,%rax,1)
L59:
  test   %dl,%dl
  je     L153
  add    $0x1,%rax
  mov    %dl,(%r8)
  add    $0x1,%r8
  movb   $0x0,(%r8)
  cmp    %rcx,%rax
  je     L18
L107:
  movzbl (%rax),%edx
  cmp    $0x9,%dl
  jne    L59
  lea    0x10(%rsp),%rdi
  add    $0x1,%rax
  lea    0x18(%rsp),%rsi
  mov    %rdi,%rdx
  nopl   (%rax)
L149:
  movzbl (%rax),%ecx
  test   %cl,%cl
  je     L179
  cmp    $0x9,%cl
  je     L179
  mov    %cl,(%rdx)
  add    $0x1,%rdx
  add    $0x1,%rax
  movb   $0x0,(%rdx)
  cmp    %rsi,%rdx
  jne    L149
  cs nopw 0x0(%rax,%rax,1)
L18:
  mov    $0xffffffff,%eax
  jmp    L108
L179:
  mov    %r9,0x8(%rsp)
  call   <atol@plt>
  mov    0x8(%rsp),%r9
  lea    -0x1(%rax),%rdx
  cmp    $0xfffe,%rdx
  ja     L4
  mov    %rax,(%r9)
  cs nopw 0x0(%rax,%rax,1)
L153:
  xor    %eax,%eax
L108:
  mov    0x28(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L115
  add    $0x38,%rsp
  ret
  nopw   0x0(%rax,%rax,1)
L196:
  movb   $0x69,(%rax)
  xor    %eax,%eax
  jmp    L108
L4:
  movq   $0x0,(%r9)
  jmp    L153
L115:
  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);
}
```