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

```asm
<GScr_StrTokByPixLen>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x818,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x808(%rsp)
  xor    %eax,%eax
  call   <Scr_GetNumParam@plt>
  cmp    $0x2,%eax
  jne    L118
L287:
  mov    $0x0,%edi
  call   <Scr_GetString@plt>
  mov    %rax,%rsi
  test   %rax,%rax
  je     L235
  mov    %rsp,%rdi
  mov    $0x800,%edx
  call   <Q_strncpyz@plt>
  mov    $0x1,%edi
  call   <Scr_GetFloat@plt>
  addsd  %xmm0,%xmm0
  cvttsd2si %xmm0,%r13d
  mov    $0x0,%eax
  call   <Scr_MakeArray@plt>
  movzbl (%rsp),%eax
  test   %al,%al
  je     L235
  movslq %r13d,%r14
  imul   $0x55555556,%r14,%r14
  shr    $0x20,%r14
  mov    %r13d,%edx
  sar    $0x1f,%edx
  sub    %edx,%r14d
  mov    $0x0,%esi
  mov    $0x0,%r8d
  mov    $0x0,%r12d
  mov    %rsp,%r15
  mov    %r15,%rbx
  mov    %r15,%rdi
  lea    D10(%rip),%rbp
  jmp    L318
L118:
  lea    D16(%rip),%rdi
  call   <Scr_Error@plt>
  jmp    L287
L55:
  cmp    $0x7a,%al
  jg     L246
  cmp    $0x71,%al
  jle    L199
  lea    -0x72(%rax),%ecx
  mov    $0x1,%edx
  shl    %cl,%rdx
  test   $0x152,%edx
  jne    L297
  test   $0x5,%dl
  jne    L61
  cmp    $0x77,%al
  je     L366
L199:
  add    $0xc,%esi
  jmp    L355
L246:
  cmp    $0x7c,%al
  je     L301
  jle    L354
  cmp    $0x7d,%al
  je     L171
  cmp    $0x7e,%al
  jne    L199
  add    $0xb,%esi
  jmp    L355
L354:
  cmp    $0x7b,%al
  jne    L199
L171:
  add    $0x8,%esi
  jmp    L355
  add    $0x2,%esi
  jmp    L355
  add    $0x4,%esi
  jmp    L355
L301:
  add    $0x5,%esi
  jmp    L355
L61:
  add    $0x6,%esi
  jmp    L355
  add    $0x7,%esi
  jmp    L355
L297:
  add    $0x9,%esi
  jmp    L355
  mov    %esi,%r8d
  mov    %rbx,%r15
  add    $0xa,%esi
L355:
  cmp    %r13d,%esi
  jl     L209
  cmp    $0x1f,%r12d
  jg     L237
  cmp    %r8d,%r14d
  jg     L134
  movb   $0x0,(%r15)
  call   <Scr_AddString@plt>
  mov    $0x0,%eax
  call   <Scr_AddArray@plt>
  lea    0x1(%r15),%rdi
L68:
  add    $0x1,%r12d
  mov    %rdi,%rbx
  mov    $0x0,%esi
  mov    $0x0,%r8d
  jmp    L292
  add    $0xc,%esi
  jmp    L355
L366:
  add    $0xd,%esi
  jmp    L355
  add    $0xe,%esi
  jmp    L355
  add    $0xf,%esi
  jmp    L199
L134:
  movb   $0x0,(%rbx)
  call   <Scr_AddString@plt>
  mov    $0x0,%eax
  call   <Scr_AddArray@plt>
  lea    0x1(%rbx),%rdi
  jmp    L68
L209:
  add    $0x1,%rbx
L292:
  movzbl (%rbx),%eax
  test   %al,%al
  je     L237
L318:
  cmp    $0x6e,%al
  jg     L55
  cmp    $0x1f,%al
  jle    L199
  sub    $0x20,%eax
  cmp    $0x4e,%al
  ja     L199
  movzbl %al,%eax
  movslq 0x0(%rbp,%rax,4),%rax
  add    %rbp,%rax
  notrack jmp *%rax
L237:
  cmpb   $0x0,(%rdi)
  jne    L330
L235:
  mov    0x808(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L335
  add    $0x818,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L330:
  call   <Scr_AddString@plt>
  mov    $0x0,%eax
  call   <Scr_AddArray@plt>
  jmp    L235
L335:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D16
type: string

tool: D16: Usage: StrTokByPixLen(<string>, <float>)

assistant: ```c
void GScr_StrTokByPixLen() {
  char buffer[2048];
  char *string = buffer;
  if (Scr_GetNumParam() != 2) {
    Scr_Error("Usage: StrTokByPixLen(<string>, <float>)");
  }
  char *src = Scr_GetString(0);
  if (!src)
    return;
  else
    Q_strncpyz(buffer, src, sizeof(buffer));
  char *countstring = string;
  char *lastWordSpace = string;
  int lineBreakIndex = 0;
  int lWSHalfPixelCounter = 0;
  int halfPixelCounter = 0;
  int maxHalfPixel = 2.0 * Scr_GetFloat(1);
  Scr_MakeArray();
  while (*countstring) {
    switch (*countstring) {
    case '\'':
      halfPixelCounter += 2;
      break;
    case 'i':
    case 'j':
    case 'l':
    case '.':
    case ',':
    case ':':
    case ';':
    case '_':
    case '%':
      halfPixelCounter += 4;
      break;
    case 'f':
    case 'I':
    case '-':
    case '|':
      halfPixelCounter += 5;
      break;
    case 't':
    case 'r':
    case '!':
    case '/':
    case '\\':
    case '"':
      halfPixelCounter += 6;
      break;
    case '(':
    case ')':
    case '[':
    case ']':
      halfPixelCounter += 7;
      break;
    case 'T':
    case '{':
    case '}':
    case '*':
      halfPixelCounter += 8;
      break;
    case 'a':
    case 'c':
    case 'g':
    case 'k':
    case 's':
    case 'v':
    case 'x':
    case 'z':
    case 'F':
    case 'J':
    case 'L':
    case 'Y':
    case 'Z':
      halfPixelCounter += 9;
      break;
    case ' ':
      lWSHalfPixelCounter = halfPixelCounter;
      lastWordSpace = countstring;
    case 'd':
    case 'h':
    case 'n':
    case 'A':
    case 'P':
    case 'S':
    case 'V':
    case 'X':
    case '?':
      halfPixelCounter += 10;
      break;
    case 'B':
    case 'D':
    case 'G':
    case 'K':
    case 'O':
    case 'Q':
    case 'R':
    case 'U':
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
    case '$':
    case '<':
    case '>':
    case '=':
    case '+':
    case '^':
    case '~':
      halfPixelCounter += 11;
      break;
    case 'H':
    case 'N':
    case '#':
      halfPixelCounter += 12;
      break;
    case 'w':
    case '&':
      halfPixelCounter += 13;
      break;
    case 'W':
    case 'M':
    case '@':
      halfPixelCounter += 14;
      break;
    case 'm':
      halfPixelCounter += 15;
    default:
      halfPixelCounter += 12;
    }
    if (halfPixelCounter >= maxHalfPixel) {
      if (lineBreakIndex >= 32) {
        break;
      }
      if (lWSHalfPixelCounter >= maxHalfPixel / 3) {
        *lastWordSpace = 0;
        Scr_AddString(string);
        Scr_AddArray();
        string = &lastWordSpace[1];
        countstring = &lastWordSpace[1];
        lWSHalfPixelCounter = 0;
        halfPixelCounter = 0;
      } else {
        *countstring = 0;
        Scr_AddString(string);
        Scr_AddArray();
        string = &countstring[1];
        countstring = &countstring[1];
        lWSHalfPixelCounter = 0;
        halfPixelCounter = 0;
      }
      lineBreakIndex++;
    } else {
      countstring++;
    }
  }
  if (*string) {
    Scr_AddString(string);
    Scr_AddArray();
  }
}
```