char *getword(buf1, buf2, flag)
register char *buf1, *buf2;
register int flag;
{
  while (isspace(*buf1))
    buf1++;
  if (*buf1 != ',') {
    if (!*buf1) {
      *buf2 = 0;
      return (0);
    }
    while (*buf1 && !isspace(*buf1) && *buf1 != ',')
      if (flag < 0)
        if (isupper(*buf1))
          *buf2++ = tolower(*buf1++);
        else
          *buf2++ = *buf1++;
      else if (flag > 0)
        if (islower(*buf1))
          *buf2++ = toupper(*buf1++);
        else
          *buf2++ = *buf1++;
      else
        *buf2++ = *buf1++;
  } else
    *buf2++ = *buf1++;
  *buf2 = 0;
  while (isspace(*buf1))
    buf1++;
  return (*buf1 ? buf1 : 0);
}


x86 assembly (clang, -O0):
<getword>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
je     1189 <getword+0x39>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1163 <getword+0x13>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
je     132b <getword+0x1db>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    11ba <getword+0x6a>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    13aa <getword+0x25a>
jmp    11bf <getword+0x6f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1d(%rbp)
je     1200 <getword+0xb0>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1050 <isspace@plt>
mov    %eax,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1d(%rbp)
jne    1200 <getword+0xb0>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
setne  %al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
test   $0x1,%al
jne    1210 <getword+0xc0>
jmp    1326 <getword+0x1d6>
cmpl   $0x0,-0x1c(%rbp)
jge    1285 <getword+0x135>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isupper@plt>
cmp    $0x0,%eax
je     125e <getword+0x10e>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%edi
call   1060 <tolower@plt>
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    1280 <getword+0x130>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    1321 <getword+0x1d1>
cmpl   $0x0,-0x1c(%rbp)
jle    12fa <getword+0x1aa>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <islower@plt>
cmp    $0x0,%eax
je     12d3 <getword+0x183>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%edi
call   1040 <toupper@plt>
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    12f5 <getword+0x1a5>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    131c <getword+0x1cc>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    1321 <getword+0x1d1>
jmp    11bf <getword+0x6f>
jmp    134d <getword+0x1fd>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
je     137a <getword+0x22a>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1354 <getword+0x204>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1397 <getword+0x247>
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
jmp    13a2 <getword+0x252>
xor    %eax,%eax
mov    %rax,-0x28(%rbp)
jmp    13a2 <getword+0x252>
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<getword>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %edx,%r15d
mov    %rsi,%r14
mov    %rdi,%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl (%rbx),%ebp
movsbl %bpl,%edi
call   1050 <isspace@plt>
add    $0x1,%rbx
test   %eax,%eax
jne    1170 <getword+0x20>
test   %bpl,%bpl
je     11c0 <getword+0x70>
cmp    $0x2c,%bpl
jne    11d2 <getword+0x82>
movb   $0x2c,(%r14)
add    $0x1,%r14
movb   $0x0,(%r14)
add    $0xffffffffffffffff,%rbx
nop
movzbl 0x1(%rbx),%ebp
add    $0x1,%rbx
movsbl %bpl,%edi
call   1050 <isspace@plt>
test   %eax,%eax
jne    11a0 <getword+0x50>
xor    %eax,%eax
test   %bpl,%bpl
cmove  %rax,%rbx
jmp    11c6 <getword+0x76>
movb   $0x0,(%r14)
xor    %ebx,%ebx
mov    %rbx,%rax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
add    $0xffffffffffffffff,%rbx
jmp    11f6 <getword+0xa6>
nopl   0x0(%rax,%rax,1)
mov    %eax,%ebp
mov    %bpl,(%r14)
add    $0x1,%r14
movzbl 0x1(%rbx),%ebp
add    $0x1,%rbx
test   %bpl,%bpl
je     1197 <getword+0x47>
movsbl %bpl,%r12d
mov    %r12d,%edi
call   1050 <isspace@plt>
test   %eax,%eax
jne    1197 <getword+0x47>
cmp    $0x2c,%bpl
je     1197 <getword+0x47>
test   %r15d,%r15d
js     1230 <getword+0xe0>
je     11e2 <getword+0x92>
mov    %r12d,%edi
call   1030 <islower@plt>
test   %eax,%eax
je     11e2 <getword+0x92>
mov    %r12d,%edi
call   1040 <toupper@plt>
jmp    11e0 <getword+0x90>
nopl   0x0(%rax)
mov    %r12d,%edi
call   1070 <isupper@plt>
test   %eax,%eax
je     11e2 <getword+0x92>
mov    %r12d,%edi
call   1060 <tolower@plt>
jmp    11e0 <getword+0x90>

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

