user: What is the c source code of the assembly code below:

```asm
<validateExpression>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x20,%rsp
  mov    %rdi,%rbp
  mov    %rsi,%r12
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0x4(%rsp),%rcx
  lea    0x10(%rsp),%rdx
  lea    0x8(%rsp),%rsi
  call   <readNextName@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  jne    L260
  mov    0x4(%rsp),%eax
  cmp    $0xf33ff156,%eax
  setne  %dl
  cmp    $0x3e0818f7,%eax
  setne  %cl
  and    %ecx,%edx
  cmp    $0x122452e3,%eax
  setne  %cl
  test   %cl,%dl
  je     L266
  cmp    $0x1fdc6,%eax
  jne    L197
L266:
  lea    0x2(%rsp),%rcx
  lea    0x10(%rsp),%rdx
  lea    0x8(%rsp),%rsi
  mov    0x10(%rsp),%rdi
  call   <readNextValue@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L254
L260:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L51
  mov    %ebx,%eax
  add    $0x20,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L197:
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <validateIdentifier@plt>
  mov    %eax,%ebx
  jmp    L260
L254:
  movb   $0x0,(%r12)
  lea    0x4(%rsp),%rcx
  lea    0x10(%rsp),%rdx
  lea    0x8(%rsp),%rsi
  mov    0x8(%rsp),%rdi
  call   <readNextName@plt>
  test   %eax,%eax
  jne    L260
  lea    0x2(%rsp),%rbp
  jmp    L65
L14:
  lea    0x2(%rsp),%rcx
  lea    0x10(%rsp),%rdx
  lea    0x8(%rsp),%rsi
  mov    0x10(%rsp),%rdi
  call   <readNextValue@plt>
  mov    %eax,%ebx
  jmp    L260
L151:
  lea    0x3(%rsp),%rsi
  mov    0x8(%rsp),%rdi
  call   <validateExpression>
  test   %eax,%eax
  je     L191
  mov    %eax,%ebx
  jmp    L260
L220:
  cmpb   $0xa,(%r12)
  je     L222
  movb   $0xc,(%r12)
  cmp    $0xd,%al
  je     L100
  cmp    $0xa,%al
  jne    L10
  jmp    L100
L139:
  cmpb   $0x9,(%r12)
  je     L218
L100:
  movb   $0xc,(%r12)
L10:
  mov    0x4(%rsp),%eax
  cmp    $0x65bc408d,%eax
  je     L5
  cmp    $0x47bc1153,%eax
  jne    L58
L5:
  lea    0x4(%rsp),%rcx
  lea    0x10(%rsp),%rdx
  lea    0x8(%rsp),%rsi
  mov    0x10(%rsp),%rdi
  call   <readNextName@plt>
  test   %eax,%eax
  jne    L260
L65:
  movb   $0x0,0x3(%rsp)
  lea    0x10(%rsp),%rdx
  lea    0x8(%rsp),%rsi
  mov    %rbp,%rcx
  mov    0x10(%rsp),%rdi
  call   <readNextValue@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  jne    L14
  cmpb   $0x6,0x2(%rsp)
  je     L151
L191:
  movzbl 0x3(%rsp),%eax
  cmp    $0x9,%al
  je     L220
  cmp    $0xc,%al
  je     L220
  cmp    $0xa,%al
  je     L139
  cmp    $0xd,%al
  jne    L10
  jmp    L139
L222:
  mov    $0x66,%ebx
  jmp    L260
L218:
  mov    $0x66,%ebx
  jmp    L260
L58:
  mov    $0x69,%ebx
  jmp    L260
L51:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
unsigned int validateExpression(char *rule, unsigned char *expressionType) {
  char *first;
  char *last;
  unsigned char type;
  unsigned int hash;
  unsigned int result;
  result = readNextName(rule, &first, &last, &hash);
  if (result != 0) {
    return result;
  }
  if (hash != 4081054038 && hash != 1040718071 && hash != 304370403 && hash != 130502) {
    return validateIdentifier(rule, expressionType);
  } else {
    result = readNextValue(last, &first, &last, &type);
    if (result != 0) {
      return result;
    }
    *expressionType = 0;
    result = readNextName(first, &first, &last, &hash);
    while (result == 0) {
      unsigned char newExpressionType = 0;
      do {
        if (readNextValue(last, &first, &last, &type) != 0) {
          return readNextValue(last, &first, &last, &type);
        }
      } while (0);
      if (type == 0x06) {
        do {
          unsigned int result = validateExpression(first, &newExpressionType);
          if (result != 0) {
            return result;
          }
        } while (0);
      }
      if (newExpressionType == 0x09 || newExpressionType == 0x0C) {
        if (*expressionType == 0x0A) {
          return 102;
        }
        *expressionType = 0x0C;
      }
      if (newExpressionType == 0x0A || newExpressionType == 0x0D) {
        if (*expressionType == 0x09) {
          return 102;
        }
        *expressionType = 0x0C;
      }
      if (hash != 1706836109 && hash != 1203507539) {
        return 105;
      }
      result = readNextName(last, &first, &last, &hash);
    }
  }
  return 0;
}
```