Revision: 81411 http://trac.macports.org/changeset/81411 Author: fotanus@macports.org Date: 2011-07-29 21:26:36 -0700 (Fri, 29 Jul 2011) Log Message: ----------- Cleanup on C extension More might be done, but this cleanup removes some code duplicity Modified Paths: -------------- branches/gsoc11-post-destroot/base/src/pextlib1.0/macho.c Modified: branches/gsoc11-post-destroot/base/src/pextlib1.0/macho.c =================================================================== --- branches/gsoc11-post-destroot/base/src/pextlib1.0/macho.c 2011-07-30 04:25:17 UTC (rev 81410) +++ branches/gsoc11-post-destroot/base/src/pextlib1.0/macho.c 2011-07-30 04:26:36 UTC (rev 81411) @@ -39,13 +39,6 @@ return macho_read(input, result, length); } -/* return a human readable formatted version number. the result must be free()'d. */ -char *macho_format_dylib_version (uint32_t version) { - char *result; - asprintf(&result, "%"PRIu32".%"PRIu32".%"PRIu32, (version >> 16) & 0xFF, (version >> 8) & 0xFF, version & 0xFF); - return result; -} - /* Some byteswap wrappers */ static uint32_t macho_swap32 (uint32_t input) { return OSSwapInt32(input); @@ -55,96 +48,106 @@ return input; } -/* Parse a Mach-O header */ -Tcl_Obj * list_macho_dlibs_l(macho_input_t *input, Tcl_Interp * interp, Tcl_Obj * dlibs) { - /* Read the file type. */ - const uint32_t *magic = macho_read(input, input->data, sizeof(uint32_t)); - /* Parse the Mach-O header */ - bool m64 = false; - bool universal = false; - uint32_t (*swap32)(uint32_t) = macho_nswap32; +/* If the file is a universal binary, this function is called to call the callback function on each header */ +Tcl_Obj * handle_universal(macho_input_t *input, Tcl_Interp * interp, const struct fat_header * fat_header, + Tcl_Obj* (*callback_func)(macho_input_t *, Tcl_Interp *, Tcl_Obj *) ){ + uint32_t i; + uint32_t nfat = OSSwapBigToHostInt32(fat_header->nfat_arch); + const struct fat_arch *archs = macho_offset(input, fat_header, sizeof(struct fat_header), sizeof(struct fat_arch)); + Tcl_Obj * return_list = Tcl_NewListObj(0,NULL); + if (archs == NULL) + return (Tcl_Obj *)TCL_ERROR; - const struct mach_header *header; - const struct mach_header_64 *header64; - size_t header_size; - const struct fat_header *fat_header; + for (i = 0; i < nfat; i++) { + const struct fat_arch *arch = macho_read(input, archs + i, sizeof(struct fat_arch)); + macho_input_t arch_input; + if (arch == NULL) + return (Tcl_Obj *)TCL_ERROR; - const NXArchInfo *archInfo; - const struct load_command *cmd; - uint32_t ncmds; - uint32_t i; + /* Fetch a pointer to the architecture's Mach-O header. */ + arch_input.length = OSSwapBigToHostInt32(arch->size); + arch_input.data = macho_offset(input, input->data, OSSwapBigToHostInt32(arch->offset), arch_input.length); + if (arch_input.data == NULL) + return (Tcl_Obj *)TCL_ERROR; + /* Parse the architecture's Mach-O header */ + if (!callback_func(&arch_input, interp, return_list)) + return (Tcl_Obj *)TCL_ERROR; + } + return return_list; +} - if (magic == NULL) - return (Tcl_Obj *)TCL_ERROR; +Tcl_Obj * check_magic(const uint32_t magic, macho_input_t *input, bool * universal, uint32_t (**swap32)(uint32_t), const struct mach_header ** header, size_t * header_size){ + const struct mach_header_64 *header64; - switch (*magic) { + switch (magic) { case MH_CIGAM: - swap32 = macho_swap32; + *swap32 = macho_swap32; /* Fall-through */ case MH_MAGIC: - header_size = sizeof(*header); - header = macho_read(input, input->data, header_size); - if (header == NULL) { - return false; + *header_size = sizeof(**header); + *header = macho_read(input, input->data, *header_size); + if (*header == NULL) { + return (Tcl_Obj *)TCL_ERROR; } break; case MH_CIGAM_64: - swap32 = macho_swap32; + *swap32 = macho_swap32; /* Fall-through */ case MH_MAGIC_64: - header_size = sizeof(*header64); + *header_size = sizeof(*header64); header64 = macho_read(input, input->data, sizeof(*header64)); if (header64 == NULL) - return false; + return (Tcl_Obj *)TCL_ERROR; /* The 64-bit header is a direct superset of the 32-bit header */ - header = (struct mach_header *) header64; + *header = (struct mach_header *) header64; - m64 = true; break; case FAT_CIGAM: case FAT_MAGIC: - fat_header = macho_read(input, input->data, sizeof(*fat_header)); - universal = true; + *header = macho_read(input, input->data, sizeof(**header)); + *universal = true; break; default: return (Tcl_Obj *)TCL_ERROR; } +} +/* Parse a Mach-O header */ +Tcl_Obj * list_macho_dlibs_l(macho_input_t *input, Tcl_Interp * interp, Tcl_Obj * dlibs) { - /* Parse universal file. */ - if (universal) { - uint32_t i; - uint32_t nfat = OSSwapBigToHostInt32(fat_header->nfat_arch); - const struct fat_arch *archs = macho_offset(input, fat_header, sizeof(struct fat_header), sizeof(struct fat_arch)); - if (archs == NULL) - return false; + /* Parse the Mach-O header */ + const uint32_t *magic; + bool universal = false; + uint32_t (*swap32)(uint32_t) = macho_nswap32; + const struct mach_header *header; + size_t header_size; - for (i = 0; i < nfat; i++) { - const struct fat_arch *arch = macho_read(input, archs + i, sizeof(struct fat_arch)); - macho_input_t arch_input; - if (arch == NULL) - return false; + const NXArchInfo *archInfo; + const struct load_command *cmd; + uint32_t ncmds; + uint32_t i; - /* Fetch a pointer to the architecture's Mach-O header. */ - arch_input.length = OSSwapBigToHostInt32(arch->size); - arch_input.data = macho_offset(input, input->data, OSSwapBigToHostInt32(arch->offset), arch_input.length); - if (arch_input.data == NULL) - return false; + /* get file header magic */ + magic = macho_read(input, input->data, sizeof(uint32_t)); + if (magic == NULL) + return (Tcl_Obj *)TCL_ERROR; - /* Parse the architecture's Mach-O header */ - if (!list_macho_dlibs_l(&arch_input, interp, dlibs)) - return false; - } + /* Check file header magic */ + if(check_magic(*magic, input, &universal, &swap32, &header, &header_size) == (Tcl_Obj *)TCL_ERROR){ + return (Tcl_Obj *)TCL_ERROR; + } - return dlibs; + /* Parse universal file. */ + if (universal) { + return handle_universal(input, interp, &header, list_macho_dlibs_l); } /* Fetch the arch name */ @@ -234,90 +237,31 @@ /* List Mach-O archs */ Tcl_Obj * list_macho_archs_l(macho_input_t *input, Tcl_Interp *interp, Tcl_Obj * archs_list) { - const struct mach_header *header; - const struct mach_header_64 *header64; - size_t header_size; - const NXArchInfo *archInfo; - const struct fat_header *fat_header; - /* Parse the Mach-O header */ + const uint32_t *magic; bool universal = false; uint32_t (*swap32)(uint32_t) = macho_nswap32; + const struct mach_header *header; + size_t header_size; - /* Read the file type. */ - const uint32_t *magic = macho_read(input, input->data, sizeof(uint32_t)); + const NXArchInfo *archInfo; + const struct load_command *cmd; + uint32_t ncmds; + uint32_t i; + + /* get file header magic */ + magic = macho_read(input, input->data, sizeof(uint32_t)); if (magic == NULL) - return false; + return (Tcl_Obj *)TCL_ERROR; - - - switch (*magic) { - case MH_CIGAM: - swap32 = macho_swap32; - /* Fall-through */ - - case MH_MAGIC: - header_size = sizeof(*header); - header = macho_read(input, input->data, header_size); - if (header == NULL) { - return (Tcl_Obj *)TCL_ERROR; - } - break; - - - case MH_CIGAM_64: - swap32 = macho_swap32; - /* Fall-through */ - - case MH_MAGIC_64: - header_size = sizeof(*header64); - header64 = macho_read(input, input->data, sizeof(*header64)); - if (header64 == NULL) - return (Tcl_Obj *)TCL_ERROR; - - /* The 64-bit header is a direct superset of the 32-bit header */ - header = (struct mach_header *) header64; - - break; - - case FAT_CIGAM: - case FAT_MAGIC: - fat_header = macho_read(input, input->data, sizeof(*fat_header)); - universal = true; - break; - - default: - return (Tcl_Obj *)TCL_ERROR; + /* Check file header magic */ + if(check_magic(*magic, input, &universal, &swap32, &header, &header_size) == (Tcl_Obj *)TCL_ERROR){ + return (Tcl_Obj *)TCL_ERROR; } /* Parse universal file. */ if (universal) { - uint32_t nfat = OSSwapBigToHostInt32(fat_header->nfat_arch); - const struct fat_arch *archs = macho_offset(input, fat_header, sizeof(struct fat_header), sizeof(struct fat_arch)); - uint32_t i; - const struct fat_arch *arch; - macho_input_t arch_input; - - if (archs == NULL) - return (Tcl_Obj *)TCL_ERROR; - - for (i = 0; i < nfat; i++) { - arch = macho_read(input, archs + i, sizeof(struct fat_arch)); - if (arch == NULL) - return (Tcl_Obj *)TCL_ERROR; - - /* Fetch a pointer to the architecture's Mach-O header. */ - arch_input.length = OSSwapBigToHostInt32(arch->size); - arch_input.data = macho_offset(input, input->data, OSSwapBigToHostInt32(arch->offset), arch_input.length); - if (arch_input.data == NULL) - return (Tcl_Obj *)TCL_ERROR; - - /* Parse the architecture's Mach-O header */ - if (!list_macho_archs_l(&arch_input, interp, archs_list)) - return (Tcl_Obj *)TCL_ERROR; - } - - return archs_list; + return handle_universal(input, interp, &header, list_macho_archs_l); } /* Fetch the arch name */ @@ -325,6 +269,7 @@ if (archInfo != NULL) { Tcl_ListObjAppendElement(interp, archs_list, Tcl_NewStringObj(archInfo->name,-1)); } + return archs_list; }
participants (1)
-
fotanus@macports.org