#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*/ fb_realpath(char const *, char *);
int /*<<< orphan*/ printf(char *, char);
int /*<<< orphan*/ strcat(char *, char *);
int /*<<< orphan*/ strcpy(char *, char *);
int strlen(char *);
char *wu_realpath(const char *path, char resolved_path[10], char *chroot_path) {
  char *ptr;
  char q[10];
  fb_realpath(path, q);
  if (0)
    printf("strlen(q) = %d\n", strlen(q));
  if (0)
    printf("q[MAXPATHLEN - 1] = %c\n", q[10 - 1]);
  if (chroot_path == NULL)
    strcpy(resolved_path, q);
  else {
    strcpy(resolved_path, chroot_path);
    if (q[0] != '/') {
      if (strlen(resolved_path) + strlen(q) < 10)
        strcat(resolved_path, q);
      else
        return NULL;
    } else if (q[1] != '\0') {
      for (ptr = q; *ptr != '\0'; ptr++)
        ;
      if (ptr == resolved_path || *--ptr != '/') {
        if (strlen(resolved_path) + strlen(q) < 10)
          strcat(resolved_path, q);
        else
          return NULL;
      } else {
        if (strlen(resolved_path) + strlen(q) - 1 < 10)
          strcat(resolved_path, &q[1]);
        else
          return NULL;
      }
    }
  }
  return resolved_path;
}


