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

```asm
<js0n>:
  endbr64
  push   %r15
  mov    %esi,%esi
  mov    %ecx,%ecx
  push   %r14
  lea    (%rdx,%rcx,2),%r11
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %rdx,%rdi
  lea    (%rbx,%rsi,1),%r10
  cmp    %r10,%rbx
  jae    L170
  cmp    %r11,%rdx
  jae    L170
  lea    D22(%rip),%rbp
  mov    %rbx,%rax
  xor    %r14d,%r14d
  xor    %r12d,%r12d
  lea    -0x1(%rbx),%r8
  mov    %rbp,%r9
  xor    %r13d,%r13d
  lea    D52(%rip),%r15
  nopl   0x0(%rax,%rax,1)
L230:
  movzbl (%rax),%edx
  lea    0x1(%rax),%rsi
  mov    (%r9,%rdx,8),%rcx
  mov    %rsi,%rdx
  jmp    *%rcx
  nopl   0x0(%rax,%rax,1)
  endbr64
  lea    D9(%rip),%r9
  mov    $0x3,%r14d
  lea    0x1(%rax),%rdx
  nopl   (%rax)
L210:
  endbr64
  mov    %rdx,%rax
  add    $0x1,%r8
  cmp    %rdx,%r10
  jbe    L145
L36:
  cmp    %r11,%rdi
  jb     L230
  pop    %rbx
  mov    %r12d,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
  endbr64
  sub    $0x1,%r14d
  lea    0x1(%rax),%rdx
  cmove  %r15,%r9
  mov    %rdx,%rax
  add    $0x1,%r8
  cmp    %rdx,%r10
  ja     L36
  nopl   0x0(%rax)
L145:
  cmp    %r11,%rdi
  jae    L179
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  mov    %ax,(%rdi)
  mov    %r12d,%eax
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
  endbr64
  lea    D9(%rip),%r9
  mov    $0x2,%r14d
  lea    0x1(%rax),%rdx
  jmp    L210
  nopw   0x0(%rax,%rax,1)
  endbr64
  lea    D9(%rip),%r9
  mov    $0x1,%r14d
  lea    0x1(%rax),%rdx
  jmp    L210
  nopw   0x0(%rax,%rax,1)
  endbr64
  cmp    $0x1,%r12d
  je     L19
L2:
  movzbl (%rax),%edx
  mov    0x0(%rbp,%rdx,8),%rcx
  lea    D22(%rip),%rbp
  mov    %rsi,%rdx
  mov    %rbp,%r9
  jmp    *%rcx
  nopl   (%rax)
  endbr64
  lea    D17(%rip),%r9
  lea    0x1(%rax),%rdx
  cmp    $0x1,%r12d
  jne    L210
  mov    %rdi,%rcx
  sub    %rbx,%rax
  add    $0x2,%rdi
  mov    %ax,(%rcx)
  mov    %eax,%r13d
  jmp    L210
  cs nopw 0x0(%rax,%rax,1)
  endbr64
  mov    %r15,%r9
  lea    0x1(%rax),%rdx
  cmp    $0x1,%r12d
  jne    L210
  mov    %rdx,%rax
  mov    %rdi,%rcx
  add    $0x2,%rdi
  sub    %rbx,%rax
  mov    %ax,(%rcx)
  mov    %eax,%r13d
  jmp    L210
  nopl   (%rax)
  endbr64
  sub    $0x1,%r12d
  lea    0x1(%rax),%rdx
  cmp    $0x1,%r12d
  jne    L210
  movzwl %r13w,%r13d
  mov    %rdi,%rcx
  add    $0x2,%rdi
  add    %rbx,%r13
  sub    %r13,%rax
  lea    0x1(%rax),%r13d
  mov    %r13w,(%rcx)
  jmp    L210
  nopl   0x0(%rax)
  endbr64
  cmp    $0x1,%r12d
  je     L78
  add    $0x1,%r12d
  lea    0x1(%rax),%rdx
  jmp    L210
  nopl   0x0(%rax,%rax,1)
  endbr64
  mov    $0x1,%r12d
L179:
  pop    %rbx
  mov    %r12d,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  endbr64
  lea    D40(%rip),%r9
  lea    0x1(%rax),%rdx
  jmp    L210
  nopl   0x0(%rax)
  endbr64
  lea    D22(%rip),%r9
  lea    0x1(%rax),%rdx
  cmp    $0x1,%r12d
  jne    L210
  movzwl %r13w,%r13d
  mov    %r8,%rcx
  mov    %rdi,%rax
  add    $0x2,%rdi
  add    %rbx,%r13
  sub    %r13,%rcx
  lea    0x1(%rcx),%r13d
  mov    %r13w,(%rax)
  jmp    L210
  nopw   0x0(%rax,%rax,1)
  endbr64
  mov    %r15,%r9
  lea    0x1(%rax),%rdx
  jmp    L210
  nopl   0x0(%rax,%rax,1)
L19:
  movzwl %r13w,%r13d
  mov    %r8,%rdx
  add    $0x2,%rdi
  add    %rbx,%r13
  sub    %r13,%rdx
  lea    0x1(%rdx),%r13d
  mov    %r13w,-0x2(%rdi)
  jmp    L2
  nop
L78:
  mov    %rax,%rdx
  add    $0x2,%rdi
  add    $0x1,%r12d
  sub    %rbx,%rdx
  mov    %dx,-0x2(%rdi)
  mov    %edx,%r13d
  lea    0x1(%rax),%rdx
  jmp    L210
L170:
  xor    %r12d,%r12d
  jmp    L145
```