LLVM IR (-O2):
define i8* @getword(i8* %0, i8* nocapture writeonly %1, i32 %2) {
br label %4
4: ; preds = %4, %3
%5 = phi i8* [ %0, %3 ], [ %10, %4 ]
%6 = load i8, i8* %5
%7 = sext i8 %6 to i32
%8 = tail call i32 @isspace(i32 %7)
%9 = icmp eq i32 %8, 0
%10 = getelementptr inbounds i8, i8* %5, i64 1
br i1 %9, label %11, label %4
11: ; preds = %4
switch i8 %6, label %12 [
i8 44, label %45
i8 0, label %15
]
12: ; preds = %11
%13 = icmp slt i32 %2, 0
%14 = icmp eq i32 %2, 0
br label %16
15: ; preds = %11
store i8 0, i8* %1
br label %60
16: ; preds = %12, %39
%17 = phi i8* [ %1, %12 ], [ %41, %39 ]
%18 = phi i8* [ %5, %12 ], [ %42, %39 ]
%19 = phi i8 [ %6, %12 ], [ %43, %39 ]
%20 = sext i8 %19 to i32
%21 = tail call i32 @isspace(i32 %20)
%22 = icmp ne i32 %21, 0
%23 = icmp eq i8 %19, 44
%24 = select i1 %22, i1 true, i1 %23
br i1 %24, label %47, label %25
25: ; preds = %16
br i1 %13, label %26, label %32
26: ; preds = %25
%27 = tail call i32 @isupper(i32 %20)
%28 = icmp eq i32 %27, 0
br i1 %28, label %39, label %29
29: ; preds = %26
%30 = tail call i32 @tolower(i32 %20)
%31 = trunc i32 %30 to i8
br label %39
32: ; preds = %25
br i1 %14, label %39, label %33
33: ; preds = %32
%34 = tail call i32 @islower(i32 %20)
%35 = icmp eq i32 %34, 0
br i1 %35, label %39, label %36
36: ; preds = %33
%37 = tail call i32 @toupper(i32 %20)
%38 = trunc i32 %37 to i8
br label %39
39: ; preds = %32, %33, %26, %36, %29
%40 = phi i8 [ %38, %36 ], [ %31, %29 ], [ %19, %26 ], [ %19, %33 ], [ %19, %32 ]
store i8 %40, i8* %17
%41 = getelementptr inbounds i8, i8* %17, i64 1
%42 = getelementptr inbounds i8, i8* %18, i64 1
%43 = load i8, i8* %42
%44 = icmp eq i8 %43, 0
br i1 %44, label %47, label %16
45: ; preds = %11
%46 = getelementptr inbounds i8, i8* %1, i64 1
store i8 44, i8* %1
br label %47
47: ; preds = %39, %16, %45
%48 = phi i8* [ %10, %45 ], [ %42, %39 ], [ %18, %16 ]
%49 = phi i8* [ %46, %45 ], [ %41, %39 ], [ %17, %16 ]
store i8 0, i8* %49
br label %50
50: ; preds = %50, %47
%51 = phi i8* [ %48, %47 ], [ %56, %50 ]
%52 = load i8, i8* %51
%53 = sext i8 %52 to i32
%54 = tail call i32 @isspace(i32 %53)
%55 = icmp eq i32 %54, 0
%56 = getelementptr inbounds i8, i8* %51, i64 1
br i1 %55, label %57, label %50
57: ; preds = %50
%58 = icmp eq i8 %52, 0
%59 = select i1 %58, i8* null, i8* %51
br label %60
60: ; preds = %57, %15
%61 = phi i8* [ %59, %57 ], [ null, %15 ]
ret i8* %61
}