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

```asm
<test_json_getValueByJS>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x358,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x348(%rsp)
  xor    %eax,%eax
  lea    D125(%rip),%rdi
  call   <puts@plt>
  lea    D171(%rip),%rdi
  call   <puts@plt>
  lea    0x18(%rsp),%rsi
  lea    D68(%rip),%rdi
  call   <convertFileToString@plt>
  test   %rax,%rax
  jne    L8
  mov    0x18(%rsp),%rbx
  mov    %rbx,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    %rbx,%rcx
  lea    D68(%rip),%rsi
  lea    D86(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    0x20(%rsp),%rdi
  mov    $0x64,%ecx
  mov    $0x0,%eax
  rep stos %rax,%es:(%rdi)
  lea    D95(%rip),%rbx
  mov    %rbx,0x20(%rsp)
  lea    D50(%rip),%rax
  mov    %rax,0x28(%rsp)
  lea    D187(%rip),%rax
  mov    %rax,0x30(%rsp)
  lea    D136(%rip),%rax
  mov    %rax,0x38(%rsp)
  lea    D175(%rip),%rax
  mov    %rax,0x40(%rsp)
  lea    D93(%rip),%rax
  mov    %rax,0x48(%rsp)
  lea    D37(%rip),%rax
  mov    %rax,0x50(%rsp)
  lea    D209(%rip),%rax
  mov    %rax,0x58(%rsp)
  mov    $0x1,%ebp
  lea    D34(%rip),%r13
  lea    D145(%rip),%r12
  lea    D194(%rip),%r15
  lea    D23(%rip),%r14
  jmp    L18
L8:
  lea    D68(%rip),%rsi
  lea    D60(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L39
L21:
  mov    0x14(%rsp),%edi
  call   <json_type_toString@plt>
  mov    %rax,%rsi
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    0x18(%rsp),%rdi
  call   <json_util_printSubstring@plt>
  mov    %r14,%rdi
  call   <puts@plt>
L1:
  add    $0x1,%rbp
  mov    0x18(%rsp,%rbp,8),%rbx
  test   %rbx,%rbx
  je     L32
L18:
  mov    %r13,%rdi
  call   <puts@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    %rbx,%rcx
  mov    %ebp,%esi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  sub    $0x8,%rsp
  lea    0x1c(%rsp),%rax
  push   %rax
  lea    0x20(%rsp),%r9
  lea    0x1c(%rsp),%r8
  mov    $0x0,%ecx
  mov    %rbx,%rdx
  mov    $0x0,%esi
  mov    0x28(%rsp),%rdi
  call   <json_getValueByJS@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  je     L21
  mov    %rbx,%rsi
  lea    D96(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L1
L32:
  mov    0x18(%rsp),%rdi
  call   <free@plt>
  lea    D17(%rip),%rdi
  call   <puts@plt>
L39:
  mov    0x348(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L49
  add    $0x358,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L49:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_label: D125
type_infered: string
name: disassemble_data
arguments: data_label: D171
type_infered: string
name: disassemble_data
arguments: data_label: D68
type_infered: string
name: disassemble_data
arguments: data_label: D86
type_infered: string
name: disassemble_data
arguments: data_label: D95
type_infered: string
name: disassemble_data
arguments: data_label: D50
type_infered: string
name: disassemble_data
arguments: data_label: D187
type_infered: string
name: disassemble_data
arguments: data_label: D136
type_infered: string
name: disassemble_data
arguments: data_label: D175
type_infered: string
name: disassemble_data
arguments: data_label: D93
type_infered: string
name: disassemble_data
arguments: data_label: D37
type_infered: string
name: disassemble_data
arguments: data_label: D209
type_infered: string
name: disassemble_data
arguments: data_label: D34
type_infered: string
name: disassemble_data
arguments: data_label: D145
type_infered: string
name: disassemble_data
arguments: data_label: D194
type_infered: string
name: disassemble_data
arguments: data_label: D23
type_infered: string
name: disassemble_data
arguments: data_label: D60
type_infered: string
name: disassemble_data
arguments: data_label: D96
type_infered: string
name: disassemble_data
arguments: data_label: D17
type_infered: string

tool: D125: Test json_getValueByJS

tool: D171: ================================================================================

tool: D68: sample.json

tool: D86: %s (%lu) = %s


tool: D95: contents

tool: D50: ["contents"][0]

tool: D187: ["contents"][2]

tool: D136: ["contents"][0]["productName"]

tool: 

tool: D93: [0]

tool: D37: orderID

tool: D209: ["contents"][0]["quantity"]

tool: D34: --------------------------------------------------------------------------------

tool: D145: %2d. KEY (%lu) = %s


tool: D194:     VALUE (%s) = 

tool: D23: 


tool: D60: convert file '%s' to string failure


tool: D96: %s is not found



tool: D17: ================================================================================


assistant: ```c
void test_json_getValueByJS() {
  puts("Test json_getValueByJS");
  puts("================================================================================");
  const char *fileName = "sample.json";
  char *string;
  if (convertFileToString(fileName, &string) != 0) {
    printf("convert file '%s' to string failure\n", fileName);
    return;
  }
  printf("%s (%lu) = %s\n", fileName, strlen(string), string);
  char *keys[100] = {"[\"contents\"]", "[\"contents\"][0]", "[\"contents\"][2]", "[\"contents\"][0][\"productName\"]", "[]", "[0]", "[\"orderID\"]", "[\"contents\"][0][\"quantity\"]"};
  int i;
  for (i = 0; keys[i] != NULL; i++) {
    puts("--------------------------------------------------------------------------------");
    printf("%2d. KEY (%lu) = %s\n", i + 1, strlen(keys[i]), keys[i]);
    int valueStartIndex, valueEndIndex, valueJsonType;
    if (json_getValueByJS(string, 0, keys[i], 0, &valueStartIndex, &valueEndIndex, &valueJsonType) != 0) {
      printf("%s is not found\n\n", keys[i]);
      continue;
    }
    printf("    VALUE (%s) = ", json_type_toString(valueJsonType));
    json_util_printSubstring(string, valueStartIndex, valueEndIndex);
    puts("\n");
  }
  free(string);
  puts("================================================================================\n");
}
```