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