#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 */
unsigned char *get_asn_dbtag(unsigned char *, char *, size_t, char *, size_t,
                             int *);
unsigned char *get_asn_int(unsigned char *, int *);
unsigned char *get_asn_local_id(unsigned char *, char *, size_t);
unsigned char *get_asn_pdb_id(unsigned char *, char *, size_t, char *, size_t);
unsigned char *get_asn_textseq_id(unsigned char *, char *, size_t, char *,
                                  size_t);
unsigned char *get_asn_db_info(unsigned char *abp, int db_type, int *gi_p,
                               char *name, size_t name_len, char *acc,
                               size_t acc_len) {
  int seq_cnt = 0, itmp;
  if (db_type == 11) {
    abp = get_asn_int(abp, gi_p);
    return abp;
  }
  while (*abp == 0x30) {
    abp += 2;
    seq_cnt++;
  }
  switch (db_type) {
  case 0:
    abp = get_asn_local_id(abp, acc, acc_len);
    break;
  case 1:
  case 2:
    abp = get_asn_int(abp, gi_p);
    break;
  case 11:
    abp = get_asn_int(abp + 2, gi_p);
    break;
  case 4:
  case 5:
  case 6:
  case 7:
  case 9:
  case 12:
  case 13:
  case 15:
  case 16:
  case 17:
    abp = get_asn_textseq_id(abp, name, name_len, acc, acc_len);
    break;
  case 10:
    abp = get_asn_dbtag(abp, name, name_len, acc, acc_len, &itmp);
    break;
  case 14:
    abp = get_asn_pdb_id(abp, acc, acc_len, name, name_len);
    break;
  default:
    abp += 2;
  }
  while (seq_cnt-- > 0) {
    abp += 4;
  }
  return abp;
}


