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

```asm
<find_emph_char>:
  endbr64
  mov    %rdi,%r9
  mov    %rsi,%r8
  mov    %edx,%r10d
  cmp    $0x1,%rsi
  jbe    L146
  mov    $0x1,%eax
  jmp    L265
L146:
  mov    $0x0,%ecx
  jmp    L378
L400:
  cmp    %rax,%r8
  jbe    L216
  cmp    %r10b,%dl
  je     L496
  test   %rax,%rax
  je     L170
  cmpb   $0x5c,-0x1(%r9,%rax,1)
  je     L404
L170:
  cmp    $0x60,%dl
  je     L103
  cmp    $0x5b,%dl
  je     L236
L364:
  cmp    %r8,%rax
  jae    L86
L265:
  lea    (%r9,%rax,1),%rcx
  movzbl (%rcx),%edx
  cmp    $0x60,%dl
  setne  %dil
  cmp    %r10b,%dl
  setne  %sil
  test   %sil,%dil
  je     L400
  cmp    $0x5b,%dl
  je     L400
  add    $0x1,%rax
  cmp    %rax,%r8
  ja     L265
  mov    $0x0,%ecx
L378:
  mov    %rcx,%rax
  ret
L404:
  add    $0x1,%rax
  jmp    L364
L103:
  mov    %r8,%rdi
  sub    %rax,%rdi
  mov    $0x0,%edx
  lea    0x1(%rax),%rsi
L371:
  lea    (%rsi,%rdx,1),%rax
  add    $0x1,%rdx
  cmp    %rdx,%rdi
  je     L124
  cmpb   $0x60,(%rcx,%rdx,1)
  je     L371
  cmp    %r8,%rax
  jae    L224
  test   %rdx,%rdx
  je     L197
  mov    $0x0,%ecx
  mov    $0x0,%esi
  jmp    L139
L423:
  add    $0x1,%rsi
  cmpb   $0x60,(%r9,%rax,1)
  je     L31
  mov    $0x0,%esi
L31:
  add    $0x1,%rax
  cmp    %rax,%r8
  jbe    L98
  cmp    %rdx,%rsi
  jae    L98
L139:
  test   %rcx,%rcx
  jne    L423
  cmp    %r10b,(%r9,%rax,1)
  cmove  %rax,%rcx
  jmp    L423
L98:
  cmp    %rax,%r8
  jbe    L378
L197:
  add    $0x1,%rax
  jmp    L364
L236:
  add    $0x1,%rax
  mov    $0x0,%ecx
  cmp    %rax,%r8
  ja     L110
L271:
  add    $0x1,%rax
  cmp    %rax,%r8
  ja     L508
  jmp    L378
L331:
  add    $0x1,%rax
  cmp    %rax,%r8
  jbe    L271
L110:
  movzbl (%r9,%rax,1),%edx
  cmp    $0x5d,%dl
  je     L271
  cmp    %r10b,%dl
  jne    L331
  test   %rcx,%rcx
  cmove  %rax,%rcx
  jmp    L331
L392:
  add    $0x1,%rax
  cmp    %rax,%r8
  jbe    L378
L508:
  movzbl (%r9,%rax,1),%edx
  lea    -0x9(%rdx),%esi
  cmp    $0x1,%sil
  jbe    L392
  cmp    $0x20,%dl
  je     L392
  cmp    %rax,%r8
  jbe    L378
  mov    %edx,%esi
  cmp    $0x5b,%dl
  je     L448
  cmp    $0x28,%dl
  je     L448
  test   %rcx,%rcx
  jne    L378
  jmp    L364
L448:
  add    $0x1,%rax
  cmp    %rax,%r8
  ja     L18
  jmp    L378
L345:
  add    $0x1,%rax
  cmp    %rax,%r8
  jbe    L378
L18:
  movzbl (%r9,%rax,1),%edx
  cmp    %sil,%dl
  je     L206
  cmp    %r10b,%dl
  jne    L345
  test   %rcx,%rcx
  cmove  %rax,%rcx
  jmp    L345
L206:
  cmp    %rax,%r8
  jbe    L378
  add    $0x1,%rax
  jmp    L364
L86:
  mov    $0x0,%ecx
  jmp    L378
L216:
  mov    $0x0,%ecx
  jmp    L378
L496:
  mov    %rax,%rcx
  jmp    L378
L124:
  mov    $0x0,%ecx
  jmp    L378
L224:
  mov    $0x0,%ecx
  jmp    L378
```

assistant: ```c
size_t find_emph_char(char *data, size_t size, char c) {
  size_t i = 1;
  while (i < size) {
    while (i < size && data[i] != c && data[i] != '`' && data[i] != '[')
      i += 1;
    if (i >= size)
      return 0;
    if (data[i] == c)
      return i;
    if (i && data[i - 1] == '\\') {
      i += 1;
      continue;
    }
    if (data[i] == '`') {
      size_t span_nb = 0, bt;
      size_t tmp_i = 0;
      while (i < size && data[i] == '`') {
        i += 1;
        span_nb += 1;
      }
      if (i >= size)
        return 0;
      bt = 0;
      while (i < size && bt < span_nb) {
        if (!tmp_i && data[i] == c)
          tmp_i = i;
        if (data[i] == '`')
          bt += 1;
        else
          bt = 0;
        i += 1;
      }
      if (i >= size)
        return tmp_i;
      i += 1;
    } else if (data[i] == '[') {
      size_t tmp_i = 0;
      char cc;
      i += 1;
      while (i < size && data[i] != ']') {
        if (!tmp_i && data[i] == c)
          tmp_i = i;
        i += 1;
      }
      i += 1;
      while (i < size && (data[i] == ' ' || data[i] == '\t' || data[i] == '\n'))
        i += 1;
      if (i >= size)
        return tmp_i;
      if (data[i] != '[' && data[i] != '(') {
        if (tmp_i)
          return tmp_i;
        else
          continue;
      }
      cc = data[i];
      i += 1;
      while (i < size && data[i] != cc) {
        if (!tmp_i && data[i] == c)
          tmp_i = i;
        i += 1;
      }
      if (i >= size)
        return tmp_i;
      i += 1;
    }
  }
  return 0;
}
```