diff options
author | Nick White <arch@njw.me.uk> | 2007-04-29 13:07:45 +0000 |
---|---|---|
committer | Nick White <arch@njw.me.uk> | 2007-04-29 13:07:45 +0000 |
commit | 1f0a1fd57bd1dbddab4ad189a721fbe67f59ca3a (patch) | |
tree | 0e923adfe47783a5329f8871fdbb2245bca7f261 /tocxml.c | |
parent | e2296304a88112cad84482e0a06b2504e51a3b21 (diff) |
Completed issue malloc, fixed build warnings
Used malloc to dynamically assign enough memory for sections,
items, and media, using the functionality of issuemem.c
Included some function definitions in issue.h to remove
various build warnings
git-archimport-id: getht@sv.gnu.org/getht--mainline--0.1--patch-21
Diffstat (limited to 'tocxml.c')
-rw-r--r-- | tocxml.c | 106 |
1 files changed, 48 insertions, 58 deletions
@@ -29,7 +29,6 @@ #include "getht.h" iss ** parsetoc(char *filepath, int * iss_no, int * latest); -iss ** parseyear(xmlDocPtr file, xmlNodePtr node, iss ** issue, int * latest); int parseissue(xmlDocPtr file, xmlNodePtr node, iss * cur_issue, int * latest); void parsesection(xmlDocPtr file, xmlNodePtr node, sec * cur_section); @@ -37,17 +36,8 @@ void tokenise_hyphons(char to_token[10], int * first, int * last); int no_of_issues; -void nogo_mem() -/* called if memory assignation fails - TODO: handle freeing of memory to avoid leaks */ -{ - fprintf(stderr, "Could not assign memory, exitting\n"); - exit(1); -} - iss ** parsetoc(char *filepath, int * iss_no, int * latest) -/* starts parsing of xml to issue structure - TODO: combine with parseyear */ +/* starts parsing of xml to issue structure */ { xmlDocPtr file; xmlNodePtr node; @@ -59,10 +49,10 @@ iss ** parsetoc(char *filepath, int * iss_no, int * latest) no_of_issues = -1; - iss ** issue; + iss ** issue = NULL; + //iss ** tmp = NULL; int year; - iss ** tmp; xmlNodePtr cnode; @@ -75,29 +65,21 @@ iss ** parsetoc(char *filepath, int * iss_no, int * latest) { if(!xmlStrncmp(cnode->name,(char *) "issue",5)) { - if(no_of_issues < 0) - { /* make issue** a new array of issue pointers */ - if( (tmp = malloc(sizeof(iss *))) == NULL ) - nogo_mem(); - } - else - { /* add a new pointer to issue pointer list */ - if( (tmp = realloc(issue, sizeof(iss *) + ((no_of_issues+1) * sizeof(iss *)))) == NULL ) - nogo_mem(); - } - - no_of_issues++; - - /* make new array item a pointer to issue */ - if( (tmp[no_of_issues] = malloc(sizeof(iss))) == NULL ) - nogo_mem(); - - issue = tmp; - - issue[no_of_issues]->no_of_media = -1; /* set default no of media */ - issue[no_of_issues]->date.year = atoi( (const char *)(xmlStrsub(node->name,5,4)) ); - tokenise_hyphons(xmlStrsub(cnode->name,6,5), &(issue[no_of_issues]->date.firstmonth), &(issue[no_of_issues]->date.lastmonth)); - issue[no_of_issues]->no_of_sections = parseissue(file, cnode, issue[no_of_issues], latest); + /* assign memory for the new issue */ + issue = assignnew_iss(&no_of_issues, issue); + + /* setup issue globals */ + issue[no_of_issues]->no_of_media = -1; + issue[no_of_issues]->no_of_sections = -1; + issue[no_of_issues]->date.year = + atoi( (const char *)(xmlStrsub(node->name,5,4)) ); + tokenise_hyphons( + xmlStrsub(cnode->name,6,5), + &(issue[no_of_issues]->date.firstmonth), + &(issue[no_of_issues]->date.lastmonth)); + + /* parse the issue */ + parseissue(file, cnode, issue[no_of_issues], latest); } cnode = cnode->next; } @@ -113,39 +95,40 @@ iss ** parsetoc(char *filepath, int * iss_no, int * latest) } int parseissue(xmlDocPtr file, xmlNodePtr node, iss * cur_issue, int * latest) -/* parses issue from xml, saving in cur_issue structure */ +/* parses issue from xml, saving in cur_issue structure */ { - int no_of_sections = -1; - strncpy(cur_issue->title, (char *) xmlGetProp(node, "title"), STR_MAX); strncpy(cur_issue->preview_uri, (char *) xmlGetProp(node, "coverlink"), STR_MAX); if(xmlGetProp(node, "current") && *latest==-1) *latest = no_of_issues; - sec * cur_section = NULL; - node = node->xmlChildrenNode; while(node != NULL){ if(!xmlStrncmp(node->name, (char *) "section",7) || !xmlStrcmp(node->name, (const xmlChar *) "cover")) { - no_of_sections++; - cur_section = &(cur_issue->section[no_of_sections]); + /* assign memory for new section */ + cur_issue->section = + assignnew_sec(&(cur_issue->no_of_sections), cur_issue->section); + + /* setup section globals */ + cur_issue->section[cur_issue->no_of_sections]->no_of_items = -1; - parsesection(file, node, cur_section); + /* parse the section */ + parsesection(file, node, cur_issue->section[cur_issue->no_of_sections]); } node = node->next; } - return no_of_sections; + return 0; } void parsesection(xmlDocPtr file, xmlNodePtr node, sec * cur_section) /* parses section xml, filling cur_section structure */ { - it * cur_item; + it * cur_item = NULL; strncpy(cur_section->uri, (char *) xmlGetProp(node, "pdflink"), STR_MAX); strncpy(cur_section->title, (char *) xmlGetProp(node, "title"), STR_MAX); @@ -155,31 +138,38 @@ void parsesection(xmlDocPtr file, xmlNodePtr node, sec * cur_section) else cur_section->number = atoi( (const char *)(xmlStrsub(node->name,8,1)) ); - cur_item = cur_section->item; - cur_section->no_of_items = 0; - node = node->xmlChildrenNode; char * pagenums; + it ** tmp = NULL; + while(node != NULL) { if(!xmlStrcmp(node->name, (const xmlChar *) "item")) { - cur_section->no_of_items++; - cur_item->title = xmlNodeListGetString(file, node->xmlChildrenNode, 1); - if(pagenums = (char *) xmlGetProp(node, "pages")) - tokenise_hyphons(pagenums, &(cur_item->firstpage), &(cur_item->lastpage)); - else + if(xmlNodeListGetString(file, node->xmlChildrenNode, 1) != NULL) + /* ignore items without titles */ { - cur_item->firstpage = 0; - cur_item->lastpage = 0; + /* assign memory for new item */ + cur_section->item = + assignnew_it( &(cur_section->no_of_items), cur_section->item); + + cur_item = cur_section->item[cur_section->no_of_items]; + + /* parse item */ + cur_item->title = xmlNodeListGetString(file, node->xmlChildrenNode, 1); + if(pagenums = (char *) xmlGetProp(node, "pages")) + tokenise_hyphons(pagenums, &(cur_item->firstpage), &(cur_item->lastpage)); + else + { + cur_item->firstpage = 0; + cur_item->lastpage = 0; + } } - cur_item++; } node = node->next; } - cur_item = 0; } void tokenise_hyphons(char to_token[10], int * first, int * last) |