user: What is the c source code of the assembly code below:

```asm
<str2uint>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  movl   $0x0,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  movw   $0xa,-0x10(%rbp)
L77:
  movl   $0x0,-0x4(%rbp)
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x20,%eax
  je     L87
  cmp    $0x30,%eax
  je     L58
  jmp    L198
L87:
  addl   $0x1,-0xc(%rbp)
  movl   $0x1,-0x4(%rbp)
L58:
  mov    -0xc(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  je     L81
  mov    -0xc(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x58,%al
  jne    L51
L81:
  addl   $0x2,-0xc(%rbp)
  movw   $0x10,-0x10(%rbp)
L51:
  mov    -0xc(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x62,%al
  je     L105
  mov    -0xc(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x42,%al
  jne    L203
L105:
  addl   $0x2,-0xc(%rbp)
  movw   $0x2,-0x10(%rbp)
L203:
  nop
L198:
  cmpl   $0x0,-0x4(%rbp)
  jne    L77
  jmp    L158
L183:
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x66,%eax
  jg     L135
  cmp    $0x61,%eax
  jge    L98
  cmp    $0x5f,%eax
  je     L3
  cmp    $0x5f,%eax
  jg     L135
  cmp    $0x46,%eax
  jg     L135
  cmp    $0x41,%eax
  jge    L85
  cmp    $0x20,%eax
  je     L3
  cmp    $0x20,%eax
  jl     L135
  sub    $0x30,%eax
  cmp    $0x9,%eax
  ja     L135
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cbtw
  sub    $0x30,%eax
  mov    %ax,-0xe(%rbp)
  jmp    L79
L98:
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cbtw
  sub    $0x57,%eax
  mov    %ax,-0xe(%rbp)
  jmp    L79
L85:
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cbtw
  sub    $0x37,%eax
  mov    %ax,-0xe(%rbp)
  jmp    L79
L135:
  mov    -0x8(%rbp),%eax
  jmp    L27
L79:
  movzwl -0xe(%rbp),%eax
  cmp    -0x10(%rbp),%ax
  jge    L68
  movswl -0x10(%rbp),%eax
  mov    -0x8(%rbp),%edx
  imul   %edx,%eax
  mov    %eax,-0x8(%rbp)
  movswl -0xe(%rbp),%eax
  add    %eax,-0x8(%rbp)
  jmp    L68
L3:
  nop
L68:
  addl   $0x1,-0xc(%rbp)
L158:
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jb     L183
  mov    -0x8(%rbp),%eax
L27:
  pop    %rbp
  ret
```

assistant: ```c
unsigned str2uint(const char *fmt, unsigned len) {
  unsigned count, result;
  count = result = 0;
  short carry = 10, bitnum;
  int again;
  do {
    again = 0;
    switch (fmt[count]) {
    case ' ':
      count++;
      again = 1;
    case '0':
      if ((fmt[count + 1] == 'x') || (fmt[count + 1] == 'X')) {
        count += 2;
        carry = 16;
      }
      if ((fmt[count + 1] == 'b') || (fmt[count + 1] == 'B')) {
        count += 2;
        carry = 2;
      }
      break;
    default:
      break;
    }
  } while (again);
  for (; count < len; count++) {
    switch (fmt[count]) {
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      bitnum = fmt[count] - '0';
      break;
    case 'a':
    case 'b':
    case 'c':
    case 'd':
    case 'e':
    case 'f':
      bitnum = fmt[count] - 'a' + 10;
      break;
    case 'A':
    case 'B':
    case 'C':
    case 'D':
    case 'E':
    case 'F':
      bitnum = fmt[count] - 'A' + 10;
      break;
    case ' ':
    case '_':
      continue;
    default:
      return result;
    }
    if (bitnum < carry) {
      result *= carry;
      result += bitnum;
    }
  }
  return result;
}
```