#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 */
char *strchr(char *, char);
int strlen(char *);
char *strrchr(char *, char);
char *strstr(char *, char *);
int scope_from_path(char *path, char **container, char **pod) {
  int i, j;
  int retval = 0;
  char *ptr = NULL, *idx = NULL;
  if (container)
    *container = NULL;
  if (pod)
    *pod = NULL;
  ptr = strrchr(path, '/');
  if (ptr == NULL || strlen(ptr) < 64)
    return retval;
  ptr++[0] = '\0';
  if (idx = strchr(ptr, '-'))
    ptr = idx;
  if (ptr[0] == '/' || ptr[0] == '-')
    ptr++;
  if (idx = strchr(ptr, '.'))
    idx[0] = '\0';
  if (container)
    *container = ptr;
  retval++;
  if (pod) {
    ptr = strrchr(path, '/');
    if (ptr == NULL || strlen(ptr) < 40)
      return retval;
    ptr++[0] = '\0';
    while (idx = strstr(ptr, "pod"))
      ptr = idx + 3;
    if (idx = strchr(ptr, '.'))
      idx[0] = '\0';
    for (i = 0, j = 0; i < strlen(ptr); i++) {
      ptr[j] = ptr[i];
      if (ptr[i] != '_' && ptr[i] != '-')
        j++;
    }
    ptr[j] = '\0';
    *pod = ptr;
    retval++;
  }
  return retval;
}


