Fixed various memory-related errors. Valgrind reports everything a-ok!

master
kts 2014-11-20 17:22:53 -08:00
parent 8f5ee89e81
commit a3e5747656
4 changed files with 74 additions and 10 deletions

View File

@ -14,7 +14,7 @@ int ktk_freeProgram(struct ktkProgram *program) {
int i; int i;
if (program->structure_count < 1) return 1; if (program->structure_count < 1) return 1;
for (i = 0; i < program->structure_count; i++) { for (i = 0; i < program->structure_count; i++) {
//ktk_deleteStructure(program->structures[i]); ktk_deleteStructure(&(program->structures[i]));
free(program->structure_name[i]); free(program->structure_name[i]);
} }
free(program->structures); free(program->structures);
@ -211,6 +211,7 @@ struct ktkLive *ktk_buildStructure(struct ktkProgram *program, struct ktkLive *l
}*/ }*/
} }
} }
ktk_deleteMap(&structure_map);
ktk_addLiveChild(live_parent, live); ktk_addLiveChild(live_parent, live);
break; break;
} else if (structure->flags & ktk_STRUCTURE_OVERLAP) { } else if (structure->flags & ktk_STRUCTURE_OVERLAP) {
@ -465,6 +466,7 @@ int ktk_linkStructures(struct ktkProgram *program, struct ktkLive *live, struct
parent_live->name = malloc(strlen(live->name)+1); parent_live->name = malloc(strlen(live->name)+1);
memcpy(parent_live->name, live->name, strlen(live->name)+1); memcpy(parent_live->name, live->name, strlen(live->name)+1);
} }
ktk_addLiveChild(new_live, parent_live);
} }
// *** step // *** step
int i; int i;

View File

