user: Demonstrate the C code that generates the assembly output below:

```asm
<parse_line>:
  endbr64
  push   %r15
  mov    %rdi,%r15
  push   %r14
  push   %r13
  mov    %rdx,%r13
  xor    %edx,%edx
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  push   %rbx
  sub    $0x3f8,%rsp
  movdqa D28(%rip),%xmm0
  mov    %rcx,0x18(%rsp)
  mov    $0x664,%ecx
  mov    %r8,0x10(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x3e8(%rsp)
  xor    %eax,%eax
  movaps %xmm0,0x270(%rsp)
  movdqa D36(%rip),%xmm0
  movabs $0x7200026400000000,%rax
  movl   $0x0,0x280(%rsp)
  movups %xmm0,0x288(%rsp)
  movdqa D40(%rip),%xmm0
  movl   $0x0,0x284(%rsp)
  movaps %xmm0,0x2a0(%rsp)
  movdqa D71(%rip),%xmm0
  movl   $0x0,0x298(%rsp)
  movups %xmm0,0x2b8(%rsp)
  movdqa D190(%rip),%xmm0
  movl   $0x20,0x29c(%rsp)
  movaps %xmm0,0x2d0(%rsp)
  movdqa D33(%rip),%xmm0
  movl   $0x0,0x2b0(%rsp)
  movl   $0x40,0x2b4(%rsp)
  movl   $0x0,0x2c8(%rsp)
  movl   $0x60,0x2cc(%rsp)
  movl   $0x0,0x2e0(%rsp)
  movl   $0x80,0x2e4(%rsp)
  movups %xmm0,0x2e8(%rsp)
  movdqa D92(%rip),%xmm1
  movdqa D247(%rip),%xmm0
  movdqa D99(%rip),%xmm2
  mov    %rax,0x160(%rsp)
  movabs $0x6100026400000000,%rax
  movaps %xmm1,0x150(%rsp)
  movaps %xmm1,0x200(%rsp)
  movdqa D223(%rip),%xmm1
  movaps %xmm0,0x300(%rsp)
  movdqa D230(%rip),%xmm0
  movaps %xmm1,0x220(%rsp)
  movdqa D26(%rip),%xmm1
  movups %xmm0,0x318(%rsp)
  movdqa D12(%rip),%xmm0
  movaps %xmm1,0x230(%rsp)
  movdqa D152(%rip),%xmm1
  mov    %rdx,0x168(%rsp)
  xor    %edx,%edx
  movaps %xmm1,0x240(%rsp)
  movdqa D213(%rip),%xmm1
  mov    %rax,0x210(%rsp)
  mov    %rdx,0x218(%rsp)
  mov    $0x264,%edx
  movaps %xmm0,0x140(%rsp)
  movaps %xmm2,0x170(%rsp)
  movaps %xmm0,0x1f0(%rsp)
  movaps %xmm1,0x250(%rsp)
  movl   $0x0,0x2f8(%rsp)
  movl   $0xa0,0x2fc(%rsp)
  movl   $0x0,0x310(%rsp)
  movl   $0xc0,0x314(%rsp)
  movl   $0x0,0x328(%rsp)
  movl   $0xe0,0x32c(%rsp)
  movb   $0x0,0x180(%rsp)
  movl   $0x6640000,0x260(%rsp)
  movb   $0x0,0x264(%rsp)
  movdqa D127(%rip),%xmm1
  movaps %xmm0,0x80(%rsp)
  movdqa D188(%rip),%xmm0
  movdqa D103(%rip),%xmm2
  movaps %xmm1,0x90(%rsp)
  movaps %xmm0,0xa0(%rsp)
  movaps %xmm0,0xe0(%rsp)
  movaps %xmm0,0x120(%rsp)
  movdqa D130(%rip),%xmm0
  movaps %xmm2,0xc0(%rsp)
  movdqa D48(%rip),%xmm2
  movaps %xmm0,0x60(%rsp)
  movaps %xmm0,0x1a0(%rsp)
  movdqa D149(%rip),%xmm0
  movaps %xmm1,0xd0(%rsp)
  movaps %xmm0,0x1b0(%rsp)
  movdqa D55(%rip),%xmm0
  movaps %xmm1,0x110(%rsp)
  movdqa D23(%rip),%xmm1
  movaps %xmm0,0x1c0(%rsp)
  movdqa D94(%rip),%xmm0
  mov    %dx,0x74(%rsp)
  movaps %xmm2,0x100(%rsp)
  movaps %xmm1,0x50(%rsp)
  movaps %xmm1,0x190(%rsp)
  movaps %xmm0,0x1d0(%rsp)
  movl   $0x7300,0xb0(%rsp)
  movl   $0x7300,0xf0(%rsp)
  movl   $0x7300,0x130(%rsp)
  movl   $0x0,0x70(%rsp)
  movb   $0x0,0x76(%rsp)
  movq   $0x74,0x1e0(%rsp)
  mov    %cx,0x1e8(%rsp)
  movb   $0x0,0x1ea(%rsp)
  call   <strlen@plt>
  mov    %eax,0x30(%rsp)
  mov    %rax,%rbx
  cltq
  cmpb   $0x29,-0x1(%r15,%rax,1)
  jne    L148
  xor    %eax,%eax
  nopl   (%rax)
L322:
  movzbl (%r15,%rax,1),%edx
  movslq %eax,%rcx
  cmp    $0x28,%dl
  je     L418
  lea    -0x61(%rdx),%ecx
  cmp    $0x19,%cl
  ja     L241
  mov    %dl,0x340(%rsp,%rax,1)
  add    $0x1,%rax
  cmp    $0x10,%rax
  jne    L322
  mov    $0xfffffff8,%eax
L309:
  mov    0x3e8(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L314
  add    $0x3f8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L418:
  movb   $0x0,0x340(%rsp,%rcx,1)
  lea    0x1(%rcx),%r8d
  cmpl   $0x65687073,0x340(%rsp)
  je     L85
L290:
  cmpl   $0x6e616c70,0x340(%rsp)
  je     L492
L41:
  cmpl   $0x656d6163,0x340(%rsp)
  je     L639
L580:
  cmpl   $0x6867696c,0x340(%rsp)
  je     L65
L369:
  lea    0x340(%rsp),%rdi
  mov    $0x8,%edx
  mov    %r8d,0x8(%rsp)
  lea    D180(%rip),%rsi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L431
  movabs $0x7265646e696c7963,%rax
  mov    0x8(%rsp),%r8d
  cmp    %rax,0x340(%rsp)
  je     L567
L170:
  movabs $0x7265646e696c7963,%rax
  cmp    %rax,0x340(%rsp)
  je     L455
L26:
  movabs $0x7265646e696c7963,%rax
  cmp    %rax,0x340(%rsp)
  je     L219
L431:
  mov    $0xfffffff6,%eax
  jmp    L309
  nopl   0x0(%rax)
L241:
  mov    $0xfffffff9,%eax
  jmp    L309
  nopw   0x0(%rax,%rax,1)
L85:
  cmpw   $0x6572,0x344(%rsp)
  jne    L290
  cmpb   $0x0,0x346(%rsp)
  jne    L290
  lea    0x140(%rsp),%rdi
  mov    $0x3,%edx
  mov    $0x5,%eax
  mov    %rdi,0x20(%rsp)
  nopl   (%rax)
L4:
  mov    %edx,(%r12)
  cmp    %r8d,%ebx
  jle    L344
  movslq %eax,%rsi
  xor    %edx,%edx
  movl   $0x0,0x34(%rsp)
  movslq %r8d,%rbx
  lea    (%rsi,%rsi,2),%rax
  mov    %rsi,0x38(%rsp)
  mov    %edx,%r14d
  lea    0x390(%rsp),%r12
  lea    (%rsi,%rax,4),%rax
  add    0x20(%rsp),%rax
  mov    %r15,0x8(%rsp)
  mov    %rax,0x28(%rsp)
  jmp    L647
  xchg   %ax,%ax
L571:
  movslq %r14d,%rcx
  lea    0x1(%r14),%esi
  mov    %al,0x390(%rsp,%rcx,1)
  cmp    $0x4a,%r14d
  je     L77
  mov    %esi,%r14d
L342:
  add    $0x1,%rbx
  cmp    %ebx,0x30(%rsp)
  jle    L733
L647:
  mov    0x8(%rsp),%rax
  movzbl (%rax,%rbx,1),%eax
  cmp    $0x3b,%al
  je     L392
  cmp    $0x29,%al
  jne    L571
  mov    0x30(%rsp),%edi
  lea    -0x1(%rdi),%ecx
  cmp    %ebx,%ecx
  jne    L571
L392:
  movslq %r14d,%rdx
  movb   $0x0,0x390(%rsp,%rdx,1)
  movzbl 0x390(%rsp),%eax
  test   %al,%al
  je     L709
  cmp    $0x3d,%al
  je     L709
  xor    %r14d,%r14d
  xor    %r13d,%r13d
  jmp    L193
L72:
  cmp    $0xa,%r14
  je     L115
  cmp    $0x3d,%al
  je     L534
  mov    %al,0x336(%rsp,%r14,1)
L71:
  add    $0x1,%r14
L193:
  mov    %r12,%rdi
  call   <strlen@plt>
  cmp    %r14,%rax
  jbe    L462
  movzbl (%r12,%r14,1),%eax
  test   %r13d,%r13d
  je     L72
  movslq %ebp,%rdx
  lea    0x1(%rbp),%ecx
  mov    %al,0x350(%rsp,%rdx,1)
  cmp    $0x3f,%ebp
  je     L640
  mov    %ecx,%ebp
  jmp    L71
  nopl   0x0(%rax,%rax,1)
L492:
  cmpw   $0x65,0x344(%rsp)
  jne    L41
  lea    0x1f0(%rsp),%rdi
  mov    $0x4,%edx
  mov    $0x9,%eax
  mov    %rdi,0x20(%rsp)
  jmp    L4
L567:
  cmpw   $0x7978,0x348(%rsp)
  jne    L170
  cmpb   $0x0,0x34a(%rsp)
  jne    L170
  lea    0x80(%rsp),%rdi
  mov    $0x1,%eax
  mov    %rdi,0x20(%rsp)
L717:
  mov    %eax,0x0(%r13)
  mov    $0x5,%edx
  mov    $0x4,%eax
  jmp    L4
L455:
  cmpw   $0x7a78,0x348(%rsp)
  jne    L26
  cmpb   $0x0,0x34a(%rsp)
  jne    L26
  lea    0xc0(%rsp),%rdi
  mov    $0x2,%eax
  mov    %rdi,0x20(%rsp)
  jmp    L717
  nopl   0x0(%rax,%rax,1)
L534:
  movb   $0x0,0x336(%rsp,%r14,1)
  xor    %ebp,%ebp
  mov    $0x1,%r13d
  jmp    L71
  cs nopw 0x0(%rax,%rax,1)
L115:
  mov    $0xffffffe2,%eax
  jmp    L309
  nopw   0x0(%rax,%rax,1)
L462:
  movslq %ebp,%rax
  mov    0x20(%rsp),%r15
  mov    0x28(%rsp),%r14
  lea    0x336(%rsp),%r13
  movb   $0x0,0x350(%rsp,%rax,1)
  nopl   (%rax)
L608:
  mov    %r15,%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L597
  add    $0xd,%r15
  cmp    %r14,%r15
  jne    L608
  mov    $0xffffffe0,%eax
  jmp    L309
L597:
  cmpb   $0x0,0xc(%r15)
  mov    %eax,%r14d
  jne    L160
  cmpb   $0x64,0xa(%r15)
  je     L618
  lea    0x270(%rsp),%r8
  xor    %eax,%eax
  mov    %ebp,0x48(%rsp)
  lea    0x350(%rsp),%r13
  mov    %rbx,0x40(%rsp)
  mov    %eax,%ebp
  mov    %r8,%rbx
  nopl   0x0(%rax,%rax,1)
L121:
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L56
  lea    0xa(%rbx),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L56
  add    $0x1,%ebp
  add    $0x18,%rbx
  cmp    $0x8,%ebp
  jne    L121
  mov    0x34(%rsp),%eax
  mov    0x48(%rsp),%ebp
  mov    0x40(%rsp),%rbx
  test   %eax,%eax
  je     L554
L48:
  movzbl 0xb(%r15),%eax
  mov    0x10(%rsp),%rdi
  movl   $0x1,0x34(%rsp)
  movzbl 0x4f(%rsp),%esi
  mov    %sil,(%rdi,%rax,1)
L606:
  movb   $0x1,0xc(%r15)
  jmp    L342
L640:
  mov    $0xffffffe1,%eax
  jmp    L309
L618:
  lea    0x350(%rsp),%r13
  xor    %eax,%eax
  mov    %r13,%rdi
  call   <is_double@plt>
  test   %eax,%eax
  je     L594
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <atof@plt>
  pxor   %xmm0,%xmm0
  mov    0x18(%rsp),%rdi
  mov    %eax,%r8d
  movzbl 0xb(%r15),%eax
  cvtsi2sd %r8d,%xmm0
  movsd  %xmm0,(%rdi,%rax,8)
  jmp    L606
L639:
  cmpw   $0x6172,0x344(%rsp)
  jne    L580
  cmpb   $0x0,0x346(%rsp)
  jne    L580
  lea    0x190(%rsp),%rdi
  mov    $0x1,%edx
  mov    $0x7,%eax
  mov    %rdi,0x20(%rsp)
  jmp    L4
L344:
  mov    %rax,0x38(%rsp)
L733:
  mov    0x38(%rsp),%rdi
  mov    0x20(%rsp),%rdx
  lea    (%rdi,%rdi,2),%rax
  lea    (%rdi,%rax,4),%rax
  add    %rdx,%rax
  nopl   0x0(%rax)
L19:
  cmpb   $0x0,0xc(%rdx)
  je     L525
  add    $0xd,%rdx
  cmp    %rdx,%rax
  jne    L19
  xor    %eax,%eax
  jmp    L309
L65:
  cmpw   $0x74,0x344(%rsp)
  jne    L369
  lea    0x50(%rsp),%rdi
  mov    $0x2,%edx
  mov    $0x3,%eax
  mov    %rdi,0x20(%rsp)
  jmp    L4
L77:
  mov    $0xfffffffc,%eax
  jmp    L309
L56:
  movslq %ebp,%r13
  mov    0x40(%rsp),%rbx
  mov    0x48(%rsp),%ebp
  lea    0x0(%r13,%r13,2),%rax
  movzbl 0x284(%rsp,%rax,8),%eax
  mov    %al,0x4f(%rsp)
  jmp    L48
L148:
  mov    $0xfffffff3,%eax
  jmp    L309
L525:
  mov    $0xfffffff2,%eax
  jmp    L309
L709:
  mov    $0xffffffde,%eax
  jmp    L309
L219:
  cmpw   $0x7a79,0x348(%rsp)
  jne    L431
  cmpb   $0x0,0x34a(%rsp)
  jne    L431
  lea    0x100(%rsp),%rdi
  mov    $0x3,%eax
  mov    %rdi,0x20(%rsp)
  jmp    L717
L160:
  mov    $0xffffffdf,%eax
  jmp    L309
L314:
  call   <__stack_chk_fail@plt>
L554:
  mov    $0xffffffe8,%eax
  jmp    L309
L594:
  mov    $0xfffffff4,%eax
  jmp    L309
```

