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

```asm
<lengthOfLongestSubstring>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x410,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x408(%rsp)
  xor    %eax,%eax
  test   %rdi,%rdi
  je     L0
  cmpb   $0x0,(%rdi)
  mov    %rdi,%rbx
  je     L139
  mov    %rsp,%rdx
  mov    $0xffffffffffffffff,%rax
  mov    $0x80,%ecx
  mov    %rdx,%rdi
  rep stos %rax,%es:(%rdi)
  mov    $0x1,%eax
  nopl   0x0(%rax)
L60:
  mov    %eax,%r12d
  lea    -0x1(%rax),%ebp
  add    $0x1,%rax
  cmpb   $0x0,-0x1(%rbx,%rax,1)
  jne    L60
  lea    0x0(,%r12,4),%edi
  call   <malloc@plt>
  xor    %esi,%esi
  mov    %rax,%rdi
  movl   $0x1,(%rax)
  movsbq (%rbx),%rax
  lea    0x4(%rdi),%rdx
  movl   $0x0,(%rsp,%rax,4)
  mov    $0x1,%eax
  cmp    $0x1,%r12d
  jne    L27
L86:
  cmp    $0x2,%ebp
  jbe    L114
  mov    %r12d,%edx
  mov    %rdi,%rax
  pxor   %xmm2,%xmm2
  shr    $0x2,%edx
  shl    $0x4,%rdx
  add    %rdi,%rdx
  nopl   0x0(%rax)
L88:
  movdqu (%rax),%xmm0
  add    $0x10,%rax
  movdqa %xmm0,%xmm1
  pcmpgtd %xmm2,%xmm1
  pand   %xmm1,%xmm0
  pandn  %xmm2,%xmm1
  movdqa %xmm1,%xmm2
  por    %xmm0,%xmm2
  cmp    %rax,%rdx
  jne    L88
  movdqa %xmm2,%xmm0
  mov    %r12d,%edx
  psrldq $0x8,%xmm0
  and    $0xfffffffc,%edx
  and    $0x3,%r12d
  movdqa %xmm0,%xmm1
  pcmpgtd %xmm2,%xmm1
  pand   %xmm1,%xmm0
  pandn  %xmm2,%xmm1
  por    %xmm0,%xmm1
  movdqa %xmm1,%xmm2
  psrldq $0x4,%xmm2
  movdqa %xmm2,%xmm0
  pcmpgtd %xmm1,%xmm0
  pand   %xmm0,%xmm2
  pandn  %xmm1,%xmm0
  por    %xmm2,%xmm0
  movd   %xmm0,%eax
  je     L139
L76:
  movslq %edx,%rcx
  lea    0x0(,%rcx,4),%rsi
  mov    (%rdi,%rcx,4),%ecx
  cmp    %ecx,%eax
  cmovl  %ecx,%eax
  lea    0x1(%rdx),%ecx
  cmp    %edx,%ebp
  jle    L139
  mov    0x4(%rdi,%rsi,1),%edx
  cmp    %edx,%eax
  cmovl  %edx,%eax
  cmp    %ecx,%ebp
  jle    L139
  mov    0x8(%rdi,%rsi,1),%edx
  cmp    %edx,%eax
  cmovl  %edx,%eax
L139:
  mov    0x408(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L102
  add    $0x410,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  xchg   %ax,%ax
L117:
  mov    -0x4(%rdx),%ecx
  add    $0x1,%ecx
  mov    %ecx,(%rdx)
L52:
  movsbq (%rbx,%rax,1),%rcx
  add    $0x4,%rdx
  mov    %eax,(%rsp,%rcx,4)
  add    $0x1,%rax
  lea    -0x1(%rax),%ecx
  cmp    %ecx,%ebp
  jle    L86
L27:
  movsbq (%rbx,%rax,1),%rcx
  mov    (%rsp,%rcx,4),%ecx
  cmp    %esi,%ecx
  jl     L117
  mov    %eax,%r8d
  lea    0x1(%rcx),%esi
  sub    %ecx,%r8d
  mov    %r8d,(%rdx)
  jmp    L52
L114:
  xor    %eax,%eax
  xor    %edx,%edx
  jmp    L76
L0:
  xor    %eax,%eax
  jmp    L139
L102:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int lengthOfLongestSubstring(char *s) {
  int tag[256];
  int i = 0;
  int length = 0;
  int *ret;
  int cur;
  int max = 0;
  if (!s || !s[0]) {
    return 0;
  }
  for (i = 0; i < 256; i++) {
    tag[i] = -1;
  }
  i = 0;
  while (s[i]) {
    i++;
  }
  length = i;
  ret = (int *)malloc(sizeof(int) * length);
  ret[0] = 1;
  tag[s[0]] = 0;
  cur = 0;
  for (i = 1; i < length; i++) {
    if (tag[s[i]] < cur) {
      ret[i] = ret[i - 1] + 1;
    } else {
      cur = tag[s[i]] + 1;
      ret[i] = i - cur + 1;
    }
    tag[s[i]] = i;
  }
  for (i = 0; i < length; i++) {
    if (ret[i] > max) {
      max = ret[i];
    }
  }
  return max;
}
```