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

```asm
<WildComp2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  movl   $0x0,-0x30(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  je     L34
  cmpl   $0x0,-0x14(%rbp)
  je     L34
  mov    -0x18(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  jle    L75
  mov    -0x14(%rbp),%eax
  mov    %eax,-0x24(%rbp)
L75:
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x2c(%rbp)
  jmp    L666
L290:
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x20(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jne    L28
  addl   $0x1,-0x28(%rbp)
  jmp    L85
L28:
  cmpl   $0x0,-0x20(%rbp)
  jne    L533
  cmpl   $0x2a,-0x1c(%rbp)
  jne    L18
  addl   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L18
  movl   $0x1,-0x30(%rbp)
  jmp    L18
L533:
  cmpl   $0x0,-0x1c(%rbp)
  jne    L426
  cmpl   $0x2a,-0x20(%rbp)
  jne    L241
  addl   $0x1,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L241
  movl   $0x1,-0x30(%rbp)
  jmp    L241
L426:
  cmpl   $0x2a,-0x20(%rbp)
  jne    L304
  addl   $0x1,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L54
  movl   $0x1,-0x30(%rbp)
  jmp    L53
L54:
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,-0x20(%rbp)
  addl   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L279
  jmp    L169
L418:
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x20(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  je     L23
  cmpl   $0x0,-0x1c(%rbp)
  je     L101
  addl   $0x1,-0x28(%rbp)
L169:
  mov    -0x28(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L418
  jmp    L104
L23:
  nop
  jmp    L104
L101:
  nop
L104:
  mov    -0x20(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jne    L539
  addl   $0x1,-0x28(%rbp)
  jmp    L85
L304:
  cmpl   $0x2a,-0x1c(%rbp)
  jne    L219
  addl   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L261
  movl   $0x1,-0x30(%rbp)
  jmp    L53
L261:
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,-0x1c(%rbp)
  addl   $0x1,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L200
  jmp    L538
L658:
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  je     L218
  cmpl   $0x0,-0x20(%rbp)
  je     L63
  addl   $0x1,-0x2c(%rbp)
L538:
  mov    -0x2c(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L658
  jmp    L498
L218:
  nop
  jmp    L498
L63:
  nop
L498:
  mov    -0x20(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jne    L24
  addl   $0x1,-0x28(%rbp)
  jmp    L85
L219:
  cmpl   $0x3f,-0x20(%rbp)
  je     L272
  cmpl   $0x3f,-0x1c(%rbp)
  je     L272
  mov    -0x20(%rbp),%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,%ebx
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <toupper@plt>
  cmp    %eax,%ebx
  jne    L50
L272:
  addl   $0x1,-0x28(%rbp)
L85:
  addl   $0x1,-0x2c(%rbp)
L666:
  mov    -0x2c(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L290
  jmp    L53
L18:
  nop
  jmp    L53
L241:
  nop
  jmp    L53
L279:
  nop
  jmp    L53
L539:
  nop
  jmp    L53
L200:
  nop
  jmp    L53
L24:
  nop
  jmp    L53
L50:
  nop
L53:
  cmpl   $0x0,-0x30(%rbp)
  jne    L444
  mov    -0x2c(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jne    L444
  movl   $0x1,-0x30(%rbp)
  jmp    L444
L34:
  cmpl   $0x0,-0x18(%rbp)
  jne    L139
  cmpl   $0x1,-0x14(%rbp)
  jne    L32
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  jne    L32
  movl   $0x1,-0x30(%rbp)
  jmp    L109
L32:
  cmpl   $0x2,-0x14(%rbp)
  jne    L109
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L109
  mov    -0x40(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  jne    L109
  movl   $0x1,-0x30(%rbp)
  jmp    L109
L139:
  cmpl   $0x0,-0x14(%rbp)
  jne    L109
  cmpl   $0x1,-0x18(%rbp)
  jne    L240
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  jne    L240
  movl   $0x1,-0x30(%rbp)
  jmp    L109
L240:
  cmpl   $0x2,-0x18(%rbp)
  jne    L109
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L109
  mov    -0x38(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  jne    L109
  movl   $0x1,-0x30(%rbp)
  jmp    L109
L444:
  nop
L109:
  mov    -0x30(%rbp),%eax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int WildComp2(char *lp1, char *lp2) {
  int flg;
  int i1, i2, j1, j2, ilen;
  int c, d;
  flg = 0;
  i1 = (int)strlen(lp1);
  i2 = (int)strlen(lp2);
  if (i1 && i2) {
    ilen = i1;
    if (i2 > i1)
      ilen = i2;
    j2 = 0;
    for (j1 = 0; j1 < ilen; j1++) {
      c = toupper(lp1[j1]);
      d = toupper(lp2[j2]);
      if (c == d) {
        j2++;
        continue;
      }
      if (c == 0) {
        if (d == '*') {
          j2++;
          if (lp2[j2] == 0) {
            flg = 1;
          }
        }
        break;
      }
      if (d == 0) {
        if (c == '*') {
          j1++;
          if (lp1[j1] == 0) {
            flg = 1;
          }
        }
        break;
      }
      {
        if (c == '*') {
          j1++;
          if (lp1[j1] == 0) {
            flg = 1;
            break;
          }
          c = toupper(lp1[j1]);
          j2++;
          if (lp2[j2] == 0)
            break;
          for (; j2 < ilen; j2++) {
            d = toupper(lp2[j2]);
            if (c == d)
              break;
            if (d == 0)
              break;
          }
          if (c == d) {
            j2++;
            continue;
          }
          break;
        }
        if (d == '*') {
          j2++;
          if (lp2[j2] == 0) {
            flg = 1;
            break;
          }
          d = toupper(lp2[j2]);
          j1++;
          if (lp1[j1] == 0)
            break;
          for (; j1 < ilen; j1++) {
            c = toupper(lp1[j1]);
            if (c == d)
              break;
            if (c == 0)
              break;
          }
          if (c == d) {
            j2++;
            continue;
          }
          break;
        }
        if ((c == '?') || (d == '?')) {
        } else {
          if (toupper(c) != toupper(d))
            break;
        }
      }
      j2++;
    }
    if (!flg && (j1 == ilen))
      flg = 1;
  } else {
    if (i1 == 0) {
      if ((i2 == 1) && (*lp2 == '*')) {
        flg = 1;
      } else if ((i2 == 2) && (lp2[0] == '.') && (lp2[1] == '*')) {
        flg = 1;
      }
    } else if (i2 == 0) {
      if ((i1 == 1) && (*lp1 == '*')) {
        flg = 1;
      } else if ((i1 == 2) && (lp1[0] == '.') && (lp1[1] == '*')) {
        flg = 1;
      }
    }
  }
  return flg;
}
```