/* * Print out error information if appropriate, and clean up before * terminating the program. */ void stop(const char *string, int err_code) { if (string != NULL) { fprintf(stderr, "%s: ", appname); if (yyfilename != NULL) { fprintf(stderr, "Stopped at file %s, line %d - ", yyfilename, yylineno); } fprintf(stderr, "%s\n", string); } if (ofile != NULL) { fclose(ofile); if (err_code != 0) { fprintf(stderr, "%s: Removing %s due to error\n", appname, ofilename); unlink(ofilename); } } if (regfile != NULL) { fclose(regfile); if (err_code != 0) { fprintf(stderr, "%s: Removing %s due to error\n", appname, regfilename); unlink(regfilename); } } if (listfile != NULL) { fclose(listfile); if (err_code != 0) { fprintf(stderr, "%s: Removing %s due to error\n", appname, listfilename); unlink(listfilename); } } symlist_free(&patch_functions); symtable_close(); exit(err_code); }
void symbol_delete(symbol_t *symbol) { if (symtable != NULL) { DBT key; key.data = symbol->name; key.size = strlen(symbol->name); symtable->del(symtable, &key, /*flags*/0); } switch(symbol->type) { case SCBLOC: case SRAMLOC: case REGISTER: if (symbol->info.rinfo != NULL) free(symbol->info.rinfo); break; case ALIAS: if (symbol->info.ainfo != NULL) free(symbol->info.ainfo); break; case MASK: case BIT: if (symbol->info.minfo != NULL) { symlist_free(&symbol->info.minfo->symrefs); free(symbol->info.minfo); } break; case DOWNLOAD_CONST: case CONST: if (symbol->info.cinfo != NULL) free(symbol->info.cinfo); break; case LABEL: if (symbol->info.linfo != NULL) free(symbol->info.linfo); break; case UNINITIALIZED: default: break; } free(symbol->name); free(symbol); }