#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ strncpy(char *, char *, size_t);
size_t sql_config2fmt_getfield(char *in, int pos, char *field,
                               size_t fieldsize) {
  char c;
  int i = 0;
  pos++;
  if (in[pos] == '%') {
    strncpy(field, "%", fieldsize - 1);
    return 1;
  }
  while ((c = in[pos]) != 0 && i < fieldsize - 1) {
    if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') ||
        ('0' <= c && c <= '9')) {
      field[i] = c;
      i++;
      pos++;
    } else {
      break;
    }
  }
  field[i] = 0;
  return i;
}


x86 assembly (clang, -O0):
<sql_config2fmt_getfield>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    1171 <sql_config2fmt_getfield+0x61>
mov    -0x20(%rbp),%rdi
mov    -0x28(%rbp),%rdx
sub    $0x1,%rdx
lea    0xea1(%rip),%rsi
call   1030 <strncpy@plt>
movq   $0x1,-0x8(%rbp)
jmp    1257 <sql_config2fmt_getfield+0x147>
jmp    1176 <sql_config2fmt_getfield+0x66>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x29(%rbp)
movsbl %al,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x31(%rbp)
je     11aa <sql_config2fmt_getfield+0x9a>
movslq -0x30(%rbp),%rax
mov    -0x28(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
setb   %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    11ba <sql_config2fmt_getfield+0xaa>
jmp    1243 <sql_config2fmt_getfield+0x133>
movsbl -0x29(%rbp),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     11d8 <sql_config2fmt_getfield+0xc8>
movsbl -0x29(%rbp),%eax
cmp    $0x7a,%eax
jle    1214 <sql_config2fmt_getfield+0x104>
movsbl -0x29(%rbp),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     11f6 <sql_config2fmt_getfield+0xe6>
movsbl -0x29(%rbp),%eax
cmp    $0x5a,%eax
jle    1214 <sql_config2fmt_getfield+0x104>
movsbl -0x29(%rbp),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     1239 <sql_config2fmt_getfield+0x129>
movsbl -0x29(%rbp),%eax
cmp    $0x39,%eax
jg     1239 <sql_config2fmt_getfield+0x129>
mov    -0x29(%rbp),%dl
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    123e <sql_config2fmt_getfield+0x12e>
jmp    1243 <sql_config2fmt_getfield+0x133>
jmp    1176 <sql_config2fmt_getfield+0x66>
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
movslq -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sql_config2fmt_getfield>:
push   %rax
movslq %esi,%r8
mov    0x1(%r8,%rdi,1),%r9b
add    $0xffffffffffffffff,%rcx
cmp    $0x25,%r9b
jne    113c <sql_config2fmt_getfield+0x2c>
lea    0xed6(%rip),%rsi
mov    %rdx,%rdi
mov    %rcx,%rdx
call   1030 <strncpy@plt>
mov    $0x1,%eax
pop    %rcx
ret
xor    %esi,%esi
test   %r9b,%r9b
je     118a <sql_config2fmt_getfield+0x7a>
test   %rcx,%rcx
je     118a <sql_config2fmt_getfield+0x7a>
add    %r8,%rdi
add    $0x2,%rdi
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r9d,%eax
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x1a,%al
jb     1173 <sql_config2fmt_getfield+0x63>
lea    -0x30(%r9),%eax
cmp    $0x9,%al
ja     118a <sql_config2fmt_getfield+0x7a>
mov    %r9b,(%rdx,%rsi,1)
movzbl (%rdi,%rsi,1),%r9d
add    $0x1,%rsi
test   %r9b,%r9b
je     118a <sql_config2fmt_getfield+0x7a>
cmp    %rsi,%rcx
ja     1160 <sql_config2fmt_getfield+0x50>
mov    %esi,%eax
movb   $0x0,(%rdx,%rax,1)
pop    %rcx
ret

LLVM IR (-O0):
@.str = [2 x i8] c"%\00"
define i64 @sql_config2fmt_getfield(i8* %0, i32 %1, i8* %2, i64 %3) {
%5 = alloca i64
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i64
%10 = alloca i8
%11 = alloca i32
store i8* %0, i8** %6
store i32 %1, i32* %7
store i8* %2, i8** %8
store i64 %3, i64* %9
store i32 0, i32* %11
%12 = load i32, i32* %7
%13 = add nsw i32 %12, 1
store i32 %13, i32* %7
%14 = load i8*, i8** %6
%15 = load i32, i32* %7
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds i8, i8* %14, i64 %16
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = icmp eq i32 %19, 37
br i1 %20, label %21, label %26
21: ; preds = %4
%22 = load i8*, i8** %8
%23 = load i64, i64* %9
%24 = sub i64 %23, 1
%25 = call i32 @strncpy(i8* %22, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i64 %24)
store i64 1, i64* %5
br label %86
26: ; preds = %4
br label %27
27: ; preds = %78, %26
%28 = load i8*, i8** %6
%29 = load i32, i32* %7
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i8, i8* %28, i64 %30
%32 = load i8, i8* %31
store i8 %32, i8* %10
%33 = sext i8 %32 to i32
%34 = icmp ne i32 %33, 0
br i1 %34, label %35, label %41
35: ; preds = %27
%36 = load i32, i32* %11
%37 = sext i32 %36 to i64
%38 = load i64, i64* %9
%39 = sub i64 %38, 1
%40 = icmp ult i64 %37, %39
br label %41
41: ; preds = %35, %27
%42 = phi i1 [ false, %27 ], [ %40, %35 ]
br i1 %42, label %43, label %79
43: ; preds = %41
%44 = load i8, i8* %10
%45 = sext i8 %44 to i32
%46 = icmp sle i32 97, %45
br i1 %46, label %47, label %51
47: ; preds = %43
%48 = load i8, i8* %10
%49 = sext i8 %48 to i32
%50 = icmp sle i32 %49, 122
br i1 %50, label %67, label %51
51: ; preds = %47, %43
%52 = load i8, i8* %10
%53 = sext i8 %52 to i32
%54 = icmp sle i32 65, %53
br i1 %54, label %55, label %59
55: ; preds = %51
%56 = load i8, i8* %10
%57 = sext i8 %56 to i32
%58 = icmp sle i32 %57, 90
br i1 %58, label %67, label %59
59: ; preds = %55, %51
%60 = load i8, i8* %10
%61 = sext i8 %60 to i32
%62 = icmp sle i32 48, %61
br i1 %62, label %63, label %77
63: ; preds = %59
%64 = load i8, i8* %10
%65 = sext i8 %64 to i32
%66 = icmp sle i32 %65, 57
br i1 %66, label %67, label %77
67: ; preds = %63, %55, %47
%68 = load i8, i8* %10
%69 = load i8*, i8** %8
%70 = load i32, i32* %11
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i8, i8* %69, i64 %71
store i8 %68, i8* %72
%73 = load i32, i32* %11
%74 = add nsw i32 %73, 1
store i32 %74, i32* %11
%75 = load i32, i32* %7
%76 = add nsw i32 %75, 1
store i32 %76, i32* %7
br label %78
77: ; preds = %63, %59
br label %79
78: ; preds = %67
br label %27
79: ; preds = %77, %41
%80 = load i8*, i8** %8
%81 = load i32, i32* %11
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i8, i8* %80, i64 %82
store i8 0, i8* %83
%84 = load i32, i32* %11
%85 = sext i32 %84 to i64
store i64 %85, i64* %5
br label %86
86: ; preds = %79, %21
%87 = load i64, i64* %5
ret i64 %87
}

LLVM IR (-O2):
@.str = [2 x i8] c"%\00"
define i64 @sql_config2fmt_getfield(i8* nocapture %0, i32 %1, i8* %2, i64 %3) {
%5 = add nsw i32 %1, 1
%6 = sext i32 %5 to i64
%7 = getelementptr inbounds i8, i8* %0, i64 %6
%8 = load i8, i8* %7
%9 = icmp eq i8 %8, 37
%10 = add i64 %3, -1
br i1 %9, label %18, label %11
11: ; preds = %4
%12 = icmp ne i8 %8, 0
%13 = icmp ne i64 %10, 0
%14 = and i1 %12, %13
br i1 %14, label %15, label %43
15: ; preds = %11
%16 = sext i32 %1 to i64
%17 = add nsw i64 %16, 1
br label %20
18: ; preds = %4
%19 = tail call i32 @strncpy(i8* %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i64 %10)
br label %47
20: ; preds = %15, %31
%21 = phi i64 [ %17, %15 ], [ %35, %31 ]
%22 = phi i64 [ 0, %15 ], [ %33, %31 ]
%23 = phi i8 [ %8, %15 ], [ %37, %31 ]
%24 = phi i32 [ 0, %15 ], [ %34, %31 ]
%25 = and i8 %23, -33
%26 = add i8 %25, -65
%27 = icmp ult i8 %26, 26
%28 = add i8 %23, -48
%29 = icmp ult i8 %28, 10
%30 = select i1 %27, i1 true, i1 %29
br i1 %30, label %31, label %41
31: ; preds = %20
%32 = getelementptr inbounds i8, i8* %2, i64 %22
store i8 %23, i8* %32
%33 = add nuw i64 %22, 1
%34 = add nuw nsw i32 %24, 1
%35 = add i64 %21, 1
%36 = getelementptr inbounds i8, i8* %0, i64 %35
%37 = load i8, i8* %36
%38 = icmp ne i8 %37, 0
%39 = icmp ugt i64 %10, %33
%40 = select i1 %38, i1 %39, i1 false
br i1 %40, label %20, label %43
41: ; preds = %20
%42 = trunc i64 %22 to i32
br label %43
43: ; preds = %31, %41, %11
%44 = phi i32 [ 0, %11 ], [ %42, %41 ], [ %34, %31 ]
%45 = zext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %2, i64 %45
store i8 0, i8* %46
br label %47
47: ; preds = %43, %18
%48 = phi i64 [ 1, %18 ], [ %45, %43 ]
ret i64 %48
}