char *readtoken(char *istr, char *obuf) {
  char *start = obuf;
  while (*istr == ' ' || *istr == '\t')
    istr++;
  for (; *istr && *istr != '\n'; istr++) {
    char c, nx;
    c = *(istr);
    nx = *(istr + 1);
    if (c == ';') {
      for (; *istr && *istr != '\n'; istr++)
        ;
      break;
    }
    *obuf = c;
    obuf++;
    if (nx == ';' || nx == '=' || c == '=') {
      istr++;
      break;
    }
  }
  *obuf = '\0';
  for (; obuf > start && (*(obuf - 1) == ' ' || *(obuf - 1) == '\t');)
    *--obuf = '\0';
  return istr;
}


x86 assembly (clang, -O0):
<readtoken>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x1b(%rbp)
je     1139 <readtoken+0x39>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%al
test   $0x1,%al
jne    1149 <readtoken+0x49>
jmp    115a <readtoken+0x5a>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1114 <readtoken+0x14>
jmp    115f <readtoken+0x5f>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1c(%rbp)
je     1184 <readtoken+0x84>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
setne  %al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%al
test   $0x1,%al
jne    1194 <readtoken+0x94>
jmp    126c <readtoken+0x16c>
mov    -0x8(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x19(%rbp)
mov    -0x8(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x1a(%rbp)
movsbl -0x19(%rbp),%eax
cmp    $0x3b,%eax
jne    1209 <readtoken+0x109>
jmp    11b9 <readtoken+0xb9>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1d(%rbp)
je     11de <readtoken+0xde>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
setne  %al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
test   $0x1,%al
jne    11ee <readtoken+0xee>
jmp    1204 <readtoken+0x104>
jmp    11f3 <readtoken+0xf3>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    11b9 <readtoken+0xb9>
jmp    126c <readtoken+0x16c>
mov    -0x19(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
movsbl -0x1a(%rbp),%eax
cmp    $0x3b,%eax
je     1245 <readtoken+0x145>
movsbl -0x1a(%rbp),%eax
cmp    $0x3d,%eax
je     1245 <readtoken+0x145>
movsbl -0x19(%rbp),%eax
cmp    $0x3d,%eax
jne    1256 <readtoken+0x156>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    126c <readtoken+0x16c>
jmp    125b <readtoken+0x15b>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    115f <readtoken+0x5f>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x18(%rbp),%rcx
mov    %al,-0x1e(%rbp)
jbe    12b3 <readtoken+0x1b3>
mov    -0x10(%rbp),%rax
movsbl -0x1(%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x1f(%rbp)
je     12ad <readtoken+0x1ad>
mov    -0x10(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x1f(%rbp)
mov    -0x1f(%rbp),%al
mov    %al,-0x1e(%rbp)
mov    -0x1e(%rbp),%al
test   $0x1,%al
jne    12c3 <readtoken+0x1c3>
jmp    12db <readtoken+0x1db>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x0,-0x1(%rax)
jmp    1273 <readtoken+0x173>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<readtoken>:
mov    %rdi,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rax
movzbl -0x1(%rax),%edx
cmp    $0x9,%dl
je     1110 <readtoken+0x10>
cmp    $0x20,%dl
je     1110 <readtoken+0x10>
mov    %rsi,%rcx
test   %dl,%dl
je     115f <readtoken+0x5f>
nopl   0x0(%rax)
cmp    $0xa,%dl
je     115f <readtoken+0x5f>
cmp    $0x3b,%dl
je     118c <readtoken+0x8c>
movzbl (%rax),%edi
mov    %dl,(%rcx)
cmp    $0x3d,%dl
je     1165 <readtoken+0x65>
cmp    $0x3b,%dil
je     1165 <readtoken+0x65>
cmp    $0x3d,%dil
je     1165 <readtoken+0x65>
add    $0x1,%rcx
movzbl (%rax),%edx
add    $0x1,%rax
test   %dl,%dl
jne    1130 <readtoken+0x30>
add    $0xffffffffffffffff,%rax
jmp    1169 <readtoken+0x69>
add    $0x1,%rcx
movb   $0x0,(%rcx)
jmp    1178 <readtoken+0x78>
xchg   %ax,%ax
movb   $0x0,-0x1(%rcx)
add    $0xffffffffffffffff,%rcx
cmp    %rsi,%rcx
jbe    118b <readtoken+0x8b>
movzbl -0x1(%rcx),%edx
cmp    $0x20,%dl
je     1170 <readtoken+0x70>
cmp    $0x9,%dl
je     1170 <readtoken+0x70>
ret
add    $0xffffffffffffffff,%rax
test   %dl,%dl
je     1169 <readtoken+0x69>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
cmp    $0xa,%dl
je     1169 <readtoken+0x69>
movzbl 0x1(%rax),%edx
add    $0x1,%rax
test   %dl,%dl
jne    11a0 <readtoken+0xa0>
jmp    1169 <readtoken+0x69>

LLVM IR (-O0):
define i8* @readtoken(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8
%7 = alloca i8
store i8* %0, i8** %3
store i8* %1, i8** %4
%8 = load i8*, i8** %4
store i8* %8, i8** %5
br label %9
9: ; preds = %21, %2
%10 = load i8*, i8** %3
%11 = load i8, i8* %10
%12 = sext i8 %11 to i32
%13 = icmp eq i32 %12, 32
br i1 %13, label %19, label %14
14: ; preds = %9
%15 = load i8*, i8** %3
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = icmp eq i32 %17, 9
br label %19
19: ; preds = %14, %9
%20 = phi i1 [ true, %9 ], [ %18, %14 ]
br i1 %20, label %21, label %24
21: ; preds = %19
%22 = load i8*, i8** %3
%23 = getelementptr inbounds i8, i8* %22, i32 1
store i8* %23, i8** %3
br label %9
24: ; preds = %19
br label %25
25: ; preds = %84, %24
%26 = load i8*, i8** %3
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp ne i32 %28, 0
br i1 %29, label %30, label %35
30: ; preds = %25
%31 = load i8*, i8** %3
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = icmp ne i32 %33, 10
br label %35
35: ; preds = %30, %25
%36 = phi i1 [ false, %25 ], [ %34, %30 ]
br i1 %36, label %37, label %87
37: ; preds = %35
%38 = load i8*, i8** %3
%39 = load i8, i8* %38
store i8 %39, i8* %6
%40 = load i8*, i8** %3
%41 = getelementptr inbounds i8, i8* %40, i64 1
%42 = load i8, i8* %41
store i8 %42, i8* %7
%43 = load i8, i8* %6
%44 = sext i8 %43 to i32
%45 = icmp eq i32 %44, 59
br i1 %45, label %46, label %64
46: ; preds = %37
br label %47
47: ; preds = %60, %46
%48 = load i8*, i8** %3
%49 = load i8, i8* %48
%50 = sext i8 %49 to i32
%51 = icmp ne i32 %50, 0
br i1 %51, label %52, label %57
52: ; preds = %47
%53 = load i8*, i8** %3
%54 = load i8, i8* %53
%55 = sext i8 %54 to i32
%56 = icmp ne i32 %55, 10
br label %57
57: ; preds = %52, %47
%58 = phi i1 [ false, %47 ], [ %56, %52 ]
br i1 %58, label %59, label %63
59: ; preds = %57
br label %60
60: ; preds = %59
%61 = load i8*, i8** %3
%62 = getelementptr inbounds i8, i8* %61, i32 1
store i8* %62, i8** %3
br label %47
63: ; preds = %57
br label %87
64: ; preds = %37
%65 = load i8, i8* %6
%66 = load i8*, i8** %4
store i8 %65, i8* %66
%67 = load i8*, i8** %4
%68 = getelementptr inbounds i8, i8* %67, i32 1
store i8* %68, i8** %4
%69 = load i8, i8* %7
%70 = sext i8 %69 to i32
%71 = icmp eq i32 %70, 59
br i1 %71, label %80, label %72
72: ; preds = %64
%73 = load i8, i8* %7
%74 = sext i8 %73 to i32
%75 = icmp eq i32 %74, 61
br i1 %75, label %80, label %76
76: ; preds = %72
%77 = load i8, i8* %6
%78 = sext i8 %77 to i32
%79 = icmp eq i32 %78, 61
br i1 %79, label %80, label %83
80: ; preds = %76, %72, %64
%81 = load i8*, i8** %3
%82 = getelementptr inbounds i8, i8* %81, i32 1
store i8* %82, i8** %3
br label %87
83: ; preds = %76
br label %84
84: ; preds = %83
%85 = load i8*, i8** %3
%86 = getelementptr inbounds i8, i8* %85, i32 1
store i8* %86, i8** %3
br label %25
87: ; preds = %80, %63, %35
%88 = load i8*, i8** %4
store i8 0, i8* %88
br label %89
89: ; preds = %109, %87
%90 = load i8*, i8** %4
%91 = load i8*, i8** %5
%92 = icmp ugt i8* %90, %91
br i1 %92, label %93, label %107
93: ; preds = %89
%94 = load i8*, i8** %4
%95 = getelementptr inbounds i8, i8* %94, i64 -1
%96 = load i8, i8* %95
%97 = sext i8 %96 to i32
%98 = icmp eq i32 %97, 32
br i1 %98, label %105, label %99
99: ; preds = %93
%100 = load i8*, i8** %4
%101 = getelementptr inbounds i8, i8* %100, i64 -1
%102 = load i8, i8* %101
%103 = sext i8 %102 to i32
%104 = icmp eq i32 %103, 9
br label %105
105: ; preds = %99, %93
%106 = phi i1 [ true, %93 ], [ %104, %99 ]
br label %107
107: ; preds = %105, %89
%108 = phi i1 [ false, %89 ], [ %106, %105 ]
br i1 %108, label %109, label %112
109: ; preds = %107
%110 = load i8*, i8** %4
%111 = getelementptr inbounds i8, i8* %110, i32 -1
store i8* %111, i8** %4
store i8 0, i8* %111
br label %89
112: ; preds = %107
%113 = load i8*, i8** %3
ret i8* %113
}

LLVM IR (-O2):
define i8* @readtoken(i8* %0, i8* %1) {
br label %3
3: ; preds = %6, %2
%4 = phi i8* [ %0, %2 ], [ %7, %6 ]
%5 = load i8, i8* %4
switch i8 %5, label %8 [
i8 32, label %6
i8 9, label %6
]
6: ; preds = %3, %3
%7 = getelementptr inbounds i8, i8* %4, i64 1
br label %3
8: ; preds = %3, %24
%9 = phi i8 [ %25, %24 ], [ %5, %3 ]
%10 = phi i8* [ %21, %24 ], [ %1, %3 ]
%11 = phi i8* [ %19, %24 ], [ %4, %3 ]
switch i8 %9, label %18 [
i8 0, label %26
i8 10, label %26
i8 59, label %12
]
12: ; preds = %8, %15
%13 = phi i8 [ %17, %15 ], [ %9, %8 ]
%14 = phi i8* [ %16, %15 ], [ %11, %8 ]
switch i8 %13, label %15 [
i8 0, label %26
i8 10, label %26
]
15: ; preds = %12
%16 = getelementptr inbounds i8, i8* %14, i64 1
%17 = load i8, i8* %16
br label %12
18: ; preds = %8
%19 = getelementptr inbounds i8, i8* %11, i64 1
%20 = load i8, i8* %19
store i8 %9, i8* %10
%21 = getelementptr inbounds i8, i8* %10, i64 1
%22 = icmp eq i8 %9, 61
br i1 %22, label %26, label %23
23: ; preds = %18
switch i8 %20, label %24 [
i8 61, label %26
i8 59, label %26
]
24: ; preds = %23
%25 = load i8, i8* %19
br label %8
26: ; preds = %8, %8, %18, %23, %23, %12, %12
%27 = phi i8* [ %10, %12 ], [ %10, %12 ], [ %10, %8 ], [ %10, %8 ], [ %21, %18 ], [ %21, %23 ], [ %21, %23 ]
%28 = phi i8* [ %14, %12 ], [ %14, %12 ], [ %11, %8 ], [ %11, %8 ], [ %19, %18 ], [ %19, %23 ], [ %19, %23 ]
store i8 0, i8* %27
%29 = icmp ugt i8* %27, %1
br i1 %29, label %30, label %36
30: ; preds = %26, %34
%31 = phi i8* [ %32, %34 ], [ %27, %26 ]
%32 = getelementptr inbounds i8, i8* %31, i64 -1
%33 = load i8, i8* %32
switch i8 %33, label %36 [
i8 32, label %34
i8 9, label %34
]
34: ; preds = %30, %30
store i8 0, i8* %32
%35 = icmp ugt i8* %32, %1
br i1 %35, label %30, label %36
36: ; preds = %34, %30, %26
ret i8* %28
}