user: 请从给定的汇编指令推导出C源代码:

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x34(%rbp)
  lea    -0x30(%rbp),%rax
  mov    $0x20,%edx
  mov    $0xaa,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdx
  lea    D55(%rip),%rax
  mov    %rax,%rsi
  lea    D83(%rip),%rax
  mov    %rax,%rdi
  call   <strptime@plt>
  test   %rax,%rax
  je     L189
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdx
  lea    D170(%rip),%rax
  mov    %rax,%rsi
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  call   <strptime@plt>
  test   %rax,%rax
  je     L189
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdx
  lea    D30(%rip),%rax
  mov    %rax,%rsi
  lea    D93(%rip),%rax
  mov    %rax,%rdi
  call   <strptime@plt>
  test   %rax,%rax
  je     L189
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdx
  lea    D28(%rip),%rax
  mov    %rax,%rsi
  lea    D183(%rip),%rax
  mov    %rax,%rdi
  call   <strptime@plt>
  test   %rax,%rax
  je     L189
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdx
  lea    D128(%rip),%rax
  mov    %rax,%rsi
  lea    D137(%rip),%rax
  mov    %rax,%rdi
  call   <strptime@plt>
  test   %rax,%rax
  je     L189
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdx
  lea    D90(%rip),%rax
  mov    %rax,%rsi
  lea    D33(%rip),%rax
  mov    %rax,%rdi
  call   <strptime@plt>
  test   %rax,%rax
  jne    L207
L189:
  lea    D37(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x1,-0x34(%rbp)
L207:
  mov    -0x30(%rbp),%eax
  cmp    $0x15,%eax
  jne    L130
  mov    -0x2c(%rbp),%eax
  cmp    $0xd,%eax
  jne    L130
  mov    -0x28(%rbp),%eax
  cmp    $0x10,%eax
  jne    L130
  mov    -0x24(%rbp),%eax
  cmp    $0xc,%eax
  jne    L130
  mov    -0x20(%rbp),%eax
  cmp    $0x1,%eax
  jne    L130
  mov    -0x1c(%rbp),%eax
  cmp    $0x6b,%eax
  jne    L130
  mov    -0x18(%rbp),%eax
  cmp    $0x1,%eax
  jne    L130
  mov    -0x14(%rbp),%eax
  cmp    $0x2a,%eax
  je     L29
L130:
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x1,-0x34(%rbp)
L29:
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdx
  lea    D170(%rip),%rax
  mov    %rax,%rsi
  lea    D23(%rip),%rax
  mov    %rax,%rdi
  call   <strptime@plt>
  test   %rax,%rax
  jne    L235
  lea    D48(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x1,-0x34(%rbp)
L235:
  mov    -0x30(%rbp),%eax
  cmp    $0x15,%eax
  jne    L246
  mov    -0x2c(%rbp),%eax
  cmp    $0xd,%eax
  jne    L246
  mov    -0x28(%rbp),%eax
  cmp    $0x10,%eax
  jne    L246
  mov    -0x24(%rbp),%eax
  cmp    $0x8,%eax
  jne    L246
  mov    -0x20(%rbp),%eax
  cmp    $0x1,%eax
  jne    L246
  mov    -0x1c(%rbp),%eax
  cmp    $0x6b,%eax
  jne    L246
  mov    -0x18(%rbp),%eax
  cmp    $0x4,%eax
  jne    L246
  mov    -0x14(%rbp),%eax
  cmp    $0x26,%eax
  je     L106
L246:
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x1,-0x34(%rbp)
L106:
  cmpl   $0x0,-0x34(%rbp)
  jne    L210
  lea    D78(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L210:
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L79
  call   <__stack_chk_fail@plt>
L79:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D55
type: string
name: parse_data
arguments: tag: D83
type: string
name: parse_data
arguments: tag: D170
type: string
name: parse_data
arguments: tag: D5
type: string
name: parse_data
arguments: tag: D30
type: string
name: parse_data
arguments: tag: D93
type: string
name: parse_data
arguments: tag: D28
type: string
name: parse_data
arguments: tag: D183
type: string
name: parse_data
arguments: tag: D128
type: string
name: parse_data
arguments: tag: D137
type: string
name: parse_data
arguments: tag: D90
type: string
name: parse_data
arguments: tag: D33
type: string
name: parse_data
arguments: tag: D37
type: string
name: parse_data
arguments: tag: D14
type: string
name: parse_data
arguments: tag: D23
type: string
name: parse_data
arguments: tag: D48
type: string
name: parse_data
arguments: tag: D78
type: string

tool: D55: %Y

tool: D83: 2007

tool: D170: %d

tool: D5: 12

tool: D30: %b

tool: D93: Feb

tool: D28: %M

tool: D183: 13

tool: D128: %S

tool: D137: 21

tool: D90: %H

tool: D33: 16

tool: D37: strptimes failed

tool: D14: unexpected tm content

tool: D23: 8

tool: D48: strptime failed

tool: D78: all OK

assistant: ```c
int main(void) {
  int result = 0;
  struct tm tm;
  memset(&tm, 0xaa, sizeof(tm));
  if (strptime("2007", "%Y", &tm) == NULL || strptime("12", "%d", &tm) == NULL || strptime("Feb", "%b", &tm) == NULL || strptime("13", "%M", &tm) == NULL || strptime("21", "%S", &tm) == NULL || strptime("16", "%H", &tm) == NULL) {
    puts("strptimes failed");
    result = 1;
  }
  if (tm.tm_sec != 21 || tm.tm_min != 13 || tm.tm_hour != 16 || tm.tm_mday != 12 || tm.tm_mon != 1 || tm.tm_year != 107 || tm.tm_wday != 1 || tm.tm_yday != 42) {
    puts("unexpected tm content");
    result = 1;
  }
  if (strptime("8", "%d", &tm) == NULL) {
    puts("strptime failed");
    result = 1;
  }
  if (tm.tm_sec != 21 || tm.tm_min != 13 || tm.tm_hour != 16 || tm.tm_mday != 8 || tm.tm_mon != 1 || tm.tm_year != 107 || tm.tm_wday != 4 || tm.tm_yday != 38) {
    puts("unexpected tm content");
    result = 1;
  }
  if (result == 0)
    puts("all OK");
  return 0;
}
```