x86 assembly (clang, -O0):
<get_asn_db_info>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0xb,-0x14(%rbp)
jne    11a2 <get_asn_db_info+0x52>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1040 <get_asn_int@plt>
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    12e8 <get_asn_db_info+0x198>
jmp    11a7 <get_asn_db_info+0x57>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x30,%eax
jne    11d1 <get_asn_db_info+0x81>
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11a7 <get_asn_db_info+0x57>
mov    -0x14(%rbp),%eax
mov    %rax,-0x48(%rbp)
sub    $0x11,%rax
ja     12aa <get_asn_db_info+0x15a>
mov    -0x48(%rbp),%rax
lea    0xe13(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rdi
mov    -0x38(%rbp),%rsi
mov    0x10(%rbp),%rdx
call   1030 <get_asn_local_id@plt>
mov    %rax,-0x10(%rbp)
jmp    12b6 <get_asn_db_info+0x166>
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1040 <get_asn_int@plt>
mov    %rax,-0x10(%rbp)
jmp    12b6 <get_asn_db_info+0x166>
mov    -0x10(%rbp),%rdi
add    $0x2,%rdi
mov    -0x20(%rbp),%rsi
call   1040 <get_asn_int@plt>
mov    %rax,-0x10(%rbp)
jmp    12b6 <get_asn_db_info+0x166>
mov    -0x10(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0x30(%rbp),%rdx
mov    -0x38(%rbp),%rcx
mov    0x10(%rbp),%r8
call   1060 <get_asn_textseq_id@plt>
mov    %rax,-0x10(%rbp)
jmp    12b6 <get_asn_db_info+0x166>
mov    -0x10(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0x30(%rbp),%rdx
mov    -0x38(%rbp),%rcx
mov    0x10(%rbp),%r8
lea    -0x40(%rbp),%r9
call   1070 <get_asn_dbtag@plt>
mov    %rax,-0x10(%rbp)
jmp    12b6 <get_asn_db_info+0x166>
mov    -0x10(%rbp),%rdi
mov    -0x38(%rbp),%rsi
mov    0x10(%rbp),%rdx
mov    -0x28(%rbp),%rcx
mov    -0x30(%rbp),%r8
call   1050 <get_asn_pdb_id@plt>
mov    %rax,-0x10(%rbp)
jmp    12b6 <get_asn_db_info+0x166>
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    12bb <get_asn_db_info+0x16b>
mov    -0x3c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x3c(%rbp)
cmp    $0x0,%eax
jle    12e0 <get_asn_db_info+0x190>
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
jmp    12bb <get_asn_db_info+0x16b>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_asn_db_info>:
cmp    $0xb,%esi
jne    115d <get_asn_db_info+0xd>
mov    %rdx,%rsi
jmp    1040 <get_asn_int@plt>
push   %rbx
sub    $0x10,%rsp
xor    %ebx,%ebx
cmpb   $0x30,(%rdi)
jne    1182 <get_asn_db_info+0x32>
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
lea    0x2(%rdi),%rax
add    $0x1,%ebx
cmpb   $0x30,0x2(%rdi)
mov    %rax,%rdi
je     1170 <get_asn_db_info+0x20>
jmp    1185 <get_asn_db_info+0x35>
mov    %rdi,%rax
cmp    $0x11,%esi
ja     11cf <get_asn_db_info+0x7f>
mov    0x20(%rsp),%r10
mov    %esi,%esi
lea    0xe68(%rip),%rdi
movslq (%rdi,%rsi,4),%rsi
add    %rdi,%rsi
jmp    *%rsi
mov    %rax,%rdi
mov    %rcx,%rsi
mov    %r8,%rdx
mov    %r9,%rcx
mov    %r10,%r8
call   1060 <get_asn_textseq_id@plt>
test   %ebx,%ebx
jg     120e <get_asn_db_info+0xbe>
jmp    1219 <get_asn_db_info+0xc9>
mov    %rax,%rdi
mov    %r9,%rsi
mov    %r10,%rdx
call   1030 <get_asn_local_id@plt>
test   %ebx,%ebx
jg     120e <get_asn_db_info+0xbe>
jmp    1219 <get_asn_db_info+0xc9>
add    $0x2,%rax
test   %ebx,%ebx
jg     120e <get_asn_db_info+0xbe>
jmp    1219 <get_asn_db_info+0xc9>
lea    0xc(%rsp),%r11
mov    %rax,%rdi
mov    %rcx,%rsi
mov    %r8,%rdx
mov    %r9,%rcx
mov    %r10,%r8
mov    %r11,%r9
call   1070 <get_asn_dbtag@plt>
test   %ebx,%ebx
jg     120e <get_asn_db_info+0xbe>
jmp    1219 <get_asn_db_info+0xc9>
add    $0x2,%rax
mov    %rax,%rdi
mov    %rdx,%rsi
call   1040 <get_asn_int@plt>
test   %ebx,%ebx
jle    1219 <get_asn_db_info+0xc9>
add    $0xffffffff,%ebx
lea    (%rax,%rbx,4),%rax
add    $0x4,%rax
add    $0x10,%rsp
pop    %rbx
ret
mov    %rax,%rdi
mov    %r9,%rsi
mov    %r10,%rdx
call   1050 <get_asn_pdb_id@plt>
test   %ebx,%ebx
jg     120e <get_asn_db_info+0xbe>
jmp    1219 <get_asn_db_info+0xc9>

LLVM IR (-O0):
define i8* @get_asn_db_info(i8* %0, i32 %1, i32* %2, i8* %3, i64 %4, i8* %5, i64 %6) {
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i32
%11 = alloca i32*
%12 = alloca i8*
%13 = alloca i64
%14 = alloca i8*
%15 = alloca i64
%16 = alloca i32
%17 = alloca i32
store i8* %0, i8** %9
store i32 %1, i32* %10
store i32* %2, i32** %11
store i8* %3, i8** %12
store i64 %4, i64* %13
store i8* %5, i8** %14
store i64 %6, i64* %15
store i32 0, i32* %16
%18 = load i32, i32* %10
%19 = icmp eq i32 %18, 11
br i1 %19, label %20, label %25
20: ; preds = %7
%21 = load i8*, i8** %9
%22 = load i32*, i32** %11
%23 = call i8* @get_asn_int(i8* %21, i32* %22)
store i8* %23, i8** %9
%24 = load i8*, i8** %9
store i8* %24, i8** %8
br label %86
25: ; preds = %7
br label %26
26: ; preds = %31, %25
%27 = load i8*, i8** %9
%28 = load i8, i8* %27
%29 = zext i8 %28 to i32
%30 = icmp eq i32 %29, 48
br i1 %30, label %31, label %36
31: ; preds = %26
%32 = load i8*, i8** %9
%33 = getelementptr inbounds i8, i8* %32, i64 2
store i8* %33, i8** %9
%34 = load i32, i32* %16
%35 = add nsw i32 %34, 1
store i32 %35, i32* %16
br label %26
36: ; preds = %26
%37 = load i32, i32* %10
switch i32 %37, label %73 [
i32 0, label %38
i32 1, label %43
i32 2, label %43
i32 11, label %47
i32 4, label %52
i32 5, label %52
i32 6, label %52
i32 7, label %52
i32 9, label %52
i32 12, label %52
i32 13, label %52
i32 15, label %52
i32 16, label %52
i32 17, label %52
i32 10, label %59
i32 14, label %66
]
38: ; preds = %36
%39 = load i8*, i8** %9
%40 = load i8*, i8** %14
%41 = load i64, i64* %15
%42 = call i8* @get_asn_local_id(i8* %39, i8* %40, i64 %41)
store i8* %42, i8** %9
br label %76
43: ; preds = %36, %36
%44 = load i8*, i8** %9
%45 = load i32*, i32** %11
%46 = call i8* @get_asn_int(i8* %44, i32* %45)
store i8* %46, i8** %9
br label %76
47: ; preds = %36
%48 = load i8*, i8** %9
%49 = getelementptr inbounds i8, i8* %48, i64 2
%50 = load i32*, i32** %11
%51 = call i8* @get_asn_int(i8* %49, i32* %50)
store i8* %51, i8** %9
br label %76
52: ; preds = %36, %36, %36, %36, %36, %36, %36, %36, %36, %36
%53 = load i8*, i8** %9
%54 = load i8*, i8** %12
%55 = load i64, i64* %13
%56 = load i8*, i8** %14
%57 = load i64, i64* %15
%58 = call i8* @get_asn_textseq_id(i8* %53, i8* %54, i64 %55, i8* %56, i64 %57)
store i8* %58, i8** %9
br label %76
59: ; preds = %36
%60 = load i8*, i8** %9
%61 = load i8*, i8** %12
%62 = load i64, i64* %13
%63 = load i8*, i8** %14
%64 = load i64, i64* %15
%65 = call i8* @get_asn_dbtag(i8* %60, i8* %61, i64 %62, i8* %63, i64 %64, i32* %17)
store i8* %65, i8** %9
br label %76
66: ; preds = %36
%67 = load i8*, i8** %9
%68 = load i8*, i8** %14
%69 = load i64, i64* %15
%70 = load i8*, i8** %12
%71 = load i64, i64* %13
%72 = call i8* @get_asn_pdb_id(i8* %67, i8* %68, i64 %69, i8* %70, i64 %71)
store i8* %72, i8** %9
br label %76
73: ; preds = %36
%74 = load i8*, i8** %9
%75 = getelementptr inbounds i8, i8* %74, i64 2
store i8* %75, i8** %9
br label %76
76: ; preds = %73, %66, %59, %52, %47, %43, %38
br label %77
77: ; preds = %81, %76
%78 = load i32, i32* %16
%79 = add nsw i32 %78, -1
store i32 %79, i32* %16
%80 = icmp sgt i32 %78, 0
br i1 %80, label %81, label %84
81: ; preds = %77
%82 = load i8*, i8** %9
%83 = getelementptr inbounds i8, i8* %82, i64 4
store i8* %83, i8** %9
br label %77
84: ; preds = %77
%85 = load i8*, i8** %9
store i8* %85, i8** %8
br label %86
86: ; preds = %84, %20
%87 = load i8*, i8** %8
ret i8* %87
}

LLVM IR (-O2):
define i8* @get_asn_db_info(i8* %0, i32 %1, i32* %2, i8* %3, i64 %4, i8* %5, i64 %6) {
%8 = alloca i32
%9 = bitcast i32* %8 to i8*
%10 = icmp eq i32 %1, 11
br i1 %10, label %14, label %11
11: ; preds = %7
%12 = load i8, i8* %0
%13 = icmp eq i8 %12, 48
br i1 %13, label %16, label %23
14: ; preds = %7
%15 = tail call i8* @get_asn_int(i8* %0, i32* %2)
br label %50
16: ; preds = %11, %16
%17 = phi i32 [ %20, %16 ], [ 0, %11 ]
%18 = phi i8* [ %19, %16 ], [ %0, %11 ]
%19 = getelementptr inbounds i8, i8* %18, i64 2
%20 = add nuw nsw i32 %17, 1
%21 = load i8, i8* %19
%22 = icmp eq i8 %21, 48
br i1 %22, label %16, label %23
23: ; preds = %16, %11
%24 = phi i8* [ %0, %11 ], [ %19, %16 ]
%25 = phi i32 [ 0, %11 ], [ %20, %16 ]
switch i32 %1, label %39 [
i32 0, label %26
i32 1, label %28
i32 2, label %28
i32 11, label %30
i32 4, label %33
i32 5, label %33
i32 6, label %33
i32 7, label %33
i32 9, label %33
i32 12, label %33
i32 13, label %33
i32 15, label %33
i32 16, label %33
i32 17, label %33
i32 10, label %35
i32 14, label %37
]
26: ; preds = %23
%27 = tail call i8* @get_asn_local_id(i8* %24, i8* %5, i64 %6)
br label %41
28: ; preds = %23, %23
%29 = tail call i8* @get_asn_int(i8* %24, i32* %2)
br label %41
30: ; preds = %23
%31 = getelementptr inbounds i8, i8* %24, i64 2
%32 = tail call i8* @get_asn_int(i8* %31, i32* %2)
br label %41
33: ; preds = %23, %23, %23, %23, %23, %23, %23, %23, %23, %23
%34 = tail call i8* @get_asn_textseq_id(i8* %24, i8* %3, i64 %4, i8* %5, i64 %6)
br label %41
35: ; preds = %23
%36 = call i8* @get_asn_dbtag(i8* %24, i8* %3, i64 %4, i8* %5, i64 %6, i32* %8)
br label %41
37: ; preds = %23
%38 = tail call i8* @get_asn_pdb_id(i8* %24, i8* %5, i64 %6, i8* %3, i64 %4)
br label %41
39: ; preds = %23
%40 = getelementptr inbounds i8, i8* %24, i64 2
br label %41
41: ; preds = %39, %37, %35, %33, %30, %28, %26
%42 = phi i8* [ %40, %39 ], [ %38, %37 ], [ %36, %35 ], [ %34, %33 ], [ %32, %30 ], [ %29, %28 ], [ %27, %26 ]
%43 = icmp sgt i32 %25, 0
br i1 %43, label %44, label %50
44: ; preds = %41
%45 = add nsw i32 %25, -1
%46 = zext i32 %45 to i64
%47 = shl nuw nsw i64 %46, 2
%48 = add nuw nsw i64 %47, 4
%49 = getelementptr i8, i8* %42, i64 %48
br label %50
50: ; preds = %44, %41, %14
%51 = phi i8* [ %15, %14 ], [ %42, %41 ], [ %49, %44 ]
ret i8* %51
}