tool_calls: name: retrieve_data
arguments: data_tag: D28
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D36
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D40
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D71
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D190
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D33
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D92
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D247
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D99
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D223
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D230
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D26
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D12
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D152
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D213
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D127
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D188
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D103
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D130
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D48
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D149
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D55
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D23
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D94
type_guessed: byte[16]
name: retrieve_data
arguments: data_tag: D180
type_guessed: string

tool: {"D28": [0x77,0x68,0x69,0x74,0x65,0x00,0x00,0x00,0x00,0x00,0x63,0x31,0x00,0x00,0x00,0x00]}

tool: {"D36": [0x72,0x65,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x32,0x00,0x00,0x00,0x00]}

tool: {"D40": [0x67,0x72,0x65,0x65,0x6e,0x00,0x00,0x00,0x00,0x00,0x63,0x33,0x00,0x00,0x00,0x00]}

tool: {"D71": [0x62,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x34,0x00,0x00,0x00,0x00]}

tool: {"D190": [0x79,0x65,0x6c,0x6c,0x6f,0x77,0x00,0x00,0x00,0x00,0x63,0x35,0x00,0x00,0x00,0x00]}

tool: {"D33": [0x63,0x79,0x61,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x00,0x00,0x00,0x00]}

tool: {"D92": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x7a,0x30,0x00,0x00,0x00,0x00]}