x86 assembly (clang, -O0):
<scope_from_path>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x2c(%rbp)
movq   $0x0,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1181 <scope_from_path+0x41>
mov    -0x18(%rbp),%rax
movq   $0x0,(%rax)
cmpq   $0x0,-0x20(%rbp)
je     1197 <scope_from_path+0x57>
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x10(%rbp),%rdi
mov    $0x2f,%esi
call   1050 <strrchr@plt>
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
je     11c6 <scope_from_path+0x86>
mov    -0x38(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x40,%eax
jge    11d1 <scope_from_path+0x91>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    13ca <scope_from_path+0x28a>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
movb   $0x0,(%rax)
mov    -0x38(%rbp),%rdi
mov    $0x2d,%esi
call   1040 <strchr@plt>
mov    %rax,-0x40(%rbp)
cmp    $0x0,%rax
je     1207 <scope_from_path+0xc7>
mov    -0x40(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
je     1227 <scope_from_path+0xe7>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1233 <scope_from_path+0xf3>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rdi
mov    $0x2e,%esi
call   1040 <strchr@plt>
mov    %rax,-0x40(%rbp)
cmp    $0x0,%rax
je     1256 <scope_from_path+0x116>
mov    -0x40(%rbp),%rax
movb   $0x0,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     126c <scope_from_path+0x12c>
mov    -0x38(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
cmpq   $0x0,-0x20(%rbp)
je     13c4 <scope_from_path+0x284>
mov    -0x10(%rbp),%rdi
mov    $0x2f,%esi
call   1050 <strrchr@plt>
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
je     12af <scope_from_path+0x16f>
mov    -0x38(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x28,%eax
jge    12ba <scope_from_path+0x17a>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    13ca <scope_from_path+0x28a>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
movb   $0x0,(%rax)
mov    -0x38(%rbp),%rdi
lea    0xd29(%rip),%rsi
call   1060 <strstr@plt>
mov    %rax,-0x40(%rbp)
cmp    $0x0,%rax
je     12fb <scope_from_path+0x1bb>
mov    -0x40(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x38(%rbp)
jmp    12cc <scope_from_path+0x18c>
mov    -0x38(%rbp),%rdi
mov    $0x2e,%esi
call   1040 <strchr@plt>
mov    %rax,-0x40(%rbp)
cmp    $0x0,%rax
je     131e <scope_from_path+0x1de>
mov    -0x40(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x38(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,%ecx
mov    -0x44(%rbp),%eax
cmp    %ecx,%eax
jge    13a4 <scope_from_path+0x264>
mov    -0x38(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x38(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x38(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5f,%eax
je     1391 <scope_from_path+0x251>
mov    -0x38(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
je     1391 <scope_from_path+0x251>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1396 <scope_from_path+0x256>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    132c <scope_from_path+0x1ec>
mov    -0x38(%rbp),%rax
movslq -0x28(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x38(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<scope_from_path>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %rdx,%r14
mov    %rsi,%r12
mov    %rdi,%r15
test   %rsi,%rsi
je     115e <scope_from_path+0x1e>
movq   $0x0,(%r12)
test   %r14,%r14
je     116a <scope_from_path+0x2a>
movq   $0x0,(%r14)
mov    %r15,%rdi
mov    $0x2f,%esi
call   1050 <strrchr@plt>
xor    %ebx,%ebx
test   %rax,%rax
je     12b1 <scope_from_path+0x171>
mov    %rax,%rbp
mov    %rax,%rdi
call   1030 <strlen@plt>
cmp    $0x40,%eax
jl     12b1 <scope_from_path+0x171>
mov    %rbp,%rbx
add    $0x1,%rbx
movb   $0x0,0x0(%rbp)
mov    %rbx,%rdi
mov    $0x2d,%esi
call   1040 <strchr@plt>
test   %rax,%rax
cmovne %rax,%rbx
mov    (%rbx),%al
or     $0x2,%al
cmp    $0x2f,%al
jne    11c1 <scope_from_path+0x81>
add    $0x1,%rbx
mov    %rbx,%rdi
mov    $0x2e,%esi
call   1040 <strchr@plt>
test   %rax,%rax
je     11d6 <scope_from_path+0x96>
movb   $0x0,(%rax)
test   %r12,%r12
je     11df <scope_from_path+0x9f>
mov    %rbx,(%r12)
mov    $0x1,%ebx
test   %r14,%r14
je     12b1 <scope_from_path+0x171>
mov    %r15,%rdi
mov    $0x2f,%esi
call   1050 <strrchr@plt>
test   %rax,%rax
je     12b1 <scope_from_path+0x171>
mov    %rax,%rbp
mov    %rax,%rdi
call   1030 <strlen@plt>
cmp    $0x28,%eax
jl     12b1 <scope_from_path+0x171>
mov    %rbp,%rcx
add    $0x1,%rcx
movb   $0x0,0x0(%rbp)
lea    0xdd7(%rip),%rbp
nopl   0x0(%rax)
mov    %rcx,%rbx
mov    %rcx,%rdi
mov    %rbp,%rsi
call   1060 <strstr@plt>
lea    0x3(%rax),%rcx
test   %rax,%rax
jne    1230 <scope_from_path+0xf0>
mov    %rbx,%rdi
mov    $0x2e,%esi
call   1040 <strchr@plt>
test   %rax,%rax
je     125c <scope_from_path+0x11c>
movb   $0x0,(%rax)
mov    %rbx,%rdi
call   1030 <strlen@plt>
test   %eax,%eax
jle    129f <scope_from_path+0x15f>
xor    %ebp,%ebp
xor    %r15d,%r15d
jmp    1283 <scope_from_path+0x143>
nop
add    $0x1,%rbp
mov    %rbx,%rdi
call   1030 <strlen@plt>
cltq
cmp    %rax,%rbp
jge    12a2 <scope_from_path+0x162>
movzbl (%rbx,%rbp,1),%eax
movslq %r15d,%rcx
mov    %al,(%rbx,%rcx,1)
movzbl (%rbx,%rbp,1),%eax
cmp    $0x2d,%al
je     1270 <scope_from_path+0x130>
cmp    $0x5f,%al
je     1270 <scope_from_path+0x130>
add    $0x1,%r15d
jmp    1270 <scope_from_path+0x130>
xor    %r15d,%r15d
movslq %r15d,%rax
movb   $0x0,(%rbx,%rax,1)
mov    %rbx,(%r14)
mov    $0x2,%ebx
mov    %ebx,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [4 x i8] c"pod\00"
define i32 @scope_from_path(i8* %0, i8** writeonly %1, i8** writeonly %2) {
%4 = icmp eq i8** %1, null
br i1 %4, label %6, label %5
5: ; preds = %3
store i8* null, i8** %1
br label %6
6: ; preds = %5, %3
%7 = icmp eq i8** %2, null
br i1 %7, label %9, label %8
8: ; preds = %6
store i8* null, i8** %2
br label %9
9: ; preds = %8, %6
%10 = tail call i8* @strrchr(i8* dereferenceable(1) %0, i8 signext 47)
%11 = icmp eq i8* %10, null
br i1 %11, label %71, label %12
12: ; preds = %9
%13 = tail call i32 @strlen(i8* %10)
%14 = icmp slt i32 %13, 64
br i1 %14, label %71, label %15
15: ; preds = %12
%16 = getelementptr inbounds i8, i8* %10, i64 1
store i8 0, i8* %10
%17 = tail call i8* @strchr(i8* %16, i8 signext 45)
%18 = icmp eq i8* %17, null
%19 = select i1 %18, i8* %16, i8* %17
%20 = load i8, i8* %19
switch i8 %20, label %23 [
i8 47, label %21
i8 45, label %21
]
21: ; preds = %15, %15
%22 = getelementptr inbounds i8, i8* %19, i64 1
br label %23
23: ; preds = %15, %21
%24 = phi i8* [ %22, %21 ], [ %19, %15 ]
%25 = tail call i8* @strchr(i8* %24, i8 signext 46)
%26 = icmp eq i8* %25, null
br i1 %26, label %28, label %27
27: ; preds = %23
store i8 0, i8* %25
br label %28
28: ; preds = %27, %23
br i1 %4, label %30, label %29
29: ; preds = %28
store i8* %24, i8** %1
br label %30
30: ; preds = %29, %28
br i1 %7, label %71, label %31
31: ; preds = %30
%32 = tail call i8* @strrchr(i8* dereferenceable(1) %0, i8 signext 47)
%33 = icmp eq i8* %32, null
br i1 %33, label %71, label %34
34: ; preds = %31
%35 = tail call i32 @strlen(i8* %32)
%36 = icmp slt i32 %35, 40
br i1 %36, label %71, label %37
37: ; preds = %34
%38 = getelementptr inbounds i8, i8* %32, i64 1
store i8 0, i8* %32
br label %39
39: ; preds = %39, %37
%40 = phi i8* [ %38, %37 ], [ %43, %39 ]
%41 = tail call i8* @strstr(i8* %40, i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0))
%42 = icmp eq i8* %41, null
%43 = getelementptr inbounds i8, i8* %41, i64 3
br i1 %42, label %44, label %39
44: ; preds = %39
%45 = tail call i8* @strchr(i8* %40, i8 signext 46)
%46 = icmp eq i8* %45, null
br i1 %46, label %48, label %47
47: ; preds = %44
store i8 0, i8* %45
br label %48
48: ; preds = %47, %44
%49 = tail call i32 @strlen(i8* %40)
%50 = icmp sgt i32 %49, 0
br i1 %50, label %51, label %67
51: ; preds = %48, %61
%52 = phi i64 [ %63, %61 ], [ 0, %48 ]
%53 = phi i32 [ %62, %61 ], [ 0, %48 ]
%54 = getelementptr inbounds i8, i8* %40, i64 %52
%55 = load i8, i8* %54
%56 = sext i32 %53 to i64
%57 = getelementptr inbounds i8, i8* %40, i64 %56
store i8 %55, i8* %57
%58 = load i8, i8* %54
switch i8 %58, label %59 [
i8 95, label %61
i8 45, label %61
]
59: ; preds = %51
%60 = add nsw i32 %53, 1
br label %61
61: ; preds = %51, %51, %59
%62 = phi i32 [ %60, %59 ], [ %53, %51 ], [ %53, %51 ]
%63 = add nuw nsw i64 %52, 1
%64 = tail call i32 @strlen(i8* %40)
%65 = sext i32 %64 to i64
%66 = icmp slt i64 %63, %65
br i1 %66, label %51, label %67
67: ; preds = %61, %48
%68 = phi i32 [ 0, %48 ], [ %62, %61 ]
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds i8, i8* %40, i64 %69
store i8 0, i8* %70
store i8* %40, i8** %2
br label %71
71: ; preds = %30, %67, %31, %34, %9, %12
%72 = phi i32 [ 0, %12 ], [ 0, %9 ], [ 1, %34 ], [ 1, %31 ], [ 2, %67 ], [ 1, %30 ]
ret i32 %72
}