char *getstr(s, t)
char *s, *t;
{
  int quote = 0;
  while (*s == ' ' || *s == '\t' || *s == '\n')
    s++;
  if (*s == '"') {
    s++;
    quote = 1;
  }
  for (;;) {
    if (quote && *s == '"') {
      s++;
      break;
    }
    if (!quote && (*s == ' ' || *s == '\t' || *s == '\n'))
      break;
    if (*s != '\\')
      *t++ = *s++;
    else {
      s++;
      if (isdigit(s[0]) && isdigit(s[1]) && isdigit(s[2])) {
        *t++ = (s[0] - '0') << 6 | (s[1] - '0') << 3 | s[2] - '0';
        s += 2;
      } else if (isdigit(s[0])) {
        *t++ = *s - '0';
      } else if (*s == 'b') {
        *t++ = '\b';
      } else if (*s == 'n') {
        *t++ = '\n';
      } else if (*s == 'r') {
        *t++ = '\r';
      } else if (*s == 't') {
        *t++ = '\t';
      } else {
        *t++ = *s;
      }
      s++;
    }
  }
  *t = '\0';
  return s;
}


x86 assembly (clang, -O0):
<getstr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x15(%rbp)
je     1161 <getstr+0x51>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x9,%ecx
mov    %al,-0x15(%rbp)
je     1161 <getstr+0x51>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
sete   %al
mov    %al,-0x15(%rbp)
mov    -0x15(%rbp),%al
test   $0x1,%al
jne    1171 <getstr+0x61>
jmp    1182 <getstr+0x72>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1127 <getstr+0x17>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
jne    11a5 <getstr+0x95>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
movl   $0x1,-0x14(%rbp)
jmp    11aa <getstr+0x9a>
cmpl   $0x0,-0x14(%rbp)
je     11d5 <getstr+0xc5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
jne    11d5 <getstr+0xc5>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    13fa <getstr+0x2ea>
cmpl   $0x0,-0x14(%rbp)
jne    1214 <getstr+0x104>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
je     120f <getstr+0xff>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
je     120f <getstr+0xff>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
jne    1214 <getstr+0x104>
jmp    13fa <getstr+0x2ea>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
je     124b <getstr+0x13b>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13f5 <getstr+0x2e5>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     12e6 <getstr+0x1d6>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     12e6 <getstr+0x1d6>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     12e6 <getstr+0x1d6>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
shl    $0x6,%eax
mov    -0x8(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
shl    $0x3,%ecx
or     %ecx,%eax
mov    -0x8(%rbp),%rcx
movsbl 0x2(%rcx),%ecx
sub    $0x30,%ecx
or     %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
jmp    13e9 <getstr+0x2d9>
mov    -0x8(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     131d <getstr+0x20d>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13e4 <getstr+0x2d4>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x62,%eax
jne    1344 <getstr+0x234>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x8,(%rax)
jmp    13df <getstr+0x2cf>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x6e,%eax
jne    136b <getstr+0x25b>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0xa,(%rax)
jmp    13da <getstr+0x2ca>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x72,%eax
jne    1392 <getstr+0x282>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0xd,(%rax)
jmp    13d5 <getstr+0x2c5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x74,%eax
jne    13b9 <getstr+0x2a9>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x9,(%rax)
jmp    13d0 <getstr+0x2c0>
mov    -0x8(%rbp),%rax
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13d5 <getstr+0x2c5>
jmp    13da <getstr+0x2ca>
jmp    13df <getstr+0x2cf>
jmp    13e4 <getstr+0x2d4>
jmp    13e9 <getstr+0x2d9>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    11aa <getstr+0x9a>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x8(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<getstr>:
mov    %rdi,%rax
movabs $0x100000600,%rdx
nopl   (%rax)
movzbl (%rax),%ecx
cmp    $0x20,%rcx
ja     1125 <getstr+0x25>
bt     %rcx,%rdx
jae    1125 <getstr+0x25>
add    $0x1,%rax
jmp    1110 <getstr+0x10>
xor    %edx,%edx
cmp    $0x22,%cl
sete   %dl
add    %rdx,%rax
lea    0xec9(%rip),%r8
jmp    1161 <getstr+0x61>
nopl   0x0(%rax)
cmp    $0x5c,%dil
je     1190 <getstr+0x90>
cmp    $0x22,%dil
je     1222 <getstr+0x122>
mov    %rax,%r11
mov    %dil,(%rsi)
add    $0x1,%rsi
add    $0x1,%r11
mov    %r11,%rax
movzbl (%rax),%edi
cmp    $0x22,%cl
je     1140 <getstr+0x40>
cmp    $0x5c,%dil
je     1190 <getstr+0x90>
lea    -0x9(%rdi),%edx
cmp    $0x2,%dl
jb     1226 <getstr+0x126>
cmp    $0x20,%dil
jne    1150 <getstr+0x50>
jmp    1226 <getstr+0x126>
cs nopw 0x0(%rax,%rax,1)
lea    0x1(%rax),%r11
movsbl 0x1(%rax),%r9d
mov    %r9d,%edi
add    $0xffffffd0,%edi
cmp    $0x9,%edi
ja     11e0 <getstr+0xe0>
movsbl 0x2(%rax),%r10d
lea    -0x30(%r10),%edi
cmp    $0x9,%edi
ja     1201 <getstr+0x101>
movsbl 0x3(%rax),%edi
lea    -0x30(%rdi),%edx
cmp    $0x9,%edx
ja     1201 <getstr+0x101>
add    $0x3,%rax
shl    $0x6,%r9b
shl    $0x3,%r10b
xor    $0x80,%r10b
add    $0xd0,%dil
or     %r9b,%dil
or     %r10b,%dil
mov    %rax,%r11
jmp    1153 <getstr+0x53>
lea    -0x62(%r9),%eax
ror    %al
cmp    $0x9,%al
ja     120a <getstr+0x10a>
mov    $0x8,%dil
movzbl %al,%eax
movslq (%r8,%rax,4),%rax
add    %r8,%rax
jmp    *%rax
mov    $0xa,%dil
jmp    1153 <getstr+0x53>
lea    -0x30(%r9),%edi
jmp    1153 <getstr+0x53>
mov    %r9d,%edi
jmp    1153 <getstr+0x53>
mov    $0xd,%dil
jmp    1153 <getstr+0x53>
mov    $0x9,%dil
jmp    1153 <getstr+0x53>
add    $0x1,%rax
movb   $0x0,(%rsi)
ret

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

LLVM IR (-O2):
define i8* @getstr(i8* %0, i8* nocapture writeonly %1) {
br label %3
3: ; preds = %6, %2
%4 = phi i8* [ %0, %2 ], [ %7, %6 ]
%5 = load i8, i8* %4
switch i8 %5, label %8 [
i8 32, label %6
i8 9, label %6
i8 10, label %6
]
6: ; preds = %3, %3, %3
%7 = getelementptr inbounds i8, i8* %4, i64 1
br label %3
8: ; preds = %3
%9 = icmp eq i8 %5, 34
%10 = zext i1 %9 to i64
%11 = getelementptr i8, i8* %4, i64 %10
br label %12
12: ; preds = %54, %8
%13 = phi i8* [ %11, %8 ], [ %58, %54 ]
%14 = phi i8* [ %1, %8 ], [ %57, %54 ]
%15 = load i8, i8* %13
br i1 %9, label %16, label %19
16: ; preds = %12
switch i8 %15, label %54 [
i8 34, label %17
i8 92, label %20
]
17: ; preds = %16
%18 = getelementptr inbounds i8, i8* %13, i64 1
br label %59
19: ; preds = %12
switch i8 %15, label %54 [
i8 32, label %59
i8 9, label %59
i8 10, label %59
i8 92, label %20
]
20: ; preds = %16, %19
%21 = getelementptr inbounds i8, i8* %13, i64 1
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
%24 = add nsw i32 %23, -48
%25 = icmp ult i32 %24, 10
br i1 %25, label %26, label %47
26: ; preds = %20
%27 = getelementptr inbounds i8, i8* %13, i64 2
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = add nsw i32 %29, -48
%31 = icmp ult i32 %30, 10
br i1 %31, label %32, label %45
32: ; preds = %26
%33 = getelementptr inbounds i8, i8* %13, i64 3
%34 = load i8, i8* %33
%35 = sext i8 %34 to i32
%36 = add nsw i32 %35, -48
%37 = icmp ult i32 %36, 10
br i1 %37, label %38, label %45
38: ; preds = %32
%39 = shl i8 %22, 6
%40 = shl i8 %28, 3
%41 = xor i8 %40, -128
%42 = or i8 %41, %39
%43 = add i8 %34, -48
%44 = or i8 %42, %43
br label %54
45: ; preds = %32, %26
%46 = add i8 %22, -48
br label %54
47: ; preds = %20
%48 = add i8 %22, -98
%49 = tail call i8 @llvm.fshl.i8(i8 %48, i8 %48, i8 7)
switch i8 %49, label %53 [
i8 0, label %54
i8 6, label %50
i8 8, label %51
i8 9, label %52
]
50: ; preds = %47
br label %54
51: ; preds = %47
br label %54
52: ; preds = %47
br label %54
53: ; preds = %47
br label %54
54: ; preds = %16, %19, %47, %38, %51, %53, %52, %50, %45
%55 = phi i8 [ %44, %38 ], [ 13, %51 ], [ %22, %53 ], [ 9, %52 ], [ 10, %50 ], [ %46, %45 ], [ 8, %47 ], [ %15, %19 ], [ %15, %16 ]
%56 = phi i8* [ %33, %38 ], [ %21, %51 ], [ %21, %53 ], [ %21, %52 ], [ %21, %50 ], [ %21, %45 ], [ %21, %47 ], [ %13, %19 ], [ %13, %16 ]
store i8 %55, i8* %14
%57 = getelementptr inbounds i8, i8* %14, i64 1
%58 = getelementptr inbounds i8, i8* %56, i64 1
br label %12
59: ; preds = %19, %19, %19, %17
%60 = phi i8* [ %18, %17 ], [ %13, %19 ], [ %13, %19 ], [ %13, %19 ]
store i8 0, i8* %14
ret i8* %60
}