int WcPrintfFormatStrings(cp)
char *cp;
{
  int strings = 0;
  while (cp && *cp) {
    if (*cp != '%')
      ++cp;
    else if (*++cp == '%')
      ++cp;
    else {
      while (*cp == '+' || *cp == '-' || *cp == ' ' || *cp == '#')
        cp++;
      if (*cp == '*')
        return 0;
      while (*cp && '0' <= *cp && *cp <= '9')
        ++cp;
      if (*cp == '.') {
        ++cp;
        if (*cp == '*')
          return 0;
        while (*cp && '0' <= *cp && *cp <= '9')
          ++cp;
      }
      if (*cp == 'l')
        ++cp;
      if (*cp != 's')
        return 0;
      strings++;
    }
  }
  return strings;
}


x86 assembly (clang, -O0):
<WcPrintfFormatStrings>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0x15(%rbp)
je     112f <WcPrintfFormatStrings+0x2f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x15(%rbp)
mov    -0x15(%rbp),%al
test   $0x1,%al
jne    113f <WcPrintfFormatStrings+0x3f>
jmp    136e <WcPrintfFormatStrings+0x26e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x25,%eax
je     1160 <WcPrintfFormatStrings+0x60>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1369 <WcPrintfFormatStrings+0x269>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl 0x1(%rax),%eax
cmp    $0x25,%eax
jne    118d <WcPrintfFormatStrings+0x8d>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1364 <WcPrintfFormatStrings+0x264>
jmp    1192 <WcPrintfFormatStrings+0x92>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x2b,%ecx
mov    %al,-0x16(%rbp)
je     11e1 <WcPrintfFormatStrings+0xe1>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x2d,%ecx
mov    %al,-0x16(%rbp)
je     11e1 <WcPrintfFormatStrings+0xe1>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x16(%rbp)
je     11e1 <WcPrintfFormatStrings+0xe1>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x23,%eax
sete   %al
mov    %al,-0x16(%rbp)
mov    -0x16(%rbp),%al
test   $0x1,%al
jne    11f1 <WcPrintfFormatStrings+0xf1>
jmp    1202 <WcPrintfFormatStrings+0x102>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1192 <WcPrintfFormatStrings+0x92>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    121e <WcPrintfFormatStrings+0x11e>
movl   $0x0,-0x4(%rbp)
jmp    1374 <WcPrintfFormatStrings+0x274>
jmp    1223 <WcPrintfFormatStrings+0x123>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x17(%rbp)
je     1261 <WcPrintfFormatStrings+0x161>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edx
xor    %eax,%eax
mov    $0x30,%ecx
cmp    %edx,%ecx
mov    %al,-0x17(%rbp)
jg     1261 <WcPrintfFormatStrings+0x161>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x17(%rbp)
mov    -0x17(%rbp),%al
test   $0x1,%al
jne    1271 <WcPrintfFormatStrings+0x171>
jmp    1282 <WcPrintfFormatStrings+0x182>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1223 <WcPrintfFormatStrings+0x123>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1323 <WcPrintfFormatStrings+0x223>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    12ba <WcPrintfFormatStrings+0x1ba>
movl   $0x0,-0x4(%rbp)
jmp    1374 <WcPrintfFormatStrings+0x274>
jmp    12bf <WcPrintfFormatStrings+0x1bf>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x18(%rbp)
je     12fd <WcPrintfFormatStrings+0x1fd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edx
xor    %eax,%eax
mov    $0x30,%ecx
cmp    %edx,%ecx
mov    %al,-0x18(%rbp)
jg     12fd <WcPrintfFormatStrings+0x1fd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x18(%rbp)
mov    -0x18(%rbp),%al
test   $0x1,%al
jne    130d <WcPrintfFormatStrings+0x20d>
jmp    131e <WcPrintfFormatStrings+0x21e>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    12bf <WcPrintfFormatStrings+0x1bf>
jmp    1323 <WcPrintfFormatStrings+0x223>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x6c,%eax
jne    133f <WcPrintfFormatStrings+0x23f>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x73,%eax
je     135b <WcPrintfFormatStrings+0x25b>
movl   $0x0,-0x4(%rbp)
jmp    1374 <WcPrintfFormatStrings+0x274>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1369 <WcPrintfFormatStrings+0x269>
jmp    110f <WcPrintfFormatStrings+0xf>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<WcPrintfFormatStrings>:
xor    %eax,%eax
test   %rdi,%rdi
je     11e5 <WcPrintfFormatStrings+0xe5>
movabs $0x280900000000,%rcx
jmp    112c <WcPrintfFormatStrings+0x2c>
nopw   0x0(%rax,%rax,1)
mov    0x1(%rdi),%dl
add    $0x2,%rdi
cmp    $0x25,%dl
jne    1157 <WcPrintfFormatStrings+0x57>
mov    (%rdi),%dl
cmp    $0x25,%dl
je     1120 <WcPrintfFormatStrings+0x20>
test   %dl,%dl
je     11e5 <WcPrintfFormatStrings+0xe5>
add    $0x1,%rdi
jmp    112c <WcPrintfFormatStrings+0x2c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl (%rdi),%edx
add    $0x1,%rdi
cmp    $0x2d,%dl
ja     116b <WcPrintfFormatStrings+0x6b>
movzbl %dl,%esi
bt     %rsi,%rcx
jb     1150 <WcPrintfFormatStrings+0x50>
cmp    $0x2a,%rsi
je     11e3 <WcPrintfFormatStrings+0xe3>
lea    -0x30(%rdx),%esi
cmp    $0x9,%sil
ja     1190 <WcPrintfFormatStrings+0x90>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%rdi),%edx
lea    -0x30(%rdx),%esi
add    $0x1,%rdi
cmp    $0xa,%sil
jb     1180 <WcPrintfFormatStrings+0x80>
lea    -0x1(%rdi),%rsi
cmp    $0x2e,%dl
jne    11c6 <WcPrintfFormatStrings+0xc6>
mov    (%rdi),%dl
cmp    $0x2a,%dl
je     11e3 <WcPrintfFormatStrings+0xe3>
lea    -0x30(%rdx),%esi
cmp    $0x9,%sil
ja     11c3 <WcPrintfFormatStrings+0xc3>
mov    %rdi,%rsi
nopl   0x0(%rax)
movzbl 0x1(%rsi),%edx
add    $0x1,%rsi
lea    -0x30(%rdx),%edi
cmp    $0xa,%dil
jb     11b0 <WcPrintfFormatStrings+0xb0>
jmp    11c6 <WcPrintfFormatStrings+0xc6>
mov    %rdi,%rsi
xor    %edi,%edi
cmp    $0x6c,%dl
sete   %dil
cmpb   $0x73,(%rsi,%rdi,1)
jne    11e3 <WcPrintfFormatStrings+0xe3>
add    %rdi,%rsi
add    $0x1,%eax
mov    %rsi,%rdi
jmp    112c <WcPrintfFormatStrings+0x2c>
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @WcPrintfFormatStrings(i8* %0) {
%2 = icmp eq i8* %0, null
br i1 %2, label %64, label %3
3: ; preds = %1, %62
%4 = phi i32 [ %63, %62 ], [ 0, %1 ]
%5 = phi i8* [ %59, %62 ], [ %0, %1 ]
br label %6
6: ; preds = %19, %3
%7 = phi i8* [ %5, %3 ], [ %20, %19 ]
%8 = load i8, i8* %7
switch i8 %8, label %9 [
i8 0, label %64
i8 37, label %11
]
9: ; preds = %6
%10 = getelementptr inbounds i8, i8* %7, i64 1
br label %19
11: ; preds = %6
%12 = getelementptr inbounds i8, i8* %7, i64 1
%13 = load i8, i8* %12
%14 = icmp eq i8 %13, 37
br i1 %14, label %17, label %15
15: ; preds = %11
%16 = getelementptr inbounds i8, i8* %7, i64 1
br label %21
17: ; preds = %11
%18 = getelementptr inbounds i8, i8* %7, i64 2
br label %19
19: ; preds = %17, %9
%20 = phi i8* [ %10, %9 ], [ %18, %17 ]
br label %6
21: ; preds = %15, %28
%22 = phi i8 [ %30, %28 ], [ %13, %15 ]
%23 = phi i8* [ %29, %28 ], [ %16, %15 ]
switch i8 %22, label %24 [
i8 43, label %28
i8 45, label %28
i8 32, label %28
i8 35, label %28
i8 42, label %64
]
24: ; preds = %21
%25 = add i8 %22, -48
%26 = icmp ult i8 %25, 10
%27 = getelementptr inbounds i8, i8* %23, i64 1
br i1 %26, label %31, label %37
28: ; preds = %21, %21, %21, %21
%29 = getelementptr inbounds i8, i8* %23, i64 1
%30 = load i8, i8* %29
br label %21
31: ; preds = %24, %31
%32 = phi i8* [ %36, %31 ], [ %27, %24 ]
%33 = load i8, i8* %32
%34 = add i8 %33, -48
%35 = icmp ult i8 %34, 10
%36 = getelementptr inbounds i8, i8* %32, i64 1
br i1 %35, label %31, label %37
37: ; preds = %31, %24
%38 = phi i8 [ %22, %24 ], [ %33, %31 ]
%39 = phi i8* [ %23, %24 ], [ %32, %31 ]
%40 = phi i8* [ %27, %24 ], [ %36, %31 ]
%41 = icmp eq i8 %38, 46
br i1 %41, label %42, label %54
42: ; preds = %37
%43 = load i8, i8* %40
%44 = icmp eq i8 %43, 42
br i1 %44, label %64, label %45
45: ; preds = %42
%46 = add i8 %43, -48
%47 = icmp ult i8 %46, 10
br i1 %47, label %48, label %54
48: ; preds = %45, %48
%49 = phi i8* [ %50, %48 ], [ %40, %45 ]
%50 = getelementptr inbounds i8, i8* %49, i64 1
%51 = load i8, i8* %50
%52 = add i8 %51, -48
%53 = icmp ult i8 %52, 10
br i1 %53, label %48, label %54
54: ; preds = %48, %45, %37
%55 = phi i8 [ %38, %37 ], [ %43, %45 ], [ %51, %48 ]
%56 = phi i8* [ %39, %37 ], [ %40, %45 ], [ %50, %48 ]
%57 = icmp eq i8 %55, 108
%58 = zext i1 %57 to i64
%59 = getelementptr i8, i8* %56, i64 %58
%60 = load i8, i8* %59
%61 = icmp eq i8 %60, 115
br i1 %61, label %62, label %64
62: ; preds = %54
%63 = add nuw nsw i32 %4, 1
br label %3
64: ; preds = %6, %42, %54, %21, %1
%65 = phi i32 [ 0, %1 ], [ 0, %21 ], [ %4, %6 ], [ 0, %42 ], [ 0, %54 ]
ret i32 %65
}