#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*/ delchar(char *);
int strlen(char const *);
scalar_t__ strncasecmp(char *, char const *, int);
char *checkcmd(char *buf, const char *cmd) {
  char *p, *q;
  int n;
  p = buf;
  while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r')
    p++;
  n = strlen(cmd);
  if (strncasecmp(p, cmd, n))
    return NULL;
  p += n;
  while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r')
    p++;
  q = p;
  while (*q && *q != ' ' && *q != '\t' && *q != '\n' && *q != '\r') {
    if (*q == '"') {
      delchar(q);
      while (*q && *q != '"') {
        if (*q == '\\')
          delchar(q);
        q++;
      }
      delchar(q);
    } else
      q++;
  }
  *q = 0;
  return p;
}


x86 assembly (clang, -O0):
<checkcmd>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x2d(%rbp)
je     1197 <checkcmd+0x67>
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x9,%ecx
mov    %al,-0x2d(%rbp)
je     1197 <checkcmd+0x67>
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0xa,%ecx
mov    %al,-0x2d(%rbp)
je     1197 <checkcmd+0x67>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xd,%eax
sete   %al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
test   $0x1,%al
jne    11a7 <checkcmd+0x77>
jmp    11b8 <checkcmd+0x88>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1148 <checkcmd+0x18>
mov    -0x18(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x2c(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x2c(%rbp),%edx
call   1050 <strncasecmp@plt>
cmp    $0x0,%rax
je     11eb <checkcmd+0xbb>
movq   $0x0,-0x8(%rbp)
jmp    138e <checkcmd+0x25e>
mov    -0x2c(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x2e(%rbp)
je     124b <checkcmd+0x11b>
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x9,%ecx
mov    %al,-0x2e(%rbp)
je     124b <checkcmd+0x11b>
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0xa,%ecx
mov    %al,-0x2e(%rbp)
je     124b <checkcmd+0x11b>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xd,%eax
sete   %al
mov    %al,-0x2e(%rbp)
mov    -0x2e(%rbp),%al
test   $0x1,%al
jne    125b <checkcmd+0x12b>
jmp    126c <checkcmd+0x13c>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    11fc <checkcmd+0xcc>
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2f(%rbp)
je     12d8 <checkcmd+0x1a8>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x2f(%rbp)
je     12d8 <checkcmd+0x1a8>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x9,%ecx
mov    %al,-0x2f(%rbp)
je     12d8 <checkcmd+0x1a8>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
mov    %al,-0x2f(%rbp)
je     12d8 <checkcmd+0x1a8>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xd,%eax
setne  %al
mov    %al,-0x2f(%rbp)
mov    -0x2f(%rbp),%al
test   $0x1,%al
jne    12e8 <checkcmd+0x1b8>
jmp    137f <checkcmd+0x24f>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
jne    136e <checkcmd+0x23e>
mov    -0x28(%rbp),%rdi
call   1040 <delchar@plt>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x30(%rbp)
je     1326 <checkcmd+0x1f6>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
setne  %al
mov    %al,-0x30(%rbp)
mov    -0x30(%rbp),%al
test   $0x1,%al
jne    1336 <checkcmd+0x206>
jmp    1360 <checkcmd+0x230>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    134f <checkcmd+0x21f>
mov    -0x28(%rbp),%rdi
call   1040 <delchar@plt>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1301 <checkcmd+0x1d1>
mov    -0x28(%rbp),%rdi
call   1040 <delchar@plt>
jmp    137a <checkcmd+0x24a>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1274 <checkcmd+0x144>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<checkcmd>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
movabs $0x100002600,%rbp
nopw   0x0(%rax,%rax,1)
movzbl (%rbx),%eax
cmp    $0x20,%rax
ja     1165 <checkcmd+0x35>
bt     %rax,%rbp
jae    1165 <checkcmd+0x35>
add    $0x1,%rbx
jmp    1150 <checkcmd+0x20>
mov    %r14,%rdi
call   1030 <strlen@plt>
mov    %eax,%r15d
mov    %rbx,%rdi
mov    %r14,%rsi
mov    %eax,%edx
call   1050 <strncasecmp@plt>
test   %rax,%rax
je     1189 <checkcmd+0x59>
xor    %ebx,%ebx
jmp    1211 <checkcmd+0xe1>
movslq %r15d,%rax
add    %rax,%rbx
nop
movzbl (%rbx),%eax
cmp    $0x20,%rax
ja     11a5 <checkcmd+0x75>
bt     %rax,%rbp
jae    11a5 <checkcmd+0x75>
add    $0x1,%rbx
jmp    1190 <checkcmd+0x60>
mov    %rbx,%r14
cmp    $0x22,%al
jbe    11cc <checkcmd+0x9c>
jmp    11c0 <checkcmd+0x90>
xchg   %ax,%ax
movabs $0x100002601,%rcx
bt     %rax,%rcx
jb     120d <checkcmd+0xdd>
add    $0x1,%r14
movzbl (%r14),%eax
cmp    $0x22,%al
ja     11c0 <checkcmd+0x90>
movzbl %al,%eax
cmp    $0x22,%rax
jne    11b0 <checkcmd+0x80>
mov    %r14,%rdi
call   1040 <delchar@plt>
jmp    11ec <checkcmd+0xbc>
nop
mov    %r14,%rdi
call   1040 <delchar@plt>
add    $0x1,%r14
movzbl (%r14),%eax
cmp    $0x5c,%al
je     11e0 <checkcmd+0xb0>
test   %al,%al
je     11fc <checkcmd+0xcc>
cmp    $0x22,%al
jne    11e8 <checkcmd+0xb8>
mov    %r14,%rdi
call   1040 <delchar@plt>
mov    (%r14),%al
cmp    $0x22,%al
jbe    11cc <checkcmd+0x9c>
jmp    11c0 <checkcmd+0x90>
movb   $0x0,(%r14)
mov    %rbx,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i8* @checkcmd(i8* %0, i8* %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
i8 13, label %6
]
6: ; preds = %3, %3, %3, %3
%7 = getelementptr inbounds i8, i8* %4, i64 1
br label %3
8: ; preds = %3
%9 = tail call i32 @strlen(i8* %1)
%10 = tail call i64 @strncasecmp(i8* %4, i8* %1, i32 %9)
%11 = icmp eq i64 %10, 0
br i1 %11, label %12, label %40
12: ; preds = %8
%13 = sext i32 %9 to i64
%14 = getelementptr inbounds i8, i8* %4, i64 %13
br label %15
15: ; preds = %18, %12
%16 = phi i8* [ %14, %12 ], [ %19, %18 ]
%17 = load i8, i8* %16
switch i8 %17, label %20 [
i8 32, label %18
i8 9, label %18
i8 10, label %18
i8 13, label %18
]
18: ; preds = %15, %15, %15, %15
%19 = getelementptr inbounds i8, i8* %16, i64 1
br label %15
20: ; preds = %15, %36
%21 = phi i8 [ %38, %36 ], [ %17, %15 ]
%22 = phi i8* [ %37, %36 ], [ %16, %15 ]
switch i8 %21, label %34 [
i8 0, label %39
i8 32, label %39
i8 9, label %39
i8 10, label %39
i8 13, label %39
i8 34, label %23
]
23: ; preds = %20
%24 = tail call i32 @delchar(i8* %22)
br label %25
25: ; preds = %30, %23
%26 = phi i8* [ %22, %23 ], [ %31, %30 ]
%27 = load i8, i8* %26
switch i8 %27, label %30 [
i8 0, label %32
i8 34, label %32
i8 92, label %28
]
28: ; preds = %25
%29 = tail call i32 @delchar(i8* %26)
br label %30
30: ; preds = %25, %28
%31 = getelementptr inbounds i8, i8* %26, i64 1
br label %25
32: ; preds = %25, %25
%33 = tail call i32 @delchar(i8* %26)
br label %36
34: ; preds = %20
%35 = getelementptr inbounds i8, i8* %22, i64 1
br label %36
36: ; preds = %34, %32
%37 = phi i8* [ %26, %32 ], [ %35, %34 ]
%38 = load i8, i8* %37
br label %20
39: ; preds = %20, %20, %20, %20, %20
store i8 0, i8* %22
br label %40
40: ; preds = %8, %39
%41 = phi i8* [ %16, %39 ], [ null, %8 ]
ret i8* %41
}