assistant: ```c
int js0n(const unsigned char *js, unsigned int len, unsigned short *out, unsigned int olen) {
  unsigned short prev = 0, *oend;
  const unsigned char *cur, *end;
  int depth = 0;
  int utf8_remain = 0;
  static void *gostruct[] = {[0 ... 255] = &&l_bad, ['\t'] = &&l_loop, [' '] = &&l_loop, ['\r'] = &&l_loop, ['\n'] = &&l_loop, ['"'] = &&l_qup, [':'] = &&l_loop, [','] = &&l_loop, ['['] = &&l_up, [']'] = &&l_down, ['{'] = &&l_up, ['}'] = &&l_down, ['-'] = &&l_bare, [48 ... 57] = &&l_bare, ['t'] = &&l_bare, ['f'] = &&l_bare, ['n'] = &&l_bare};
  static void *gobare[] = {[0 ... 31] = &&l_bad, [32 ... 126] = &&l_loop, ['\t'] = &&l_unbare, [' '] = &&l_unbare, ['\r'] = &&l_unbare, ['\n'] = &&l_unbare, [','] = &&l_unbare, [']'] = &&l_unbare, ['}'] = &&l_unbare, [127 ... 255] = &&l_bad};
  static void *gostring[] = {[0 ... 31] = &&l_bad, [127] = &&l_bad, [32 ... 126] = &&l_loop, ['\\'] = &&l_esc, ['"'] = &&l_qdown, [128 ... 191] = &&l_bad, [192 ... 223] = &&l_utf8_2, [224 ... 239] = &&l_utf8_3, [240 ... 247] = &&l_utf8_4, [248 ... 255] = &&l_bad};
  static void *goutf8_continue[] = {[0 ... 127] = &&l_bad, [128 ... 191] = &&l_utf_continue, [192 ... 255] = &&l_bad};
  static void *goesc[] = {[0 ... 255] = &&l_bad, ['"'] = &&l_unesc, ['\\'] = &&l_unesc, ['/'] = &&l_unesc, ['b'] = &&l_unesc, ['f'] = &&l_unesc, ['n'] = &&l_unesc, ['r'] = &&l_unesc, ['t'] = &&l_unesc, ['u'] = &&l_unesc};
  void **go = gostruct;
  for (cur = js, end = js + len, oend = out + olen; cur < end && out < oend; cur++) {
    goto *go[*cur];
  l_loop:;
  }
  if (out < oend)
    *out = 0;
  return depth;
l_bad:
  return 1;
l_up:
  if (depth == 1)
    prev = *out++ = ((cur + 0) - js);
  ++depth;
  goto l_loop;
l_down:
  --depth;
  if (depth == 1)
    prev = *out++ = ((cur + 0) - (js + prev) + 1);
  goto l_loop;
l_qup:
  if (depth == 1)
    prev = *out++ = ((cur + 1) - js);
  go = gostring;
  goto l_loop;
l_qdown:
  if (depth == 1)
    prev = *out++ = ((cur + -1) - (js + prev) + 1);
  go = gostruct;
  goto l_loop;
l_esc:
  go = goesc;
  goto l_loop;
l_unesc:
  go = gostring;
  goto l_loop;
l_bare:
  if (depth == 1)
    prev = *out++ = ((cur + 0) - js);
  go = gobare;
  goto l_loop;
l_unbare:
  if (depth == 1)
    prev = *out++ = ((cur + -1) - (js + prev) + 1);
  go = gostruct;
  goto *go[*cur];
l_utf8_2:
  go = goutf8_continue;
  utf8_remain = 1;
  goto l_loop;
l_utf8_3:
  go = goutf8_continue;
  utf8_remain = 2;
  goto l_loop;
l_utf8_4:
  go = goutf8_continue;
  utf8_remain = 3;
  goto l_loop;
l_utf_continue:
  if (!--utf8_remain)
    go = gostring;
  goto l_loop;
}
```