#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*/ ft_putchar(char);
int new_command(int /*<<< orphan*/, char *);
int print_command(char *, int *, int);
int quote_it(char *, int);
int quote_it2(char *, int);
int redirection_left(char *, int);
int redirection_right(char *, int);
void write_cmd(char *cmd, int i, int command) {
  while (cmd[i] && cmd[i] == ' ')
    ft_putchar(cmd[i++]);
  if (!cmd[i])
    return;
  else if (cmd[i] == '"')
    i = quote_it(cmd, ++i);
  else if (cmd[i] == '\'')
    i = quote_it2(cmd, ++i);
  else if (cmd[i] == '>')
    i = redirection_right(cmd, i);
  else if (cmd[i] == '<')
    i = redirection_left(cmd, i);
  else if (cmd[i] == '|' || cmd[i] == ';' || cmd[i] == '&' || cmd[i] == '(' ||
           cmd[i] == ')')
    command = new_command(i++, cmd);
  else
    command = print_command(cmd, &i, command);
  if (!cmd[i])
    return;
  write_cmd(cmd, i, command);
}


x86 assembly (clang, -O0):
<write_cmd>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x11(%rbp)
je     11c1 <write_cmd+0x41>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
sete   %al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%al
test   $0x1,%al
jne    11d1 <write_cmd+0x51>
jmp    11f1 <write_cmd+0x71>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edi
call   1080 <ft_putchar@plt>
jmp    1192 <write_cmd+0x12>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1208 <write_cmd+0x88>
jmp    138f <write_cmd+0x20f>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x22,%eax
jne    1237 <write_cmd+0xb7>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
add    $0x1,%esi
mov    %esi,-0xc(%rbp)
call   1050 <quote_it@plt>
mov    %eax,-0xc(%rbp)
jmp    1364 <write_cmd+0x1e4>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x27,%eax
jne    1266 <write_cmd+0xe6>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
add    $0x1,%esi
mov    %esi,-0xc(%rbp)
call   10a0 <quote_it2@plt>
mov    %eax,-0xc(%rbp)
jmp    135f <write_cmd+0x1df>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3e,%eax
jne    128f <write_cmd+0x10f>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
call   1090 <redirection_right@plt>
mov    %eax,-0xc(%rbp)
jmp    135a <write_cmd+0x1da>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3c,%eax
jne    12b8 <write_cmd+0x138>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
call   1070 <redirection_left@plt>
mov    %eax,-0xc(%rbp)
jmp    1355 <write_cmd+0x1d5>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7c,%eax
je     1321 <write_cmd+0x1a1>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3b,%eax
je     1321 <write_cmd+0x1a1>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x26,%eax
je     1321 <write_cmd+0x1a1>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x28,%eax
je     1321 <write_cmd+0x1a1>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x29,%eax
jne    133d <write_cmd+0x1bd>
mov    -0xc(%rbp),%edi
mov    %edi,%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rsi
call   1030 <new_command@plt>
mov    %eax,-0x10(%rbp)
jmp    1350 <write_cmd+0x1d0>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%edx
lea    -0xc(%rbp),%rsi
call   1040 <print_command@plt>
mov    %eax,-0x10(%rbp)
jmp    1355 <write_cmd+0x1d5>
jmp    135a <write_cmd+0x1da>
jmp    135f <write_cmd+0x1df>
jmp    1364 <write_cmd+0x1e4>
jmp    1369 <write_cmd+0x1e9>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1380 <write_cmd+0x200>
jmp    138f <write_cmd+0x20f>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0x10(%rbp),%edx
call   1060 <write_cmd@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<write_cmd>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %edx,%r14d
mov    %esi,%ebp
mov    %rdi,%r15
movslq %esi,%rbx
add    %rdi,%rbx
movzbl (%rbx),%eax
cmp    $0x20,%al
jne    11af <write_cmd+0x2f>
mov    $0x20,%edi
call   1080 <ft_putchar@plt>
add    $0x1,%ebp
add    $0x1,%rbx
jmp    1195 <write_cmd+0x15>
cmp    $0x3e,%al
ja     11dc <write_cmd+0x5c>
movzbl %al,%eax
lea    0xe43(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
lea    0x1(%rbp),%ebx
mov    %ebx,0x4(%rsp)
mov    %ebp,%edi
mov    %r15,%rsi
call   1030 <new_command@plt>
mov    %eax,%r14d
jmp    123d <write_cmd+0xbd>
cmp    $0x7c,%al
je     11c6 <write_cmd+0x46>
mov    %ebp,0x4(%rsp)
lea    0x4(%rsp),%rsi
mov    %r15,%rdi
mov    %r14d,%edx
call   1040 <print_command@plt>
mov    %eax,%r14d
mov    0x4(%rsp),%ebx
jmp    123d <write_cmd+0xbd>
mov    %ebp,0x4(%rsp)
jmp    1254 <write_cmd+0xd4>
add    $0x1,%ebp
mov    %r15,%rdi
mov    %ebp,%esi
call   1050 <quote_it@plt>
jmp    1237 <write_cmd+0xb7>
add    $0x1,%ebp
mov    %r15,%rdi
mov    %ebp,%esi
call   10a0 <quote_it2@plt>
jmp    1237 <write_cmd+0xb7>
mov    %r15,%rdi
mov    %ebp,%esi
call   1070 <redirection_left@plt>
jmp    1237 <write_cmd+0xb7>
mov    %r15,%rdi
mov    %ebp,%esi
call   1090 <redirection_right@plt>
mov    %eax,%ebx
mov    %eax,0x4(%rsp)
movslq %ebx,%rax
cmpb   $0x0,(%r15,%rax,1)
je     1254 <write_cmd+0xd4>
mov    %r15,%rdi
mov    %ebx,%esi
mov    %r14d,%edx
call   1060 <write_cmd@plt>
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @write_cmd(i8* %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = sext i32 %1 to i64
br label %6
6: ; preds = %10, %3
%7 = phi i64 [ %11, %10 ], [ %5, %3 ]
%8 = getelementptr inbounds i8, i8* %0, i64 %7
%9 = load i8, i8* %8
switch i8 %9, label %31 [
i8 32, label %10
i8 0, label %43
i8 34, label %13
i8 39, label %17
i8 62, label %21
i8 60, label %24
i8 124, label %27
i8 59, label %27
i8 38, label %27
i8 40, label %27
i8 41, label %27
]
10: ; preds = %6
%11 = add i64 %7, 1
%12 = tail call i32 @ft_putchar(i8 signext 32)
br label %6
13: ; preds = %6
%14 = trunc i64 %7 to i32
%15 = add nsw i32 %14, 1
%16 = tail call i32 @quote_it(i8* %0, i32 %15)
store i32 %16, i32* %4
br label %35
17: ; preds = %6
%18 = trunc i64 %7 to i32
%19 = add nsw i32 %18, 1
%20 = tail call i32 @quote_it2(i8* %0, i32 %19)
store i32 %20, i32* %4
br label %35
21: ; preds = %6
%22 = trunc i64 %7 to i32
%23 = tail call i32 @redirection_right(i8* %0, i32 %22)
store i32 %23, i32* %4
br label %35
24: ; preds = %6
%25 = trunc i64 %7 to i32
%26 = tail call i32 @redirection_left(i8* %0, i32 %25)
store i32 %26, i32* %4
br label %35
27: ; preds = %6, %6, %6, %6, %6
%28 = trunc i64 %7 to i32
%29 = add nsw i32 %28, 1
store i32 %29, i32* %4
%30 = tail call i32 @new_command(i32 %28, i8* %0)
br label %35
31: ; preds = %6
%32 = trunc i64 %7 to i32
store i32 %32, i32* %4
%33 = call i32 @print_command(i8* %0, i32* %4, i32 %2)
%34 = load i32, i32* %4
br label %35
35: ; preds = %13, %21, %27, %31, %24, %17
%36 = phi i32 [ %16, %13 ], [ %20, %17 ], [ %23, %21 ], [ %26, %24 ], [ %29, %27 ], [ %34, %31 ]
%37 = phi i32 [ %2, %13 ], [ %2, %17 ], [ %2, %21 ], [ %2, %24 ], [ %30, %27 ], [ %33, %31 ]
%38 = sext i32 %36 to i64
%39 = getelementptr inbounds i8, i8* %0, i64 %38
%40 = load i8, i8* %39
%41 = icmp eq i8 %40, 0
br i1 %41, label %45, label %42
42: ; preds = %35
br label %45
43: ; preds = %6
%44 = trunc i64 %7 to i32
store i32 %44, i32* %4
br label %45
45: ; preds = %43, %35, %42
ret void
}