| verzia 1.9, 2002/10/08 18:48:58 |
verzia 1.10, 2002/10/08 19:46:49 |
| Riadok 174 void add_obj(char *s) |
|
| Riadok 174 void add_obj(char *s) |
|
| fseek(fp, old_off, SEEK_SET); |
fseek(fp, old_off, SEEK_SET); |
| } |
} |
| |
|
| /* find objects */ |
long get_startxref(void) |
| void xref(void) |
|
| { |
{ |
| char xref[XREFLINE]; |
char startxref[XREFLINE]; |
| long offset = 0; |
long offset; |
| int i = XREFLINE - 2; |
int i = XREFLINE - 2; |
| xref[XREFLINE - 1] = '\0'; |
startxref[XREFLINE - 1] = '\0'; |
| fstat(fp->_fileno, &fpstat); |
fstat(fp->_fileno, &fpstat); |
| offset = fpstat.st_size - 8; |
offset = fpstat.st_size - 8; |
| fseek(fp, offset, SEEK_SET); |
fseek(fp, offset, SEEK_SET); |
| while (1) { |
while (1) { |
| xref[i] = fgetc(fp); |
startxref[i] = fgetc(fp); |
| if (xref[i] == '\r' || xref[i] == '\n') |
if (startxref[i] == '\r' || startxref[i] == '\n') |
| break; |
break; |
| i--; |
i--; |
| offset--; |
offset--; |
| fseek(fp, offset, SEEK_SET); |
fseek(fp, offset, SEEK_SET); |
| } |
} |
| offset = strtoul(&xref[i + 1], NULL, 10); |
return strtoul(&startxref[i + 1], NULL, 10); |
| |
} |
| |
|
| |
/* find objects */ |
| |
void xref(void) |
| |
{ |
| |
char xref[XREFLINE]; |
| |
long offset = 0; |
| |
offset = get_startxref(); |
| fseek(fp, offset, SEEK_SET); |
fseek(fp, offset, SEEK_SET); |
| fget(&xref[0], XREFLINE, fp); |
fget(xref, XREFLINE, fp); |
| if (strstr(&xref[0], "xref") == NULL) { |
if (strstr(xref, "xref") == NULL) { |
| /* error */ |
/* error */ |
| return; |
return; |
| } |
} |
| fget(&xref[0], XREFLINE, fp); |
object = (struct object **) xmalloc(sizeof(struct object)); |
| |
obj_count = 1; |
| { |
{ |
| int entry[2]; |
int entry[2]; |
| sscanf(&xref[0], "%d %d", &entry[0], &entry[1]); |
do { |
| object = (struct object **) xmalloc(entry[0] + entry[1]); |
fget(xref, XREFLINE, fp); |
| if (!entry[0]) |
sscanf(xref, "%d %d", &entry[0], &entry[1]); |
| fseek(fp, 20, SEEK_CUR); |
if (entry[0] + entry[1] > obj_count) { |
| fget(&xref[0], XREFLINE, fp); |
object = |
| while (strncmp(&xref[0], "trailer", 5)) { |
(struct object **) realloc(object, |
| add_obj(&xref[0]); |
entry[0] + |
| fget(&xref[0], XREFLINE, fp); |
entry[1] + 1); |
| } |
obj_count = entry[0] + entry[1]; |
| |
} |
| |
if (!entry[0]) |
| |
fseek(fp, 20, SEEK_CUR); |
| |
fget(xref, XREFLINE, fp); |
| |
while (strncmp(xref, "trailer", 7)) { |
| |
add_obj(&xref[0]); |
| |
fget(xref, XREFLINE, fp); |
| |
} |
| |
fseek(fp, 3, SEEK_CUR); |
| |
fget(xref, XREFLINE, fp); |
| |
trailer.prev = 0; |
| |
while (xref[0] != '>' && xref[1] != '>') { |
| |
if (!strncmp(xref, "/Root", 5)) |
| |
sscanf(xref, "/Root %d 0 R\n", |
| |
&trailer.root); |
| |
if (!strncmp(xref, "/Info", 5)) |
| |
sscanf(xref, "/Info %d 0 R\n", |
| |
&trailer.info); |
| |
if (!strncmp(xref, "/Prev", 5)) |
| |
sscanf(xref, "/Prev %ld", |
| |
&trailer.prev); |
| |
fget(xref, XREFLINE, fp); |
| |
} |
| |
if (!trailer.prev) |
| |
break; |
| |
fseek(fp, trailer.prev, SEEK_SET); |
| |
} while (1); |
| } |
} |
| return; |
return; |
| } |
} |