char *_find_potential_token(char *line, int column, int end, int *found_size) {
  char *p = line + column;
  *found_size = 0;
  while (!(*p == '_' || (*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z') ||
           (*p >= '0' && *p <= '9'))) {
    p++;
    column++;
    if (p - line >= end)
      return 0;
  }
  while ((*p == '_' || (*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z') ||
          (*p >= '0' && *p <= '9'))) {
    p++;
    *found_size = *found_size + 1;
    if (column + *found_size == end)
      break;
  }
  if (*found_size > 0)
    return line + column;
  else
    return 0;
}


x86 assembly (clang, -O0):
<_find_potential_token>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x5f,%ecx
mov    %al,-0x29(%rbp)
je     11b5 <_find_potential_token+0xb5>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x41,%eax
jl     1165 <_find_potential_token+0x65>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x5a,%ecx
mov    %al,-0x29(%rbp)
jle    11b5 <_find_potential_token+0xb5>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     118a <_find_potential_token+0x8a>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x7a,%ecx
mov    %al,-0x29(%rbp)
jle    11b5 <_find_potential_token+0xb5>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x2a(%rbp)
jl     11af <_find_potential_token+0xaf>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x2a(%rbp)
mov    -0x2a(%rbp),%al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
xor    $0xff,%al
test   $0x1,%al
jne    11c7 <_find_potential_token+0xc7>
jmp    1206 <_find_potential_token+0x106>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
movslq -0x18(%rbp),%rcx
cmp    %rcx,%rax
jl     1201 <_find_potential_token+0x101>
movq   $0x0,-0x8(%rbp)
jmp    1305 <_find_potential_token+0x205>
jmp    112b <_find_potential_token+0x2b>
jmp    120b <_find_potential_token+0x10b>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x5f,%ecx
mov    %al,-0x2b(%rbp)
je     1295 <_find_potential_token+0x195>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x41,%eax
jl     1245 <_find_potential_token+0x145>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x5a,%ecx
mov    %al,-0x2b(%rbp)
jle    1295 <_find_potential_token+0x195>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     126a <_find_potential_token+0x16a>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x7a,%ecx
mov    %al,-0x2b(%rbp)
jle    1295 <_find_potential_token+0x195>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x2c(%rbp)
jl     128f <_find_potential_token+0x18f>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x2c(%rbp)
mov    -0x2c(%rbp),%al
mov    %al,-0x2b(%rbp)
mov    -0x2b(%rbp),%al
test   $0x1,%al
jne    12a5 <_find_potential_token+0x1a5>
jmp    12dc <_find_potential_token+0x1dc>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x14(%rbp),%eax
mov    -0x20(%rbp),%rcx
add    (%rcx),%eax
cmp    -0x18(%rbp),%eax
jne    12d7 <_find_potential_token+0x1d7>
jmp    12dc <_find_potential_token+0x1dc>
jmp    120b <_find_potential_token+0x10b>
mov    -0x20(%rbp),%rax
cmpl   $0x0,(%rax)
jle    12fd <_find_potential_token+0x1fd>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    1305 <_find_potential_token+0x205>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_find_potential_token>:
movslq %esi,%r8
movl   $0x0,(%rcx)
movslq %edx,%r9
xor    %eax,%eax
xchg   %ax,%ax
movzbl (%rdi,%r8,1),%r11d
cmp    $0x5f,%r11b
je     1140 <_find_potential_token+0x40>
mov    %r11d,%r10d
and    $0xdf,%r10b
add    $0xbf,%r10b
cmp    $0x1a,%r10b
jb     1143 <_find_potential_token+0x43>
lea    -0x30(%r11),%esi
cmp    $0xa,%sil
jb     1143 <_find_potential_token+0x43>
add    $0x1,%r8
cmp    %r9,%r8
jl     1110 <_find_potential_token+0x10>
ret
mov    $0x5f,%r11b
add    $0xffffffff,%edx
xor    %esi,%esi
nopl   0x0(%rax,%rax,1)
mov    %r11d,%eax
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x1a,%al
jb     116b <_find_potential_token+0x6b>
cmp    $0x5f,%r11b
je     116b <_find_potential_token+0x6b>
add    $0xd0,%r11b
cmp    $0x9,%r11b
ja     118b <_find_potential_token+0x8b>
lea    0x1(%rsi),%eax
mov    %eax,(%rcx)
cmp    %edx,%r8d
je     1188 <_find_potential_token+0x88>
lea    (%rdi,%rsi,1),%rax
movzbl 0x1(%rax,%r8,1),%r11d
add    $0x1,%rsi
add    $0xffffffff,%edx
jmp    1150 <_find_potential_token+0x50>
add    $0x1,%esi
test   %esi,%esi
jle    1196 <_find_potential_token+0x96>
add    %r8,%rdi
mov    %rdi,%rax
ret
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i8* @_find_potential_token(i8* %0, i32 %1, i32 %2, i32* nocapture %3) {
%5 = sext i32 %1 to i64
%6 = getelementptr inbounds i8, i8* %0, i64 %5
store i32 0, i32* %3
%7 = ptrtoint i8* %0 to i64
%8 = sext i32 %2 to i64
br label %9
9: ; preds = %23, %4
%10 = phi i32 [ %1, %4 ], [ %25, %23 ]
%11 = phi i8* [ %6, %4 ], [ %24, %23 ]
%12 = load i8, i8* %11
%13 = icmp eq i8 %12, 95
br i1 %13, label %14, label %16
14: ; preds = %16, %9
%15 = phi i8 [ 95, %9 ], [ %12, %16 ]
br label %29
16: ; preds = %9
%17 = and i8 %12, -33
%18 = add i8 %17, -65
%19 = icmp ult i8 %18, 26
%20 = add i8 %12, -48
%21 = icmp ult i8 %20, 10
%22 = select i1 %19, i1 true, i1 %21
br i1 %22, label %14, label %23
23: ; preds = %16
%24 = getelementptr inbounds i8, i8* %11, i64 1
%25 = add nsw i32 %10, 1
%26 = ptrtoint i8* %24 to i64
%27 = sub i64 %26, %7
%28 = icmp slt i64 %27, %8
br i1 %28, label %9, label %54
29: ; preds = %14, %46
%30 = phi i32 [ %43, %46 ], [ 0, %14 ]
%31 = phi i8 [ %47, %46 ], [ %15, %14 ]
%32 = phi i8* [ %42, %46 ], [ %11, %14 ]
%33 = icmp eq i8 %31, 95
%34 = and i8 %31, -33
%35 = add i8 %34, -65
%36 = icmp ult i8 %35, 26
%37 = or i1 %36, %33
%38 = add i8 %31, -48
%39 = icmp ult i8 %38, 10
%40 = or i1 %37, %39
br i1 %40, label %41, label %48
41: ; preds = %29
%42 = getelementptr inbounds i8, i8* %32, i64 1
%43 = add nuw nsw i32 %30, 1
store i32 %43, i32* %3
%44 = add nsw i32 %43, %10
%45 = icmp eq i32 %44, %2
br i1 %45, label %48, label %46
46: ; preds = %41
%47 = load i8, i8* %42
br label %29
48: ; preds = %29, %41
%49 = phi i32 [ %43, %41 ], [ %30, %29 ]
%50 = icmp sgt i32 %49, 0
br i1 %50, label %51, label %54
51: ; preds = %48
%52 = sext i32 %10 to i64
%53 = getelementptr inbounds i8, i8* %0, i64 %52
br label %54
54: ; preds = %23, %48, %51
%55 = phi i8* [ %53, %51 ], [ null, %48 ], [ null, %23 ]
ret i8* %55
}