char fwrite[0] = "\xffffffdc\xffffffd3";
char fclose[0] = "\xffffff94\xffffffd3";
char fread[0] = "\xffffffbc\xffffffd3";
char _assert[0] = "0\xffffffd3";
char printf[0] = "";
char fseek[0] = "\xffffffcc\xffffffd3";
char ftell[0] = "\xffffffd4\xffffffd3";
char strcmp[0] = " \xffffffd4";
char exit[0] = "\xffffff8c\xffffffd3";
char fprintf[0] = "\xffffffb0\xffffffd3";
char _iob[0] = "H\xffffffd3";
char _vsnprintf[0] = "h\xffffffd3";
char fopen[0] = "\xffffffa8\xffffffd3";
char free[0] = "\xffffffc4\xffffffd3";
char puts[0] = "\f\xffffffd4";

int proc2(int param2, int param4, int param3, int param4, int param5, int param6);
void proc3(int param1, int param3);
void proc5(int param1, int param2, int param4);
void proc6(int param1);
void proc7(int param1, int param2);
int proc9(int param1, int param2, int param3, int param4);
int proc10(int param1);

// address: 0x4012e0
int main(int argc, char **argv, char **envp) {
    char local0; 		// m[r28 - 102]{59}
    char local1; 		// m[r28 - 101]{83}
    int local10; 		// %pc{131}
    int local12; 		// %pc{112}
    int local14; 		// r26{190}
    int local15; 		// r28{39}
    int local16; 		// r29{227}
    int local17; 		// r29{102}
    int local18; 		// r27{102}
    int local19; 		// r24{118}
    int local2; 		// r28{226}
    int local20; 		// r31{102}
    int local21; 		// r30{102}
    int local22; 		// r24{78}
    int local23; 		// r24{51}
    int local24; 		// local7{211}
    int local25; 		// local2{226}
    int local26; 		// local16{227}
    char local28; 		// r10
    int local29; 		// r24
    int local3; 		// r28{158}
    int local30; 		// r25
    int local31; 		// r26
    int local32; 		// r27
    int local33; 		// r28
    int local34; 		// r29
    int local35; 		// r30
    int local36; 		// r31
    int local4; 		// r28{218}
    int local5; 		// r28{102}
    int local7; 		// %pc{211}
    int local8; 		// %pc{140}

    *(int*)(local33 - 4) = local34;
    local34 = local33 - 4;
    *(int*)(local33 - 8) = local36;
    *(int*)(local33 - 12) = local35;
    *(int*)(local33 - 16) = local32;
    *(int*)(local33 - 72) = 0x402060;
    *(int*)(local33 - 68) = 0x4058c4;
    *(int*)(local33 - 64) = local33 - 28;
    *(int*)(local33 - 60) = 0x401433;
    *(int*)(local33 - 56) = local33 - 140;
    *(int*)(local33 - 140) = local33 - 96;
    local26 = local34;
    local26 = local34;
    if (argc > 1) {
        *(char*)(local33 - 101) = 0;
        *(char*)(local33 - 102) = 0;
        *(char*)(local33 - 103) = 0;
        local31 = 1;
        local28 = 1;
        if (1 >= argc) {
L9:
            local29 = *(int*)(argv + 4);
            *(int*)(local33 - 136) = local29;
            *(int*)(local33 - 140) = local33 - 44;
            *(int*)(local33 - 92) = -1;
            local21 = proc2(local33 - 44, local29, local32, local33 - 4, local35, local36); /* Warning: also results in local30, local18, local5, local17, local20 */
            local26 = local17;
            if (*(int*)(local17 - 97) == 0) {
                if (*(int*)(local17 - 98) == 0) {
                    *(int*)local5 = local17 - 40;
                    *(int*)(local17 - 88) = 1;
                    proc7(local17 - 40, ZF);
                    local24 = local8;
                } else {
                    local19 = *(unsigned char*)(local17 - 99);
                    local29 = *(int*)(*(int*)(local17 + 12) + local19 * 4);
                    *(int*)(local5 + 4) = local29;
                    *(int*)local5 = local17 - 40;
                    *(int*)(local17 - 88) = 1;
                    proc5(local29, local17 - 40, ZF);
                    local24 = local10;
                }
            } else {
                *(int*)local5 = local17 - 40;
                *(int*)(local17 - 88) = 1;
                proc3(local17 - 40, ZF);
                local24 = local12;
            }
            local7 = local24;
            *(int*)(local17 - 88) = 1;
            *(int*)local5 = local17 - 40;
            if (*(int*)(local17 - 36) != 0) {
                *(int*)local5 = *(int*)(local17 - 36);
                *(int*)(local5 - 4) = local7;
                proc6(*(int*)(local17 - 36));
            }
            local4 = local5;
            *(int*)(local17 - 96) = 1;
            local25 = local4;
        } else {
            do {
                local23 = *(int*)(argv + local31 * 4);
                if (*(int*)local23 == 45) {
                    if (*(int*)(local23 + 1) != 111) {
                        local22 = *(int*)(argv + local31 * 4);
                        if (*(int*)(local22 + 1) == 120) {
                            local1 = 1;
                            goto L10;
                        }
                        goto L10;
                    }
                    local0 = 1;
                    *(char*)(local33 - 103) = local28 + 1;
                    if ((local28 + 1) >= argc) {
                        *(int*)(local33 - 140) = 0x407094;
                        puts("you have to add a filename to option -o\nlike: unpackkyra A_E.PAK -o ALGAE.CPS");
                        local25 = local3;
                        *(int*)(local33 - 100) = 0;
                        goto L0;
                    }
                    local31++;
                    goto L10;
                }
L10:
                local14 = local31;
                local31 = local14 + 1;
                local28 = (unsigned char) local14 + 1;
            } while (local14 + 1 < argc);
            goto L9;
        }
    } else {
        local29 = *argv;
        *(int*)(local33 - 136) = local29;
        *(int*)(local33 - 140) = 0x407000;
        *(int*)(local33 - 92) = -1;
        printf("Use:\n%s filename [OPTIONS]\nHere are the options, default is listing files to stdout\n-o xxx   Extract only file 'xxx'\n-x       Extract all files\n", local29);
        local25 = local15;
        *(int*)(local33 - 100) = 0;
    }
L0:
    local2 = local25;
    local16 = local26;
    *(int*)local2 = local16 - 92;
    return *(int*)(local16 - 96);
}

