void debugger_interpreter_stopped() { int nof_elements; uint32_t **elements; int i; close(newsockfd); close(sockfd); if (pcs != NULL) { nof_elements = get_list_size(pcs); elements = (uint32_t**)delete_list_and_get_ptrs(pcs); for (i=0; i<nof_elements; i++) free(elements[i]); } if (breakpoints != NULL) { nof_elements = get_list_size(breakpoints); elements = (uint32_t**)delete_list_and_get_ptrs(breakpoints); for (i=0; i<nof_elements; i++) free(elements[i]); } }
static locale_module *parse_locale_file(z_ucs *module_name, char* locale_dir_name, char* module_name_utf8) { char *filename; z_file *in; z_ucs *locale_data; locale_module *result; char in_char; long nof_zucs_chars; z_ucs input; z_ucs *linestart; list *lines; TRACE_LOG("locale_dir_name: \"%s\".\n", locale_dir_name); TRACE_LOG("module_name_utf8: \"%s\".\n", module_name_utf8); // open-resource: if ((filename = malloc(strlen(locale_dir_name) + strlen(module_name_utf8) + 2)) == NULL) { // exit-point: TRACE_LOG("malloc() returned NULL.\n"); return NULL; } TRACE_LOG("locale_dir_name: \"%s\".\n", locale_dir_name); TRACE_LOG("module_name_utf8: \"%s\".\n", module_name_utf8); strcpy(filename, locale_dir_name); strcat(filename, "/"); strcat(filename, module_name_utf8); TRACE_LOG("Parsing locale file \"%s\".\n", filename); // open-resource: if ((in = fsi->openfile(filename, FILETYPE_DATA, FILEACCESS_READ)) == NULL) { // exit-point: TRACE_LOG("openfile(\"%s\") returned NULL.\n", filename); free(filename); return NULL; } nof_zucs_chars = 0; while ((parse_utf8_char_from_file(in)) != UEOF) nof_zucs_chars++; nof_zucs_chars++; // Add space for terminating zero (yes, really required). if (fsi->setfilepos(in, 0, SEEK_SET) == -1) { // exit-point: TRACE_LOG("setfilepos() returned -1.\n"); fsi->closefile(in); free(filename); return NULL; } TRACE_LOG("Allocating space for %ld z_ucs chars.\n", nof_zucs_chars); // open-resource: if ((locale_data = malloc(nof_zucs_chars * sizeof(z_ucs))) == NULL) { // exit-point: TRACE_LOG("malloc(%ld) returned NULL.\n", nof_zucs_chars * sizeof(z_ucs)); fsi->closefile(in); free(filename); return NULL; } TRACE_LOG("Locale data at %p, ends at %p.\n", locale_data, locale_data+nof_zucs_chars); // open-resource: if ((result = malloc(sizeof(locale_module))) == NULL) { // exit-point: free(locale_data); fsi->closefile(in); free(filename); return NULL; } TRACE_LOG("New module at %p.\n", result); result->locale_data = locale_data; TRACE_LOG("Locale data starts at %p.\n", locale_data); /* --- */ // open-resource: lines = create_list(); //printf("new list created: %p\n", lines); in_char = fsi->getchar(in); while (in_char != EOF) { linestart = locale_data; // Found a new line. fsi->ungetchar(in_char, in); for (;;) { input = input_char(in); if (input == Z_UCS_BACKSLASH) { //*locale_data++ = input; input = input_char(in); if (input == Z_UCS_BACKSLASH) { *locale_data++ = Z_UCS_BACKSLASH; } else if (input == 'n') { *locale_data++ = Z_UCS_NEWLINE; } else if (input == '{') { *locale_data++ = Z_UCS_BACKSLASH; *locale_data++ = (z_ucs)'{'; input = input_char(in); if ((input < 0x30) && (input > 0x39)) { fprintf(stderr, "Variable number expected.\n"); exit(EXIT_FAILURE); } *locale_data++ = input; input = input_char(in); if ( (input != (z_ucs)'s') && (input != (z_ucs)'d') && (input != (z_ucs)'x') && (input != (z_ucs)'z') ) { fprintf(stderr, "Invalid parameter type.\n"); exit(EXIT_FAILURE); } *locale_data++ = input; input = input_char(in); if (input != (z_ucs)'}') { fprintf(stderr, "Expected '}'.\n"); exit(EXIT_FAILURE); } *locale_data++ = (z_ucs)'}'; } else { fprintf(stderr, "Undefined control sequence \\%c.\n",(char)input); exit(EXIT_FAILURE); } } else if (input == Z_UCS_NEWLINE) { *locale_data++ = 0; TRACE_LOG("New line at %p.\n", linestart); add_list_element(lines, (void*)linestart); //TRACE_LOG_Z_UCS(linestart); break; } else { // Here we've found some "normal" output. *locale_data++ = (z_ucs)input; } } //messages_processed++; in_char = fsi->getchar(in); } *locale_data = 0; TRACE_LOG("Wirte last byte at %p.\n", locale_data); /* --- */ TRACE_LOG("Read %d lines.\n", get_list_size(lines)); // close-resource(l), open-resource(result->messages): result->nof_messages = get_list_size(lines); result->messages = (z_ucs**)delete_list_and_get_ptrs(lines); TRACE_LOG("Messages at %p.\n", result->messages); TRACE_LOG("First msg at %p.\n", result->messages[0]); if ((result->module_name = malloc(sizeof(z_ucs) * (z_ucs_len(module_name)+1))) == NULL) { // exit-point: free(result->messages); free(result); free(locale_data); fsi->closefile(in); free(filename); return NULL; } z_ucs_cpy(result->module_name, module_name); // close-resource: fsi->closefile(in); // close-resource: free(filename); TRACE_LOG("Returning new module at %p.\n", result); return result; }