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

```asm
<parse_constraints_line>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x188,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %esi,%eax
  mov    %rdx,0x28(%rsp)
  mov    %rcx,0x30(%rsp)
  mov    %r8,0x40(%rsp)
  mov    %r9,0x38(%rsp)
  mov    0x1c0(%rsp),%rbx
  mov    %rbx,0x18(%rsp)
  mov    0x1c8(%rsp),%rbx
  mov    %rbx,0x10(%rsp)
  mov    0x1d0(%rsp),%rsi
  mov    %rsi,0x48(%rsp)
  mov    %al,0x26(%rsp)
  mov    %fs:0x28,%rdx
  mov    %rdx,0x178(%rsp)
  xor    %edx,%edx
  lea    -0x20(%rax),%ecx
  cmp    $0x30,%cl
  ja     L333
  mov    $0x1,%eax
  shl    %cl,%rax
  test   $0x8008029,%eax
  jne    L365
  movabs $0x1004200000000,%rdx
  test   %rdx,%rax
  jne    L358
  movabs $0x2800000000,%rdx
  test   %rdx,%rax
  jne    L297
  mov    $0x1,%ebp
L222:
  mov    0x18(%rsp),%rax
  movb   $0x3f,(%rax)
  jmp    L425
  lea    0x58(%rsp),%rcx
  lea    0x54(%rsp),%rdx
  lea    0x70(%rsp),%rdi
  lea    0x5c(%rsp),%r8
  lea    D45(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x2,%eax
  je     L386
  lea    0x5c(%rsp),%rcx
  lea    0x54(%rsp),%rdx
  lea    0x70(%rsp),%rdi
  lea    D3(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jne    L425
  lea    0x70(%rsp),%rdi
  call   <strlen@plt>
  cmp    0x5c(%rsp),%eax
  jne    L425
  mov    0x54(%rsp),%eax
  mov    0x28(%rsp),%rsi
  mov    %eax,(%rsi)
  mov    %ebx,%r14d
  jmp    L351
L386:
  lea    0x70(%rsp),%rdi
  call   <strlen@plt>
  cmp    0x5c(%rsp),%eax
  jne    L425
  mov    0x54(%rsp),%eax
  mov    0x28(%rsp),%rsi
  mov    %eax,(%rsi)
  mov    0x58(%rsp),%eax
  mov    0x30(%rsp),%rsi
  mov    %eax,(%rsi)
  sub    $0x1,%r15d
  mov    %ebp,0x20(%rsp)
  mov    %ebx,%r14d
  jmp    L351
  lea    0x58(%rsp),%rcx
  lea    0x54(%rsp),%rdx
  lea    0x70(%rsp),%rdi
  lea    0x5c(%rsp),%r8
  lea    D45(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x2,%eax
  je     L598
  cmpl   $0x0,0x20(%rsp)
  je     L512
  lea    0x5c(%rsp),%rcx
  lea    0x54(%rsp),%rdx
  lea    0x70(%rsp),%rdi
  lea    D3(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,0x20(%rsp)
  cmp    $0x1,%eax
  jne    L425
  lea    0x70(%rsp),%rdi
  call   <strlen@plt>
  cmp    0x5c(%rsp),%eax
  jne    L425
  mov    0x54(%rsp),%eax
  mov    0x38(%rsp),%rsi
  mov    %eax,(%rsi)
  mov    $0x0,%r14d
  jmp    L351
L598:
  lea    0x70(%rsp),%rdi
  call   <strlen@plt>
  cmp    0x5c(%rsp),%eax
  jne    L425
  mov    0x54(%rsp),%eax
  mov    0x40(%rsp),%rsi
  mov    %eax,(%rsi)
  mov    0x58(%rsp),%eax
  mov    0x38(%rsp),%rsi
  mov    %eax,(%rsi)
  mov    $0x0,%r14d
  mov    0x20(%rsp),%eax
  test   %eax,%eax
  jne    L351
  sub    $0x1,%r15d
  mov    %eax,%r14d
  mov    %ebx,0x20(%rsp)
  jmp    L351
L512:
  lea    0x5c(%rsp),%rcx
  lea    0x54(%rsp),%rdx
  lea    0x70(%rsp),%rdi
  lea    D3(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jne    L425
  lea    0x70(%rsp),%rdi
  call   <strlen@plt>
  cmp    0x5c(%rsp),%eax
  jne    L425
  mov    0x54(%rsp),%eax
  mov    0x30(%rsp),%rsi
  mov    %eax,(%rsi)
  mov    0x20(%rsp),%r14d
  jmp    L351
  cmpl   $0x0,0x20(%rsp)
  je     L468
  sub    $0x1,%r15d
  cmpb   $0x45,0x26(%rsp)
  je     L514
  lea    0x5c(%rsp),%rcx
  lea    0x66(%rsp),%rdx
  lea    0x70(%rsp),%rdi
  lea    D69(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,%r14d
  cmp    $0x1,%eax
  je     L304
L425:
  mov    0x178(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L185
  mov    %ebp,%eax
  add    $0x188,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L468:
  lea    0x5c(%rsp),%rcx
  lea    0x54(%rsp),%rdx
  lea    0x70(%rsp),%rdi
  lea    D3(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jne    L425
  lea    0x70(%rsp),%rdi
  call   <strlen@plt>
  cmp    0x5c(%rsp),%eax
  jne    L425
  mov    0x54(%rsp),%eax
  mov    0x40(%rsp),%rsi
  mov    %eax,(%rsi)
  mov    0x20(%rsp),%r14d
  jmp    L351
L514:
  lea    0x5c(%rsp),%rcx
  lea    0x60(%rsp),%rdx
  lea    0x70(%rsp),%rdi
  lea    D110(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jne    L425
  lea    0x70(%rsp),%rdi
  call   <strlen@plt>
  cmp    0x5c(%rsp),%eax
  jne    L425
  movss  0x60(%rsp),%xmm0
  mov    0x48(%rsp),%rax
  movss  %xmm0,(%rax)
  mov    $0x0,%r14d
  jmp    L351
L304:
  movb   $0x0,0x6e(%rsp)
  lea    0x70(%rsp),%rdi
  call   <strlen@plt>
  cmp    0x5c(%rsp),%eax
  jne    L425
  movzbl 0x66(%rsp),%edx
  test   %dl,%dl
  je     L100
  lea    0x66(%rsp),%rcx
  movzbl 0x27(%rsp),%esi
  jmp    L248
  or     $0x1,%esi
L43:
  add    $0x1,%rcx
  movzbl (%rcx),%edx
  test   %dl,%dl
  je     L172
L248:
  lea    -0x41(%rdx),%eax
  cmp    $0x2c,%al
  ja     L395
  movzbl %al,%eax
  lea    D106(%rip),%rdi
  movslq (%rdi,%rax,4),%rax
  add    %rdi,%rax
  notrack jmp *%rax
  or     $0x2,%esi
  jmp    L43
  or     $0x4,%esi
  jmp    L43
  or     $0x8,%esi
  jmp    L43
  or     $0x10,%esi
  jmp    L43
  or     $0x20,%esi
  jmp    L43
  mov    0x10(%rsp),%rax
  mov    %dl,(%rax)
  jmp    L43
  mov    $0x3f,%esi
  jmp    L43
L172:
  mov    %sil,0x27(%rsp)
  mov    $0x0,%r14d
  jmp    L7
L100:
  mov    $0x0,%r14d
  jmp    L7
L395:
  mov    %sil,0x27(%rsp)
L7:
  movzbl 0x27(%rsp),%eax
  test   %al,%al
  je     L351
  mov    0x18(%rsp),%rsi
  mov    %al,(%rsi)
  jmp    L351
  mov    %sil,0x27(%rsp)
  jmp    L7
  lea    0x70(%rsp),%rdi
  mov    0x10(%rsp),%rdx
  lea    D22(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jne    L425
  mov    $0x0,%r14d
L351:
  add    $0x1,%ebx
  test   %r14d,%r14d
  jne    L70
  cmp    %ebx,%r15d
  jle    L70
L69:
  lea    0x5c(%rsp),%rcx
  lea    0x70(%rsp),%rdx
  movslq %r12d,%rdi
  add    0x8(%rsp),%rdi
  lea    D76(%rip),%rsi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,%ebp
  cmp    $0x1,%eax
  jne    L368
  add    0x5c(%rsp),%r12d
  cmp    $0x4,%ebx
  ja     L134
  mov    %ebx,%eax
  movslq 0x0(%r13,%rax,4),%rax
  add    %r13,%rax
  notrack jmp *%rax
L134:
  mov    $0x0,%r14d
  jmp    L351
L70:
  mov    %r14d,%ebp
  jmp    L425
L358:
  mov    $0x5,%r15d
L308:
  mov    0x18(%rsp),%rax
  movb   $0x3f,(%rax)
  movb   $0x0,0x27(%rsp)
  mov    $0x0,%ebx
  mov    $0x0,%r12d
  movl   $0x0,0x20(%rsp)
  lea    D93(%rip),%r13
  jmp    L69
L297:
  mov    $0x4,%r15d
  jmp    L308
L368:
  mov    $0x0,%ebp
  jmp    L425
L333:
  mov    $0x1,%ebp
  jmp    L222
L365:
  mov    $0x2,%ebp
  jmp    L222
L185:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D45
type_infered: string
name: disassemble_data
arguments: data_tag: D3
type_infered: string
name: disassemble_data
arguments: data_tag: D69
type_infered: string
name: disassemble_data
arguments: data_tag: D110
type_infered: string
name: disassemble_data
arguments: data_tag: D22
type_infered: string
name: disassemble_data
arguments: data_tag: D76
type_infered: string

tool: D45: %d-%d%n

tool: D3: %d%n

tool: D69: %8s%n

tool: D110: %g%n

tool: D22: %c

tool: D76: %15s%n

assistant: ```c
int parse_constraints_line(const char *line, char command, int *i, int *j, int *k, int *l, char *loop, char *orientation, float *e) {
  int v1, v2;
  int ret = 0;
  int range_mode = 0;
  int pos = 0;
  int max_entries = 5;
  int entries_seen = 0;
  int pp;
  float energy;
  char buf[256], buf2[10], *c, tmp_loop;
  switch (command) {
  case 'A':
  case 'F':
  case 'P':
    max_entries = 5;
    break;
  case 'C':
  case 'E':
    max_entries = 4;
    break;
  case '#':
  case ';':
  case '%':
  case '/':
  case ' ':
    ret = 2;
    break;
  default:
    ret = 1;
    break;
  }
  *loop = (char)((char)0x01 | (char)0x02 | (char)0x04 | (char)0x08 | (char)0x10 | (char)0x20);
  tmp_loop = (char)0;
  while (!ret && (entries_seen < max_entries) && (sscanf(line + pos, "%15s%n", &buf[0], &pp) == 1)) {
    pos += pp;
    switch (entries_seen) {
    case 0:
      if (sscanf(buf, "%d-%d%n", &v1, &v2, &pp) == 2) {
        if (pp == strlen(buf)) {
          *i = v1;
          *j = v2;
          range_mode = 1;
          --max_entries;
          break;
        }
      } else if (sscanf(buf, "%d%n", &v1, &pp) == 1) {
        if (pp == strlen(buf)) {
          *i = v1;
          break;
        }
      }
      ret = 1;
      break;
    case 1:
      if (sscanf(buf, "%d-%d%n", &v1, &v2, &pp) == 2) {
        if (pp == strlen(buf)) {
          *k = v1;
          *l = v2;
          if (!range_mode)
            --max_entries;
          range_mode = 1;
          break;
        }
      } else if (range_mode) {
        if (sscanf(buf, "%d%n", &v1, &pp) == 1) {
          if (pp == strlen(buf)) {
            *l = v1;
            break;
          }
        }
      } else if (sscanf(buf, "%d%n", &v1, &pp) == 1) {
        if (pp == strlen(buf)) {
          *j = v1;
          break;
        }
      }
      ret = 1;
      break;
    case 2:
      if (!range_mode) {
        if (sscanf(buf, "%d%n", &v1, &pp) == 1) {
          if (pp == strlen(buf)) {
            *k = v1;
            break;
          }
        }
        ret = 1;
        break;
      } else {
        --max_entries;
      }
    case 3:
      if (command == 'E') {
        if (sscanf(buf, "%g%n", &energy, &pp) == 1) {
          if (pp == strlen(buf)) {
            *e = energy;
            break;
          }
        }
      } else {
        if (sscanf(buf, "%8s%n", &buf2[0], &pp) == 1) {
          buf2[8] = '\0';
          if (pp == strlen(buf)) {
            for (c = &(buf2[0]); (*c != '\0') && (!ret); c++) {
              switch (*c) {
              case 'E':
                tmp_loop |= (char)0x01;
                break;
              case 'H':
                tmp_loop |= (char)0x02;
                break;
              case 'I':
                tmp_loop |= (char)0x04;
                break;
              case 'i':
                tmp_loop |= (char)0x08;
                break;
              case 'M':
                tmp_loop |= (char)0x10;
                break;
              case 'm':
                tmp_loop |= (char)0x20;
                break;
              case 'A':
                tmp_loop |= (char)((char)0x01 | (char)0x02 | (char)0x04 | (char)0x08 | (char)0x10 | (char)0x20);
                break;
              case 'U':
              case 'D':
                *orientation = *c;
                break;
              default:
                ret = 1;
              }
            }
            if (tmp_loop)
              *loop = tmp_loop;
            break;
          }
        }
      }
      ret = 1;
      break;
    case 4:
      if (!(sscanf(buf, "%c", orientation) == 1)) {
        ret = 1;
      }
      break;
    }
    ++entries_seen;
  }
  return ret;
}
```