// address: 0x401530
int proc2(int param2, int param4, int param3, int param4, int param5, int param6) {
    int local1; 		// r24{33}
    int local10; 		// %pc{16}
    int local11; 		// local5{79}
    int local12; 		// %pc{81}
    int local13; 		// %pc{86}
    void *local14; 		// r24
    int local15; 		// r25
    int local17; 		// r28
    int local4; 		// %pc{38}
    int local5; 		// r28{79}
    int local8; 		// r28{27}
    int local9; 		// r28{17}

    *(int*)(local17 - 4) = param4;
    param4 = local17 - 4;
    *(int*)(local17 - 16) = param3;
    *(int*)(local17 - 12) = param5;
    *(int*)(local17 - 8) = param6;
    *(int*)(local17 - 40) = 0x4070e2;
    *(int*)(local17 - 44) = param4;
    local14 = fopen(param4, "rb");
    local11 = local9;
    local12 = local10;
    param3 = local14;
    if (local14 == NULL) {
        *(int*)(local17 - 40) = param4;
        *(int*)(local17 - 44) = 0x4070e5;
        local14 = proc9(0x4070e5, local14, local17 - 4, *(int*)(_iob + 64)); /* Warning: also results in param3, local8, param4 */
        local11 = local8;
    }
    local5 = local11;
    *(int*)param2 = 1;
    *(int*)local5 = local14;
    local1 = proc10(local14);
    *(int*)(param2 + 8) = local1;
    *(int*)local5 = local1;
    local14 = malloc(local1);
    local13 = local4;
    *(int*)(param2 + 4) = local14;
    if (local14 == NULL) {
        *(int*)local5 = 0x40710e;
        _assert(0x40710e);
    }
    *(int*)(local5 + 12) = param3;
    *(int*)local5 = local14;
    fread(local1, 1, param3, local14);
    *(int*)local5 = param3;
    fclose(param3);
    return *(int*)(param4 - 8); /* WARNING: Also returning: local15, *(int*)(param4 - 12), *(int*)param4, *(int*)(param4 - 4) */
}

