user: 请将以下的汇编代码转换成C语言代码：

```asm
<FixDatestamp>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x138,%rsp
  mov    %rdi,%rbp
  mov    %esi,%r13d
  mov    %edx,%r14d
  mov    %ecx,%r15d
  mov    %fs:0x28,%rax
  mov    %rax,0x128(%rsp)
  xor    %eax,%eax
  movl   $0x0,0x4(%rsp)
  lea    0x4(%rsp),%rcx
  lea    0x24(%rsp),%rdx
  lea    0x18(%rsp),%rsi
  call   <ReadGPSTimestamp@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L12
  mov    0x4(%rsp),%r12d
  test   %r12d,%r12d
  jne    L57
  mov    %rbp,%rsi
  lea    D12(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L55:
  mov    %rbx,%rdi
  call   <free@plt>
  mov    0x128(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L77
  mov    %r12d,%eax
  add    $0x138,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L12:
  mov    %rbp,%rsi
  lea    D45(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%r12d
  jmp    L55
L57:
  mov    %r14d,%ecx
  mov    %r13d,%edx
  lea    D59(%rip),%r13
  mov    %r13,%rsi
  mov    %rax,%rdi
  call   <ConvertToUnixTime@plt>
  mov    %rax,0x8(%rsp)
  lea    0x18(%rsp),%rcx
  lea    0x30(%rsp),%r12
  lea    0x24(%rsp),%r8
  lea    D6(%rip),%rdx
  mov    $0x18,%esi
  mov    %r12,%rdi
  call   <snprintf@plt>
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <ConvertToUnixTime@plt>
  mov    %rax,0x10(%rsp)
  mov    0x8(%rsp),%rsi
  cmp    %rsi,%rax
  je     L42
  mov    $0x1,%r12d
  test   %r15d,%r15d
  je     L19
L38:
  lea    0x8(%rsp),%rdi
  call   <gmtime@plt>
  mov    %eax,%ecx
  lea    0x50(%rsp),%r13
  lea    D68(%rip),%r15
  mov    %r15,%rdx
  mov    $0x64,%esi
  mov    %r13,%rdi
  call   <strftime@plt>
  lea    0x10(%rsp),%rdi
  call   <gmtime@plt>
  mov    %eax,%ecx
  lea    0xc0(%rsp),%r14
  mov    %r15,%rdx
  mov    $0x64,%esi
  mov    %r14,%rdi
  call   <strftime@plt>
  mov    %r13,%r8
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %rbp,%rsi
  lea    D47(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L55
L19:
  mov    %rbp,%rdi
  call   <WriteFixedDatestamp@plt>
  mov    %eax,%r12d
  jmp    L38
L42:
  lea    0x30(%rsp),%rcx
  mov    %rbx,%rdx
  mov    %rbp,%rsi
  lea    D1(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%r12d
  jmp    L55
L77:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_label: D12
data_type: string
name: parse_data
arguments: data_label: D45
data_type: string
name: parse_data
arguments: data_label: D59
data_type: string
name: parse_data
arguments: data_label: D6
data_type: string
name: parse_data
arguments: data_label: D68
data_type: string
name: parse_data
arguments: data_label: D47
data_type: string
name: parse_data
arguments: data_label: D1
data_type: string

tool: D12: %s: No GPS data.


tool: D45: %s: No EXIF data.


tool: D59: %d:%d:%d %d:%d:%d

tool: D6: %s %s

tool: D68: %a %b %e %T %Y UTC

tool: D47: %s: Wrong timestamp:
   Photo:     %s
   GPS:       %s
   Corrected: %s


tool: D1: %s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).


assistant: ```c
int FixDatestamp(const char *File, int AdjustmentHours, int AdjustmentMinutes, int NoWriteExif) {
  char DateStamp[12];
  char TimeStamp[12];
  char CombinedTime[24];
  int IncludesGPS = 0;
  char *OriginalDateStamp = NULL;
  int rc = 1;
  OriginalDateStamp = ReadGPSTimestamp(File, DateStamp, TimeStamp, &IncludesGPS);
  if (OriginalDateStamp == NULL) {
    printf(("%s: No EXIF data.\n"), File);
    rc = 0;
  } else if (IncludesGPS == 0) {
    printf(("%s: No GPS data.\n"), File);
    rc = 0;
  } else {
    time_t PhotoTime = ConvertToUnixTime(OriginalDateStamp, "%d:%d:%d %d:%d:%d", AdjustmentHours, AdjustmentMinutes);
    snprintf(CombinedTime, sizeof(CombinedTime), "%s %s", DateStamp, TimeStamp);
    time_t GPSTime = ConvertToUnixTime(CombinedTime, "%d:%d:%d %d:%d:%d", 0, 0);
    if (PhotoTime != GPSTime) {
      if (!NoWriteExif) {
        rc = WriteFixedDatestamp(File, PhotoTime);
      }
      char PhotoTimeFormat[100];
      char GPSTimeFormat[100];
      strftime(PhotoTimeFormat, sizeof(PhotoTimeFormat), "%a %b %e %T %Y UTC", gmtime(&PhotoTime));
      strftime(GPSTimeFormat, sizeof(GPSTimeFormat), "%a %b %e %T %Y UTC", gmtime(&GPSTime));
      printf(("%s: Wrong timestamp:\n   Photo:     %s\n"
              "   GPS:       %s\n   Corrected: %s\n"),
             File, PhotoTimeFormat, GPSTimeFormat, PhotoTimeFormat);
    } else {
      printf(("%s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).\n"), File, OriginalDateStamp, CombinedTime);
    }
  }
  free(OriginalDateStamp);
  return rc;
}
```