char *find_pos(char *str, int words, int chars, int ignore_blanks) {
  int i;
  char *p = str;
  for (i = 0; i < words; i++) {
    char c;
    while ((c = *p) == ' ' || c == '\t')
      p++;
    while ((c = *p) && c != '\n' && !(c == ' ' || c == '\t'))
      p++;
    if (!*p || *p == '\n')
      return p;
  }
  while (*p == ' ' || *p == '\t')
    p++;
  for (i = 0; i < chars; i++) {
    if (!*p || *p == '\n')
      break;
    p++;
  }
  return p;
}


x86 assembly (clang, -O0):
<find_pos>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    122f <find_pos+0x12f>
jmp    1131 <find_pos+0x31>
mov    -0x28(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl %al,%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x2a(%rbp)
je     1158 <find_pos+0x58>
movsbl -0x29(%rbp),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x2a(%rbp)
mov    -0x2a(%rbp),%al
test   $0x1,%al
jne    1168 <find_pos+0x68>
jmp    1179 <find_pos+0x79>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1131 <find_pos+0x31>
jmp    117e <find_pos+0x7e>
mov    -0x28(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl %al,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2b(%rbp)
je     11d1 <find_pos+0xd1>
movsbl -0x29(%rbp),%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
mov    %al,-0x2b(%rbp)
je     11d1 <find_pos+0xd1>
movsbl -0x29(%rbp),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x2c(%rbp)
je     11c9 <find_pos+0xc9>
movsbl -0x29(%rbp),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x2c(%rbp)
mov    -0x2c(%rbp),%al
xor    $0xff,%al
mov    %al,-0x2b(%rbp)
mov    -0x2b(%rbp),%al
test   $0x1,%al
jne    11e1 <find_pos+0xe1>
jmp    11f2 <find_pos+0xf2>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    117e <find_pos+0x7e>
mov    -0x28(%rbp),%rax
cmpb   $0x0,(%rax)
je     120f <find_pos+0x10f>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
jne    121c <find_pos+0x11c>
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    12d1 <find_pos+0x1d1>
jmp    1221 <find_pos+0x121>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1120 <find_pos+0x20>
jmp    1234 <find_pos+0x134>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x2d(%rbp)
je     1259 <find_pos+0x159>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
test   $0x1,%al
jne    1269 <find_pos+0x169>
jmp    127a <find_pos+0x17a>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1234 <find_pos+0x134>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    12c9 <find_pos+0x1c9>
mov    -0x28(%rbp),%rax
cmpb   $0x0,(%rax)
je     12aa <find_pos+0x1aa>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
jne    12af <find_pos+0x1af>
jmp    12c9 <find_pos+0x1c9>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1281 <find_pos+0x181>
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<find_pos>:
mov    %rdi,%rax
test   %esi,%esi
jle    1174 <find_pos+0x74>
xor    %r8d,%r8d
lea    0xeef(%rip),%rdi
jmp    1124 <find_pos+0x24>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rax
mov    (%rax),%cl
cmp    $0x9,%cl
je     1120 <find_pos+0x20>
cmp    $0x20,%cl
je     1120 <find_pos+0x20>
jmp    1148 <find_pos+0x48>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl 0x1(%rax),%ecx
add    $0x1,%rax
cmp    $0x20,%cl
ja     1140 <find_pos+0x40>
movzbl %cl,%ecx
movslq (%rdi,%rcx,4),%rcx
add    %rdi,%rcx
jmp    *%rcx
add    $0x1,%r8d
cmp    %esi,%r8d
jne    1124 <find_pos+0x24>
jmp    1174 <find_pos+0x74>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rax
movzbl (%rax),%ecx
cmp    $0x9,%cl
je     1170 <find_pos+0x70>
cmp    $0x20,%cl
je     1170 <find_pos+0x70>
test   %edx,%edx
jle    11b9 <find_pos+0xb9>
add    $0xffffffff,%edx
lea    (%rdx,%rax,1),%rsi
add    $0x1,%rsi
xor    %edi,%edi
test   %cl,%cl
je     11b6 <find_pos+0xb6>
cs nopw 0x0(%rax,%rax,1)
cmp    $0xa,%cl
je     11b6 <find_pos+0xb6>
cmp    %edi,%edx
je     11ba <find_pos+0xba>
movzbl 0x1(%rax,%rdi,1),%ecx
add    $0x1,%rdi
test   %cl,%cl
jne    11a0 <find_pos+0xa0>
add    %rdi,%rax
ret
mov    %rsi,%rax
ret

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

LLVM IR (-O2):
define i8* @find_pos(i8* %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %1, 0
br i1 %5, label %6, label %23
6: ; preds = %4, %20
%7 = phi i8* [ %16, %20 ], [ %0, %4 ]
%8 = phi i32 [ %21, %20 ], [ 0, %4 ]
br label %9
9: ; preds = %6, %12
%10 = phi i8* [ %13, %12 ], [ %7, %6 ]
%11 = load i8, i8* %10
switch i8 %11, label %14 [
i8 32, label %12
i8 9, label %12
]
12: ; preds = %9, %9
%13 = getelementptr inbounds i8, i8* %10, i64 1
br label %9
14: ; preds = %9, %17
%15 = phi i8 [ %19, %17 ], [ %11, %9 ]
%16 = phi i8* [ %18, %17 ], [ %10, %9 ]
switch i8 %15, label %17 [
i8 0, label %47
i8 10, label %47
i8 9, label %20
i8 32, label %20
]
17: ; preds = %14
%18 = getelementptr inbounds i8, i8* %16, i64 1
%19 = load i8, i8* %18
br label %14
20: ; preds = %14, %14
%21 = add nuw nsw i32 %8, 1
%22 = icmp eq i32 %21, %1
br i1 %22, label %23, label %6
23: ; preds = %20, %4
%24 = phi i8* [ %0, %4 ], [ %16, %20 ]
br label %25
25: ; preds = %23, %35
%26 = phi i8* [ %36, %35 ], [ %24, %23 ]
%27 = load i8, i8* %26
switch i8 %27, label %28 [
i8 32, label %35
i8 9, label %35
]
28: ; preds = %25
%29 = icmp sgt i32 %2, 0
br i1 %29, label %30, label %47
30: ; preds = %28
%31 = add nsw i32 %2, -1
%32 = zext i32 %31 to i64
%33 = add nuw nsw i64 %32, 1
%34 = getelementptr i8, i8* %26, i64 %33
br label %37
35: ; preds = %25, %25
%36 = getelementptr inbounds i8, i8* %26, i64 1
br label %25
37: ; preds = %45, %30
%38 = phi i8 [ %46, %45 ], [ %27, %30 ]
%39 = phi i8* [ %42, %45 ], [ %26, %30 ]
%40 = phi i32 [ %43, %45 ], [ 0, %30 ]
switch i8 %38, label %41 [
i8 0, label %47
i8 10, label %47
]
41: ; preds = %37
%42 = getelementptr inbounds i8, i8* %39, i64 1
%43 = add nuw nsw i32 %40, 1
%44 = icmp eq i32 %43, %2
br i1 %44, label %47, label %45
45: ; preds = %41
%46 = load i8, i8* %42
br label %37
47: ; preds = %14, %14, %37, %37, %41, %28
%48 = phi i8* [ %26, %28 ], [ %39, %37 ], [ %39, %37 ], [ %34, %41 ], [ %16, %14 ], [ %16, %14 ]
ret i8* %48
}