user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<xfrm_lifetime_cfg_parse>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %rsi,%r13
  mov    %rdx,%r12
  mov    (%rsi),%r14d
  mov    (%rdx),%rbp
  lea    D124(%rip),%rsi
  mov    0x0(%rbp),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L55
  call   <NEXT_ARG@plt>
  lea    0x1c(%rbx),%rdi
  mov    $0x0,%edx
  mov    0x0(%rbp),%rsi
  call   <get_u64@plt>
  test   %eax,%eax
  jne    L180
L178:
  mov    %r14d,0x0(%r13)
  mov    %rbp,(%r12)
  mov    $0x0,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L180:
  mov    0x0(%rbp),%rsi
  lea    D151(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
L55:
  lea    D30(%rip),%rsi
  mov    0x0(%rbp),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L104
  call   <NEXT_ARG@plt>
  lea    0x18(%rbx),%rdi
  mov    $0x0,%edx
  mov    0x0(%rbp),%rsi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L178
  mov    0x0(%rbp),%rsi
  lea    D42(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
L104:
  lea    D65(%rip),%rsi
  mov    0x0(%rbp),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L158
  call   <NEXT_ARG@plt>
  lea    0x14(%rbx),%rdi
  mov    $0x0,%edx
  mov    0x0(%rbp),%rsi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L178
  mov    0x0(%rbp),%rsi
  lea    D137(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
L158:
  lea    D24(%rip),%rsi
  mov    0x0(%rbp),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L46
  call   <NEXT_ARG@plt>
  lea    0x10(%rbx),%rdi
  mov    $0x0,%edx
  mov    0x0(%rbp),%rsi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L178
  mov    0x0(%rbp),%rsi
  lea    D69(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
L46:
  lea    D129(%rip),%rsi
  mov    0x0(%rbp),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L35
  call   <NEXT_ARG@plt>
  lea    0xc(%rbx),%rdi
  mov    $0x0,%edx
  mov    0x0(%rbp),%rsi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L178
  mov    0x0(%rbp),%rsi
  lea    D9(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
L35:
  lea    D43(%rip),%rsi
  mov    0x0(%rbp),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L54
  call   <NEXT_ARG@plt>
  lea    0x8(%rbx),%rdi
  mov    $0x0,%edx
  mov    0x0(%rbp),%rsi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L178
  mov    0x0(%rbp),%rsi
  lea    D70(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
L54:
  lea    D147(%rip),%rsi
  mov    0x0(%rbp),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L18
  call   <NEXT_ARG@plt>
  lea    0x4(%rbx),%rdi
  mov    $0x0,%edx
  mov    0x0(%rbp),%rsi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L178
  mov    0x0(%rbp),%rsi
  lea    D54(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
L18:
  lea    D134(%rip),%rsi
  mov    0x0(%rbp),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L227
  call   <NEXT_ARG@plt>
  mov    $0x0,%edx
  mov    0x0(%rbp),%rsi
  mov    %rbx,%rdi
  call   <get_u64@plt>
  test   %eax,%eax
  je     L178
  mov    0x0(%rbp),%rsi
  lea    D59(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
L227:
  mov    0x0(%rbp),%rsi
  lea    D135(%rip),%rdi
  call   <invarg@plt>
  jmp    L178
```

tool_calls: name: read_data
arguments: tag: D124
type: string
name: read_data
arguments: tag: D151
type: string
name: read_data
arguments: tag: D30
type: string
name: read_data
arguments: tag: D42
type: string
name: read_data
arguments: tag: D65
type: string
name: read_data
arguments: tag: D137
type: string
name: read_data
arguments: tag: D24
type: string
name: read_data
arguments: tag: D69
type: string
name: read_data
arguments: tag: D129
type: string
name: read_data
arguments: tag: D9
type: string
name: read_data
arguments: tag: D43
type: string
name: read_data
arguments: tag: D70
type: string
name: read_data
arguments: tag: D147
type: string
name: read_data
arguments: tag: D54
type: string
name: read_data
arguments: tag: D134
type: string
name: read_data
arguments: tag: D59
type: string
name: read_data
arguments: tag: D135
type: string

tool: D124: time-soft

tool: D151: "time-soft" value is invalid

tool: D30: time-hard

tool: D42: "time-hard" value is invalid

tool: D65: time-use-soft

tool: D137: "time-use-soft" value is invalid

tool: D24: time-use-hard

tool: D69: "time-use-hard" value is invalid

tool: D129: byte-soft

tool: D9: "byte-soft" value is invalid

tool: D43: byte-hard

tool: D70: "byte-hard" value is invalid

tool: D147: packet-soft

tool: D54: "packet-soft" value is invalid

tool: D134: packet-hard

tool: D59: "packet-hard" value is invalid

tool: D135: "LIMIT" is invalid

assistant: ```c
int xfrm_lifetime_cfg_parse(struct xfrm_lifetime_cfg *lft, int *argcp, char ***argvp) {
  int argc = *argcp;
  char **argv = *argvp;
  int ret;
  if (strcmp(*argv, "time-soft") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->soft_add_expires_seconds, *argv, 0);
    if (ret)
      invarg("\"time-soft\" value is invalid", *argv);
  } else if (strcmp(*argv, "time-hard") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->hard_add_expires_seconds, *argv, 0);
    if (ret)
      invarg("\"time-hard\" value is invalid", *argv);
  } else if (strcmp(*argv, "time-use-soft") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->soft_use_expires_seconds, *argv, 0);
    if (ret)
      invarg("\"time-use-soft\" value is invalid", *argv);
  } else if (strcmp(*argv, "time-use-hard") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->hard_use_expires_seconds, *argv, 0);
    if (ret)
      invarg("\"time-use-hard\" value is invalid", *argv);
  } else if (strcmp(*argv, "byte-soft") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->soft_byte_limit, *argv, 0);
    if (ret)
      invarg("\"byte-soft\" value is invalid", *argv);
  } else if (strcmp(*argv, "byte-hard") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->hard_byte_limit, *argv, 0);
    if (ret)
      invarg("\"byte-hard\" value is invalid", *argv);
  } else if (strcmp(*argv, "packet-soft") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->soft_packet_limit, *argv, 0);
    if (ret)
      invarg("\"packet-soft\" value is invalid", *argv);
  } else if (strcmp(*argv, "packet-hard") == 0) {
    NEXT_ARG();
    ret = get_u64(&lft->hard_packet_limit, *argv, 0);
    if (ret)
      invarg("\"packet-hard\" value is invalid", *argv);
  } else
    invarg("\"LIMIT\" is invalid", *argv);
  *argcp = argc;
  *argvp = argv;
  return 0;
}
```