| verzia 1.14, 2002/10/16 21:07:43 |
verzia 1.15, 2002/10/20 14:07:23 |
| Riadok 27 int strlenc(char *buffer, char c, char t |
|
| Riadok 27 int strlenc(char *buffer, char c, char t |
|
| int strlento(char *buffer, char to) |
int strlento(char *buffer, char to) |
| { |
{ |
| char *old = buffer; |
char *old = buffer; |
| while (*buffer && *buffer != to) |
while (*buffer && *buffer != to) |
| buffer++; |
buffer++; |
| return buffer - old; |
return buffer - old; |
| } |
} |
| Riadok 86 char *name(char *buffer) |
|
| Riadok 86 char *name(char *buffer) |
|
| char **array(char *buffer) |
char **array(char *buffer) |
| { |
{ |
| char **ret = NULL, *last; |
char **ret = NULL, *last; |
| static char delim[4] = { '[','\0',']','\0' }; |
static char delim[4] = { '[', '\0', ']', '\0' }; |
| int index = 0,len; |
int index = 0, len; |
| last = buffer + 1; |
last = buffer + 1; |
| do { |
do { |
| ret = (char **) realloc(ret, (index + 1) * sizeof(char**)); |
ret = |
| if(*buffer == '[' || *buffer == ']') { |
(char **) realloc(ret, (index + 1) * sizeof(char **)); |
| if(*buffer == '[') |
if (*buffer == '[' || *buffer == ']') { |
| |
if (*buffer == '[') |
| ret[index] = &delim[0]; |
ret[index] = &delim[0]; |
| else |
else |
| ret[index] = &delim[2]; |
ret[index] = &delim[2]; |
| Riadok 100 char **array(char *buffer) |
|
| Riadok 101 char **array(char *buffer) |
|
| index++; |
index++; |
| continue; |
continue; |
| } |
} |
| while (*buffer != ' ' && *buffer != ']' && *buffer != '\n') |
while (*buffer != ' ' && *buffer != ']' && *buffer != '\n') |
| buffer++; |
buffer++; |
| len = buffer - last; |
len = buffer - last; |
| ret[index] = (char *) xcalloc(len + 1,sizeof(char)); |
ret[index] = (char *) xcalloc(len + 1, sizeof(char)); |
| strncpy(ret[index], last, len); |
strncpy(ret[index], last, len); |
| index++; |
index++; |
| if(*buffer != ']') |
if (*buffer != ']') |
| last = ++buffer; |
last = ++buffer; |
| else |
else |
| last = buffer; |
last = buffer; |
| Riadok 126 void read_obj(long offset) |
|
| Riadok 127 void read_obj(long offset) |
|
| fget(buffer, BUFLEN, fp); |
fget(buffer, BUFLEN, fp); |
| sscanf(buffer, "%d ", &obj_num); |
sscanf(buffer, "%d ", &obj_num); |
| fget(buffer, BUFLEN, fp); |
fget(buffer, BUFLEN, fp); |
| if(buffer[0] == '<' && buffer[1] == '<') |
if (buffer[0] == '<' && buffer[1] == '<') |
| fget(buffer,BUFLEN,fp); |
fget(buffer, BUFLEN, fp); |
| while (!strstr(buffer, "endobj")) { |
while (!strstr(buffer, "endobj")) { |
| size += strlen(buffer) + 1; |
size += strlen(buffer) + 1; |
| obj->unparsed = realloc(obj->unparsed, size); |
obj->unparsed = realloc(obj->unparsed, size); |
| Riadok 148 void add_obj(char *s) |
|
| Riadok 149 void add_obj(char *s) |
|
| fseek(fp, old_off, SEEK_SET); |
fseek(fp, old_off, SEEK_SET); |
| } |
} |
| |
|
| |
/* get filter number */ |
| |
char get_filternum(char *filter) |
| |
{ |
| |
if (!strcmp(filter, "/FlateDecode")) |
| |
return FLATEDECODE; |
| |
if (!strcmp(filter, "/DCTDecode")) |
| |
return DCTDECODE; |
| |
return -1; |
| |
} |
| |
|
| /* get offset of start xref table */ |
/* get offset of start xref table */ |
| long get_startxref(void) |
long get_startxref(void) |
| { |
{ |
| Riadok 196 void probe_ptree(int num) |
|
| Riadok 207 void probe_ptree(int num) |
|
| free(kids[1]); |
free(kids[1]); |
| free(kids[2]); |
free(kids[2]); |
| } |
} |
| free(old); |
free(old); |
| return; |
return; |
| } |
} |
| |
|
| Riadok 221 void xref(void) |
|
| Riadok 232 void xref(void) |
|
| sscanf(xref, "%d %d", &entry[0], &entry[1]); |
sscanf(xref, "%d %d", &entry[0], &entry[1]); |
| if (entry[0] + entry[1] > obj_count) { |
if (entry[0] + entry[1] > obj_count) { |
| object = (struct object **) |
object = (struct object **) |
| realloc(object, |
realloc(object, entry[0] + entry[1]); |
| entry[0] + entry[1]); |
|
| obj_count = entry[0] + entry[1]; |
obj_count = entry[0] + entry[1]; |
| } |
} |
| if (!entry[0]) |
if (!entry[0]) |
| Riadok 287 void parse_pdf(void) |
|
| Riadok 297 void parse_pdf(void) |
|
| probe_ptree(ret); |
probe_ptree(ret); |
| return; |
return; |
| } |
} |
| |
|
| |
void fill_page(int page_num) |
| |
{ |
| |
struct page *page; |
| |
struct object *obj; |
| |
char *p, **mediabox; |
| |
int contents, resources, i = 0; |
| |
if (object[page_num]->type == PAGE) |
| |
return; |
| |
page = (struct page *) malloc(sizeof(struct page)); |
| |
obj = object[page_num]; |
| |
p = strstr(obj->unparsed, "/Contents "); |
| |
if (!p) { |
| |
/* error */ |
| |
return; |
| |
} |
| |
sscanf(p, "/Contents %d 0 R", &contents); |
| |
p = strstr(obj->unparsed, "/Resources "); |
| |
if (!p) { |
| |
/* error */ |
| |
return; |
| |
} |
| |
sscanf(p, "/Resources %d 0 R", &resources); |
| |
fill_contents(contents); |
| |
page->contents = object[contents]->parsed; |
| |
fill_resources(resources); |
| |
page->resources = object[resources]->parsed; |
| |
p = strstr(obj->unparsed, "/Mediabox "); |
| |
if (!p) { |
| |
/* error */ |
| |
return; |
| |
} |
| |
mediabox = array(&p[11]); |
| |
page->mediabox[0] = (short) strtoul(mediabox[1], NULL, 10); |
| |
free(mediabox[1]); |
| |
page->mediabox[1] = (short) strtoul(mediabox[2], NULL, 10); |
| |
free(mediabox[2]); |
| |
page->mediabox[2] = (short) strtoul(mediabox[3], NULL, 10); |
| |
free(mediabox[3]); |
| |
page->mediabox[3] = (short) strtoul(mediabox[4], NULL, 10); |
| |
free(mediabox[4]); |
| |
free(mediabox); |
| |
p = strstr(obj->unparsed, "/Parent "); |
| |
if (!p) { |
| |
/* error */ |
| |
return; |
| |
} |
| |
sscanf(p, "/Parent %d 0 R", &page->parent); |
| |
free(obj->unparsed); |
| |
obj->unparsed = NULL; |
| |
obj->type = PAGE; |
| |
obj->parsed = page; |
| |
return; |
| |
} |
| |
|
| |
void fill_contents(int page_num) |
| |
{ |
| |
struct contents *content; |
| |
struct object *obj; |
| |
char *p; |
| |
if (object[page_num]->type == CONTENT) |
| |
return; |
| |
content = (struct content *) malloc(sizeof(struct content)); |
| |
obj = object[page_num]; |
| |
p = strstr(obj->unparsed, "/Length "); |
| |
if (!p) { |
| |
/* error */ |
| |
return; |
| |
} |
| |
sscanf(p, "/Length %d", &content->length); |
| |
p = strstr(obj->unparsed, "/Filter "); |
| |
if (!p) { |
| |
/* error */ |
| |
return; |
| |
} |
| |
content->filter = get_filternum(&p[9]); |
| |
p = strstr(obj->unparsed, "stream"); |
| |
if (!p) { |
| |
/* error */ |
| |
return; |
| |
} |
| |
content->stream = (char *) malloc(content->length); |
| |
strncpy(content->stream, &p[7], content->length); |
| |
free(obj->unparsed); |
| |
obj->unparsed = NULL; |
| |
obj->type = CONTENT; |
| |
obj->parsed = content; |
| |
return; |
| |
} |