verzia 1.5, 2002/09/26 17:45:15 |
verzia 1.6, 2002/10/03 17:13:20 |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
#include <errno.h> |
|
#include <sys/stat.h> |
|
#include <sys/types.h> |
|
#include <unistd.h> |
|
|
|
#include "cpdf.h" |
#include "parse.h" |
#include "parse.h" |
void *xmalloc(size_t size); |
#include "utils.h" |
/* function compute number of locations of char c from buffer to character c |
/* function compute number of locations of char c from buffer to character c |
*/ |
*/ |
int strlenc(char *buffer, char c, char to) |
int strlenc(char *buffer, char c, char to) |
Riadok 103 char **array(char *buffer) |
|
Riadok 109 char **array(char *buffer) |
|
} while (end > 0); |
} while (end > 0); |
return ret; |
return ret; |
} |
} |
|
|
|
#define BUFLEN 255 |
|
void read_obj(long offset) |
|
{ |
|
char buffer[BUFLEN]; |
|
int obj_num,size = 0; |
|
struct object *obj = |
|
(struct object *) xcalloc(sizeof(struct object),1); |
|
fseek(fp, offset, SEEK_SET); |
|
fget(&buffer[0], BUFLEN, fp); |
|
sscanf(&buffer[0], "%d ", &obj_num); |
|
fget(&buffer[0],BUFLEN,fp); |
|
while(!strstr(&buffer[0],"endobj")) { |
|
size += strlen(&buffer[0]); |
|
obj->unparsed = resize(obj->unparsed,size); |
|
strcat(obj->unparsed,&buffer[0]); |
|
fget(&buffer[0],BUFLEN,fp); |
|
} |
|
object[obj_num] = obj; |
|
return; |
|
} |
|
/* obj->type = UNKNOWN; |
|
obj->obj = NULL; |
|
if(!strstr(&buffer[0],"<<")) { |
|
obj->type = NOTYPE; |
|
obj->obj = fill_data(); |
|
} |
|
while (buffer[0] != '>' && buffer[1] != '>' |
|
&& obj->type == UNKNOWN) { |
|
if (!strncmp(&buffer[0], "/Type", 5)) { |
|
if (!strncmp(&buffer[7], "Page", 4)) { |
|
obj->type = PAGE; |
|
} |
|
if (!strncmp(&buffer[7], "Pages", 5)) { |
|
obj->type = PAGES; |
|
} |
|
if (!strncmp(&buffer[7], "Catalog", 7)) { |
|
obj->type = CATALOG; |
|
} |
|
if (!strncmp(&buffer[7], "Encoding", 8)) { |
|
obj->type = ENCODING; |
|
} |
|
if (!strncmp(&buffer[7], "XObject", 7)) { |
|
obj->type = XOBJECT; |
|
} |
|
} |
|
if (!strncmp(&buffer[0], "/Font", 5)) { |
|
obj->type = FONT; |
|
} |
|
if (!strncmp(&buffer[0], "stream", 7)) { |
|
obj->type = CONTENT; |
|
} |
|
fget(&buffer[0], BUFLEN, fp); |
|
}*/ |
|
|
|
void add_obj(char *s) |
|
{ |
|
long offset, old_off; |
|
sscanf(s, "%ld ", &offset); |
|
old_off = ftell(fp); |
|
read_obj(offset); |
|
fseek(fp, old_off, SEEK_SET); |
|
} |
|
|
|
/* find objects */ |
|
void xref(void) |
|
{ |
|
char xref[XREFLINE]; |
|
long offset = 0; |
|
int i = XREFLINE - 2; |
|
xref[XREFLINE - 1] = '\0'; |
|
fstat(fp->_fileno, &fpstat); |
|
offset = fpstat.st_size - 8; |
|
fseek(fp, offset, SEEK_SET); |
|
while (1) { |
|
xref[i] = fgetc(fp); |
|
if (xref[i] == '\r' || xref[i] == '\n') |
|
break; |
|
i--; |
|
offset--; |
|
fseek(fp, offset, SEEK_SET); |
|
} |
|
offset = strtoul(&xref[i + 1], NULL, 10); |
|
fseek(fp, offset, SEEK_SET); |
|
fget(&xref[0], XREFLINE, fp); |
|
if (strstr(&xref[0], "xref") == NULL) { |
|
/* error */ |
|
return; |
|
} |
|
fget(&xref[0], XREFLINE, fp); |
|
{ |
|
int entry[2]; |
|
sscanf(&xref[0], "%d %d", &entry[0], &entry[1]); |
|
object = (struct object **) xmalloc(entry[0] + entry[1]); |
|
fseek(fp,20,SEEK_CUR); |
|
while (entry[1] >= 0) { |
|
fget(&xref[0], XREFLINE, fp); |
|
add_obj(&xref[0]); |
|
entry[1]--; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
int parse_pdf(void) |
|
{ |
|
xref(); |
|
return 0; |
|
} |