user: Translate the below assembly code into C programming language:

```asm
<numstrcmp>:
  endbr64
  push   %r13
  mov    %rsi,%r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  nopl   0x0(%rax)
L119:
  movsbl (%r12),%edi
  mov    %r12,%rbx
  cmp    $0x20,%dil
  jne    L85
  cs nopw 0x0(%rax,%rax,1)
L122:
  movsbl 0x1(%rbx),%edi
  add    $0x1,%rbx
  cmp    $0x20,%dil
  je     L122
L85:
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L197
  mov    %r12,%rbx
  add    $0x1,%r12
L234:
  movsbl 0x0(%r13),%edi
  mov    %r13,%rbp
  cmp    $0x20,%dil
  jne    L123
  nopl   0x0(%rax)
L68:
  movsbl 0x1(%rbp),%edi
  add    $0x1,%rbp
  cmp    $0x20,%dil
  je     L68
L123:
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L223
  mov    %r13,%rbp
  add    $0x1,%r13
L11:
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  movsbl 0x0(%rbp),%edi
  test   %rax,%rax
  jne    L37
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L174
  movzbl (%rbx),%eax
  cmp    0x0(%rbp),%al
  jl     L90
  jg     L174
  test   %al,%al
  jne    L119
  add    $0x8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L197:
  lea    0x1(%rbx),%r12
  jmp    L3
  xchg   %ax,%ax
L255:
  add    $0x1,%r12
L3:
  movsbl (%r12),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L255
  jmp    L234
  nopl   0x0(%rax,%rax,1)
L37:
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L20
  jmp    L90
  nop
L195:
  add    $0x1,%rbx
L20:
  cmpb   $0x30,(%rbx)
  je     L195
  cmpb   $0x30,0x0(%rbp)
  jne    L116
  nop
L97:
  add    $0x1,%rbp
  cmpb   $0x30,0x0(%rbp)
  je     L97
L116:
  mov    %r12,%rdx
  mov    %r13,%rax
  sub    %rbx,%rdx
  sub    %rbp,%rax
  cmp    %rax,%rdx
  jl     L90
  jg     L174
  cmp    %rbx,%r12
  ja     L242
  jmp    L119
  nopw   0x0(%rax,%rax,1)
L208:
  add    $0x1,%rbx
  add    $0x1,%rbp
  cmp    %rbx,%r12
  je     L119
L242:
  movzbl (%rbx),%edx
  movzbl 0x0(%rbp),%eax
  cmp    %al,%dl
  je     L208
  cmp    %rbx,%r12
  jbe    L119
  cmp    %al,%dl
  jl     L90
L174:
  add    $0x8,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L223:
  lea    0x1(%rbp),%r13
  jmp    L248
  cs nopw 0x0(%rax,%rax,1)
L130:
  add    $0x1,%r13
L248:
  movsbl 0x0(%r13),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L130
  jmp    L11
L90:
  add    $0x8,%rsp
  mov    $0xffffffff,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

assistant: ```c
int numstrcmp(char *s1, char *s2) {
  char *a1, *a2;
  while (1) {
    for (a1 = s1; *a1 == ' '; ++a1) {
    }
    if (isdigit(*a1)) {
      for (s1 = a1 + 1; isdigit(*s1); ++s1) {
      }
    } else {
      a1 = s1;
      ++s1;
    }
    for (a2 = s2; *a2 == ' '; ++a2) {
    }
    if (isdigit(*a2)) {
      for (s2 = a2 + 1; isdigit(*s2); ++s2) {
      }
    } else {
      a2 = s2;
      ++s2;
    }
    if (!isdigit(*a1)) {
      if (!isdigit(*a2)) {
        if (*a1 < *a2)
          return -1;
        if (*a1 > *a2)
          return 1;
        if (*a1 == '\0')
          return 0;
      } else
        return 1;
    } else {
      if (!isdigit(*a2))
        return -1;
      else {
        for (; *a1 == '0'; ++a1) {
        }
        for (; *a2 == '0'; ++a2) {
        }
        if (s1 - a1 < s2 - a2)
          return -1;
        if (s1 - a1 > s2 - a2)
          return 1;
        for (; a1 < s1 && *a1 == *a2; ++a1, ++a2) {
        }
        if (a1 < s1) {
          if (*a1 < *a2)
            return -1;
          else
            return 1;
        }
      }
    }
  }
}
```