x86 assembly (clang, -O0):
<wu_realpath>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
lea    -0x32(%rbp),%rsi
call   1050 <fb_realpath@plt>
cmpq   $0x0,-0x20(%rbp)
jne    117e <wu_realpath+0x3e>
mov    -0x18(%rbp),%rdi
lea    -0x32(%rbp),%rsi
call   1030 <strcpy@plt>
jmp    12ee <wu_realpath+0x1ae>
mov    -0x18(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1030 <strcpy@plt>
movsbl -0x32(%rbp),%eax
cmp    $0x2f,%eax
je     11e1 <wu_realpath+0xa1>
mov    -0x18(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x38(%rbp)
lea    -0x32(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x38(%rbp),%eax
add    %ecx,%eax
cmp    $0xa,%eax
jge    11cf <wu_realpath+0x8f>
mov    -0x18(%rbp),%rdi
lea    -0x32(%rbp),%rsi
call   1060 <strcat@plt>
jmp    11dc <wu_realpath+0x9c>
movq   $0x0,-0x8(%rbp)
jmp    12f6 <wu_realpath+0x1b6>
jmp    12e9 <wu_realpath+0x1a9>
movsbl -0x31(%rbp),%eax
cmp    $0x0,%eax
je     12e4 <wu_realpath+0x1a4>
lea    -0x32(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     121c <wu_realpath+0xdc>
jmp    120b <wu_realpath+0xcb>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    11f6 <wu_realpath+0xb6>
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
je     1246 <wu_realpath+0x106>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x28(%rbp)
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
je     128f <wu_realpath+0x14f>
mov    -0x18(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x3c(%rbp)
lea    -0x32(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x3c(%rbp),%eax
add    %ecx,%eax
cmp    $0xa,%eax
jge    127d <wu_realpath+0x13d>
mov    -0x18(%rbp),%rdi
lea    -0x32(%rbp),%rsi
call   1060 <strcat@plt>
jmp    128a <wu_realpath+0x14a>
movq   $0x0,-0x8(%rbp)
jmp    12f6 <wu_realpath+0x1b6>
jmp    12df <wu_realpath+0x19f>
mov    -0x18(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x40(%rbp)
lea    -0x32(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x40(%rbp),%eax
add    %ecx,%eax
sub    $0x1,%eax
cmp    $0xa,%eax
jge    12cd <wu_realpath+0x18d>
mov    -0x18(%rbp),%rdi
lea    -0x32(%rbp),%rsi
add    $0x1,%rsi
call   1060 <strcat@plt>
jmp    12da <wu_realpath+0x19a>
movq   $0x0,-0x8(%rbp)
jmp    12f6 <wu_realpath+0x1b6>
jmp    12df <wu_realpath+0x19f>
jmp    12e4 <wu_realpath+0x1a4>
jmp    12e9 <wu_realpath+0x1a9>
jmp    12ee <wu_realpath+0x1ae>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<wu_realpath>:
push   %r15
push   %r14
push   %rbx
sub    $0x10,%rsp
mov    %rdx,%r14
mov    %rsi,%r15
lea    0x6(%rsp),%rbx
mov    %rbx,%rsi
call   1050 <fb_realpath@plt>
test   %r14,%r14
je     11f2 <wu_realpath+0xb2>
mov    %r15,%rdi
mov    %r14,%rsi
call   1030 <strcpy@plt>
cmpb   $0x2f,0x6(%rsp)
jne    11c8 <wu_realpath+0x88>
cmpb   $0x0,0x7(%rsp)
je     1204 <wu_realpath+0xc4>
lea    0x7(%rsp),%r14
nopw   0x0(%rax,%rax,1)
cmpb   $0x0,0x1(%rbx)
lea    0x1(%rbx),%rbx
jne    1190 <wu_realpath+0x50>
cmp    %r15,%rbx
je     11c8 <wu_realpath+0x88>
cmpb   $0x2f,-0x1(%rbx)
jne    11c8 <wu_realpath+0x88>
mov    %r15,%rdi
call   1040 <strlen@plt>
mov    %eax,%ebx
lea    0x6(%rsp),%rdi
call   1040 <strlen@plt>
add    %ebx,%eax
cmp    $0xa,%eax
jg     1201 <wu_realpath+0xc1>
mov    %r15,%rdi
mov    %r14,%rsi
jmp    11eb <wu_realpath+0xab>
mov    %r15,%rdi
call   1040 <strlen@plt>
mov    %eax,%ebx
lea    0x6(%rsp),%rdi
call   1040 <strlen@plt>
add    %ebx,%eax
cmp    $0x9,%eax
jg     1201 <wu_realpath+0xc1>
lea    0x6(%rsp),%rsi
mov    %r15,%rdi
call   1060 <strcat@plt>
jmp    1204 <wu_realpath+0xc4>
lea    0x6(%rsp),%rsi
mov    %r15,%rdi
call   1030 <strcpy@plt>
jmp    1204 <wu_realpath+0xc4>
xor    %r15d,%r15d
mov    %r15,%rax
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
define i8* @wu_realpath(i8* %0, i8* %1, i8* %2) {
%4 = alloca [10 x i8]
%5 = getelementptr inbounds [10 x i8], [10 x i8]* %4, i64 0, i64 0
%6 = call i32 @fb_realpath(i8* %0, i8* %5)
%7 = icmp eq i8* %2, null
br i1 %7, label %8, label %10
8: ; preds = %3
%9 = call i32 @strcpy(i8* %1, i8* %5)
br label %52
10: ; preds = %3
%11 = call i32 @strcpy(i8* %1, i8* %2)
%12 = load i8, i8* %5
%13 = icmp eq i8 %12, 47
br i1 %13, label %21, label %14
14: ; preds = %10
%15 = call i32 @strlen(i8* %1)
%16 = call i32 @strlen(i8* %5)
%17 = add nsw i32 %16, %15
%18 = icmp slt i32 %17, 10
br i1 %18, label %19, label %52
19: ; preds = %14
%20 = call i32 @strcat(i8* %1, i8* %5)
br label %52
21: ; preds = %10
%22 = getelementptr inbounds [10 x i8], [10 x i8]* %4, i64 0, i64 1
%23 = load i8, i8* %22
%24 = icmp eq i8 %23, 0
br i1 %24, label %52, label %25
25: ; preds = %21
%26 = getelementptr inbounds [10 x i8], [10 x i8]* %4, i64 0, i64 1
br label %27
27: ; preds = %25, %27
%28 = phi i8* [ %26, %25 ], [ %31, %27 ]
%29 = load i8, i8* %28
%30 = icmp eq i8 %29, 0
%31 = getelementptr inbounds i8, i8* %28, i64 1
br i1 %30, label %32, label %27
32: ; preds = %27
%33 = icmp eq i8* %28, %1
br i1 %33, label %38, label %34
34: ; preds = %32
%35 = getelementptr inbounds i8, i8* %28, i64 -1
%36 = load i8, i8* %35
%37 = icmp eq i8 %36, 47
br i1 %37, label %45, label %38
38: ; preds = %34, %32
%39 = call i32 @strlen(i8* %1)
%40 = call i32 @strlen(i8* %5)
%41 = add nsw i32 %40, %39
%42 = icmp slt i32 %41, 10
br i1 %42, label %43, label %52
43: ; preds = %38
%44 = call i32 @strcat(i8* %1, i8* %5)
br label %52
45: ; preds = %34
%46 = call i32 @strlen(i8* %1)
%47 = call i32 @strlen(i8* %5)
%48 = add nsw i32 %47, %46
%49 = icmp slt i32 %48, 11
br i1 %49, label %50, label %52
50: ; preds = %45
%51 = call i32 @strcat(i8* %1, i8* %22)
br label %52
52: ; preds = %8, %21, %50, %43, %19, %45, %38, %14
%53 = phi i8* [ null, %14 ], [ null, %38 ], [ null, %45 ], [ %1, %19 ], [ %1, %43 ], [ %1, %50 ], [ %1, %21 ], [ %1, %8 ]
ret i8* %53
}