// // This file was generated by the Retargetable Decompiler // Website: https://retdec.com // Copyright (c) 2017 Retargetable Decompiler // #include #include #include #include #include #include // ---------------- Integer Types Definitions ----------------- typedef int8_t int2_t; // ----------------- Float Types Definitions ------------------ typedef float float32_t; // ------------------------ Structures ------------------------ struct ProgramVars { int32_t e0; }; struct _IO_FILE { int32_t e0; }; struct _Unwind_Context { int32_t e0; }; struct _Unwind_Context_1 { int32_t e0; }; struct __EIT_entry { int32_t e0; int32_t e1; }; struct anon_struct_0 { int32_t e0; int32_t e1; int32_t e2; int32_t e3; int32_t e4; }; struct anon_struct_1 { int32_t e0; int32_t e1[5]; }; struct anon_struct_10 { int32_t e0; int32_t e1[5]; }; struct anon_struct_11 { int32_t e0[4]; }; struct anon_struct_12 { int32_t e0; int32_t * e1; int32_t e2; int32_t e3; }; struct anon_struct_13 { int32_t e0; int32_t * e1; char e2; char e3; }; struct anon_struct_2 { int32_t e0[4]; }; struct anon_struct_3 { int32_t e0; int32_t * e1; int32_t e2; int32_t e3; }; struct _Unwind_Control_Block { char e0[8]; void (*e1)(int32_t, struct _Unwind_Control_Block *); struct anon_struct_0 e2; struct anon_struct_1 e3; struct anon_struct_2 e4; struct anon_struct_3 e5; }; struct anon_struct_4 { int32_t e0; int32_t * e1; char e2; char e3; }; struct anon_struct_9 { int32_t e0; int32_t e1; int32_t e2; int32_t e3; int32_t e4; }; struct _Unwind_Control_Block_1 { char e0[8]; void (*e1)(int32_t, struct _Unwind_Control_Block_1 *); struct anon_struct_9 e2; struct anon_struct_10 e3; struct anon_struct_11 e4; struct anon_struct_12 e5; }; struct core_regs { int32_t e0[16]; }; struct anon_struct_6 { int32_t e0; struct core_regs e1; }; struct vfp_regs { int64_t e0[16]; int32_t e1; }; struct vfpv3_regs { int64_t e0[16]; }; struct vtable_1e0e0_type { int32_t (*e0)(int32_t, int32_t, int32_t *); }; struct wmmxc_regs { int32_t e0[4]; }; struct wmmxd_regs { int64_t e0[16]; }; struct anon_struct_5 { int32_t e0; struct core_regs e1; int32_t e2; struct vfp_regs e3; struct vfpv3_regs e4; struct wmmxd_regs e5; struct wmmxc_regs e6; }; // ------------------------- Classes -------------------------- // PLAYER // ------------------- Function Prototypes -------------------- int32_t ___Unwind_Backtrace(int32_t (*a1)(struct _Unwind_Context *, char *), char * a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13); int32_t ___Unwind_Resume(struct _Unwind_Control_Block * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13); int32_t ___Unwind_Resume_or_Rethrow(struct _Unwind_Control_Block * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13); void __aeabi_idiv(void); int32_t __aeabi_idivmod(int32_t a1, int32_t a2); int32_t __aeabi_uidivmod(uint32_t a1, uint32_t a2); int32_t __aeabi_unwind_cpp_pr0(int32_t state, struct _Unwind_Control_Block * ucbp, struct _Unwind_Context * context); int32_t __aeabi_unwind_cpp_pr1(int32_t state, struct _Unwind_Control_Block * ucbp, struct _Unwind_Context * context); int32_t __aeabi_unwind_cpp_pr2(int32_t state, struct _Unwind_Control_Block * ucbp, struct _Unwind_Context * context); void __atexit_handler_wrapper(int32_t a1); void __gnu_unwind_24bit(struct _Unwind_Context * context, int32_t data, int32_t compact); int32_t __gnu_Unwind_Backtrace(int32_t (*trace)(struct _Unwind_Context *, char *), char * trace_argument, struct anon_struct_6 * entry_vrs); int32_t __gnu_unwind_execute(struct _Unwind_Context_1 * context, struct anon_struct_13 * uws); int32_t __gnu_Unwind_ForcedUnwind(struct _Unwind_Control_Block * ucbp, int32_t (*stop_fn)(int32_t, int32_t, char *, struct _Unwind_Control_Block *, struct _Unwind_Context *, char *), char * stop_arg, struct anon_struct_6 * entry_vrs); int32_t __gnu_unwind_frame(struct _Unwind_Control_Block_1 * ucbp, struct _Unwind_Context_1 * context); int32_t __gnu_unwind_get_pr_addr(int32_t idx); int32_t __gnu_unwind_pr_common(uint32_t state, struct _Unwind_Control_Block * ucbp, struct _Unwind_Context * context, int32_t id); int32_t __gnu_Unwind_RaiseException(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * entry_vrs); void __gnu_Unwind_Restore_VFP(void); void __gnu_Unwind_Restore_VFP_D(void); void __gnu_Unwind_Restore_VFP_D_16_to_31(void); void __gnu_Unwind_Restore_WMMXC(void); void __gnu_Unwind_Restore_WMMXD(void); int32_t __gnu_Unwind_Resume(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * entry_vrs); int32_t __gnu_Unwind_Resume_or_Rethrow(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * entry_vrs); void __gnu_Unwind_Save_VFP(void); void __gnu_Unwind_Save_VFP_D(void); void __gnu_Unwind_Save_VFP_D_16_to_31(void); void __gnu_Unwind_Save_WMMXC(void); void __gnu_Unwind_Save_WMMXD(void); int32_t __udivsi3(int32_t result); int32_t _start(int32_t a1, int32_t a2, int32_t a3); void _Unwind_Complete(struct _Unwind_Control_Block * ucbp); void _Unwind_DebugHook(char * cfa, char * handler); void _Unwind_decode_typeinfo_ptr(int32_t base, int32_t ptr); void _Unwind_DeleteException(struct _Unwind_Control_Block * exc); int32_t _Unwind_ForcedUnwind(struct _Unwind_Control_Block * a1, int32_t (*a2)(int32_t, int32_t, char *, struct _Unwind_Control_Block *, struct _Unwind_Context *, char *), char * a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13); int32_t _Unwind_GetCFA(struct _Unwind_Context * context); int32_t _Unwind_GetDataRelBase(struct _Unwind_Context_1 * context); int32_t _Unwind_GetGR(struct _Unwind_Context * context, int32_t regno); void _Unwind_GetGR_1(struct _Unwind_Context_1 * context, int32_t regno); char * _Unwind_GetLanguageSpecificData(struct _Unwind_Context_1 * context); int32_t _Unwind_GetRegionStart(struct _Unwind_Context_1 * context); int32_t _Unwind_GetTextRelBase(struct _Unwind_Context_1 * context); int32_t _Unwind_RaiseException(struct _Unwind_Control_Block * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13); void _Unwind_SetGR(struct _Unwind_Context * context, int32_t regno, int32_t val); int32_t _Unwind_VRS_Get(struct _Unwind_Context * context, int32_t regclass, int32_t regno, int32_t representation, char * valuep); int32_t _Unwind_VRS_Pop(struct _Unwind_Context * context, int32_t regclass, int32_t discriminator, int32_t representation); int32_t _Unwind_VRS_Set(struct _Unwind_Context * context, uint32_t regclass, int32_t regno, int32_t representation, char * valuep); int32_t assign_script_value(int32_t * a1, char * a2, int32_t a3, int32_t result); int32_t check_exact_symbol_match(int32_t a1, int32_t a2, int32_t a3); int32_t code_labels_setting_handler(char * str, int32_t a2, int32_t a3); int32_t compare_ELF_symbols(int32_t * a1, int32_t * a2); int32_t concatenate(int32_t * a1, int32_t * a2, char * a3, int32_t a4); int64_t convert_string_to_number(char * str, int32_t a2); int32_t copy_script_value(char * a1, char a2, int32_t a3, char * a4); int32_t data_labels_setting_handler(char * str, int32_t a2, int32_t a3); int32_t destroy_ELF_symbols(char * a1, int32_t a2); void destroy_script_value(int32_t a1); int32_t destroy_script_variables(char * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6); int32_t destroy_string_array(char * a1, int32_t a2, int32_t a3, int32_t a4); int32_t dump_data_line_as_text(struct _IO_FILE * stream, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9); int32_t dump_incbin_as_binary(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11); int32_t dump_incbin_as_text(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12); int32_t dump_incbins(struct _IO_FILE * stream, struct _IO_FILE * a2, int32_t a3); int32_t duplicate_string(void); int32_t enforce_value_size(int32_t a1, uint32_t a2); int32_t execute_script(int32_t a1, int32_t a2, int32_t a3); int32_t execute_script_once(int32_t a1, int32_t a2, int32_t a3, int32_t * a4, char * a5, char * format, int32_t a7, int32_t a8, char * a9, char * format2, int32_t a11, int32_t a12, int32_t a13, int32_t * a14, int32_t a15); int32_t execute_transforms(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5); int32_t find_first_non_space(char * str); int32_t find_script_variable(int32_t * a1, char * str); int32_t find_symbol_for_address(uint32_t a1); void function_27e0(void); void function_2a08(int32_t (*a1)(int32_t)); int32_t function_2a88(char * a1); int32_t function_6eb4(int32_t a1); int32_t function_7ae8(int32_t a1); int32_t function_7d34(int32_t a1); int32_t function_a830(uint32_t a1, uint32_t a2, int32_t a3); int32_t function_a8f8(int32_t a1); void function_a9bc(int32_t a1); int32_t function_add(int32_t a1, int32_t a2, int32_t * a3); int32_t function_af90(int32_t a1); int32_t function_and(int32_t a1, int32_t a2, int32_t * a3); int32_t function_asr(int32_t a1, uint32_t a2, int32_t * a3); int32_t function_checkmax(int32_t a1, int32_t a2, int32_t * a3, int32_t a4); int32_t function_checkmaxu(uint32_t a1, uint32_t a2, int32_t * a3); int32_t function_checkmin(int32_t a1, int32_t a2, int32_t * a3); int32_t function_checkminu(uint32_t a1, uint32_t a2, int32_t * a3); int32_t function_checkptr(int32_t a1, int32_t a2, int32_t * a3, int32_t a4); int32_t function_compare(int32_t a1, int32_t a2, int32_t * a3); int32_t function_compareu(uint32_t a1, uint32_t a2, int32_t * a3); int32_t function_divide(int32_t a1, int32_t a2); int32_t function_forcemax(int32_t a1, int32_t a2, int32_t * a3); int32_t function_forcemaxu(uint32_t a1, uint32_t a2, int32_t * a3); int32_t function_forcemin(int32_t a1, int32_t a2, int32_t * a3); int32_t function_forceminu(uint32_t a1, uint32_t a2, int32_t * a3); int32_t function_modulo(uint32_t a1, uint32_t a2); int32_t function_multiply(int32_t a1, int32_t a2, int32_t * a3); int32_t function_or(int32_t a1, int32_t a2, int32_t * a3); int32_t function_rdiv(int32_t a1, int32_t a2, int32_t * a3); int32_t function_require(int32_t a1, int32_t a2, int32_t * a3, int32_t a4, int32_t a5); int32_t function_requirenot(int32_t a1, int32_t a2, int32_t * a3); int32_t function_rmod(uint32_t a1, uint32_t a2, int32_t * a3); int32_t function_rsub(int32_t a1, int32_t a2, int32_t * a3); int32_t function_shl(int32_t a1, uint32_t a2, int32_t * a3); int32_t function_shr(uint32_t a1, uint32_t a2, int32_t * a3); int32_t function_subtract(int32_t a1, int32_t a2, int32_t * a3); int32_t function_xor(int32_t a1, int32_t a2, int32_t * a3); int32_t generate_incbin(int32_t a1, int32_t a2, int32_t a3); int32_t generate_initial_indented_line(int32_t * a1, int32_t * a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7); int32_t generate_script_error(char * str, int32_t a2); int32_t generate_script_output_line(char * a1, int32_t a2, int32_t * a3); int32_t get_command(int32_t a1, int32_t a2); int32_t get_dump_file(char * a1, int32_t a2, int32_t a3); int32_t get_eit_entry(struct _Unwind_Control_Block * ucbp, int32_t return_address); int32_t get_file_length(struct _IO_FILE * stream); char * get_incbin_data(void); int32_t get_line_type(void); int32_t get_value_from_string(char * a1, int32_t a2); int32_t handle_incbin_data(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, char * a6, int32_t a7, int32_t a8, uint32_t a9); int32_t handle_incbin_text(int32_t * a1, int32_t a2, struct _IO_FILE * a3, int32_t a4, int32_t a5, int32_t a6, char * format2, char * format, int32_t a9, int32_t a10); int32_t headers_setting_handler(char * str, int32_t a2, int32_t a3, int32_t a4); int32_t indent_setting_handler(char * str, int32_t a2, int32_t a3, int32_t a4); int32_t init_script_variables(int32_t a1, int32_t a2, int32_t a3); int32_t is_incbin(char * str); int32_t load_symbols(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5); char next_unwind_byte(struct anon_struct_13 * uws); int32_t output_binary_data(char * a1, int32_t a2, int32_t a3, struct _IO_FILE * stream, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12); int32_t output_pointer(int32_t a1, struct _IO_FILE * a2); int32_t output_pointers(int32_t result, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8); int32_t parse_buffer(char * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13, int32_t a14, int32_t a15, int32_t a16, int32_t a17, int32_t a18, int32_t a19, int32_t a20, int32_t a21, int32_t a22, int32_t a23, int32_t a24, int32_t a25, int32_t a26, int32_t a27, int32_t a28, char * a29, int32_t a30, int32_t a31, char * a32, int32_t a33, int32_t a34, char * a35, int32_t a36, int32_t a37, int32_t a38, int32_t a39, int32_t a40); int32_t parse_incbin(int32_t * a1, int32_t a2, int32_t a3); int32_t preview_incbin(int32_t a1, int32_t a2, int32_t a3); int32_t print_command_help(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10); int32_t print_script_variable_contents(uint32_t a1, int32_t a2, char * a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8); int32_t read_16(char * a1); int32_t read_32(char * a1); int32_t read_ELF_section_table(struct _IO_FILE * a1, int32_t * a2, int32_t * a3); int32_t read_ELF_symbols_from_section(struct _IO_FILE * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7); int32_t read_file_buffer(struct _IO_FILE * a1, int32_t offset, int32_t size); int32_t read_file_by_lines(struct _IO_FILE * stream); int32_t read_file_string(struct _IO_FILE * stream, int32_t offset); int32_t read_file_value(struct _IO_FILE * a1); int32_t read_line(struct _IO_FILE * stream); struct _IO_FILE * read_symbols_from_ELF(void); void restore_core_regs(void); void restore_non_core_regs(struct anon_struct_5 * vrs); int32_t run_script(int32_t a1, int32_t a2, struct _IO_FILE * a3, int32_t a4); int32_t run_script_auto(int32_t a1, int32_t a2, char * file_path, struct _IO_FILE * a4); int32_t script_get_expression_value(char * a1, int32_t a2, int32_t * a3, int32_t a4); int32_t script_get_initializer_value(char * a1, int32_t * a2, int32_t * a3); int32_t script_get_transforms_for_line(int32_t * a1, int32_t str4, int32_t * a3); int32_t script_loop_test(int32_t a1, int32_t a2, int32_t * a3, int32_t a4, int32_t a5); int32_t script_parse_assignment_line(int32_t a1); int32_t script_transform_add(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_all(void); int32_t script_transform_and(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_any(void); int32_t script_transform_append(char a1, int32_t a2, int32_t a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t (*a12)(int32_t), int32_t a13, int32_t a14, int32_t a15, int32_t a16, int32_t a17, int32_t a18); int32_t script_transform_asr(int32_t a1, int32_t a2); int32_t script_transform_basic(char a1, int32_t a2, int32_t a3); int32_t script_transform_byte_count(uint32_t a1, uint32_t a2, int32_t a3, uint32_t a4, char * a5); int32_t script_transform_bytesuntil(uint32_t a1, uint32_t a2, int32_t a3, uint32_t a4); int32_t script_transform_byteswhile(uint32_t a1, uint32_t a2, int32_t a3); int32_t script_transform_checkmax(int32_t a1, int32_t a2); int32_t script_transform_checkmaxu(void); int32_t script_transform_checkmin(int32_t a1, int32_t a2); int32_t script_transform_checkminu(void); int32_t script_transform_checkptr(void); int32_t script_transform_compare(int32_t a1, int32_t a2); int32_t script_transform_compareu(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_copy(unsigned char a1, int32_t a2, char * a3, int32_t a4); int32_t script_transform_count(void); int32_t script_transform_count_values(int32_t a1, int32_t a2, int32_t * a3, int32_t a4); int32_t script_transform_divide(int32_t a1, int32_t a2); int32_t script_transform_forcemax(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_forcemaxu(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_forcemin(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_forceminu(int32_t a1, int32_t a2); int32_t script_transform_int(uint32_t a1, int32_t a2, int32_t a3, char a4, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13, int32_t a14, int32_t a15, int32_t a16); int32_t script_transform_item(uint32_t a1, uint32_t a2, int32_t a3, uint32_t a4, char * a5); int32_t script_transform_length(uint32_t a1, int32_t a2, int32_t a3, uint32_t a4, char * a5); int32_t script_transform_modulo(int32_t a1, int32_t a2); int32_t script_transform_multi(uint32_t a1, int32_t a2, int32_t a3, int32_t a4); int32_t script_transform_multi16(uint32_t a1, int32_t a2, int32_t a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8); int32_t script_transform_multi32(uint32_t a1, int32_t a2, int32_t a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8); int32_t script_transform_multi8(uint32_t a1, int32_t a2, char * a3, int32_t size, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9); int32_t script_transform_multiply(int32_t a1, int32_t a2); int32_t script_transform_multiXX(uint32_t a1, int32_t a2, int32_t a3, int32_t size, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t (*a12)(int32_t), int32_t a13, int32_t a14, int32_t a15, int32_t a16); int32_t script_transform_or(int32_t a1, int32_t a2); int32_t script_transform_prepend(char a1, int32_t a2, int32_t a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t (*a12)(int32_t), int32_t a13, int32_t a14, int32_t a15, int32_t a16, int32_t a17, int32_t a18); int32_t script_transform_rdiv(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_require(void); int32_t script_transform_requirenot(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_rmod(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_rotate(char a1, int32_t a2, char * a3, uint32_t a4); int32_t script_transform_rotateback(char a1, int32_t a2, char * a3, int32_t a4); int32_t script_transform_rsub(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_shl(void); int32_t script_transform_shr(int32_t a1, int32_t a2, int32_t a3); int32_t script_transform_skip(unsigned char a1, int32_t a2, int32_t a3, int32_t a4); int32_t script_transform_subtract(int32_t a1, int32_t a2); int32_t script_transform_text(uint32_t a1, int32_t a2, char * a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12); int32_t script_transform_xor(void); struct __EIT_entry * search_EIT_table(struct __EIT_entry * table, int32_t nrec, int32_t return_address); int32_t selfrel_offset31(int32_t * p); int32_t settings_help(int32_t a1, int32_t a2, int32_t a3, int32_t a4); int32_t settings_mode(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, char * a6, char * a7, int32_t a8, int32_t a9, char * a10, char * a11, int32_t a12, int32_t a13, char * a14, int32_t a15, int32_t a16, int32_t a17); int32_t split_by_spaces(void); int32_t string_array_size(int32_t * a1); int32_t unload_symbols(void); void unwind_phase2(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * vrs); int32_t unwind_phase2_forced(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * entry_vrs, int32_t resuming); struct _Unwind_Control_Block_1 * unwind_UCB_from_context(struct _Unwind_Context_1 * context); int32_t validate_ELF_file(int32_t a1, int32_t a2); int32_t validate_file_value(int32_t a1, int32_t a2); int32_t validate_pointers(int32_t a1, uint32_t a2, int32_t a3); int32_t validate_variable_name(char * str); int32_t write_header_comment(int32_t * a1, struct _IO_FILE * stream); int32_t write_incbin_for_segment(int32_t a1, int32_t a2, int32_t a3, struct _IO_FILE * a4); // --------------------- Global Variables --------------------- int32_t g126 = 0; // LR int32_t g127 = 0; // R0 int32_t g128 = 0; // R1 int32_t g129 = 0; // R10 int32_t g130 = 0; // R11 int32_t g131 = 0; // R12 int32_t g132 = 0; // R2 int32_t g133 = 0; // R3 int32_t g134 = 0; // R4 int32_t g135 = 0; // R5 int32_t g136 = 0; // R6 int32_t g137 = 0; // R7 int32_t g138 = 0; // R8 int32_t g139 = 0; // R9 bool g1 = false; // flagc bool g2 = false; // flagn bool g3 = false; // flagz int32_t g4 = 0x82bc; // 0x1e0b8 int32_t g5 = 0x833c; // 0x1e0bc int32_t g7 = 0xd840; // 0x1e0c8 int32_t g8 = 0x8974; // 0x1e0cc int32_t g10 = 0xb558; // 0x1e0d4 int32_t g11 = 0; // 0x1e0d8 int32_t g14 = 0x844c; // 0x1e0e8 int32_t g15 = 0xb568; // 0x1e0ec int32_t g16 = 0x890c; // 0x1e0f0 int32_t g18 = 0x83c4; // 0x1e0f8 int32_t g19 = 0x87d4; // 0x1e0fc int32_t g20 = 0x8784; // 0x1e100 int32_t g21 = 0x8524; // 0x1e104 int32_t g22 = 0x88a4; // 0x1e108 int32_t g23 = 0x85a4; // 0x1e10c int32_t g24; // 0x1e110 int32_t g25 = 0x8624; // 0x1e118 int32_t g26 = 0x8a68; // 0x1e11c int32_t g27 = 0x85e4; // 0x1e124 int32_t g28 = 0x8a00; // 0x1e128 int32_t g29 = 0x883c; // 0x1e12c int32_t g30 = 0x1e8c000; // 0x1e12f int32_t g32 = 0x86f0; // 0x1e134 int32_t g33 = 0; // 0x1e138 int32_t g34 = 0x82fc; // 0x1e13c int32_t g35 = 0x8668; // 0x1e140 int32_t g36; // 0x1e144 int32_t g37 = 0x84a4; // 0x1e14c int32_t g38 = 0; // 0x1e150 int32_t g40 = 0x8378; // 0x1e160 int32_t g41 = 0x8564; // 0x1e164 int32_t g42 = 0x86ac; // 0x1e168 int32_t g43 = 0x84e4; // 0x1e170 int32_t g45 = 0xb560; // 0x1e178 int32_t g47 = 0x8734; // 0x1e180 int32_t g48 = 161; // 0x1e184 char * g49[16] = { "TRANSPARENT", "DARK_GREY", "RED", "GREEN", "BLUE", "YELLOW", "CYAN", "MAGENTA", "LIGHT_GRAY", "BLACK", "BLACK2", "SILVER", "WHITE", "SKY_BLUE", "LIGHT_BLUE", "WHITE2" }; // 0x1e588 int32_t g50 = 0; // 0x1e5c8 char (*g51)[8] = "headers"; // 0x1e704 char (*g52)[4] = "add"; // 0x1e740 int32_t g53 = 0; // 0x1e8c0 int32_t g54 = 32; // 0x4108 int32_t g55 = 0x8dcb; // 0x4318 int32_t g56 = 40; // 0x4e28 int32_t g57 = 432; // 0x5170 int32_t g58 = 644; // 0x5c78 int32_t g59 = 32; // 0x6230 int32_t g60 = 40; // 0x70a4 int32_t g61 = -0x1f7f0000; // 0x827c int32_t g62 = 28; // 0x8e0c int32_t g63 = 32; // 0x9314 int32_t g64 = 0xa000013; // 0x9354 int32_t g65 = 0xa000012; // 0x94b4 int32_t g66 = 80; // 0x9638 int32_t g67 = -0x1e5fb000; // 0xa100 int32_t g68 = -0x1c5fffff; // 0xa104 char * g69; // 0xa114 char * g70 = "\xe4"; // 0xa118 int32_t g71 = -0x1a3ff000; // 0xa11c char * g72 = "\xe0\x10\x8d\xe5\x89\x01"; // 0xa120 char * g73 = "\x89\x01"; // 0xa124 int32_t g74 = -0x1a60f984; // 0xa128 int32_t g75 = -0x1d725f28; // 0xa12c int32_t g76 = -0x1a60c998; // 0xa130 int32_t g77 = -0x1d729f1c; // 0xa134 int32_t g78 = -0x1f710000; // 0xa138 int32_t g79 = -0x1a72ffe0; // 0xa13c char ** g80 = (char **)-0x1a60f998; // 0xa140 char ** g81 = (char **)-0x1d728f20; // 0xa144 int32_t g82 = -0x1a60e99c; // 0xa148 char * g83; // 0xa14c int32_t g84 = -0x1f710000; // 0xa150 char * g85 = "\x18"; // 0xa154 char * g86 = "\x44\x06\x9f\xe5\x01\x10\x8f\xe0\x34\x26\x9f\xe5"; // 0xa158 int32_t g87 = -0x1f70efff; // 0xa15c char * g88 = "\x34\x26\x9f\xe5"; // 0xa160 char * g89; // 0xa164 int32_t g90 = -0x1a72ffec; // 0xa168 char * g91 = "\x34\x06\x9f\xe5\x1c\x10\x8d\xe5"; // 0xa16c char * g92 = "\x1c\x10\x8d\xe5"; // 0xa170 int32_t g93 = -0x1f710000; // 0xa174 char * g94 = "$"; // 0xa178 char * g95 = "\x10\x06\x9f\xe5\x10\x16\x9f\xe5"; // 0xa17c char * g96 = "\x10\x16\x9f\xe5"; // 0xa180 int32_t g97 = -0x1f710000; // 0xa184 int32_t g98 = -0x11f6f4f0; // 0xa188 char ** g99 = (char **)-0x1f70fffd; // 0xa18c int32_t g100 = -0x11f7f4f0; // 0xa190 int32_t g101 = -0x1f70fffe; // 0xa194 int32_t g102 = -0x1a60d990; // 0xa198 char * g103 = "\x10\x0b\x29\xee\x01"; // 0xa19c char * g104 = "\x01"; // 0xa1a0 char * g105 = "\xd8\x15\x9f\xe5\x10\x0b\x28\xee\xc8\x05\x9f\xe5\x01\x10\x8f\xe0\x34\x10\x8d\xe5\xd0\x15\x9f\xe5"; // 0xa1a4 char * g106 = "\x10\x0b\x28\xee\xc8\x05\x9f\xe5\x01\x10\x8f\xe0\x34\x10\x8d\xe5\xd0\x15\x9f\xe5"; // 0xa1a8 char * g107 = "\xc8\x05\x9f\xe5\x01\x10\x8f\xe0\x34\x10\x8d\xe5\xd0\x15\x9f\xe5"; // 0xa1ac int32_t g108 = -0x1a60fa58; // 0xa1d8 int32_t g109 = -0x1f710000; // 0xa1e0 char * g110 = "T"; // 0xa1e4 int32_t g111 = 260; // 0xa400 int32_t g112 = -776; // 0xa680 int32_t g113 = -0x1caffff8; // 0xacd4 int32_t g114 = -0x1caffff8; // 0xae98 int32_t g115 = -0x7e1cffd5; // 0xc12f int32_t g116 = 0xa19ee2; // 0xc25f int32_t g117 = 0x42002f; // 0xc328 int32_t g118 = 0x7efffbff; // 0xcd73 int32_t g119 = 0x30250020; // 0xce21 int32_t g120 = 0x20732500; // 0xd393 int32_t g121 = 1; // 0xd520 int32_t g122 = 0x4f43007b; // 0xd61b int32_t g123 = 0x557b007d; // 0xd6e6 int32_t g124 = 0x7fff5370; // 0xd738 int32_t g125 = 0x7c500; char * (*g6)[16] = &g49; // 0x1e0c0 char (**g9)[8] = &g51; // 0x1e0d0 int32_t * g12 = &g50; // 0x1e0dc struct vtable_1e0e0_type g13 = { .e0 = function_rdiv }; // 0x1e0e0 int32_t * g17 = &g124; // 0x1e0f4 int32_t * g31 = &g53; // 0x1e130 int32_t * g39 = &g118; // 0x1e154 int32_t * g44 = &g48; // 0x1e174 char (**g46)[4] = &g52; // 0x1e17c // ------------------------ Functions ------------------------- // Address range: 0x27e0 - 0x29f7 void function_27e0(void) { // 0x27e0 return; } // Address range: 0x2a00 - 0x2a07 void __atexit_handler_wrapper(int32_t a1) { // 0x2a00 return; } // Address range: 0x2a08 - 0x2a0b void function_2a08(int32_t (*a1)(int32_t)) { int32_t v1 = (int32_t)a1; g127 = v1; a1(v1); } // Address range: 0x2a0c - 0x2a87 int32_t _start(int32_t a1, int32_t a2, int32_t a3) { char ** v1 = (char **)g130; int32_t v2 = *(int32_t *)0x2a70 + 0x2a20; // 0x2a18 int32_t v3 = *(int32_t *)(v2 + *(int32_t *)0x2a74); int32_t v4; int32_t result = &v4; // 0x2a54_0 g127 = result; int32_t v5 = *(int32_t *)(*(int32_t *)0x2a84 + v2); // 0x2a58 __libc_init((struct ProgramVars *)&v4, NULL, (void (**)())v5, (void (**)())&v3, v1); g130 = (int32_t)v1; return result; } // Address range: 0x2a88 - 0x2aa7 int32_t function_2a88(char * a1) { int32_t v1 = *(int32_t *)0x2aa0; // 0x2a8c int32_t v2 = *(int32_t *)0x2aa4; // 0x2a90 return __cxa_atexit((void (**)(char *))(v2 + 0x2aa0), a1, (char *)(v1 + 0x2a9c)); } // Address range: 0x2aa8 - 0x2d47 int32_t get_command(int32_t a1, int32_t a2) { int32_t v1 = g134; // 0x2aa8 int32_t v2 = g135; // 0x2aa8 int32_t v3 = g136; // 0x2aa8 int32_t v4 = g137; // 0x2aa8 int32_t v5 = g138; // 0x2aa8 int32_t v6 = g129; // 0x2aa8 int32_t v7 = g130; // bp-8 g130 = &v7; g134 = a2; int32_t v8 = *(int32_t *)0x2d44; // 0x2ad0 g132 = v8; int32_t v9 = v8 + 0x2b04; // 0x2afc g136 = *(int32_t *)(*(int32_t *)0x2d38 + 0x2b10); g138 = *(int32_t *)0x2d28 + 0x2b18; int32_t v10 = *(int32_t *)(*(int32_t *)0x2d2c + 0x2b20); // 0x2b18 int32_t v11 = *(int32_t *)(*(int32_t *)0x2d34 + 0x2b2c); // 0x2b24 int32_t v12 = *(int32_t *)(*(int32_t *)0x2d1c + 0x2b70); // 0x2b68 int32_t v13 = *(int32_t *)(*(int32_t *)0x2d18 + 0x2b7c); // 0x2b74 int32_t * v14 = (int32_t *)*(int32_t *)(*(int32_t *)0x2d24 + 0x2ae8); // 0x2c7c_0 char * format = (char *)(*(int32_t *)0x2d3c + 0x2af4); // branch -> 0x2b98 while (true) { // 0x2b98 printf((char *)(*(int32_t *)0x2d04 + 0x2acc)); int32_t v15 = read_line((struct _IO_FILE *)*(int32_t *)(*(int32_t *)0x2d08 + 0x2adc)); // 0x2ba8 g129 = v15; char * str = (char *)v15; // 0x2bb0_0 if (*str != 0) { // 0x2bbc if (strcmp(str, (char *)(*(int32_t *)0x2d0c + 0x2b40)) != 0) { // 0x2bd0 if (strcmp((char *)g129, (char *)(*(int32_t *)0x2d10 + 0x2b4c)) != 0) { int32_t v16 = g129; // 0x2be8 g137 = v16; int32_t str2 = *(int32_t *)*(int32_t *)(*(int32_t *)0x2d14 + 0x2b58); // 0x2bec if (str2 != 0) { // 0x2bf8 g135 = 0; g129 = 0; uint32_t v17 = 0; // 0x2c04 // branch -> 0x2c00 while (true) { // 0x2c00 if (((v17 == 0 ? 1 : v17 < 32 ? 1 << v17 : 0) & g134) != 0) { int32_t strcmp_rc = strcmp((char *)g137, (char *)str2); // 0x2c10 g3 = strcmp_rc == 0; int32_t result; // 0x2cf8 if (strcmp_rc == 0) { // 0x2cf0 free((char *)g137); result = g129 % 256; g127 = result; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return result; } int32_t str3 = *(int32_t *)(12 * g135 + v13 + 4); // 0x2c28 if (str3 != 0) { int32_t strcmp_rc2 = strcmp((char *)g137, (char *)str3); // 0x2c38 g3 = strcmp_rc2 == 0; if (strcmp_rc2 == 0) { // 0x2cf0 free((char *)g137); result = g129 % 256; g127 = result; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return result; } } } int32_t v18 = g129 + 1; // 0x2c44 g129 = v18; int32_t v19 = v18 % 256; // 0x2c4c g135 = v19; int32_t v20 = *(int32_t *)(12 * v19 + v12); // 0x2c58 if (v20 == 0) { // break -> 0x2c64 break; } str2 = v20; v17 = v19; // continue -> 0x2c00 } // 0x2c64 v16 = g137; // branch -> 0x2c64 } // 0x2c64 free((char *)v16); puts((char *)(*(int32_t *)0x2d20 + 0x2b64)); // branch -> 0x2b98 continue; } // 0x2c78 if (*v14 != 0) { lab_0x2c88_2: // 0x2c88 g137 = 0; g135 = 0; int32_t v21 = 0; // 0x2cd08 uint32_t v22 = 0; // 0x2c94 // branch -> 0x2c90 while (true) { int32_t v23 = v21; // 0x2cd0 if (((v22 == 0 ? 1 : v22 < 32 ? 1 << v22 : 0) & g134) != 0) { // 0x2c9c printf((char *)g138); int32_t v24 = g137; // 0x2ca4 int32_t v25 = 3 * v24; // 0x2ca4 if (*(int32_t *)(12 * v24 + v10 + 4) != 0) { // 0x2cbc printf((char *)(*(int32_t *)0x2d30 + 0x2b34)); // branch -> 0x2cc4 } // 0x2cc4 puts((char *)*(int32_t *)(v11 + 4 * v25 + 8)); v23 = g135; // branch -> 0x2cd0 } int32_t v26 = v23 + 1; // 0x2cd0 g135 = v26; int32_t v27 = v26 % 256; // 0x2cd4 g137 = v27; if (*(int32_t *)(12 * v27 + g136) == 0) { // break -> 0x2b80 break; } v21 = v26; v22 = v27; // continue -> 0x2c90 } // 0x2b80 g132 = v9; printf(format); free((char *)g129); // branch -> 0x2b98 continue; } lab_0x2b80_2: // 0x2b80 g132 = v9; printf(format); free((char *)g129); // branch -> 0x2b98 continue; } // 0x2c78 if (*v14 == 0) { goto lab_0x2b80_2; } goto lab_0x2c88_2; } // 0x2c78 if (*v14 == 0) { goto lab_0x2b80_2; } goto lab_0x2c88_2; } } // Address range: 0x2d48 - 0x2e43 int32_t print_command_help(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10) { int32_t v1 = g135; // 0x2d48 int32_t v2 = g138; // 0x2d48 if (*(int32_t *)*(int32_t *)(*(int32_t *)0x2e20 + 0x2d64) == 0) { // 0x2dfc g135 = v1; g138 = v2; return printf((char *)(*(int32_t *)0x2e38 + 0x2e10)); } int32_t v3 = 0; // R9 g138 = 0; int32_t v4 = *(int32_t *)(*(int32_t *)0x2e34 + 0x2d80); // 0x2d78 int32_t v5 = *(int32_t *)(*(int32_t *)0x2e28 + 0x2d94); // 0x2d8c g135 = *(int32_t *)(*(int32_t *)0x2e30 + 0x2d9c); int32_t v6 = v4; // 0x2df07 int32_t v7 = 0; // 0x2de05 uint32_t v8 = 0; // 0x2da8 // branch -> 0x2da4 while (true) { int32_t v9 = v6; // 0x2df0 int32_t v10 = v7; // 0x2de0 if (((v8 == 0 ? 1 : v8 < 32 ? 1 << v8 : 0) & a1) != 0) { // 0x2db0 printf((char *)(*(int32_t *)0x2e24 + 0x2d88)); int32_t v11 = v3; // 0x2db8 int32_t v12 = 3 * v11; // 0x2db8 if (*(int32_t *)(v5 + 12 * v11 + 4) != 0) { // 0x2dcc printf((char *)(*(int32_t *)0x2e2c + 0x2da4)); // branch -> 0x2dd4 } // 0x2dd4 puts((char *)*(int32_t *)(g135 + 4 * v12 + 8)); v9 = v4; v10 = g138; // branch -> 0x2de0 } int32_t v13 = v10 + 1; // 0x2de0 g138 = v13; int32_t v14 = v13 % 256; // 0x2de4 v3 = v14; if (*(int32_t *)(12 * v14 + v9) == 0) { // 0x2dfc // branch -> 0x2dfc // 0x2dfc g135 = v1; g138 = v2; return printf((char *)(*(int32_t *)0x2e38 + 0x2e10)); } // 0x2de0 v6 = v9; v7 = v13; v8 = v14; // branch -> 0x2da4 } } // Address range: 0x2e44 - 0x313f struct _IO_FILE * read_symbols_from_ELF(void) { int32_t v1 = g134; // 0x2e44 int32_t v2 = g135; // 0x2e44 int32_t v3 = g136; // 0x2e44 int32_t v4 = g137; // 0x2e44 int32_t v5 = g138; // 0x2e44 int32_t v6 = g129; // 0x2e44 int32_t v7 = g130; // bp-8 g130 = &v7; int32_t v8 = g128; // 0x2e50 g136 = v8; g137 = 0; g134 = g132; *(int32_t *)v8 = 0; struct _IO_FILE * file = fopen((char *)g127, (char *)(*(int32_t *)0x3124 + 0x2e68)); // 0x2e68 int32_t v9; // 0x2f5c if (file == NULL) { // 0x2f0c *(int32_t *)g134 = *(int32_t *)0x313c + 0x2f18; // branch -> 0x2f5c } else { // 0x2e78 int32_t v10; int32_t v11 = &v10; // 0x2e7c_0 g133 = v11; g128 = 0; g132 = 4; int32_t v12 = read_file_value(file); // 0x2e88 int32_t v13 = v10; // 0x2e8c int32_t v14 = v13; // 0x2f28 int32_t v15; // 0x2fb0 int32_t * v16; // 0x2f44_0 int32_t v17; // 0x2f3c int32_t v18; // R6 int32_t v19; // 0x305410 int32_t nmemb; // 0x3080 int32_t v20; // 0x2f80 int32_t v21; // 0x2f44 int32_t v22; // 0x305c int32_t v23; // 0x2f68 int32_t v24; // 0x2f74 int32_t v25; // 0x2fa0 int32_t v26; // 0x3094 if (v13 == 0) { // 0x2e98 if (v12 == 0x464c457f) { // 0x2ea8 g133 = v11; g128 = 16; g132 = 4; int32_t v27 = read_file_value(file); // 0x2eb8 int32_t v28 = v10; // 0x2ebc if (v28 == 0) { // 0x2ec8 if (v27 == 0x280002) { // 0x2ed8 g133 = v11; g128 = 20; g132 = 4; int32_t v29 = read_file_value(file); // 0x2ee8 int32_t v30 = v10; // 0x2eec if (v30 == 0) { int32_t v31 = *(int32_t *)0x3130 + 0x2f08; // 0x2f00 if (v29 == 1) { // if_2f04_0_true v14 = v31 & -0x10000; // branch -> 0x2f24 } else { v14 = v31; } } else { v14 = v30; } } else { // 0x30d8 v14 = *(int32_t *)0x312c + 0x30e4; // branch -> 0x2f24 } // 0x2f24 *(int32_t *)g134 = v14; if (v14 == 0) { // 0x2f30 v17 = read_ELF_section_table(file, &v10, (int32_t *)g134); g135 = v17; v21 = g134; v16 = (int32_t *)v21; if (*v16 == 0) { // 0x2f68 v23 = v10; v24 = g136; if (v23 == 0) { // 0x3068 g137 = 0; v18 = 0; // branch -> 0x3070 // 0x3070 fclose(file); free((char *)g135); nmemb = v18; if (nmemb == 0) { // 0x30b8 free((char *)g137); g137 = 0; *v16 = *(int32_t *)0x3138 + 0x30d4; // branch -> 0x2f5c } else { // 0x3088 v26 = *(int32_t *)(*(int32_t *)0x3134 + 0x309c); qsort((char *)g137, nmemb, 4, (int32_t (**)(char *, char *))v26); *v16 = 0; *(int32_t *)v24 = v18; // branch -> 0x2f5c } // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } // 0x2f7c g129 = v21; v20 = v17 + 8; g139 = v20; v18 = 0; g138 = 0; g137 = 0; int32_t v32 = v23; // 0x305c13 v19 = 0; v25 = 0; v15 = v20; // branch -> 0x2f94 while (true) { // 0x2f94 v22 = v32; int32_t v33; // 0x3054 int32_t v34; // 0x3058 if (*(int32_t *)(v15 - 8) == 2) { lab_0x2fa0_2:; int32_t v35 = g137; // 0x2fa8 int32_t v36 = *(int32_t *)(v15 - 4); // 0x2fac int32_t v37 = *(int32_t *)v15; // 0x2fac int32_t v38 = *(int32_t *)(v15 + 4); // 0x2fb0 int32_t v39 = *(int32_t *)(v15 + 8); // 0x2fb0 int32_t v40 = 20 * v38 + v17; // 0x2fc0 int32_t v41 = *(int32_t *)v40; // 0x2fc0 g134 = v41; g135 = *(int32_t *)(v40 + 8); int32_t v42; g137 = &v42; g136 = *(int32_t *)(v40 + 16); int32_t v43 = read_ELF_symbols_from_section(file, 2, v36, v37, v38, v39, v41); // R4 if (*(int32_t *)g129 == 0) { // 0x3010 v18 = v25; int32_t mem = (int32_t)realloc((char *)v35, 4 * (v42 + v25)); // 0x3024_5 int32_t v44 = v42; // 0x3028 g135 = v44; g137 = mem; __aeabi_memcpy4(4 * v18 + mem, v43, 4 * v44); free((char *)v43); int32_t v45 = g135 + v18; // 0x3048 v18 = v45; g135 = v17; v22 = v10; // branch -> 0x3054 // 0x3054 v33 = g138 + 1; g138 = v33; v34 = g139 + 20; g139 = v34; if (v33 >= v22) { // break -> 0x3070 break; } v32 = v22; v19 = v33; v25 = v45; v15 = v34; // continue -> 0x2f94 continue; } // 0x30e4 fclose(file); free((char *)v17); v18 = v25; g135 = v35; if (v25 == 0) { // 0x3118 free((char *)v35); // branch -> 0x2f58 // 0x2f58 g137 = 0; // branch -> 0x2f5c // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } int32_t v46 = v35; // 0x3108 // branch -> 0x3108 while (true) { // 0x3108 free((char *)*(int32_t *)v46); int32_t v47 = v18; // 0x3110 v18 = v47 - 1; if (v47 == 1) { // 0x3118 // branch -> 0x3118 // 0x3118 free((char *)g135); // branch -> 0x2f58 // 0x2f58 g137 = 0; // branch -> 0x2f5c // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } // 0x3108 v46 += 4; // branch -> 0x3108 } // 0x3070 fclose(file); int32_t v48 = g135; // 0x3078 free((char *)v48); nmemb = v18; int32_t v49; // 0x2f64 if (nmemb == 0) { int32_t v50 = g137; // 0x30b8 free((char *)v50); g137 = 0; int32_t v51 = *(int32_t *)0x3138; // 0x30c8 *v16 = v51 + 0x30d4; // branch -> 0x2f5c // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; v49 = v7; g130 = v49; return (struct _IO_FILE *)v9; } int32_t v52 = *(int32_t *)0x3134; // 0x3088 v26 = *(int32_t *)(v52 + 0x309c); int32_t base = g137; // 0x3098 qsort((char *)base, nmemb, 4, (int32_t (**)(char *, char *))v26); *v16 = 0; int32_t v53 = v18; // 0x30b0 *(int32_t *)v24 = v53; // branch -> 0x2f5c // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; v49 = v7; g130 = v49; return (struct _IO_FILE *)v9; } lab_0x3054_2: // 0x3054 v33 = v19 + 1; g138 = v33; v34 = v15 + 20; g139 = v34; if (v33 >= v22) { // break -> 0x3070 break; } v32 = v22; v19 = v33; v15 = v34; // continue -> 0x2f94 } // 0x3070 fclose(file); free((char *)g135); nmemb = v18; if (nmemb == 0) { // 0x30b8 free((char *)g137); g137 = 0; *v16 = *(int32_t *)0x3138 + 0x30d4; // branch -> 0x2f5c } else { // 0x3088 v26 = *(int32_t *)(*(int32_t *)0x3134 + 0x309c); qsort((char *)g137, nmemb, 4, (int32_t (**)(char *, char *))v26); *v16 = 0; *(int32_t *)v24 = v18; // branch -> 0x2f5c } // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } } // 0x2f50 fclose(file); // branch -> 0x2f58 // 0x2f58 g137 = 0; // branch -> 0x2f5c // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } v14 = v28; } else { // 0x2f1c v14 = *(int32_t *)0x3128 + 0x2f28; // branch -> 0x2f24 } // 0x2f24 *(int32_t *)g134 = v14; if (v14 == 0) { // 0x2f30 v17 = read_ELF_section_table(file, &v10, (int32_t *)g134); g135 = v17; v21 = g134; v16 = (int32_t *)v21; if (*v16 == 0) { // 0x2f68 v23 = v10; v24 = g136; if (v23 == 0) { // 0x3068 g137 = 0; v18 = 0; // branch -> 0x3070 } else { // 0x2f7c g129 = v21; v20 = v17 + 8; g139 = v20; v18 = 0; g138 = 0; g137 = 0; v25 = 0; v15 = v20; // branch -> 0x2f94 while (true) { // 0x2f94 if (*(int32_t *)(v15 - 8) == 2) { goto lab_0x2fa0_2; } v22 = v23; goto lab_0x3054_2; } } // 0x3070 fclose(file); free((char *)g135); nmemb = v18; if (nmemb == 0) { // 0x30b8 free((char *)g137); g137 = 0; *v16 = *(int32_t *)0x3138 + 0x30d4; // branch -> 0x2f5c } else { // 0x3088 v26 = *(int32_t *)(*(int32_t *)0x3134 + 0x309c); qsort((char *)g137, nmemb, 4, (int32_t (**)(char *, char *))v26); *v16 = 0; *(int32_t *)v24 = v18; // branch -> 0x2f5c } // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } } // 0x2f50 fclose(file); // branch -> 0x2f58 // 0x2f58 g137 = 0; // branch -> 0x2f5c // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } // 0x2f24 *(int32_t *)g134 = v14; if (v14 == 0) { // 0x2f30 v17 = read_ELF_section_table(file, &v10, (int32_t *)g134); g135 = v17; v21 = g134; v16 = (int32_t *)v21; if (*v16 == 0) { // 0x2f68 v23 = v10; v24 = g136; if (v23 == 0) { // 0x3068 g137 = 0; v18 = 0; // branch -> 0x3070 } else { // 0x2f7c g129 = v21; v20 = v17 + 8; g139 = v20; v18 = 0; g138 = 0; g137 = 0; v19 = 0; v25 = 0; v15 = v20; // branch -> 0x2f94 while (true) { // 0x2f94 if (*(int32_t *)(v15 - 8) == 2) { goto lab_0x2fa0_2; } v22 = v23; goto lab_0x3054_2; } } // 0x3070 fclose(file); free((char *)g135); nmemb = v18; if (nmemb == 0) { // 0x30b8 free((char *)g137); g137 = 0; *v16 = *(int32_t *)0x3138 + 0x30d4; // branch -> 0x2f5c } else { // 0x3088 v26 = *(int32_t *)(*(int32_t *)0x3134 + 0x309c); qsort((char *)g137, nmemb, 4, (int32_t (**)(char *, char *))v26); *v16 = 0; *(int32_t *)v24 = v18; // branch -> 0x2f5c } // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } } // 0x2f50 fclose(file); // branch -> 0x2f58 // 0x2f58 g137 = 0; // branch -> 0x2f5c } // 0x2f5c v9 = g137; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return (struct _IO_FILE *)v9; } // Address range: 0x3140 - 0x3223 int32_t validate_ELF_file(int32_t a1, int32_t a2) { int32_t v1 = g134; // 0x3140 int32_t v2 = g130; // bp-8 g130 = &v2; int32_t v3; g133 = &v3; g128 = 0; g132 = 4; g134 = a1; int32_t v4 = read_file_value((struct _IO_FILE *)a1); // 0x315c g127 = v3; g3 = v3 == 0; int32_t result4 = v3; // 0x3174_2 if (v3 == 0) { // 0x3178 g3 = v4 == 0x464c457f; if (v4 != 0x464c457f) { int32_t result = *(int32_t *)0x3218 + 0x3204; // 0x31fc g127 = result; g134 = v1; g130 = v2; return result; } // 0x3188 int32_t v5; g133 = &v5; g128 = 16; g132 = 4; int32_t v6 = read_file_value((struct _IO_FILE *)g134); // 0x3198 g127 = v5; g3 = v5 == 0; if (v5 == 0) { // 0x31ac g3 = v6 == 0x280002; if (v6 != 0x280002) { int32_t result2 = *(int32_t *)0x321c + 0x3214; // 0x320c g127 = result2; g134 = v1; g130 = v2; return result2; } // 0x31bc int32_t v7; g133 = &v7; g128 = 20; g132 = 4; int32_t v8 = read_file_value((struct _IO_FILE *)g134); // 0x31cc g127 = v7; g3 = v7 == 0; if (v7 == 0) { // 0x31e0 g3 = v8 == 1; int32_t v9 = *(int32_t *)0x3220 + 0x31f0; // 0x31e8 int32_t result3 = v8 == 1 ? v9 & -0x10000 : v9; // 0x31e8 g127 = result3; g134 = v1; g130 = v2; return result3; } result4 = v7; } else { result4 = v5; } } // 0x3170 g134 = v1; g130 = v2; return result4; } // Address range: 0x3224 - 0x33ff int32_t read_ELF_section_table(struct _IO_FILE * a1, int32_t * a2, int32_t * a3) { int32_t v1 = (int32_t)a3; int32_t v2 = g134; // 0x3224 int32_t v3 = g135; // 0x3224 int32_t v4 = g136; // 0x3224 int32_t v5 = g138; // 0x3224 int32_t v6 = g130; // bp-8 g130 = &v6; g135 = v1; g129 = (int32_t)a2; g128 = 32; g132 = 4; g133 = v1; g137 = (int32_t)a1; g136 = read_file_value(a1); int32_t v7 = g135; // 0x3250 g134 = 0; int32_t result; // 0x33ec if (*(int32_t *)v7 == 0) { // 0x3260 g128 = 46; g132 = 2; g133 = v7; g138 = read_file_value((struct _IO_FILE *)g137); int32_t v8 = g135; // 0x3278 if (*(int32_t *)v8 == 0) { // 0x3284 g128 = 48; g132 = 2; g133 = v8; uint32_t v9 = read_file_value((struct _IO_FILE *)g137); // 0x3294 int32_t * v10 = (int32_t *)g135; // 0x3298_0 if (*v10 == 0) { // 0x32a4 if (g136 != 0) { uint32_t v11 = g138; // 0x32a8 if (v11 != 0) { // 0x32b0 if (v9 != 0) { // 0x32b8 if (v11 > 39) { int32_t mem = (int32_t)malloc(20 * v9); // 0x32f0_3 g134 = mem; int32_t v12 = g136 + 36; // 0x32f8 g136 = v12; int32_t v13 = mem + 8; // R9 g138 = 0; int32_t v14 = g135; // 0x3310 // branch -> 0x3304 while (true) { // 0x3304 g128 = v12 - 32; g132 = 4; g133 = v14; *(int32_t *)(v13 - 8) = read_file_value((struct _IO_FILE *)g137); int32_t v15 = g135; // 0x331c if (*(int32_t *)v15 == 0) { // 0x3328 g128 = g136 - 20; g132 = 4; g133 = v15; *(int32_t *)(v13 - 4) = read_file_value((struct _IO_FILE *)g137); int32_t v16 = g135; // 0x3340 if (*(int32_t *)v16 == 0) { // 0x334c g128 = g136 - 16; g132 = 4; g133 = v16; *(int32_t *)v13 = read_file_value((struct _IO_FILE *)g137); int32_t v17 = g135; // 0x3364 if (*(int32_t *)v17 == 0) { // 0x3370 g128 = g136 - 12; g132 = 4; g133 = v17; *(int32_t *)(v13 + 4) = read_file_value((struct _IO_FILE *)g137); int32_t v18 = g135; // 0x3388 if (*(int32_t *)v18 == 0) { // 0x3394 g128 = g136; g132 = 4; g133 = v18; *(int32_t *)(v13 + 8) = read_file_value((struct _IO_FILE *)g137); int32_t v19 = g135; // 0x33ac if (*(int32_t *)v19 == 0) { // 0x33b8 v13 += 20; int32_t v20 = g138 + 1; // 0x33c0 g138 = v20; int32_t v21 = g136 + v11; // 0x33c4 g136 = v21; if (v20 >= v9) { // break -> 0x33d4 break; } v14 = v19; v12 = v21; // continue -> 0x3304 continue; } } } } } // 0x33e0 free((char *)g134); g134 = 0; // branch -> 0x33ec // 0x33ec result = g134; g134 = v2; g135 = v3; g136 = v4; g138 = v5; g130 = v6; return result; } // 0x33d4 *(int32_t *)g129 = v9; // branch -> 0x33ec } else { // 0x32c0 *v10 = *(int32_t *)0x33fc + 0x32cc; // branch -> 0x33ec } // 0x33ec result = g134; g134 = v2; g135 = v3; g136 = v4; g138 = v5; g130 = v6; return result; } } } // 0x32d0 *v10 = *(int32_t *)0x33f8 + 0x32dc; // branch -> 0x33ec } } } // 0x33ec result = g134; g134 = v2; g135 = v3; g136 = v4; g138 = v5; g130 = v6; return result; } // Address range: 0x3400 - 0x3627 int32_t read_ELF_symbols_from_section(struct _IO_FILE * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7) { int32_t v1 = g135; // 0x3400 int32_t v2 = g138; // 0x3400 int32_t v3 = g139; // 0x3400 int32_t v4 = g129; // 0x3400 int32_t v5 = g130; // bp-8 g130 = &v5; g135 = (int32_t)a1; int32_t v6; g134 = v6; g137 = a4; int32_t v7; int32_t * v8 = (int32_t *)v7; // 0x3428_0 *v8 = 0; int32_t result2; // 0x361c if (a4 == 0) { // 0x3584 g138 = 0; // branch -> 0x358c // 0x358c *v8 = 0; *(int32_t *)g134 = 0; result2 = g138; // branch -> 0x361c } else { // 0x3430 g139 = 0; g138 = 0; g129 = 0; int32_t v9 = g137; // bp-56 int32_t v10 = g135; // 0x3440 struct _IO_FILE * v11 = (struct _IO_FILE *)v10; int32_t v12 = 0; // 0x3450 int32_t v13 = g134; // 0x344c // branch -> 0x3444 while (true) { // 0x3444 g132 = 1; g133 = v13; int32_t v14 = v12 + a3; // 0x3450 g136 = v14; g128 = v14 + 12; uint32_t v15 = read_file_value(v11); // 0x345c int32_t v16 = g134; // 0x3460 if (*(int32_t *)v16 == 0) { uint32_t v17 = v15 % 16; // 0x346c int32_t v18; // 0x3578 int32_t v19; // 0x344c5 if ((v17 + 255) % 256 <= 1) { int32_t v20 = g138; // 0x3480 g128 = g136; g132 = 4; g135 = v10; g133 = v16; int32_t v21 = read_file_value(v11); // 0x3498 int32_t v22 = g134; // 0x349c if (*(int32_t *)v22 == 0) { // 0x34a8 g132 = v22; int32_t v23; int32_t str = read_file_string((struct _IO_FILE *)g135, v21 + v23); // 0x34b8 g138 = str; if (*(int32_t *)g134 == 0) { int32_t len = strlen((char *)str); // 0x34d0 int32_t mem = (int32_t)malloc(len + 13); // 0x34d8_3 g137 = g134; g134 = mem; strcpy((char *)(mem + 9), (char *)g138); free((char *)g138); g128 = g136 + 4; *(char *)(g134 + 8) = (char)v17; g132 = 4; g133 = g137; *(int32_t *)g134 = read_file_value((struct _IO_FILE *)g135); int32_t v24 = g137; // 0x3518 if (*(int32_t *)v24 == 0) { // 0x3524 g128 = g136 + 8; g132 = 4; g133 = v24; *(int32_t *)(g134 + 4) = read_file_value((struct _IO_FILE *)g135); if (*(int32_t *)g137 == 0) { int32_t v25 = g139 + 1; // 0x3548 g135 = v25; int32_t mem2 = (int32_t)realloc((char *)v20, 4 * v25); // 0x3554_5 g138 = mem2; *(int32_t *)(4 * g139 + mem2) = g134; int32_t v26 = g137; // 0x3560 g134 = v26; g139 = g135; g137 = v9; v18 = v9; v19 = v26; // branch -> 0x356c goto lab_0x356c; } } // 0x35e8 free((char *)g134); g135 = v20; if (g139 == 0) { // 0x3614 free((char *)*&g135); g138 = 0; // branch -> 0x361c // 0x361c g135 = v1; g138 = v2; g139 = v3; g129 = v4; g130 = v5; return 0; } int32_t v27 = v20; // 0x3600 // branch -> 0x3600 while (true) { // 0x3600 free((char *)*(int32_t *)v27); int32_t v28 = g139; // 0x3608 g139 = v28 - 1; if (v28 != 1) { // 0x3600 v27 += 4; // branch -> 0x3600 continue; } } // 0x358c // branch -> 0x358c // 0x358c *v8 = g139; *(int32_t *)g134 = 0; int32_t result = g138; // branch -> 0x361c // 0x361c g135 = v1; g138 = v2; g139 = v3; g129 = v4; g130 = v5; return result; } } // 0x35c4 g135 = v20; if (g139 != 0) { // branch -> 0x35d4 while (true) { // 0x35d4 free((char *)*(int32_t *)v20); int32_t v29 = g139; // 0x35dc g139 = v29 - 1; if (v29 != 1) { // 0x35d4 v20 += 4; // branch -> 0x35d4 continue; } } } // 0x3614 free((char *)g135); g138 = 0; // branch -> 0x361c // 0x361c g135 = v1; g138 = v2; g139 = v3; g129 = v4; g130 = v5; return 0; } // 0x346c v18 = g137; v19 = v16; // branch -> 0x356c lab_0x356c: // 0x356c g135 = v10; int32_t v30 = g129 + a6; // 0x3574 g129 = v30; if (v30 >= v18) { // break -> 0x358c break; } v12 = v30; v13 = v19; // continue -> 0x3444 continue; } else { // 0x35a0 if (g139 != 0) { int32_t v31 = g138; // 0x35ac // branch -> 0x35ac while (true) { // 0x35ac free((char *)*(int32_t *)v31); int32_t v32 = g139; // 0x35b4 g139 = v32 - 1; if (v32 != 1) { // 0x35ac v31 += 4; // branch -> 0x35ac continue; } } } } // 0x3614 free((char *)g138); g138 = 0; // branch -> 0x361c // 0x361c g135 = v1; g138 = v2; g139 = v3; g129 = v4; g130 = v5; return 0; } } // 0x361c g135 = v1; g138 = v2; g139 = v3; g129 = v4; g130 = v5; return result2; } // Address range: 0x3628 - 0x365f int32_t destroy_ELF_symbols(char * a1, int32_t a2) { int32_t result2 = (int32_t)a1; int32_t v1 = g134; // 0x3628 int32_t v2 = g135; // 0x3628 g135 = a2; g134 = result2; g3 = a2 == 0; if (a2 != 0) { int32_t result = *(int32_t *)a1; // 0x3644 free((char *)result); return result; } // 0x3654 g134 = v1; g135 = v2; free(a1); return result2; } // Address range: 0x3660 - 0x36b3 int32_t compare_ELF_symbols(int32_t * a1, int32_t * a2) { int32_t v1 = *a2; // 0x3660 int32_t v2 = *a1; // 0x3664 uint32_t v3 = *(int32_t *)v1; // 0x3668 uint32_t v4 = *(int32_t *)v2; // 0x366c int32_t result; // 0x36b0_1 int32_t v5; // 0x36ac if (v4 != v3) { int32_t v6 = (int32_t)(v4 >= v3) ^ 1; if (v4 < v3) { v5 = 0; // 0x36a8 if (v6 != 0) { // if_36ac_0_true result = v5 - 1; // branch -> after_if_36ac_0 } else { result = v5; } // after_if_36ac_0 return result; } // 0x36a8 v5 = 1; // branch -> 0x36a8 // 0x36a8 if (v6 != 0) { // if_36ac_0_true result = v5 - 1; // branch -> after_if_36ac_0 } else { result = v5; } // after_if_36ac_0 return result; } uint32_t v7 = *(int32_t *)(v2 + 4); // 0x3678 uint32_t v8 = *(int32_t *)(v1 + 4); // 0x3680 int32_t v9 = v7 > v8; if (v7 >= v8) { v5 = 0; // 0x36a8 if (v9 != 0) { // if_36ac_0_true result = v5 - 1; // branch -> after_if_36ac_0 } else { result = v5; } // after_if_36ac_0 return result; } // 0x36a8 v5 = 1; // branch -> 0x36a8 // 0x36a8 if (v9 != 0) { // if_36ac_0_true result = v5 - 1; // branch -> after_if_36ac_0 } else { result = v5; } // after_if_36ac_0 return result; } // Address range: 0x36b4 - 0x36ff int32_t validate_file_value(int32_t a1, int32_t a2) { g128 = a2; int32_t v1 = g134; // 0x36b4 int32_t v2 = g130; // bp-8 g130 = &v2; g134 = g133; int32_t v3; g133 = &v3; g132 %= 256; int32_t v4 = read_file_value((struct _IO_FILE *)a1); // 0x36cc g127 = v3; g3 = v3 == 0; int32_t result = v3; // 0x36f0_2 if (v3 == 0) { // 0x36e0 int32_t v5; g127 = v5; g3 = v4 == g134; if (v4 == g134) { int32_t v6 = v5 & -0x10000; // 0x36e8 g127 = v6; result = v6; // branch -> 0x36ec } else { result = v5; } } // 0x36ec g134 = v1; g130 = v2; return result; } // Address range: 0x3700 - 0x3763 int32_t read_line(struct _IO_FILE * stream) { int32_t v1 = g135; // 0x3700 int32_t v2 = g138; // 0x3700 g135 = 0; g138 = 0; // branch -> 0x3720 while (true) { int32_t v3 = 0x1000000 * getc((struct _IO_FILE *)(int32_t)stream); int32_t v4 = v3 / 0x1000000; // R6 if (v3 != 0xd000000) { int32_t v5 = g138 + 1; // 0x3734 int32_t mem = (int32_t)realloc((char *)g135, v5); // 0x3740_5 g135 = mem; if (v4 == -1 || v4 == 10) { // 0x3754 *(char *)(g138 + mem) = 0; int32_t result = g135; // 0x375c g135 = v1; g138 = v2; return result; } // 0x3718 *(char *)(g138 + mem) = (char)v4; g138 = v5; // branch -> 0x3720 } // 0x3720 // branch -> 0x3720 } } // Address range: 0x3764 - 0x37d7 int32_t get_file_length(struct _IO_FILE * stream) { int32_t v1 = g134; // 0x3764 int32_t v2 = g135; // 0x3764 int32_t v3 = g130; // 0x3764 int32_t stream2 = (int32_t)stream; // R4 int32_t curr_file_offset = ftell(stream); // 0x3770 g135 = 0; int32_t result; // 0x37d0 if (curr_file_offset < 0) { // 0x37d0 result = g135; g134 = v1; g135 = v2; g130 = v3; return result; } // 0x3784 if (fseek((struct _IO_FILE *)stream2, 0, SEEK_END) == 0) { int32_t curr_file_offset2 = ftell((struct _IO_FILE *)stream2); // R7 g135 = 0; if (fseek((struct _IO_FILE *)stream2, curr_file_offset, SEEK_SET) == 0) { int32_t v4 = curr_file_offset2; // 0x37cc if (curr_file_offset2 == -1) { // if_37c8_0_true v4 = curr_file_offset2 & -0x10000; // branch -> after_if_37c8_0 } // after_if_37c8_0 g135 = v4; // branch -> 0x37d0 } } // 0x37d0 result = g135; g134 = v1; g135 = v2; g130 = v3; return result; } // Address range: 0x37d8 - 0x38af int32_t read_file_by_lines(struct _IO_FILE * stream) { int32_t v1 = g135; // 0x37d8 int32_t v2 = g138; // 0x37d8 int32_t v3 = g130; // 0x37d8 int32_t stream2 = (int32_t)stream; // R4 int32_t is_feof = feof(stream); // 0x37e8 g135 = is_feof; int32_t mem = (int32_t)realloc(NULL, 4); // 0x37f8_5 g138 = mem; int32_t result; // 0x38a4 if (is_feof == 0) { int32_t v4 = 1; // 0x3818 int32_t v5 = 0; // 0x3814 // branch -> 0x3814 while (true) { int32_t v6 = v4; // R9 int32_t v7 = 0; // R6 int32_t v8 = 0; // R10 // branch -> 0x3830 int32_t v9; // R7 while (true) { lab_0x3830:; int32_t v10 = 0x1000000 * getc((struct _IO_FILE *)stream2); v9 = v10 / 0x1000000; if (v10 != 0xd000000) { // break -> 0x3844 break; } // continue -> 0x3830 } int32_t v11 = v8 + 1; // 0x3844 g135 = v11; int32_t mem2 = (int32_t)realloc((char *)v7, v11); // 0x3850_5 v7 = mem2; if (v9 != -1) { // after_if_385c_0 if (v9 != 10) { // 0x3828 *(char *)(v8 + mem2) = (char)v9; v8 = g135; // branch -> 0x3830 goto lab_0x3830; } } // 0x3864 *(char *)(v8 + mem2) = 0; *(int32_t *)(4 * v5 + g138) = v7; int32_t is_feof2 = feof((struct _IO_FILE *)stream2); // 0x3878 int32_t v12 = v6 + 1; // 0x387c g135 = is_feof2; int32_t mem3 = (int32_t)realloc((char *)g138, 4 * v12); // 0x388c_5 g138 = mem3; if (is_feof2 != 0) { // 0x389c // branch -> 0x389c // 0x389c *(int32_t *)(mem3 + 4 * v6) = 0; result = g138; g135 = v1; g138 = v2; g130 = v3; return result; } // 0x3864 v4 = v12; v5 = v6; // branch -> 0x3814 } } // 0x389c *(int32_t *)mem = 0; result = g138; g135 = v1; g138 = v2; g130 = v3; return result; } // Address range: 0x38b0 - 0x396f int32_t read_file_buffer(struct _IO_FILE * a1, int32_t offset, int32_t size) { int32_t v1 = g135; // 0x38b0 int32_t v2 = g138; // 0x38b0 g135 = g133; int32_t stream = (int32_t)a1; // R7 *(int32_t *)g133 = 0; if (size == 0) { // 0x3950 g135 = v1; g138 = v2; return 0; } int32_t result = 0; // R4 if (fseek((struct _IO_FILE *)stream, offset, SEEK_SET) != 0) { // 0x38ec *(int32_t *)g135 = *(int32_t *)0x3958 + 0x38f8; g135 = v1; g138 = v2; return result; } char * mem = malloc(size); // 0x3904 g138 = (int32_t)mem; int32_t items_read = fread(mem, 1, size, (struct _IO_FILE *)stream); // 0x3918 if (items_read == size) { int32_t result2 = g138; // 0x3924 g135 = v1; g138 = v2; return result2; } int32_t v3 = *(int32_t *)0x3960; // 0x3938 *(int32_t *)g135 = items_read == 0 ? *(int32_t *)0x395c + 0x3948 : v3 + 0x394c; free((char *)g138); // branch -> 0x3950 // 0x3950 g135 = v1; g138 = v2; return result; } // Address range: 0x3970 - 0x3b1f int32_t read_file_value(struct _IO_FILE * a1) { int32_t v1 = g135; // 0x3970 int32_t v2 = g138; // 0x3970 int32_t v3 = g130; // 0x3970 g135 = (int32_t)a1; *(int32_t *)g133 = 0; if (g132 != 0) { // 0x3998 if (g132 < 9) { // 0x39b0 *(int32_t *)g133 = 0; int32_t result; // 0x3a84 if (fseek((struct _IO_FILE *)g135, g128, SEEK_SET) == 0) { char * mem = malloc(g132); // 0x39ec g138 = (int32_t)mem; int32_t items_read = fread(mem, 1, g132, (struct _IO_FILE *)g135); // 0x3a00 if (items_read != g132) { int32_t v4 = *(int32_t *)0x3b18; // 0x3a14 *(int32_t *)g133 = items_read == 0 ? *(int32_t *)0x3b14 + 0x3a24 : v4 + 0x3a28; free((char *)g138); g138 = 0; // branch -> 0x3a30 } // 0x3a30 if (*(int32_t *)g133 == 0) { // 0x3a44 int32_t v5; // 0x3a60 if (g132 < 4) { uint32_t v6 = g132 % 4; // 0x3a58 v5 = g132 - v6; if (g132 != v6) { int32_t v7 = g138; // 0x3a84 result = *(int32_t *)v7; // branch -> 0x3a84 while (v5 != 4) { // 0x3a84 v5 -= 4; v7 += 4; result = *(int32_t *)v7; // continue -> 0x3a84 } // 0x3ab0 if (v6 == 0) { // 0x3af0 free((char *)g138); // branch -> 0x39d8 // 0x39d8 // branch -> 0x39dc // 0x39dc g135 = v1; g138 = v2; g130 = v3; return result; } } else { result = 0; v5 = 0; } } else { // 0x3a50 result = 0; v5 = 0; // branch -> 0x3ad0 } int32_t v8 = 8 * v5; // 0x3ae8 int32_t v9 = g132 - v5; // 0x3ae0 int32_t v10 = g138 + v5; // 0x3adc int32_t v11 = (int32_t)*(char *)v10; // 0x3adc uint32_t v12 = v8 & 248; // 0x3ae4 int32_t v13 = (v12 == 0 ? v11 : v12 < 32 ? v11 << v12 : 0) | result; // 0x3ae4 result = v13; // branch -> 0x3adc while (v9 != 1) { // 0x3adc v8 += 8; v9--; v10++; v11 = (int32_t)*(char *)v10; v12 = v8 & 248; v13 |= (v12 == 0 ? v11 : v12 < 32 ? v11 << v12 : 0); result = v13; // continue -> 0x3adc } // 0x3af0 free((char *)g138); // branch -> 0x39d8 // branch -> 0x39dc } else { result = 0; } } else { // 0x39cc // branch -> 0x39d4 // 0x39d4 *(int32_t *)g133 = *(int32_t *)0x3b10 + 0x39d8; // branch -> 0x39d8 // 0x39d8 result = 0; // branch -> 0x39dc } // 0x39dc g135 = v1; g138 = v2; g130 = v3; return result; } // 0x39a0 // branch -> 0x39d4 // 0x39d4 *(int32_t *)g133 = *(int32_t *)0x3b1c + 0x39b0; // branch -> 0x39d8 } // 0x39d8 // branch -> 0x39dc // 0x39dc g135 = v1; g138 = v2; g130 = v3; return 0; } // Address range: 0x3b20 - 0x3bdf int32_t read_file_string(struct _IO_FILE * stream, int32_t offset) { int32_t v1 = g134; // bp-32 int32_t v2 = g135; // 0x3b20 int32_t v3 = g138; // 0x3b20 int32_t v4 = g130; // bp-8 g138 = g132; if (fseek(stream, offset, SEEK_SET) != 0) { // 0x3b44 // branch -> 0x3b94 // 0x3b94 *(int32_t *)g138 = *(int32_t *)0x3bcc + 0x3b50; g134 = v1; g135 = v2; g138 = v3; g130 = v4; return 0; } int32_t result = 0; // R4 g135 = 0; // branch -> 0x3b58 while (true) { int32_t v5 = 0x1000000 * getc((struct _IO_FILE *)(int32_t)stream); if (v5 == -0x1000000) { int32_t v6 = *(int32_t *)0x3bd4; // 0x3ba8 *(int32_t *)g138 = g135 == 0 ? *(int32_t *)0x3bd0 + 0x3bb4 : v6 + 0x3bb8; free((char *)result); g134 = v1; g135 = v2; g138 = v3; g130 = v4; return 0; } int32_t v7 = g135 + 1; // 0x3b6c int32_t mem = (int32_t)realloc((char *)result, v7); // 0x3b78_5 result = mem; int32_t v8 = v5 / 0x1000000; // 0x3b80 *(char *)(g135 + mem) = (char)v8; g135 = v7; if (v8 == 0) { // break -> 0x3b94 break; } // continue -> 0x3b58 } // 0x3b94 *(int32_t *)g138 = 0; g134 = v1; g135 = v2; g138 = v3; g130 = v4; return result; } // Address range: 0x3be0 - 0x3fbf int32_t output_binary_data(char * a1, int32_t a2, int32_t a3, struct _IO_FILE * stream, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12) { int32_t v1; char * v2 = (char *)v1; // bp-60 g133 = (int32_t)stream; int32_t v3 = g134; // 0x3be0 int32_t v4 = g135; // 0x3be0 int32_t v5 = g136; // 0x3be0 int32_t v6 = g137; // 0x3be0 int32_t (*v7)() = (int32_t (*)())g138; int32_t v8 = g130; // bp-8 g130 = &v8; g129 = a3; g135 = a2; g137 = (int32_t)a1; int32_t str; if (a3 < 2) { // 0x3c24 str = 0x7479622e; // branch -> 0x3c38 } else { // 0x3c0c sprintf((char *)&str, (char *)(*(int32_t *)0x3f90 + 0x3c1c)); a3 = g129; // branch -> 0x3c38 } // 0x3c38 g132 = 2 * a3; int32_t format = *(int32_t *)0x3f94 + 0x3c48; // 0x3c40 g128 = format; int32_t str2; int32_t v9 = &str2; // 0x3c44_0 g127 = sprintf((char *)&str2, (char *)format); int32_t v10 = g135; // 0x3c4c g1 = true; g2 = v10 < 0; g3 = v10 == 0; int32_t result; // 0x3fbc_1 int32_t v11; int32_t v12; int32_t v13; int32_t v14; int32_t v15; // 0x3f8c if (v10 == 0) { lab_0x3f68: // 0x3f68 g134 = v14; g135 = v13; g136 = v12; g137 = v11; g138 = v3; g139 = v4; g129 = v5; g130 = v6; v7(); if (g3) { // if_3fb8_0_true v15 = g127 & g128 & g132 & g133; g138 = g136 / 0x40000000 & v15; result = v15; // branch -> after_if_3fb8_0 } else { // 0x3f68 result = g127; // branch -> after_if_3fb8_0 } // after_if_3fb8_0 return result; } uint32_t v16 = g129; // 0x3c54 int32_t v17; int32_t str3; if (v16 == 0) { int32_t v18 = (int32_t)&v2; g134 = v18; g138 = v9; int32_t v19 = *(int32_t *)0x3fac + 0x3e5c; // 0x3e54 int32_t v20 = *(int32_t *)0x3fbc + 0x3e74; // 0x3e6c char * format3 = (char *)v20; int32_t v21 = &str3; // 0x3edc_0 char * format2 = (char *)(*(int32_t *)0x3fb8 + 0x3e68); // branch -> 0x3e80 while (true) { // 0x3e80 int32_t v22; generate_initial_indented_line((int32_t *)v18, &str2, g132, g133, v17, 0, v22); v17 = 0; concatenate((int32_t *)g134, &str2, (char *)&str, v19); uint32_t v23 = g135; // 0x3ea8 uint32_t v24 = v23 < 32 ? v23 : 32; // 0x3eac g137 = v24; uint32_t v25 = g129; // 0x3eb4 int32_t v26 = v23 - v24; // 0x3ebc g136 = g134; g134 = *(int32_t *)0x3fb4 + 0x3e80; g135 = v9; g139 = v21; int32_t v27 = v24 / v25; // R10 char * v28; int32_t v29; // 0x3f58 if (v25 <= v24) { // 0x3ee8 g137 = 0; // branch -> 0x3eec while (true) { // 0x3eec sprintf((char *)&str3, (char *)&str2); v17 = 0; int32_t v30 = g134; // 0x3f20 if (g137 != 0) { // if_3f18_0_true v30 = *(int32_t *)0x3fb0 + 0x3f20; // branch -> after_if_3f18_0 } // after_if_3f18_0 concatenate((int32_t *)g136, &str2, (char *)v30, v21); int32_t v31 = g137 + 1; // 0x3f24 g137 = v31; if (v31 >= v27) { // break -> 0x3f30 break; } // continue -> 0x3eec } // 0x3f30 printf(format2); g132 = (int32_t)v2; g128 = v20; fprintf(stream, format3); v28 = v2; g127 = (int32_t)v28; free(v28); g135 = v26; v29 = g136; g134 = v29; g129 = 0; g1 = true; g2 = v26 < 0; g3 = v23 == v24; if (v23 == v24) { // break -> 0x3f68 break; } v18 = v29; // continue -> 0x3e80 continue; } // 0x3f30 printf(format2); g132 = (int32_t)v2; g128 = v20; fprintf(stream, format3); v28 = v2; g127 = (int32_t)v28; free(v28); g135 = v26; v29 = g136; g134 = v29; g129 = 0; g1 = true; g2 = v26 < 0; g3 = v23 == v24; if (v23 == v24) { // break -> 0x3f68 break; } v18 = v29; // continue -> 0x3e80 } // 0x3f68 g134 = v14; g135 = v13; g136 = v12; g137 = v11; g138 = v3; g139 = v4; g129 = v5; g130 = v6; v7(); if (g3) { // if_3fb8_0_true v15 = g127 & g128 & g132 & g133; g138 = g136 / 0x40000000 & v15; result = v15; // branch -> after_if_3fb8_0 } else { // 0x3f68 result = g127; // branch -> after_if_3fb8_0 } // after_if_3fb8_0 return result; } uint32_t v32 = v16 % 4; // 0x3c60 g134 = v16 - v32; int32_t v33; g138 = &v33; int32_t v34 = *(int32_t *)0x3f98 + 0x3c90; // 0x3c88 int32_t v35 = *(int32_t *)0x3fa8 + 0x3ca8; // 0x3ca0 char * format5 = (char *)v35; int32_t v36 = *(int32_t *)0x3fa0 + 0x3cb4; // 0x3cac char * format4 = (char *)(*(int32_t *)0x3fa4 + 0x3c9c); int32_t v37 = &str3; // 0x3dc8_0 // branch -> 0x3cb4 lab_0x3cb4: while (true) { // 0x3cb4 g136 = (int32_t)&v2; g139 = v9; generate_initial_indented_line((int32_t *)&v2, &str2, g132, g133, v17, 0, v35); v17 = 0; concatenate((int32_t *)&v2, &str2, (char *)&str, v34); int32_t v38 = g135; // 0x3ce4 uint32_t v39 = v38; // 0x3d0c if (v38 > 31) { // if_3cf0_0_true v39 = 32; // branch -> after_if_3cf0_0 } int32_t v40 = v38 - v39; // 0x3cf8 g135 = v40; g139 = v39 / v16; g129 = v16; char * v41; if (v16 <= v39) { // 0x3d18 g136 = 0; int32_t v42 = g137; // 0x3d50 int32_t v43 = v16; // 0x3dac // branch -> 0x3d1c while (true) { int32_t v44 = v42; // 0x3db441 int32_t v45 = 0; // 0x3dac int32_t v46; // 0x3dfc if (v43 >= 4) { int32_t v47 = g134; // 0x3d30 if (v47 != 0) { int32_t v48 = v47 + v42; // 0x3d50 int32_t v49 = 0; // 0x3d58 v33 = *(int32_t *)(v49 + v42); // branch -> 0x3d58 while (v47 != v49 + 4) { // 0x3d58 v49 += 4; v33 = *(int32_t *)(v49 + v42); // continue -> 0x3d58 } // 0x3d88 if (v32 == 0) { // 0x3dc8 g135 = v37; sprintf((char *)&str3, (char *)&str2); v17 = 0; v46 = v36; if (g136 != 0) { lab_if_3df4_0_true: // if_3df4_0_true v46 = *(int32_t *)0x3f9c + 0x3dfc; // branch -> after_if_3df4_0 } lab_after_if_3df4_0: // after_if_3df4_0 concatenate((int32_t *)&v2, &str2, (char *)v46, v37); int32_t v50 = g136 + 1; // 0x3e04 g136 = v50; int32_t v51 = g137 + (v16 + 255) % 256 + 1; // 0x3e0c g137 = v51; if (v50 < g139) { // after_if_3df4_0.dec_label_pc_3d1c_crit_edge v42 = v51; v43 = g129; // branch -> 0x3d1c continue; } else { // 0x3e14 printf(format4); g132 = (int32_t)v2; g128 = v35; fprintf(stream, format5); v41 = v2; g127 = (int32_t)v41; free(v41); g135 = v40; g1 = true; g2 = v40 < 0; g3 = v38 == v39; if (v38 == v39) { // break (via goto) -> 0x3f68 goto lab_0x3f68; } // continue (via goto) -> 0x3cb4 goto lab_0x3cb4; } } else { v44 = v48; v45 = v47; } } else { v44 = v42; v45 = 0; } } int32_t v52 = v43 - v45; // 0x3db8 int32_t v53 = v44; // 0x3db4 g135 = (int32_t)*(char *)v53; // branch -> 0x3db4 while (v52 != 1) { // 0x3db4 v52--; v53++; g135 = (int32_t)*(char *)v53; // continue -> 0x3db4 } // 0x3dc8 g135 = v37; sprintf((char *)&str3, (char *)&str2); v17 = 0; if (g136 == 0) { v46 = v36; goto lab_after_if_3df4_0; } goto lab_if_3df4_0_true; } } // 0x3e14 printf(format4); g132 = (int32_t)v2; g128 = v35; fprintf(stream, format5); v41 = v2; g127 = (int32_t)v41; free(v41); g135 = v40; g1 = true; g2 = v40 < 0; g3 = v38 == v39; if (v38 == v39) { // break -> 0x3f68 break; } // continue -> 0x3cb4 } // 0x3f68 g134 = v14; g135 = v13; g136 = v12; g137 = v11; g138 = v3; g139 = v4; g129 = v5; g130 = v6; v7(); if (g3) { // if_3fb8_0_true v15 = g127 & g128 & g132 & g133; g138 = g136 / 0x40000000 & v15; result = v15; // branch -> after_if_3fb8_0 } else { // 0x3f68 result = g127; // branch -> after_if_3fb8_0 } // after_if_3fb8_0 return result; } // Address range: 0x3fc0 - 0x433f int32_t handle_incbin_data(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, char * a6, int32_t a7, int32_t a8, uint32_t a9) { // 0x3fc0 g133 = a4; int32_t v1 = g134; // 0x3fc0 int32_t v2 = g135; // 0x3fc0 int32_t v3 = g138; // 0x3fc0 int32_t v4 = g129; // 0x3fc0 int32_t v5 = g130; // bp-8 g130 = &v5; g139 = a2; g137 = a4; int32_t * v6 = (int32_t *)(a1 + 4); // 0x3fe0_0 int32_t v7 = *v6; // 0x3fe0 printf("Binary inclusion size: %u\n", v7); g138 = 16; int32_t v8 = v7; // 0x4004 if (v7 < 16) { // if_3ffc_0_true v8 = 16; // branch -> after_if_3ffc_0 } int32_t v9 = v8 % 256; // R4 printf("First %hhu bytes:", (char)v8); if (v9 != 0) { // 0x4018 g135 = 0; g136 = (int32_t)" %02hhx"; int32_t format = (int32_t)" %02hhx"; // 0x4028 int32_t v10 = 0; // 0x4024 // branch -> 0x4024 while (true) { // 0x4024 printf((char *)format, *(char *)(g139 + v10)); int32_t v11 = g135 + 1; // 0x4030 g135 = v11; if (v11 < v9) { // 0x4024 format = g136; v10 = v11; // branch -> 0x4024 continue; } } } // 0x403c putchar(10); g134 = a1; int32_t v12 = *v6; // 0x4048 int32_t v13 = g137; // 0x404c int32_t v14 = g138 & 16 * v12 ^ 0x7f09f; // 0x405c g129 = v14; if ((v12 & 2) == 0) { int32_t v15 = 32; // 0x4078 if (validate_pointers(g139, v12, a3) != 0) { // if_4074_0_true v15 = 96; // branch -> after_if_4074_0 } int32_t v16 = g129 | v15; // 0x4078 g129 = v16; v14 = v16; // branch -> 0x407c } int32_t v17 = v14; // 0x4098 if (*(int32_t *)*(int32_t *)0x1e110 != 0) { int32_t v18 = v14 | 0x80000; // 0x4094 g129 = v18; v17 = v18; // branch -> after_if_4094_0 } uint32_t v19 = get_command((int32_t)"Action for current .incbin: ", v17); // 0x409c g138 = v19; if (v19 < 12) { // 0x4244 if (v19 == 0) { // 0x430c g126 = &g55; exit(0); // UNREACHABLE } // 0x424c if (v19 <= 1 || v19 == 2) { // 0x4254 g135 = v2; g138 = v3; g129 = v4; return 3 - v19; } // 0x4260 if (0x1000000 * *(int32_t *)&g44 / 0x1000000 % 2 != 0) { // 0x4274 return write_header_comment((int32_t *)g134, (struct _IO_FILE *)a3); } uint32_t result = v19 - 3; // 0x4280 if (result < 3) { // 0x42ec g135 = v2; g138 = v3; g129 = v4; return result; } int32_t v20 = *(int32_t *)(g134 + 4); // 0x4294 uint32_t v21 = result % 256; // 0x429c int32_t v22 = v21 == 0 ? 1 : v21 < 32 ? (1 << v21) % 256 : 0; // 0x42a0 int32_t v23; int32_t v24; int32_t v25; int32_t v26; return output_binary_data((char *)g139, v20, v22, (struct _IO_FILE *)a3, v26, v25, v13, a3, v24, a1, v23, v1); } // 0x40ac g137 = 0; g135 = -12; int32_t v27 = g33; // 0x40c4 g136 = v27 + 84; uint32_t v28 = v19 % 256; // 0x40ec uint32_t v29 = v28 - 12; // 0x40ec g1 = v29 > 6; g2 = v28 < 19; g3 = v29 == 7; if (v29 > 7) { // 0x422c return get_command((int32_t)"Action for current .incbin: ", g129); } // 0x40f8 g128 = &g54; int32_t v30 = *(int32_t *)(4 * v29 + (int32_t)&g54); // 0x4100 g127 = v30; ((int32_t (*)(int32_t, int32_t))(v30 + (int32_t)&g54))(v30, (int32_t)&g54); if (g3) { // after_if_4114_0 abort(); // UNREACHABLE } // after_if_4124_0 g138 = a9; int32_t v31 = *(int32_t *)(g134 + 4); // 0x4130 g137 = v31; g135 = 0; int32_t v32 = 256 * (a9 % 256) | 16; // 0x413c g134 = v32; // branch -> 0x4140 int32_t v33; int32_t v34; // 0x4178 while (true) { // 0x4140 dump_data_line_as_text((struct _IO_FILE *)g136, g139, v32 - 16, v31, v27, (int32_t)"Script file: ", v13, a3, 0); int32_t v35 = g135 + 1; // 0x4154 g135 = v35; if (v35 % 256 <= 15) { uint32_t v36 = g134; // 0x4164 int32_t v37 = v36 + 16; // 0x4164 int32_t v38 = g137; // 0x4168 g134 = v37; if (v36 >= v38) { // break -> 0x4174 break; } v31 = v38; v32 = v37; // continue -> 0x4140 continue; } // 0x4174 g134 = v33; v34 = g138 + 1; g138 = v34; g137 = 0; g135 = -12; if (256 * (v34 % 256) >= *(int32_t *)(v33 + 4)) { // 0x422c return get_command((int32_t)"Action for current .incbin: ", g129); } // if_4194_0_true g138 = 0; // branch -> 0x422c // 0x422c return get_command((int32_t)"Action for current .incbin: ", g129); } // 0x4174 g134 = v33; v34 = g138 + 1; g138 = v34; g137 = 0; g135 = -12; if (256 * (v34 % 256) < *(int32_t *)(v33 + 4)) { // if_4194_0_true g138 = 0; // branch -> 0x422c } // 0x422c return get_command((int32_t)"Action for current .incbin: ", g129); } // Address range: 0x4340 - 0x4397 int32_t preview_incbin(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g134; // 0x4340 int32_t v2 = g135; // 0x4340 int32_t v3 = g136; // 0x4340 int32_t v4 = g137; // 0x4340 int32_t v5 = g138; // 0x4340 int32_t v6 = g130; // bp-8 g130 = &v6; g138 = a1; g134 = a3; g135 = a2; g136 = 0; int32_t v7 = g33 + 84; // 0x4360 g137 = v7; // branch -> 0x4364 while (true) { // 0x4364 dump_data_line_as_text((struct _IO_FILE *)v7, a1, a2, a3, v1, v2, v3, v4, v5); int32_t v8 = g135 + 16; // 0x4378 g135 = v8; uint32_t v9 = g134; // 0x437c g1 = v8 >= v9; g3 = v8 == v9; uint32_t v10 = g136; // 0x4380 if (v8 >= v9) { int32_t result = v10 % 256; // 0x43847 g127 = result; // branch -> 0x4390 // 0x4390 g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g130 = v6; return result; } int32_t v11 = v10 + 1; // 0x4380 g136 = v11; uint32_t result2 = v11 % 256; // 0x43842 g127 = result2; g1 = result2 > 15; g3 = result2 == 16; if (result2 <= 15) { // 0x4364 a3 = v9; a2 = v8; a1 = g138; v7 = g137; // branch -> 0x4364 continue; } // 0x4390 g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g130 = v6; return result2; } } // Address range: 0x4398 - 0x445b int32_t dump_incbin_as_text(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12) { int32_t v1 = g135; // 0x4398 int32_t v2 = g130; // bp-8 g130 = &v2; g135 = a1; g134 = a2; printf("File to write: "); int32_t result = read_line((struct _IO_FILE *)g33); // 0x43bc char * file_path = (char *)result; // 0x43c4_0 if (*file_path != 0) { // 0x43d0 return (int32_t)fopen(file_path, "w"); } // 0x4440 g135 = v1; free(file_path); return result; } // Address range: 0x445c - 0x44e7 int32_t get_dump_file(char * a1, int32_t a2, int32_t a3) { int32_t v1 = g135; // 0x445c int32_t v2 = g130; // bp-8 g130 = &v2; g135 = (int32_t)a1; printf("File to write: "); int32_t v3 = read_line((struct _IO_FILE *)g33); // 0x447c char * file_path = (char *)v3; // 0x4484_0 if (*file_path == 0) { // 0x44c8 free((char *)v3); g135 = v1; return 0; } struct _IO_FILE * file = fopen(file_path, (char *)g135); // 0x4498 g135 = (int32_t)file; char * v4 = (char *)v3; if (file != NULL) { // 0x44a8 free(v4); int32_t result = g135; // 0x44b0 g135 = v1; return result; } // 0x44b8 printf("err: could not open file %s for writing\n", v4); // branch -> 0x44c8 // 0x44c8 free((char *)v3); g135 = v1; return 0; } // Address range: 0x44e8 - 0x4647 int32_t dump_data_line_as_text(struct _IO_FILE * stream, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9) { int32_t v1 = g134; // 0x44e8 int32_t v2 = g135; // 0x44e8 int32_t v3 = g136; // 0x44e8 int32_t v4 = g137; // 0x44e8 int32_t v5 = g138; // 0x44e8 int32_t v6 = g139; // 0x44e8 int32_t v7 = g129; // 0x44e8 int32_t v8 = g130; // bp-8 int32_t v9 = g126; // 0x44e8 g130 = &v8; g134 = (int32_t)stream; g138 = a2; g139 = a3; fprintf(stream, "%08x: ", a3); uint32_t v10 = a4 - g139; // 0x4514 int32_t v11 = v10 > 16 ? 16 : v10 % 256; // 0x451c g136 = v11; int32_t v12; // 0x458c int32_t stream2; // 0x4620 int32_t v13; // 0x45d0 uint32_t v14; // 0x45dc if (v11 == 0) { // 0x456c g135 = 0; // branch -> 0x4570 } else { // 0x452c g135 = 0; int32_t v15 = 0; // 0x453c // branch -> 0x453c while (true) { char v16 = *(char *)(g138 + g139 + v15); // 0x4544 fprintf((struct _IO_FILE *)g134, (char *)(int32_t)"%02hhx ", v16); int32_t v17 = g135 + 1; // 0x4550 g135 = v17; uint32_t v18 = v17 % 256; // 0x4554 if (v18 >= g136) { // 0x4560 if (v18 < 16) { // 0x4570 // branch -> 0x4578 while (true) { // 0x4578 fwrite((char *)(int32_t)" ", 3, 1, (struct _IO_FILE *)g134); v12 = g135 + 1; g135 = v12; if (v12 % 256 < 16) { lab_0x4578: // 0x4578 // branch -> 0x4578 continue; } } } // 0x459c fwrite(" ", 2, 1, (struct _IO_FILE *)g134); if (g136 != 0) { // 0x45bc g129 = 0; g135 = *(int32_t *)&g39; v13 = *(int32_t *)0x1e144; g137 = v13; v14 = (int32_t)*(char *)(g138 + g139); if (v14 % 8 == 0) { // 0x4600 return putc(64, (struct _IO_FILE *)g134); } // 0x45f0 return fputs((char *)*(int32_t *)(4 * v14 + v13), (struct _IO_FILE *)g134); } // 0x461c stream2 = g134; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g139 = v6; g129 = v7; g130 = v8; g126 = v9; return putc(10, (struct _IO_FILE *)stream2); } // 0x453c v15 = v18; // branch -> 0x453c } } // 0x4570 // branch -> 0x4578 while (true) { // 0x4578 fwrite((char *)(int32_t)" ", 3, 1, (struct _IO_FILE *)g134); v12 = g135 + 1; g135 = v12; if (v12 % 256 < 16) { goto lab_0x4578; } // 0x459c fwrite(" ", 2, 1, (struct _IO_FILE *)g134); if (g136 != 0) { // 0x45bc g129 = 0; g135 = *(int32_t *)&g39; v13 = *(int32_t *)0x1e144; g137 = v13; v14 = (int32_t)*(char *)(g138 + g139); if (v14 % 8 == 0) { // 0x4600 return putc(64, (struct _IO_FILE *)g134); } // 0x45f0 return fputs((char *)*(int32_t *)(4 * v14 + v13), (struct _IO_FILE *)g134); } // 0x461c stream2 = g134; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g139 = v6; g129 = v7; g130 = v8; g126 = v9; return putc(10, (struct _IO_FILE *)stream2); } } // Address range: 0x4648 - 0x470b int32_t dump_incbin_as_binary(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11) { int32_t v1 = g135; // 0x4648 int32_t v2 = g130; // bp-8 g130 = &v2; g134 = a1; g135 = a2; printf("File to write: "); int32_t result = read_line((struct _IO_FILE *)g33); // 0x466c char * file_path = (char *)result; // 0x4674_0 if (*file_path != 0) { // 0x4680 return (int32_t)fopen(file_path, "wb"); } // 0x46ec g135 = v1; free(file_path); return result; } // Address range: 0x470c - 0x4867 char * get_incbin_data(void) { int32_t v1 = g135; // 0x470c int32_t v2 = g136; // 0x470c int32_t v3 = g137; // 0x470c int32_t v4 = g138; // 0x470c int32_t v5 = g130; // bp-8 g130 = &v5; char * found_char_pos = strchr(strstr((char *)g127, ".incbin"), 34); // 0x4724 int32_t v6; // 0x484c if (found_char_pos == NULL) { // 0x47b8 puts("err: no filename specified"); // branch -> 0x4848 // 0x4848 g138 = 0; // branch -> 0x484c // 0x484c v6 = g138; g135 = v1; g136 = v2; g137 = v3; g138 = v4; g130 = v5; return (char *)v6; } int32_t str = (int32_t)found_char_pos + 1; // 0x4730 char * found_char_pos2 = strchr((char *)str, 34); // 0x473c int32_t v7 = (int32_t)found_char_pos2; // 0x473c_4 g135 = v7; if (found_char_pos2 == NULL) { // 0x47c8 puts("err: invalid filename specification"); // branch -> 0x4848 // 0x4848 g138 = 0; // branch -> 0x484c } else { int32_t v8 = v7 - str; // 0x474c g137 = v8; char * mem = malloc(v8 + 9); // 0x4754 int32_t v9 = (int32_t)mem; // 0x4754_3 g138 = v9; int32_t v10 = v9 + 8; // 0x475c g134 = v10; int32_t v11 = 0; // R9 *(int32_t *)mem = 0; *(int32_t *)(g138 + 4) = v11; __aeabi_memcpy((char *)v10, (char *)str, g137); *(char *)(g137 + g134) = (char)v11; char * found_char_pos3 = strchr((char *)g135, 44); // 0x4788 if (found_char_pos3 != NULL) { int32_t str2 = (int32_t)found_char_pos3 + 1; // 0x4794 g136 = str2; char * found_char_pos4 = strchr((char *)str2, 44); // 0x47a0 int32_t v12 = (int32_t)found_char_pos4; // 0x47a0_4 g135 = v12; int32_t len; if (found_char_pos4 == NULL) { // 0x47d8 len = strlen((char *)g136); // branch -> 0x47e4 } else { // 0x47b0 len = v12 - g136; // branch -> 0x47e4 } int32_t v13 = get_value_from_string((char *)g136, len); // 0x47e8 *(int32_t *)g138 = v13; if (v13 == -1) { // 0x4834 // branch -> 0x483c // 0x483c puts((char *)(int32_t)"err: invalid offset"); free((char *)g138); // branch -> 0x4848 // 0x4848 g138 = 0; // branch -> 0x484c } else { int32_t v14 = g135; // 0x47f8 if (v14 != 0) { int32_t str3 = v14 + 1; // 0x4800 g134 = str3; int32_t len2 = strlen((char *)str3); // 0x4808 int32_t v15 = get_value_from_string((char *)g134, len2); // 0x4814 *(int32_t *)(g138 + 4) = v15; if (v15 <= 0) { // 0x483c puts((char *)(int32_t)"err: invalid length"); free((char *)g138); // branch -> 0x4848 // 0x4848 g138 = 0; // branch -> 0x484c } } } // 0x484c v6 = g138; g135 = v1; g136 = v2; g137 = v3; g138 = v4; g130 = v5; return (char *)v6; } } // 0x484c v6 = g138; g135 = v1; g136 = v2; g137 = v3; g138 = v4; g130 = v5; return (char *)v6; } // Address range: 0x4868 - 0x48c7 int32_t is_incbin(char * str) { int32_t v1 = g134; // bp-16 int32_t v2 = g135; // 0x4868 int32_t v3 = g130; // bp-8 char * substr_pos = strstr(str, ".incbin"); // 0x4880 g135 = (int32_t)substr_pos; if (substr_pos == NULL) { // 0x48bc g134 = v1; g135 = v2; g130 = v3; return 0; } char * found_char_pos = strchr((char *)(int32_t)str, 64); // 0x4898 uint32_t v4 = g135; // 0x489c int32_t v5 = 0; // 0x48b4 if (found_char_pos == NULL) { // if_48b0_0_true v5 = 1; // branch -> after_if_48b0_0 } // after_if_48b0_0 g134 = v1; g135 = v2; g130 = v3; return v5 | (int32_t)(v4 < (int32_t)found_char_pos); } // Address range: 0x48c8 - 0x49d3 int32_t write_header_comment(int32_t * a1, struct _IO_FILE * stream) { int32_t v1; char * v2 = (char *)v1; // bp-40 int32_t v3 = (int32_t)a1; int32_t v4 = g134; // 0x48c8 int32_t v5 = g135; // 0x48c8 int32_t v6 = g136; // 0x48c8 int32_t v7 = g137; // 0x48c8 int32_t v8 = g138; // 0x48c8 int32_t v9 = g139; // 0x48c8 int32_t v10 = g130; // bp-8 g130 = &v10; int32_t v11 = *a1; // 0x48dc g134 = v11; int32_t v12 = *(int32_t *)(v3 + 4); // 0x48dc g139 = v12; g138 = (int32_t)stream; char * mem = malloc(1); // 0x48e4 g137 = 0; g136 = (int32_t)&v2; v2 = mem; *mem = 0; int32_t v13 = g137; concatenate((int32_t *)&v2, &v13, ".incbin \"", v3 + 8); int32_t str; g135 = &str; sprintf((char *)&str, "0x%08x", v11); concatenate((int32_t *)&v2, &v13, (char *)&str, (int32_t)", "); sprintf((char *)&str, "0x%x", v12); concatenate((int32_t *)&v2, &v13, (char *)&str, 0); int32_t result = (int32_t)v2; // R4 printf(">>>> @ replacing: %s\n", v2); g132 = result; fprintf(stream, "@ replacing %s\n", (char *)result); free((char *)result); g134 = v4; g135 = v5; g136 = v6; g137 = v7; g138 = v8; g139 = v9; g130 = v10; return result; } // Address range: 0x49d4 - 0x4aab int32_t generate_incbin(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g134; // 0x49d4 int32_t v2 = g135; // 0x49d4 int32_t v3 = g136; // 0x49d4 int32_t v4 = g137; // 0x49d4 int32_t v5 = g138; // 0x49d4 int32_t v6 = g139; // 0x49d4 int32_t v7 = g130; // bp-8 g130 = &v7; g134 = a1; g138 = a3; g137 = a2; char * mem = malloc(1); // 0x49f0 g135 = 0; char * v8; // bp-36 g139 = (int32_t)&v8; int32_t v9; // bp-40 g136 = &v9; v8 = mem; *mem = 0; v9 = g135; concatenate((int32_t *)&v8, &v9, ".incbin \"", a1); int32_t str; g134 = &str; sprintf((char *)&str, "0x%08x", a2); concatenate((int32_t *)&v8, &v9, (char *)&str, (int32_t)", "); sprintf((char *)&str, "0x%x", a3); concatenate((int32_t *)&v8, &v9, (char *)&str, 0); int32_t result = (int32_t)v8; g127 = result; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g139 = v6; g130 = v7; return result; } // Address range: 0x4aac - 0x4bdf int32_t write_incbin_for_segment(int32_t a1, int32_t a2, int32_t a3, struct _IO_FILE * a4) { // 0x4aac int32_t v1; char * str = (char *)v1; // bp-60 int32_t v2; char * v3 = (char *)v2; // bp-40 int32_t v4 = g134; // 0x4aac int32_t v5 = g135; // 0x4aac int32_t v6 = g136; // 0x4aac int32_t v7 = g137; // 0x4aac int32_t v8 = g138; // 0x4aac int32_t v9 = g129; // 0x4aac int32_t v10 = g130; // 0x4aac int32_t v11 = v10; // bp-8 g130 = &v11; g135 = a3; g138 = (int32_t)a4; g136 = a2; g134 = a1; int32_t result; // 0x4bc0_2 if (a3 != 0) { char * mem = malloc(1); // 0x4ad4 g137 = 0; g129 = (int32_t)&v3; int32_t v12; g139 = &v12; v3 = mem; *mem = 0; int32_t v13 = g137; // 0x4afc v12 = v13; concatenate((int32_t *)&v3, &v12, ".incbin \"", g134); int32_t v14 = (int32_t)&str; g134 = v14; sprintf((char *)&str, "0x%08x", g136); concatenate((int32_t *)&v3, &v12, (char *)&str, (int32_t)", "); sprintf((char *)&str, "0x%x", g135); concatenate((int32_t *)&v3, &v12, (char *)&str, 0); g134 = (int32_t)v3; generate_initial_indented_line((int32_t *)&str, NULL, v14, 0, (int32_t)(char *)g137, v13, 0); printf(">>>> %s%s\n", str, (char *)g134); fprintf((struct _IO_FILE *)g138, "%s%s\n", str, (char *)g134); free((char *)g134); free(str); result = (int32_t)str; // branch -> 0x4bbc } else { result = a1; v11 = v10; } // 0x4bbc g134 = v4; g135 = v5; g136 = v6; g137 = v7; g138 = v8; g129 = v9; g130 = v11; return result; } // Address range: 0x4be0 - 0x4db7 int32_t parse_incbin(int32_t * a1, int32_t a2, int32_t a3) { int32_t v1 = g134; // 0x4be0 int32_t v2 = g135; // 0x4be0 int32_t v3 = g136; // 0x4be0 int32_t v4 = g138; // 0x4be0 int32_t v5 = g139; // 0x4be0 int32_t v6 = g129; // 0x4be0 int32_t v7 = g130; // bp-8 g130 = &v7; g136 = (int32_t)a1; g139 = g133; g138 = a3; g134 = a2; g137 = 1; char * mem = malloc(1); // 0x4c04 int32_t v8 = 0; // R2 char * file_path = mem; // bp-40 *mem = 0; int32_t v9 = v8; // bp-44 int32_t v10 = g136 + 8; // bp-56 concatenate((int32_t *)&file_path, &v9, (char *)a2, (int32_t)&g117); g134 = (int32_t)fopen(file_path, "rb"); free(file_path); int32_t stream = g134; // 0x4c54 if (stream == 0) { // 0x4d24 puts("err: could not open file for reading"); // branch -> 0x4d74 } else { int32_t v11 = g136; // 0x4c5c int32_t offset = *(int32_t *)v11; // 0x4c5c int32_t v12; // 0x4ca0 char * mem2; // 0x4cc0 int32_t items_read; // 0x4ce8 int32_t v13; // 0x4d88 int32_t v14; int32_t v15; // 0x4cb0 int32_t v16; // 0x4d04 int32_t v17; // 0x4d08 int32_t v18; // 0x4d0c int32_t size; // 0x4c90 int32_t v19; // 0x4ce0 int32_t v20; // 0x4cf4 int32_t v21; // 0x4d04 int32_t v22; // 0x4cb4 if (offset != 0) { // 0x4c68 if (fseek((struct _IO_FILE *)stream, offset, SEEK_SET) != 0) { // 0x4c7c fclose((struct _IO_FILE *)g134); // branch -> 0x4d6c // 0x4d6c puts((char *)(int32_t)"err: could not seek on file"); g137 = 1; // branch -> 0x4d74 // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4c68 // branch -> 0x4c90 // 0x4c90 size = *(int32_t *)(g136 + 4); g135 = size; if (size != 0) { // 0x4cbc mem2 = malloc(size); g129 = (int32_t)mem2; if (mem2 == NULL) { // 0x4d34 fclose((struct _IO_FILE *)g134); // branch -> 0x4d6c // 0x4d6c puts((char *)(int32_t)"err: out of memory"); g137 = 1; // branch -> 0x4d74 // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4cd0 v19 = g138; g137 = 1; items_read = fread(mem2, 1, g135, (struct _IO_FILE *)g134); g135 = items_read; v20 = *(int32_t *)(g136 + 4); g138 = v20; fclose((struct _IO_FILE *)g134); if (items_read == v20) { // 0x4d04 v16 = g139; v21 = *(int32_t *)v16; v17 = g136; v18 = g129; if (v21 == 0) { // 0x4d80 v13 = handle_incbin_data(v17, v18, v19, v16, v10, (char *)v8, v19, v9, (int32_t)file_path); v14 = v13; // branch -> 0x4d8c } else { // 0x4d18 v14 = run_script_auto(v17, v18, (char *)v21, (struct _IO_FILE *)v19); // branch -> 0x4d8c } // 0x4d8c g137 = v14; free((char *)g129); // branch -> 0x4d74 } else { // 0x4d48 printf("err: could not read %u bytes from file\n", *(int32_t *)(g136 + 4)); // branch -> 0x4d74 } // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4c9c v12 = get_file_length((struct _IO_FILE *)g134); v9 = v12; if (v12 == 0) { // 0x4d5c fclose((struct _IO_FILE *)g134); // branch -> 0x4d6c // 0x4d6c puts((char *)(int32_t)"err: could not get file length for file"); g137 = 1; // branch -> 0x4d74 // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4cb0 v15 = g136; v22 = v12 - *(int32_t *)v15; g135 = v22; *(int32_t *)(v15 + 4) = v22; // branch -> 0x4cbc // 0x4cbc mem2 = malloc(g135); g129 = (int32_t)mem2; if (mem2 == NULL) { // 0x4d34 fclose((struct _IO_FILE *)g134); // branch -> 0x4d6c // 0x4d6c puts((char *)(int32_t)"err: out of memory"); g137 = 1; // branch -> 0x4d74 // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4cd0 v19 = g138; g137 = 1; items_read = fread(mem2, 1, g135, (struct _IO_FILE *)g134); g135 = items_read; v20 = *(int32_t *)(g136 + 4); g138 = v20; fclose((struct _IO_FILE *)g134); if (items_read == v20) { // 0x4d04 v16 = g139; v21 = *(int32_t *)v16; v17 = g136; v18 = g129; if (v21 == 0) { // 0x4d80 v13 = handle_incbin_data(v17, v18, v19, v16, v10, (char *)v8, v19, v9, (int32_t)file_path); v14 = v13; // branch -> 0x4d8c } else { // 0x4d18 v14 = run_script_auto(v17, v18, (char *)v21, (struct _IO_FILE *)v19); // branch -> 0x4d8c } // 0x4d8c g137 = v14; free((char *)g129); // branch -> 0x4d74 } else { // 0x4d48 printf("err: could not read %u bytes from file\n", *(int32_t *)(g136 + 4)); // branch -> 0x4d74 } // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4c90 size = *(int32_t *)(v11 + 4); g135 = size; if (size == 0) { // 0x4c9c v12 = get_file_length((struct _IO_FILE *)g134); v9 = v12; if (v12 == 0) { // 0x4d5c fclose((struct _IO_FILE *)g134); // branch -> 0x4d6c // 0x4d6c puts((char *)(int32_t)"err: could not get file length for file"); g137 = 1; // branch -> 0x4d74 // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4cb0 v15 = g136; v22 = v12 - *(int32_t *)v15; g135 = v22; *(int32_t *)(v15 + 4) = v22; // branch -> 0x4cbc // 0x4cbc mem2 = malloc(g135); g129 = (int32_t)mem2; if (mem2 == NULL) { // 0x4d34 fclose((struct _IO_FILE *)g134); // branch -> 0x4d6c // 0x4d6c puts((char *)(int32_t)"err: out of memory"); g137 = 1; // branch -> 0x4d74 // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4cd0 v19 = g138; g137 = 1; items_read = fread(mem2, 1, g135, (struct _IO_FILE *)g134); g135 = items_read; v20 = *(int32_t *)(g136 + 4); g138 = v20; fclose((struct _IO_FILE *)g134); if (items_read == v20) { // 0x4d04 v16 = g139; v21 = *(int32_t *)v16; v17 = g136; v18 = g129; if (v21 == 0) { // 0x4d80 v13 = handle_incbin_data(v17, v18, v19, v16, v10, (char *)v8, v19, v9, (int32_t)file_path); v14 = v13; // branch -> 0x4d8c } else { // 0x4d18 v14 = run_script_auto(v17, v18, (char *)v21, (struct _IO_FILE *)v19); // branch -> 0x4d8c } // 0x4d8c g137 = v14; free((char *)g129); // branch -> 0x4d74 } else { // 0x4d48 printf("err: could not read %u bytes from file\n", *(int32_t *)(g136 + 4)); // branch -> 0x4d74 } // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4cbc mem2 = malloc(size); g129 = (int32_t)mem2; if (mem2 == NULL) { // 0x4d34 fclose((struct _IO_FILE *)g134); // branch -> 0x4d6c // 0x4d6c puts((char *)(int32_t)"err: out of memory"); g137 = 1; // branch -> 0x4d74 // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4cd0 v19 = g138; g137 = 1; items_read = fread(mem2, 1, g135, (struct _IO_FILE *)g134); g135 = items_read; v20 = *(int32_t *)(g136 + 4); g138 = v20; fclose((struct _IO_FILE *)g134); if (items_read == v20) { // 0x4d04 v16 = g139; v21 = *(int32_t *)v16; v17 = g136; v18 = g129; if (v21 == 0) { // 0x4d80 v13 = handle_incbin_data(v17, v18, v19, v16, v10, (char *)v8, v19, v9, (int32_t)file_path); v14 = v13; // branch -> 0x4d8c } else { // 0x4d18 v14 = run_script_auto(v17, v18, (char *)v21, (struct _IO_FILE *)v19); // branch -> 0x4d8c } // 0x4d8c g137 = v14; free((char *)g129); // branch -> 0x4d74 } else { // 0x4d48 printf("err: could not read %u bytes from file\n", *(int32_t *)(g136 + 4)); // branch -> 0x4d74 } // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // 0x4d74 g134 = v1; g135 = v2; g136 = v3; g138 = v4; g139 = v5; g129 = v6; g130 = v7; return g137; } // Address range: 0x4db8 - 0x4e9b int32_t validate_pointers(int32_t a1, uint32_t a2, int32_t a3) { // 0x4db8 g127 = a1; g128 = a2; int32_t v1 = g134; // bp-24 int32_t v2 = g135; // 0x4db8 int32_t v3 = g136; // 0x4db8 int32_t v4 = g137; // 0x4db8 int32_t v5 = g130; // bp-8 g130 = &v5; g126 = 0; g131 = 0x203ffff; g133 = 4; int32_t v6 = 4; // 0x4dec // branch -> 0x4de0 int32_t result; // 0x4e88 while (true) { uint32_t v7 = v6 - 4; // 0x4de0 g1 = v7 >= a2; g3 = v7 == a2; if (v7 < a2) { // 0x4e90 g127 = g126; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g130 = v5; return g126; } int32_t v8 = g127 + v6; // 0x4dec g132 = 0; unsigned char v9 = *(char *)(v8 - 1); // 0x4df4 int32_t v10 = v9; // 0x4df4 g135 = v10; g1 = v9 > 8; g2 = v9 < 9; g3 = v9 == 9; if (v9 > 9) { result = 0; // 0x4e88 g127 = result; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g130 = v5; return result; } int32_t v11 = (int32_t)*(char *)(v8 - 3); // 0x4e00 g137 = v11; char v12 = *(char *)(v8 - 4); // 0x4e04 char v13 = *(char *)(v8 - 2); // 0x4e08 g136 = &g56; g134 = 256 * v11 | 0x1000000 * v10 | (int32_t)v12 | 0x10000 * (int32_t)v13; int32_t v14 = 4 * v10; // 0x4e1c g135 = v14; int32_t v15 = *(int32_t *)(v14 + (int32_t)&g56); // 0x4e20 g135 = v15; ((int32_t (*)())(v15 + (int32_t)&g56))(); if (g3) { // if_4e44_0_true g127 = 0; // branch -> after_if_4e44_0 } int32_t v16 = g133 + 4; // 0x4e50 g133 = v16; int32_t v17 = g134; // 0x4e54 g1 = true; g3 = v17 == 0; if (v17 != 0) { // break -> after_if_4e44_0.dec_label_pc_4e88_crit_edge break; } v6 = v16; // continue -> 0x4de0 } // after_if_4e44_0.dec_label_pc_4e88_crit_edge result = g132; // branch -> 0x4e88 // 0x4e88 g127 = result; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g130 = v5; return result; } // Address range: 0x4e9c - 0x4ef3 int32_t output_pointers(int32_t result, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8) { int32_t v1 = g135; // 0x4e9c int32_t v2 = g130; // bp-8 g130 = &v2; g135 = a2; g134 = a3; g136 = result; if (a2 == 0) { // if_4eb4_0_true g135 = v1; return result; } // after_if_4eb4_0 g137 = 0; int32_t v3 = 0; // 0x4ec0 // branch -> 0x4ebc while (true) { int32_t v4 = result + v3; // 0x4ec0 char v5 = *(char *)v4; // 0x4ec0 int32_t v6 = (int32_t)*(char *)(v4 + 1); // 0x4ec4 g132 = v6; int32_t v7 = (int32_t)*(char *)(v4 + 2); // 0x4ec8 g133 = v7; char v8 = *(char *)(v4 + 3); // 0x4ecc int32_t result2 = output_pointer(256 * v6 | (int32_t)v5 | 0x10000 * v7 | 0x1000000 * (int32_t)v8, (struct _IO_FILE *)a3); // 0x4ee0 g127 = result2; int32_t v9 = g137 + 4; // 0x4ee4 g137 = v9; uint32_t v10 = g135; // 0x4ee8 g1 = v9 >= v10; g2 = v9 - v10 < 0; g3 = v9 == v10; if (v9 >= v10) { // 0x4ef0 g134 = a5; g135 = a6; g136 = a7; g137 = a8; int32_t v11; g130 = v11; int32_t v12; ((int32_t (*)())v12)(); return result2; } // 0x4ebc a3 = g134; v3 = v9; result = g136; // branch -> 0x4ebc } } // Address range: 0x4ef4 - 0x503b int32_t output_pointer(int32_t a1, struct _IO_FILE * a2) { int32_t v1 = g134; // 0x4ef4 int32_t v2 = g135; // 0x4ef4 int32_t v3 = g136; // 0x4ef4 int32_t v4 = g137; // 0x4ef4 int32_t v5 = g130; // bp-8 g130 = &v5; int32_t v6; g136 = &v6; int32_t v7; g137 = &v7; g134 = (int32_t)a2; g135 = a1; int32_t v8; generate_initial_indented_line(&v6, &v7, g132, g133, v8, 0, 0); concatenate(&v6, &v7, ".4byte ", 0); int32_t v9 = g135; // 0x4f34 int32_t format; int32_t result; // 0x5008 if (v9 == 0) { // 0x4fe4 printf(">>>> %s0\n", (char *)v6); format = (int32_t)"%s0\n"; // branch -> 0x5000 } else { // 0x4f3c int32_t str; if (g24 != 0) { int32_t v10 = find_symbol_for_address(v9); // 0x4f54 if (v10 == 0) { // 0x4f50 // branch -> 0x4f98 // 0x4f98 g136 = &str; sprintf((char *)&str, "0x%x", g135); concatenate(&v6, &v7, (char *)&str, 0); // branch -> 0x4fc4 } else { // 0x4f64 g137 = 0; int32_t v11 = *(int32_t *)v10; // 0x4f6c int32_t v12 = g135; // 0x4f78 g135 = v12 - v11; int32_t v13 = &g120; // 0x4f8c if (v12 != v11) { // if_4f80_0_true v13 = (int32_t)" + "; // branch -> after_if_4f80_0 } // after_if_4f80_0 concatenate(&v6, &v7, (char *)(v10 + 9), v13); int32_t v14 = g135; // 0x4f90 if (v14 != 0) { // 0x4f98 g136 = &str; sprintf((char *)&str, "0x%x", v14); concatenate(&v6, &v7, (char *)&str, 0); // branch -> 0x4fc4 } } // 0x4fc4 printf(">>>> %s\n", (char *)v6); format = (int32_t)"%s\n"; // branch -> 0x5000 // 0x5000 g132 = v6; g128 = format; fprintf((struct _IO_FILE *)g134, (char *)format); result = v6; free((char *)result); g134 = v1; g135 = v2; g136 = v3; g137 = v4; g130 = v5; return result; } // 0x4f98 g136 = &str; sprintf((char *)&str, "0x%x", v9); concatenate(&v6, &v7, (char *)&str, 0); // branch -> 0x4fc4 // 0x4fc4 printf(">>>> %s\n", (char *)v6); format = (int32_t)"%s\n"; // branch -> 0x5000 } // 0x5000 g132 = v6; g128 = format; fprintf((struct _IO_FILE *)g134, (char *)format); result = v6; free((char *)result); g134 = v1; g135 = v2; g136 = v3; g137 = v4; g130 = v5; return result; } // Address range: 0x503c - 0x5343 int32_t handle_incbin_text(int32_t * a1, int32_t a2, struct _IO_FILE * a3, int32_t a4, int32_t a5, int32_t a6, char * format2, char * format, int32_t a9, int32_t a10) { int32_t v1 = (int32_t)a3; int32_t v2 = g135; // 0x503c int32_t v3 = g138; // 0x503c int32_t v4 = g130; // bp-8 g130 = &v4; g135 = a2; g136 = (int32_t)a1; int32_t v5; int32_t v6; int32_t v7; int32_t v8; generate_initial_indented_line(&v5, NULL, v1, a4, v8, v7, v6); int32_t v9 = g136 + 8; // 0x5068 int32_t v10 = g135; // 0x5074 int32_t v11 = 1 - v10; // 0x5074 g134 = 0; char * format3 = "%s.string \"%s\"\n"; // bp-88 // branch -> 0x5234 while (true) { int32_t v12 = v10; // 0x523c int32_t v13 = v11; // 0x5238 int32_t v14 = 0; // 0x5238 int32_t v15 = 0; // 0x5234 int32_t v16 = 0; // 0x52b82 // branch -> 0x5234 while (true) { lab_0x5234_2: // 0x5234 g137 = v13 - v14; g139 = v14 + v12; int32_t v17 = v15; // branch -> 0x50e0 while (true) { // 0x50e0 // branch -> 0x50e0 int32_t v18; // 0x5118 int32_t v19; int32_t v20; int32_t v21; int32_t v22; int32_t v23; int32_t v24; // 0x52b81 int32_t v25; // 0x51c8 while (true) { int32_t v26 = g136; // 0x50e0 uint32_t v27 = *(int32_t *)(v26 + 4); // 0x50e0 uint32_t v28 = g134; // 0x50e4 int32_t n = v27 - v28; // 0x50e4 if (v27 <= v28) { // 0x52b8 write_incbin_for_segment(v9, *(int32_t *)v26 + v16, v27 - v16, a3); free((char *)v5); g135 = v2; g138 = v3; return 0; } // 0x50ec g129 = n; char * found_byte_pos = memchr((char *)g139, 255, n); // 0x50fc int32_t v29 = (int32_t)found_byte_pos; // 0x50fc_6 int32_t v30; // 0x51c8 if (found_byte_pos == NULL) { // after_if_5104_0thread-pre-split v30 = g129; // branch -> after_if_5104_0 } else { int32_t v31 = g137 + v29; // 0x5104 g129 = v31; v30 = v31; // branch -> after_if_5104_0 } // after_if_5104_0 if (v30 < 1000) { // 0x51c0 g135 = v10; v25 = g134 + v30; g134 = v25; v24 = v16; // branch -> 0x50d0 } else { // 0x5110 v18 = parse_buffer((char *)g139, v30, n, g133, a5, a6, (int32_t)format2, (int32_t)format, a9, a10, v19, v20, v21, v22, v23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0, NULL, 0, 0, NULL, 0, 0, 0, 0, 0); g138 = v18; if (v18 != 0) { // break -> 0x5128 break; } // continue -> 0x50e0 continue; } lab_0x50d0: // 0x50d0 v12 = v10; v13 = v11; v14 = v25; v15 = v17; v16 = v24; // branch -> 0x5234 goto lab_0x5234_2; } // 0x5128 if (v17 == 0) { // 0x5134 printf("String found:\n%s\n", (char *)v18); uint32_t v32 = get_command((int32_t)"Keep string? ", (int32_t)&g125 & 0xffff | 0x20000); // 0x5154 g1 = v32 > 16; g2 = v32 < 17; g3 = v32 == 17; if (v32 > 17) { // 0x50d8 v17 = 0; // branch -> 0x50e0 continue; } else { // 0x5160 g128 = &g57; int32_t v33 = *(int32_t *)(4 * v32 + (int32_t)&g57); // 0x5168 g127 = v33; ((int32_t (*)(int32_t, int32_t))(v33 + (int32_t)&g57))(v33, (int32_t)&g57); if (g3) { // if_519c_0_true // branch -> after_if_519c_0 } // after_if_519c_0 g137 = 0; int32_t v34 = *(int32_t *)g136; // 0x51d8 g135 = v22; write_incbin_for_segment(v21, v34 + v23, g134 - v23, (struct _IO_FILE *)v22); printf(format); g133 = g138; fprintf((struct _IO_FILE *)g135, format2); free((char *)g138); int32_t v35 = g129 + g134; // 0x5220 g134 = v35; g135 = v19; v23 = v35; // branch -> 0x5234 while (true) { // 0x5234 v12 = v19; v13 = v20; v14 = v35; v15 = g137; // branch -> 0x5234 goto lab_0x5234_2; } } } else { // 0x5258 g135 = v1; write_incbin_for_segment(v9, *(int32_t *)g136 + v16, g134 - v16, a3); printf(">>>> %s.string \"%s\"\n", (char *)v5, (char *)g138); int32_t v36 = g138; // 0x5294 g133 = v36; fprintf((struct _IO_FILE *)g135, format3, (char *)v5, (char *)v36); free((char *)g138); int32_t v37 = g129 + g134; // 0x52a4 g134 = v37; g135 = v10; v25 = v37; v24 = v37; // branch -> 0x50d0 goto lab_0x50d0; } while (true) { // 0x5234 g137 = v13 - v14; g139 = v14 + v12; v17 = v15; // branch -> 0x50e0 break; } } } } } // Address range: 0x5344 - 0x542b int main() { int32_t v1 = (int32_t)a2; int32_t v2 = g135; // 0x5344 int32_t v3 = g130; // bp-8 g130 = &v3; g134 = v1; if (a1 != 4) { // 0x53b8 // branch -> 0x53fc // 0x53fc fprintf((struct _IO_FILE *)(g33 + 168), (char *)(int32_t)"usage: %s \n"); g135 = v2; return 1; } struct _IO_FILE * file = fopen((char *)*(int32_t *)(v1 + 4), "r"); // 0x5364 g135 = (int32_t)file; int32_t format; // 0x5400 if (file == NULL) { // 0x53d0 format = (int32_t)"error: could not open file %s for reading\n"; // branch -> 0x53fc } else { struct _IO_FILE * file2 = fopen((char *)*(int32_t *)(g134 + 8), "w"); // 0x5380 g136 = (int32_t)file2; if (file2 != NULL) { // 0x5390 dump_incbins((struct _IO_FILE *)g135, file2, *(int32_t *)(g134 + 12)); fclose((struct _IO_FILE *)g135); fclose((struct _IO_FILE *)g136); g135 = v2; return 0; } // 0x53e8 format = (int32_t)"error: could not open file %s for writing\n"; // branch -> 0x53fc } // 0x53fc fprintf((struct _IO_FILE *)(g33 + 168), (char *)format); g135 = v2; return 1; } // Address range: 0x542c - 0x55db int32_t dump_incbins(struct _IO_FILE * stream, struct _IO_FILE * a2, int32_t a3) { int32_t v1 = g135; // 0x542c int32_t v2 = g136; // 0x542c int32_t v3 = g138; // 0x542c int32_t v4 = g130; // bp-8 g130 = &v4; g134 = 0; g135 = (int32_t)a2; g136 = (int32_t)stream; int32_t v5 = 0; // bp-40 int32_t result; // 0x55b0 if (feof(stream) == 0) { // 0x5458 g137 = 0; char * format = "%s\n"; // bp-64 g129 = (int32_t)"==== %s\n"; g138 = (int32_t)"%s\n"; // branch -> 0x5564 while (true) { int32_t v6 = read_line((struct _IO_FILE *)g136); // 0x5568 g139 = v6; int32_t v7 = v6; // 0x557c if (g137 == 0) { // 0x54b0 if (is_incbin((char *)v6) == 0) { // 0x54b0 // branch -> 0x5578 // 0x5578 printf((char *)g129, (char *)g139); fprintf((struct _IO_FILE *)g135, (char *)g138, (char *)g139); // branch -> 0x5594 } else { // 0x54c0 printf("<<<< %s\n", (char *)g139); g127 = g139; char * v8 = get_incbin_data(); // 0x54d0 g134 = (int32_t)v8; if (v8 == NULL) { // 0x5514 printf(">>>> %s\n", (char *)g139); fprintf((struct _IO_FILE *)g135, "%s\n", (char *)g139); g137 = 0; // branch -> 0x5594 } else { // 0x54e0 g133 = &v5; int32_t v9 = parse_incbin((int32_t *)v8, a3, g135); // 0x54f0 g137 = 0; if (v9 != 1) { // 0x5500 if (v9 == 2) { // 0x5538 g137 = 1; // branch -> 0x553c // 0x553c printf(">>>> %s\n", (char *)g139); fprintf((struct _IO_FILE *)g135, format, (char *)g139); // branch -> 0x5558 } else { // 0x5508 if (v9 == 3) { // if_550c_0_true g137 = 1; // branch -> 0x5558 } } lab_0x5558: // 0x5558 free((char *)g134); // branch -> 0x5594 // 0x5594 free((char *)g139); if (feof((struct _IO_FILE *)g136) != 0) { // break -> 0x55ac break; } // continue -> 0x5564 continue; } // 0x553c printf(">>>> %s\n", (char *)g139); fprintf((struct _IO_FILE *)g135, format, (char *)g139); // branch -> 0x5558 goto lab_0x5558; } // 0x5594 free((char *)g139); if (feof((struct _IO_FILE *)g136) != 0) { // break -> 0x55ac break; } // continue -> 0x5564 continue; } lab_0x5594: // 0x5594 free((char *)g139); if (feof((struct _IO_FILE *)g136) != 0) { // break -> 0x55ac break; } // continue -> 0x5564 continue; } // 0x5578 printf((char *)g129, (char *)v7); fprintf((struct _IO_FILE *)g135, (char *)g138, (char *)g139); // branch -> 0x5594 goto lab_0x5594; } // 0x55ac result = v5; // branch -> 0x55b0 } else { // 0x542c result = g134; // branch -> 0x55b0 } // 0x55b0 free((char *)result); g135 = v1; g136 = v2; g138 = v3; return result; } // Address range: 0x55dc - 0x5693 int32_t script_get_expression_value(char * a1, int32_t a2, int32_t * a3, int32_t a4) { int32_t v1 = (int32_t)a1; int32_t v2 = (int32_t)a3; g132 = v2; g133 = a4; int32_t v3 = g134; // bp-16 int32_t v4 = g135; // 0x55dc int32_t v5 = g130; // bp-8 int32_t v6 = g126; // 0x55dc g130 = &v5; g135 = v1; g134 = v2; if (*a1 != 36) { // 0x5634 if ((int32_t)convert_string_to_number(a1, 1) != 0) { // 0x5648 return convert_string_to_number((char *)g135, 0); } // 0x5668 g127 = (int32_t)"syntax error"; g134 = v3; g135 = v4; g130 = v5; g126 = v6; return duplicate_string(); } int32_t v7 = v1 + 1; // 0x55f8 g132 = v7; int32_t v8 = find_script_variable((int32_t *)a2, (char *)v7); // 0x5604 if (v8 == 0) { // 0x5658 g127 = (int32_t)"unknown variable"; g134 = v3; g135 = v4; g130 = v5; g126 = v6; return duplicate_string(); } uint32_t v9 = ((int32_t)*(char *)v8 + 255) % 256; // 0x5618 g128 = v9; if (v9 < 3) { // 0x5678 *(int32_t *)g134 = *(int32_t *)(v8 + 4); g134 = v3; g135 = v4; g130 = v5; return 0; } // 0x5624 g127 = (int32_t)"variable does not contain an integer"; g134 = v3; g135 = v4; g130 = v5; g126 = v6; return duplicate_string(); } // Address range: 0x5694 - 0x56f3 int32_t get_line_type(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2 = find_first_non_space((char *)g127); // 0x569c char v3 = *(char *)v2; // 0x56a0 g128 = v3; g3 = v3 == 0; if (v3 == 0) { // 0x56c8 g127 = 0; g130 = v1; return 0; } // 0x56ac if (v3 != 58) { // 0x56b4 g3 = v3 == 36; int32_t result = v3 == 36 ? 1 : 4; g127 = result; g130 = v1; return result; } char v4 = *(char *)(v2 + 1); // 0x56d4 g128 = v4; int32_t result2; // 0x56ec if (v4 == 36) { // after_if_56e0_0.thread g3 = false; result2 = 2; // branch -> after_if_56e8_0 } else { // after_if_56e0_0 g3 = v4 == 58; if (v4 == 58) { // if_56e8_0_true result2 = 3; // branch -> after_if_56e8_0 } else { result2 = 0; } } // after_if_56e8_0 g127 = result2; g130 = v1; return result2; } // Address range: 0x56f4 - 0x589b int32_t run_script(int32_t a1, int32_t a2, struct _IO_FILE * a3, int32_t a4) { // 0x56f4 int32_t v1; char * v2 = (char *)v1; // bp-40 int32_t v3 = g134; // 0x56f4 int32_t v4 = g135; // 0x56f4 int32_t v5 = g138; // 0x56f4 int32_t v6 = g130; // bp-8 g130 = &v6; g138 = a1; g134 = (int32_t)a3; g139 = a2; printf("Script file: "); int32_t v7 = read_line((struct _IO_FILE *)g33); // 0x5720 g137 = v7; char * file_path = (char *)v7; // 0x5728_0 if (*file_path == 0) { // 0x57b8 free(file_path); // branch -> 0x5870 // 0x5870 g135 = v4; g138 = v5; return 0; } // 0x5734 g136 = (int32_t)fopen(file_path, "r"); free((char *)g137); int32_t v8 = g136; // 0x5750 if (v8 == 0) { // 0x57c8 puts("err: could not open script file"); // branch -> 0x5870 // 0x5870 g135 = v4; g138 = v5; return 0; } // 0x5758 g135 = read_file_by_lines((struct _IO_FILE *)v8); fclose((struct _IO_FILE *)g136); int32_t v9; g133 = &v9; g137 = 0; int32_t v10 = g139; // 0x5778 int32_t v11 = g135; // 0x577c v9 = 0; g139 = execute_script(g138, v10, v11); destroy_string_array((char *)g135, v10, v11, g133); int32_t v12 = v9; // 0x5794 int32_t result; // 0x5870 if (v12 == 0) { int32_t v13 = 0; // 0x5804 if (0x1000000 * *(int32_t *)&g44 / 0x1000000 % 2 != 0) { // 0x57f0 write_header_comment((int32_t *)g138, (struct _IO_FILE *)g134); v13 = v9; // branch -> 0x57fc } // 0x57fc generate_initial_indented_line((int32_t *)&v2, NULL, v11, g133, (int32_t)v2, v13, v3); int32_t v14 = *(int32_t *)g139; // 0x5808 int32_t v15 = v14; // R2 int32_t v16 = (int32_t)v2; if (v14 != 0) { // 0x5818 g135 = g139 + 4; // branch -> 0x582c while (true) { // 0x582c printf((char *)(int32_t)">>>> %s%s\n", (char *)v16, (char *)v14); int32_t v17 = *(int32_t *)(g135 - 4); // 0x5834 g133 = v17; fprintf((struct _IO_FILE *)g134, (char *)(int32_t)"%s%s\n", v2, (char *)v17); int32_t v18 = g135; // 0x5848 int32_t v19 = *(int32_t *)v18; // 0x5848 v15 = v19; g135 = v18 + 4; int32_t v20 = (int32_t)v2; if (v19 != 0) { // 0x582c v14 = v19; v16 = v20; // branch -> 0x582c continue; } else { v16 = v20; } } } // 0x585c free((char *)v16); destroy_string_array((char *)g139, v16, v15, g133); result = 1; // branch -> 0x5870 } else { // 0x57a0 printf("err: %s\n", (char *)v12); free((char *)v9); result = g137; // branch -> 0x5870 } // 0x5870 g135 = v4; g138 = v5; return result; } // Address range: 0x589c - 0x5997 int32_t execute_script(int32_t a1, int32_t a2, int32_t a3) { // 0x589c g132 = a3; int32_t v1 = g134; // 0x589c int32_t v2 = g135; // 0x589c int32_t v3 = g136; // 0x589c int32_t v4 = g137; // 0x589c int32_t v5 = g138; // 0x589c int32_t v6 = g139; // 0x589c int32_t v7 = g129; // 0x589c int32_t v8 = g130; // bp-8 g130 = &v8; g137 = a1; g136 = a2; int32_t v9 = 0; // bp-40 g128 = 1; g134 = g133; g139 = a3; char * mem = calloc(4, 1); // 0x58c8 g129 = &v9; g138 = (int32_t)mem; int32_t v10 = 0; // branch -> 0x593c while (true) { // branch -> 0x593c int32_t v11; int32_t v12; // 0x596c int32_t v13; int32_t v14; int32_t v15; // 0x593c while (true) { // 0x593c v15 = g134; int32_t * v16 = (int32_t *)v15; // 0x593c_0 int32_t result; // 0x598c if (*v16 != 0) { // 0x5980 destroy_string_array((char *)g138, g128, g132, v11); g138 = 0; result = 0; // branch -> 0x598c // 0x598c g127 = result; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g139 = v6; g129 = v7; g130 = v8; return result; } int32_t v17 = g137; // 0x594c uint32_t v18 = *(int32_t *)(v17 + 4); // 0x594c g128 = v18; g1 = v9 >= v18; g3 = v9 == v18; if (v9 < v18) { // 0x598c result = g138; // branch -> 0x598c // 0x598c g127 = result; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g139 = v6; g129 = v7; g130 = v8; return result; } // 0x5958 v12 = execute_script_once(v17, g136, g139, v16, (char *)g129, (char *)v14, v13, v10, (char *)v9, (char *)v1, v2, v3, v4, (int32_t *)v5, v6); g135 = v12; if (v12 != 0) { // break -> 0x597c break; } v11 = v15; // continue -> 0x593c } int32_t v19 = string_array_size((int32_t *)v12); // 0x58e4 int32_t v20 = v19 + v10; // 0x58f0 int32_t v21 = 4 * v20; // 0x58fc int32_t mem2 = (int32_t)realloc((char *)g138, v21 + 4); // 0x5904_5 g138 = mem2; int32_t v22 = 4 * v19; // 0x5918 g132 = v22; __aeabi_memcpy4(mem2 + 4 * v10, g135, v22); free((char *)g135); g128 = v20; *(int32_t *)(g138 + v21) = 0; v13 = v20; v10 = v20; v14 = v19; v11 = v15; // branch -> 0x593c } } // Address range: 0x5998 - 0x5aef int32_t run_script_auto(int32_t a1, int32_t a2, char * file_path, struct _IO_FILE * a4) { // 0x5998 int32_t v1; char * v2 = (char *)v1; g132 = (int32_t)file_path; int32_t v3 = (int32_t)a4; g133 = v3; int32_t v4 = g135; // 0x5998 int32_t v5 = g138; // 0x5998 int32_t v6 = g129; // 0x5998 int32_t v7 = g130; // bp-8 g130 = &v7; g139 = a1; g136 = a2; g129 = 0; g128 = (int32_t)"r"; g135 = v3; int32_t v8 = 0; // bp-40 struct _IO_FILE * file = fopen(file_path, "r"); // 0x59c4 g137 = (int32_t)file; if (file != NULL) { // 0x59d4 g129 = read_file_by_lines(file); fclose((struct _IO_FILE *)g137); g133 = &v8; g138 = execute_script(g139, g136, g129); if (v8 == 0) { int32_t v9 = 0; // 0x5a60 if (0x1000000 * *(int32_t *)&g44 / 0x1000000 % 2 != 0) { // 0x5a48 write_header_comment((int32_t *)g139, (struct _IO_FILE *)g135); v9 = v8; // branch -> 0x5a54 } // 0x5a54 g139 = 0; int32_t v10; generate_initial_indented_line((int32_t *)&v2, NULL, g132, g133, v10, (int32_t)v2, v9); int32_t v11 = *(int32_t *)g138; // 0x5a64 int32_t v12 = v11; // R2 int32_t v13 = (int32_t)v2; if (v11 != 0) { // 0x5a74 g134 = g138 + 4; // branch -> 0x5a88 while (true) { // 0x5a88 printf((char *)(int32_t)">>>> %s%s\n", (char *)v13, (char *)v11); int32_t v14 = *(int32_t *)(g134 - 4); // 0x5a90 g133 = v14; fprintf((struct _IO_FILE *)g135, (char *)(int32_t)"%s%s\n", v2, (char *)v14); int32_t v15 = g134; // 0x5aa4 int32_t v16 = *(int32_t *)v15; // 0x5aa4 v12 = v16; g134 = v15 + 4; int32_t v17 = (int32_t)v2; if (v16 != 0) { // 0x5a88 v11 = v16; v13 = v17; // branch -> 0x5a88 continue; } else { v13 = v17; } } } // 0x5ab8 free((char *)v13); destroy_string_array((char *)g138, v13, v12, g133); destroy_string_array((char *)g129, g128, g132, g133); // branch -> 0x5ad0 // 0x5ad0 g135 = v4; g138 = v5; g129 = v6; return g139; } } // 0x5a0c destroy_string_array((char *)g129, g128, g132, g133); printf("err: %s\n", (char *)v8); free((char *)v8); // branch -> 0x5ad0 // 0x5ad0 g135 = v4; g138 = v5; g129 = v6; return 1; } // Address range: 0x5af0 - 0x5fb3 int32_t execute_script_once(int32_t a1, int32_t a2, int32_t a3, int32_t * a4, char * a5, char * format, int32_t a7, int32_t a8, char * a9, char * format2, int32_t a11, int32_t a12, int32_t a13, int32_t * a14, int32_t a15) { int32_t v1 = (int32_t)a4; g133 = v1; int32_t v2 = (int32_t)a14; int32_t v3 = g134; // 0x5af0 int32_t v4 = g135; // 0x5af0 int32_t v5 = g136; // 0x5af0 int32_t v6 = g137; // 0x5af0 int32_t v7 = g138; // 0x5af0 int32_t v8 = g139; // 0x5af0 int32_t v9 = g129; // 0x5af0 int32_t v10 = g130; // bp-8 g130 = &v10; g129 = a3; g135 = a1; g138 = v1; g134 = a2; g136 = string_array_size((int32_t *)a3); init_script_variables(a1, a2, *(int32_t *)a5); int32_t v11 = *(int32_t *)g138; // 0x5b34 g128 = v11; g134 = 0; int32_t v12 = g136; // 0x5b3c int32_t v13 = 0; // 0x5f34 if (v11 == 0) { // if_5b44_0_true v13 = 1; // branch -> after_if_5b44_0 } // after_if_5b44_0 int32_t mem2; // 0x5f48_5 int32_t v14; // 0x5f64 int32_t v15; // 0x5f78 int32_t v16; // 0x5f78 int32_t v17; // 0x5f5c if (v12 == 0) { // 0x5f2c g128 = 0; // branch -> 0x5f34 } else { // 0x5b50 g132 = 0; if (v11 == 0) { // 0x5b60 g137 = g129 - 4; g139 = 0; g136 = 0; int32_t v18 = (int32_t)format; int32_t v19 = (int32_t)format2; int32_t v20 = 0; // 0x5c50 // branch -> 0x5c50 while (true) { lab_0x5c50: // 0x5c50 g135 = v20 + 1; g127 = *(int32_t *)(4 * v20 + g129); uint32_t v21 = get_line_type(); // 0x5c5c67 g1 = v21 > 3; g2 = v21 < 4; g3 = v21 == 4; int32_t v22; // 0x5f20 int32_t v23; // 0x5e74 int32_t v24; // 0x5f00 if (v21 > 4) { // 0x5e74 v23 = g136; g134 = v23; // branch -> 0x5f00 } else { while (true) { // 0x5c68 g128 = &g58; int32_t v25 = *(int32_t *)(4 * v21 + (int32_t)&g58); // 0x5c70 g127 = v25; ((int32_t (*)(int32_t, int32_t))(v25 + (int32_t)&g58))(v25, (int32_t)&g58); if (g3) { // after_if_5c84_0 // branch -> after_if_5c88_0 } // after_if_5c88_0 *(int32_t *)(g130 - 32) = 0; int32_t v26 = *(int32_t *)(4 * g136 + g129); // 0x5c94 int32_t v27 = find_script_variable((int32_t *)a15, (char *)(find_first_non_space((char *)v26) + 2)); // 0x5ca4 int32_t len2; // 0x5d9c char * mem3; // 0x5da4 int32_t v28; // R10 int32_t str3; // 0x5d90 int32_t v29; // 0x5dcc int32_t v30; // 0x5e58 if (v27 == 0) { // 0x5d7c g127 = a8; g126 = 0x5d84; int32_t v31 = duplicate_string(); // 0x5d80 g138 = v31; *(int32_t *)(g130 - 32) = v31; str3 = g138; if (str3 == 0) { // 0x5d7c v29 = 0; // branch -> 0x5dcc lab_0x5dcc:; // 0x5dcc int32_t v32; // 0x5f70 if (v29 == 0) { // 0x5dd4 g138 = v2; int32_t str; // 0x5e24 int32_t len; // 0x5e2c char * mem; // 0x5e34 int32_t v33; if (g135 < *(int32_t *)(g130 - 36)) { // 0x5e20 g127 = a7; g126 = 0x5e28; str = duplicate_string(); g134 = str; len = strlen((char *)str); mem = malloc(len + 20); v28 = (int32_t)mem; g128 = v18; g135 = v33; g133 = g134; g132 = v33; sprintf(mem, format); free((char *)g134); v30 = g138; // branch -> 0x5e58 lab_0x5e58_3: // 0x5e58 *(int32_t *)v30 = v28; int32_t v34 = *(int32_t *)(g130 - 40); // 0x5e60 g129 = v34; if (v28 == 0) { // 0x5e58 g127 = *(int32_t *)(4 * g136 + v34); uint32_t v35 = get_line_type(); // 0x5c5c g1 = v35 > 3; g2 = v35 < 4; g3 = v35 == 4; if (v35 > 4) { // break -> 0x5e74 break; } v21 = v35; // continue -> 0x5c68 continue; } else { // 0x5f60 v14 = g139; // branch -> 0x5f60 } // 0x5f60 g135 = 0; if (v14 == 0) { // 0x5f80 free((char *)0); g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } // 0x5f6c v32 = v14; // branch -> 0x5f70 while (true) { // 0x5f70 free((char *)*(int32_t *)(4 * v32 - 4)); v15 = g139; v16 = v15 - 1; g139 = v16; if (v15 == 1) { // 0x5f80 // branch -> 0x5f80 // 0x5f80 free((char *)g135); g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } lab_0x5f70_3: // 0x5f70 v32 = v16; // branch -> 0x5f70 } // 0x5e74 v23 = g136; g134 = v23; // branch -> 0x5f00 } else { // 0x5de4 g135 = v33; g134 = 1; int32_t v36 = v33; // 0x5dec // branch -> 0x5dec while (true) { // 0x5dec g127 = *(int32_t *)(4 * v36 + g129); int32_t v37 = get_line_type(); // 0x5df0 if (v37 == 3) { int32_t v38 = g134; // 0x5e08 g134 = v38 - 1; if (v38 == 1) { int32_t v39 = g135 + 1; // 0x5e6c g134 = v39; v23 = v39; // branch -> 0x5f00 // 0x5f00 v24 = *(int32_t *)g138; g128 = v24; g132 = v12; v22 = 0; if (v24 == 0) { lab_if_5f10_0_true_2: // if_5f10_0_true v22 = 1; // branch -> after_if_5f10_0 } lab_after_if_5f10_0_2: // after_if_5f10_0 if (v23 < v12) { // 0x5be0 g136 = v23; if (v24 == 0) { // 0x5be0 v20 = v23; // branch -> 0x5c50 goto lab_0x5c50; } } int32_t v40 = g139; // 0x5f1c g134 = v40; if (v22 != 0) { // 0x5f3c mem2 = (int32_t)realloc(NULL, 4 * v40 + 4); g128 = 0; *(int32_t *)(4 * g134 + mem2) = 0; g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return mem2; } v17 = v40; // 0x5f5c g139 = v17; v14 = v17; // branch -> 0x5f60 // 0x5f60 g135 = 0; if (v14 == 0) { // 0x5f80 free((char *)0); g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } // 0x5f6c // branch -> 0x5f70 while (true) { // 0x5f70 free((char *)*(int32_t *)(4 * v14 - 4)); v15 = g139; v16 = v15 - 1; g139 = v16; if (v15 != 1) { goto lab_0x5f70_3; } // 0x5f80 // branch -> 0x5f80 // 0x5f80 free((char *)g135); g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } } } else { // 0x5dfc if (v37 == 2) { // if_5e00_0_true g134++; // branch -> 0x5e10 } } int32_t v41 = g135 + 1; // 0x5e14 g135 = v41; if (v41 >= *(int32_t *)(g130 - 36)) { // break -> 0x5e20 break; } v36 = v41; // continue -> 0x5dec } // 0x5e20 g127 = a7; g126 = 0x5e28; str = duplicate_string(); g134 = str; len = strlen((char *)str); mem = malloc(len + 20); v28 = (int32_t)mem; g128 = v18; g135 = v33; g133 = g134; g132 = v33; sprintf(mem, format); free((char *)g134); v30 = g138; // branch -> 0x5e58 goto lab_0x5e58_3; } lab_0x5f00: // 0x5f00 v24 = *(int32_t *)g138; g128 = v24; g132 = v12; if (v24 == 0) { goto lab_if_5f10_0_true_2; } v22 = 0; goto lab_after_if_5f10_0_2; } else { int32_t v42 = g135; // 0x5c44 g134 = v42; g138 = v2; v23 = v42; // branch -> 0x5f00 goto lab_0x5f00; } // 0x5f60 g135 = 0; int32_t v43; // 0x5f80 int32_t v44; // 0x5f90 if (v14 == 0) { v43 = 0; // 0x5f80 free((char *)v43); g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; v44 = v10; g130 = v44; return 0; } // 0x5f6c v32 = v14; int32_t v45 = -4; // 0x5f70 // branch -> 0x5f70 while (true) { int32_t v46 = *(int32_t *)(4 * v32 + v45); // 0x5f70 free((char *)v46); v15 = g139; v16 = v15 - 1; g139 = v16; if (v15 != 1) { goto lab_0x5f70_3; } int32_t v47 = g135; v43 = v47; // branch -> 0x5f80 // 0x5f80 free((char *)v43); g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; v44 = v10; g130 = v44; return 0; } } } else { int32_t str2 = *(int32_t *)(g130 - 32); // 0x5cb0 g138 = str2; int32_t v48 = *(int32_t *)(v27 + 4); // 0x5cb4 if (str2 == 0) { v29 = v48; goto lab_0x5dcc; } // 0x5d98 len2 = strlen((char *)str2); mem3 = malloc(len2 + 20); g128 = v19; g132 = g135; g133 = g138; v28 = (int32_t)mem3; sprintf(mem3, format2); free((char *)g138); g138 = v2; v30 = v2; // branch -> 0x5e58 goto lab_0x5e58_3; } // 0x5d98 len2 = strlen((char *)str3); mem3 = malloc(len2 + 20); g128 = v19; g132 = g135; g133 = g138; v28 = (int32_t)mem3; sprintf(mem3, format2); free((char *)g138); g138 = v2; v30 = v2; // branch -> 0x5e58 goto lab_0x5e58_3; } } // 0x5f00 v24 = *(int32_t *)g138; g128 = v24; g132 = v12; if (v24 == 0) { goto lab_if_5f10_0_true_2; } v22 = 0; goto lab_after_if_5f10_0_2; } } } // 0x5f34 if (v13 != 0) { // 0x5f3c mem2 = (int32_t)realloc(NULL, 4); g128 = 0; *(int32_t *)(4 * g134 + mem2) = 0; g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return mem2; } v17 = 0; // 0x5f5c g139 = v17; v14 = v17; // branch -> 0x5f60 // 0x5f60 g135 = 0; if (v14 == 0) { // 0x5f80 free((char *)0); g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } // 0x5f6c // branch -> 0x5f70 while (true) { // 0x5f70 free((char *)*(int32_t *)(4 * v14 - 4)); v15 = g139; v16 = v15 - 1; g139 = v16; if (v15 != 1) { goto lab_0x5f70_3; } // 0x5f80 // branch -> 0x5f80 // 0x5f80 free((char *)g135); g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } } // Address range: 0x5fb4 - 0x5fff int32_t generate_script_error(char * str, int32_t a2) { int32_t v1 = g135; // 0x5fb4 g135 = (int32_t)str; char * mem = malloc(strlen(str) + 20); // 0x5fcc sprintf(mem, "line %u: %s", a2, (char *)g135); free((char *)g135); g135 = v1; return (int32_t)mem; } // Address range: 0x6000 - 0x6047 int32_t script_loop_test(int32_t a1, int32_t a2, int32_t * a3, int32_t a4, int32_t a5) { int32_t v1 = (int32_t)a3; g132 = v1; g133 = a4; int32_t v2 = g135; // 0x6000 int32_t v3 = g130; // bp-8 g130 = &v3; g134 = v1; g135 = a2; int32_t v4 = find_script_variable((int32_t *)a2, (char *)(find_first_non_space((char *)a1) + 2)); // 0x601c g1 = true; g2 = v4 < 0; g3 = v4 == 0; if (v4 != 0) { // if_6028_0_true g135 = v2; return *(int32_t *)(v4 + 4); } // after_if_6028_0 g127 = (int32_t)"unknown variable"; g126 = 0x6038; int32_t v5 = duplicate_string(); // 0x6034 *(int32_t *)g134 = v5; g127 = 0; g134 = a5; int32_t v6; g135 = v6; int32_t v7; g130 = v7; int32_t v8; ((int32_t (*)(int32_t))v8)(0); return 0; } // Address range: 0x6048 - 0x61fb // Used cryptographic patterns: // - rfc3548_Base_64_Encoding_with_URL_and_Filename_Safe_Alphabet (8-bit, little endian) int32_t generate_script_output_line(char * a1, int32_t a2, int32_t * a3) { int32_t v1 = g134; // 0x6048 int32_t v2 = g135; // 0x6048 int32_t v3 = g138; // 0x6048 int32_t v4 = g130; // bp-8 g130 = &v4; g136 = (int32_t)a1; int32_t v5 = (int32_t)a3; // bp-48 g139 = a2; char * mem = malloc(1); // 0x6064 char * v6 = mem; // bp-40 *mem = 0; int32_t v7 = 0; // bp-44 int32_t str = g136; // 0x6078 if (*(char *)str == 0) { // 0x61c0 g135 = v2; g138 = v3; return (int32_t)v6; } // 0x6084 g129 = (int32_t)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // branch -> 0x608c while (true) { char * found_char_pos = strchr((char *)str, 36); // 0x6094 int32_t v8 = (int32_t)found_char_pos; // 0x6094_4 g134 = v8; if (found_char_pos == NULL) { // 0x61ac concatenate((int32_t *)&v6, &v7, (char *)g136, 0); // branch -> 0x61c0 // 0x61c0 g135 = v2; g138 = v3; return (int32_t)v6; } int32_t v9 = g136; // 0x60a4 int32_t v10 = v8 - v9; // 0x60a4 if (v8 == v9) { // branch -> 0x60f8 } else { // 0x60ac g135 = v10; char * mem2 = realloc(v6, v10 + 1 + v7); // 0x60c0 int32_t v11 = (int32_t)mem2; // 0x60c0_5 int32_t v12 = v7; // 0x60c4 g138 = v12; v6 = mem2; __aeabi_memcpy((char *)(v11 + v12), (char *)g136, g135); int32_t v13 = g138 + g135; // 0x60e0 v7 = v13; *(char *)(v13 + v11) = 0; v8 = g134; // branch -> 0x60f8 } int32_t v14 = v8 + 1; // 0x60fc g136 = v14; char v15 = *(char *)v14; // 0x60fc int32_t str2; // 0x611838 if (v15 == 45) { // if_611c_0_true str2 = v8 + 2; g136 = str2; g137 = 1; // branch -> 0x6120 } else { // after_if_6108_0 g137 = 2; if (v15 == 43) { // 0x6110 g137 = 0; int32_t v16 = v8 + 2; // 0x6118 g136 = v16; str2 = v16; // branch -> 0x6120 } else { str2 = v14; } } int32_t ini_seg_bytes = strspn((char *)str2, (char *)g129); // 0x6128 g134 = ini_seg_bytes; char * mem3 = malloc(ini_seg_bytes + 1); // 0x6134 g135 = (int32_t)mem3; __aeabi_memcpy(mem3, (char *)g136, g134); int32_t v17 = g135; // 0x614c *(char *)(g134 + v17) = 0; g138 = find_script_variable((int32_t *)g139, (char *)v17); free((char *)g135); int32_t v18 = g138; // 0x6168 if (v18 == 0) { // 0x61cc free(v6); g127 = (int32_t)"unknown variable"; *(int32_t *)v5 = duplicate_string(); g135 = v2; g138 = v3; return 0; } int32_t v19 = *(int32_t *)v18; // 0x6170 int32_t v20 = *(int32_t *)(v18 + 4); // 0x6170 int32_t v21 = *(int32_t *)(v18 + 8); // 0x6170 int32_t v22 = print_script_variable_contents(v19, v20, (char *)v21, g137 % 256, v5, v7, (int32_t)v6, v1); // 0x6178 g135 = v22; concatenate((int32_t *)&v6, &v7, (char *)v22, 0); free((char *)g135); int32_t v23 = g134 + g136; // 0x619c g136 = v23; if (*(char *)v23 == 0) { // break -> 0x61c0 break; } str = v23; // continue -> 0x608c } // 0x61c0 g135 = v2; g138 = v3; return (int32_t)v6; } // Address range: 0x61fc - 0x6873 int32_t print_script_variable_contents(uint32_t a1, int32_t a2, char * a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8) { int32_t v1 = (int32_t)a3; g132 = v1; g133 = a4; int32_t v2 = g134; // 0x61fc int32_t v3 = g135; // 0x61fc int32_t v4 = g136; // 0x61fc int32_t result = g138; // 0x61fc int32_t v5 = g130; // bp-8 g130 = &v5; uint32_t v6 = a1 % 256; // 0x6208 g136 = a4; g135 = v1; g134 = a2; g1 = v6 > 6; g2 = v6 < 7; g3 = v6 == 7; if (v6 > 7) { // 0x67d8 g134 = v2; g135 = v3; g136 = v4; g138 = result; g130 = v5; return result; } // 0x6220 g128 = &g59; int32_t v7 = *(int32_t *)(4 * v6 + (int32_t)&g59); // 0x6228 g127 = v7; ((int32_t (*)(int32_t, int32_t))(v7 + (int32_t)&g59))(v7, (int32_t)&g59); if (g3) { // if_624c_0_true // branch -> after_if_624c_0 } int32_t mem = (int32_t)malloc(2 * g134 | 1); // 0x6258_3 g138 = mem; if (g134 == 0) { // 0x67d8 g134 = v2; g135 = v3; g136 = v4; g138 = result; g130 = v5; return mem; } // branch -> 0x6278 while (true) { int32_t v8 = g135; // 0x6278 g135 = v8 + 1; char v9 = *(char *)v8; // 0x6278 sprintf((char *)mem, (char *)(int32_t)"%02hhx", v9); int32_t v10 = g134; // 0x6288 g134 = v10 - 1; if (v10 == 1) { int32_t result2 = g138; // branch -> 0x67d8 // 0x67d8 g134 = v2; g135 = v3; g136 = v4; g138 = result; g130 = v5; return result2; } // 0x6278 mem += 2; // branch -> 0x6278 } } // Address range: 0x6874 - 0x69ef int32_t script_parse_assignment_line(int32_t a1) { g127 = a1; int32_t v1 = g134; // 0x6874 int32_t v2 = g135; // 0x6874 int32_t v3 = g138; // 0x6874 int32_t v4 = g130; // bp-8 g130 = &v4; g135 = g128; int32_t v5 = split_by_spaces(); // 0x6884 g134 = v5; g3 = v5 == 0; if (v5 == 0) { // 0x695c g127 = (int32_t)"syntax error in assignment statement"; g134 = v1; g135 = v2; g138 = v3; g130 = v4; return duplicate_string(); } int32_t v6 = g134; // 0x68b8 int32_t v7; if (string_array_size((int32_t *)v5) > 1) { int32_t v8 = *(int32_t *)v6; // 0x68b8 char v9 = *(char *)v8; // 0x68bc int32_t v10 = v6; // 0x694c if (v9 == 36) { int32_t v11 = validate_variable_name((char *)(v8 + 1)); // 0x68cc int32_t v12 = g134; if (v11 != 0) { int32_t v13 = v12 + 8; // 0x68dc g136 = v13; g139 = *(int32_t *)v12; int32_t nmemb = string_array_size((int32_t *)v13); // 0x68e4 g138 = nmemb; char * mem = calloc(nmemb, 8); // 0x68f0 g137 = (int32_t)mem; int32_t v14 = script_get_transforms_for_line((int32_t *)g136, g135, (int32_t *)mem); // 0x6904 g136 = v14; if (v14 == 0) { int32_t v15 = *(int32_t *)(g134 + 4); // 0x6914 int32_t v16; int32_t v17 = script_get_initializer_value((char *)v15, &v16, (int32_t *)g135); // 0x6920 g136 = v17; if (v17 == 0) { // 0x6968 int32_t v18; int32_t v19; g136 = execute_transforms(v16, v19, v18, g137, g138); free((char *)g137); g132 = v18; destroy_script_value(v16); int32_t v20; int32_t v21; if (g136 == 0) { char * v22 = (char *)(g139 + 1); // 0x69b8_0 if (*v22 != 0) { // 0x69c4 assign_script_value((int32_t *)g135, v22, v21, v20); // branch -> 0x69dc // 0x69dc destroy_string_array((char *)g134, g128, g132, g133); // branch -> 0x6940 // 0x6940 g134 = v1; g135 = v2; g138 = v3; return g136; } } // 0x69a4 g128 = v20; int32_t v23; g132 = v23; destroy_script_value(v21); // branch -> 0x69dc // 0x69dc destroy_string_array((char *)g134, g128, g132, g133); // branch -> 0x6940 // 0x6940 g134 = v1; g135 = v2; g138 = v3; return g136; } } // 0x6930 destroy_string_array((char *)g134, g128, g132, g133); free((char *)g137); // branch -> 0x6940 // 0x6940 g134 = v1; g135 = v2; g138 = v3; return g136; } v10 = v12; } // 0x694c destroy_string_array((char *)v10, (int32_t)v9, g132, g133); v7 = (int32_t)"invalid variable for assignment"; // branch -> 0x695c } else { // 0x68a4 destroy_string_array((char *)v6, g128, g132, g133); v7 = (int32_t)"syntax error in assignment statement"; // branch -> 0x695c } // 0x695c g127 = v7; g134 = v1; g135 = v2; g138 = v3; g130 = v4; return duplicate_string(); } // Address range: 0x69f0 - 0x6b93 int32_t script_get_transforms_for_line(int32_t * a1, int32_t str4, int32_t * a3) { g128 = str4; int32_t v1 = (int32_t)a3; g132 = v1; int32_t v2 = g134; // 0x69f0 int32_t v3 = g135; // 0x69f0 int32_t v4 = g137; // 0x69f0 int32_t v5 = g138; // 0x69f0 int32_t v6 = g139; // 0x69f0 int32_t v7 = g130; // bp-8 g130 = &v7; int32_t v8 = (int32_t)a1; // R6 g137 = v1; int32_t str = *a1; // 0x6a04 g135 = str; g138 = 0; int32_t result; // 0x6b58 if (str == 0) { // 0x6b58 result = g138; g134 = v2; g135 = v3; g137 = v4; g138 = v5; g139 = v6; g130 = v7; return result; } // 0x6a18 g139 = 1; int32_t v9 = *(int32_t *)&g46; // 0x6a20 g134 = v9; // branch -> 0x6a34 lab_0x6a34: while (true) { char * found_char_pos = strchr((char *)str, 58); // 0x6a3c int32_t v10 = (int32_t)found_char_pos; // 0x6a3c_4 int32_t str6; // 0x6b14 int32_t len; // 0x6b28 char * mem; // 0x6b30 int32_t v11; // 0x6b3c int32_t v12; // 0x6b40 if (found_char_pos == NULL) { // 0x6b64 g127 = (int32_t)"syntax error"; // branch -> 0x6b14 // 0x6b14 g126 = 0x6b18; str6 = duplicate_string(); g135 = str6; if (str6 != 0) { // 0x6b24 int32_t str2; // 0x6b24 len = strlen((char *)str2); mem = malloc(len + 24); g138 = (int32_t)mem; v11 = g139; g132 = v11; v12 = g135; g133 = v12; g128 = (int32_t)"transform %u: %s"; sprintf(mem, "transform %u: %s", v11, (char *)v12); free((char *)g135); // branch -> 0x6b58 } lab_0x6b58: // 0x6b58 result = g138; g134 = v2; g135 = v3; g137 = v4; g138 = v5; g139 = v6; g130 = v7; return result; } int32_t v13 = str4; // 0x6a48 int32_t str3 = *(int32_t *)g134; // 0x6a4c str4 = str3; if (str3 == 0) { // 0x6b70 g127 = (int32_t)"unknown transform"; // branch -> 0x6b14 // 0x6b14 g126 = 0x6b18; str6 = duplicate_string(); g135 = str6; if (str6 == 0) { // 0x6b58 result = g138; g134 = v2; g135 = v3; g137 = v4; g138 = v5; g139 = v6; g130 = v7; return result; } } else { // 0x6a58 g138 = v10 - g135; g136 = v13; g134 = &g47; // branch -> 0x6a74 while (true) { int32_t len2 = strlen((char *)str3); // 0x6a78 if (len2 == g138) { // 0x6a84 g132 = len2; if (strncmp((char *)str4, (char *)g135, len2) == 0) { int32_t v14 = g136; // 0x6ab8 str4 = v14; int32_t v15; int32_t str5 = script_get_expression_value((char *)(v10 + 1), v14, &v15, g133); // 0x6ac4 g135 = str5; if (str5 != 0) { // 0x6b24 len = strlen((char *)str5); mem = malloc(len + 24); g138 = (int32_t)mem; v11 = g139; g132 = v11; v12 = g135; g133 = v12; g128 = (int32_t)"transform %u: %s"; sprintf(mem, "transform %u: %s", v11, (char *)v12); free((char *)g135); // branch -> 0x6b58 // 0x6b58 result = g138; g134 = v2; g135 = v3; g137 = v4; g138 = v5; g139 = v6; g130 = v7; return result; } // 0x6ad4 g139++; *(int32_t *)g137 = *(int32_t *)g134; g138 = 0; *(int32_t *)(g137 + 4) = v15; g137 += 8; g134 = (int32_t)(char (**)[4])v9; int32_t v16 = v8 + 4; // 0x6af8 v8 = v16; int32_t v17 = *(int32_t *)v16; // 0x6af8 g135 = v17; if (v17 == 0) { // break (via goto) -> 0x6b58 goto lab_0x6b58; } str = v17; // continue (via goto) -> 0x6a34 goto lab_0x6a34; // 0x6b58 result = g138; g134 = v2; g135 = v3; g137 = v4; g138 = v5; g139 = v6; int32_t v18 = v7; // 0x6b60 g130 = v18; return result; } } int32_t v19 = g134; // 0x6a9c int32_t v20 = *(int32_t *)(v19 + 4); // 0x6a9c str4 = v20; g134 = v19 + 8; if (v20 == 0) { // break -> 0x6b08 break; } str3 = v20; // continue -> 0x6a74 } // 0x6b08 g138 = 0; g127 = (int32_t)"unknown transform"; // branch -> 0x6b14 // 0x6b14 g126 = 0x6b18; str6 = duplicate_string(); g135 = str6; if (str6 == 0) { // 0x6b58 result = g138; g134 = v2; g135 = v3; g137 = v4; g138 = v5; g139 = v6; g130 = v7; return result; } } // 0x6b24 len = strlen((char *)str6); mem = malloc(len + 24); g138 = (int32_t)mem; v11 = g139; g132 = v11; v12 = g135; g133 = v12; g128 = (int32_t)"transform %u: %s"; sprintf(mem, "transform %u: %s", v11, (char *)v12); free((char *)g135); // branch -> 0x6b58 // 0x6b58 result = g138; g134 = v2; g135 = v3; g137 = v4; g138 = v5; g139 = v6; g130 = v7; return result; } } // Address range: 0x6b94 - 0x6db7 int32_t script_get_initializer_value(char * a1, int32_t * a2, int32_t * a3) { int32_t v1 = (int32_t)a1; int32_t v2 = (int32_t)a3; g132 = v2; int32_t v3 = g134; // 0x6b94 int32_t v4 = g135; // 0x6b94 int32_t v5 = g137; // 0x6b94 int32_t v6 = g130; // bp-8 g130 = &v6; g135 = v2; int32_t v7 = v1 + 1; // 0x6ba8 g136 = v7; char v8 = *a1; // 0x6ba8 g137 = v8; g134 = (int32_t)a2; if (v8 != 58) { // if_6bb4_0_true g136 = v1; v7 = v1; // branch -> after_if_6bb4_0 } char * v9 = (char *)v7; // 0x6bb8_0 char v10 = *v9; // 0x6bb8 int32_t v11; // 0x6d64 int32_t v12; // 0x6d30 int32_t v13; // 0x6d54 int32_t v14; int32_t v15; int32_t v16; // 0x6cb0 int32_t result; // 0x6cf8 int32_t v17; // 0x6c60_0 int32_t v18; // 0x6d04 int32_t v19; // 0x6d08 int32_t v20; // 0x6d20 int32_t v21; // 0x6d28 int32_t v22; // 0x6d40 int32_t v23; // 0x6d48 int32_t v24; // 0x6d48 if (v10 == 36) { int32_t v25 = find_script_variable(a3, (char *)(v7 + 1)); // 0x6bcc if (v25 == 0) { // 0x6c28 g127 = (int32_t)"variable does not exist"; // branch -> 0x6cf0 // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } int32_t v26 = *(int32_t *)v25; // 0x6bd8 int32_t v27 = *(int32_t *)(v25 + 4); // 0x6bd8 int32_t v28 = *(int32_t *)(v25 + 8); // 0x6bd8 int32_t v29; copy_script_value((char *)&v29, (char)v26, v27, (char *)v28); int32_t v30; if (g137 == 58) { // 0x6c60 v17 = v15; if ((v17 + 255) % 256 < 3) { // 0x6ca4 g137 = v14; if (v14 < 0) { // 0x6cdc g127 = (int32_t)"negative read amount"; // branch -> 0x6cf0 } else { // 0x6cb0 v16 = g135; if (*(int32_t *)v16 != 0) { // 0x6cbc if (*(char *)*(int32_t *)*(int32_t *)(v16 + 4) == 0) { // 0x6d04 v18 = *(int32_t *)(v16 + 8); g132 = v18; v19 = *(int32_t *)(v18 + 4); if (v19 < v14) { // 0x6d14 g127 = (int32_t)"not enough data to read"; // branch -> 0x6cf0 // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 } else { // 0x6d20 v20 = *(int32_t *)v18; v21 = *(int32_t *)(v18 + 8); v12 = script_transform_copy((char)v20, v19, (char *)v21, v14); g136 = v12; if (v12 == 0) { // 0x6d40 v22 = *(int32_t *)(g135 + 8); v23 = *(int32_t *)(v22 + 4); v24 = *(int32_t *)(v22 + 8); v13 = script_transform_skip((char)*(int32_t *)v22, v23, v24, g137); g136 = v13; if (v13 == 0) { // 0x6d78 assign_script_value((int32_t *)g135, (char *)&g120, v15, v14); // branch -> 0x6c9c // 0x6c9c result = 0; // branch -> 0x6cf8 } else { // 0x6d64 v11 = g134; g128 = *(int32_t *)(v11 + 4); g132 = *(int32_t *)(v11 + 8); destroy_script_value(*(int32_t *)v11); *(int32_t *)(g134 + 8) = 0; result = g136; // branch -> 0x6cf8 } // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } result = v12; } // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } } // 0x6cd0 g127 = (int32_t)"internal state error: $ not found"; // branch -> 0x6cf0 } // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } // 0x6c74 g132 = v30; destroy_script_value(v17); g127 = (int32_t)"type mismatch"; // branch -> 0x6cf0 // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 } else { // 0x6c8c *(int32_t *)(g134 + 8) = v30; // branch -> 0x6c9c // 0x6c9c result = 0; // branch -> 0x6cf8 } // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } // 0x6c00 g128 = 3; if (v8 == 58) { // after_if_6c10_0 v15 = 3; if (v10 == 0) { // 0x6c1c // branch -> 0x6c54 v14 = *(int32_t *)(*(int32_t *)(v2 + 8) + 4); // 0x6c60 v17 = v15; if ((v17 + 255) % 256 < 3) { // 0x6ca4 g137 = v14; if (v14 < 0) { // 0x6cdc g127 = (int32_t)"negative read amount"; // branch -> 0x6cf0 } else { // 0x6cb0 v16 = g135; if (*(int32_t *)v16 != 0) { // 0x6cbc if (*(char *)*(int32_t *)*(int32_t *)(v16 + 4) == 0) { // 0x6d04 v18 = *(int32_t *)(v16 + 8); g132 = v18; v19 = *(int32_t *)(v18 + 4); if (v19 < v14) { // 0x6d14 g127 = (int32_t)"not enough data to read"; // branch -> 0x6cf0 // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 } else { // 0x6d20 v20 = *(int32_t *)v18; v21 = *(int32_t *)(v18 + 8); v12 = script_transform_copy((char)v20, v19, (char *)v21, v14); g136 = v12; if (v12 == 0) { // 0x6d40 v22 = *(int32_t *)(g135 + 8); v23 = *(int32_t *)(v22 + 4); v24 = *(int32_t *)(v22 + 8); v13 = script_transform_skip((char)*(int32_t *)v22, v23, v24, g137); g136 = v13; if (v13 == 0) { // 0x6d78 assign_script_value((int32_t *)g135, (char *)&g120, v15, v14); // branch -> 0x6c9c // 0x6c9c result = 0; // branch -> 0x6cf8 } else { // 0x6d64 v11 = g134; g128 = *(int32_t *)(v11 + 4); g132 = *(int32_t *)(v11 + 8); destroy_script_value(*(int32_t *)v11); *(int32_t *)(g134 + 8) = 0; result = g136; // branch -> 0x6cf8 } // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } result = v12; } // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } } // 0x6cd0 g127 = (int32_t)"internal state error: $ not found"; // branch -> 0x6cf0 } // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } // 0x6c74 g132 = 0; destroy_script_value(v17); g127 = (int32_t)"type mismatch"; // branch -> 0x6cf0 // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } } else { // after_if_6c10_0.thread v15 = 3; // branch -> 0x6c34 } // 0x6c34 if ((int32_t)convert_string_to_number(v9, 1) == 0) { // 0x6ce8 g127 = (int32_t)"syntax error"; // branch -> 0x6cf0 // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } int32_t v31 = convert_string_to_number((char *)g136, 0); // 0x6c50_3 // branch -> 0x6c54 // 0x6c54 if (g137 == 58) { v14 = v31; // 0x6c60 v17 = v15; if ((v17 + 255) % 256 < 3) { // 0x6ca4 g137 = v14; if (v14 < 0) { // 0x6cdc g127 = (int32_t)"negative read amount"; // branch -> 0x6cf0 } else { // 0x6cb0 v16 = g135; if (*(int32_t *)v16 != 0) { // 0x6cbc if (*(char *)*(int32_t *)*(int32_t *)(v16 + 4) == 0) { // 0x6d04 v18 = *(int32_t *)(v16 + 8); g132 = v18; v19 = *(int32_t *)(v18 + 4); if (v19 < v14) { // 0x6d14 g127 = (int32_t)"not enough data to read"; // branch -> 0x6cf0 // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 } else { // 0x6d20 v20 = *(int32_t *)v18; v21 = *(int32_t *)(v18 + 8); v12 = script_transform_copy((char)v20, v19, (char *)v21, v14); g136 = v12; if (v12 == 0) { // 0x6d40 v22 = *(int32_t *)(g135 + 8); v23 = *(int32_t *)(v22 + 4); v24 = *(int32_t *)(v22 + 8); v13 = script_transform_skip((char)*(int32_t *)v22, v23, v24, g137); g136 = v13; if (v13 == 0) { // 0x6d78 assign_script_value((int32_t *)g135, (char *)&g120, v15, v14); // branch -> 0x6c9c // 0x6c9c result = 0; // branch -> 0x6cf8 } else { // 0x6d64 v11 = g134; g128 = *(int32_t *)(v11 + 4); g132 = *(int32_t *)(v11 + 8); destroy_script_value(*(int32_t *)v11); *(int32_t *)(g134 + 8) = 0; result = g136; // branch -> 0x6cf8 } // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } result = v12; } // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } } // 0x6cd0 g127 = (int32_t)"internal state error: $ not found"; // branch -> 0x6cf0 } // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } // 0x6c74 g132 = 0; destroy_script_value(v17); g127 = (int32_t)"type mismatch"; // branch -> 0x6cf0 // 0x6cf0 g126 = 0x6cf4; result = duplicate_string(); // branch -> 0x6cf8 } else { // 0x6c8c *(int32_t *)(g134 + 8) = 0; // branch -> 0x6c9c // 0x6c9c result = 0; // branch -> 0x6cf8 } // 0x6cf8 g134 = v3; g135 = v4; g137 = v5; g130 = v6; return result; } // Address range: 0x6db8 - 0x6e4b int32_t init_script_variables(int32_t a1, int32_t a2, int32_t a3) { // 0x6db8 g132 = a3; int32_t v1 = g135; // 0x6db8 int32_t v2 = g138; // 0x6db8 g135 = a3; g138 = a2; char * mem = malloc(12); // 0x6dd0 int32_t result = (int32_t)mem; // R4 *(int32_t *)mem = 1; int32_t mem2 = (int32_t)malloc(4); // 0x6de4_3 *(int32_t *)(result + 4) = mem2; char * mem3 = malloc(1); // 0x6df4 *(int32_t *)mem2 = (int32_t)mem3; *mem3 = 0; int32_t mem4 = (int32_t)calloc(1, 12); // 0x6e0c_5 *(int32_t *)(result + 8) = mem4; uint32_t v3 = *(int32_t *)(a1 + 4); // 0x6e18 uint32_t v4 = g135; // 0x6e1c int32_t v5 = v3 - v4; // 0x6e1c int32_t size = v3 < v4 ? v5 & -0x10000 : v5; // 0x6e1c g1 = true; g3 = size == 0; *(int32_t *)(mem4 + 4) = size; if (size != 0) { char * mem5 = malloc(size); // 0x6e30 *(int32_t *)(mem4 + 8) = (int32_t)mem5; int32_t v6 = *(int32_t *)(mem4 + 4); // 0x6e3c g132 = v6; __aeabi_memcpy(mem5, (char *)(g138 + g135), v6); // branch -> 0x6e44 } // 0x6e44 g127 = result; g135 = v1; g138 = v2; return result; } // Address range: 0x6e4c - 0x6eab int32_t find_script_variable(int32_t * a1, char * str) { int32_t v1 = (int32_t)a1; int32_t v2 = g134; // bp-32 int32_t v3 = g135; // 0x6e4c int32_t v4 = g138; // 0x6e4c int32_t v5 = g130; // bp-8 g138 = v1; int32_t v6 = *a1; // 0x6e5c if (v6 == 0) { // 0x6e98 g135 = v3; g138 = v4; return 0; } int32_t v7 = 0; // R7 g135 = 0; int32_t v8 = 0; // 0x6e74 // branch -> 0x6e74 while (true) { int32_t str2 = *(int32_t *)(4 * v8 + *(int32_t *)(v1 + 4)); // 0x6e74 if (strcmp((char *)(int32_t)str, (char *)str2) == 0) { int32_t v9 = *(int32_t *)(g138 + 8); // 0x6ea0 g134 = v2; g135 = v3; g138 = v4; g130 = v5; return v7 + v9; } int32_t v10 = g135 + 1; // 0x6e88 g135 = v10; v7 += 12; if (v10 >= v6) { // 0x6e98 // branch -> 0x6e98 // 0x6e98 g134 = v2; g135 = v3; g138 = v4; g130 = v5; return 0; } // 0x6e88 v8 = v10; // branch -> 0x6e74 } } // Address range: 0x6eac - 0x6eb3 void destroy_script_value(int32_t a1) { // 0x6eac return; } // Address range: 0x6eb4 - 0x6ebb int32_t function_6eb4(int32_t a1) { // 0x6eb4 free((char *)g132); return g132; } // Address range: 0x6ebc - 0x6fef int32_t assign_script_value(int32_t * a1, char * a2, int32_t a3, int32_t result) { int32_t v1 = (int32_t)a1; int32_t str = (int32_t)a2; g132 = a3; g133 = result; int32_t v2 = g135; // 0x6ebc int32_t v3 = g138; // 0x6ebc int32_t v4 = g130; // 0x6ebc int32_t v5 = *a1; // 0x6ed0 g135 = v5; g138 = result; int32_t mem; // 0x6f84_5 int32_t mem3; // 0x6fc4_5 int32_t len; // 0x6f94 char * mem2; // 0x6f9c int32_t result2; // R0 int32_t v6; int32_t v7; // 0x6f74 int32_t v8; // 0x6fb4 int32_t v9; // 0x6fb8 int32_t v10; // 0x6fcc int32_t v11; // 0x6fd4 if (v5 == 0) { // 0x6f24 // branch -> 0x6f74 } else { int32_t v12 = 4; // R9 g138 = 0; int32_t v13 = *(int32_t *)(v1 + 4); // 0x6ef8 int32_t v14 = 0; // 0x6efc // branch -> 0x6efc while (true) { int32_t str2 = *(int32_t *)(4 * v14 + v13); // 0x6efc g128 = str2; if (strcmp((char *)str, (char *)str2) == 0) { int32_t v15 = *(int32_t *)(v1 + 8); // 0x6f2c g138 = v15; int32_t v16 = v12 + v15; // 0x6f30 if (v16 != 4) { int32_t v17 = v16 + 4; // 0x6f40 int32_t v18 = *(int32_t *)v17; // 0x6f40 if (v18 != 0) { // 0x6f4c free((char *)v18); // branch -> 0x6f50 } // 0x6f50 *(int32_t *)(v16 - 4) = a3; *(int32_t *)(v12 + g138) = result; // branch -> 0x6fe4 // 0x6fe4 *(int32_t *)v17 = v6; g135 = v2; g138 = v3; g130 = v4; return result; } // 0x6f68 // branch -> 0x6f6c // 0x6f6c g138 = result; // branch -> 0x6f74 // 0x6f74 v7 = g135 + 1; *(int32_t *)v1 = v7; mem = (int32_t)realloc((char *)v13, 4 * v7); *(int32_t *)(v1 + 4) = mem; len = strlen((char *)str); mem2 = malloc(len + 1); *(int32_t *)(4 * *(int32_t *)v1 - 4 + mem) = (int32_t)mem2; strcpy(mem2, (char *)str); v8 = v1; v9 = *(int32_t *)(v8 + 8); mem3 = (int32_t)realloc((char *)v9, 12 * *(int32_t *)v8); *(int32_t *)(v1 + 8) = mem3; v10 = *(int32_t *)v1; g128 = 3 * v10; v11 = 12 * v10 + mem3; result2 = v11; *(int32_t *)(v11 - 12) = a3; *(int32_t *)(result2 - 8) = g138; // branch -> 0x6fe4 // 0x6fe4 *(int32_t *)(v11 - 4) = v6; g135 = v2; g138 = v3; g130 = v4; return result2; } int32_t v19 = g138 + 1; // 0x6f10 g138 = v19; v12 += 12; int32_t v20 = g135; // 0x6f18 if (v19 >= v20) { // 0x6f6c // branch -> 0x6f6c // 0x6f6c g138 = result; // branch -> 0x6f74 // 0x6f74 v7 = v20 + 1; *(int32_t *)v1 = v7; mem = (int32_t)realloc((char *)v13, 4 * v7); *(int32_t *)(v1 + 4) = mem; len = strlen((char *)str); mem2 = malloc(len + 1); *(int32_t *)(4 * *(int32_t *)v1 - 4 + mem) = (int32_t)mem2; strcpy(mem2, (char *)str); v8 = v1; v9 = *(int32_t *)(v8 + 8); mem3 = (int32_t)realloc((char *)v9, 12 * *(int32_t *)v8); *(int32_t *)(v1 + 8) = mem3; v10 = *(int32_t *)v1; g128 = 3 * v10; v11 = 12 * v10 + mem3; result2 = v11; *(int32_t *)(v11 - 12) = a3; *(int32_t *)(result2 - 8) = g138; // branch -> 0x6fe4 // 0x6fe4 *(int32_t *)(v11 - 4) = v6; g135 = v2; g138 = v3; g130 = v4; return result2; } // 0x6f10 v14 = v19; // branch -> 0x6efc } } // 0x6f74 v7 = 1; *(int32_t *)v1 = v7; int32_t v21 = *(int32_t *)(v1 + 4); // 0x6f80 mem = (int32_t)realloc((char *)v21, 4 * v7); *(int32_t *)(v1 + 4) = mem; len = strlen((char *)str); mem2 = malloc(len + 1); *(int32_t *)(4 * *(int32_t *)v1 - 4 + mem) = (int32_t)mem2; strcpy(mem2, (char *)str); v8 = v1; v9 = *(int32_t *)(v8 + 8); mem3 = (int32_t)realloc((char *)v9, 12 * *(int32_t *)v8); *(int32_t *)(v1 + 8) = mem3; v10 = *(int32_t *)v1; g128 = 3 * v10; v11 = 12 * v10 + mem3; result2 = v11; *(int32_t *)(v11 - 12) = a3; *(int32_t *)(result2 - 8) = g138; // branch -> 0x6fe4 // 0x6fe4 *(int32_t *)(v11 - 4) = v6; g135 = v2; g138 = v3; g130 = v4; return result2; } // Address range: 0x6ff0 - 0x705f int32_t destroy_script_variables(char * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6) { int32_t v1 = (int32_t)a1; int32_t v2 = g135; // 0x6ff0 int32_t v3 = v1; // R4 int32_t result; // 0x7054 if (*(int32_t *)a1 == 0) { // 0x7044 free((char *)*(int32_t *)(v1 + 4)); free((char *)*(int32_t *)(v3 + 8)); result = v3; g135 = v2; free((char *)result); return result; } // 0x7008 g135 = 0; int32_t v4 = 8; // R6 int32_t v5 = 0; // 0x7014 // branch -> 0x7010 int32_t v6; // 0x7030 while (true) { // 0x7010 free((char *)*(int32_t *)(*(int32_t *)(v1 + 4) + 4 * v5)); int32_t v7 = *(int32_t *)(v4 + *(int32_t *)(v3 + 8)); // 0x7020 v6 = v3; if (v7 != 0) { // 0x702c free((char *)v7); v6 = v3; // branch -> 0x7030 } int32_t v8 = g135 + 1; // 0x7034 g135 = v8; v4 += 12; if (v8 >= *(int32_t *)v6) { // break -> 0x7044 break; } v5 = v8; v1 = v6; // continue -> 0x7010 } // 0x7044 free((char *)*(int32_t *)(v6 + 4)); free((char *)*(int32_t *)(v3 + 8)); result = v3; g135 = v2; free((char *)result); return result; } // Address range: 0x7060 - 0x7113 int32_t copy_script_value(char * a1, char a2, int32_t a3, char * a4) { int32_t v1 = a2; int32_t v2 = (int32_t)a4; g133 = v2; int32_t v3 = g135; // 0x7060 int32_t v4 = g136; // 0x7060 int32_t v5 = g137; // 0x7060 int32_t v6 = g138; // 0x7060 int32_t v7 = g139; // 0x7060 int32_t v8 = g130; // bp-8 g130 = &v8; g136 = v1; g139 = a3; uint32_t v9 = v1 % 256; // 0x7074 g132 = v9; g138 = v2; g135 = (int32_t)a1; g137 = 0; g1 = v9 > 6; g2 = v9 < 7; g3 = v9 == 7; int32_t v10; uint32_t v11; int32_t result; // 0x70f0 if (v9 > 7) { // 0x70f0 result = 0x1000000 * v10 / 0x1000000; g128 = v11 % 0x10000; *(char *)g135 = (char)g136; *(char *)(g135 + 3) = (char)result; *(int16_t *)(g135 + 1) = (int16_t)v11; *(int32_t *)(g135 + 4) = g139; *(int32_t *)(g135 + 8) = g137; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g139 = v7; g130 = v8; return result; } // 0x708c g133 = &g60; g128 = 1; g127 = 2; int32_t v12 = *(int32_t *)(4 * v9 + (int32_t)&g60); // 0x709c g132 = v12; ((int32_t (*)(int32_t, int32_t, int32_t, int32_t))(v12 + (int32_t)&g60))(2, 1, v12, (int32_t)&g60); if (g3) { // after_if_70b8_0 // branch -> after_if_70c0_0 } int32_t size = 4 * g139; // 0x70cc if (size != 0) { char * mem = malloc(size); // 0x70dc g132 = size; g137 = (int32_t)mem; __aeabi_memcpy(mem, (char *)g138, size); // branch -> 0x70f0 } // 0x70f0 result = 0x1000000 * v10 / 0x1000000; g128 = v11 % 0x10000; *(char *)g135 = (char)g136; *(char *)(g135 + 3) = (char)result; *(int16_t *)(g135 + 1) = (int16_t)v11; *(int32_t *)(g135 + 4) = g139; *(int32_t *)(g135 + 8) = g137; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g139 = v7; g130 = v8; return result; } // Address range: 0x7114 - 0x7153 // Used cryptographic patterns: // - rfc3548_Base_64_Encoding_with_URL_and_Filename_Safe_Alphabet (8-bit, little endian) int32_t validate_variable_name(char * str) { int32_t v1 = g135; // 0x7114 int32_t ini_seg_bytes = strspn(str, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); // 0x712c g135 = ini_seg_bytes; int32_t result = 0; // 0x7148 if (ini_seg_bytes == strlen((char *)(int32_t)str)) { // if_7144_0_true result = 1; // branch -> after_if_7144_0 } // after_if_7144_0 g135 = v1; return result; } // Address range: 0x7154 - 0x741f int32_t settings_mode(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, char * a6, char * a7, int32_t a8, int32_t a9, char * a10, char * a11, int32_t a12, int32_t a13, char * a14, int32_t a15, int32_t a16, int32_t a17) { int32_t v1 = g130; // bp-8 g130 = &v1; puts("Enter a setting to view its value, or a setting and a value to change it."); puts("Enter ? for help, or a blank line to exit configuration mode."); printf("config> "); int32_t result = read_line((struct _IO_FILE *)g33); // 0x718c char * str = (char *)result; // 0x7194_0 if (*str != 0) { // 0x71a0 return strcmp(str, "?"); } // 0x73c0 free(str); return result; } // Address range: 0x7420 - 0x749b int32_t settings_help(int32_t a1, int32_t a2, int32_t a3, int32_t a4) { int32_t v1 = g134; // 0x7420 int32_t v2 = g135; // 0x7420 int32_t v3 = g130; // 0x7420 int32_t v4 = *(int32_t *)&g9; // 0x742c g3 = v4 == 0; int32_t puts_rc; // 0x7484 if (v4 == 0) { // 0x746c puts("Enter a setting to view its value, or a setting and a value to change it."); g134 = v1; g135 = v2; g130 = v3; puts_rc = puts("Enter ? for help, or a blank line to exit configuration mode."); g127 = puts_rc; return puts_rc; } // 0x743c g135 = &g11; int32_t v5 = &g11; // 0x7450 // branch -> 0x7450 while (true) { int32_t v6 = *(int32_t *)v5; // 0x7450 printf((char *)(int32_t)"%-10s - %s\n", (char *)v4, (char *)v6); int32_t v7 = g135; // 0x745c int32_t v8 = *(int32_t *)(v7 + 4); // 0x745c int32_t v9 = v7 + 12; // 0x7460 g135 = v9; g3 = v8 == 0; if (v8 == 0) { // 0x746c puts("Enter a setting to view its value, or a setting and a value to change it."); g134 = v1; g135 = v2; g130 = v3; puts_rc = puts("Enter ? for help, or a blank line to exit configuration mode."); g127 = puts_rc; return puts_rc; } // 0x7450 v4 = v8; v5 = v9; // branch -> 0x7450 } } // Address range: 0x749c - 0x754f int32_t headers_setting_handler(char * str, int32_t a2, int32_t a3, int32_t a4) { int32_t v1 = g134; // 0x749c int32_t v2 = g130; // 0x749c int32_t v3; // 0x7520 int32_t v4; // 0x7514 if (str == NULL) { // 0x74ec v3 = 0x1000000 * *(int32_t *)&g44 / 0x1000000 % 2; // branch -> 0x7504 // 0x7504 v4 = *(int32_t *)&g44; *(char *)v4 = (char)(v4 & 254 | v3); g127 = v3 == 0 ? (int32_t)"off" : (int32_t)"on"; g134 = v1; g130 = v2; return duplicate_string(); } // 0x74b0 if (strcmp(str, "off") == 0) { // 0x7500 v3 = 0; // branch -> 0x7504 } else { // 0x74c8 if (strcmp((char *)(int32_t)str, "on") != 0) { // if_74e0_0_true return 0; } // after_if_74e0_0 v3 = 1; // branch -> 0x7504 } // 0x7504 v4 = *(int32_t *)&g44; *(char *)v4 = (char)(v4 & 254 | v3); g127 = v3 == 0 ? (int32_t)"off" : (int32_t)"on"; g134 = v1; g130 = v2; return duplicate_string(); } // Address range: 0x7550 - 0x7657 int32_t indent_setting_handler(char * str, int32_t a2, int32_t a3, int32_t a4) { int32_t v1 = g134; // 0x7550 int32_t v2 = g135; // 0x7550 int32_t v3 = g130; // 0x7550 int32_t str2 = (int32_t)str; // R4 int32_t v4; // 0x75c8 int32_t v5; // 0x75e4 if (str == NULL) { // 0x75bc v4 = 0x1000000 * *(int32_t *)&g44 / 0x1000000 / 2 % 16; g135 = v4; // branch -> 0x75dc // 0x75dc v5 = *(int32_t *)&g44; *(char *)v5 = (char)(2 * v4 & 30 | v5 & 225); if (v4 > 9) { // 0x75fc g127 = (int32_t)"tab"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x760c if (g135 != 0) { // 0x7614 return (int32_t)malloc(2); } // 0x7630 g127 = (int32_t)"none"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x7564 if (strcmp(str, "none") == 0) { // 0x75d0 g135 = 0; v4 = 0; // branch -> 0x75dc // 0x75dc v5 = *(int32_t *)&g44; *(char *)v5 = (char)(2 * v4 & 30 | v5 & 225); if (v4 > 9) { // 0x75fc g127 = (int32_t)"tab"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x760c if (g135 != 0) { // 0x7614 return (int32_t)malloc(2); } // 0x7630 g127 = (int32_t)"none"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x757c if (strcmp((char *)str2, "tab") == 0) { // 0x75d8 g135 = 15; v4 = 15; // branch -> 0x75dc } else { int32_t v6 = (int32_t)*(char *)str2 - 48; // 0x7598 g135 = v6; if (v6 % 256 > 9 || *(char *)(str2 + 1) != 0) { // 0x762c g135 = v2; return 0; } v4 = v6; } // 0x75dc v5 = *(int32_t *)&g44; *(char *)v5 = (char)(2 * v4 & 30 | v5 & 225); if (v4 > 9) { // 0x75fc g127 = (int32_t)"tab"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x760c if (g135 != 0) { // 0x7614 return (int32_t)malloc(2); } // 0x7630 g127 = (int32_t)"none"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // Address range: 0x7658 - 0x770b int32_t code_labels_setting_handler(char * str, int32_t a2, int32_t a3) { int32_t v1 = g134; // 0x7658 int32_t v2 = g130; // 0x7658 int32_t v3; // 0x76dc int32_t v4; // 0x76d0 if (str == NULL) { // 0x76a8 v3 = 0x1000000 * *(int32_t *)&g44 / 0x1000000 / 32 % 2; // branch -> 0x76c0 // 0x76c0 v4 = *(int32_t *)&g44; *(char *)v4 = (char)(v4 & 223 | -v3 & 32); g127 = v3 == 0 ? (int32_t)"off" : (int32_t)"on"; g134 = v1; g130 = v2; return duplicate_string(); } // 0x766c if (strcmp(str, "off") == 0) { // 0x76bc v3 = 0; // branch -> 0x76c0 } else { // 0x7684 if (strcmp((char *)(int32_t)str, "on") != 0) { // if_769c_0_true return 0; } // after_if_769c_0 v3 = 1; // branch -> 0x76c0 } // 0x76c0 v4 = *(int32_t *)&g44; *(char *)v4 = (char)(v4 & 223 | -v3 & 32); g127 = v3 == 0 ? (int32_t)"off" : (int32_t)"on"; g134 = v1; g130 = v2; return duplicate_string(); } // Address range: 0x770c - 0x77f3 int32_t data_labels_setting_handler(char * str, int32_t a2, int32_t a3) { int32_t v1 = g134; // 0x770c int32_t v2 = g130; // 0x770c int32_t str2 = (int32_t)str; // R4 int32_t v3; // 0x77b4 uint32_t v4; // 0x77a4 if (str == NULL) { int32_t v5 = 0x1000000 * *(int32_t *)&g44 / 0x1000000 / 64; // 0x7780 v3 = v5; // branch -> 0x7794 // 0x7794 v4 = *(int32_t *)&g44; *(char *)v4 = (char)(v4 % 64 | 64 * v3); g127 = v3 == 1 ? (int32_t)"exact" : (int32_t)"on"; if (v5 == 0) { // if_77c8_0_true g127 = (int32_t)"off"; // branch -> after_if_77c8_0 } // after_if_77c8_0 g134 = v1; g130 = v2; return duplicate_string(); } // 0x7720 if (strcmp(str, "off") == 0) { // 0x7788 v3 = 0; // branch -> 0x7794 // 0x7794 v4 = *(int32_t *)&g44; *(char *)v4 = (char)(v4 % 64 | 64 * v3); g127 = v3 == 1 ? (int32_t)"exact" : (int32_t)"on"; // if_77c8_0_true g127 = (int32_t)"off"; // branch -> after_if_77c8_0 // after_if_77c8_0 g134 = v1; g130 = v2; return duplicate_string(); } // 0x7738 int32_t v6; // R1 if (strcmp((char *)str2, "exact") == 0) { // 0x7790 v6 = 1; v3 = 1; // branch -> 0x7794 } else { // 0x7750 if (strcmp((char *)str2, "on") != 0) { // if_7768_0_true return 0; } // after_if_7768_0 v6 = 2; v3 = 2; // branch -> 0x7794 } // 0x7794 v4 = *(int32_t *)&g44; *(char *)v4 = (char)(v4 % 64 | 64 * v3); g127 = v3 == 1 ? (int32_t)"exact" : (int32_t)"on"; if (v6 == 0) { // if_77c8_0_true g127 = (int32_t)"off"; // branch -> after_if_77c8_0 } // after_if_77c8_0 g134 = v1; g130 = v2; return duplicate_string(); } // Address range: 0x77f4 - 0x788f int32_t get_value_from_string(char * a1, int32_t a2) { int32_t v1 = g135; // 0x77f4 int32_t v2 = g130; // 0x77f4 g135 = (int32_t)a1; int32_t v3 = a2; // R4 if (a1 == NULL || a2 == 0 || *a1 == 0) { // 0x7888 g135 = v1; g130 = v2; return -1; } char * mem = malloc(a2 + 1); // 0x7828 int32_t str = (int32_t)mem; // R6 __aeabi_memcpy(mem, (char *)g135, v3); *(char *)(v3 + str) = 0; int32_t endptr; int64_t str_as_ull = strtoull((char *)str, (char **)&endptr, 0); // 0x7850 v3 = str_as_ull; g135 = &endptr; free((char *)str); int32_t result = v3; // 0x788c_22 if (*(char *)endptr != 0) { // if_7878_0_true result = -1; // branch -> after_if_7878_0 } if (((int32_t)(v3 != -1) ^ 1) > -g135) { // if_7884_0_true result = -1; // branch -> 0x7888 } // 0x7888 g135 = v1; g130 = v2; return result; } // Address range: 0x7890 - 0x7903 int64_t convert_string_to_number(char * str, int32_t a2) { g128 = a2; int32_t v1 = g135; // 0x7890 int32_t v2 = g130; // 0x7890 g135 = a2; if (str == NULL) { // 0x78f4 // branch -> 0x78f8 // 0x78f8 g135 = v1; g130 = v2; return 0; } int32_t v3 = 0; // R4 int32_t endptr; int32_t str_as_ll = strtoll(str, (char **)&endptr, 0); // 0x78b4_6 int32_t v4 = -str_as_ll; // 0x78b8 uint32_t v5 = 2 * ((int32_t)(str_as_ll > v4) | (int32_t)&endptr) | (int32_t)(v4 < 0); // 0x78c4 g132 = 2 - v5; uint32_t v6 = (int32_t)(&endptr < NULL); // 0x78cc g128 = v3 - v6 - ((int32_t)(v5 < 3) ^ 1); int32_t result; // 0x78f8 if (v3 >= v6) { char v7 = *(char *)endptr; // 0x78d8 g128 = v7; if (v7 == 0) { // 0x78e4 int32_t v8; // 0x78ec if (g135 != 0) { // if_78e8_0_true v8 = str_as_ll & -0x10000 | 1; // branch -> after_if_78e8_0 } else { v8 = str_as_ll; } // after_if_78e8_0 result = v8; // branch -> 0x78f8 } else { result = v3; } } else { result = v3; } // 0x78f8 g135 = v1; g130 = v2; return result; } // Address range: 0x7904 - 0x79bf int32_t concatenate(int32_t * a1, int32_t * a2, char * a3, int32_t a4) { int32_t v1 = (int32_t)a1; int32_t v2 = (int32_t)a2; int32_t str = (int32_t)a3; g133 = a4; int32_t v3 = g135; // 0x7908 int32_t v4 = g138; // 0x7908 int32_t v5 = g130; // 0x7908 g138 = v1; g1 = true; g3 = a3 == NULL; int32_t result; // 0x79a0 int32_t v6; // 0x79a8 if (a3 == NULL) { // 0x79a0 result = *(int32_t *)v2; g132 = 0; v6 = *(int32_t *)v1; g128 = v6; *(char *)(v6 + result) = 0; g135 = v3; g138 = v4; g130 = v5; return result; } // 0x7940 g135 = *a2; int32_t v7 = &a4; int32_t len = strlen((char *)str); // 0x794c int32_t v8 = len; // R4 int32_t mem = (int32_t)realloc((char *)*a1, len + 1 + g135); // 0x7960_5 int32_t v9 = mem; // R7 *(int32_t *)g138 = mem; int32_t v10 = *(int32_t *)v2; // 0x7974 g135 = v10; __aeabi_memcpy((char *)(v9 + v10), (char *)str, v8); int32_t v11 = g135 + v8; // 0x7980 g135 = v11; *(int32_t *)v2 = v11; int32_t v12 = *(int32_t *)v7; // 0x7994 g1 = true; g3 = v12 == 0; // branch -> 0x7948 while (v12 != 0) { // 0x7948 str = v12; v7 += 4; len = strlen((char *)str); v8 = len; mem = (int32_t)realloc((char *)v9, len + 1 + g135); v9 = mem; *(int32_t *)g138 = mem; v10 = *(int32_t *)v2; g135 = v10; __aeabi_memcpy((char *)(v9 + v10), (char *)str, v8); v11 = g135 + v8; g135 = v11; *(int32_t *)v2 = v11; v12 = *(int32_t *)v7; g1 = true; g3 = v12 == 0; // continue -> 0x7948 } // 0x79a0 // branch -> 0x79a0 // 0x79a0 result = *(int32_t *)v2; g132 = 0; v6 = *(int32_t *)g138; g128 = v6; *(char *)(v6 + result) = 0; g135 = v3; g138 = v4; g130 = v5; return result; } // Address range: 0x79c0 - 0x79eb int32_t duplicate_string(void) { int32_t v1 = g135; // 0x79c0 char * str = (char *)g127; // 0x79cc_2 char * mem = malloc(strlen(str) + 1); // 0x79d4 int32_t result = (int32_t)mem; // 0x79d4_3 g128 = g127; g135 = result; strcpy(mem, str); g127 = result; g135 = v1; return result; } // Address range: 0x79ec - 0x7ad7 int32_t split_by_spaces(void) { int32_t v1 = g135; // 0x79ec int32_t v2 = g138; // 0x79ec int32_t v3 = g130; // 0x79ec g3 = g127 == 0; if (g127 == 0) { // 0x7a9c g127 = 0; g135 = v1; g138 = v2; g130 = v3; return 0; } int32_t str = g127 + strspn((char *)g127, " \t"); // 0x7a14 int32_t str2 = str; // R4 char v4 = *(char *)str; // 0x7a14 g3 = v4 == 0; int32_t mem2; // 0x7abc_5 if (v4 == 0) { // 0x7aa8 g135 = 0; // branch -> 0x7ab0 } else { int32_t v5 = 0; // R9 g135 = 0; g138 = (int32_t)" \t"; int32_t reject = (int32_t)" \t"; // 0x7a34 // branch -> 0x7a30 while (true) { int32_t v6 = v5 + 1; // 0x7a3c int32_t v7 = v6; // R10 int32_t ini_seg_bytes = strcspn((char *)str, (char *)reject); // R7 g135 = (int32_t)realloc((char *)g135, 4 * v6); char * mem = malloc(ini_seg_bytes + 1); // 0x7a58 int32_t v8 = (int32_t)mem; // 0x7a58_3 g132 = ini_seg_bytes; *(int32_t *)(4 * v5 + g135) = v8; __aeabi_memcpy(mem, (char *)str2, ini_seg_bytes); str2 += ini_seg_bytes; *(char *)(v8 + ini_seg_bytes) = 0; int32_t v9 = str2 + strspn((char *)str2, (char *)g138); // 0x7a88 str2 = v9; char v10 = *(char *)v9; // 0x7a88 int32_t v11 = v7; // 0x7a8c v5 = v11; g3 = v10 == 0; if (v10 == 0) { // 0x7ab0 // branch -> 0x7ab0 // 0x7ab0 mem2 = (int32_t)realloc((char *)g135, 4 * v11 + 4); g127 = mem2; g128 = 0; *(int32_t *)(4 * v7 + mem2) = 0; g135 = v1; g138 = v2; g130 = v3; return mem2; } // 0x7a30 reject = g138; str = v9; // branch -> 0x7a30 } } // 0x7ab0 mem2 = (int32_t)realloc((char *)0, 4); g127 = mem2; g128 = 0; *(int32_t *)mem2 = 0; g135 = v1; g138 = v2; g130 = v3; return mem2; } // Address range: 0x7ad8 - 0x7ae7 int32_t string_array_size(int32_t * a1) { int32_t v1 = *a1; // 0x7ad8 g128 = v1; if (v1 == 0) { // if_7ae0_0_true return 0; } // after_ret_cond_7ae4_0 return (int32_t)a1; } // Address range: 0x7ae8 - 0x7b03 int32_t function_7ae8(int32_t a1) { int32_t v1 = 0; // 0x7af0 int32_t result = v1 + 1; // 0x7af4 // branch -> 0x7af0 while (*(int32_t *)(4 * v1 + a1 + 4) != 0) { // 0x7af0 v1 = result; result = v1 + 1; // continue -> 0x7af0 } // 0x7b00 g3 = true; return result; } // Address range: 0x7b04 - 0x7b43 int32_t destroy_string_array(char * a1, int32_t a2, int32_t a3, int32_t a4) { int32_t result = (int32_t)a1; g128 = a2; g132 = a3; g133 = a4; int32_t v1 = g134; // 0x7b04 int32_t v2 = g135; // 0x7b04 int32_t v3 = g130; // 0x7b04 int32_t v4 = v3; // bp-8 g130 = &v4; g134 = result; g1 = true; g3 = a1 == NULL; if (a1 == NULL) { // if_7b14_0_true g134 = v1; g135 = v2; g130 = v3; return result; } int32_t result2 = *(int32_t *)a1; // 0x7b18 g1 = true; g3 = result2 == 0; if (result2 != 0) { // 0x7b24 g135 = result + 4; free((char *)result2); return result2; } // 0x7b38 int32_t v5; g134 = v5; int32_t v6; g135 = v6; int32_t v7; g130 = v7; int32_t v8; g126 = v8; free(a1); return result; } // Address range: 0x7b44 - 0x7b6b int32_t find_first_non_space(char * str) { // 0x7b44 return (int32_t)str + strspn(str, " \t"); } // Address range: 0x7b6c - 0x7c33 int32_t generate_initial_indented_line(int32_t * a1, int32_t * a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7) { // 0x7b6c g132 = a3; g133 = a4; int32_t v1 = g134; // bp-24 int32_t v2 = g135; // 0x7b6c int32_t v3 = g136; // 0x7b6c int32_t v4 = g137; // 0x7b6c int32_t v5 = g130; // bp-8 g135 = (int32_t)a1; g137 = (int32_t)a2; uint32_t v6 = *(int32_t *)&g44 / 2 % 16; // 0x7b88 int32_t v7 = v6; // 0x7bbc if (v6 >= 10) { int32_t mem = (int32_t)malloc(2); // 0x7b98_3 g127 = mem; int32_t v8 = g137; // 0x7b9c g1 = true; g2 = v8 < 0; g3 = v8 == 0; g128 = 9; *(int32_t *)g135 = mem; *(int16_t *)g127 = 9; if (v8 != 0) { // if_7bb4_0_true *(int32_t *)g137 = 1; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g130 = v5; return 1; } // after_if_7bb4_0 g134 = a5; g135 = a6; g136 = a7; int32_t v9; g137 = v9; int32_t v10; g130 = v10; int32_t v11; ((int32_t (*)())v11)(); v7 = g127; // branch -> 0x7bbc } int32_t mem2 = (int32_t)malloc((v7 + 1) % 256); // 0x7bc4_3 g131 = 0; *(int32_t *)g135 = mem2; int32_t v12 = 0; // R2 if ((0x1000000 * *(int32_t *)&g44 / 0x1000000 & 30) == 0) { // 0x7bbc // branch -> 0x7c18 } else { // 0x7be8 g133 = 32; char v13 = 32; int32_t v14 = mem2; // 0x7bf4 // branch -> 0x7bf4 while (true) { // 0x7bf4 *(char *)v14 = v13; int32_t v15 = v12 + 1; // 0x7bf8 v12 = v15; int32_t result = *(int32_t *)g135 + v15; // 0x7c08 if (v15 >= (int32_t)*(char *)&g44 / 2 % 16) { // 0x7c14 // branch -> 0x7c18 // 0x7c18 *(char *)result = (char)g131; if (g137 != 0) { // if_7c20_0_true *(int32_t *)g137 = v12; // branch -> after_if_7c20_0 } // after_if_7c20_0 g134 = v1; g135 = v2; g136 = v3; g137 = v4; g130 = v5; return result; } // 0x7bf4 v13 = g133; v14 = result; // branch -> 0x7bf4 } } // 0x7c18 *(char *)mem2 = (char)g131; if (g137 != 0) { // if_7c20_0_true *(int32_t *)g137 = v12; // branch -> after_if_7c20_0 } // after_if_7c20_0 g134 = v1; g135 = v2; g136 = v3; g137 = v4; g130 = v5; return mem2; } // Address range: 0x7c34 - 0x7d1f int32_t load_symbols(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5) { int32_t v1 = g135; // 0x7c34 int32_t v2 = g130; // bp-8 g130 = &v2; printf("ELF file: "); int32_t result2 = read_line((struct _IO_FILE *)g33); // 0x7c54 g135 = result2; char * v3 = (char *)result2; // 0x7c5c_0 if (*v3 != 0) { // 0x7c68 int32_t v4; g132 = &v4; int32_t v5; g128 = &v5; g127 = result2; int32_t result = (int32_t)read_symbols_from_ELF(); // 0x7c74_1 g127 = result; return result; } // 0x7c9c g127 = result2; g135 = v1; g130 = v2; free(v3); return result2; } // Address range: 0x7d20 - 0x7d33 int32_t unload_symbols(void) { // 0x7d20 g127 = g24; g3 = g24 == 0; return g24; } // Address range: 0x7d34 - 0x7d73 int32_t function_7d34(int32_t a1) { int32_t v1 = g134; // 0x7d34 int32_t v2 = g130; // bp-8 g130 = &v2; int32_t v3 = *(int32_t *)&g31; // 0x7d40 g134 = v3; destroy_ELF_symbols((char *)a1, v3); *(int32_t *)g134 = 0; *(int32_t *)g24 = 0; g134 = v1; return g24; } // Address range: 0x7d74 - 0x7eff int32_t find_symbol_for_address(uint32_t a1) { int32_t v1 = g135; // 0x7d74 int32_t v2 = g130; // 0x7d74 uint32_t v3 = *(int32_t *)&g31; // 0x7d80 g131 = v3; g3 = v3 == 0; if (v3 == 0) { // 0x7df0 g135 = v1; g130 = v2; return 0; } int32_t v4 = g24; g126 = v4; unsigned char v5; int32_t v6; // 0x7e40 int32_t v7; // 0x7e50 int32_t v8; // 0x7e5c int32_t v9; // 0x7ed0 int32_t result; // 0x7ed4 int32_t result3; // 0x7ee4 int32_t v10; // 0x7e44 char v11; // 0x7e7c unsigned char v12; // 0x7e80 char v13; // 0x7e9c uint32_t v14; // 0x7ec0 int32_t result2; // 0x7e90 uint32_t v15; // 0x7ec4 int32_t result4; // 0x7e40 if (v3 == 1) { v6 = 0; // 0x7e40 result4 = *(int32_t *)(4 * v6 + v4); v10 = *(int32_t *)result4; if (v10 != a1) { // 0x7e9c v13 = *(char *)(result4 + 8); g3 = v13 == 1; result = 0; if (v13 == 1) { // 0x7eac v5 = (char)*(int32_t *)&g44; g3 = v5 == 0; if (v5 <= 255) { // 0x7ec0 v14 = *(int32_t *)(result4 + 4); v15 = a1 - v10; g3 = v15 == v14; v9 = result4; if (v15 < v14) { // if_7ecc_0_true v9 = 0; // branch -> after_if_7ecc_0 } // after_if_7ecc_0 result = v9; // branch -> 0x7ed4 } else { result = 0; } } // 0x7ed4 g135 = v1; g130 = v2; return result; } v8 = v6; v7 = result4; while (true) { // 0x7e50 result2 = v7; if (v8 >= v3) { lab_0x7e5c_2:; int32_t v16 = *(int32_t *)(4 * v8 + v4 + 4); // 0x7e64 if (*(int32_t *)v16 != a1) { result2 = v7; // break -> 0x7e7c break; } v8++; v7 = v16; // continue -> 0x7e50 continue; } // 0x7e7c v11 = *(char *)(result2 + 8); v12 = *(char *)*(int32_t *)&g44; g3 = v11 == 2; if (v11 == 2) { // 0x7e8c g135 = v1; g130 = v2; return 0x4000000 * (int32_t)v12 >> 31 & result2; } // 0x7edc g3 = v12 == 63; if (v12 < 64) { // if_7ee0_0_true // branch -> after_if_7ee0_0 // after_if_7ee0_0 g135 = v1; g130 = v2; return 0; } // after_if_7ee0_0 g135 = v1; g130 = v2; return result2; } // 0x7e7c v11 = *(char *)(result2 + 8); v12 = *(char *)*(int32_t *)&g44; g3 = v11 == 2; if (v11 == 2) { // 0x7e8c g135 = v1; g130 = v2; return 0x4000000 * (int32_t)v12 >> 31 & result2; } // 0x7edc g3 = v12 == 63; result3 = result2; if (v12 < 64) { // if_7ee0_0_true result3 = 0; // branch -> after_if_7ee0_0 } // after_if_7ee0_0 g135 = v1; g130 = v2; return result3; } int32_t v17 = &g30; // 0x7db032 int32_t v18 = 0; // 0x7dfc lab_0x7da8: while (true) { int32_t v19 = v17; // 0x7dfc // branch -> 0x7db0 while (true) { uint32_t v20 = (v19 + v18 + 1) / 2; // 0x7db4 int32_t v21 = *(int32_t *)(4 * v20 + v4); // 0x7db8 g135 = v21; uint32_t v22 = *(int32_t *)v21; // 0x7dbc if (v22 == a1) { int32_t v23 = v20 + 1; // 0x7e1c // branch -> 0x7e0c while (true) { // 0x7e0c if (v23 - 1 >= v3) { int32_t v24 = *(int32_t *)(4 * v23 + v4); // 0x7e1c g135 = v24; if (*(int32_t *)v24 != a1) { result2 = v21; // break -> 0x7e7c break; } v21 = v24; v23++; // continue -> 0x7e0c continue; } else { result2 = v21; } } // 0x7e7c v11 = *(char *)(result2 + 8); v12 = *(char *)*(int32_t *)&g44; g3 = v11 == 2; if (v11 == 2) { // 0x7e8c g135 = v1; g130 = v2; return 0x4000000 * (int32_t)v12 >> 31 & result2; } // 0x7edc g3 = v12 == 63; if (v12 < 64) { // if_7ee0_0_true // branch -> after_if_7ee0_0 // after_if_7ee0_0 g135 = v1; g130 = v2; return 0; } // after_if_7ee0_0 g135 = v1; g130 = v2; return result2; } // 0x7dc8 if (v22 > a1) { // 0x7dcc if (v20 <= v18) { // 0x7df0 g3 = v20 == v18; // branch -> 0x7df0 // 0x7df0 g135 = v1; g130 = v2; return 0; } int32_t v25 = v20 - 1; // 0x7dd4 if (v18 >= v25) { // break -> 0x7e3c break; } v19 = v25; // continue -> 0x7db0 continue; } else { // 0x7de4 if (v20 >= v19) { v6 = v20; // break (via goto) -> 0x7e40 goto lab_0x7e40; } v17 = v19; v18 = v20; // continue (via goto) -> 0x7da8 goto lab_0x7da8; } lab_0x7e40: // 0x7e40 result4 = *(int32_t *)(4 * v6 + v4); v10 = *(int32_t *)result4; if (v10 != a1) { // 0x7e9c v13 = *(char *)(result4 + 8); g3 = v13 == 1; if (v13 == 1) { // 0x7eac v5 = (char)*(int32_t *)&g44; g3 = v5 == 0; if (v5 <= 255) { // 0x7ec0 v14 = *(int32_t *)(result4 + 4); v15 = a1 - v10; g3 = v15 == v14; if (v15 < v14) { // if_7ecc_0_true // branch -> after_if_7ecc_0 // after_if_7ecc_0 // branch -> 0x7ed4 // 0x7ed4 g135 = v1; g130 = v2; return 0; } // after_if_7ecc_0 // branch -> 0x7ed4 // 0x7ed4 g135 = v1; g130 = v2; return result4; } } // 0x7ed4 g135 = v1; g130 = v2; return 0; } v8 = v6; v7 = result4; while (true) { // 0x7e50 if (v8 >= v3) { goto lab_0x7e5c_2; } result2 = v7; // 0x7e7c v11 = *(char *)(result2 + 8); v12 = *(char *)*(int32_t *)&g44; g3 = v11 == 2; if (v11 == 2) { // 0x7e8c g135 = v1; g130 = v2; return 0x4000000 * (int32_t)v12 >> 31 & result2; } // 0x7edc g3 = v12 == 63; if (v12 < 64) { // if_7ee0_0_true // branch -> after_if_7ee0_0 // after_if_7ee0_0 g135 = v1; g130 = v2; return 0; } // after_if_7ee0_0 g135 = v1; g130 = v2; return result2; } // 0x7e40 result4 = *(int32_t *)(4 * v6 + v4); v10 = *(int32_t *)result4; if (v10 != a1) { // 0x7e9c v13 = *(char *)(result4 + 8); g3 = v13 == 1; result = 0; if (v13 == 1) { int32_t v26 = *(int32_t *)&g44; // 0x7eb0 v5 = (char)v26; g3 = v5 == 0; if (v5 <= 255) { // 0x7ec0 v14 = *(int32_t *)(result4 + 4); v15 = a1 - v10; g3 = v15 == v14; v9 = result4; if (v15 >= v14) { // after_if_7ecc_0 result = v9; // branch -> 0x7ed4 // 0x7ed4 g135 = v1; g130 = v2; return result; } // if_7ecc_0_true v9 = 0; // branch -> after_if_7ecc_0 // after_if_7ecc_0 result = v9; // branch -> 0x7ed4 // 0x7ed4 g135 = v1; g130 = v2; return result; } result = 0; } // 0x7ed4 g135 = v1; g130 = v2; return result; } v8 = v6; v7 = result4; int32_t v27; int32_t v28; // 0x7e80 while (true) { // 0x7e50 if (v8 >= v3) { goto lab_0x7e5c_2; } result2 = v7; // 0x7e7c v27 = *(int32_t *)&g44; v11 = *(char *)(result2 + 8); v12 = *(char *)v27; v28 = v12; g3 = v11 == 2; if (v11 == 2) { // 0x7e8c g135 = v1; g130 = v2; return 0x4000000 * v28 >> 31 & result2; } // 0x7edc g3 = v12 == 63; result3 = result2; if (v12 >= 64) { // after_if_7ee0_0 g135 = v1; g130 = v2; return result3; } // if_7ee0_0_true result3 = 0; // branch -> after_if_7ee0_0 // after_if_7ee0_0 g135 = v1; g130 = v2; return result3; } // 0x7e7c v27 = *(int32_t *)&g44; v11 = *(char *)(result2 + 8); v12 = *(char *)v27; v28 = v12; g3 = v11 == 2; if (v11 == 2) { // 0x7e8c g135 = v1; g130 = v2; return 0x4000000 * v28 >> 31 & result2; } // 0x7edc g3 = v12 == 63; result3 = result2; if (v12 >= 64) { // after_if_7ee0_0 g135 = v1; g130 = v2; return result3; } // if_7ee0_0_true result3 = 0; // branch -> after_if_7ee0_0 // after_if_7ee0_0 g135 = v1; g130 = v2; return result3; } } } // Address range: 0x7f00 - 0x7f83 int32_t check_exact_symbol_match(int32_t a1, int32_t a2, int32_t a3) { // 0x7f00 int32_t v1; int32_t (*v2)() = (int32_t (*)())v1; int32_t v3 = g130; // 0x7f00 int32_t v4 = g24; int32_t v5 = *(int32_t *)&g31; // 0x7f18 g133 = v5; g126 = v4; g131 = v5; // branch -> 0x7f24 int32_t v6; int32_t v7; int32_t v8; // 0x7f80 uint32_t v9; // 0x7f7c unsigned char v10; // 0x7f50 int32_t v11; // 0x7f5c int32_t v12; // 0x7f24 int32_t v13; // 0x7f54 int32_t result; // 0x7f64 while (true) { int32_t v14 = 4 * a1 + v4; // 0x7f24 v12 = *(int32_t *)v14; g127 = v12; if (a1 >= v5) { int32_t v15 = *(int32_t *)*(int32_t *)(v14 + 4); // 0x7f40 g133 = v15; if (*(int32_t *)v12 != v15) { // break -> 0x7f4c break; } a1++; // continue -> 0x7f24 continue; } // 0x7f4c v10 = *(char *)(v12 + 8); g132 = v10; v13 = *(int32_t *)&g44; g1 = v10 > 1; g3 = v10 == 2; v6 = 0x1000000 * v13; v11 = v6 / 0x1000000; g128 = v11; if (v10 == 2) { // if_7f68_0_true result = 0x4000000 * v13 >> 31 & v12; g127 = result; g130 = v3; return result; } // after_if_7f68_0 g1 = v11 > 62; g2 = v6 < 0x3f000000; g3 = v6 == 0x3f000000; if (v11 < 64) { // if_7f70_0_true g127 = 0; // branch -> after_if_7f70_0 } // after_if_7f70_0 g130 = v7; v2(); v9 = g132 % 256; if (g3) { // if_7f80_0_true v8 = g138; g136 = (v9 == 0 ? v8 : v9 < 32 ? v8 << v9 : 0) & g128; // branch -> after_if_7f80_0 // after_if_7f80_0 return g127; } // after_if_7f80_0 return g127; } // 0x7f4c v10 = *(char *)(v12 + 8); g132 = v10; v13 = *(int32_t *)&g44; g1 = v10 > 1; g3 = v10 == 2; v6 = 0x1000000 * v13; v11 = v6 / 0x1000000; g128 = v11; if (v10 == 2) { // if_7f68_0_true result = 0x4000000 * v13 >> 31 & v12; g127 = result; g130 = v3; return result; } // after_if_7f68_0 g1 = v11 > 62; g2 = v6 < 0x3f000000; g3 = v6 == 0x3f000000; if (v11 < 64) { // if_7f70_0_true g127 = 0; // branch -> after_if_7f70_0 } // after_if_7f70_0 g130 = v7; v2(); v9 = g132 % 256; if (g3) { // if_7f80_0_true v8 = g138; g136 = (v9 == 0 ? v8 : v9 < 32 ? v8 << v9 : 0) & g128; // branch -> after_if_7f80_0 } // after_if_7f80_0 return g127; } // Address range: 0x7f84 - 0x8047 int32_t script_transform_append(char a1, int32_t a2, int32_t a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t (*a12)(int32_t), int32_t a13, int32_t a14, int32_t a15, int32_t a16, int32_t a17, int32_t a18) { int32_t v1 = g135; // 0x7f84 int32_t v2 = g138; // 0x7f84 int32_t v3 = (int32_t)a5; // R4 g135 = a2; int32_t size = a2 + 1; // 0x7f98 g138 = a4; *a5 = a1; int32_t v4 = (int32_t)a1 % 256; // 0x7fac *(int32_t *)(v3 + 4) = size; *(int32_t *)(v3 + 8) = 0; if (v4 == 7) { // 0x7fe8 return (int32_t)malloc(4 * size); } // 0x7fbc if (v4 == 6) { // 0x8008 return (int32_t)malloc(2 * size); } // 0x7fc4 if (v4 == 5) { // 0x7fcc return (int32_t)malloc(size); } // 0x8034 g127 = (int32_t)"type mismatch"; g135 = v1; g138 = v2; return duplicate_string(); } // Address range: 0x8048 - 0x8113 int32_t script_transform_prepend(char a1, int32_t a2, int32_t a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t (*a12)(int32_t), int32_t a13, int32_t a14, int32_t a15, int32_t a16, int32_t a17, int32_t a18) { int32_t v1 = g135; // 0x8048 int32_t v2 = g138; // 0x8048 int32_t v3 = (int32_t)a5; // R4 int32_t size = a2 + 1; // 0x805c g135 = a3; g138 = a4; *a5 = a1; int32_t v4 = (int32_t)a1 % 256; // 0x8070 *(int32_t *)(v3 + 4) = size; *(int32_t *)(v3 + 8) = 0; if (v4 == 7) { // 0x80b0 return (int32_t)malloc(4 * size); } // 0x8080 if (v4 == 6) { // 0x80d4 return (int32_t)malloc(2 * size); } // 0x8088 if (v4 == 5) { // 0x8090 return (int32_t)malloc(size); } // 0x8100 g127 = (int32_t)"type mismatch"; g135 = v1; g138 = v2; return duplicate_string(); } // Address range: 0x8114 - 0x81c7 int32_t script_transform_rotate(char a1, int32_t a2, char * a3, uint32_t a4) { int32_t v1 = g135; // 0x8114 int32_t v2 = g138; // 0x8114 g135 = a2; g138 = (int32_t)a3; int32_t v3; *(char *)v3 = a1; *(int32_t *)(v3 + 4) = g135; *(int32_t *)(v3 + 8) = 0; uint32_t v4 = (int32_t)a1 % 256; // 0x8140 if (v4 <= 4) { // 0x814c g127 = (int32_t)"type mismatch"; g135 = v1; g138 = v2; return duplicate_string(); } uint32_t v5 = g135; // 0x8160 int32_t v6 = a4 % v5; int32_t v7 = 1; // R6 int32_t v8 = v6; // R7 int32_t v9; // 0x8188 if (v4 == 6) { // after_if_8178_0.thread v7 = 2; v9 = 2; // branch -> after_if_8180_0 } else { // after_if_8178_0 if (v4 == 7) { // if_8180_0_true v7 = 4; v9 = 4; // branch -> after_if_8180_0 } else { v9 = 1; } } // after_if_8180_0 if (v6 < 0) { // if_818c_0_true v8 = v6 + v5; // branch -> after_if_818c_0 } char * mem = malloc(v9 * v5); // 0x8190 int32_t v10 = g135 - v8; // 0x8194 g135 = v10; int32_t v11 = (int32_t)mem; // R9 __aeabi_memcpy(mem, (char *)(g138 + v7 * v8), v7 * v10); __aeabi_memcpy((char *)(v11 + g135 * v7), (char *)g138, v7 * v8); *(int32_t *)(v3 + 8) = v11; g135 = v1; g138 = v2; return 0; } // Address range: 0x81c8 - 0x827b int32_t script_transform_rotateback(char a1, int32_t a2, char * a3, int32_t a4) { int32_t v1 = g135; // 0x81c8 int32_t v2 = g138; // 0x81c8 g135 = a2; g138 = (int32_t)a3; int32_t v3; *(char *)v3 = a1; *(int32_t *)(v3 + 4) = g135; *(int32_t *)(v3 + 8) = 0; uint32_t v4 = (int32_t)a1 % 256; // 0x81f4 if (v4 <= 4) { // 0x8200 g127 = (int32_t)"type mismatch"; g135 = v1; g138 = v2; return duplicate_string(); } uint32_t v5 = g135; // 0x8214 int32_t v6 = -a4 % v5; int32_t v7 = 1; // R6 int32_t v8 = v6; // R7 int32_t v9; // 0x823c if (v4 == 6) { // after_if_822c_0.thread v7 = 2; v9 = 2; // branch -> after_if_8234_0 } else { // after_if_822c_0 if (v4 == 7) { // if_8234_0_true v7 = 4; v9 = 4; // branch -> after_if_8234_0 } else { v9 = 1; } } // after_if_8234_0 if (v6 < 0) { // if_8240_0_true v8 = v6 + v5; // branch -> after_if_8240_0 } char * mem = malloc(v9 * v5); // 0x8244 int32_t v10 = g135 - v8; // 0x8248 g135 = v10; int32_t v11 = (int32_t)mem; // R9 __aeabi_memcpy(mem, (char *)(g138 + v7 * v8), v7 * v10); __aeabi_memcpy((char *)(v11 + g135 * v7), (char *)g138, v7 * v8); *(int32_t *)(v3 + 8) = v11; g135 = v1; g138 = v2; return 0; } // Address range: 0x827c - 0x828b int32_t function_add(int32_t a1, int32_t a2, int32_t * a3) { // 0x827c *a3 = 0; return a2 + a1; } // Address range: 0x828c - 0x82bb int32_t script_transform_add(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = &g61; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x82ac g127 = result; g130 = v1; return result; } // Address range: 0x82bc - 0x82cb int32_t function_subtract(int32_t a1, int32_t a2, int32_t * a3) { // 0x82bc *a3 = 0; return a1 - a2; } // Address range: 0x82cc - 0x82fb int32_t script_transform_subtract(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g4; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x82ec g127 = result; g130 = v1; return result; } // Address range: 0x82fc - 0x830b int32_t function_multiply(int32_t a1, int32_t a2, int32_t * a3) { // 0x82fc *a3 = 0; return a2 * a1; } // Address range: 0x830c - 0x833b int32_t script_transform_multiply(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g34; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x832c g127 = result; g130 = v1; return result; } // Address range: 0x833c - 0x8347 int32_t function_divide(int32_t a1, int32_t a2) { // 0x833c *(int32_t *)g132 = 0; g127 = a1 / a2; return 0; } // Address range: 0x8348 - 0x8377 int32_t script_transform_divide(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g5; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x8368 g127 = result; g130 = v1; return result; } // Address range: 0x8378 - 0x8393 int32_t function_modulo(uint32_t a1, uint32_t a2) { // 0x8378 *(int32_t *)g132 = 0; int32_t result = a1 % a2; g127 = result; return result; } // Address range: 0x8394 - 0x83c3 int32_t script_transform_modulo(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g40; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x83b4 g127 = result; g130 = v1; return result; } // Address range: 0x83c4 - 0x83d3 int32_t function_rsub(int32_t a1, int32_t a2, int32_t * a3) { // 0x83c4 *a3 = 0; return a2 - a1; } // Address range: 0x83d4 - 0x8403 int32_t script_transform_rsub(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g18; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x83f4 g127 = result; g130 = v1; return result; } // Address range: 0x8404 - 0x841b // From class: PLAYER // Type: virtual member function int32_t function_rdiv(int32_t a1, int32_t a2, int32_t * a3) { // 0x8404 *a3 = 0; return a2 / a1; } // Address range: 0x841c - 0x844b int32_t script_transform_rdiv(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = (int32_t)g13.e0; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x843c g127 = result; g130 = v1; return result; } // Address range: 0x844c - 0x8473 int32_t function_rmod(uint32_t a1, uint32_t a2, int32_t * a3) { // 0x844c *a3 = 0; return a2 % a1; } // Address range: 0x8474 - 0x84a3 int32_t script_transform_rmod(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g14; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x8494 g127 = result; g130 = v1; return result; } // Address range: 0x84a4 - 0x84b3 int32_t function_and(int32_t a1, int32_t a2, int32_t * a3) { // 0x84a4 *a3 = 0; return a2 & a1; } // Address range: 0x84b4 - 0x84e3 int32_t script_transform_and(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g37; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x84d4 g127 = result; g130 = v1; return result; } // Address range: 0x84e4 - 0x84f3 int32_t function_or(int32_t a1, int32_t a2, int32_t * a3) { // 0x84e4 *a3 = 0; return a2 | a1; } // Address range: 0x84f4 - 0x8523 int32_t script_transform_or(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g43; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x8514 g127 = result; g130 = v1; return result; } // Address range: 0x8524 - 0x8533 int32_t function_xor(int32_t a1, int32_t a2, int32_t * a3) { // 0x8524 *a3 = 0; return a2 ^ a1; } // Address range: 0x8534 - 0x8563 int32_t script_transform_xor(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g21; int32_t result = script_transform_basic((char)g127, g128, g132); // 0x8554 g127 = result; g130 = v1; return result; } // Address range: 0x8564 - 0x8573 int32_t function_shl(int32_t a1, uint32_t a2, int32_t * a3) { uint32_t v1 = a2 % 256; // 0x8568 *a3 = 0; return v1 == 0 ? a1 : v1 < 32 ? a1 << v1 : 0; } // Address range: 0x8574 - 0x85a3 int32_t script_transform_shl(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g41; int32_t result = script_transform_basic((char)g127, g128, g132); // 0x8594 g127 = result; g130 = v1; return result; } // Address range: 0x85a4 - 0x85b3 int32_t function_shr(uint32_t a1, uint32_t a2, int32_t * a3) { uint32_t v1 = a2 % 256; // 0x85a8 *a3 = 0; return a1 >> (v1 > 32 ? 32 : v1); } // Address range: 0x85b4 - 0x85e3 int32_t script_transform_shr(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g23; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x85d4 g127 = result; g130 = v1; return result; } // Address range: 0x85e4 - 0x85f3 int32_t function_asr(int32_t a1, uint32_t a2, int32_t * a3) { uint32_t v1 = a2 % 256; // 0x85e8 *a3 = 0; return a1 >> (v1 == 0 ? 0 : v1 > 31 ? 31 : v1); } // Address range: 0x85f4 - 0x8623 int32_t script_transform_asr(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g27; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x8614 g127 = result; g130 = v1; return result; } // Address range: 0x8624 - 0x8637 int32_t function_forceminu(uint32_t a1, uint32_t a2, int32_t * a3) { int32_t result = a1; // R0 if (a1 < a2) { // if_862c_0_true result = a2; // branch -> after_if_862c_0 } // after_if_862c_0 *a3 = 0; return result; } // Address range: 0x8638 - 0x8667 int32_t script_transform_forceminu(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g25; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x8658 g127 = result; g130 = v1; return result; } // Address range: 0x8668 - 0x867b int32_t function_forcemaxu(uint32_t a1, uint32_t a2, int32_t * a3) { int32_t result = a1; // R0 if (a1 > a2) { // if_8670_0_true result = a2; // branch -> after_if_8670_0 } // after_if_8670_0 *a3 = 0; return result; } // Address range: 0x867c - 0x86ab int32_t script_transform_forcemaxu(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g35; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x869c g127 = result; g130 = v1; return result; } // Address range: 0x86ac - 0x86bf int32_t function_forcemin(int32_t a1, int32_t a2, int32_t * a3) { int32_t result = a1; // R0 if (a1 < a2) { // if_86b4_0_true result = a2; // branch -> after_if_86b4_0 } // after_if_86b4_0 *a3 = 0; return result; } // Address range: 0x86c0 - 0x86ef int32_t script_transform_forcemin(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g42; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x86e0 g127 = result; g130 = v1; return result; } // Address range: 0x86f0 - 0x8703 int32_t function_forcemax(int32_t a1, int32_t a2, int32_t * a3) { int32_t result = a1; // R0 if (a1 > a2) { // if_86f8_0_true result = a2; // branch -> after_if_86f8_0 } // after_if_86f8_0 *a3 = 0; return result; } // Address range: 0x8704 - 0x8733 int32_t script_transform_forcemax(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g32; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x8724 g127 = result; g130 = v1; return result; } // Address range: 0x8734 - 0x8753 int32_t function_compare(int32_t a1, int32_t a2, int32_t * a3) { // 0x8734 *a3 = 0; int32_t v1 = a1 < a2 ? -1 : 1; return a1 == a2 ? v1 & -0x10000 : v1; } // Address range: 0x8754 - 0x8783 int32_t script_transform_compare(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g47; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x8774 g127 = result; g130 = v1; return result; } // Address range: 0x8784 - 0x87a3 int32_t function_compareu(uint32_t a1, uint32_t a2, int32_t * a3) { // 0x8784 *a3 = 0; int32_t v1 = a1 < a2 ? -1 : 1; return a1 == a2 ? v1 & -0x10000 : v1; } // Address range: 0x87a4 - 0x87d3 int32_t script_transform_compareu(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g20; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x87c4 g127 = result; g130 = v1; return result; } // Address range: 0x87d4 - 0x880b int32_t function_checkminu(uint32_t a1, uint32_t a2, int32_t * a3) { int32_t v1 = (int32_t)a3; int32_t v2 = g135; // 0x87d4 int32_t v3 = g130; // bp-8 g130 = &v3; g135 = a1; g134 = v1; int32_t v4; // 0x87fc int32_t v5; // 0x87fc if (a1 >= a2) { // 0x87f0 g127 = (int32_t)"value not in required range"; v5 = duplicate_string(); v4 = g134; // branch -> 0x87fc } else { v5 = 0; v4 = v1; } // 0x87fc *(int32_t *)v4 = v5; int32_t result = g135; // 0x8800 g135 = v2; return result; } // Address range: 0x880c - 0x883b int32_t script_transform_checkminu(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g19; int32_t result = script_transform_basic((char)g127, g128, g132); // 0x882c g127 = result; g130 = v1; return result; } // Address range: 0x883c - 0x8873 int32_t function_checkmaxu(uint32_t a1, uint32_t a2, int32_t * a3) { int32_t v1 = (int32_t)a3; int32_t v2 = g135; // 0x883c int32_t v3 = g130; // bp-8 g130 = &v3; g135 = a1; g134 = v1; int32_t v4 = 0; // 0x8864 if (a1 > a2) { // 0x8858 g127 = (int32_t)"value not in required range"; v4 = duplicate_string(); v1 = g134; // branch -> 0x8864 } // 0x8864 *(int32_t *)v1 = v4; int32_t result = g135; // 0x8868 g135 = v2; return result; } // Address range: 0x8874 - 0x88a3 int32_t script_transform_checkmaxu(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g29; int32_t result = script_transform_basic((char)g127, g128, g132); // 0x8894 g127 = result; g130 = v1; return result; } // Address range: 0x88a4 - 0x88db int32_t function_checkmin(int32_t a1, int32_t a2, int32_t * a3) { int32_t v1 = (int32_t)a3; int32_t v2 = g135; // 0x88a4 int32_t v3 = g130; // bp-8 g130 = &v3; g135 = a1; g134 = v1; int32_t v4 = 0; // 0x88cc if (a1 < a2) { // 0x88c0 g127 = (int32_t)"value not in required range"; v4 = duplicate_string(); v1 = g134; // branch -> 0x88cc } // 0x88cc *(int32_t *)v1 = v4; int32_t result = g135; // 0x88d0 g135 = v2; return result; } // Address range: 0x88dc - 0x890b int32_t script_transform_checkmin(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g22; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x88fc g127 = result; g130 = v1; return result; } // Address range: 0x890c - 0x8943 int32_t function_checkmax(int32_t a1, int32_t a2, int32_t * a3, int32_t a4) { int32_t v1 = (int32_t)a3; int32_t v2 = g135; // 0x890c int32_t v3 = g130; // bp-8 g130 = &v3; g135 = a1; g134 = v1; int32_t v4 = 0; // 0x8934 if (a1 > a2) { // 0x8928 g127 = (int32_t)"value not in required range"; v4 = duplicate_string(); v1 = g134; // branch -> 0x8934 } // 0x8934 *(int32_t *)v1 = v4; int32_t result = g135; // 0x8938 g135 = v2; return result; } // Address range: 0x8944 - 0x8973 int32_t script_transform_checkmax(int32_t a1, int32_t a2) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g16; int32_t result = script_transform_basic((char)a1, a2, g132); // 0x8964 g127 = result; g130 = v1; return result; } // Address range: 0x8974 - 0x89cf int32_t function_checkptr(int32_t a1, int32_t a2, int32_t * a3, int32_t a4) { int32_t v1 = (int32_t)a3; int32_t v2 = g135; // 0x8974 int32_t v3 = g130; // bp-8 g130 = &v3; g135 = a1; g134 = v1; int32_t result; // 0x89c4 if (a2 == a1) { // after_if_898c_0.thread if ((a2 || a1) == 0) { // 0x89c0 *(int32_t *)v1 = 0; result = g135; g135 = v2; return result; } } // 0x899c int32_t v4; // 0x89c0 int32_t v5; // 0x89c0 if ((a1 & -0x2000000) != 0x8000000) { // 0x89b4 g127 = (int32_t)"value not in required range"; v5 = duplicate_string(); v4 = g134; // branch -> 0x89c0 } else { v5 = 0; v4 = v1; } // 0x89c0 *(int32_t *)v4 = v5; result = g135; g135 = v2; return result; } // Address range: 0x89d0 - 0x89ff int32_t script_transform_checkptr(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g8; int32_t result = script_transform_basic((char)g127, g128, g132); // 0x89f0 g127 = result; g130 = v1; return result; } // Address range: 0x8a00 - 0x8a37 int32_t function_require(int32_t a1, int32_t a2, int32_t * a3, int32_t a4, int32_t a5) { int32_t v1 = (int32_t)a3; int32_t v2 = g135; // 0x8a00 int32_t v3 = g130; // bp-8 g130 = &v3; g135 = a1; g134 = v1; int32_t v4; // 0x8a28 int32_t v5; // 0x8a28 if (a1 != a2) { // 0x8a1c g127 = (int32_t)"value not in required range"; v5 = duplicate_string(); v4 = g134; // branch -> 0x8a28 } else { v5 = 0; v4 = v1; } // 0x8a28 *(int32_t *)v4 = v5; int32_t result = g135; // 0x8a2c g135 = v2; return result; } // Address range: 0x8a38 - 0x8a67 int32_t script_transform_require(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g28; int32_t result = script_transform_basic((char)g127, g128, g132); // 0x8a58 g127 = result; g130 = v1; return result; } // Address range: 0x8a68 - 0x8a9f int32_t function_requirenot(int32_t a1, int32_t a2, int32_t * a3) { int32_t v1 = (int32_t)a3; int32_t v2 = g135; // 0x8a68 int32_t v3 = g130; // bp-8 g130 = &v3; g135 = a1; g134 = v1; int32_t v4 = 0; // 0x8a90 if (a1 == a2) { // 0x8a84 g127 = (int32_t)"value not in required range"; v4 = duplicate_string(); v1 = g134; // branch -> 0x8a90 } // 0x8a90 *(int32_t *)v1 = v4; int32_t result = g135; // 0x8a94 g135 = v2; return result; } // Address range: 0x8aa0 - 0x8acf int32_t script_transform_requirenot(int32_t a1, int32_t a2, int32_t a3) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g126 = v2; g131 = g26; int32_t result = script_transform_basic((char)a1, a2, a3); // 0x8ac0 g127 = result; g130 = v1; return result; } // Address range: 0x8ad0 - 0x8b77 int32_t script_transform_byte_count(uint32_t a1, uint32_t a2, int32_t a3, uint32_t a4, char * a5) { int32_t v1 = g134; // bp-16 int32_t v2 = g135; // 0x8ad0 int32_t v3 = g130; // bp-8 int32_t v4 = (int32_t)a5; // R12 *a5 = 3; *(int32_t *)(v4 + 8) = 0; if (a4 >= 256) { // 0x8afc g127 = (int32_t)"parameter is not a byte"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x8b0c if (a1 % 256 != 0) { // 0x8b14 g127 = (int32_t)"type mismatch"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x8b24 if (a2 == 0) { // 0x8b64 *(int32_t *)(v4 + 4) = 0; g135 = v2; return 0; } int32_t v5 = 0; // 0x8b58 // branch -> 0x8b30 int32_t v6; // 0x8b58 while (true) { // 0x8b30 int32_t v7; g135 = v7 == 0; if (v7 == 0 == (int32_t)*(char *)(v5 + a3) == a4 % 256) { // 0x8b64 *(int32_t *)(v4 + 4) = v5; g135 = v2; return 0; } // 0x8b58 v6 = v5 + 1; if (v6 >= a2) { // break -> 0x8b64 break; } v5 = v6; // continue -> 0x8b30 } // 0x8b64 *(int32_t *)(v4 + 4) = v6; g135 = v2; return 0; } // Address range: 0x8b78 - 0x8c03 int32_t script_transform_byteswhile(uint32_t a1, uint32_t a2, int32_t a3) { int32_t v1 = g134; // bp-16 int32_t v2 = g130; // bp-8 int32_t v3 = g126; // 0x8b78 int32_t v4; *(char *)v4 = 3; *(int32_t *)(v4 + 8) = 0; uint32_t v5 = g133 + 128; // 0x8b94 g126 = v5; g1 = v5 > 383; g3 = v5 == 384; if (v5 >= 384) { // 0x8ba0 g127 = (int32_t)"parameter is not a byte"; g134 = v1; g130 = v2; g126 = v3; int32_t result = duplicate_string(); // 0x8bac g127 = result; return result; } // 0x8bb0 g3 = a1 % 256 == 0; if (a1 % 256 != 0) { // 0x8bb8 g127 = (int32_t)"type mismatch"; g134 = v1; g130 = v2; g126 = v3; int32_t result2 = duplicate_string(); // 0x8bc4 g127 = result2; return result2; } // 0x8bc8 g1 = true; g3 = a2 == 0; if (a2 == 0) { // 0x8bf0 *(int32_t *)(v4 + 4) = 0; g127 = 0; g134 = v1; g130 = v2; return 0; } uint32_t v6 = g133 % 256; // 0x8bd8 int32_t v7 = 0; // 0x8be4 // branch -> 0x8bd4 int32_t v8; // 0x8be4 while (true) { int32_t v9 = (int32_t)*(char *)(v7 + a3); // 0x8bd4 g126 = v9; g1 = v9 >= v6; g3 = v9 == v6; int32_t v10 = v7; // 0x8bf0 if (v9 == v6) { // 0x8be4 v8 = v7 + 1; g1 = v8 >= a2; g3 = v8 == a2; if (v8 >= a2) { // break -> 0x8bf0 break; } v7 = v8; // continue -> 0x8bd4 continue; } // 0x8bf0 *(int32_t *)(v4 + 4) = v10; g127 = 0; g134 = v1; g130 = v2; return 0; } // 0x8bf0 *(int32_t *)(v4 + 4) = v8; g127 = 0; g134 = v1; g130 = v2; return 0; } // Address range: 0x8c04 - 0x8c8f int32_t script_transform_bytesuntil(uint32_t a1, uint32_t a2, int32_t a3, uint32_t a4) { int32_t v1 = g134; // bp-16 int32_t v2 = g130; // bp-8 int32_t v3; *(char *)v3 = 3; *(int32_t *)(v3 + 8) = 0; uint32_t v4 = a4 + 128; // 0x8c20 g3 = v4 == 384; if (v4 >= 384) { // 0x8c2c g127 = (int32_t)"parameter is not a byte"; g134 = v1; g130 = v2; int32_t result = duplicate_string(); // 0x8c38 g127 = result; return result; } // 0x8c3c g3 = a1 % 256 == 0; if (a1 % 256 != 0) { // 0x8c44 g127 = (int32_t)"type mismatch"; g134 = v1; g130 = v2; int32_t result2 = duplicate_string(); // 0x8c50 g127 = result2; return result2; } // 0x8c54 g3 = a2 == 0; if (a2 == 0) { // 0x8c7c *(int32_t *)(v3 + 4) = 0; g127 = 0; g134 = v1; g130 = v2; return 0; } uint32_t v5 = a4 % 256; // 0x8c64 int32_t v6 = 0; // 0x8c70 // branch -> 0x8c60 int32_t v7; // 0x8c70 while (true) { char v8 = *(char *)(v6 + a3); // 0x8c60 g3 = (int32_t)v8 == v5; if ((int32_t)v8 == v5) { // 0x8c7c *(int32_t *)(v3 + 4) = v6; g127 = 0; g134 = v1; g130 = v2; return 0; } // 0x8c70 v7 = v6 + 1; g3 = v7 == a2; if (v7 >= a2) { // break -> 0x8c7c break; } v6 = v7; // continue -> 0x8c60 } // 0x8c7c *(int32_t *)(v3 + 4) = v7; g127 = 0; g134 = v1; g130 = v2; return 0; } // Address range: 0x8c90 - 0x8d97 int32_t execute_transforms(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5) { int32_t v1; char * v2 = (char *)v1; // bp-52 int32_t v3 = g134; // 0x8c90 int32_t v4 = g135; // 0x8c90 int32_t v5 = g136; // 0x8c90 int32_t v6 = g137; // 0x8c90 int32_t v7 = g138; // 0x8c90 int32_t v8 = g139; // 0x8c90 int32_t v9 = g129; // 0x8c90 int32_t v10 = g130; // bp-8 g130 = &v10; g138 = a4; int32_t v11; copy_script_value((char *)&v11, (char)a1, a2, (char *)a3); int32_t v12; g129 = v12; g1 = true; g2 = a5 < 0; g3 = a5 == 0; int32_t v13; *(int32_t *)(v12 + 8) = v13; if (a5 == 0) { // 0x8d88 g127 = 0; g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } // 0x8cd4 g135 = 0; int32_t v14 = 0; // 0x8ce0 // branch -> 0x8cd8 char * mem; // 0x8d44 int32_t chars_printed; int32_t result; int32_t v15; // 0x8d18 while (true) { int32_t v16 = g129; // 0x8cdc int32_t v17 = *(int32_t *)v16; // 0x8cdc g137 = v17; int32_t v18 = 8 * v14 + g138; // 0x8ce0 int32_t v19 = *(int32_t *)v18; // 0x8ce0 g131 = v19; int32_t v20 = *(int32_t *)(v16 + 4); // 0x8ce4 g134 = v20; int32_t v21 = *(int32_t *)(v16 + 8); // 0x8ce4 g136 = v21; int32_t v22 = *(int32_t *)(v18 + 4); // 0x8ce8 g133 = v22; g127 = v17; g128 = v20; g132 = v21; g126 = 0x8d00; ((int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))v19)(v17, v20, v21, v22, v16); g139 = g127; g132 = g136; destroy_script_value(g137); v15 = g139; int32_t v23 = g135 + 1; // 0x8d20 g135 = v23; int32_t v24 = 0; // 0x8d30 if (v15 == 0) { // if_8d24_0_true v24 = 1; // branch -> after_if_8d24_0 } // after_if_8d24_0 if (v23 >= a5) { // 0x8d30 g1 = true; g2 = false; g3 = v24 == 0; if (v24 == 0) { // break -> 0x8d38 break; } v14 = v23; // continue -> 0x8cd8 continue; } // 0x8d38 if (v15 == 0) { // 0x8d88 g127 = 0; g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } // 0x8d40 mem = malloc(32); v2 = mem; chars_printed = sprintf(mem, "transform %u: ", g135); concatenate((int32_t *)&v2, &chars_printed, (char *)g139, 0); free((char *)g139); result = (int32_t)v2; g127 = result; g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return result; } // 0x8d38 if (v15 == 0) { // 0x8d88 g127 = 0; g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return 0; } // 0x8d40 mem = malloc(32); v2 = mem; chars_printed = sprintf(mem, "transform %u: ", g135); concatenate((int32_t *)&v2, &chars_printed, (char *)g139, 0); free((char *)g139); result = (int32_t)v2; g127 = result; g134 = v3; g135 = v4; g136 = v5; g137 = v6; g138 = v7; g139 = v8; g129 = v9; g130 = v10; return result; } // Address range: 0x8d98 - 0x8db7 int32_t enforce_value_size(int32_t a1, uint32_t a2) { // 0x8d98 g128 = a2; g1 = a2 > 1; g2 = a2 < 2; g3 = a2 == 2; if (a2 == 2) { int32_t result = 0x10000 * a1 / 0x10000; // 0x8db0 g127 = result; return result; } // 0x8da0 g1 = a2 != 0; g2 = a2 < 1; g3 = a2 == 1; int32_t result2 = 0x1000000 * a1 / 0x1000000; // 0x8da4 g127 = result2; return result2; } // Address range: 0x8db8 - 0x8fc7 int32_t script_transform_basic(char a1, int32_t a2, int32_t a3) { g132 = a3; int32_t v1 = g134; // 0x8db8 int32_t v2 = g135; // 0x8db8 int32_t v3 = g136; // 0x8db8 int32_t v4 = g137; // 0x8db8 int32_t v5 = g138; // 0x8db8 int32_t v6 = g139; // 0x8db8 int32_t v7 = g129; // 0x8db8 int32_t v8 = g130; // bp-8 g130 = &v8; int32_t v9; g139 = v9; g137 = a1; g135 = g133; g136 = a3; *(char *)v9 = a1; g134 = a2; *(int32_t *)(g139 + 8) = 0; uint32_t v10 = g137 % 256; // 0x8dec uint32_t v11 = v10 - 1; // 0x8dec g1 = v11 > 5; g2 = v10 < 7; g3 = v11 == 6; if (v11 > 6) { // 0x8e50 g127 = (int32_t)"type mismatch"; g126 = 0x8e5c; int32_t result = duplicate_string(); // 0x8e58 g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g139 = v6; g129 = v7; return result; } // 0x8df8 g128 = &g62; int32_t v12; g129 = v12; int32_t v13 = *(int32_t *)(4 * v11 + (int32_t)&g62); // 0x8e04 g127 = v13; ((int32_t (*)(int32_t, int32_t))(v13 + (int32_t)&g62))(v13, (int32_t)&g62); if (g3) { // after_if_8e20_0 abort(); // UNREACHABLE } // after_if_8e24_0 int32_t result2; int32_t v14 = &result2; // 0x8e28_0 g132 = v14; int32_t v15 = g134; // 0x8e2c g127 = v15; int32_t v16 = g135; // 0x8e30 g128 = v16; g126 = 0x8e38; ((int32_t (*)(int32_t, int32_t, int32_t))g129)(v15, v16, v14); uint32_t v17 = g137 % 256; // 0x8e38 g128 = v17; g1 = v17 > 1; g2 = v17 < 2; g3 = v17 == 2; int32_t v18; if (v17 == 2) { // 0x8f9c v18 = 0x10000 * g127 / 0x10000; // branch -> 0x8fa0 } else { // 0x8e44 g1 = v17 != 0; g2 = v17 == 0; g3 = v17 == 1; v18 = 0x1000000 * g127 / 0x1000000; // branch -> 0x8fa0 } // 0x8fa0 *(int32_t *)(g139 + 4) = v18; g127 = result2; int32_t v19 = g130; // 0x8fbc g134 = *(int32_t *)(v19 - 28); g135 = *(int32_t *)(v19 - 24); g136 = *(int32_t *)(v19 - 20); g137 = *(int32_t *)(v19 - 16); g138 = *(int32_t *)(v19 - 12); g139 = *(int32_t *)(v19 - 8); g129 = *(int32_t *)(v19 - 4); g130 = *(int32_t *)v19; ((int32_t (*)(int32_t))*(int32_t *)(v19 + 4))(result2); if (g3) { // if_8fc4_0_true g134 = g134 / 256 & result2; // branch -> after_if_8fc4_0 } // after_if_8fc4_0 return result2; } // Address range: 0x8fc8 - 0x8fdb int32_t read_16(char * a1) { char v1 = *(char *)((int32_t)a1 + 1); // 0x8fcc return 256 * (int32_t)v1 | (int32_t)*a1; } // Address range: 0x8fdc - 0x8ffb int32_t read_32(char * a1) { int32_t v1 = (int32_t)a1; char v2 = *(char *)(v1 + 1); // 0x8fdc char v3 = *a1; // 0x8fe0 char v4 = *(char *)(v1 + 2); // 0x8fe4 char v5 = *(char *)(v1 + 3); // 0x8fe8 return (int32_t)v3 | 256 * (int32_t)v2 | 0x10000 * (int32_t)v4 | 0x1000000 * (int32_t)v5; } // Address range: 0x8ffc - 0x90e3 int32_t script_transform_skip(unsigned char a1, int32_t a2, int32_t a3, int32_t a4) { int32_t v1 = g134; // bp-32 int32_t v2 = g135; // 0x8ffc int32_t v3 = g138; // 0x8ffc int32_t v4 = g130; // bp-8 int32_t v5 = g126; // 0x8ffc g135 = a3; int32_t v6 = a2 - a4; // R2 g133 = 0; int32_t v7; *(char *)v7 = a1; *(int32_t *)(v7 + 4) = v6; *(int32_t *)(v7 + 8) = 0; if (a4 < 0) { // 0x9048 g127 = (int32_t)"negative skip count"; g134 = v1; g135 = v2; g138 = v3; g130 = v4; g126 = v5; return duplicate_string(); } int32_t v8 = a1; int32_t v9 = v8 - 1; // 0x902c g133 = v9; if (v9 <= 2) { // 0x9038 g127 = (int32_t)"type mismatch"; g134 = v1; g135 = v2; g138 = v3; g130 = v4; g126 = v5; return duplicate_string(); } // 0x9058 if (a4 > a2) { // 0x9060 g127 = (int32_t)"skip count is greater than length"; g134 = v1; g135 = v2; g138 = v3; g130 = v4; g126 = v5; return duplicate_string(); } // 0x9070 if (a1 < 8) { // 0x908c g127 = (int32_t)"internal error"; g134 = v1; g135 = v2; g138 = v3; g130 = v4; g126 = v5; return duplicate_string(); } // 0x907c g133 = 241; int32_t v10 = *(int32_t *)(0x1000000 * v8 / 0x400000 + (int32_t)&g121); // 0x90a8 int32_t size = v6 * v10; // 0x90ac g138 = size; char * mem = malloc(size); // 0x90b4 *(int32_t *)(v7 + 8) = (int32_t)mem; __aeabi_memcpy(mem, (char *)(g135 + a4 * v10), g138); g134 = v1; g135 = v2; g138 = v3; g130 = v4; return 0; } // Address range: 0x90e4 - 0x91ab int32_t script_transform_item(uint32_t a1, uint32_t a2, int32_t a3, uint32_t a4, char * a5) { int32_t v1 = g130; // bp-8 int32_t v2 = (int32_t)a5; // R12 *a5 = (char)(a1 + 252); *(int32_t *)(v2 + 8) = 0; if (a4 < 0) { // 0x9124 g127 = (int32_t)"negative index"; g130 = v1; return duplicate_string(); } uint32_t v3 = a1 % 256; // 0x9108 if (v3 <= 4) { // 0x9114 g127 = (int32_t)"type mismatch"; g130 = v1; return duplicate_string(); } // 0x9134 if (a2 <= a4) { // 0x9160 g127 = (int32_t)"index out of bounds"; g130 = v1; return duplicate_string(); } // 0x913c if (v3 == 7) { // 0x9170 // branch -> 0x9180 // 0x9180 *(int32_t *)(v2 + 4) = *(int32_t *)(4 * a4 + a3); return 0; } // 0x9144 int32_t v4; // 0x9180 if (v3 == 6) { // 0x9178 v4 = (int32_t)*(int16_t *)(2 * a4 + a3); // branch -> 0x9180 } else { // 0x914c if (v3 != 5) { // 0x918c g127 = (int32_t)"internal error"; g130 = v1; return duplicate_string(); } // 0x9154 v4 = (int32_t)*(char *)(a4 + a3); // branch -> 0x9180 } // 0x9180 *(int32_t *)(v2 + 4) = v4; return 0; } // Address range: 0x91ac - 0x928f int32_t script_transform_copy(unsigned char a1, int32_t a2, char * a3, int32_t a4) { // 0x91ac g133 = a4; int32_t v1 = g134; // bp-24 int32_t v2 = g135; // 0x91ac int32_t v3 = g130; // bp-8 int32_t v4 = g126; // 0x91ac int32_t v5 = (int32_t)a3; // R4 g132 = 0; int32_t v6; *(char *)v6 = a1; *(int32_t *)(v6 + 4) = a4; *(int32_t *)(v6 + 8) = 0; if (a4 < 0) { // 0x91f4 g127 = (int32_t)"negative length"; g134 = v1; g135 = v2; g130 = v3; g126 = v4; return duplicate_string(); } int32_t v7 = a1; int32_t v8 = v7 - 1; // 0x91d8 g132 = v8; if (v8 <= 2) { // 0x91e4 g127 = (int32_t)"type mismatch"; g134 = v1; g135 = v2; g130 = v3; g126 = v4; return duplicate_string(); } // 0x9204 if (a2 < a4) { // 0x920c g127 = (int32_t)"length is greater than data size"; g134 = v1; g135 = v2; g130 = v3; g126 = v4; return duplicate_string(); } // 0x921c if (a1 < 8) { // 0x9238 g127 = (int32_t)"internal error"; g134 = v1; g135 = v2; g130 = v3; g126 = v4; return duplicate_string(); } // 0x9228 g135 = 1; int32_t v9 = *(int32_t *)(0x1000000 * v7 / 0x400000 + (int32_t)&g121); // 0x9254 int32_t size = v9 * a4; // 0x9258 g135 = size; char * mem = malloc(size); // 0x9260 g128 = v5; int32_t v10 = g135; // 0x9268 g132 = v10; *(int32_t *)(v6 + 8) = (int32_t)mem; __aeabi_memcpy(mem, (char *)v5, v10); g134 = v1; g135 = v2; g130 = v3; return 0; } // Address range: 0x9290 - 0x956f int32_t script_transform_count_values(int32_t a1, int32_t a2, int32_t * a3, int32_t a4) { // 0x9290 g128 = a2; int32_t v1 = (int32_t)a3; g132 = v1; g133 = a4; int32_t v2 = g134; // 0x9290 int32_t v3 = g135; // 0x9290 int32_t v4 = g136; // 0x9290 int32_t v5 = g137; // 0x9290 int32_t v6 = g138; // 0x9290 int32_t v7 = g129; // 0x9290 int32_t v8 = g130; // bp-8 int32_t v9 = g126; // 0x9290 g130 = &v8; int32_t v10; g129 = v10; g137 = a1; int32_t v11; g138 = v11; g135 = a4; g139 = v1; *(char *)v10 = 3; *(int32_t *)(g129 + 8) = 0; uint32_t v12 = g137 % 256 - 1; // 0x92c4 g134 = a2; g3 = v12 == 2; if (v12 <= 2) { // 0x92d4 g127 = (int32_t)"type mismatch"; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; g130 = v8; g126 = v9; g127 = duplicate_string(); return g131; } int32_t size = 4 * a2; // 0x92e8 g136 = size; g126 = (int32_t)malloc(size); uint32_t v13 = g137 % 256; // 0x92f8 g1 = v13 > 6; g2 = v13 < 7; g3 = v13 == 7; int32_t v14; // R6 uint32_t v15; // 0x948c int32_t v16; // 0x94d0 int32_t v17; // 0x9514 int32_t v18; // 0x951432 int32_t v19; // 0x9518 int32_t v20; // 0x9528 int32_t v21; // 0x9540 int32_t v22; // 0x950c int32_t v23; // 0x9550 int32_t v24; // 0x94c8 int32_t v25; // 0x9504 int32_t v26; // 0x950c int32_t v27; // 0x9508 int32_t v28; // 0x950c int32_t v29; // 0x9550 if (v13 <= 7) { // 0x9304 g128 = &g63; int32_t v30 = *(int32_t *)(4 * v13 + (int32_t)&g63); // 0x930c g127 = v30; ((int32_t (*)(int32_t, int32_t))(v30 + (int32_t)&g63))(v30, (int32_t)&g63); if (g3) { // if_9330_0_true // branch -> after_if_9330_0 } // after_if_9330_0 if (g134 != 0) { // 0x933c int32_t v31; // 0x93b8 int32_t v32; // 0x93b4 int32_t v33; // 0x93bc int32_t v34; // 0x93b0 int32_t v35; // 0x9558 int32_t v36; // 0x955c int32_t v37; // 0x93b4 if (g134 < 4) { // 0x933c v34 = 0; // branch -> 0x93a8 } else { // 0x9348 if (g126 < g139 + g134) { // after_if_9364_0 if (g139 < g126 + 4 * g134) { v34 = 0; // 0x93a8 v33 = 4 * v34 + g126; v31 = g134 - v34; v32 = v34 + g139; // branch -> 0x93b4 while (true) { // 0x93b4 g128 = v32 + 1; v37 = (int32_t)*(char *)v32; g133 = v37; g132 = v33 + 4; *(int32_t *)v33 = v37; if (v31 == 1) { // 0x93c4 // branch -> 0x9488 // 0x9488 v14 = 0; v15 = g134; int32_t v38; // 0x9520 if (v15 == 0) { // 0x9488 v38 = g126; // branch -> 0x9520 } else { // 0x9494 if (v15 < 4) { // 0x94a4 v24 = g126; g132 = v24; v16 = &g65; // branch -> 0x94cc while (v16 != 4) { // 0x94cc v16 -= 4; // continue -> 0x94cc } // 0x94e4 g128 = &g65; if (v15 == (int32_t)&g65) { // 0x9520 free((char *)v24); v20 = g138; g3 = v20 == 0; if (v20 == 0) { // 0x9520 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v14; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9530 if (v20 == 2) { // 0x954c v23 = g134; v29 = v14; g3 = v29 == v23; if (v29 == v23) { // if_9554_0_true // branch -> after_if_9554_0 // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = 1; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = 0; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9538 g3 = v20 == 1; if (v20 != 1) { // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9540 v21 = v14; g3 = v21 == 0; if (v21 != 0) { // if_9544_0_true v36 = v21 & -0x10000 | 1; // branch -> 0x955c } else { v36 = 0; } // 0x955c *(int32_t *)(g129 + 4) = v36; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } v27 = v24; v25 = &g65; } else { // 0x949c v27 = g126; v25 = 0; // branch -> 0x9504 } // 0x9504 v19 = v15 - v25; v17 = 0; v22 = 4 * v25 + v27; // branch -> 0x950c while (true) { // 0x950c v26 = v22 + 4; g128 = v26; v28 = *(int32_t *)v22; g132 = v28; v18 = v17; if (v28 == g135) { lab_if_9514_0_true_3:; int32_t v39 = v17 + 1; // 0x9514 v14 = v39; v18 = v39; // branch -> after_if_9514_0 } lab_after_if_9514_0_3: // after_if_9514_0 if (v19 == 1) { // break -> 0x9520 break; } v19--; v17 = v18; v22 = v26; // continue -> 0x950c } // 0x9520 v38 = v27; // branch -> 0x9520 } // 0x9520 free((char *)v38); v20 = g138; g3 = v20 == 0; if (v20 == 0) { // 0x9520 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v14; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9530 if (v20 == 2) { // 0x954c v23 = g134; v29 = v14; g3 = v29 == v23; if (v29 == v23) { // if_9554_0_true // branch -> after_if_9554_0 // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = 1; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = 0; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9538 g3 = v20 == 1; if (v20 != 1) { // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9540 v21 = v14; g3 = v21 == 0; if (v21 != 0) { // if_9544_0_true v36 = v21 & -0x10000 | 1; // branch -> 0x955c } else { v36 = 0; } // 0x955c *(int32_t *)(g129 + 4) = v36; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } lab_0x93b4: // 0x93b4 v33 = g132; v31--; v32 = g128; // branch -> 0x93b4 } } } // 0x936c g133 = g126; int32_t v40 = g139; // 0x937c int32_t v41 = &g64; // 0x9380 int32_t v42 = v41 - 4; // 0x9380 g132 = v42; // branch -> 0x937c while (v41 != 4) { // 0x937c v40 += 4; v41 = v42; v42 = v41 - 4; g132 = v42; // continue -> 0x937c } // 0x939c g128 = &g64; if (g134 == (int32_t)&g64) { // 0x93c4 // branch -> 0x9488 // 0x9488 v14 = 0; v15 = g134; if (v15 == 0) { // 0x9488 // branch -> 0x9520 } else { // 0x9494 if (v15 < 4) { // 0x94a4 v24 = g126; g132 = v24; v16 = &g65; // branch -> 0x94cc while (v16 != 4) { // 0x94cc v16 -= 4; // continue -> 0x94cc } // 0x94e4 g128 = &g65; if (v15 == (int32_t)&g65) { // 0x9520 free((char *)v24); v20 = g138; g3 = v20 == 0; if (v20 == 0) { // 0x9520 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v14; // branch -> 0x9560 } else { // 0x9530 if (v20 != 2) { // 0x9538 g3 = v20 == 1; if (v20 == 1) { // 0x9540 v21 = v14; g3 = v21 == 0; if (v21 != 0) { // if_9544_0_true v36 = v21 & -0x10000 | 1; // branch -> 0x955c } else { v36 = 0; } // 0x955c *(int32_t *)(g129 + 4) = v36; // branch -> 0x9560 } // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x954c v23 = g134; v29 = v14; g3 = v29 == v23; v35 = 0; if (v29 == v23) { // if_9554_0_true v35 = 1; // branch -> after_if_9554_0 } // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v35; // branch -> 0x9560 } // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } v27 = v24; v25 = &g65; } else { // 0x949c v27 = g126; v25 = 0; // branch -> 0x9504 } // 0x9504 v19 = v15 - v25; v17 = 0; v22 = 4 * v25 + v27; // branch -> 0x950c while (true) { // 0x950c v26 = v22 + 4; g128 = v26; v28 = *(int32_t *)v22; g132 = v28; if (v28 == g135) { goto lab_if_9514_0_true_3; } v18 = v17; goto lab_after_if_9514_0_3; } } // 0x9520 free((char *)g126); v20 = g138; g3 = v20 == 0; if (v20 == 0) { // 0x9520 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v14; // branch -> 0x9560 } else { // 0x9530 if (v20 != 2) { // 0x9538 g3 = v20 == 1; if (v20 == 1) { // 0x9540 v21 = v14; g3 = v21 == 0; if (v21 != 0) { // if_9544_0_true v36 = v21 & -0x10000 | 1; // branch -> 0x955c } else { v36 = 0; } // 0x955c *(int32_t *)(g129 + 4) = v36; // branch -> 0x9560 } // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x954c v23 = g134; v29 = v14; g3 = v29 == v23; v35 = 0; if (v29 == v23) { // if_9554_0_true v35 = 1; // branch -> after_if_9554_0 } // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v35; // branch -> 0x9560 } // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } v34 = &g64; } // 0x93a8 v33 = 4 * v34 + g126; v31 = g134 - v34; v32 = v34 + g139; // branch -> 0x93b4 while (true) { // 0x93b4 g128 = v32 + 1; v37 = (int32_t)*(char *)v32; g133 = v37; g132 = v33 + 4; *(int32_t *)v33 = v37; if (v31 != 1) { goto lab_0x93b4; } // 0x93c4 // branch -> 0x9488 // 0x9488 v14 = 0; v15 = g134; if (v15 == 0) { // 0x9488 // branch -> 0x9520 } else { // 0x9494 if (v15 < 4) { // 0x94a4 v24 = g126; g132 = v24; v16 = &g65; // branch -> 0x94cc while (v16 != 4) { // 0x94cc v16 -= 4; // continue -> 0x94cc } // 0x94e4 g128 = &g65; if (v15 == (int32_t)&g65) { // 0x9520 free((char *)v24); v20 = g138; g3 = v20 == 0; if (v20 == 0) { // 0x9520 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v14; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9530 if (v20 == 2) { // 0x954c v23 = g134; v29 = v14; g3 = v29 == v23; if (v29 == v23) { // if_9554_0_true // branch -> after_if_9554_0 // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = 1; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = 0; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9538 g3 = v20 == 1; if (v20 != 1) { // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } // 0x9540 v21 = v14; g3 = v21 == 0; if (v21 != 0) { // if_9544_0_true v36 = v21 & -0x10000 | 1; // branch -> 0x955c } else { v36 = 0; } // 0x955c *(int32_t *)(g129 + 4) = v36; // branch -> 0x9560 // 0x9560 g127 = 0; g134 = v2; g135 = v3; g136 = v4; g137 = v5; g138 = v6; g129 = v7; return 0; } v27 = v24; v25 = &g65; } else { // 0x949c v27 = g126; v25 = 0; // branch -> 0x9504 } // 0x9504 v19 = v15 - v25; v17 = 0; v22 = 4 * v25 + v27; // branch -> 0x950c while (true) { // 0x950c v26 = v22 + 4; g128 = v26; v28 = *(int32_t *)v22; g132 = v28; if (v28 == g135) { goto lab_if_9514_0_true_3; } v18 = v17; goto lab_after_if_9514_0_3; } } // 0x9520 free((char *)g126); v20 = g138; g3 = v20 == 0; if (v20 == 0) { // 0x9520 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v14; // branch -> 0x9560 // Detected a possible infinite recursion (goto support failed); quitting... } else { // 0x9530 if (v20 == 2) { // 0x954c v23 = g134; v29 = v14; g3 = v29 == v23; v35 = 0; if (v29 == v23) { // if_9554_0_true v35 = 1; // branch -> after_if_9554_0 // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v35; // branch -> 0x9560 // Detected a possible infinite recursion (goto support failed); quitting... } // after_if_9554_0 // branch -> 0x955c // 0x955c *(int32_t *)(g129 + 4) = v35; // branch -> 0x9560 // Detected a possible infinite recursion (goto support failed); quitting... } else { // 0x9538 g3 = v20 == 1; if (v20 == 1) { // 0x9540 v21 = v14; g3 = v21 == 0; if (v21 != 0) { // if_9544_0_true v36 = v21 & -0x10000 | 1; // branch -> 0x955c } else { v36 = 0; } // 0x955c *(int32_t *)(g129 + 4) = v36; // branch -> 0x9560 // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } } // 0x93c4 // branch -> 0x9488 } // 0x9488 v14 = 0; v15 = g134; if (v15 == 0) { // 0x9488 // branch -> 0x9520 } else { // 0x9494 if (v15 < 4) { // 0x94a4 v24 = g126; g132 = v24; v16 = &g65; // branch -> 0x94cc while (v16 != 4) { // 0x94cc v16 -= 4; // continue -> 0x94cc } // 0x94e4 g128 = &g65; if (v15 == (int32_t)&g65) { // 0x9520 free((char *)v24); v20 = g138; g3 = v20 == 0; if (v20 == 0) { // 0x9520 // branch -> 0x955c // Detected a possible infinite recursion (goto support failed); quitting... } else { // 0x9530 if (v20 == 2) { // 0x954c v23 = g134; v29 = v14; g3 = v29 == v23; if (v29 == v23) { // if_9554_0_true // branch -> after_if_9554_0 } // after_if_9554_0 // branch -> 0x955c } else { // 0x9538 g3 = v20 == 1; if (v20 == 1) { // 0x9540 v21 = v14; g3 = v21 == 0; if (v21 != 0) { // if_9544_0_true // branch -> 0x955c } // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } else { v27 = v24; v25 = &g65; } } else { // 0x949c v27 = g126; v25 = 0; // branch -> 0x9504 } // 0x9504 v19 = v15 - v25; v17 = 0; v22 = 4 * v25 + v27; // branch -> 0x950c while (true) { // 0x950c v26 = v22 + 4; g128 = v26; v28 = *(int32_t *)v22; g132 = v28; if (v28 == g135) { goto lab_if_9514_0_true_3; } v18 = v17; goto lab_after_if_9514_0_3; } } // 0x9520 free((char *)g126); v20 = g138; g3 = v20 == 0; if (v20 == 0) { // 0x9520 // branch -> 0x955c // Detected a possible infinite recursion (goto support failed); quitting... } else { // 0x9530 if (v20 == 2) { // 0x954c v23 = g134; v29 = v14; g3 = v29 == v23; if (v29 == v23) { // if_9554_0_true // branch -> after_if_9554_0 } // after_if_9554_0 // branch -> 0x955c } else { // 0x9538 g3 = v20 == 1; if (v20 == 1) { // 0x9540 v21 = v14; g3 = v21 == 0; if (v21 != 0) { // if_9544_0_true // branch -> 0x955c } // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } // Detected a possible infinite recursion (goto support failed); quitting... } // Address range: 0x9570 - 0x9593 int32_t script_transform_count(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g131 = v2; g126 = 0; int32_t result = script_transform_count_values(g127, g128, (int32_t *)g132, g133); // 0x9588 g130 = v1; return result; } // Address range: 0x9594 - 0x95b7 int32_t script_transform_any(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g131 = v2; g126 = 1; int32_t result = script_transform_count_values(g127, g128, (int32_t *)g132, g133); // 0x95ac g130 = v1; return result; } // Address range: 0x95b8 - 0x95db int32_t script_transform_all(void) { int32_t v1 = g130; // bp-8 g130 = &v1; int32_t v2; g131 = v2; g126 = 2; int32_t result = script_transform_count_values(g127, g128, (int32_t *)g132, g133); // 0x95d0 g130 = v1; return result; } // Address range: 0x95dc - 0x99db int32_t script_transform_int(uint32_t a1, int32_t a2, int32_t a3, char a4, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13, int32_t a14, int32_t a15, int32_t a16) { // 0x95dc g132 = a3; int32_t v1 = a4; g133 = v1; int32_t v2 = g134; // 0x95dc int32_t v3 = g135; // 0x95dc int32_t v4 = g138; // 0x95dc int32_t v5 = g130; // bp-8 g130 = &v5; int32_t v6 = (int32_t)a5; g137 = v6; g134 = a2; g138 = a3; *(int32_t *)(v6 + 8) = 0; int32_t v7; // 0x9948 uint32_t v8; // 0x9658 int32_t v9; // 0x9630 uint32_t v10; // 0x961c if (v1 >= 3) { // 0x9608 g129 = v1; // branch -> 0x961c // 0x961c v10 = a1 % 256; g1 = v10 > 6; g2 = v10 < 7; g3 = v10 == 7; if (v10 > 7) { // 0x967c g127 = (int32_t)"internal error"; // branch -> 0x9960 } else { // 0x9628 g128 = &g66; v9 = *(int32_t *)(4 * v10 + (int32_t)&g66); g127 = v9; ((int32_t (*)(int32_t, int32_t))(v9 + (int32_t)&g66))(v9, (int32_t)&g66); if (g3) { // if_9650_0_true // branch -> after_if_9650_0 } // after_if_9650_0 v8 = g129; *(char *)g137 = (char)v8; *(int32_t *)(g137 + 4) = enforce_value_size(g134, v8 % 256); g127 = 0; v7 = g130; g134 = *(int32_t *)(v7 - 28); g135 = *(int32_t *)(v7 - 24); g136 = *(int32_t *)(v7 - 20); g137 = *(int32_t *)(v7 - 16); g138 = *(int32_t *)(v7 - 12); g139 = *(int32_t *)(v7 - 8); g129 = *(int32_t *)(v7 - 4); g130 = *(int32_t *)v7; ((int32_t (*)(int32_t))*(int32_t *)(v7 + 4))(0); free((char *)g135); g127 = (int32_t)"internal error"; // branch -> 0x9960 } // 0x9960 g134 = v2; g135 = v3; g138 = v4; g130 = v5; return duplicate_string(); } // 0x9610 g129 = 3; if (a4 != 4) { // 0x9670 g127 = (int32_t)"integer size must be 1, 2 or 4"; // branch -> 0x9960 // 0x9960 g134 = v2; g135 = v3; g138 = v4; g130 = v5; return duplicate_string(); } // 0x961c v10 = a1 % 256; g1 = v10 > 6; g2 = v10 < 7; g3 = v10 == 7; if (v10 > 7) { // 0x967c g127 = (int32_t)"internal error"; // branch -> 0x9960 } else { // 0x9628 g128 = &g66; v9 = *(int32_t *)(4 * v10 + (int32_t)&g66); g127 = v9; ((int32_t (*)(int32_t, int32_t))(v9 + (int32_t)&g66))(v9, (int32_t)&g66); if (g3) { // if_9650_0_true // branch -> after_if_9650_0 } // after_if_9650_0 v8 = g129; *(char *)g137 = (char)v8; *(int32_t *)(g137 + 4) = enforce_value_size(g134, v8 % 256); g127 = 0; v7 = g130; g134 = *(int32_t *)(v7 - 28); g135 = *(int32_t *)(v7 - 24); g136 = *(int32_t *)(v7 - 20); g137 = *(int32_t *)(v7 - 16); g138 = *(int32_t *)(v7 - 12); g139 = *(int32_t *)(v7 - 8); g129 = *(int32_t *)(v7 - 4); g130 = *(int32_t *)v7; ((int32_t (*)(int32_t))*(int32_t *)(v7 + 4))(0); free((char *)g135); g127 = (int32_t)"internal error"; // branch -> 0x9960 } // 0x9960 g134 = v2; g135 = v3; g138 = v4; g130 = v5; return duplicate_string(); } // Address range: 0x99dc - 0x9ae7 int32_t script_transform_length(uint32_t a1, int32_t a2, int32_t a3, uint32_t a4, char * a5) { int32_t v1 = g134; // bp-16 int32_t v2 = g135; // 0x99dc int32_t v3 = g130; // bp-8 g130 = &v3; int32_t v4 = (int32_t)a5; g135 = v4; *(int32_t *)(v4 + 8) = 0; *(char *)g135 = 3; if (a4 < 3) { // 0x9a6c g127 = (int32_t)"length type must be 0, 1, 2 or 4"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x9a10 g134 = a4; uint32_t v5 = a1 % 256; // 0x9a14 uint32_t v6 = v5 - 1; // 0x9a14 if (v6 <= 2) { // 0x9a20 g127 = (int32_t)"type mismatch"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x9a30 if (a4 % 256 == 0) { // 0x9a7c if (v5 != 4) { // 0x9ac0 *(int32_t *)(g135 + 4) = a2; g135 = v2; return 0; } int32_t str = parse_buffer((char *)a3, a2, a3, v6, v1, v2, v3, g126, (int32_t)a5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0, NULL, 0, 0, NULL, 0, 0, 0, 0, 0); // 0x9a88 if (str == 0) { // 0x9ad0 *(int32_t *)(g135 + 4) = 0; g135 = v2; return 0; } // 0x9a98 *(int32_t *)(g135 + 4) = strlen((char *)str); free((char *)str); g135 = v2; return 0; } int32_t v7 = v5 - 5; // 0x9ab4 if (v5 < 6) { // if_9a4c_0_true v7 = 0; // branch -> after_if_9a4c_0 } uint32_t v8 = (a4 + 255) % 256; // 0x9a50 uint32_t v9 = v7 % 256; // 0x9a54 uint32_t v10 = v9 == 0 ? a2 : v9 < 32 ? a2 << v9 : 0; // 0x9a54 if (1 << v9 != a2) { // 0x9a5c g127 = (int32_t)"data length is not aligned"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x9ab4 // branch -> 0x9ad0 // 0x9ad0 *(int32_t *)(g135 + 4) = v10 >> (v8 > 32 ? 32 : v8); g135 = v2; return 0; } // Address range: 0x9ae8 - 0x9c5f int32_t script_transform_multiXX(uint32_t a1, int32_t a2, int32_t a3, int32_t size, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t (*a12)(int32_t), int32_t a13, int32_t a14, int32_t a15, int32_t a16) { int32_t v1 = g134; // bp-32 int32_t v2 = g135; // 0x9ae8 int32_t v3 = g138; // 0x9ae8 int32_t v4 = g139; // 0x9ae8 int32_t v5 = g130; // bp-8 g138 = a5; g135 = a3; g3 = size == 0; *(int32_t *)(a5 + 4) = size; *(int32_t *)(g138 + 8) = 0; if (size < 0) { // 0x9b30 g127 = (int32_t)"negative item count"; g134 = v1; g135 = v2; g138 = v3; g139 = v4; g130 = v5; return duplicate_string(); } // 0x9b18 g3 = a1 % 256 == 0; if (a1 % 256 != 0) { // 0x9b20 g127 = (int32_t)"type mismatch"; g134 = v1; g135 = v2; g138 = v3; g139 = v4; g130 = v5; return duplicate_string(); } // 0x9b40 g3 = a2 % a6 == 0; if (a2 % a6 != 0) { // 0x9b54 g127 = (int32_t)"data length is not aligned"; g134 = v1; g135 = v2; g138 = v3; g139 = v4; g130 = v5; return duplicate_string(); } int32_t v6 = size * a6; // 0x9b64 g3 = a2 == v6; if (a2 < v6) { // 0x9b70 g127 = (int32_t)"data is too short"; g134 = v1; g135 = v2; g138 = v3; g139 = v4; g130 = v5; return duplicate_string(); } // 0x9b80 g3 = a6 == 4; if (a6 == 4) { // 0x9bb8 return (int32_t)malloc(4 * size); } // 0x9b88 g3 = a6 == 2; if (a6 == 2) { // 0x9bf4 return (int32_t)malloc(2 * size); } // 0x9b90 g3 = a6 == 1; if (a6 == 1) { // 0x9b98 return (int32_t)malloc(size); } // 0x9c3c g127 = (int32_t)"internal error"; g134 = v1; g135 = v2; g138 = v3; g139 = v4; g130 = v5; return duplicate_string(); } // Address range: 0x9c60 - 0x9d73 int32_t script_transform_multi8(uint32_t a1, int32_t a2, char * a3, int32_t size, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9) { int32_t v1 = g134; // bp-24 int32_t v2 = g135; // 0x9c60 int32_t v3 = g130; // bp-8 g135 = a2; int32_t v4 = (int32_t)a5; if (a1 % 256 <= 3) { // 0x9c88 *a5 = 5; *(int32_t *)(v4 + 4) = size; *(int32_t *)(v4 + 8) = 0; if (size >= 0) { // 0x9ca4 return (int32_t)malloc(size); } // 0x9d00 g127 = (int32_t)"negative item count"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x9cd4 *(int32_t *)(v4 + 4) = size; *(int32_t *)(v4 + 8) = 0; if (size < 0) { // 0x9d10 g127 = (int32_t)"negative item count"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x9ce8 if ((int32_t)a1 % 256 != 0) { // 0x9cf0 g127 = (int32_t)"type mismatch"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } // 0x9d20 if (g135 < size) { // 0x9d28 g127 = (int32_t)"data is too short"; g134 = v1; g135 = v2; g130 = v3; return duplicate_string(); } char * mem = malloc(size); // 0x9d3c int32_t v5 = (int32_t)mem; // 0x9d3c_3 g135 = v5; __aeabi_memcpy(mem, (char *)(int32_t)a3, size); *(int32_t *)(v4 + 8) = v5; *(char *)v4 = 5; g135 = v2; return 0; } // Address range: 0x9d74 - 0x9e63 int32_t script_transform_multi16(uint32_t a1, int32_t a2, int32_t a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8) { int32_t v1 = g134; // 0x9d74 int32_t v2 = g135; // 0x9d74 int32_t v3 = g136; // 0x9d74 int32_t v4 = g130; // 0x9d74 int32_t v5 = v4; // bp-8 g130 = &v5; g134 = a2; int32_t v6 = (int32_t)a5; g136 = v6; g135 = a4; if (a1 % 256 > 3) { // 0x9e2c return script_transform_multiXX(a1, a2, a3, a4, v6, 2, v1, v2, v3, g129, v4, (int32_t (*)(int32_t))g126, v6, a6, a7, a8); } // 0x9d9c *a5 = 6; *(int32_t *)(g136 + 4) = g135; *(int32_t *)(g136 + 8) = 0; if (a4 >= 0) { // 0x9db8 return (int32_t)malloc(2 * g135); } // 0x9e4c g127 = (int32_t)"negative item count"; g134 = v1; g135 = v2; g130 = v5; return duplicate_string(); } // Address range: 0x9e64 - 0x9f53 int32_t script_transform_multi32(uint32_t a1, int32_t a2, int32_t a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8) { int32_t v1 = g134; // 0x9e64 int32_t v2 = g135; // 0x9e64 int32_t v3 = g136; // 0x9e64 int32_t v4 = g130; // 0x9e64 int32_t v5 = v4; // bp-8 g130 = &v5; g134 = a2; int32_t v6 = (int32_t)a5; g136 = v6; g135 = a4; if (a1 % 256 > 3) { // 0x9f1c return script_transform_multiXX(a1, a2, a3, a4, v6, 4, v1, v2, v3, g129, v4, (int32_t (*)(int32_t))g126, v6, a6, a7, a8); } // 0x9e8c *a5 = 7; *(int32_t *)(g136 + 4) = g135; *(int32_t *)(g136 + 8) = 0; if (a4 >= 0) { // 0x9ea8 return (int32_t)malloc(4 * g135); } // 0x9f3c g127 = (int32_t)"negative item count"; g134 = v1; g135 = v2; g130 = v5; return duplicate_string(); } // Address range: 0x9f54 - 0xa013 int32_t script_transform_multi(uint32_t a1, int32_t a2, int32_t a3, int32_t a4) { int32_t v1 = g134; // 0x9f54 int32_t v2 = g135; // 0x9f54 int32_t v3 = g136; // 0x9f54 int32_t v4 = g137; // 0x9f54 int32_t v5 = g138; // 0x9f54 int32_t v6 = g129; // 0x9f54 int32_t v7 = g130; // bp-8 g130 = &v7; int32_t v8; g134 = v8; g136 = a1; g137 = a4; g138 = a3; g135 = a2; g3 = a1 % 256 == 0; *(int32_t *)(v8 + 8) = 0; int32_t result2; // 0xa004 if (a1 % 256 == 0) { // 0x9f90 g3 = g137 == 4; if (g137 <= 4) { uint32_t v9 = g137 % 256; // 0x9fa0 g3 = v9 == 0 | (1 << v9 & 22) == 0 | v9 >= 32; if (v9 != 0) { int32_t v10 = g137 - 1; // 0x9fa8 int32_t v11 = g135; // 0x9fac g3 = (v11 & v10) == 0; if (v10 == v11) { int32_t result = script_transform_multiXX(g136, v10, g138, v10 / g137, g134, v9, v1, v2, v3, v4, v5, (int32_t (*)(int32_t))v6, v7, g126, v8, 0); // 0x9fe8 g127 = result; g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; return result; } // 0x9fb4 g127 = (int32_t)"data length is not aligned"; // branch -> 0x9ffc // 0x9ffc g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; result2 = duplicate_string(); g127 = result2; return result2; } } // 0x9ff4 g127 = (int32_t)"parameter must be 1, 2 or 4"; // branch -> 0x9ffc } else { // 0x9f84 g127 = (int32_t)"type mismatch"; // branch -> 0x9ffc } // 0x9ffc g134 = v1; g135 = v2; g136 = v3; g137 = v4; g138 = v5; g129 = v6; g130 = v7; result2 = duplicate_string(); g127 = result2; return result2; } // Address range: 0xa014 - 0xa0e7 int32_t script_transform_text(uint32_t a1, int32_t a2, char * a3, int32_t a4, char * a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12) { int32_t v1 = g134; // bp-24 int32_t v2 = g135; // 0xa014 int32_t v3 = g136; // 0xa014 int32_t v4 = g137; // 0xa014 int32_t v5 = g130; // bp-8 g130 = &v5; g137 = (int32_t)a5; g135 = (int32_t)a3; g134 = a4; *a5 = 4; *(int32_t *)(g137 + 4) = g134; *(int32_t *)(g137 + 8) = 0; if (a4 < 0) { // 0xa05c g127 = (int32_t)"negative length"; g134 = v1; g135 = v2; g130 = v5; return duplicate_string(); } // 0xa044 if (a1 % 256 != 0) { // 0xa04c g127 = (int32_t)"type mismatch"; g134 = v1; g135 = v2; g130 = v5; return duplicate_string(); } int32_t size = g134; // 0xa06c if (size > a2) { // 0xa074 g127 = (int32_t)"length is greater than data size"; g134 = v1; g135 = v2; g130 = v5; return duplicate_string(); } char * mem = malloc(size); // 0xa088 int32_t v6 = g134; // 0xa090 g136 = (int32_t)mem; __aeabi_memcpy(mem, (char *)g135, v6); int32_t v7 = parse_buffer((char *)g136, g134, v6, a4, v1, v2, v3, v4, v5, g126, (int32_t)a5, a6, a7, a8, a9, a10, a11, a12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0, NULL, 0, 0, NULL, 0, 0, 0, 0, 0); // 0xa0a4 free((char *)v7); if (v7 != 0) { // if_a0bc_0_true *(int32_t *)(g137 + 8) = g136; g135 = v2; return 0; } // after_if_a0bc_0 free((char *)g136); g127 = (int32_t)"data does not contain text"; g134 = (int32_t)a5; g135 = a6; g130 = a9; return duplicate_string(); } // Address range: 0xa0e8 - 0xa827 int32_t parse_buffer(char * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13, int32_t a14, int32_t a15, int32_t a16, int32_t a17, int32_t a18, int32_t a19, int32_t a20, int32_t a21, int32_t a22, int32_t a23, int32_t a24, int32_t a25, int32_t a26, int32_t a27, int32_t a28, char * a29, int32_t a30, int32_t a31, char * a32, int32_t a33, int32_t a34, char * a35, int32_t a36, int32_t a37, int32_t a38, int32_t a39, int32_t a40) { int32_t v1 = 0; // SP g133 = a4; int32_t v2 = g134; // 0xa0e8 int32_t v3 = g135; // 0xa0e8 int32_t v4 = g136; // 0xa0e8 int32_t v5 = g137; // 0xa0e8 int32_t (*v6)() = (int32_t (*)())g138; int32_t v7 = g130; // bp-8 g130 = &v7; g135 = (int32_t)a1; g134 = a2; char * mem = malloc(1); // 0xa10c int32_t v8 = g134; // 0xa114 g1 = true; g2 = v8 < 0; g3 = v8 == 0; g110 = mem; *mem = 0; g109 = 0; int32_t v9; // 0xa758_5 char * mem2; // 0xa758 int32_t v10; int32_t v11; int32_t v12; int32_t v13; int32_t v14; // 0xa7a8 uint32_t v15; // 0xa790 int32_t result; // 0xa780 int32_t v16; // 0xa7a8 if (v8 == 0) { // 0xa0e8 // branch -> 0xa750 } else { // 0xa128 g129 = v1 + 216; g133 = 0x3517; g136 = (int32_t)&g110; g72 = "%hhu"; g137 = v1 + 224; g139 = 0; g70 = "{UNKNOWN "; g69 = "{NAME_END}"; g71 = &g123; g73 = "{PAUSE_UNTIL_PRESS}"; g77 = &g123; g78 = *(int32_t *)&g12; g84 = &g123; g76 = &g122; g85 = "%hhu"; g83 = "{STRING "; int32_t v17 = g36; // 0xa1f8 g82 = v17; g106 = "%hhu"; g105 = "COLOR"; g104 = "HIGHLIGHT"; g103 = "SHADOW"; g100 = &g122; g101 = &g119; char ** v18 = (char **)*(int32_t *)&g6; g99 = v18; g97 = &g119; g96 = "{COLOR_HIGHLIGHT_SHADOW "; g81 = v18; g93 = &g123; g80 = v18; g102 = &g123; g95 = "{SMALL}"; g94 = "%hhu"; g132 = &g123; g90 = &g123; g92 = "{PAUSE "; g98 = &g123; g128 = &g123; g79 = v17; g87 = &g123; g75 = &g115; g74 = &g116; g91 = "%hhu"; g89 = "{SHIFT_TEXT "; g88 = "%02hhX%02hhX"; g86 = "{PLAY_MUSIC 0x"; g107 = "{PLAY_MUSIC 0x"; int32_t v19; int32_t v20 = &v19; // 0xa460_0 int32_t v21 = 0; // 0xa3e4 // branch -> 0xa3e4 while (true) { uint32_t v22 = v21 % 256; // 0xa3e4 g1 = v22 > 16; g2 = v22 < 17; g3 = v22 == 17; int32_t v23; // 0xa728 int32_t v24; // 0xa4dc if (v22 > 17) { // 0xa4bc int32_t v25; // 0xa730 uint32_t v26; // 0xa73c if (v22 == 252) { unsigned char v27 = *(char *)g135; // 0xa664 int32_t v28 = v27; // 0xa664 g139 = v28; g1 = v27 > 23; g2 = v27 < 24; g3 = v27 == 24; int32_t v29; // 0xa3d0 int32_t v30; // 0xa3d0 if (v27 > 24) { // 0xa3a0 sprintf((char *)&g108, "\xe0\x10\x8d\xe5\x89\x01", v27); g67 = -0x1a3ff000; g68 = 0; v30 = g129; v29 = (int32_t)"\xe4"; // branch -> 0xa3d0 } else { // 0xa670 g128 = &g112; int32_t v31 = 4 * v28; // 0xa674 g127 = v31; int32_t v32 = *(int32_t *)(v31 + (int32_t)&g112); // 0xa678 g132 = v32; ((int32_t (*)(int32_t, int32_t, int32_t))(v32 + (int32_t)&g112))(v31, (int32_t)&g112, v32); if (g3) { // if_a6e0_0_true // branch -> after_if_a6e0_0 } // after_if_a6e0_0 v30 = 0; v29 = a28; // branch -> 0xa3d0 } // 0xa3d0 concatenate((int32_t *)g136, (int32_t *)g137, (char *)v29, v30); g139 = 0; // branch -> 0xa72c } else { // 0xa4c4 if (v22 == 253) { unsigned char v33 = *(char *)g135; // 0xa4cc int32_t v34 = v33; // 0xa4cc if (v33 <= 15) { // 0xa4d8 v24 = *(int32_t *)(4 * v34 - 0x1f710000); if (v24 != 0) { // 0xa4e8 g139 = 0; g67 = -0x1d729f1c; g68 = 0; v23 = -0x1a60c998; // branch -> 0xa728 lab_0xa728_2: // 0xa728 concatenate((int32_t *)g136, (int32_t *)g137, (char *)v23, v24); // branch -> 0xa72c // 0xa72c g135++; v25 = g134; g1 = v25 != 0; g134 = v25 - 1; if (v25 == 1) { // 0xa738 v26 = g139; g2 = false; g3 = v26 % 256 == 0; if (v26 % 256 == 0) { // 0xa750 mem2 = realloc((char *)(int32_t)"T", -0x1f70ffff); v9 = (int32_t)mem2; g127 = v9; g128 = -0x1f710000; g132 = 0; g110 = mem2; *(char *)(v9 - 0x1f710000) = 0; // branch -> 0xa76c } else { // 0xa744 free("T"); g127 = 0; // branch -> 0xa76c } // 0xa76c g134 = v13; g135 = v12; g136 = v11; g137 = v10; g138 = v2; g139 = v3; g129 = v4; g130 = v5; v6(); result = g127; if (g3) { // if_a824_0_true v15 = g135 % 256; v14 = g130; v16 = v15 == 0 ? v14 : v15 < 32 ? v14 << v15 : 0; *(int16_t *)result = (int16_t)(v16 & result); g133 = 0; // branch -> after_if_a824_0 // after_if_a824_0 return result - g129; } // after_if_a824_0 return result; } lab_0xa72c_2: // 0xa72c v21 = g139; // branch -> 0xa3e4 continue; } } // 0xa700 sprintf((char *)&g108, "\x18", v33); g139 = 0; g67 = -0x1f710000; g68 = 0; v24 = g129; v23 = (int32_t)g83; // branch -> 0xa728 goto lab_0xa728_2; } } // 0xa72c g135++; v25 = g134; g1 = v25 != 0; g134 = v25 - 1; if (v25 != 1) { goto lab_0xa72c_2; } // 0xa738 v26 = g139; g2 = false; g3 = v26 % 256 == 0; if (v26 % 256 == 0) { // 0xa750 mem2 = realloc((char *)(int32_t)"T", -0x1f70ffff); v9 = (int32_t)mem2; g127 = v9; g128 = -0x1f710000; g132 = 0; g110 = mem2; *(char *)(v9 - 0x1f710000) = 0; // branch -> 0xa76c } else { // 0xa744 free("T"); g127 = 0; // branch -> 0xa76c } // 0xa76c g134 = v13; g135 = v12; g136 = v11; g137 = v10; g138 = v2; g139 = v3; g129 = v4; g130 = v5; v6(); result = g127; if (g3) { // if_a824_0_true v15 = g135 % 256; v14 = g130; v16 = v15 == 0 ? v14 : v15 < 32 ? v14 << v15 : 0; *(int16_t *)result = (int16_t)(v16 & result); g133 = 0; // branch -> after_if_a824_0 // after_if_a824_0 return result - g129; } // after_if_a824_0 return result; } // 0xa3f0 g128 = &g111; int32_t v35 = *(int32_t *)(4 * v22 + (int32_t)&g111); // 0xa3f8 g127 = v35; ((int32_t (*)(int32_t, int32_t))(v35 + (int32_t)&g111))(v35, (int32_t)&g111); if (g3) { // if_a444_0_true // branch -> after_if_a444_0 } // after_if_a444_0 int32_t str; g138 = &str; int32_t format; sprintf((char *)&str, (char *)format); int32_t v36; v19 = v36; int32_t v37 = g139; // 0xa478 g139 = 0; unsigned char v38 = *(char *)g135; // 0xa488 int32_t v39 = v38; // 0xa488 if (v38 < 16) { // if_a490_0_true g138 = *(int32_t *)(4 * v39 + a40); // branch -> after_if_a494_0 } // after_if_a494_0 v24 = *(int32_t *)(4 * ((v37 + 255) % 256) + v20); int32_t v40; v23 = v40; // branch -> 0xa728 goto lab_0xa728_2; } } // 0xa750 mem2 = realloc((char *)(int32_t)mem, -0x1f70ffff); v9 = (int32_t)mem2; g127 = v9; g128 = -0x1f710000; g132 = 0; g110 = mem2; *(char *)(v9 - 0x1f710000) = 0; // branch -> 0xa76c // 0xa76c g134 = v13; g135 = v12; g136 = v11; g137 = v10; g138 = v2; g139 = v3; g129 = v4; g130 = v5; v6(); result = g127; int32_t result2 = result; // 0xa824_2 if (g3) { // if_a824_0_true v15 = g135 % 256; v14 = g130; v16 = v15 == 0 ? v14 : v15 < 32 ? v14 << v15 : 0; *(int16_t *)result = (int16_t)(v16 & result); g133 = 0; result2 = result - g129; // branch -> after_if_a824_0 } // after_if_a824_0 return result2; } // Address range: 0xa828 - 0xa82f int32_t __udivsi3(int32_t result) { // 0xa828 g3 = g128 == 1; return result; } // Address range: 0xa830 - 0xa8cf int32_t function_a830(uint32_t a1, uint32_t a2, int32_t a3) { // 0xa830 if (!g1) { // 0xa8c4 g1 = true; g3 = a1 == 0; int32_t v1; if (a1 != 0) { // if_a8c8_0_true v1 = -1; // branch -> after_if_a8c8_0 } else { v1 = 0; } int32_t result = v1 / a2; g127 = result; return result; } // 0xa834 g1 = a1 >= a2; g3 = a1 == a2; if (a1 <= a2) { int32_t result2 = a1 == a2; g127 = result2; return result2; } // 0xa83c g3 = (a3 & a2) == 0; int32_t v2 = llvm_ctlz_i32(a2, false); // 0xa8b4 if (a2 == a3) { uint32_t v3 = (31 - v2) % 256; // 0xa8bc int32_t result3 = a1 >> (v3 > 32 ? 32 : v3); // 0xa8bc g127 = result3; return result3; } uint32_t v4 = (v2 - llvm_ctlz_i32(a1, false)) % 256; // 0xa854 int32_t v5 = 0; // 0xa868 uint32_t v6 = v4 == 0 ? 1 : v4 < 32 ? 1 << v4 : 0; // 0xa894 int32_t v7 = a1; // 0xa864 uint32_t v8 = v4 == 0 ? a2 : v4 < 32 ? a2 << v4 : 0; // 0xa898 // branch -> 0xa860 while (true) { int32_t v9 = v7; // 0xa870 int32_t v10 = v5; // 0xa874 if (v7 < v8) { // if_a864_0_true v9 = v7 - v8; v10 = v6 | v5; // branch -> after_if_a868_0 } uint32_t v11 = v8 / 2; // 0xa86c int32_t v12 = v9; // 0xa87c int32_t v13 = v10; // 0xa880 if (v9 < v11) { // if_a870_0_true v12 = v9 - v11; v13 = v10 | v6 / 2; // branch -> after_if_a874_0 } uint32_t v14 = v8 / 4; // 0xa878 int32_t v15 = v12; // 0xa888 int32_t v16 = v13; // 0xa88c if (v12 < v14) { // if_a87c_0_true v15 = v12 - v14; v16 = v13 | v6 / 4; // branch -> after_if_a880_0 } uint32_t v17 = v8 / 8; // 0xa884 int32_t v18 = v15; // 0xa890 int32_t result4 = v16; // 0xa8a0 if (v15 < v17) { // if_a888_0_true v18 = v15 - v17; result4 = v16 | v6 / 8; // branch -> after_if_a88c_0 } // after_if_a88c_0 if (v18 == 0) { // 0xa8a0 g1 = true; g3 = true; g127 = result4; return result4; } // after_if_a894_0 if (v6 < 16) { // 0xa8a0 g1 = false; g3 = true; g127 = result4; return result4; } // after_if_a898_0 v5 = result4; v6 /= 16; v7 = v18; v8 /= 16; // branch -> 0xa860 } } // Address range: 0xa8d0 - 0xa8ef int32_t __aeabi_uidivmod(uint32_t a1, uint32_t a2) { // 0xa8d0 g3 = a2 == 0; int32_t v1 = a1 / a2; g127 = v1; return a1 - v1 * a2; } // Address range: 0xa8f0 - 0xa8f7 void __aeabi_idiv(void) { // 0xa8f0 return; } // Address range: 0xa8f8 - 0xa9bb int32_t function_a8f8(int32_t a1) { int32_t v1 = g128 ^ a1; // 0xa8f8 g131 = v1; int32_t v2; // 0xa8fc if (g2) { // if_a8fc_0_true v2 = -g128; // branch -> after_if_a8fc_0 } // after_if_a8fc_0 int32_t result; // 0xa984_1 if (v2 == 1) { // 0xa988 g3 = g128 == 0; if (v1 < 0) { // if_a98c_0_true result = -a1; // branch -> after_if_a980_0 } else { result = a1; } // after_if_a980_0 return result; } uint32_t v3 = a1 < 0 ? -a1 : a1; g3 = v3 == v2; if (v3 > v2) { int32_t v4 = llvm_ctlz_i32(v2, false); // 0xa9a4 uint32_t v5 = (v4 - llvm_ctlz_i32(v3, false)) % 256; // 0xa930 int32_t v6 = 0; // 0xa944 uint32_t v7 = v5 == 0 ? 1 : v5 < 32 ? 1 << v5 : 0; // 0xa970 int32_t v8 = v3; // 0xa940 uint32_t v9 = v5 == 0 ? v2 : v5 < 32 ? v2 << v5 : 0; // 0xa974 // branch -> 0xa93c while (true) { int32_t v10 = v8; // 0xa94c int32_t v11 = v6; // 0xa950 if (v8 >= v9) { // if_a944_0_true v10 = v8 - v9; v11 = v7 | v6; // branch -> after_if_a944_0 } uint32_t v12 = v9 / 2; // 0xa948 int32_t v13 = v10; // 0xa958 int32_t v14 = v11; // 0xa95c if (v10 < v12) { // if_a94c_0_true v13 = v10 - v12; v14 = v11 | v7 / 2; // branch -> after_if_a950_0 } uint32_t v15 = v9 / 4; // 0xa954 int32_t v16 = v13; // 0xa964 int32_t v17 = v14; // 0xa968 if (v13 < v15) { // if_a958_0_true v16 = v13 - v15; v17 = v14 | v7 / 4; // branch -> after_if_a95c_0 } uint32_t v18 = v9 / 8; // 0xa960 int32_t v19 = v16; // 0xa96c int32_t v20 = v17; // 0xa980 if (v16 < v18) { // if_a964_0_true v19 = v16 - v18; v20 = v17 | v7 / 8; // branch -> after_if_a968_0 } // after_if_a968_0 if (v19 != 0) { // after_if_a970_0 if (v7 >= 16) { // after_if_a974_0 v6 = v20; v7 /= 16; v8 = v19; v9 /= 16; // branch -> 0xa93c continue; } } // 0xa97c g3 = g128 == a1; if (v1 < 0) { // if_a980_0_true // branch -> after_if_a980_0 // after_if_a980_0 return -v20; } } } else { if (v3 < v2) { // if_a994_0_true a1 = 0; // branch -> after_if_a994_0 } // after_if_a994_0 if (v3 == v2) { // if_a99c_0_true result = v1 >> 31 | 1; // branch -> after_if_a980_0 } else { result = a1; } } // after_if_a980_0 return result; } // Address range: 0xa9bc - 0xa9cb void function_a9bc(int32_t a1) { // 0xa9bc if (a1 > 0) { // if_a9c0_0_true // branch -> after_if_a9c0_0 } // after_if_a9c0_0 if (a1 < 0) { // if_a9c4_0_true // branch -> after_if_a9c4_0 } } // Address range: 0xa9cc - 0xa9eb int32_t __aeabi_idivmod(int32_t a1, int32_t a2) { // 0xa9cc g128 = a2; g2 = a2 < 0; int32_t result = function_a8f8(a1); // 0xa9d8 g127 = result; return result; } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/config/arm/unwind-arm.c // Address range: 0xa9fc - 0xaa13 // Line range: 454 - 466 int32_t selfrel_offset31(int32_t * p) { int32_t v1 = *p; // 0xa9fc int32_t v2 = (v1 & 0x40000000) == 0 ? (int32_t)fabsf((float32_t)v1) : v1 | -0x80000000; return v2 + (int32_t)p; } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xaa14 - 0xaab7 // Line range: 157 - 189 struct __EIT_entry * search_EIT_table(struct __EIT_entry * table, int32_t nrec, int32_t return_address) { int32_t v1 = (int32_t)table; // 0xaa14_0 int32_t v2 = g135; // 0xaa14 int32_t v3 = g138; // 0xaa14 g135 = nrec; if (nrec == 0) { // 0xaaac g135 = v2; g138 = v3; return (struct __EIT_entry *)0; } int32_t v4 = nrec - 1; // 0xaa24 g138 = v4; int32_t v5 = 0; // R11 int32_t v6 = 0; // 0xaa38 // branch -> 0xaa38 while (true) { int32_t v7 = v4 + v6; // 0xaa38 int32_t v8 = ((int32_t)(v7 < 0) + v7) / 2; // 0xaa40 int32_t v9 = v8; // R4 int32_t v10 = 8 * v8; // 0xaa44 int32_t v11 = v10; // R10 int32_t v12 = v10 + v1; // 0xaa48 g135 = v12; uint32_t v13 = selfrel_offset31((int32_t *)v12); // 0xaa50 int32_t v14 = g138; // 0xaa54 int32_t v15; // 0xaa80 int32_t v16; // 0xaa78 int32_t v17; if (v9 == v14) { // 0xaaa4 if (return_address < v13) { lab_0xaa78: // 0xaa78 v16 = v5; if (v14 == v16) { // 0xaa9c g135 = 0; // branch -> 0xaaac // 0xaaac g135 = v2; g138 = v3; return (struct __EIT_entry *)0; } // 0xaa80 v15 = v14 - 1; // branch -> 0xaa38 lab_0xaa38: // 0xaa38 v6 = v16; v4 = v15; // branch -> 0xaa38 continue; } } else { int32_t v18 = selfrel_offset31((int32_t *)(v11 + 8 + v1)); // 0xaa68 if (return_address < v13) { // 0xaa88 if (return_address <= v18 - 1) { // 0xaaac v17 = g135; // branch -> 0xaaac // 0xaaac g135 = v2; g138 = v3; return (struct __EIT_entry *)v17; } int32_t v19 = v9 + 1; // 0xaa94 v5 = v19; v15 = v4; v16 = v19; // branch -> 0xaa38 goto lab_0xaa38; } else { // 0xaa5c v14 = v9; // branch -> 0xaa78 goto lab_0xaa78; } } // 0xaaac v17 = g135; // branch -> 0xaaac // 0xaaac g135 = v2; g138 = v3; return (struct __EIT_entry *)v17; } } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/config/arm/unwind-arm.c // Address range: 0xaab8 - 0xab07 // Line range: 469 - 485 int32_t __gnu_unwind_get_pr_addr(int32_t idx) { // 0xaab8 g3 = idx == 1; if (idx == 1) { // 0xaadc return g45; } // 0xaac0 g3 = idx == 2; if (idx == 2) { // 0xaae8 return g15; } // 0xaac8 g3 = idx == 0; if (idx == 0) { // 0xaad0 return g10; } // 0xaaf4 return 0; } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xab08 - 0xac07 // Line range: 196 - 275 int32_t get_eit_entry(struct _Unwind_Control_Block * ucbp, int32_t return_address) { // 0xab08 int32_t v1; int32_t nrec = v1; // bp-20 nrec = return_address; int32_t v2 = g134; // 0xab0c int32_t v3 = g135; // 0xab0c g134 = (int32_t)ucbp; int32_t v4 = return_address - 2; // 0xab18 g135 = v4; int32_t * v5; // 0xabc0_0 struct __EIT_entry * v6; // 0xab6c int32_t v7; // 0xab78 int32_t v8; // 0xabd0 int32_t result; // 0xabf8_2 int32_t v9; // 0xab9c int32_t v10; // 0xabb8 int32_t v11; // 0xab7c int32_t v12; // 0xabbc uint32_t v13; // 0xabc0 if (g38 == 0) { int32_t v14 = *(int32_t *)&g17; // 0xab54 int32_t v15 = (g7 - v14) / 8; // 0xab5c nrec = v15; // branch -> 0xab64 // 0xab64 v6 = search_EIT_table((struct __EIT_entry *)v14, v15, v4); g135 = (int32_t)v6; if (v6 == NULL) { // 0xab38 *(int32_t *)(g134 + 16) = 0; // branch -> 0xabf4 // 0xabf4 g134 = v2; g135 = v3; return 9; } // 0xab78 v7 = selfrel_offset31(&v6->e0); v11 = *(int32_t *)(g135 + 4); if (v11 == 1) { // if_ab84_0_true *(int32_t *)(g134 + 16) = 0; *(int32_t *)(g134 + 72) = v7; // branch -> 0xabf4 // 0xabf4 g134 = v2; g135 = v3; return 5; } // 0xab98 *(int32_t *)(g134 + 72) = v7; v9 = g135 + 4; if (v11 < 0) { // if_aba0_0_true *(int32_t *)(g134 + 76) = v9; v12 = 1; // branch -> 0xabb8 } else { // 0xabac *(int32_t *)(g134 + 76) = selfrel_offset31((int32_t *)v9); v12 = 0; // branch -> 0xabb8 } // 0xabb8 v10 = g134; *(int32_t *)(v10 + 80) = v12; v5 = (int32_t *)*(int32_t *)(v10 + 76); v13 = *v5; if (v13 > -1) { // 0xabe8 *(int32_t *)(g134 + 16) = selfrel_offset31(v5); // branch -> 0xabf4 // 0xabf4 g134 = v2; g135 = v3; return 0; } // 0xabcc v8 = __gnu_unwind_get_pr_addr(v13 / 0x1000000 % 16); *(int32_t *)(g134 + 16) = v8; if (v8 == 0) { // if_abdc_0_true result = 9; // branch -> 0xabf4 } else { // if_abe0_0_true result = 0; // branch -> 0xabf4 } // 0xabf4 g134 = v2; g135 = v3; return result; } int32_t v16 = __gnu_Unwind_Find_exidx(v4, &nrec); // 0xab2c if (v16 == 0) { // 0xab38 *(int32_t *)(g134 + 16) = 0; // branch -> 0xabf4 // 0xabf4 g134 = v2; g135 = v3; return 9; } // 0xab24 // branch -> 0xab64 // 0xab64 v6 = search_EIT_table((struct __EIT_entry *)v16, nrec, g135); g135 = (int32_t)v6; if (v6 == NULL) { // 0xab38 *(int32_t *)(g134 + 16) = 0; // branch -> 0xabf4 // 0xabf4 g134 = v2; g135 = v3; return 9; } // 0xab78 v7 = selfrel_offset31(&v6->e0); v11 = *(int32_t *)(g135 + 4); if (v11 == 1) { // if_ab84_0_true *(int32_t *)(g134 + 16) = 0; *(int32_t *)(g134 + 72) = v7; // branch -> 0xabf4 // 0xabf4 g134 = v2; g135 = v3; return 5; } // 0xab98 *(int32_t *)(g134 + 72) = v7; v9 = g135 + 4; if (v11 < 0) { // if_aba0_0_true *(int32_t *)(g134 + 76) = v9; v12 = 1; // branch -> 0xabb8 } else { // 0xabac *(int32_t *)(g134 + 76) = selfrel_offset31((int32_t *)v9); v12 = 0; // branch -> 0xabb8 } // 0xabb8 v10 = g134; *(int32_t *)(v10 + 80) = v12; v5 = (int32_t *)*(int32_t *)(v10 + 76); v13 = *v5; if (v13 > -1) { // 0xabe8 *(int32_t *)(g134 + 16) = selfrel_offset31(v5); // branch -> 0xabf4 // 0xabf4 g134 = v2; g135 = v3; return 0; } // 0xabcc v8 = __gnu_unwind_get_pr_addr(v13 / 0x1000000 % 16); *(int32_t *)(g134 + 16) = v8; if (v8 == 0) { // if_abdc_0_true result = 9; // branch -> 0xabf4 } else { // if_abe0_0_true result = 0; // branch -> 0xabf4 } // 0xabf4 g134 = v2; g135 = v3; return result; } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/config/arm/unwind-arm.c // Address range: 0xac08 - 0xac73 // Line range: 124 - 140 void restore_non_core_regs(struct anon_struct_5 * vrs) { uint32_t v1 = vrs->e0; // 0xac08 int32_t v2 = g134; // 0xac0c int32_t v3 = (int32_t)vrs; // R4 int32_t v4; int32_t v5; // 0xac54 int32_t v6; // 0xac68 int32_t v7; // 0xac34 if (v1 % 2 != 0) { // 0xac34 v7 = v3; v5 = v7; if ((*(int32_t *)v7 & 4) == 0) { // 0xac40 __gnu_Unwind_Restore_VFP_D_16_to_31(); v5 = v3; // branch -> 0xac48 } // 0xac48 v6 = v5; if ((*(int32_t *)v5 & 8) == 0) { // 0xac54 __gnu_Unwind_Restore_WMMXD(); v6 = v3; // branch -> 0xac5c } // 0xac5c if ((*(int32_t *)v6 & 16) != 0) { // if_ac64_0_true g134 = v2; return; } // after_if_ac64_0 g134 = v4; __gnu_Unwind_Restore_WMMXC(); return; } // 0xac1c if ((v1 & 2) == 0) { // 0xac30 __gnu_Unwind_Restore_VFP(); // branch -> 0xac34 } else { // 0xac28 __gnu_Unwind_Restore_VFP_D(); // branch -> 0xac34 } // 0xac34 v7 = v3; v5 = v7; if ((*(int32_t *)v7 & 4) == 0) { // 0xac40 __gnu_Unwind_Restore_VFP_D_16_to_31(); v5 = v3; // branch -> 0xac48 } // 0xac48 v6 = v5; if ((*(int32_t *)v5 & 8) == 0) { // 0xac54 __gnu_Unwind_Restore_WMMXD(); v6 = v3; // branch -> 0xac5c } // 0xac5c if ((*(int32_t *)v6 & 16) != 0) { // if_ac64_0_true g134 = v2; return; } // after_if_ac64_0 g134 = v4; __gnu_Unwind_Restore_WMMXC(); } // From module: ./unwind.h // Address range: 0xac74 - 0xac87 // Line range: 41 - 65 void _Unwind_decode_typeinfo_ptr(int32_t base, int32_t ptr) { // 0xac74 if (*(int32_t *)base != 0) { // if_ac7c_0_true // branch -> after_if_ac80_0 } } // From module: ./unwind.h // Address range: 0xac88 - 0xac8f // Line range: 68 - 73 void __gnu_unwind_24bit(struct _Unwind_Context * context, int32_t data, int32_t compact) { // 0xac88 g127 = 9; } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xac90 - 0xac93 // Line range: 124 - 132 void _Unwind_DebugHook(char * cfa, char * handler) { // 0xac90 return; } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xac94 - 0xacf7 // Line range: 281 - 302 void unwind_phase2(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * vrs) { int32_t v1 = (int32_t)ucbp; // 0xac94_0 int32_t v2 = (int32_t)vrs; // 0xac94_1 g135 = v1; g134 = v2; // branch -> 0xaca0 while (true) { int32_t v3 = get_eit_entry((struct _Unwind_Control_Block *)v1, *(int32_t *)(v2 + 64)); // 0xaca8 g1 = true; g2 = v3 < 0; g3 = v3 == 0; g136 = v3; if (v3 == 0) { int32_t v4 = g134; // 0xacb8 g127 = 1; int32_t v5 = g135; // 0xacc0 g128 = v5; g132 = v4; *(int32_t *)(v5 + 20) = *(int32_t *)(v4 + 64); int32_t v6 = *(int32_t *)(g135 + 16); // 0xaccc g133 = v6; g126 = &g113; ((int32_t (*)(int32_t, int32_t, int32_t, int32_t))v6)(g127, v5, v4, v6); uint32_t v7 = g127; // 0xacd4 if (v7 != 8) { // 0xacdc g1 = v7 > 6; g2 = v7 < 7; g3 = v7 == 7; if (v7 != 7) { // 0xacb4 abort(); // UNREACHABLE } // 0xace4 _Unwind_DebugHook((char *)g136, (char *)*(int32_t *)(g134 + 64)); g127 = g134 + 4; restore_core_regs(); return; } // 0xacb8 v2 = g134; v1 = g135; // branch -> 0xaca0 continue; } // 0xacb4 abort(); // UNREACHABLE } } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xacf8 - 0xae1f // Line range: 308 - 388 int32_t unwind_phase2_forced(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * entry_vrs, int32_t resuming) { struct anon_struct_5 v1; struct anon_struct_5 v2; struct anon_struct_5 v3; struct anon_struct_5 v4; int32_t v5 = (int32_t)ucbp; // 0xacf8_0 int32_t v6 = (int32_t)entry_vrs; // 0xacf8_1 int32_t v7 = g135; // 0xacf8 int32_t v8 = g138; // 0xacf8 g138 = *(int32_t *)(v5 + 12); g134 = v5; g139 = *(int32_t *)(v5 + 24); g129 = resuming; g130 = (int32_t)&v2; int32_t v9 = (int32_t)&v1; // 0xad20_0 g137 = v9; g136 = 0; v2.e1.e0[0] = *(int32_t *)(v6 + 4); v2.e1.e0[1] = *(int32_t *)(v6 + 8); v2.e1.e0[2] = *(int32_t *)(v6 + 12); v2.e1.e0[3] = *(int32_t *)(v6 + 16); int32_t v10 = (int32_t)&v3; // 0xad28_0 v2.e1.e0[4] = *(int32_t *)(v6 + 20); v2.e1.e0[5] = *(int32_t *)(v6 + 24); v2.e1.e0[6] = *(int32_t *)(v6 + 28); v2.e1.e0[7] = *(int32_t *)(v6 + 32); *(int32_t *)(v10 + 16) = *(int32_t *)(v6 + 36); *(int32_t *)(v10 + 20) = *(int32_t *)(v6 + 40); *(int32_t *)(v10 + 24) = *(int32_t *)(v6 + 44); *(int32_t *)(v10 + 28) = *(int32_t *)(v6 + 48); int32_t v11 = v10 + 32; // 0xad38 g131 = v11; *(int32_t *)v11 = *(int32_t *)(v6 + 52); *(int32_t *)(v10 + 36) = *(int32_t *)(v6 + 56); *(int32_t *)(v10 + 40) = *(int32_t *)(v6 + 60); *(int32_t *)(v10 + 44) = *(int32_t *)(v6 + 64); v2.e0 = g136; // branch -> 0xad48 uint32_t v12; // 0xade8 while (true) { int32_t v13 = get_eit_entry((struct _Unwind_Control_Block *)g134, v2.e1.e0[15]); // 0xad50 int32_t v14 = g129; // 0xad54 int32_t v15 = v14 == 0 ? 25 : 26; g129 = v14 == 0 ? 9 : 10; g1 = true; g2 = v13 < 0; g3 = v13 == 0; g135 = v13; int32_t v16; // 0xadb0 int32_t v17; // 0xada4 if (v13 == 0) { // 0xad70 *(int32_t *)(g134 + 20) = v2.e1.e0[15]; memcpy((char *)&v1, (char *)&v2, 480); int32_t v18 = g134; // 0xad88 int32_t v19 = *(int32_t *)(v18 + 16); // 0xad88 g133 = v19; int32_t v20 = g129; // 0xad8c g127 = v20; g128 = v18; g132 = v9; g126 = 0xad9c; ((int32_t (*)(int32_t, int32_t, int32_t, int32_t))v19)(v20, v18, v9, v19); g136 = g127; v16 = g129; v17 = v1.e1.e0[13]; // branch -> 0xada4 } else { // if_ad64_0_true g129 = v15; v16 = v15; v17 = v2.e1.e0[13]; // branch -> 0xada4 } // 0xada4 v2.e2 = v17; g127 = 1; g128 = v16; int32_t v21 = g134; // 0xadb8 g132 = v21; g133 = v21; g126 = 0xadc4; ((int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))g138)(1, v16, v21, v21, g130, g139); int32_t result = 9; if (g127 == 0) { int32_t v22 = g135; // 0xadcc if (v22 == 0) { // 0xadd4 g129 = 0; memcpy((char *)&v2, (char *)&v1, 480); v12 = g136; if (v12 != 8) { // break -> 0xadf0 break; } // continue -> 0xad48 continue; } else { result = v22; } } // 0xae18 g135 = v7; g138 = v8; return result; } // 0xadf0 g1 = v12 > 6; g2 = v12 < 7; g3 = v12 == 7; if (v12 == 7) { // 0xadf8 _Unwind_DebugHook((char *)g135, (char *)v2.e1.e0[15]); g127 = (int32_t)&v4; restore_core_regs(); // branch -> 0xae18 } // 0xae18 g135 = v7; g138 = v8; return 9; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xae20 - 0xae27 // Line range: 210 - 401 int32_t _Unwind_GetCFA(struct _Unwind_Context * context) { // 0xae20 return *(int32_t *)((int32_t)context + 68); } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xae28 - 0xaecb // Line range: 410 - 448 int32_t __gnu_Unwind_RaiseException(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * entry_vrs) { struct anon_struct_5 v1; struct anon_struct_5 v2; int32_t v3 = (int32_t)entry_vrs; // 0xae28_1 int32_t * v4 = (int32_t *)(v3 + 60); // 0xae28_2 int32_t v5 = g135; // 0xae2c int32_t * v6 = (int32_t *)(v3 + 64); // 0xae34_0 *v6 = *v4; g135 = (int32_t)ucbp; g134 = v3; int32_t v7 = (int32_t)&v1; // 0xae40_0 v1.e1.e0[0] = *(int32_t *)(v3 + 4); v1.e1.e0[1] = *(int32_t *)(v3 + 8); v1.e1.e0[2] = *(int32_t *)(v3 + 12); v1.e1.e0[3] = *(int32_t *)(v3 + 16); int32_t v8 = (int32_t)&v2; // 0xae50_0 v1.e1.e0[4] = *(int32_t *)(v3 + 20); v1.e1.e0[5] = *(int32_t *)(v3 + 24); v1.e1.e0[6] = *(int32_t *)(v3 + 28); v1.e1.e0[7] = *(int32_t *)(v3 + 32); *(int32_t *)(v8 + 16) = *(int32_t *)(v3 + 36); *(int32_t *)(v8 + 20) = *(int32_t *)(v3 + 40); *(int32_t *)(v8 + 24) = *(int32_t *)(v3 + 44); *(int32_t *)(v8 + 28) = *(int32_t *)(v3 + 48); int32_t v9 = v8 + 32; // 0xae60 g131 = v9; *(int32_t *)v9 = *(int32_t *)(v3 + 52); *(int32_t *)(v8 + 36) = *(int32_t *)(v3 + 56); *(int32_t *)(v8 + 40) = *v4; *(int32_t *)(v8 + 44) = *v6; g136 = v7; v1.e0 = -1; int32_t v10 = get_eit_entry((struct _Unwind_Control_Block *)g135, v1.e1.e0[15]); // 0xae7c g127 = v10; g1 = true; g2 = v10 < 0; g3 = v10 == 0; if (v10 == 0) { int32_t v11 = g135; // 0xae88 int32_t v12 = *(int32_t *)(v11 + 16); // 0xae88 g133 = v12; g128 = v11; g132 = v7; g126 = &g114; ((int32_t (*)(int32_t, int32_t, int32_t))v12)(v11, v7, v12); g137 = 0; restore_non_core_regs(&v1); if (g137 == 6) { // 0xaeb4 unwind_phase2((struct _Unwind_Control_Block *)g135, (struct anon_struct_6 *)g134); // branch -> 0xaec0 } } // 0xaec0 g135 = v5; return 9; } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xaecc - 0xaee7 // Line range: 458 - 468 int32_t __gnu_Unwind_ForcedUnwind(struct _Unwind_Control_Block * ucbp, int32_t (*stop_fn)(int32_t, int32_t, char *, struct _Unwind_Control_Block *, struct _Unwind_Context *, char *), char * stop_arg, struct anon_struct_6 * entry_vrs) { int32_t v1 = (int32_t)ucbp; // 0xaecc_0 int32_t v2 = (int32_t)entry_vrs; // 0xaecc_3 *(int32_t *)(v1 + 24) = (int32_t)stop_arg; *(int32_t *)(v1 + 12) = (int32_t)stop_fn; *(int32_t *)(v2 + 64) = *(int32_t *)(v2 + 60); return unwind_phase2_forced(ucbp, entry_vrs, 0); } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xaee8 - 0xaf5b // Line range: 475 - 505 int32_t __gnu_Unwind_Resume(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * entry_vrs) { int32_t v1 = (int32_t)ucbp; // 0xaee8_0 int32_t v2 = (int32_t)entry_vrs; // 0xaee8_1 g135 = v1; int32_t v3 = *(int32_t *)(v1 + 12); // 0xaef0 g136 = v3; g134 = v2; g1 = true; g2 = v3 < 0; g3 = v3 == 0; *(int32_t *)(v2 + 64) = *(int32_t *)(v1 + 20); if (v3 != 0) { // 0xaf08 unwind_phase2_forced(ucbp, entry_vrs, 1); // branch -> 0xaf58 // 0xaf58 abort(); // UNREACHABLE } int32_t v4 = *(int32_t *)(v1 + 16); // 0xaf14 g133 = v4; int32_t v5 = g135; // 0xaf18 g128 = v5; g127 = 2; int32_t v6 = g134; // 0xaf20 g132 = v6; g126 = 0xaf28; ((int32_t (*)(int32_t, int32_t, int32_t, int32_t))v4)(2, v5, v6, v4); uint32_t v7 = g127; // 0xaf28 g1 = v7 > 6; g2 = v7 < 7; g3 = v7 == 7; if (v7 == 7) { // 0xaf44 _Unwind_DebugHook((char *)g136, (char *)*(int32_t *)(g134 + 64)); g127 = g134 + 4; restore_core_regs(); // branch -> 0xaf58 } else { // 0xaf30 if (v7 == 8) { // 0xaf38 unwind_phase2((struct _Unwind_Control_Block *)g135, (struct anon_struct_6 *)g134); // branch -> 0xaf44 // 0xaf44 _Unwind_DebugHook((char *)g136, (char *)*(int32_t *)(g134 + 64)); g127 = g134 + 4; restore_core_regs(); // branch -> 0xaf58 } } // 0xaf58 abort(); // UNREACHABLE } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xaf5c - 0xaf7b // Line range: 513 - 522 int32_t __gnu_Unwind_Resume_or_Rethrow(struct _Unwind_Control_Block * ucbp, struct anon_struct_6 * entry_vrs) { int32_t v1 = (int32_t)entry_vrs; // 0xaf5c_1 if (*(int32_t *)((int32_t)ucbp + 12) == 0) { // 0xaf68 __gnu_Unwind_RaiseException(ucbp, entry_vrs); return 9; } // 0xaf6c *(int32_t *)(v1 + 64) = *(int32_t *)(v1 + 60); return unwind_phase2_forced(ucbp, entry_vrs, 0); } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xaf7c - 0xaf7f // Line range: 211 - 528 void _Unwind_Complete(struct _Unwind_Control_Block * ucbp) { // 0xaf7c return; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xaf80 - 0xaf8f // Line range: 212 - 538 void _Unwind_DeleteException(struct _Unwind_Control_Block * exc) { // 0xaf80 return; } // Address range: 0xaf90 - 0xaf97 int32_t function_af90(int32_t a1) { // 0xaf90 g127 = 1; ((int32_t (*)(int32_t))g133)(1); return 1; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xaf98 - 0xaff3 // Line range: 174 - 180 int32_t _Unwind_VRS_Get(struct _Unwind_Context * context, int32_t regclass, int32_t regno, int32_t representation, char * valuep) { // 0xaf98 g128 = regclass; g132 = regno; g133 = representation; return 2; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xaff4 - 0xb01b // Line range: 220 - 225 int32_t _Unwind_GetGR(struct _Unwind_Context * context, int32_t regno) { // 0xaff4 int32_t v1; int32_t val = v1; // bp-12 val = g133; _Unwind_VRS_Get(context, 0, regno, 0, (char *)&val); return val; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xb01c - 0xb077 // Line range: 170 - 211 int32_t _Unwind_VRS_Set(struct _Unwind_Context * context, uint32_t regclass, int32_t regno, int32_t representation, char * valuep) { // 0xb01c g132 = regno; g133 = representation; g1 = regclass > 3; g2 = regclass < 4; g3 = regclass == 4; return 2; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xb078 - 0xb0a3 // Line range: 231 - 234 void _Unwind_SetGR(struct _Unwind_Context * context, int32_t regno, int32_t val) { // 0xb078 g131 = regno; _Unwind_VRS_Set(context, 0, regno, 0, (char *)&val); } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xb0a4 - 0xb16b // Line range: 547 - 598 int32_t __gnu_Unwind_Backtrace(int32_t (*trace)(struct _Unwind_Context *, char *), char * trace_argument, struct anon_struct_6 * entry_vrs) { struct anon_struct_5 v1; struct anon_struct_5 v2; struct _Unwind_Control_Block v3; int32_t v4 = (int32_t)entry_vrs; // 0xb0a4_2 int32_t * v5 = (int32_t *)(v4 + 60); // 0xb0a4_3 int32_t v6 = g135; // 0xb0ac int32_t v7 = g138; // 0xb0ac g137 = (int32_t)trace; int32_t * v8 = (int32_t *)(v4 + 64); // 0xb0b4_0 *v8 = *v5; g138 = (int32_t)trace_argument; int32_t v9 = (int32_t)&v3; // 0xb0c0_0 int32_t v10 = (int32_t)&v1; // 0xb0c8_0 g134 = v10; g136 = v9; v1.e1.e0[0] = *(int32_t *)(v4 + 4); v1.e1.e0[1] = *(int32_t *)(v4 + 8); v1.e1.e0[2] = *(int32_t *)(v4 + 12); v1.e1.e0[3] = *(int32_t *)(v4 + 16); int32_t v11 = (int32_t)&v2; // 0xb0d0_0 v1.e1.e0[4] = *(int32_t *)(v4 + 20); v1.e1.e0[5] = *(int32_t *)(v4 + 24); v1.e1.e0[6] = *(int32_t *)(v4 + 28); v1.e1.e0[7] = *(int32_t *)(v4 + 32); *(int32_t *)(v11 + 16) = *(int32_t *)(v4 + 36); *(int32_t *)(v11 + 20) = *(int32_t *)(v4 + 40); *(int32_t *)(v11 + 24) = *(int32_t *)(v4 + 44); *(int32_t *)(v11 + 28) = *(int32_t *)(v4 + 48); *(int32_t *)(v11 + 32) = *(int32_t *)(v4 + 52); *(int32_t *)(v11 + 36) = *(int32_t *)(v4 + 56); *(int32_t *)(v11 + 40) = *v5; *(int32_t *)(v11 + 44) = *v8; v1.e0 = -1; // branch -> 0xb0f4 int32_t result; // 0xb160 while (true) { // 0xb0f4 if (get_eit_entry(&v3, v1.e1.e0[15]) == 0) { // 0xb110 _Unwind_SetGR((struct _Unwind_Context *)&v1, 12, v9); g127 = v10; int32_t v12 = g138; // 0xb124 g128 = v12; g126 = 0xb12c; ((int32_t (*)(int32_t, int32_t))g137)(v10, v12); int32_t v13 = g127; // 0xb12c g1 = true; g2 = v13 < 0; g3 = v13 == 0; if (v13 == 0) { int32_t v14 = v3.e2.e1; // 0xb134 g133 = v14; g127 = 8; g128 = v9; g132 = v10; g126 = 0xb148; ((int32_t (*)(int32_t, int32_t, int32_t, int32_t))v14)(8, v9, v10, v14); int32_t v15 = g127; // 0xb148 g135 = v15; if ((v15 - 5 & -5) == 0) { // break -> 0xb158 break; } // continue -> 0xb0f4 continue; } } // 0xb108 g135 = 9; // branch -> 0xb158 // 0xb158 restore_non_core_regs(&v1); result = g135; g135 = v6; g138 = v7; return result; } // 0xb158 restore_non_core_regs(&v1); result = g135; g135 = v6; g138 = v7; return result; } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc // Address range: 0xb16c - 0xb557 // Line range: 606 - 855 int32_t __gnu_unwind_pr_common(uint32_t state, struct _Unwind_Control_Block * ucbp, struct _Unwind_Context * context, int32_t id) { struct anon_struct_4 v1; // 0xb16c char * v2; char * matched = v2; // bp-56 int32_t v3 = state; // R0 int32_t v4 = (int32_t)ucbp; // 0xb16c_0 g128 = v4; int32_t v5 = g135; // 0xb16c int32_t v6 = g138; // 0xb16c g137 = (int32_t)context; int32_t v7 = *(int32_t *)(v4 + 76); // 0xb174 g132 = v7; g139 = id; g135 = v4; int32_t v8 = v7 + 4; // 0xb184 int32_t v9 = v8; // R12 int32_t v10 = state % 4; // 0xb188 g138 = v10; int32_t v11 = *(int32_t *)v7; // 0xb18c g134 = v11; v1.e1 = (int32_t *)v8; v1.e0 = v11; int32_t v12; // 0xb310_0 int32_t v13; // 0xb4f4 int32_t v14; // 0xb220 int32_t v15; // 0xb4b8 int32_t v16; // 0xb1f0 int32_t v17; // 0xb1f8 int32_t v18; // 0xb2002026 int32_t v19; // 0xb200202643 int32_t v20; // 0xb21c45 int32_t v21; // 0xb1e4 int32_t v22; // 0xb2002228 int32_t v23; // 0xb4dc6 int32_t v24; int32_t v25; if (id == 0) { int32_t v26 = 256 * v11; // 0xb19c g134 = v26; v1.e0 = v26; v1.e2 = 3; v19 = v8; // branch -> 0xb1dc } else { // 0xb1b4 if (id <= 2) { int32_t v27 = 0x10000 * v11; // 0xb1c4 g134 = v27; g132 = 2; v1.e0 = v27; v1.e2 = 2; int32_t v28 = 4 * (v11 / 0x10000 % 256) + v8; // 0xb1d8 v9 = v28; v19 = v28; // branch -> 0xb1dc } else { v19 = v8; } // 0xb1dc v18 = v19; if (v10 == 2) { // if_b1e4_0_true v21 = *(int32_t *)(v4 + 56); v9 = v21; v18 = v21; // branch -> after_if_b1e4_0 } // after_if_b1e4_0 if (*(int32_t *)(v4 + 80) % 2 == 0) { // 0xb1f0 v16 = state ^ 8; v17 = v16 / 8 % 2; v22 = *(int32_t *)v18; g134 = v22; int32_t result; // 0xb550_2 if (v22 == 0) { // 0xb4b8 v23 = 0; // branch -> 0xb4b8 // 0xb4b8 if (g139 < 3) { // 0xb4d4 __gnu_unwind_execute((struct _Unwind_Context_1 *)g137, (struct anon_struct_13 *)&v1); // branch -> 0xb524 } else { // 0xb4d4 __gnu_unwind_24bit((struct _Unwind_Context *)v16, g128, g132); if (g127 == 0) { // 0xb4dc g133 = v23; if (v23 == 0) { // if_b4e4_0_true result = 8; // branch -> 0xb54c } else { // 0xb4ec v13 = _Unwind_GetGR((struct _Unwind_Context *)g137, 15); _Unwind_SetGR((struct _Unwind_Context *)g137, 14, v13); // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)g137, 15, g11); result = 7; // branch -> 0xb54c } // 0xb54c g135 = v5; g138 = v6; return result; } } // 0xb524 // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 9; } // 0xb20c v12 = (int32_t)&matched; v24 = 0; // branch -> 0xb20c while (true) { // 0xb20c v14 = v18; // branch -> 0xb20c lab_0xb20c:; int32_t v29; // 0xb4c0 int32_t v30; // 0xb518 int32_t v31; // 0xb4c0 int32_t v32; // 0xb518 int32_t v33; // 0xb4c0 int32_t v34; // 0xb518 int32_t v35; int32_t v36; int32_t v37; int32_t v38; // 0xb4c8 int32_t v39; // 0xb4f0 int32_t v40; // 0xb500 int32_t v41; // 0xb50c while (true) { int32_t v42 = *(int32_t *)(g135 + 72); // 0xb210 g133 = v42; int32_t v43; // 0xb21c if (g139 == 2) { // if_b21c_0_true v43 = *(int32_t *)(v14 + 4); g136 = v14 + 8; // branch -> after_if_b22c_0 } else { // if_b224_0_true g136 = v14 + 4; g134 = (int32_t)*(int16_t *)v14; v43 = (int32_t)*(int16_t *)(v14 + 2); // branch -> after_if_b22c_0 } uint32_t v44 = _Unwind_GetGR((struct _Unwind_Context *)g137, 15); // 0xb238 v3 = v44; uint32_t v45 = (v43 & -2) + v42; // 0xb23c int32_t v46; // 0xb260 if (v45 > v44) { // if_b240_0_true v9 = 0; v46 = g134; // branch -> 0xb25c } else { int32_t v47 = g134; // 0xb248 int32_t v48 = v47 & -2; // 0xb248 g133 = v48; if (v44 < v48 + v45) { // if_b254_0_true v9 = 1; v46 = v47; // branch -> 0xb25c } else { v46 = v47; } } int32_t v49 = -((v43 % 2)) & 2 | v46 % 2; // 0xb264 int32_t v50 = v49; // R4 int32_t v51; switch ((int2_t)v49) { default: { // 0xb274 if (v49 == 2) { float32_t v52 = fabsf((float32_t)*(int32_t *)g136); v50 = v52; int32_t v53; // 0xb4dc7 if (g138 != 0) { int32_t v54 = _Unwind_GetGR((struct _Unwind_Context *)g137, 13); // 0xb424 v3 = v54; if (*(int32_t *)(g135 + 32) != v54) { v53 = v24; goto lab_0xb498_4; } int32_t * v55 = (int32_t *)(g135 + 40); // 0xb430_0 if (g136 != *v55) { v53 = v24; goto lab_0xb498_4; } // 0xb43c v43 = 0; int32_t v56 = 4; // R3 *v55 = v50; *(int32_t *)(g135 + 48) = v56; *(int32_t *)(g135 + 44) = v43; *(int32_t *)(g135 + 52) = g136 + v56; int32_t v57 = g136; // 0xb458 if (*(int32_t *)v57 >= v43) { // 0xb490 v53 = 1; // branch -> 0xb498 goto lab_0xb498_4; // 0xb54c g135 = v5; g138 = v6; return result; } int32_t v63 = selfrel_offset31((int32_t *)(v57 + 4 + 4 * v50)); // 0xb46c _Unwind_SetGR((struct _Unwind_Context *)g137, 15, v63); // branch -> 0xb488 // 0xb488 // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)g137, v43, g135); // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 7; } // 0xb3b0 int32_t v58; // 0xb498 int32_t v59; // 0xb4a8 if (v9 != 0) { // 0xb3b8 g133 = v17; if ((int32_t)v52 == 0) { // after_if_b3c0_0.thread g133 = 1; // branch -> 0xb3cc } else { // after_if_b3c0_0 if (v17 == 0) { v53 = v24; lab_0xb498_4: // 0xb498 v58 = g136; v59 = v58; if (*(int32_t *)v58 < 0) { lab_if_b4a4_0_true:; int32_t v60 = v58 + 4; // 0xb4a4 g136 = v60; v59 = v60; // branch -> after_if_b4a4_0 } lab_after_if_b4a4_0:; int32_t v61 = v59 + 4 * (v50 + 1); // 0xb4a8 v9 = v61; int32_t v62 = *(int32_t *)v61; // 0xb20022 g134 = v62; if (v62 == 0) { v25 = v53; // break (via goto) -> 0xb4b8 goto lab_0xb4b8_2; } v20 = v61; v24 = v53; // continue (via goto) -> 0xb20c goto lab_0xb20c_2; } } int32_t v64 = g135 + 88; // 0xb3cc if ((int32_t)v52 == 0) { // 0xb52c *(int32_t *)(g135 + 32) = _Unwind_GetGR((struct _Unwind_Context *)g137, 13); // branch -> 0xb540 // 0xb540 *(int32_t *)(g135 + 36) = (int32_t)matched; *(int32_t *)(g135 + 40) = g136; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 6; } int32_t v65 = 0; // 0xb3e099 // branch -> 0xb3e0 while (true) { int32_t v66 = v65 + 1; // 0xb3e0 v43 = v66; matched = (char *)v64; int32_t v67 = g136 + 4 * v66; // 0xb3ec _Unwind_decode_typeinfo_ptr(v67, g128); g132 = 0; g133 = v12; g128 = v67; bool v68 = __cxa_type_match((int32_t *)g135, (int32_t *)v67, NULL); // 0xb404 v3 = v68; if (v68) { v53 = v24; goto lab_0xb498_4; } int32_t v69 = v43; if (v69 != v50) { // 0xb3e0 v65 = v69; // branch -> 0xb3e0 continue; } } // 0xb4b8 v36 = g139; v15 = v36; v23 = v25; // branch -> 0xb4b8 // 0xb4b8 if (v15 < 3) { // 0xb4d4 v38 = g137; __gnu_unwind_execute((struct _Unwind_Context_1 *)v38, (struct anon_struct_13 *)&v1); // branch -> 0xb524 // 0xb524 result = 9; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return result; } // 0xb4d4 v29 = v3; v31 = g128; v33 = g132; __gnu_unwind_24bit((struct _Unwind_Context *)v29, v31, v33); v37 = g127; if (v37 == 0) { // 0xb4dc g133 = v23; if (v23 == 0) { // if_b4e4_0_true result = 8; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return result; } // 0xb4ec v39 = g137; v13 = _Unwind_GetGR((struct _Unwind_Context *)v39, 15); v40 = g137; _Unwind_SetGR((struct _Unwind_Context *)v40, 14, v13); v41 = g137; v35 = g11; v34 = v35; v32 = 15; v30 = v41; // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)v30, v32, v34); result = 7; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return result; } // 0xb524 result = 9; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return result; } v53 = v24; // 0xb498 v58 = g136; if (*(int32_t *)v58 < 0) { goto lab_if_b4a4_0_true; } v59 = v58; goto lab_after_if_b4a4_0; } // 0xb524 // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 9; } case 1: { // 0xb2d0 if (g138 != 0) { int32_t v70 = _Unwind_GetGR((struct _Unwind_Context *)g137, 13); // 0xb35c v3 = v70; if (*(int32_t *)(g135 + 32) == v70) { int32_t v71 = *(int32_t *)(g135 + 40); // 0xb368 if (g136 == v71) { int32_t v72 = selfrel_offset31((int32_t *)v71); // 0xb378 _Unwind_SetGR((struct _Unwind_Context *)g137, 15, v72); // branch -> 0xb488 // 0xb488 // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)g137, 0, g135); // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 7; } } lab_0xb398_2: // 0xb398 v51 = g136 + 8; // branch -> 0xb200 lab_0xb200: // 0xb200 v9 = v51; int32_t v73 = *(int32_t *)v51; // 0xb200 g134 = v73; if (v73 == 0) { v25 = v24; // break (via goto) -> 0xb4b8 goto lab_0xb4b8_2; } v14 = v51; // continue -> 0xb20c continue; } break; } case 0: { int32_t v74 = 0; if (g138 != 0) { // if_b288_0_true v74 = v9 % 2; // branch -> after_if_b288_0 } int32_t v75 = g136; // 0xb28c int32_t v76 = v75 + 4; // 0xb28c v43 = v76; if (v74 == 0) { v51 = v76; goto lab_0xb200; } int32_t v77 = selfrel_offset31((int32_t *)v75); // 0xb29c *(int32_t *)(g135 + 56) = v43; if (!__cxa_begin_cleanup((int32_t *)g135)) { // 0xb524 // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 9; } // 0xb2b8 // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)g137, 15, v77); // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 7; } } // 0xb2d8 if (v9 == 0) { goto lab_0xb398_2; } int32_t v78 = g136; // 0xb2e0 int32_t v79 = v78 + 4; // 0xb2e0 int32_t * v80 = (int32_t *)v79; // 0xb2e0_0 int32_t v81 = *v80; // 0xb2e0 g133 = v81; if (v81 == -2) { // 0xb524 // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 9; } // 0xb2f4 matched = (char *)(g135 + 88); int32_t v82; // 0xb338_0 int32_t v83; // 0xb330 int32_t v84; // 0xb33c int32_t v85; // 0xb348 if (v81 == -1) { // 0xb328 v83 = _Unwind_GetGR((struct _Unwind_Context *)g137, 13); v82 = (int32_t)matched; v84 = g135; if (v50 == 2) { // if_b348_0_true *(int32_t *)(v84 + 32) = v83; v85 = v84 + 44; *(int32_t *)v85 = v82; // branch -> 0xb540 // 0xb540 *(int32_t *)(g135 + 36) = v85; *(int32_t *)(g135 + 40) = g136; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 6; } // after_if_b340_0 *(int32_t *)(v84 + 32) = v83; // branch -> 0xb540 // 0xb540 *(int32_t *)(g135 + 36) = v82; *(int32_t *)(g135 + 40) = g136; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 6; } // 0xb304 _Unwind_decode_typeinfo_ptr(v79, g128); int32_t v86 = *(int32_t *)v78 < 0; // 0xb30c g132 = v86; g133 = v12; g128 = v79; bool v87 = __cxa_type_match((int32_t *)g135, v80, (char **)v86); // 0xb31c int32_t v88 = v87; // 0xb31c_7 v3 = v88; v50 = v88; if (!v87) { goto lab_0xb398_2; } // 0xb328 v83 = _Unwind_GetGR((struct _Unwind_Context *)g137, 13); v82 = (int32_t)matched; v84 = g135; if (v50 == 2) { // if_b348_0_true *(int32_t *)(v84 + 32) = v83; v85 = v84 + 44; *(int32_t *)v85 = v82; // branch -> 0xb540 // 0xb540 *(int32_t *)(g135 + 36) = v85; *(int32_t *)(g135 + 40) = g136; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 6; } // after_if_b340_0 *(int32_t *)(v84 + 32) = v83; // branch -> 0xb540 // 0xb540 *(int32_t *)(g135 + 36) = v82; *(int32_t *)(g135 + 40) = g136; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return 6; } // 0xb4b8 v36 = g139; v15 = v36; v23 = v25; // branch -> 0xb4b8 // 0xb4b8 if (v15 < 3) { // 0xb4d4 v38 = g137; __gnu_unwind_execute((struct _Unwind_Context_1 *)v38, (struct anon_struct_13 *)&v1); // branch -> 0xb524 // 0xb524 result = 9; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return result; } // 0xb4d4 v29 = v3; v31 = g128; v33 = g132; __gnu_unwind_24bit((struct _Unwind_Context *)v29, v31, v33); v37 = g127; if (v37 == 0) { // 0xb4dc g133 = v23; if (v23 == 0) { // if_b4e4_0_true result = 8; // branch -> 0xb54c // 0xb54c g135 = v5; g138 = v6; return result; } // 0xb4ec v39 = g137; v13 = _Unwind_GetGR((struct _Unwind_Context *)v39, 15); v40 = g137; _Unwind_SetGR((struct _Unwind_Context *)v40, 14, v13); v41 = g137; v35 = g11; v34 = v35; v32 = 15; v30 = v41; // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)v30, v32, v34); result = 7; // branch -> 0xb54c // Detected a possible infinite recursion (goto support failed); quitting... // Detected a possible infinite recursion (goto support failed); quitting... } // 0xb524 result = 9; // branch -> 0xb54c // Detected a possible infinite recursion (goto support failed); quitting... } } else { // 0xb4b0 v23 = 0; // branch -> 0xb4b8 } // 0xb4b8 if (id < 3) { // 0xb4d4 __gnu_unwind_execute((struct _Unwind_Context_1 *)g137, (struct anon_struct_13 *)&v1); // branch -> 0xb524 } else { // 0xb4d4 __gnu_unwind_24bit((struct _Unwind_Context *)v3, g128, g132); if (g127 == 0) { // 0xb4dc g133 = v23; if (v23 == 0) { // if_b4e4_0_true // branch -> 0xb54c } else { // 0xb4ec v13 = _Unwind_GetGR((struct _Unwind_Context *)g137, 15); _Unwind_SetGR((struct _Unwind_Context *)g137, 14, v13); // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)g137, 15, g11); // branch -> 0xb54c } // Detected a possible infinite recursion (goto support failed); quitting... } } // 0xb524 // branch -> 0xb54c // Detected a possible infinite recursion (goto support failed); quitting... } // 0xb1dc v18 = v19; if (v10 == 2) { // if_b1e4_0_true v21 = *(int32_t *)(v4 + 56); v9 = v21; v18 = v21; // branch -> after_if_b1e4_0 } // after_if_b1e4_0 if (*(int32_t *)(v4 + 80) % 2 == 0) { // 0xb1f0 v16 = state ^ 8; v3 = v16; v17 = v16 / 8 % 2; v22 = *(int32_t *)v18; g134 = v22; if (v22 == 0) { v25 = 0; lab_0xb4b8_2: // 0xb4b8 v15 = g139; v23 = v25; // branch -> 0xb4b8 // 0xb4b8 if (v15 < 3) { // 0xb4d4 __gnu_unwind_execute((struct _Unwind_Context_1 *)g137, (struct anon_struct_13 *)&v1); // branch -> 0xb524 } else { // 0xb4d4 __gnu_unwind_24bit((struct _Unwind_Context *)v3, g128, g132); if (g127 == 0) { // 0xb4dc g133 = v23; if (v23 == 0) { // if_b4e4_0_true // branch -> 0xb54c } else { // 0xb4ec v13 = _Unwind_GetGR((struct _Unwind_Context *)g137, 15); _Unwind_SetGR((struct _Unwind_Context *)g137, 14, v13); // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)g137, 15, g11); // branch -> 0xb54c } // Detected a possible infinite recursion (goto support failed); quitting... } } // 0xb524 // branch -> 0xb54c // Detected a possible infinite recursion (goto support failed); quitting... } else { // 0xb20c v12 = (int32_t)&matched; v20 = v18; v24 = 0; // branch -> 0xb20c lab_0xb20c_2: while (true) { // 0xb20c v14 = v20; // branch -> 0xb20c goto lab_0xb20c; } } } else { // 0xb4b0 v15 = id; v23 = 0; // branch -> 0xb4b8 } // 0xb4b8 if (v15 < 3) { // 0xb4d4 __gnu_unwind_execute((struct _Unwind_Context_1 *)g137, (struct anon_struct_13 *)&v1); // branch -> 0xb524 } else { // 0xb4d4 __gnu_unwind_24bit((struct _Unwind_Context *)v3, g128, g132); if (g127 == 0) { // 0xb4dc g133 = v23; if (v23 == 0) { // if_b4e4_0_true // branch -> 0xb54c } else { // 0xb4ec v13 = _Unwind_GetGR((struct _Unwind_Context *)g137, 15); _Unwind_SetGR((struct _Unwind_Context *)g137, 14, v13); // branch -> 0xb518 // 0xb518 _Unwind_SetGR((struct _Unwind_Context *)g137, 15, g11); // branch -> 0xb54c } // Detected a possible infinite recursion (goto support failed); quitting... } } // 0xb524 // branch -> 0xb54c // Detected a possible infinite recursion (goto support failed); quitting... } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/config/arm/unwind-arm.c // Address range: 0xb558 - 0xb55f // Line range: 490 - 494 int32_t __aeabi_unwind_cpp_pr0(int32_t state, struct _Unwind_Control_Block * ucbp, struct _Unwind_Context * context) { // 0xb558 return __gnu_unwind_pr_common(state, ucbp, context, 0); } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/config/arm/unwind-arm.c // Address range: 0xb560 - 0xb567 // Line range: 498 - 502 int32_t __aeabi_unwind_cpp_pr1(int32_t state, struct _Unwind_Control_Block * ucbp, struct _Unwind_Context * context) { // 0xb560 return __gnu_unwind_pr_common(state, ucbp, context, 1); } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/config/arm/unwind-arm.c // Address range: 0xb568 - 0xb56f // Line range: 506 - 510 int32_t __aeabi_unwind_cpp_pr2(int32_t state, struct _Unwind_Control_Block * ucbp, struct _Unwind_Context * context) { // 0xb568 return __gnu_unwind_pr_common(state, ucbp, context, 2); } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xb570 - 0xb8cf // Line range: 178 - 446 int32_t _Unwind_VRS_Pop(struct _Unwind_Context * context, int32_t regclass, int32_t discriminator, int32_t representation) { // 0xb570 return 2; } // Address range: 0xb8d0 - 0xb8e3 void restore_core_regs(void) { int32_t v1 = g127; // 0xb8d0 int32_t v2 = *(int32_t *)(v1 + 60); // 0xb8d4 g135 = v2; int32_t v3 = *(int32_t *)v1; // 0xb8dc g127 = v3; int32_t v4 = *(int32_t *)(v1 + 4); // 0xb8dc g128 = v4; int32_t v5 = *(int32_t *)(v1 + 8); // 0xb8dc g132 = v5; int32_t v6 = *(int32_t *)(v1 + 12); // 0xb8dc g133 = v6; g134 = *(int32_t *)(v1 + 16); g135 = *(int32_t *)(v1 + 20); g136 = *(int32_t *)(v1 + 24); g137 = *(int32_t *)(v1 + 28); g138 = *(int32_t *)(v1 + 32); g139 = *(int32_t *)(v1 + 36); g129 = *(int32_t *)(v1 + 40); g130 = *(int32_t *)(v1 + 44); g126 = *(int32_t *)(v1 + 56); ((int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))v2)(v3, v4, v5, v6, v2); } // Address range: 0xb8e4 - 0xb8eb void __gnu_Unwind_Restore_VFP(void) { // 0xb8e4 return; } // Address range: 0xb8ec - 0xb8f3 void __gnu_Unwind_Save_VFP(void) { // 0xb8ec return; } // Address range: 0xb8f4 - 0xb8fb void __gnu_Unwind_Restore_VFP_D(void) { // 0xb8f4 return; } // Address range: 0xb8fc - 0xb903 void __gnu_Unwind_Save_VFP_D(void) { // 0xb8fc return; } // Address range: 0xb904 - 0xb90b void __gnu_Unwind_Restore_VFP_D_16_to_31(void) { // 0xb904 return; } // Address range: 0xb90c - 0xb913 void __gnu_Unwind_Save_VFP_D_16_to_31(void) { // 0xb90c return; } // Address range: 0xb914 - 0xb957 void __gnu_Unwind_Restore_WMMXD(void) { // 0xb914 return; } // Address range: 0xb958 - 0xb99b void __gnu_Unwind_Save_WMMXD(void) { // 0xb958 return; } // Address range: 0xb99c - 0xb9af void __gnu_Unwind_Restore_WMMXC(void) { // 0xb99c return; } // Address range: 0xb9b0 - 0xb9c3 void __gnu_Unwind_Save_WMMXC(void) { // 0xb9b0 return; } // Address range: 0xb9c4 - 0xb9e7 int32_t _Unwind_RaiseException(struct _Unwind_Control_Block * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13) { int32_t v1 = 0; // bp-68 __gnu_Unwind_RaiseException(a1, (struct anon_struct_6 *)&v1); return 9; } // Address range: 0xb9e8 - 0xba0b int32_t ___Unwind_Resume(struct _Unwind_Control_Block * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13) { int32_t v1 = 0; // bp-68 __gnu_Unwind_Resume(a1, (struct anon_struct_6 *)&v1); return 0; } // Address range: 0xba0c - 0xba2f int32_t ___Unwind_Resume_or_Rethrow(struct _Unwind_Control_Block * a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13) { int32_t v1 = 0; // bp-68 return __gnu_Unwind_Resume_or_Rethrow(a1, (struct anon_struct_6 *)&v1); } // Address range: 0xba30 - 0xba53 int32_t _Unwind_ForcedUnwind(struct _Unwind_Control_Block * a1, int32_t (*a2)(int32_t, int32_t, char *, struct _Unwind_Control_Block *, struct _Unwind_Context *, char *), char * a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13) { int32_t v1 = 0; // bp-68 return __gnu_Unwind_ForcedUnwind(a1, a2, a3, (struct anon_struct_6 *)&v1); } // Address range: 0xba54 - 0xba77 int32_t ___Unwind_Backtrace(int32_t (*a1)(struct _Unwind_Context *, char *), char * a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9, int32_t a10, int32_t a11, int32_t a12, int32_t a13) { int32_t v1 = 0; // bp-68 return __gnu_Unwind_Backtrace(a1, a2, (struct anon_struct_6 *)&v1); } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/config/arm/pr-support.c // Address range: 0xba78 - 0xbad7 // Line range: 80 - 100 char next_unwind_byte(struct anon_struct_13 * uws) { int32_t v1 = (int32_t)uws; // 0xba78_0 char * v2 = (char *)(v1 + 8); // 0xba78_1 char v3 = *v2; // 0xba78 int32_t * v4; int32_t v5; if (v3 == 0) { char * v6 = (char *)(v1 + 9); // 0xba84_0 char v7 = *v6; // 0xba84 if (v7 == 0) { // 0xbad0 return -80; } // 0xba90 *v6 = (char)((int32_t)v7 - 1); int32_t * v8 = (int32_t *)(v1 + 4); // 0xba98_0 int32_t v9 = *v8; // 0xba98 *v8 = v9 + 4; uws->e0 = *(int32_t *)v9; v4 = &uws->e0; v5 = 3; // branch -> 0xbab8 } else { // 0xbab4 v4 = &uws->e0; v5 = (int32_t)v3 - 1; // branch -> 0xbab8 } // 0xbab8 *v2 = (char)v5; int32_t v10 = *v4; // 0xbabc *v4 = 256 * v10; return v10 / 0x1000000; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xbad8 - 0xbaff // Line range: 220 - 225 void _Unwind_GetGR_1(struct _Unwind_Context_1 * context, int32_t regno) { int32_t v1 = g133; // bp-12 _Unwind_VRS_Get((struct _Unwind_Context *)context, 0, 12, 0, (char *)&v1); } // From module: /usr/local/google/buildbot/src/android/gcc/toolchain/build/../gcc/gcc-4.9/libgcc/config/arm/pr-support.c // Address range: 0xbb00 - 0xbb03 // Line range: 337 - 339 struct _Unwind_Control_Block_1 * unwind_UCB_from_context(struct _Unwind_Context_1 * context) { // 0xbb00 _Unwind_GetGR_1(context, g128); return (struct _Unwind_Control_Block_1 *)context; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xbb04 - 0xbe9b // Line range: 216 - 309 int32_t __gnu_unwind_execute(struct _Unwind_Context_1 * context, struct anon_struct_13 * uws) { // 0xbb04 int32_t v1; int32_t reg = v1; // bp-36 int32_t v2 = (int32_t)uws; // 0xbb04_1 int32_t v3 = g135; // 0xbb04 int32_t v4 = g138; // 0xbb04 g135 = (int32_t)context; int32_t v5 = ® // 0xbb7c_0 // branch -> 0xbb18 while (true) { uint32_t v6 = (int32_t)next_unwind_byte((struct anon_struct_13 *)v2); // 0xbb1c_3 int32_t v7 = v6; // R4 if ((v6 & 128) != 0) { int32_t v8 = v6 & 240; // 0xbbb8 if (v8 == 128) { int32_t v9 = (int32_t)next_unwind_byte((struct anon_struct_13 *)v2) | 256 * v6; // 0xbbd0 if (v9 != 0x8000) { // 0xbbe4 _Unwind_VRS_Pop((struct _Unwind_Context *)g135, 0, 16 * v9 & 0xfff0, 0); // branch -> 0xbe94 // 0xbe94 g135 = v3; g138 = v4; return 9; } // 0xbe94 g135 = v3; g138 = v4; return 9; } // 0xbc10 if (v8 == 144) { // 0xbc18 if ((v6 & 13) != 13) { // 0xbc24 g138 = v5; _Unwind_VRS_Get((struct _Unwind_Context *)g135, 0, v6 % 16, 0, (char *)®); // branch -> 0xbc44 // 0xbc44 _Unwind_VRS_Set((struct _Unwind_Context *)g135, 0, 13, 0, (char *)g138); // branch -> 0xbb18 continue; } // 0xbe94 g135 = v3; g138 = v4; return 9; } // 0xbc5c if (v8 == 160) { int32_t v10 = (int32_t)"trstr" >> (v6 % 8 ^ 7) & (int32_t)"trstr"; // 0xbc7c int32_t v11; // 0xbe80 if ((v6 & 8) != 0) { // if_bc84_0_true v11 = v10 | 0x4000; // branch -> 0xbe80 } else { v11 = v10; } // 0xbe80 _Unwind_VRS_Pop((struct _Unwind_Context *)g135, 0, v11, 0); // branch -> 0xbe94 // 0xbe94 g135 = v3; g138 = v4; return 9; } // 0xbc8c if (v8 == 176) { // 0xbc94 if ((v6 & 252) != 180) { // 0xbd64 // branch -> 0xbe80 // 0xbe80 _Unwind_VRS_Pop((struct _Unwind_Context *)g135, 1, v6 % 8 + 1 | 0x80000, 1); // branch -> 0xbe94 // 0xbe94 g135 = v3; g138 = v4; return 9; } // 0xbe94 g135 = v3; g138 = v4; return 9; } int32_t v12 = v6 & 248; // 0xbddc if (v8 == 192) { // 0xbd84 if (v12 != 192) { // 0xbe00 // branch -> 0xbe94 // 0xbe94 g135 = v3; g138 = v4; return 9; } // 0xbde8 // branch -> 0xbe80 // 0xbe80 _Unwind_VRS_Pop((struct _Unwind_Context *)g135, 3, v6 % 16 + 1 | 0xa0000, 3); // branch -> 0xbe94 // 0xbe94 g135 = v3; g138 = v4; return 9; } // 0xbe5c if (v12 != 208) { // 0xbe94 g135 = v3; g138 = v4; return 9; } // 0xbe68 // branch -> 0xbe80 // 0xbe80 _Unwind_VRS_Pop((struct _Unwind_Context *)g135, 1, v6 % 8 + 1 | 0x80000, 5); // branch -> 0xbe94 // 0xbe94 g135 = v3; g138 = v4; return 9; } int32_t v13 = 4 * v6; // 0xbb78 g138 = v13; _Unwind_VRS_Get((struct _Unwind_Context *)g135, 0, 13, 0, (char *)®); int32_t v14 = v13 & 252; // 0xbb94 int32_t v15 = ((v7 & 64) == 0 ? v14 + 4 : -4 - v14) + reg; g138 = v15; reg = v15; // branch -> 0xbc44 // 0xbc44 _Unwind_VRS_Set((struct _Unwind_Context *)g135, 0, 13, 0, (char *)v5); // branch -> 0xbb18 } } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xbe9c - 0xbedb // Line range: 214 - 332 int32_t __gnu_unwind_frame(struct _Unwind_Control_Block_1 * ucbp, struct _Unwind_Context_1 * context) { struct anon_struct_13 v1; v1.e0 = (int32_t)context; v1.e1 = (int32_t *)g132; v1.e2 = g133; int32_t v2 = *(int32_t *)((int32_t)ucbp + 76); // 0xbea0 v1.e0 = 256 * *(int32_t *)(v2 + 4); v1.e1 = (int32_t *)(v2 + 8); v1.e2 = 3; v1.e2 = *(char *)(v2 + 7); __gnu_unwind_execute(context, &v1); return 9; } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xbedc - 0xbeeb // Line range: 236 - 351 int32_t _Unwind_GetRegionStart(struct _Unwind_Context_1 * context) { // 0xbedc return *(int32_t *)((int32_t)unwind_UCB_from_context(context) + 72); } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xbeec - 0xbf07 // Line range: 237 - 370 char * _Unwind_GetLanguageSpecificData(struct _Unwind_Context_1 * context) { int32_t v1 = *(int32_t *)((int32_t)unwind_UCB_from_context(context) + 76); // 0xbef4 return (char *)(v1 + 8 + 4 * (int32_t)*(char *)(v1 + 7)); } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xbf08 - 0xbf0f // Line range: 189 - 378 int32_t _Unwind_GetDataRelBase(struct _Unwind_Context_1 * context) { // 0xbf08 abort(); // UNREACHABLE } // From module: /usr/local/google/buildbot/tmp/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h // Address range: 0xbf10 - 0xbf17 // Line range: 191 - 384 int32_t _Unwind_GetTextRelBase(struct _Unwind_Context_1 * context) { // 0xbf10 abort(); // UNREACHABLE } // --------------- Dynamically Linked Functions --------------- // void __aeabi_memcpy(void * dest, const void * src, size_t n); // void __aeabi_memcpy4(int32_t a1, int32_t a2, int32_t a3); // int __cxa_atexit(void(* func)(void *), void * arg, void * dso_handle); // bool __cxa_begin_cleanup(_Unwind_Control_Block * ucbp); // bool __cxa_type_match(_Unwind_Control_Block * ucbp, const type_info * rttip, void ** matched_object); // _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc, int * pcount); // void __libc_init(const struct ProgramVars * vars, void(* atfork_prepare)(void), void(* atfork_parent)(void), void(* atfork_child)(void), const char ** apple); // void abort(void); // void * calloc(size_t nmemb, size_t size); // void exit(int status); // int fclose(FILE * stream); // int feof(FILE * stream); // FILE * fopen(const char * restrict filename, const char * restrict modes); // int fprintf(FILE * restrict stream, const char * restrict format, ...); // int fputs(const char * restrict s, FILE * restrict stream); // size_t fread(void * restrict ptr, size_t size, size_t n, FILE * restrict stream); // void free(void * ptr); // int fseek(FILE * stream, long int off, int whence); // long int ftell(FILE * stream); // size_t fwrite(const void * restrict ptr, size_t size, size_t n, FILE * restrict s); // int getc(FILE * stream); // void * malloc(size_t size); // void * memchr(void * s, int c, size_t n); // void * memcpy(void * restrict dest, const void * restrict src, size_t n); // int printf(const char * restrict format, ...); // int putc(int c, FILE * stream); // int putchar(int c); // int puts(const char * s); // void qsort(void * base, size_t nmemb, size_t size, __compar_fn_t compar); // void * realloc(void * ptr, size_t size); // int sprintf(char * restrict s, const char * restrict format, ...); // char * strchr(char * s, int c); // int strcmp(const char * s1, const char * s2); // char * strcpy(char * restrict dest, const char * restrict src); // size_t strcspn(const char * s, const char * reject); // size_t strlen(const char * s); // int strncmp(const char * s1, const char * s2, size_t n); // size_t strspn(const char * s, const char * accept); // char * strstr(char * haystack, const char * needle); // long long int strtoll(const char * restrict nptr, char ** restrict endptr, int base); // unsigned long long int strtoull(const char * restrict nptr, char ** restrict endptr, int base); // --------------- Instruction-Idiom Functions ---------------- // float32_t fabsf(float32_t a1); // int32_t llvm_ctlz_i32(int32_t a1, bool a2); // --------------------- Meta-Information --------------------- // Detected compiler/packer: gcc (4.9) // Detected language: C // Detected functions: 223 // Decompiler release: v2.2.1 (2016-09-07) // Decompilation date: 2017-12-13 12:53:17