// address: 0x4017b0
void proc3(int param1, int param3) {
    int local10; 		// m[r28 - 24]
    int local14; 		// r24{128}
    int local15; 		// %pc{109}
    int local17; 		// r30{168}
    int local18; 		// r24{78}
    int local19; 		// %pc{198}
    FILE *local20; 		// r24
    int local21; 		// r25
    int local22; 		// r26
    int local23; 		// r27
    int local24; 		// r28
    int local25; 		// r30

    local21 = *(int*)(param1 + 4);
    local22 = *(unsigned char*)(local21 + 3);
    local20 = *(unsigned char*)(local21 + 2);
    local22 = local22 * 0x1000000 + local20 * 0x10000;
    local20 = *(unsigned char*)(local21 + 1);
    local20 = local22 + local20 * 256 + *(unsigned char*)local21;
    local10 = local20;
    local25 = local21 + 4;
    for(;;) {
        local17 = local25;
        local21 = -1;
        do {
            if (local21 == 0) {
                goto L11;
            }
            local21 = local21 - 1;
        } while ( !param3);
L11:
        if (*(int*)local17 == 0) {
            goto L0;
        }
        local21 = local17 +  !local21 - 1;
        local22 = *(unsigned char*)(local21 + 4);
        local20 = *(unsigned char*)(local21 + 3);
        local22 = local22 * 0x1000000 + local20 * 0x10000;
        local18 = *(unsigned char*)(local21 + 2);
        local20 = *(unsigned char*)(local21 + 1);
        local23 = local22 + local18 * 256 + local20;
        if ((unsigned)*(int*)(param1 + 8) >= (unsigned)local23) {
            if (local23 == 0) {
                local23 = *(int*)(param1 + 8);
                goto L6;
            }
        } else {
            local23 = *(int*)(param1 + 8);
        }
L6:
        local25 = local21 + 5;
        local20 = fopen(local17, "wb");
        local19 = local15;
        if (local20 != NULL) {
            local14 = local10 + *(int*)(param1 + 4);
            fwrite(local14, local23 - local10, 1, local20);
            fclose(local20);
        }
        if (*(int*)(param1 + 8) == local23) {
L0:
            return;
        }
        local10 = local23;
    }
}

// address: 0x401696
void proc5(int param1, int param2, int param4) {
    int local10; 		// m[r28 - 24]
    int local12; 		// r24{140}
    int local15; 		// r27{186}
    int local16; 		// r24{78}
    FILE *local17; 		// r24
    int local18; 		// r25
    int local19; 		// r26
    int local20; 		// r27
    int local21; 		// r28
    int local22; 		// r31

    local18 = *(int*)(param1 + 4);
    local19 = *(unsigned char*)(local18 + 3);
    local17 = *(unsigned char*)(local18 + 2);
    local19 = local19 * 0x1000000 + local17 * 0x10000;
    local17 = *(unsigned char*)(local18 + 1);
    local17 = local19 + local17 * 256 + *(unsigned char*)local18;
    local10 = local17;
    local20 = local18 + 4;
    for(;;) {
        local15 = local20;
        local22 = local15;
        local18 = -1;
        do {
            if (local18 == 0) {
                goto L14;
            }
            local22++;
            local18 = local18 - 1;
        } while ( !param4);
L14:
        if (*(int*)local15 == 0) {
L1:
            printf("File '%s' not found in this pakfile\n", param2);
            goto L0;
        }
        local18 = local15 +  !local18 - 1;
        local19 = *(unsigned char*)(local18 + 4);
        local17 = *(unsigned char*)(local18 + 3);
        local19 = local19 * 0x1000000 + local17 * 0x10000;
        local16 = *(unsigned char*)(local18 + 2);
        local17 = *(unsigned char*)(local18 + 1);
        local22 = local19 + local16 * 256 + local17;
        if ((unsigned)*(int*)(param1 + 8) >= (unsigned)local22) {
            if (local22 == 0) {
                local22 = *(int*)(param1 + 8);
                goto L9;
            }
        } else {
            local22 = *(int*)(param1 + 8);
        }
L9:
        local20 = local18 + 5;
        local17 = strcmp(local15, param2);
        if (local17 == NULL) {
            break;
        }
        if (*(int*)(param1 + 8) == local22) {
            goto L1;
        }
        local10 = local22;
    }
    local17 = fopen(param2, "wb");
    if (local17 != NULL) {
        local12 = local10 + *(int*)(param1 + 4);
        fwrite(local12, local22 - local10, 1, local17);
        fclose(local17);
    }
L0:
    return;
}

