Files
Arquivotheca.SunOS-4.1.4/usr.lib/libcore/pdfio.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

166 lines
4.0 KiB
C

/*
* Copyright (c) 1986, 1987, 1988, 1989 by Sun Microsystems, Inc.
* Permission to use, copy, modify, and distribute this software for any
* purpose and without fee is hereby granted, provided that the above
* copyright notice appear in all copies and that both that copyright
* notice and this permission notice are retained, and that the name
* of Sun Microsystems, Inc., not be used in advertising or publicity
* pertaining to this software without specific, written prior permission.
* Sun Microsystems, Inc., makes no representations about the suitability
* of this software or the interface defined in this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
#ifndef lint
static char sccsid[] = "@(#)pdfio.c 1.1 94/10/31 Copyr 1986 Sun Micro";
#endif
/*
* Copyright (c) 1986 by Sun Microsystems, Inc.
*/
#include "coretypes.h"
#include "corevars.h"
#include <stdio.h>
#define PDFCHUNK 32768 /* words in PDF chunk */
static short *pdfstart, *pdfend;/* pointers to start and end of PDF */
static int pdfptr, pdfnext; /* PDF read ptr and write ptr */
extern char *malloc();
extern char *realloc();
_core_pdfread(shortcnt, data)
int shortcnt;
register short *data;
{ /* read count words from the PDF */
register short *ptr;
register int i;
ptr = &(pdfstart[pdfptr]);
if (pdfptr + shortcnt > pdfnext) {
*data = PDFENDSEGMENT;
return (pdfptr);
}
for (i = 0; i < shortcnt; i++)
*data++ = *ptr++;
pdfptr += shortcnt;
return (pdfptr);
}
_core_pdfwrite(shortcnt, data)
int shortcnt;
register short *data;
{ /* append count words to the PDF, count must
* be <PDFCHUNK */
register short *ptr;
register int i;
ptr = &(pdfstart[pdfnext]);
if (ptr + shortcnt >= pdfend) {
short *newstart;
int size;
newstart = (short *)realloc((char *)pdfstart,
(unsigned int)((pdfend - pdfstart + shortcnt + PDFCHUNK + 1) << 1));
if (newstart) {
size = pdfend - pdfstart + shortcnt + PDFCHUNK;
pdfstart = newstart;
pdfend = pdfstart + size;
ptr = &(pdfstart[pdfnext]);
} else {
(void)fprintf(stderr,
"Display list overflow; delete segments before adding more!\n");
return (1);
}
}
for (i = 0; i < shortcnt; i++)
*ptr++ = *data++;
pdfnext += shortcnt;
return (pdfnext);
}
_core_pdfskip(shortnum)
int shortnum;
{
pdfptr += shortnum;
return (pdfptr);
}
_core_pdfseek(wordnum, mode, dataptr)
int wordnum, mode;
short **dataptr;
{ /* read data into buffers and return ptr into
* buffer */
if (mode) {
*dataptr = &(pdfstart[pdfptr + wordnum]);
pdfptr += wordnum;
} else {
*dataptr = &(pdfstart[wordnum]);
pdfptr = wordnum;
}
return (pdfptr);
}
_core_pdfmarkend()
{ /* mark temporary end of segment and backup */
short ptype = PDFENDSEGMENT;
(void)_core_pdfwrite(SHORT, &ptype);
pdfnext--;
}
_core_PDFinit()
{
int i, words;
pdfptr = 0;
pdfnext = 0;
words = PDFCHUNK;
for (i = 0; i < 3; i++) {
pdfstart = (short *) malloc((unsigned int)(words * sizeof(short))); /* word array */
pdfend = pdfstart + words;
if (pdfstart)
break;
else {
(void)fprintf(stderr,
"Insufficient disk pages for %D word virtual display list.\n",
words);
words >>= 1;
}
}
return ((int) pdfstart);
}
_core_PDFclose()
{
if (pdfstart)
free((char *)pdfstart);
}
_core_PDFcompress(segptr) /* compress the PDF */
segstruc *segptr;
{
int i;
short *ptr1, *ptr2;
segstruc *sptr;
if (segptr == (segstruc *) 0) {
pdfnext = 0;
return (0);
}
ptr1 = &(pdfstart[segptr->pdfptr]);
ptr2 = ptr1 + segptr->segsize;
for (i = 0; i < (pdfnext - (segptr->pdfptr + segptr->segsize)); i++)
*ptr1++ = *ptr2++;
pdfnext -= segptr->segsize;
for (sptr = &_core_segment[0]; sptr < &_core_segment[SEGNUM]; sptr++) {
if (sptr->type == EMPTY)
break;
if (sptr->pdfptr > segptr->pdfptr)
sptr->pdfptr -= segptr->segsize;
}
return (0);
}