summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--download.c6
-rw-r--r--getht.c70
-rw-r--r--issue.h13
-rw-r--r--issuemem.c107
-rw-r--r--mediaxml.c35
-rw-r--r--tocxml.c106
7 files changed, 234 insertions, 105 deletions
diff --git a/Makefile b/Makefile
index b9925cc..34a02db 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ LDFLAGS+=`curl-config --libs` `xml2-config --libs`
all: getht
-getht: download.o config.o tocxml.o mediarev.o mediaxml.o xml.o
+getht: download.o config.o issuemem.o tocxml.o mediarev.o mediaxml.o xml.o
tocxml.o mediaxml.o: xml.o
diff --git a/download.c b/download.c
index 6c9ccae..1108b6d 100644
--- a/download.c
+++ b/download.c
@@ -162,10 +162,10 @@ void downloadissue(CURL *curl_handle, char * directory, iss * issue, int force)
}
int count;
- for(cur_section = issue->section, count = 0;
- count <= issue->no_of_sections;
- cur_section++, count++)
+ for(count = 0; count <= issue->no_of_sections; count++)
{
+ cur_section = issue->section[count];
+
snprintf(filename,STR_MAX,"%s/section_%i.pdf", newdir, cur_section->number);
if(!force){
testfile = fopen(filename, "r");
diff --git a/getht.c b/getht.c
index 5c81e83..8eb9445 100644
--- a/getht.c
+++ b/getht.c
@@ -208,9 +208,6 @@ int main(int argc, char *argv[])
}
}
- if(showstr)
- show_iss_struct(issue, no_of_issues);
-
if(latest_index == -1)
{
fprintf(stderr, "Error: Cannot ascertain latest issue. ");
@@ -228,9 +225,8 @@ int main(int argc, char *argv[])
downloadissue(NULL, save_path, issue[latest_index], force);
}
- if(downmedia)
+ if(downmedia || showstr)
{
- med * cur_media;
int newest;
issue = parsemedia(media_xml, issue, &no_of_issues);
@@ -255,7 +251,7 @@ int main(int argc, char *argv[])
{
newest = findnewestiss(issue, no_of_issues);
for(i = 0; i <= issue[newest]->no_of_media; i++)
- downloadmedia(NULL, save_path, &(issue[newest]->media[i]), force);
+ downloadmedia(NULL, save_path, issue[newest]->media[i], force);
}
if(downallmedia)
@@ -263,17 +259,13 @@ int main(int argc, char *argv[])
for(i = 0; i <= no_of_issues; i++)
{
for(newest = 0; newest <= issue[i]->no_of_media; newest++)
- downloadmedia(NULL, save_path, &(issue[i]->media[newest]), force);
+ downloadmedia(NULL, save_path, issue[i]->media[newest], force);
}
}
}
- if(no_of_issues > -1)
- {
- for(i = 0; i < no_of_issues; i++)
- free(issue[i]);
- free(issue);
- }
+ if(showstr)
+ show_iss_struct(issue, no_of_issues);
/* Ensure curl cleans itself up */
curl_easy_cleanup(main_curl_handle);
@@ -331,7 +323,7 @@ int update_contents_files()
void show_iss_struct(iss ** issue, int no_of_issues)
/* Prints issue information */
{
- int iss_no, sec_no, it_no;
+ int iss_no, sec_no, med_no, it_no;
printf("%i Issues\n",no_of_issues);
for(iss_no=0;iss_no<no_of_issues;iss_no++)
{
@@ -345,20 +337,32 @@ void show_iss_struct(iss ** issue, int no_of_issues)
for(sec_no=0; sec_no <= (issue[iss_no]->no_of_sections); sec_no++)
{
printf("\t-Section %i-\n", (sec_no));
- printf("\tTitle:\t'%s'\n", issue[iss_no]->section[sec_no].title);
- printf("\tURI:\t'%s'\n", issue[iss_no]->section[sec_no].uri);
- printf("\tNo. of Items:\t'%i'\n", issue[iss_no]->section[sec_no].no_of_items);
+ printf("\tTitle:\t'%s'\n", issue[iss_no]->section[sec_no]->title);
+ printf("\tURI:\t'%s'\n", issue[iss_no]->section[sec_no]->uri);
+ printf("\tNo. of Items:\t'%i'\n", issue[iss_no]->section[sec_no]->no_of_items);
- for(it_no=0; it_no < issue[iss_no]->section[sec_no].no_of_items; it_no++)
+ for(it_no=0; it_no <= issue[iss_no]->section[sec_no]->no_of_items; it_no++)
{
printf("\t\t-Item-\n");
- printf("\t\tTitle:\t'%s'\n",issue[iss_no]->section[sec_no].item[it_no].title);
- printf("\t\tFirst page:\t'%i'",issue[iss_no]->section[sec_no].item[it_no].firstpage);
- printf("\tLast page:\t'%i'\n",issue[iss_no]->section[sec_no].item[it_no].lastpage);
+ printf("\t\tTitle:\t'%s'\n",issue[iss_no]->section[sec_no]->item[it_no]->title);
+ printf("\t\tFirst page:\t'%i'",issue[iss_no]->section[sec_no]->item[it_no]->firstpage);
+ printf("\tLast page:\t'%i'\n",issue[iss_no]->section[sec_no]->item[it_no]->lastpage);
}
it_no = 0;
}
sec_no = 0;
+
+ printf("Number of Media:\t'%i'\n",issue[iss_no]->no_of_media);
+
+ for(med_no=0; med_no <= (issue[iss_no]->no_of_media); med_no++)
+ {
+ printf("\t-Media %i-\n", (med_no));
+ printf("\tTitle:\t'%s'\n", issue[iss_no]->media[med_no]->title);
+ printf("\tURI:\t'%s'\n", issue[iss_no]->media[med_no]->uri);
+ printf("\tComment:\t'%s'\n", issue[iss_no]->media[med_no]->comment);
+ printf("\tPreview URI:\t'%s'\n", issue[iss_no]->media[med_no]->preview_uri);
+ }
+ med_no = 0;
}
}
@@ -389,24 +393,22 @@ void cleariss(iss * cur_issue)
cur_issue->preview_uri[0] = '\0';
cur_issue->title[0] = '\0';
cur_issue->size = 0;
- cur_issue->no_of_sections = 0;
- cur_issue->no_of_media = 0;
- clearmed(cur_issue->media);
+ cur_issue->no_of_sections = -1;
+ cur_issue->section = NULL;
+ cur_issue->no_of_media = -1;
+ cur_issue->media = NULL;
+ //clearmed(cur_issue->media);
}
}
void clearmed(med * cur_media)
-/* clears all members of media arrays */
+/* clears the members of a media array */
{
- int tmp;
- for(tmp=0; tmp<=MED_NO; cur_media++,tmp++)
- {
- cur_media->uri[0] = '\0';
- cur_media->title[0] = '\0';
- cur_media->comment[0] = '\0';
- cur_media->preview_uri[0] = '\0';
- cur_media->size = 0;
- }
+ cur_media->uri[0] = '\0';
+ cur_media->title[0] = '\0';
+ cur_media->comment[0] = '\0';
+ cur_media->preview_uri[0] = '\0';
+ cur_media->size = 0;
}
void clearsec(sec * cur_section)
diff --git a/issue.h b/issue.h
index cfb6e72..6c25ef0 100644
--- a/issue.h
+++ b/issue.h
@@ -45,7 +45,7 @@ typedef struct
char title[512];
int number;
int size;
- it item[ITEM_NO];
+ it ** item;
int no_of_items;
} sec;
@@ -64,8 +64,15 @@ typedef struct
char title[512];
int size;
issdates date;
- sec section[SEC_NO];
+ sec ** section;
int no_of_sections;
- med media[MED_NO];
+ med ** media;
int no_of_media;
} iss;
+
+iss ** parsetoc(char *filepath, int * iss_no, int * latest);
+iss ** parsemedia(char * filepath, iss ** issue, int * no_of_issues);
+
+iss ** assignnew_iss(int *no_of_issues, iss ** issue);
+sec ** assignnew_sec(int *no_of_sections, sec ** section);
+it ** assignnew_it(int * no_of_items, it ** item);
diff --git a/issuemem.c b/issuemem.c
new file mode 100644
index 0000000..f915de7
--- /dev/null
+++ b/issuemem.c
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2006 Nick White
+ *
+ * This file is part of GetHT
+ *
+ * GetHT is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GetHT is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GetHT; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "issue.h"
+
+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 ** assignnew_iss(int *no_of_issues, iss ** issue)
+/* assign memory for new issue */
+{
+ iss ** tmp = NULL;
+
+ 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();
+
+ return tmp;
+}
+
+sec ** assignnew_sec(int *no_of_sections, sec ** section)
+/* assign memory for new section */
+{
+ sec ** tmp = NULL;
+
+ if(*no_of_sections < 0)
+ { /* make **section a new array of section pointers */
+ if( (tmp = malloc(sizeof(sec *))) == NULL )
+ nogo_mem();
+ }
+ else
+ { /* add a new pointer to section pointer list */
+ if( (tmp = realloc(section, sizeof(sec *) + (((*no_of_sections)+1) * sizeof(sec *)))) == NULL )
+ nogo_mem();
+ }
+
+ (*no_of_sections)++;
+
+ /* make new array item a pointer to issue */
+ if( (tmp[*no_of_sections] = malloc(sizeof(sec))) == NULL )
+ nogo_mem();
+
+ return tmp;
+}
+
+it ** assignnew_it(int * no_of_items, it ** item)
+{
+ it ** tmp = NULL;
+
+ if(*no_of_items < 0)
+ { /* make **item a new array of item pointers */
+ if( (tmp = malloc(sizeof(it *))) == NULL )
+ nogo_mem();
+ }
+ else
+ { /* add a new pointer to item pointer list */
+ if( (tmp = realloc(item, sizeof(it *) + (((*no_of_items)+1) * sizeof(it *)))) == NULL )
+ nogo_mem();
+ }
+
+ (*no_of_items)++;
+
+ /* make new array item a pointer to item */
+ if( (tmp[*no_of_items] = malloc(sizeof(it))) == NULL )
+ nogo_mem();
+
+ return tmp;
+}
diff --git a/mediaxml.c b/mediaxml.c
index 54dd514..a86386a 100644
--- a/mediaxml.c
+++ b/mediaxml.c
@@ -165,7 +165,7 @@ iss ** parsemedia(char * filepath, iss ** issue, int * no_of_issues)
if(!issue_there)
{ /* advance to the next free issue */
- iss ** tmpiss;
+ iss ** tmpiss = NULL;
if(*no_of_issues == -1)
{ /* make issue** a new array of issue pointers */
if( (tmpiss = malloc(sizeof(iss *))) == NULL )
@@ -194,9 +194,11 @@ iss ** parsemedia(char * filepath, iss ** issue, int * no_of_issues)
tmp = *no_of_issues;
}
+ iss * cur_issue = issue[tmp];
+
issue[tmp]->no_of_media = -1;
- cur_media = issue[tmp]->media;
+ med ** tmpmed = NULL;
itnode = node->xmlChildrenNode;
@@ -205,6 +207,31 @@ iss ** parsemedia(char * filepath, iss ** issue, int * no_of_issues)
if(!xmlStrcmp(itnode->name,(char *) "item"))
{
+ /* assign memory for new media */
+ if(cur_issue->no_of_media < 0)
+ { /* make **section a new array of section pointers */
+ if( (tmpmed = malloc(sizeof(med *))) == NULL )
+ nogo_mem();
+ }
+ else
+ { /* add a new pointer to media pointer list */
+ if( (tmpmed = realloc(cur_issue->media, sizeof(med *) + ((cur_issue->no_of_media+1) * sizeof(med *)))) == NULL )
+ nogo_mem();
+ }
+
+ cur_issue->no_of_media++;
+
+ /* make new array item a pointer to issue */
+ if( (tmpmed[cur_issue->no_of_media] = malloc(sizeof(med))) == NULL )
+ nogo_mem();
+
+ cur_issue->media = tmpmed;
+ /* memory for seoction all dealt with */
+
+ cur_media = cur_issue->media[cur_issue->no_of_media];
+
+ clearmed(cur_media);
+
/* add media info to cur_media */
if(xmlGetProp(itnode, "uri"))
strncpy(cur_media->uri, (char *) xmlGetProp(itnode, "uri"), STR_MAX);
@@ -216,10 +243,6 @@ iss ** parsemedia(char * filepath, iss ** issue, int * no_of_issues)
strncpy(cur_media->preview_uri, (char *) xmlGetProp(itnode, "preview_uri"), STR_MAX);
strncpy(cur_media->title, (char *) xmlNodeListGetString(media_file, itnode->xmlChildrenNode, 1), STR_MAX);
-
- issue[tmp]->no_of_media++;
-
- cur_media++;
}
itnode = itnode->next;
diff --git a/tocxml.c b/tocxml.c
index db9f9a3..f351bc0 100644
--- a/tocxml.c
+++ b/tocxml.c
@@ -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)