user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<FixDatestamp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x160,%rsp
  mov    %rdi,-0x148(%rbp)
  mov    %esi,-0x14c(%rbp)
  mov    %edx,-0x150(%rbp)
  mov    %ecx,-0x154(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x138(%rbp)
  movq   $0x0,-0x120(%rbp)
  movl   $0x1,-0x134(%rbp)
  lea    -0x138(%rbp),%rcx
  lea    -0x10c(%rbp),%rdx
  lea    -0x118(%rbp),%rsi
  mov    -0x148(%rbp),%rax
  mov    %rax,%rdi
  call   <ReadGPSTimestamp@plt>
  mov    %rax,-0x120(%rbp)
  cmpq   $0x0,-0x120(%rbp)
  jne    L60
  mov    -0x148(%rbp),%rax
  mov    %rax,%rsi
  lea    D69(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x134(%rbp)
  jmp    L73
L60:
  mov    -0x138(%rbp),%eax
  test   %eax,%eax
  jne    L42
  mov    -0x148(%rbp),%rax
  mov    %rax,%rsi
  lea    D40(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x134(%rbp)
  jmp    L73
L42:
  mov    -0x150(%rbp),%ecx
  mov    -0x14c(%rbp),%edx
  mov    -0x120(%rbp),%rax
  lea    D46(%rip),%rsi
  mov    %rax,%rdi
  call   <ConvertToUnixTime@plt>
  mov    %rax,-0x130(%rbp)
  lea    -0x10c(%rbp),%rcx
  lea    -0x118(%rbp),%rdx
  lea    -0x100(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  lea    D38(%rip),%rdx
  mov    $0x18,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  lea    -0x100(%rbp),%rax
  mov    $0x0,%ecx
  mov    $0x0,%edx
  lea    D46(%rip),%rsi
  mov    %rax,%rdi
  call   <ConvertToUnixTime@plt>
  mov    %rax,-0x128(%rbp)
  mov    -0x130(%rbp),%rdx
  mov    -0x128(%rbp),%rax
  cmp    %rax,%rdx
  je     L66
  cmpl   $0x0,-0x154(%rbp)
  jne    L27
  mov    -0x130(%rbp),%rdx
  mov    -0x148(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <WriteFixedDatestamp@plt>
  mov    %eax,-0x134(%rbp)
L27:
  lea    -0x130(%rbp),%rax
  mov    %rax,%rdi
  call   <gmtime@plt>
  mov    %eax,%edx
  lea    -0xe0(%rbp),%rax
  mov    %edx,%ecx
  lea    D20(%rip),%rdx
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <strftime@plt>
  lea    -0x128(%rbp),%rax
  mov    %rax,%rdi
  call   <gmtime@plt>
  mov    %eax,%edx
  lea    -0x70(%rbp),%rax
  mov    %edx,%ecx
  lea    D20(%rip),%rdx
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <strftime@plt>
  lea    -0xe0(%rbp),%rsi
  lea    -0x70(%rbp),%rcx
  lea    -0xe0(%rbp),%rdx
  mov    -0x148(%rbp),%rax
  mov    %rsi,%r8
  mov    %rax,%rsi
  lea    D61(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L73
L66:
  lea    -0x100(%rbp),%rcx
  mov    -0x120(%rbp),%rdx
  mov    -0x148(%rbp),%rax
  mov    %rax,%rsi
  lea    D28(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L73:
  mov    -0x120(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x134(%rbp),%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L63
  call   <__stack_chk_fail@plt>
L63:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_label: D69
type_infered: string
name: read_data
arguments: data_label: D40
type_infered: string
name: read_data
arguments: data_label: D46
type_infered: string
name: read_data
arguments: data_label: D38
type_infered: string
name: read_data
arguments: data_label: D20
type_infered: string
name: read_data
arguments: data_label: D61
type_infered: string
name: read_data
arguments: data_label: D28
type_infered: string

tool: D69: %s: No EXIF data.


tool: D40: %s: No GPS data.


tool: D46: %d:%d:%d %d:%d:%d

tool: D38: %s %s

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

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


tool: D28: %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;
}
```