vita-toolchain

git clone https://git.neptards.moe/neptards/vita-toolchain.git
Log | Files | Refs | README | LICENSE

vita-import.c (3505B)


      1 #include "vita-import.h"
      2 #include <stdlib.h>
      3 #include <string.h>
      4 
      5 vita_imports_t *vita_imports_new(int n_libs)
      6 {
      7 	vita_imports_t *imp = malloc(sizeof(*imp));
      8 	if (imp == NULL)
      9 		return NULL;
     10 
     11 	imp->postfix = calloc(64, sizeof(char));
     12 
     13 	imp->firmware = NULL;
     14 
     15 	imp->n_libs = n_libs;
     16 
     17 	imp->libs = calloc(n_libs, sizeof(*imp->libs));
     18 
     19 	return imp;
     20 }
     21 
     22 void vita_imports_free(vita_imports_t *imp)
     23 {
     24 	if (imp) {
     25 		int i;
     26 		for (i = 0; i < imp->n_libs; i++) {
     27 			vita_imports_lib_free(imp->libs[i]);
     28 		}
     29 
     30 		if (imp->firmware)
     31 			free(imp->firmware);
     32 
     33 		free(imp->postfix);
     34 		free(imp);
     35 	}
     36 }
     37 
     38 vita_imports_lib_t *vita_imports_lib_new(const char *name, uint32_t NID, int n_modules)
     39 {
     40 	vita_imports_lib_t *lib = malloc(sizeof(*lib));
     41 	if (lib == NULL)
     42 		return NULL;
     43 
     44 	lib->name = strdup(name);
     45 	lib->NID = NID;
     46 	lib->n_modules = n_modules;
     47 
     48 	lib->modules = calloc(n_modules, sizeof(*lib->modules));
     49 
     50 	return lib;
     51 }
     52 
     53 
     54 vita_imports_module_t *vita_imports_module_new(const char *name, bool kernel, uint32_t NID, int n_functions, int n_variables)
     55 {
     56 	vita_imports_module_t *mod = malloc(sizeof(*mod));
     57 	if (mod == NULL)
     58 		return NULL;
     59 
     60 	mod->name = strdup(name);
     61 	mod->NID = NID;
     62 	mod->is_kernel = kernel;
     63 	mod->n_functions = n_functions;
     64 	mod->n_variables = n_variables;
     65 
     66 	mod->functions = calloc(n_functions, sizeof(*mod->functions));
     67 
     68 	mod->variables = calloc(n_variables, sizeof(*mod->variables));
     69 
     70 	return mod;
     71 }
     72 
     73 void vita_imports_module_free(vita_imports_module_t *mod)
     74 {
     75 	if (mod) {
     76 		int i;
     77 		for (i = 0; i < mod->n_variables; i++) {
     78 			vita_imports_stub_free(mod->variables[i]);
     79 		}
     80 		for (i = 0; i < mod->n_functions; i++) {
     81 			vita_imports_stub_free(mod->functions[i]);
     82 		}
     83 		free(mod->name);
     84 		free(mod);
     85 	}
     86 }
     87 
     88 
     89 void vita_imports_lib_free(vita_imports_lib_t *lib)
     90 {
     91 	if (lib) {
     92 		int i;
     93 		for (i = 0; i < lib->n_modules; i++) {
     94 			vita_imports_module_free(lib->modules[i]);
     95 		}
     96 		free(lib->name);
     97 		free(lib);
     98 	}
     99 }
    100 
    101 vita_imports_stub_t *vita_imports_stub_new(const char *name, uint32_t NID)
    102 {
    103 	vita_imports_stub_t *stub = malloc(sizeof(*stub));
    104 	if (stub == NULL)
    105 		return NULL;
    106 
    107 	stub->name = strdup(name);
    108 	stub->NID = NID;
    109 
    110 	return stub;
    111 }
    112 
    113 void vita_imports_stub_free(vita_imports_stub_t *stub)
    114 {
    115 	if (stub) {
    116 		free(stub->name);
    117 		free(stub);
    118 	}
    119 }
    120 
    121 /* For now these functions are just dumb full-table searches.  We can implement qsort/bsearch/whatever later if necessary. */
    122 
    123 static vita_imports_common_fields *generic_find(vita_imports_common_fields **entries, int n_entries, uint32_t NID) {
    124 	int i;
    125 	vita_imports_common_fields *entry;
    126 
    127 	for (i = 0; i < n_entries; i++) {
    128 		entry = entries[i];
    129 		if (entry == NULL)
    130 			continue;
    131 
    132 		if (entry->NID == NID)
    133 			return entry;
    134 	}
    135 
    136 	return NULL;
    137 }
    138 
    139 vita_imports_lib_t *vita_imports_find_lib(vita_imports_t *imp, uint32_t NID) {
    140 	return (vita_imports_lib_t *)generic_find((vita_imports_common_fields **)imp->libs, imp->n_libs, NID);
    141 }
    142 vita_imports_module_t *vita_imports_find_module(vita_imports_lib_t *lib, uint32_t NID) {
    143 	return (vita_imports_module_t *)generic_find((vita_imports_common_fields **)lib->modules, lib->n_modules, NID);
    144 }
    145 vita_imports_stub_t *vita_imports_find_function(vita_imports_module_t *mod, uint32_t NID) {
    146 	return (vita_imports_stub_t *)generic_find((vita_imports_common_fields **)mod->functions, mod->n_functions, NID);
    147 }
    148 vita_imports_stub_t *vita_imports_find_variable(vita_imports_module_t *mod, uint32_t NID) {
    149 	return (vita_imports_stub_t *)generic_find((vita_imports_common_fields **)mod->variables, mod->n_variables, NID);
    150 }