tool: {"D247": [0x6d,0x61,0x67,0x65,0x6e,0x74,0x61,0x00,0x00,0x00,0x63,0x37,0x00,0x00,0x00,0x00]}

tool: {"D99": [0x00,0x64,0x03,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x00,0x00,0x00,0x00,0x73,0x00]}

tool: {"D223": [0x00,0x64,0x03,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x04]}

tool: {"D230": [0x62,0x6c,0x75,0x65,0x32,0x00,0x00,0x00,0x00,0x00,0x63,0x38,0x00,0x00,0x00,0x00]}

tool: {"D26": [0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x63,0x6f]}

tool: {"D12": [0x78,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x79,0x30,0x00]}

tool: {"D152": [0x6c,0x6f,0x72,0x31,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x63,0x6f,0x6c,0x6f,0x72]}

tool: {"D213": [0x32,0x00,0x00,0x00,0x00,0x73,0x01,0x00,0x74,0x65,0x78,0x73,0x63,0x61,0x6c,0x65]}

tool: {"D127": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x72,0x00,0x00,0x00,0x00,0x00]}

tool: {"D188": [0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x00,0x00,0x00]}

tool: {"D103": [0x78,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x7a,0x30,0x00]}

tool: {"D130": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x01,0x00,0x7a,0x00,0x00,0x00,0x00,0x00]}

