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

```asm
<sg_get_sense_progress_fld>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %rdx,-0x28(%rbp)
  cmpl   $0x6,-0x1c(%rbp)
  jg     L73
  mov    $0x0,%eax
  jmp    L222
L73:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x7f,%eax
  cmp    $0x71,%eax
  jg     L99
  cmp    $0x70,%eax
  jge    L127
  jmp    L35
L99:
  sub    $0x72,%eax
  cmp    $0x1,%eax
  ja     L35
  jmp    L28
L127:
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,-0x10(%rbp)
  cmpl   $0x11,-0x1c(%rbp)
  jle    L202
  cmpl   $0x0,-0x10(%rbp)
  je     L23
  cmpl   $0x2,-0x10(%rbp)
  je     L23
L202:
  mov    $0x0,%eax
  jmp    L222
L23:
  mov    -0x18(%rbp),%rax
  add    $0xf,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L16
  cmpq   $0x0,-0x28(%rbp)
  je     L76
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x11,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
L76:
  mov    $0x1,%eax
  jmp    L222
L16:
  mov    $0x0,%eax
  jmp    L222
L28:
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,-0x10(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  je     L62
  cmpl   $0x2,-0x10(%rbp)
  jne    L236
L62:
  mov    $0x1,%eax
  jmp    L107
L236:
  mov    $0x0,%eax
L107:
  mov    %eax,-0xc(%rbp)
  cmpl   $0x0,-0xc(%rbp)
  je     L3
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  mov    $0x2,%edx
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <sg_scsi_sense_desc_find@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  je     L3
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x6,%al
  jne    L3
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L3
  cmpq   $0x0,-0x28(%rbp)
  je     L274
  mov    -0x8(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
L274:
  mov    $0x1,%eax
  jmp    L222
L3:
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  mov    $0xa,%edx
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <sg_scsi_sense_desc_find@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  je     L68
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x6,%al
  jne    L68
  cmpq   $0x0,-0x28(%rbp)
  je     L84
  mov    -0x8(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
L84:
  mov    $0x1,%eax
  jmp    L222
L68:
  mov    $0x0,%eax
  jmp    L222
L35:
  mov    $0x0,%eax
L222:
  leave
  ret
```

assistant: ```c
int sg_get_sense_progress_fld(const unsigned char *sensep, int sb_len, int *progress_outp) {
  const unsigned char *ucp;
  int sk, sk_pr;
  if (sb_len < 7)
    return 0;
  switch (sensep[0] & 0x7f) {
  case 0x70:
  case 0x71:
    sk = (sensep[2] & 0xf);
    if ((sb_len < 18) || ((0x0 != sk) && (0x2 != sk)))
      return 0;
    if (sensep[15] & 0x80) {
      if (progress_outp)
        *progress_outp = (sensep[16] << 8) + sensep[17];
      return 1;
    } else
      return 0;
  case 0x72:
  case 0x73:
    sk = (sensep[1] & 0xf);
    sk_pr = (0x0 == sk) || (0x2 == sk);
    if (sk_pr && ((ucp = sg_scsi_sense_desc_find(sensep, sb_len, 2))) && (0x6 == ucp[1]) && (0x80 & ucp[4])) {
      if (progress_outp)
        *progress_outp = (ucp[5] << 8) + ucp[6];
      return 1;
    } else if (((ucp = sg_scsi_sense_desc_find(sensep, sb_len, 0xa))) && ((0x6 == ucp[1]))) {
      if (progress_outp)
        *progress_outp = (ucp[6] << 8) + ucp[7];
      return 1;
    } else
      return 0;
  default:
    return 0;
  }
}
```