| 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; |
| |
} |