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

```asm
<is_predicate>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x240,%rsp
  mov    %edi,-0x234(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x234(%rbp),%eax
  mov    %al,-0x222(%rbp)
  cmpl   $0x7b,-0x234(%rbp)
  jne    L266
  mov    $0x7d,%eax
  jmp    L143
L266:
  mov    $0x29,%eax
L143:
  mov    %al,-0x221(%rbp)
  movl   $0x0,-0x220(%rbp)
  movl   $0x0,-0x218(%rbp)
  mov    -0x220(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x220(%rbp)
  mov    %eax,%edi
  call   <tl_peek@plt>
  mov    %al,-0x223(%rbp)
  jmp    L208
L337:
  movsbl -0x223(%rbp),%eax
  mov    %eax,%edi
  call   <islower@plt>
  test   %rax,%rax
  je     L317
  movzbl -0x223(%rbp),%eax
  mov    %al,-0x210(%rbp)
  movl   $0x1,-0x21c(%rbp)
  jmp    L77
L158:
  mov    -0x21c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x21c(%rbp)
  cltq
  movzbl -0x223(%rbp),%edx
  mov    %dl,-0x210(%rbp,%rax,1)
  addl   $0x1,-0x220(%rbp)
L77:
  cmpl   $0x1ff,-0x21c(%rbp)
  jg     L282
  mov    -0x220(%rbp),%eax
  mov    %eax,%edi
  call   <tl_peek@plt>
  mov    %al,-0x223(%rbp)
  movsbl -0x223(%rbp),%eax
  mov    %eax,%edi
  call   <isalnum@plt>
  test   %rax,%rax
  jne    L158
L282:
  movb   $0x0,-0x223(%rbp)
  cmpl   $0x1ff,-0x21c(%rbp)
  jle    L144
  mov    -0x21c(%rbp),%eax
  sub    $0x1,%eax
  cltq
  movb   $0x0,-0x210(%rbp,%rax,1)
  lea    -0x210(%rbp),%rax
  mov    %rax,%rsi
  lea    D3(%rip),%rax
  mov    %rax,%rdi
  call   <fatal@plt>
L144:
  mov    -0x21c(%rbp),%eax
  cltq
  movb   $0x0,-0x210(%rbp,%rax,1)
  lea    -0x210(%rbp),%rax
  lea    D30(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L60
  lea    -0x210(%rbp),%rax
  lea    D14(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L60
  lea    -0x210(%rbp),%rax
  lea    D21(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L60
  lea    -0x210(%rbp),%rax
  lea    D13(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L60
  lea    -0x210(%rbp),%rax
  lea    D45(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L142
L60:
  mov    $0x0,%eax
  jmp    L311
L317:
  mov    -0x220(%rbp),%eax
  mov    %eax,%edi
  call   <tl_peek@plt>
  mov    %eax,-0x214(%rbp)
  cmpb   $0x55,-0x223(%rbp)
  je     L346
  cmpb   $0x56,-0x223(%rbp)
  je     L346
  cmpb   $0x58,-0x223(%rbp)
  jne    L31
L346:
  movsbl -0x222(%rbp),%eax
  mov    %eax,%edi
  call   <isalnum_@plt>
  test   %eax,%eax
  jne    L31
  cmpl   $0xffffffff,-0x214(%rbp)
  je     L29
  mov    -0x214(%rbp),%eax
  mov    %eax,%edi
  call   <isalnum_@plt>
  test   %eax,%eax
  je     L29
L31:
  cmpb   $0x3c,-0x223(%rbp)
  jne    L327
  cmpl   $0x3e,-0x214(%rbp)
  je     L29
L327:
  cmpb   $0x3c,-0x223(%rbp)
  jne    L333
  cmpl   $0x2d,-0x214(%rbp)
  je     L29
L333:
  cmpb   $0x2d,-0x223(%rbp)
  jne    L2
  cmpl   $0x3e,-0x214(%rbp)
  je     L29
L2:
  cmpb   $0x5b,-0x223(%rbp)
  jne    L142
  cmpl   $0x5d,-0x214(%rbp)
  jne    L142
L29:
  mov    $0x0,%eax
  jmp    L311
L142:
  movsbl -0x223(%rbp),%eax
  cmp    %eax,-0x234(%rbp)
  jne    L179
  addl   $0x1,-0x218(%rbp)
L179:
  movzbl -0x223(%rbp),%eax
  cmp    -0x221(%rbp),%al
  jne    L63
  subl   $0x1,-0x218(%rbp)
L63:
  movzbl -0x223(%rbp),%eax
  mov    %al,-0x222(%rbp)
  mov    -0x220(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x220(%rbp)
  mov    %eax,%edi
  call   <tl_peek@plt>
  mov    %al,-0x223(%rbp)
L208:
  movzbl -0x223(%rbp),%eax
  cmp    -0x221(%rbp),%al
  jne    L204
  cmpl   $0x0,-0x218(%rbp)
  jle    L212
L204:
  cmpb   $0xff,-0x223(%rbp)
  je     L212
  cmpl   $0x7fe,-0x220(%rbp)
  jle    L337
L212:
  mov    $0x1,%eax
L311:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L114
  call   <__stack_chk_fail@plt>
L114:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D3
datatype: string
name: retrieve_data
arguments: data_label: D30
datatype: string
name: retrieve_data
arguments: data_label: D14
datatype: string
name: retrieve_data
arguments: data_label: D21
datatype: string
name: retrieve_data
arguments: data_label: D13
datatype: string
name: retrieve_data
arguments: data_label: D45
datatype: string

tool: D3: name '%s' in ltl formula too long

tool: D30: always

tool: D14: equivalent

tool: D21: eventually

tool: D13: until

tool: D45: next

assistant: ```c
int is_predicate(int z) {
  char c, c_prev = z;
  char want = (z == '{') ? '}' : ')';
  int i = 0, j, nesting = 0;
  char peek_buf[512];
  c = tl_peek(i++);
  while ((c != want || nesting > 0) && c != -1 && i < 2047) {
    if (islower((int)c)) {
      peek_buf[0] = c;
      j = 1;
      while (j < (int)sizeof(peek_buf) && isalnum((int)(c = tl_peek(i)))) {
        peek_buf[j++] = c;
        i++;
      }
      c = 0;
      if (j >= (int)sizeof(peek_buf)) {
        peek_buf[j - 1] = '\0';
        fatal("name '%s' in ltl formula too long", peek_buf);
      }
      peek_buf[j] = '\0';
      if (strcmp(peek_buf, "always") == 0 || strcmp(peek_buf, "equivalent") == 0 || strcmp(peek_buf, "eventually") == 0 || strcmp(peek_buf, "until") == 0 || strcmp(peek_buf, "next") == 0) {
        return 0;
      }
    } else {
      int c_nxt = tl_peek(i);
      if (((c == 'U' || c == 'V' || c == 'X') && !isalnum_(c_prev) && (c_nxt == -1 || !isalnum_(c_nxt))) || (c == '<' && c_nxt == '>') || (c == '<' && c_nxt == '-') || (c == '-' && c_nxt == '>') || (c == '[' && c_nxt == ']')) {
        return 0;
      }
    }
    if (c == z) {
      nesting++;
    }
    if (c == want) {
      nesting--;
    }
    c_prev = c;
    c = tl_peek(i++);
  }
  return 1;
}
```