user: Translate the below assembly code into C programming language:

```asm
<MDparseline>:
  endbr64
  movq   $0x0,(%rdx)
  mov    %rsi,%rax
  movq   $0x0,(%rcx)
  cmp    %rsi,%rdi
  jb     L276
  jmp    L377
  nopl   0x0(%rax)
L146:
  add    $0x1,%rdi
  cmp    %rdi,%rax
  je     L377
L276:
  movzbl (%rdi),%esi
  cmp    $0x20,%sil
  je     L146
  cmp    %rdi,%rax
  jbe    L377
  cmp    $0xa,%sil
  je     L233
  cmp    $0x23,%sil
  je     L114
  mov    %rdi,(%rdx)
  jmp    L219
  nopl   0x0(%rax)
L208:
  cmp    $0x3a,%dl
  je     L337
  lea    0x1(%rdi),%rdx
  cmp    %rdx,%rax
  je     L256
  mov    %rdx,%rdi
L219:
  movzbl (%rdi),%edx
  cmp    $0xa,%dl
  jne    L208
  cmp    $0x3a,%dl
  je     L337
L377:
  xor    %eax,%eax
  ret
  nopl   (%rax)
L114:
  mov    %rdi,%rdx
  add    $0x1,%rdi
  cmp    %rdi,%rax
  je     L377
  cmpb   $0xa,(%rdi)
  jne    L114
  lea    0x2(%rdx),%rax
  ret
  xchg   %ax,%ax
L337:
  add    $0x1,%rdi
  cmp    %rdi,%rax
  ja     L231
  jmp    L377
  nopl   0x0(%rax,%rax,1)
L313:
  add    $0x1,%rdi
  cmp    %rdi,%rax
  je     L377
L231:
  movzbl (%rdi),%edx
  cmp    $0x20,%dl
  je     L313
  cmp    %rdi,%rax
  ja     L326
  jmp    L377
  nopl   0x0(%rax,%rax,1)
L160:
  cmp    $0x23,%dl
  je     L13
  add    $0x1,%rdi
  cmp    %rdi,%rax
  je     L377
  movzbl (%rdi),%edx
L326:
  cmp    $0xa,%dl
  jne    L160
L13:
  cmp    %rdi,%rax
  jbe    L377
  cmp    $0xa,%dl
  je     L233
  cmpb   $0x3a,0x1(%rdi)
  jne    L377
  add    $0x2,%rdi
  cmp    %rdi,%rax
  ja     L196
  jmp    L377
  nopl   0x0(%rax)
L156:
  add    $0x1,%rdi
  cmp    %rdi,%rax
  je     L377
L196:
  movzbl (%rdi),%edx
  cmp    $0x20,%dl
  je     L156
  cmp    %rdi,%rax
  jbe    L377
  cmp    $0xa,%dl
  je     L233
  mov    %rdi,(%rcx)
  jmp    L197
L325:
  add    $0x1,%rdi
  cmp    %rdi,%rax
  je     L377
L197:
  cmpb   $0xa,(%rdi)
  jne    L325
  cmp    %rdi,%rax
  jbe    L377
L233:
  lea    0x1(%rdi),%rax
  ret
L256:
  movzbl 0x1(%rdi),%edx
  mov    %rax,%rdi
  cmp    $0x3a,%dl
  jne    L377
  jmp    L337
```

assistant: ```c
char *MDparseline(char *line, char *limit, char **targ, char **tool) {
  char *next;
  *targ = 0;
  *tool = 0;
  next = line;
  while (next < limit && *next == ' ') {
    next++;
  };
  if ((next >= limit)) {
    return 0;
  }
  if ((*next == '\n')) {
    return ++next;
  }
  if (*next == '#') {
    while (next < limit && *next != '\n') {
      next++;
    };
    if ((next >= limit)) {
      return 0;
    }
    if ((*next == '\n')) {
      return ++next;
    }
  }
  *targ = next;
  while (next < limit && *next != ':' && *next != '\n') {
    next++;
  };
  if (*next != ':')
    return 0;
  next++;
  while (next < limit && *next == ' ') {
    next++;
  };
  while (next < limit && *next != '#' && *next != '\n') {
    next++;
  };
  if ((next >= limit)) {
    return 0;
  }
  if ((*next == '\n')) {
    return ++next;
  }
  if (*++next != ':')
    return 0;
  next++;
  while (next < limit && *next == ' ') {
    next++;
  };
  if ((next >= limit)) {
    return 0;
  }
  if ((*next == '\n')) {
    return ++next;
  }
  *tool = next;
  while (next < limit && *next != '\n') {
    next++;
  };
  if ((next >= limit)) {
    return 0;
  }
  return ++next;
}
```