#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*/ isdigit(char);
double strtod(char *, char **);
int dms_to_degrees(char *decs, double *dec) {
  char *endp;
  double d = 0.0, m = 0.0, s = 0.0;
  int i;
  double sign = 1.0;
  for (i = 0; decs[i] == ' ' && decs[i] != 0; i++)
    ;
  if (decs[i] == '-') {
    sign = -1.0;
    i++;
  }
  d = strtod(decs + i, &endp);
  if (endp == decs + i) {
    return -1;
  }
  for (i = endp - decs; decs[i] && !isdigit(decs[i]); i++)
    ;
  m = strtod(decs + i, &endp);
  if (endp == decs + i) {
    *dec = d * sign;
    return 0;
  }
  for (i = endp - decs; decs[i] && !isdigit(decs[i]); i++)
    ;
  s = strtod(decs + i, &endp);
  if (endp == decs + i) {
    *dec = (d + m / 60.0) * sign;
    return 0;
  }
  *dec = (d + m / 60.0 + s / 3600.0) * sign;
  return 0;
}


x86 assembly (clang, -O0):
<dms_to_degrees>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xeb0(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x49(%rbp)
jne    118b <dms_to_degrees+0x6b>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%al
test   $0x1,%al
jne    119b <dms_to_degrees+0x7b>
jmp    11ae <dms_to_degrees+0x8e>
jmp    11a0 <dms_to_degrees+0x80>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    115c <dms_to_degrees+0x3c>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    11d9 <dms_to_degrees+0xb9>
movsd  0xe3d(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rdi
movslq -0x3c(%rbp),%rax
add    %rax,%rdi
lea    -0x20(%rbp),%rsi
call   1040 <strtod@plt>
movsd  %xmm0,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jne    1216 <dms_to_degrees+0xf6>
movl   $0xffffffff,-0x4(%rbp)
jmp    13da <dms_to_degrees+0x2ba>
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x4a(%rbp)
je     125a <dms_to_degrees+0x13a>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
mov    %al,-0x4a(%rbp)
mov    -0x4a(%rbp),%al
test   $0x1,%al
jne    126a <dms_to_degrees+0x14a>
jmp    127d <dms_to_degrees+0x15d>
jmp    126f <dms_to_degrees+0x14f>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1224 <dms_to_degrees+0x104>
mov    -0x10(%rbp),%rdi
movslq -0x3c(%rbp),%rax
add    %rax,%rdi
lea    -0x20(%rbp),%rsi
call   1040 <strtod@plt>
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jne    12cc <dms_to_degrees+0x1ac>
movsd  -0x28(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    13da <dms_to_degrees+0x2ba>
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x4b(%rbp)
je     1310 <dms_to_degrees+0x1f0>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
mov    %al,-0x4b(%rbp)
mov    -0x4b(%rbp),%al
test   $0x1,%al
jne    1320 <dms_to_degrees+0x200>
jmp    1333 <dms_to_degrees+0x213>
jmp    1325 <dms_to_degrees+0x205>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    12da <dms_to_degrees+0x1ba>
mov    -0x10(%rbp),%rdi
movslq -0x3c(%rbp),%rax
add    %rax,%rdi
lea    -0x20(%rbp),%rsi
call   1040 <strtod@plt>
movsd  %xmm0,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jne    1397 <dms_to_degrees+0x277>
movsd  -0x28(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
movsd  0xca2(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    13da <dms_to_degrees+0x2ba>
movsd  -0x28(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
movsd  0xc6f(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  0xc52(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dms_to_degrees>:
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rsi,%r14
mov    %rdi,%r15
mov    $0xffffffffffffffff,%rax
nopl   0x0(%rax,%rax,1)
movzbl 0x1(%r15,%rax,1),%ebx
add    $0x1,%rax
cmp    $0x20,%bl
je     1140 <dms_to_degrees+0x20>
xor    %r12d,%r12d
cmp    $0x2d,%bl
sete   %r12b
add    %eax,%r12d
add    %r15,%r12
mov    %rsp,%rsi
mov    %r12,%rdi
call   1040 <strtod@plt>
mov    (%rsp),%rax
cmp    %r12,%rax
je     1248 <dms_to_degrees+0x128>
sub    %r15d,%eax
movslq %eax,%r12
mov    (%r15,%r12,1),%al
test   %al,%al
movapd %xmm0,0x10(%rsp)
je     11aa <dms_to_degrees+0x8a>
nopl   0x0(%rax,%rax,1)
movsbl %al,%edi
call   1030 <isdigit@plt>
test   %eax,%eax
jne    11aa <dms_to_degrees+0x8a>
movzbl 0x1(%r15,%r12,1),%eax
add    $0x1,%r12
test   %al,%al
jne    1190 <dms_to_degrees+0x70>
add    %r15,%r12
mov    %rsp,%rsi
mov    %r12,%rdi
call   1040 <strtod@plt>
mov    (%rsp),%rax
cmp    %r12,%rax
je     1259 <dms_to_degrees+0x139>
sub    %r15d,%eax
movslq %eax,%r12
mov    (%r15,%r12,1),%al
test   %al,%al
movsd  %xmm0,0x8(%rsp)
je     11fa <dms_to_degrees+0xda>
nopl   0x0(%rax)
movsbl %al,%edi
call   1030 <isdigit@plt>
test   %eax,%eax
jne    11fa <dms_to_degrees+0xda>
movzbl 0x1(%r15,%r12,1),%eax
add    $0x1,%r12
test   %al,%al
jne    11e0 <dms_to_degrees+0xc0>
add    %r12,%r15
mov    %rsp,%rsi
mov    %r15,%rdi
call   1040 <strtod@plt>
movsd  0x8(%rsp),%xmm2
divsd  0xdea(%rip),%xmm2
movapd 0x10(%rsp),%xmm1
addsd  %xmm2,%xmm1
cmp    %r15,(%rsp)
je     1232 <dms_to_degrees+0x112>
divsd  0xdda(%rip),%xmm0
addsd  %xmm0,%xmm1
cmp    $0x2d,%bl
jne    123f <dms_to_degrees+0x11f>
xorpd  0xdd1(%rip),%xmm1
movsd  %xmm1,(%r14)
xor    %eax,%eax
jmp    124d <dms_to_degrees+0x12d>
mov    $0xffffffff,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret
movapd 0x10(%rsp),%xmm1
cmp    $0x2d,%bl
je     1237 <dms_to_degrees+0x117>
jmp    123f <dms_to_degrees+0x11f>

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

LLVM IR (-O2):
define i32 @dms_to_degrees(i8* %0, double* nocapture writeonly %1) {
%3 = alloca i8*
%4 = bitcast i8** %3 to i8*
br label %5
5: ; preds = %5, %2
%6 = phi i64 [ %10, %5 ], [ 0, %2 ]
%7 = getelementptr inbounds i8, i8* %0, i64 %6
%8 = load i8, i8* %7
%9 = icmp eq i8 %8, 32
%10 = add nuw i64 %6, 1
br i1 %9, label %5, label %11
11: ; preds = %5
%12 = icmp eq i8 %8, 45
%13 = zext i1 %12 to i64
%14 = add i64 %6, %13
%15 = and i64 %14, 4294967295
%16 = getelementptr inbounds i8, i8* %0, i64 %15
%17 = call double @strtod(i8* %16, i8** %3)
%18 = load i8*, i8** %3
%19 = icmp eq i8* %18, %16
br i1 %19, label %78, label %20
20: ; preds = %11
%21 = ptrtoint i8* %18 to i64
%22 = ptrtoint i8* %0 to i64
%23 = sub i64 %21, %22
%24 = shl i64 %23, 32
%25 = ashr exact i64 %24, 32
%26 = getelementptr inbounds i8, i8* %0, i64 %25
%27 = load i8, i8* %26
%28 = icmp eq i8 %27, 0
br i1 %28, label %39, label %33
29: ; preds = %33
%30 = getelementptr inbounds i8, i8* %0, i64 %38
%31 = load i8, i8* %30
%32 = icmp eq i8 %31, 0
br i1 %32, label %39, label %33
33: ; preds = %20, %29
%34 = phi i64 [ %38, %29 ], [ %25, %20 ]
%35 = phi i8 [ %31, %29 ], [ %27, %20 ]
%36 = tail call i32 @isdigit(i8 signext %35)
%37 = icmp eq i32 %36, 0
%38 = add i64 %34, 1
br i1 %37, label %29, label %39
39: ; preds = %33, %29, %20
%40 = phi i64 [ %25, %20 ], [ %38, %29 ], [ %34, %33 ]
%41 = getelementptr inbounds i8, i8* %0, i64 %40
%42 = call double @strtod(i8* %41, i8** %3)
%43 = load i8*, i8** %3
%44 = icmp eq i8* %43, %41
br i1 %44, label %74, label %45
45: ; preds = %39
%46 = ptrtoint i8* %43 to i64
%47 = sub i64 %46, %22
%48 = shl i64 %47, 32
%49 = ashr exact i64 %48, 32
%50 = getelementptr inbounds i8, i8* %0, i64 %49
%51 = load i8, i8* %50
%52 = icmp eq i8 %51, 0
br i1 %52, label %63, label %57
53: ; preds = %57
%54 = getelementptr inbounds i8, i8* %0, i64 %62
%55 = load i8, i8* %54
%56 = icmp eq i8 %55, 0
br i1 %56, label %63, label %57
57: ; preds = %45, %53
%58 = phi i64 [ %62, %53 ], [ %49, %45 ]
%59 = phi i8 [ %55, %53 ], [ %51, %45 ]
%60 = tail call i32 @isdigit(i8 signext %59)
%61 = icmp eq i32 %60, 0
%62 = add i64 %58, 1
br i1 %61, label %53, label %63
63: ; preds = %57, %53, %45
%64 = phi i64 [ %49, %45 ], [ %62, %53 ], [ %58, %57 ]
%65 = getelementptr inbounds i8, i8* %0, i64 %64
%66 = call double @strtod(i8* %65, i8** %3)
%67 = load i8*, i8** %3
%68 = icmp eq i8* %67, %65
%69 = fdiv double %42, 6.000000e+01
%70 = fadd double %17, %69
br i1 %68, label %74, label %71
71: ; preds = %63
%72 = fdiv double %66, 3.600000e+03
%73 = fadd double %70, %72
br label %74
74: ; preds = %63, %39, %71
%75 = phi double [ %73, %71 ], [ %17, %39 ], [ %70, %63 ]
%76 = fneg double %75
%77 = select i1 %12, double %76, double %75
store double %77, double* %1
br label %78
78: ; preds = %74, %11
%79 = phi i32 [ -1, %11 ], [ 0, %74 ]
ret i32 %79
}