@ -103,6 +103,46 @@ void ktk_dumpStructure(struct ktkStructure *structure) {
printf("size_y: %dx%d\n", structure->size_y.a, structure->size_y.b); printf("size_y: %dx%d\n", structure->size_y.a, structure->size_y.b);
} }
int ktk_deleteStructure(struct ktkStructure *structure) {
if (structure->name != NULL) {
free(structure->name);
structure->name = NULL;
}
ktk_deleteNumberSet(&structure->id_1);
ktk_deleteNumberSet(&structure->id_2);
ktk_deleteNumberSet(&structure->replace_id_1);
ktk_deleteNumberSet(&structure->replace_id_2);
if (structure->relation_count > 0) {
int i;
for (i = 0; i < structure->relation_count; i++) {
//ktk_deleteLive(structure->relations[i]);
//free(structure->relations[i]);
free(structure->relations[i].name);
}
free(structure->relations);
structure->relations = NULL;
structure->relation_count = 0;
}
if (structure->path_count > 0) {
int i;
for (i = 0; i < structure->path_count; i++) {
free(structure->paths[i].name);
free(structure->paths[i].to);
free(structure->paths[i].from);
ktk_deleteNumberSet(&(structure->paths[i].to_x));
ktk_deleteNumberSet(&(structure->paths[i].to_y));
ktk_deleteNumberSet(&(structure->paths[i].from_x));
ktk_deleteNumberSet(&(structure->paths[i].from_y));
ktk_deleteNumberSet(&(structure->paths[i].x));
ktk_deleteNumberSet(&(structure->paths[i].y));
}
free(structure->paths);
structure->paths = NULL;
structure->path_count = 0;
}
return 0;
}
const struct ktkRelation ktk_RELATION_DEFAULT = { const struct ktkRelation ktk_RELATION_DEFAULT = {
0, 0,
NULL, NULL,
@ -197,7 +237,7 @@ struct ktkLive *ktk_getLive(struct ktkLive *live, const char *get, int match_off
int ktk_addLink(struct ktkLive *live_1, struct ktkLive *live_2) { int ktk_addLink(struct ktkLive *live_1, struct ktkLive *live_2) {
live_1->link_count++; live_1->link_count++;
live_1->links = realloc(live_1->links, sizeof(live_1->link_count*sizeof(struct ktkLive*))); live_1->links = realloc(live_1->links, live_1->link_count*sizeof(struct ktkLive*));
live_1->links[live_1->link_count-1] = live_2; live_1->links[live_1->link_count-1] = live_2;
return 0; return 0;
} }
@ -226,6 +266,10 @@ int ktk_deleteLive(struct ktkLive *live) {
live->children = NULL; live->children = NULL;
live->child_count = 0; live->child_count = 0;
} }
if (live->link_count > 0) {
free(live->links);
live->links = NULL;
}
return 0; return 0;
} }
@ -262,7 +306,7 @@ const struct ktkPath ktk_PATH_DEFAULT = {
}; };
int ktk_explodeString(const char *string, char delim, int depth, char ***results) { int ktk_explodeString(const char *string, char delim, int depth, char ***results) {
int words = 0, word_size = 0, word_i = 0; int words = 0, word_size = 1, word_i = 0;
int i = 0; int i = 0;
int len = strlen(string)+1; int len = strlen(string)+1;
// TODO: resize in 8-byte chunks or so // TODO: resize in 8-byte chunks or so
@ -274,7 +318,8 @@ int ktk_explodeString(const char *string, char delim, int depth, char ***results
*results = realloc(*results, (++words+1)*sizeof(char*)); *results = realloc(*results, (++words+1)*sizeof(char*));
(*results)[words] = malloc(1*sizeof(char)); (*results)[words] = malloc(1*sizeof(char));
//(*results)[words][0] = '\0'; //(*results)[words][0] = '\0';
word_i = word_size = 0; word_i = 0;
word_size = 1;
} else { } else {
(*results)[words] = realloc((*results)[words], ++word_size*sizeof(char)); (*results)[words] = realloc((*results)[words], ++word_size*sizeof(char));
(*results)[words][word_i++] = string[i]; (*results)[words][word_i++] = string[i];

View File

@ -24,7 +24,7 @@ struct ktkNumber ktk_parseNumber(const char *text) {
number.type |= ktk_ISSET; number.type |= ktk_ISSET;
} }
// free words // free words
for (w = 0; w < word_count; w++) { for (w = 0; w <= word_count; w++) {
free(words[w]); free(words[w]);
} }
free(words); free(words);
@ -43,6 +43,7 @@ struct ktkNumberSet *ktk_parseNumberSet(struct ktkNumberSet *set, const char *te
set->sets[w] = ktk_parseNumber(words[w]); set->sets[w] = ktk_parseNumber(words[w]);
free(words[w]); free(words[w]);
} }
free(words[w]);
free(words); free(words);
return set; return set;
@ -135,7 +136,8 @@ int ktk_parseSFile(struct ktkProgram *program, const char *filename) {
// ** end structure reading logic // ** end structure reading logic
} else if (state == ktk_PARSE_RELATIONS) { } else if (state == ktk_PARSE_RELATIONS) {
// ** relation reading logic // ** relation reading logic
if ((word_count = ktk_explodeString(current_read, ' ', 1, &words)) >= 1) { word_count = ktk_explodeString(current_read, ' ', 1, &words);
if (word_count > 1) {
if (words[1][0] == '{') { if (words[1][0] == '{') {
// I'm bad. :) // I'm bad. :)
program->structures[program->structure_count-1].relation_count++; program->structures[program->structure_count-1].relation_count++;
@ -145,7 +147,9 @@ int ktk_parseSFile(struct ktkProgram *program, const char *filename) {
program->structures[program->structure_count-1].relations[program->structures[program->structure_count-1].relation_count-1].name = malloc(name_size*sizeof(char)); program->structures[program->structure_count-1].relations[program->structures[program->structure_count-1].relation_count-1].name = malloc(name_size*sizeof(char));
memcpy(program->structures[program->structure_count-1].relations[program->structures[program->structure_count-1].relation_count-1].name, words[0], name_size); memcpy(program->structures[program->structure_count-1].relations[program->structures[program->structure_count-1].relation_count-1].name, words[0], name_size);
state = ktk_PARSE_RELATION_STRUCTURE; state = ktk_PARSE_RELATION_STRUCTURE;
} else if (words[0][0] == '}') { }
} else {
if (words[0][0] == '}') {
state = ktk_PARSE_STRUCTURE; state = ktk_PARSE_STRUCTURE;
} }
} }
@ -178,7 +182,7 @@ int ktk_parseSFile(struct ktkProgram *program, const char *filename) {
// ** paths reading logic // ** paths reading logic
} else if (state == ktk_PARSE_PATHS) { } else if (state == ktk_PARSE_PATHS) {
word_count = ktk_explodeString(current_read, ' ', 1, &words); word_count = ktk_explodeString(current_read, ' ', 1, &words);
if (word_count >= 1) { if (word_count > 1) {
if (words[1][0] == '{') { if (words[1][0] == '{') {
// I'm bad. :) // I'm bad. :)
program->structures[program->structure_count-1].path_count++; program->structures[program->structure_count-1].path_count++;
@ -188,7 +192,9 @@ int ktk_parseSFile(struct ktkProgram *program, const char *filename) {
program->structures[program->structure_count-1].paths[program->structures[program->structure_count-1].path_count-1].name = malloc(name_size*sizeof(char)); program->structures[program->structure_count-1].paths[program->structures[program->structure_count-1].path_count-1].name = malloc(name_size*sizeof(char));
memcpy(program->structures[program->structure_count-1].paths[program->structures[program->structure_count-1].path_count-1].name, words[0], name_size); memcpy(program->structures[program->structure_count-1].paths[program->structures[program->structure_count-1].path_count-1].name, words[0], name_size);
state = ktk_PARSE_PATH_DEFINITION; state = ktk_PARSE_PATH_DEFINITION;
} else if (words[0][0] == '}') { }
} else {
if (words[0][0] == '}') {
state = ktk_PARSE_STRUCTURE; state = ktk_PARSE_STRUCTURE;
} }
} }
@ -207,7 +213,7 @@ int ktk_parseSFile(struct ktkProgram *program, const char *filename) {
// **** end logic section **** // **** end logic section ****
// free our explode results // free our explode results
int w; int w;
for (w = 0; w < word_count; w++) { for (w = 0; w <= word_count; w++) {
free(words[w]); free(words[w]);
} }
free(words); free(words);
@ -223,6 +229,10 @@ int ktk_parseSFile(struct ktkProgram *program, const char *filename) {
} }
} }
} }
if (current_read != NULL) {
free(current_read);
current_read = NULL;
}
fclose(file); fclose(file);
return 0; return 0;
} }
@ -257,6 +267,7 @@ int ktk_parseSVars(struct ktkStructure *structure, const char **vars, size_t var
} }
free(words[w]); free(words[w]);
} }
free(words[w]);
free(words); free(words);
} else if (strcmp(vars[0], "x") == 0) { } else if (strcmp(vars[0], "x") == 0) {
structure->x = ktk_parseNumber(vars[1]); structure->x = ktk_parseNumber(vars[1]);
@ -303,6 +314,7 @@ int ktk_parseSRelation(struct ktkRelation *relation, const char **vars, size_t v
} }
free(words[w]); free(words[w]);
} }
free(words[w]);
free(words); free(words);
} else if (strcmp(vars[0], "x") == 0) { } else if (strcmp(vars[0], "x") == 0) {
relation->x = ktk_parseNumber(vars[1]); relation->x = ktk_parseNumber(vars[1]);
@ -344,6 +356,7 @@ int ktk_parseSPath(struct ktkPath *path, const char **vars, size_t var_count) {
} }
free(words[w]); free(words[w]);
} }
free(words[w]);
free(words); free(words);
} else if (strcmp(vars[0], "to") == 0) { } else if (strcmp(vars[0], "to") == 0) {
size_t size = strlen(vars[1])+1; size_t size = strlen(vars[1])+1;
@ -359,6 +372,7 @@ int ktk_parseSPath(struct ktkPath *path, const char **vars, size_t var_count) {
} }
free(words[w]); free(words[w]);
} }
free(words[w]);
free(words); free(words);
} else if (strcmp(vars[0], "to_x") == 0) { } else if (strcmp(vars[0], "to_x") == 0) {
@ -379,6 +393,7 @@ int ktk_parseSPath(struct ktkPath *path, const char **vars, size_t var_count) {
} }
free(words[w]); free(words[w]);
} }
free(words[w]);
free(words); free(words);
} else if (strcmp(vars[0], "from_x") == 0) { } else if (strcmp(vars[0], "from_x") == 0) {
ktk_parseNumberSet(&path->from_x, vars[1]); ktk_parseNumberSet(&path->from_x, vars[1]);

View File

@ -43,6 +43,8 @@ int main(int argc, char *argv[]) {
} }
ktk_deleteMap(&my_map); ktk_deleteMap(&my_map);
ktk_deleteLive(&my_live);
ktk_deleteLive(&new_live);
ktk_freeProgram(&my_program); ktk_freeProgram(&my_program);