user: Please show me the C implementation that matches the assembly code listed below:

```asm
<graphsize>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  je     L27
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x26,%al
  jne    L51
L27:
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L49
L51:
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L49:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  mov    %eax,-0xc(%rbp)
  cmpl   $0x3e,-0xc(%rbp)
  jle    L29
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  mov    %eax,-0xc(%rbp)
  cmpl   $0x3e,-0xc(%rbp)
  jle    L22
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  or     %ecx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  or     %ecx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  or     %ecx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  or     %ecx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  or     %ecx,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L29
L22:
  mov    -0xc(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  or     %ecx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x3f,%eax
  or     %ecx,%eax
  mov    %eax,-0xc(%rbp)
L29:
  mov    -0xc(%rbp),%eax
  pop    %rbp
  ret
```

assistant: ```c
int graphsize(char *s) {
  char *p;
  int n;
  if (s[0] == ':' || s[0] == '&')
    p = s + 1;
  else
    p = s;
  n = *p++ - 63;
  if (n > 62) {
    n = *p++ - 63;
    if (n > 62) {
      n = *p++ - 63;
      n = (n << 6) | (*p++ - 63);
      n = (n << 6) | (*p++ - 63);
      n = (n << 6) | (*p++ - 63);
      n = (n << 6) | (*p++ - 63);
      n = (n << 6) | (*p++ - 63);
    } else {
      n = (n << 6) | (*p++ - 63);
      n = (n << 6) | (*p++ - 63);
    }
  }
  return n;
}
```