diff options
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) | 