// address: 0x4027e0
void proc6(int param1) {
    int local6; 		// r28

    if (param1 != 0) {
        free(param1);
    }
    return;
}

// address: 0x4015d8
void proc7(int param1, int param2) {
    int local11; 		// r30{146}
    int local12; 		// r24{87}
    int local13; 		// r24
    int local14; 		// r25
    int local15; 		// r26
    int local16; 		// r27
    int local17; 		// r28
    int local18; 		// r30
    int local9; 		// m[r28 - 24]

    local14 = *(int*)(param1 + 4);
    local15 = *(unsigned char*)(local14 + 3);
    local13 = *(unsigned char*)(local14 + 2);
    local15 = local15 * 0x1000000 + local13 * 0x10000;
    local13 = *(unsigned char*)(local14 + 1);
    local13 = local15 + local13 * 256 + *(unsigned char*)local14;
    local9 = local13;
    local18 = local14 + 4;
    for(;;) {
        local11 = local18;
        local14 = -1;
        do {
            if (local14 == 0) {
                goto L8;
            }
            local14 = local14 - 1;
        } while ( !param2);
L8:
        if (*(int*)local11 == 0) {
            break;
        }
        local14 = local11 +  !local14 - 1;
        local15 = *(unsigned char*)(local14 + 4);
        local13 = *(unsigned char*)(local14 + 3);
        local15 = local15 * 0x1000000 + local13 * 0x10000;
        local13 = *(unsigned char*)(local14 + 2);
        local12 = *(unsigned char*)(local14 + 1);
        local16 = local15 + local13 * 256 + local12;
        if ((unsigned)*(int*)(param1 + 8) >= (unsigned)local16) {
            if (local16 == 0) {
                local16 = *(int*)(param1 + 8);
                goto L3;
            }
        } else {
            local16 = *(int*)(param1 + 8);
        }
L3:
        local18 = local14 + 5;
        printf("Filename: %s size: %d\n", local11, local16 - local9);
        if (*(int*)(param1 + 8) == local16) {
            break;
        }
        local9 = local16;
    }
    return;
}

// address: 0x4018a0
int proc9(int param1, int param2, int param3, int param4) {
    int local0; 		// m[r28 - 0x41c]{31}
    char *local4; 		// r24
    char *local7; 		// r28

    *(int*)(local7 - 4) = param3;
    *(int*)(local7 - 8) = param2;
    *(int*)(local7 - 1040) = local7 + 8;
    *(int*)(local7 - 1044) = param1;
    *(int*)(local7 - 1048) = 1024;
    *(char **)(local7 - 1052) = local7 - 1036;
    _vsnprintf(local7 - 1036, 1024, param1, local7 + 8);
    *(int*)(local7 - 1044) = local7 - 1036;
    *(int*)(local7 - 1048) = 0x407160;
    *(int*)(local7 - 1052) = _iob + 64;
    fprintf(_iob + 64, "ERROR: %s!\n", local7 - 1036);
    local0 = 1;
    exit(1);
    return local4; /* WARNING: Also returning: local7 - 1036, local7 - 4 */
}

// address: 0x401bc1
int proc10(int param1) {
    int local13; 		// r24
    int local16; 		// r28
    int local9; 		// r24{15}

    local9 = ftell(param1);
    fseek(param1, 0, 2);
    local13 = ftell(param1);
    fseek(param1, local9, 0);
    return local13;
}

