unsigned char *findValueEnd(unsigned char *begin, unsigned long *type) {
  unsigned char delim = ',';
  unsigned char *end = begin;
  unsigned long delimCount = 1;
  if ('\"' == begin[0]) {
    delim = '\"';
    *type = (0);
  } else if ('[' == begin[0]) {
    delim = ']';
    *type = (2);
  } else if ('{' == begin[0]) {
    delim = '}';
    *type = (3);
  } else
    *type = (1);
  if ((1) == *type)
    do {
      end++;
    } while ('0' <= *end && '9' >= *end);
  else
    do {
      end++;
      if (*end == delim && '\\' != *(end - 1))
        delimCount--;
      else if (*end == begin[0] && '\\' != *(end - 1))
        delimCount++;
    } while (0 < delimCount);
  return end;
}


x86 assembly (clang, -O0):
<findValueEnd>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movb   $0x2c,-0x11(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
movq   $0x1,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movzbl (%rax),%ecx
mov    $0x22,%eax
cmp    %ecx,%eax
jne    1148 <findValueEnd+0x48>
movb   $0x22,-0x11(%rbp)
mov    -0x10(%rbp),%rax
movq   $0x0,(%rax)
jmp    11ad <findValueEnd+0xad>
mov    -0x8(%rbp),%rax
movzbl (%rax),%ecx
mov    $0x5b,%eax
cmp    %ecx,%eax
jne    1170 <findValueEnd+0x70>
movb   $0x5d,-0x11(%rbp)
mov    -0x10(%rbp),%rax
movq   $0x2,(%rax)
jmp    11a8 <findValueEnd+0xa8>
mov    -0x8(%rbp),%rax
movzbl (%rax),%ecx
mov    $0x7b,%eax
cmp    %ecx,%eax
jne    1198 <findValueEnd+0x98>
movb   $0x7d,-0x11(%rbp)
mov    -0x10(%rbp),%rax
movq   $0x3,(%rax)
jmp    11a3 <findValueEnd+0xa3>
mov    -0x10(%rbp),%rax
movq   $0x1,(%rax)
jmp    11a8 <findValueEnd+0xa8>
jmp    11ad <findValueEnd+0xad>
mov    -0x10(%rbp),%rcx
mov    $0x1,%eax
cmp    (%rcx),%rax
jne    120d <findValueEnd+0x10d>
jmp    11c4 <findValueEnd+0xc4>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movzbl (%rax),%edx
xor    %eax,%eax
mov    $0x30,%ecx
cmp    %edx,%ecx
mov    %al,-0x29(%rbp)
jg     11fd <findValueEnd+0xfd>
mov    -0x20(%rbp),%rax
movzbl (%rax),%ecx
mov    $0x39,%eax
cmp    %ecx,%eax
setge  %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    11c4 <findValueEnd+0xc4>
jmp    12a9 <findValueEnd+0x1a9>
jmp    1212 <findValueEnd+0x112>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
movzbl -0x11(%rbp),%ecx
cmp    %ecx,%eax
jne    1257 <findValueEnd+0x157>
mov    -0x20(%rbp),%rax
movzbl -0x1(%rax),%ecx
mov    $0x5c,%eax
cmp    %ecx,%eax
je     1257 <findValueEnd+0x157>
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
jmp    1293 <findValueEnd+0x193>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
mov    -0x8(%rbp),%rcx
movzbl (%rcx),%ecx
cmp    %ecx,%eax
jne    128e <findValueEnd+0x18e>
mov    -0x20(%rbp),%rax
movzbl -0x1(%rax),%ecx
mov    $0x5c,%eax
cmp    %ecx,%eax
je     128e <findValueEnd+0x18e>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1293 <findValueEnd+0x193>
jmp    1298 <findValueEnd+0x198>
xor    %eax,%eax
cmp    -0x28(%rbp),%rax
jb     1212 <findValueEnd+0x112>
jmp    12a9 <findValueEnd+0x1a9>
mov    -0x20(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<findValueEnd>:
mov    (%rdi),%al
cmp    $0x22,%al
je     111a <findValueEnd+0x1a>
cmp    $0x7b,%al
je     1123 <findValueEnd+0x23>
cmp    $0x5b,%al
jne    116d <findValueEnd+0x6d>
mov    $0x5d,%ecx
mov    $0x2,%eax
jmp    112d <findValueEnd+0x2d>
mov    $0x22,%ecx
xor    %eax,%eax
jmp    112d <findValueEnd+0x2d>
mov    $0x7d,%ecx
mov    $0x3,%eax
mov    %rax,(%rsi)
mov    $0x1,%edx
mov    %rdi,%rax
jmp    114d <findValueEnd+0x4d>
nopw   0x0(%rax,%rax,1)
add    $0xffffffffffffffff,%rdx
add    $0x1,%rax
test   %rdx,%rdx
je     1190 <findValueEnd+0x90>
movzbl 0x1(%rax),%esi
cmp    %esi,%ecx
jne    115a <findValueEnd+0x5a>
cmpb   $0x5c,(%rax)
jne    1140 <findValueEnd+0x40>
cmp    (%rdi),%sil
jne    1144 <findValueEnd+0x44>
xor    %esi,%esi
cmpb   $0x5c,(%rax)
setne  %sil
add    %rsi,%rdx
jmp    1144 <findValueEnd+0x44>
movq   $0x1,(%rsi)
mov    %rdi,%rax
nopw   0x0(%rax,%rax,1)
movzbl 0x1(%rax),%ecx
add    $0x1,%rax
add    $0xd0,%cl
cmp    $0xa,%cl
jb     1180 <findValueEnd+0x80>
ret

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

LLVM IR (-O2):
define i8* @findValueEnd(i8* %0, i64* nocapture %1) {
%3 = load i8, i8* %0
switch i8 %3, label %9 [
i8 34, label %6
i8 91, label %4
i8 123, label %5
]
4: ; preds = %2
br label %6
5: ; preds = %2
br label %6
6: ; preds = %2, %4, %5
%7 = phi i64 [ 2, %4 ], [ 3, %5 ], [ 0, %2 ]
%8 = phi i32 [ 93, %4 ], [ 125, %5 ], [ 34, %2 ]
store i64 %7, i64* %1
br label %16
9: ; preds = %2
store i64 1, i64* %1
br label %10
10: ; preds = %9, %10
%11 = phi i8* [ %12, %10 ], [ %0, %9 ]
%12 = getelementptr inbounds i8, i8* %11, i64 1
%13 = load i8, i8* %12
%14 = add i8 %13, -48
%15 = icmp ult i8 %14, 10
br i1 %15, label %10, label %39
16: ; preds = %6, %36
%17 = phi i8* [ %19, %36 ], [ %0, %6 ]
%18 = phi i64 [ %37, %36 ], [ 1, %6 ]
%19 = getelementptr inbounds i8, i8* %17, i64 1
%20 = load i8, i8* %19
%21 = zext i8 %20 to i32
%22 = icmp eq i32 %8, %21
br i1 %22, label %23, label %28
23: ; preds = %16
%24 = load i8, i8* %17
%25 = icmp eq i8 %24, 92
br i1 %25, label %28, label %26
26: ; preds = %23
%27 = add i64 %18, -1
br label %36
28: ; preds = %23, %16
%29 = load i8, i8* %0
%30 = icmp eq i8 %20, %29
br i1 %30, label %31, label %36
31: ; preds = %28
%32 = load i8, i8* %17
%33 = icmp ne i8 %32, 92
%34 = zext i1 %33 to i64
%35 = add i64 %18, %34
br label %36
36: ; preds = %31, %26, %28
%37 = phi i64 [ %27, %26 ], [ %18, %28 ], [ %35, %31 ]
%38 = icmp eq i64 %37, 0
br i1 %38, label %39, label %16
39: ; preds = %36, %10
%40 = phi i8* [ %12, %10 ], [ %19, %36 ]
ret i8* %40
}