void equation_count(char *arg, int *operator_count, int *number_count) {
  *operator_count = 0;
  *number_count = 0;
  int i = 0;
  while (arg[i] != '\0') {
    if ((arg[i] >= '0' && arg[i] <= '9') || arg[i] == '.') {
      *number_count += 1;
      while ((arg[i] >= '0' && arg[i] <= '9') || arg[i] == '.')
        i++;
    } else if (arg[i] == '+' || arg[i] == '-' || arg[i] == '*' ||
               arg[i] == '/' || arg[i] == 'd' || arg[i] == 'c' ||
               arg[i] == '(' || arg[i] == ')' || arg[i] == '!' ||
               arg[i] == '^') {
      *operator_count += 1;
      i++;
    } else {
      i++;
    }
  }
}


x86 assembly (clang, -O0):
<equation_count>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x0,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     12ef <equation_count+0x1ef>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     116a <equation_count+0x6a>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    117f <equation_count+0x7f>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    11f1 <equation_count+0xf1>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11b9 <equation_count+0xb9>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x39,%ecx
mov    %al,-0x1d(%rbp)
jle    11ce <equation_count+0xce>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
sete   %al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
test   $0x1,%al
jne    11de <equation_count+0xde>
jmp    11ec <equation_count+0xec>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    118a <equation_count+0x8a>
jmp    12ea <equation_count+0x1ea>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2b,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x64,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x63,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x28,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x29,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x21,%eax
je     12c3 <equation_count+0x1c3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5e,%eax
jne    12dc <equation_count+0x1dc>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    12e5 <equation_count+0x1e5>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    12ea <equation_count+0x1ea>
jmp    112b <equation_count+0x2b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<equation_count>:
movl   $0x0,(%rsi)
movl   $0x0,(%rdx)
mov    (%rdi),%cl
test   %cl,%cl
je     1184 <equation_count+0x84>
xor    %r9d,%r9d
lea    0xee4(%rip),%r8
jmp    1131 <equation_count+0x31>
xchg   %ax,%ax
addl   $0x1,(%rsi)
add    $0x1,%r9d
movslq %r9d,%rax
mov    (%rdi,%rax,1),%cl
test   %cl,%cl
je     1184 <equation_count+0x84>
lea    -0x30(%rcx),%eax
cmp    $0xa,%al
jae    1170 <equation_count+0x70>
addl   $0x1,(%rdx)
movslq %r9d,%rcx
add    $0xffffffff,%r9d
add    %rdi,%rcx
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rcx),%eax
lea    -0x30(%rax),%r10d
add    $0x1,%r9d
add    $0x1,%rcx
cmp    $0x2e,%al
je     1150 <equation_count+0x50>
cmp    $0xa,%r10b
jb     1150 <equation_count+0x50>
jmp    1127 <equation_count+0x27>
nopl   0x0(%rax,%rax,1)
add    $0xdf,%cl
cmp    $0x43,%cl
ja     1123 <equation_count+0x23>
movzbl %cl,%eax
movslq (%r8,%rax,4),%rax
add    %r8,%rax
jmp    *%rax
ret

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

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