tool: {"D48": [0x79,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x7a,0x30,0x00]}

tool: {"D149": [0x00,0x00,0x00,0x00,0x64,0x02,0x00,0x6c,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: {"D55": [0x00,0x64,0x03,0x00,0x6c,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x04]}

tool: {"D23": [0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x79,0x00,0x00]}

tool: {"D94": [0x00,0x6c,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x05,0x00,0x72,0x6f]}

tool: D180: cylinder

assistant: ```c
int parse_line(char *line, int *id, int *cyl_type, double *d_tab, unsigned char *b_tab) {
  typedef struct tS {
    char label[10];
    char data_type;
    unsigned char index;
    unsigned char ok;
  } S;
  typedef struct tCOL {
    char name[10], alt_name[10];
    int id;
  } COL;
  COL col_tab[8] = {{"white", "c1", 0}, {"red", "c2", 32}, {"green", "c3", 64}, {"blue", "c4", 96}, {"yellow", "c5", 128}, {"cyan", "c6", 160}, {"magenta", "c7", 192}, {"blue2", "c8", 224}};
  S s_sph[5] = {{"x0", 'd', 0, 0}, {"y0", 'd', 1, 0}, {"z0", 'd', 2, 0}, {"r", 'd', 3, 0}, {"color", 's', 0, 0}};
  S s_pln[9] = {{"x0", 'd', 0, 0}, {"y0", 'd', 1, 0}, {"z0", 'd', 2, 0}, {"a", 'd', 3, 0}, {"b", 'd', 4, 0}, {"c", 'd', 5, 0}, {"color1", 's', 0, 0}, {"color2", 's', 1, 0}, {"texscale", 'd', 6, 0}};
  S s_cxy[4] = {{"x0", 'd', 0, 0}, {"y0", 'd', 1, 0}, {"r", 'd', 2, 0}, {"color", 's', 0, 0}};
  S s_cxz[4] = {{"x0", 'd', 0, 0}, {"z0", 'd', 1, 0}, {"r", 'd', 2, 0}, {"color", 's', 0, 0}};
  S s_cyz[4] = {{"y0", 'd', 0, 0}, {"z0", 'd', 1, 0}, {"r", 'd', 2, 0}, {"color", 's', 0, 0}};
  S s_lig[3] = {{"x", 'd', 0, 0}, {"y", 'd', 1, 0}, {"z", 'd', 2, 0}};
  S s_cam[7] = {{"x", 'd', 0, 0}, {"y", 'd', 1, 0}, {"z", 'd', 2, 0}, {"lx", 'd', 3, 0}, {"ly", 'd', 4, 0}, {"lz", 'd', 5, 0}, {"rot", 'd', 6, 0}};
  int ln = strlen(line);
  int i, j, k;
  char name[16], c;
  S *s_tab;
  S *s;
  char str[10 + 64 + 1];
  int str_i = 0;
  char label[10];
  char val[64];
  int mode;
  int found_label;
  unsigned char col;
  int num_of_s;
  int ci, col_found = 0;
  if (line[ln - 1] != ')')
    return -13;
  for (i = 0;; i++) {
    if (i == 16)
      return -8;
    c = line[i];
    if (c == '(')
      break;
    if (c < 'a' || c > 'z')
      return -7;
    name[i] = c;
  }
  name[i++] = 0;
  if (strcmp(name, "sphere") == 0) {
    *id = 3;
    s_tab = s_sph;
    num_of_s = 5;
  } else if (strcmp(name, "plane") == 0) {
    *id = 4;
    s_tab = s_pln;
    num_of_s = 9;
  } else if (strcmp(name, "camera") == 0) {
    *id = 1;
    s_tab = s_cam;
    num_of_s = 7;
  } else if (strcmp(name, "light") == 0) {
    *id = 2;
    s_tab = s_lig;
    num_of_s = 3;
  } else if (strncmp(name, "cylinder", 8) == 0) {
    if (strcmp(name, "cylinderxy") == 0) {
      *cyl_type = 1;
      s_tab = s_cxy;
    } else if (strcmp(name, "cylinderxz") == 0) {
      *cyl_type = 2;
      s_tab = s_cxz;
    } else if (strcmp(name, "cylinderyz") == 0) {
      *cyl_type = 3;
      s_tab = s_cyz;
    } else
      return -10;
    *id = 5;
    num_of_s = 4;
  } else
    return -10;
  for (; i < ln; i++) {
    c = line[i];
    if (c == ';' || ((c == ')') && (i == (ln - 1)))) {
      str[str_i] = 0;
      str_i = 0;
      if (!strlen(str) || (str[0] == '='))
        return -34;
      mode = 0;
      for (j = 0; j < strlen(str); j++) {
        c = str[j];
        if (mode == 0) {
          if (j == 10)
            return -30;
          if (c == '=') {
            mode++;
            k = 0;
            label[j] = 0;
          } else
            label[j] = c;
        } else {
          val[k++] = c;
          if (k == 64)
            return -31;
        }
      }
      val[k] = 0;
      s = s_tab;
      found_label = 0;
      for (j = 0; j < num_of_s; j++, s++) {
        if (strcmp(label, s->label) == 0) {
          found_label = 1;
          break;
        }
      }
      if (!found_label)
        return -32;
      if (s->ok)
        return -33;
      if (s->data_type == 'd') {
        if (!is_double(val))
          return -12;
        d_tab[s->index] = atof(val);
      } else {
        for (ci = 0; ci < 8; ci++) {
          if (strcmp(val, col_tab[ci].name) == 0 || strcmp(val, col_tab[ci].alt_name) == 0) {
            col = col_tab[ci].id;
            col_found = 1;
            break;
          }
        }
        if (!col_found)
          return -24;
        b_tab[s->index] = col;
      }
      s->ok = 1;
    } else {
      str[str_i++] = c;
      if (str_i == (10 + 64 + 1))
        return -4;
    }
  }
  s = s_tab;
  for (i = 0; i < num_of_s; i++, s++) {
    if (!s->ok)
      return -14;
  }
  return 0;
}
```