diff options
Diffstat (limited to 'Build/source/texk/dvipsk/output.c')
-rw-r--r-- | Build/source/texk/dvipsk/output.c | 1897 |
1 files changed, 0 insertions, 1897 deletions
diff --git a/Build/source/texk/dvipsk/output.c b/Build/source/texk/dvipsk/output.c deleted file mode 100644 index da3b6098262..00000000000 --- a/Build/source/texk/dvipsk/output.c +++ /dev/null @@ -1,1897 +0,0 @@ -/* - * These routines do most of the communicating with the printer. - * - * LINELENGTH tells the maximum line length to send out. It's been - * reduced to 72 because sometimes PostScript files are included in - * mail messages and many mailers mutilate longer lines. - */ -#define LINELENGTH (72) -#include "dvips.h" /* The copyright notice in that file is included too! */ -#include <ctype.h> -#include <stdlib.h> - -#ifdef OS2 -#ifdef _MSC_VER -#define popen(pcmd, pmode) _popen(pcmd, pmode) -#define pclose(pstream) _pclose(pstream) -#endif -#endif -#if defined(WIN32) && defined(KPATHSEA) -#undef fopen -#undef popen -#undef pclose -extern FILE *generic_fsyscp_fopen(const char *name, const char *mode); -#define fopen(file, fmode) generic_fsyscp_fopen(file, fmode) -#define popen(pcmd, pmode) fsyscp_popen(pcmd, pmode) -#define pclose(pstream) _pclose(pstream) -#endif - -#ifdef __DJGPP__ -#include <unistd.h> /* for `isatty' */ -#endif - -/* UCS -> UTF-8 */ -#define UCStoUTF8B1(x) (0xc0 + (((x) >> 6) & 0x1f)) -#define UCStoUTF8B2(x) (0x80 + (((x) ) & 0x3f)) - -#define UCStoUTF8C1(x) (0xe0 + (((x) >> 12) & 0x0f)) -#define UCStoUTF8C2(x) (0x80 + (((x) >> 6) & 0x3f)) -#define UCStoUTF8C3(x) (0x80 + (((x) ) & 0x3f)) - -#define UCStoUTF8D1(x) (0xf0 + (((x) >> 18) & 0x07)) -#define UCStoUTF8D2(x) (0x80 + (((x) >> 12) & 0x3f)) -#define UCStoUTF8D3(x) (0x80 + (((x) >> 6) & 0x3f)) -#define UCStoUTF8D4(x) (0x80 + (((x) ) & 0x3f)) - -/* UTF-32 over U+FFFF -> UTF-16 surrogate pair */ -#define UTF32toUTF16HS(x) (0xd800 + (((x-0x10000) >> 10) & 0x3ff)) -#define UTF32toUTF16LS(x) (0xdc00 + ( x & 0x3ff)) - -/* - * The external declarations: - */ -#include "protos.h" - -char preamblecomment[256]; /* usually "TeX output ..." */ -integer rdir = 0, fdir = 0; -/* - * We need a few statics to take care of things. - */ -static void chrcmd(char c); -static void tell_needed_fonts(void); -static void print_composefont(void); -static void setdir(int d); -static int JIStoSJIS(int c); - -static Boolean any_dir = 0; /* did we output any direction commands? */ -static Boolean jflag = 0; -static integer rhh, rvv; -static int instring; -static Boolean lastspecial = 1; -static shalfword d; -static Boolean popened = 0; -static int lastfont; -static char strbuffer[LINELENGTH + 20], *strbp = strbuffer; -static struct papsiz *finpapsiz; -static struct papsiz defpapsiz = { - 0, 40258437L, 52099154L, "letter", "" -}; -#ifdef CREATIONDATE -#if (!defined(VMS) && !defined(MSDOS) && !(defined(OS2) && defined(_MSC_VER)) && !defined(ATARIST)) - /* VAXC/MSDOS don't like/need this !! */ -#include <sys/types.h> -#ifndef WIN32 -#include <sys/time.h> /* time(), at least on BSD Unix */ -#endif -#endif -#include <time.h> /* asctime() and localtime(), at least on BSD Unix */ -static time_t jobtime; - -#if defined(_MSC_VER) -#define strtoll _strtoi64 -#endif - -#define INVALID_EPOCH_VALUE ((time_t) -1) - -static time_t -get_unique_time_if_given(void) -{ - const char *source_date_epoch; - int64_t epoch; - char *endptr; - time_t ret = INVALID_EPOCH_VALUE; - - source_date_epoch = getenv("SOURCE_DATE_EPOCH"); - if (source_date_epoch) { - errno = 0; - epoch = strtoll(source_date_epoch, &endptr, 10); - if (!(epoch < 0 || *endptr != '\0' || errno != 0)) { - ret = (time_t) epoch; -#if defined(_MSC_VER) - if (ret > 32535291599ULL) - ret = 32535291599ULL; -#endif - } - } - return ret; -} -#endif /* CREATIONDATE */ - -/* - * This routine copies a file down the pipe. Search path uses the - * header path. - * - * We add code to handle the case of MS-DOS font files. - * - * Format: 80 {01,02} four byte length in littleendian order data - * repeated possibly multiple times. - */ -static const char *hxdata = "0123456789ABCDEF"; -static int infigure; -static char possibleDSCLine[81], - *dscLinePointer = possibleDSCLine, *dscLineEnd = possibleDSCLine + 80; -void -copyfile_general(const char *s, struct header_list *cur_header) -{ - FILE *f = NULL; - int c, prevc = '\n'; - long len; - /* begin DOS EPS code */ - int doseps = 0; - unsigned long dosepsbegin, dosepsend = 0; - int removingBytes = 0; - const char *scanForEnd = 0; - int scanningFont = 0; - - /* end DOS EPS code */ -#if defined(VMCMS) || defined (MVSXA) - register char *lastdirsep; - register char *trunc_s; - trunc_s = s; -#endif - dscLinePointer = possibleDSCLine; - - switch (infigure) { - case 1: -/* - * Look in headerpath too, just in case. This allows common header - * or figure files to be installed in the .../ps directory. - */ - f = search(figpath, s, READBIN); -#if defined(WIN32) - if (f == 0 && file_system_codepage != win32_codepage) { - int tmpcp = file_system_codepage; - file_system_codepage = win32_codepage; - f = search(figpath, s, READBIN); - file_system_codepage = tmpcp; - } -#endif - if (f == 0) - f = search(headerpath, s, READBIN); -#if defined(VMCMS) || defined (MVSXA) - lastdirsep = strrchr(s, '/'); - if ( NULL != lastdirsep ) trunc_s = lastdirsep + 1; -#ifdef VMCMS - sprintf(errbuf, - "Couldn't find figure file %s with CMS name %s; continuing.", s, trunc_s); - if (secure == 2) { - strcat(errbuf, "\nNote that an absolute path or a relative path with .. are denied in -R2 mode."); - } -#else /* ! VMCMS */ - sprintf(errbuf, - "Couldn't find figure file %s with MVS name %s; continuing.", s, trunc_s); - if (secure == 2) { - strcat(errbuf, "\nNote that an absolute path or a relative path with .. are denied in -R2 mode."); - } -#endif /* ! VMCMS */ -#else /* ! (VMCMS || MVSXA) */ - sprintf(errbuf, "Could not find figure file %.500s; continuing.", s); - if (secure == 2) { - strcat(errbuf, "\nNote that an absolute path or a relative path with .. are denied in -R2 mode."); - } -#endif /* !(VMCMS || MVSXA) */ - break; -#ifndef VMCMS -#ifndef MVSXA -#ifndef VMS -#if !defined(MSDOS) || defined(__DJGPP__) -#ifndef ATARIST -#ifndef __THINK__ - case 2: -#ifdef SECURE - sprintf(errbuf, "<%.500s>: Tick filename execution disabled", s); -#else -#ifdef OS2 - if (_osmode == OS2_MODE) { -#endif - if (secure == 0) { - sprintf(errbuf, "Execution of <%.500s> failed ", s); - f = popen(s, "r"); - if (f != 0) - SET_BINARY(fileno(f)); - } - else { - sprintf(errbuf,"Secure mode is %d so execute <%.500s> will not run", - secure, s); - } -#ifdef OS2 - } -#endif -#endif - break; -#endif -#endif -#endif -#endif -#endif -#endif - default: - f = search(headerpath, s, READBIN); - if(cur_header && (cur_header->precode || cur_header->postcode)) { - if(f==NULL) - f = search(figpath, s, READBIN); - } - sprintf(errbuf, "! Could not find header file %.500s.", s); - if (secure == 2) { - strcat(errbuf, "\nNote that an absolute path or a relative path with .. are denied in -R2 mode."); - } - break; - } - if (f==NULL) { - found_problems = 1; /* continue, but eventually exit unsuccessfully */ - error(errbuf); - } else { - if (! quiet) { -#if defined(VMCMS) || defined (MVSXA) - if (strlen(s) + prettycolumn > STDOUTSIZE) { -#else - if (strlen(realnameoffile) + prettycolumn > STDOUTSIZE) { -#endif - fprintf(stderr, "\n"); - prettycolumn = 0; - } -#if defined(VMCMS) || defined (MVSXA) - fprintf(stderr, "<%s>", trunc_s); -#else - fprintf_str(stderr, "<%s>", realnameoffile); -#endif - fflush(stderr); -#if defined(VMCMS) || defined (MVSXA) - prettycolumn += 2 + strlen(s); -#else - prettycolumn += 2 + strlen(realnameoffile); -#endif - } - if (linepos != 0) - putc('\n', bitfile); -/* - * Suggested by Andrew Trevorrow; don't ever BeginFont a file ending in .enc - */ - if (infont && strstr(s,".enc")) - infont = 0; - if (! disablecomments) { - if (infigure) - fprintf(bitfile, "%%%%BeginDocument: %s\n", s); - else if (infont) - fprintf(bitfile, "%%%%BeginFont: %s\n", infont); -#ifdef HPS - else if (noprocset) {} -#endif - else - fprintf(bitfile, "%%%%BeginProcSet: %s 0 0\n", s); - } - if (cur_header && cur_header->precode) { - fprintf(bitfile, "%s\n", cur_header->precode); - free(cur_header->precode); - } - c = getc(f); - if (c == 0x80) { - while (1) { - c = getc(f); - switch(c) { -case 1: -case 2: - len = getc(f); - len += getc(f) * 256L; - len += getc(f) * 65536L; - len += getc(f) * 256L * 65536; - if (c == 1) { - while (len > 0) { - c = getc(f); - if (c == EOF) { - error("premature EOF in MS-DOS font file"); - len = 0; - } else { - if (c == '\r') { /* Mac- or DOS-style text file */ - putc('\n', bitfile); - if ((c = getc(f)) == '\n') /* DOS-style text */ - len--; /* consume, but don't generate NL */ - else - ungetc(c, f); - } - else - putc(c, bitfile); - len--; - } - } - } else { - putc('\n', bitfile); - prevc = 0; - while (len > 0) { - c = getc(f); - if (c == EOF) { - error("premature EOF in MS-DOS font file"); - len = 0; - } else { - putc(hxdata[c >> 4], bitfile); - putc(hxdata[c & 15], bitfile); - len--; - prevc += 2; - if (prevc >= 76) { - putc('\n', bitfile); - prevc = 0; - } - } - } - } - break; -case 3: - goto msdosdone; -default: - error("saw type other than 1, 2, or 3 in MS-DOS font file"); - break; - } - c = getc(f); - if (c == EOF) - break; - if (c != 0x80) { - error("saw non-MSDOS header in MSDOS font file"); - break; - } - } -msdosdone: - prevc = 0; - } else { -/* begin DOS EPS code */ - if (c == 'E'+0x80) { - if ((getc(f)=='P'+0x80) && (getc(f)=='S'+0x80) - && (getc(f)=='F'+0x80)) { - doseps = 1; - dosepsbegin = getc(f); - dosepsbegin += getc(f) * 256L; - dosepsbegin += getc(f) * 65536L; - dosepsbegin += getc(f) * 256L * 65536; - dosepsend = getc(f); - dosepsend += getc(f) * 256L; - dosepsend += getc(f) * 65536L; - dosepsend += getc(f) * 256L * 65536; - fseek(f, dosepsbegin, 0); - c = getc(f); - dosepsend--; - } - else { - rewind(f); - c = getc(f); - } - } -/* end DOS EPS code */ - if (c != EOF) { - while (1) { - if (c == '\n') { /* end or beginning of line; check DSC */ - *dscLinePointer = 0; /* make sure we terminate! - * might be a new empty line! */ - if (strncmp(possibleDSCLine, "%%BeginBinary:", 14) == 0 || - strncmp(possibleDSCLine, "%%BeginData:", 12) == 0 || - strncmp(possibleDSCLine, "%%BeginFont:", 12) == 0) { - integer size = 0; - char *p = possibleDSCLine; - *dscLinePointer = 0; - *dscLineEnd = 0; - if (scanForEnd == 0 && removecomments) { - fputs(possibleDSCLine, bitfile); - putc('\n', bitfile); - } - - if (strncmp(possibleDSCLine, "%%BeginFont:", 12) == 0) { - - /* Theoretically, we could wait until we see - the "currentfile eexec" and possibly even - check that the following data really looks - like binary before we begin verbatim - copying, but that would complicate the code - beyond our present needs. If we were going - to do that much work, this entire chunk of - code should probably be - rewritten. [dmj@ams.org, 2007/08/20] */ - - scanForEnd = "%%EndFont"; - scanningFont = 1; - } else { - scanningFont = 0; - - scanForEnd = 0; - while (*p != ':') - p++; - p++; - while (*p && *p <= ' ') - p++; - if ('0' > *p || *p > '9') { - /* - * No byte count! We need to scan for end binary - * or end data, and hope we get it right. Really - * the file is malformed. - */ - scanForEnd = "Yes"; - } - while ('0' <= *p && *p <= '9') { - size = size * 10 + *p - '0'; - p++; - } - while (*p && *p <= ' ') - p++; - if (*p == 'h' || *p == 'H') - /* - * Illustrator 8 and 9 have bogus byte counts - * for hex data. But if it is hex, we assume - * that it is safe to use ASCII scanning, so - * we do so. - */ - scanForEnd = "Yes"; - while (*p > ' ') /* ignore Hex/Binary/ASCII */ - p++; - while (*p && *p <= ' ') - p++; - putc(c, bitfile); - if (c == '\r') { /* maybe we have a DOS-style text file */ - c = getc(f); - if (c == '\n') { - putc(c, bitfile); - dosepsend--; - } else - ungetc(c, f); - } - if (scanForEnd != 0) { - if (strncmp(possibleDSCLine, "%%BeginBinary", 13) == 0) - scanForEnd = "%%EndBinary"; - else - scanForEnd = "%%EndData"; - } - } - if (scanForEnd == 0) { - if (strncmp(p, "lines", 5) != 0 && - strncmp(p, "Lines", 5) != 0) { - for (; size>0; size--) { - c = getc(f); - dosepsend--; - if (c == EOF) - error( - "! premature end of file in binary section"); - putc(c, bitfile); - } - } else { - /* - * Count both newlines and returns, and when either - * goes over the count, we are done. - */ - int newlines=0, returns=0; - while (newlines < size && returns < size) { - c = getc(f); - dosepsend--; - if (c == EOF) - error( - "! premature end of file in binary section"); - putc(c, bitfile); - if (c == '\n') - newlines++; - else if (c == '\r') - returns++; - } - /* - * If we've seen precisely one too few newlines, - * and the next char is a newline, include it too. - */ - if (returns == newlines + 1) { - if ((c = getc(f)) == '\n') { - putc(c, bitfile); - dosepsend--; - } else { - ungetc(c, f); - } - } - } - c = getc(f); - dosepsend--; - if (c == '\n' || c == '\r') { - putc(c, bitfile); - if (c == '\r') { /* DOS-style text file? */ - c = getc(f); - dosepsend--; - if (c == '\n') { - putc(c, bitfile); - c = getc(f); - dosepsend--; - } - } else { - c = getc(f); - dosepsend--; - } - } - if (c != '%') { - /* try to find %%EndBinary or %%EndData anywhere - in the rest of the file, and pretend it - worked; this works around various Illustrator - bugs. -tgr, 14 June 2003 */ - const char *m1 = "%%EndData"; - const char *m2 = "%%EndBinary"; - const char *p1 = m1; - const char *p2 = m2; - error( - " expected to see %%EndBinary at end of data; struggling on"); - while (1) { - putc(c, bitfile); - if (c == '\r' || c == '\n') { - if (c == '\r') { /* DOS-style text file? */ - c = getc(f); - if (c != '\n') - ungetc(c, f); - else - dosepsend--; - } - break; - } - c = getc(f); - dosepsend--; - if (c == EOF) - error( - "! premature end of file in binary section"); - /* - * By the way, this code can be fooled by things like %%%EndBinary - * or even %%EndBi%%EndBinary, but this isn't valid DSC anyway. - * This comment is mainly here to prevent anyone else from emulating - * this code when doing stream-based substring matching. - */ - if (c == *p1) { - p1++; - if (*p1 == 0) - break; - } else { - p1 = m1; - } - if (c == *p2) { - p2++; - if (*p2 == 0) - break; - } else { - p2 = m2; - } - } - } - while (1) { - putc(c, bitfile); - if (c == '\r' || c == '\n') { - if (c == '\r') { /* DOS-style text file? */ - c = getc(f); - if (c != '\n') - ungetc(c, f); - else { - putc(c, bitfile); - dosepsend--; - } - } - break; - } - c = getc(f); - removingBytes = 0; - dosepsend--; - if (c == EOF) - error( - "! premature end of file in binary section"); - } - c = getc(f); - dosepsend--; - } - } else if (scanForEnd && strncmp(possibleDSCLine, scanForEnd, - strlen(scanForEnd))==0) { - scanForEnd = 0; - scanningFont = 0; - } - dscLinePointer = possibleDSCLine; - } else if (dscLinePointer < dscLineEnd) { - *dscLinePointer++ = c; - if (removecomments && scanForEnd == 0 && - c == '%' && dscLinePointer == possibleDSCLine + 1) { - /* % is first char */ - c = getc(f); - if (c == '%' || c == '!') - removingBytes = 1; - if (c != EOF) - ungetc(c, f); - c = '%'; - } - } -#if defined(VMCMS) || defined (MVSXA) - if (c != 0x37 || scanningFont) { -#else - if (c != 4 || scanningFont) { -#endif - if (!removingBytes) - putc(c, bitfile); - } - prevc = c; -/* begin DOS EPS code */ - if (doseps && (dosepsend <= 0)) - break; /* stop at end of DOS EPS PostScript section */ -/* end DOS EPS code */ - c = getc(f); - dosepsend--; - if (c == EOF) - break; - else if (c == '\r' && ! scanningFont) { - c = getc(f); - if (c == '\n') { /* DOS-style text file? */ - if (!removingBytes) putc('\r', bitfile); - dosepsend--; - } else - ungetc(c, f); - c = '\n'; - } - if (prevc == '\n') - removingBytes = 0; - } - } - } - if (prevc != '\n') - putc('\n', bitfile); - linepos = 0; -#ifndef VMCMS -#ifndef MVSXA -#ifndef VMS -#if !defined(MSDOS) || defined(__DJGPP__) -#ifndef ATARIST -#ifndef __THINK__ - if (infigure == 2) -#ifdef OS2 - { - if (_osmode == OS2_MODE) - pclose(f); - } -#else - pclose(f); -#endif - else -#endif -#endif -#endif -#endif -#endif -#endif - fclose(f); - if (cur_header && cur_header->postcode) { - fprintf(bitfile, "\n%s", cur_header->postcode); - free(cur_header->postcode); - } - if (!disablecomments) { - if (infigure) - fprintf(bitfile, "\n%%%%EndDocument\n"); - else if (infont) - fprintf(bitfile, "\n%%%%EndFont\n"); -#ifdef HPS - else if (noprocset) {} -#endif - else - fprintf(bitfile, "\n%%%%EndProcSet\n"); - } - } -} - -void -copyfile(const char *s) -{ - copyfile_general(s, NULL); -} - -/* - * For included PostScript graphics, we use the above routine, but - * with no fatal error message. - */ -void -figcopyfile(char *s, int systemtype) -{ - infigure = systemtype ? 2 : 1; - copyfile(s); - infigure = 0; -} -/* - * This next routine writes out a `special' character. In this case, - * we simply put it out, since any special character terminates the - * preceding token. - */ -void -specialout(char c) -{ - if (linepos >= LINELENGTH) { - putc('\n', bitfile); - linepos = 0; - } - putc(c, bitfile); - linepos++; - lastspecial = 1; -} - -void -stringend(void) -{ - if (linepos + instring >= LINELENGTH - 2) { - putc('\n', bitfile); - linepos = 0; - } - putc('(', bitfile); - *strbp = 0; - fputs(strbuffer, bitfile); - putc(')', bitfile); - linepos += instring + 2; - lastspecial = 1; - instring = 0; - strbp = strbuffer; -} - -#ifdef SHIFTLOWCHARS -/* - * moving chars 0-32 and 127 to higher positions - * is desirable when using some fonts - */ -int -T1Char(int c) -{ - int tmpchr = c; - if (shiftlowchars && curfnt->resfont) { - if ((tmpchr <= 0x20)&&(tmpchr>=0)) { - if (tmpchr < 0x0A) { - tmpchr += 0xA1; - } - else { - tmpchr += 0xA3; - } - } - else if (tmpchr == 0x7F) { - tmpchr = 0xC4; - } - } - if (curfnt->chardesc[tmpchr].flags2 & EXISTS) - tmpchr = c; - return tmpchr; -} -#endif - -void -scout(unsigned char c) /* string character out */ -{ -/* - * Is there room in the buffer? LINELENGTH-6 is used because we - * need room for (, ), and a possible four-byte string \000, for - * instance. If it is too long, we send out the string. - */ - jflag = 0; - if (instring > LINELENGTH-6) { - stringend(); - chrcmd('p'); - } -#ifdef SHIFTLOWCHARS - c=T1Char(c); -#endif -/* changed next line to hex representation for VMCMS port - if (c<' ' || c > 126 || c=='%' ) { -*/ - if ( c<0x20 || c>= 0x7F || c==0x25 ) { - *strbp++ = '\\'; - *strbp++ = '0' + ((c >> 6) & 3); - *strbp++ = '0' + ((c >> 3) & 7); - *strbp++ = '0' + (c & 7); - instring += 4; - } else { -#if defined(VMCMS) || defined (MVSXA) - c = ascii2ebcdic[c]; -#endif - if (c == '(' || c == ')' || c == '\\') { - *strbp++ = '\\'; - *strbp++ = c; - instring += 2; - } else { - *strbp++ = c; - instring++; - } - } -} - -static void -scout2(int c) -{ - char s[64]; - - sprintf(s, "<%04x>p", c); - cmdout(s); -} - -static void -jscout(int c, char *fs) /* string character out */ -{ - char s[64]; - - if (!dir) { - numout(hh); - numout(vv); - } else { - numout(vv); - numout(-hh); - } - if (strstr(fs,"-UTF32-")!=NULL) { - snprintf(s, sizeof(s), "a<%08x>p", c); - } else if (strstr(fs,"-UTF8-")!=NULL) { - if (c<0x80) { - snprintf(s, sizeof(s), "a<%02x>p", c); - } else if (c<0x800) { - snprintf(s, sizeof(s), "a<%02x%02x>p", UCStoUTF8B1(c), UCStoUTF8B2(c)); - } else if (c<0x10000) { - snprintf(s, sizeof(s), "a<%02x%02x%02x>p", UCStoUTF8C1(c), - UCStoUTF8C2(c), UCStoUTF8C3(c)); - } else if (c<0x110000) { - snprintf(s, sizeof(s), "a<%02x%02x%02x%02x>p", UCStoUTF8D1(c), - UCStoUTF8D2(c), UCStoUTF8D3(c), UCStoUTF8D4(c)); - } else { - error("warning: Illegal code value."); - } - } else if (c>0xffff && strstr(fs,"-UTF16-")!=NULL) { - snprintf(s, sizeof(s), "a<%04x%04x>p", - UTF32toUTF16HS(c), UTF32toUTF16LS(c)); - } else { - if ((strstr(fs,"-RKSJ-")!=NULL)) c = JIStoSJIS(c); - snprintf(s, sizeof(s), "a<%04x>p", c); - } - cmdout(s); - instring = 0; - jflag = 1; - strbuffer[0] = '\0'; -} - -void -cmdout(const char *s) -{ - int l; - - /* hack added by dorab */ - if (instring && !jflag) { - stringend(); - chrcmd('p'); - } - l = strlen(s); - if ((! lastspecial && linepos >= LINELENGTH - 20) || - linepos + l >= LINELENGTH) { - putc('\n', bitfile); - linepos = 0; - } else if (! lastspecial) { - putc(' ', bitfile); - linepos++; - } - fputs(s, bitfile); - linepos += l; - lastspecial = 0; -} - -void psnameout(const char *s) { - // we lead with a special, so we don't need the space. - lastspecial = 1 ; - cmdout(s) ; -} - -void pslineout(const char *s) { - fputs(s, bitfile) ; - fprintf(bitfile, "\n"); - linepos = 0; -} - -static void -chrcmd(char c) -{ - if ((! lastspecial && linepos >= LINELENGTH - 20) || - linepos + 2 > LINELENGTH) { - putc('\n', bitfile); - linepos = 0; - } else if (! lastspecial) { - putc(' ', bitfile); - linepos++; - } - putc(c, bitfile); - linepos++; - lastspecial = 0; -} - -void -floatout(float n) -{ - char buf[50]; - - snprintf(buf, sizeof(buf), "%.2f", n); - cmdout(buf); -} - -void -doubleout(double n) -{ - char buf[50]; - - snprintf(buf, sizeof(buf), "%g", n); - cmdout(buf); -} - -void -numout(integer n) -{ - char buf[50]; - -#ifdef SHORTINT - snprintf(buf, sizeof(buf), "%ld", n); -#else - snprintf(buf, sizeof(buf), "%d", n); -#endif - cmdout(buf); -} - -void -mhexout(register unsigned char *p, - register long len) -{ - register const char *hexchar = hxdata; - register int n, k; - - while (len > 0) { - if (linepos > LINELENGTH - 2) { - putc('\n', bitfile); - linepos = 0; - } - k = (LINELENGTH - linepos) >> 1; - if (k > len) - k = len; - len -= k; - linepos += (k << 1); - while (k--) { - n = *p++; - putc(hexchar[n >> 4], bitfile); - putc(hexchar[n & 15], bitfile); - } - } -} - -static void -fontout(halfword n) -{ - char buf[6]; - - if (instring && !jflag) { - stringend(); - chrcmd('p'); - } - makepsname(buf, n); - cmdout(buf); - - lastfont = curfnt->psname; -} - -void -hvpos(void) -{ - if (!dir) { - if (rvv != vv || jflag) { - if (instring) { - stringend(); - numout(hh); - numout(vv); - chrcmd('y'); - } else if (rhh != hh || jflag) { - numout(hh); - numout(vv); - chrcmd('a') ; - } else { /* hard to get this case, but it's there when you need it! */ - numout(vv - rvv); - chrcmd('x'); - } - rvv = vv; - } else if (rhh != hh || jflag) { - if (instring) { - stringend(); - if (hh - rhh < 5 && rhh - hh < 5) { -#if defined(VMCMS) || defined (MVSXA) /* should replace 'p' in non-VMCMS, non-MVSXA line as well */ - chrcmd(ascii2ebcdic[(char)(112 + hh - rhh)]); -#else - chrcmd((char)('p' + hh - rhh)); -#endif - } else if (hh - rhh < d + 5 && rhh - hh < 5 - d) { -#if defined(VMCMS) || defined (MVSXA) /* should replace 'g' in non-VMCMS, non-MVSXA line as well */ - chrcmd(ascii2ebcdic[(char)(103 + hh - rhh - d)]); -#else - chrcmd((char)('g' + hh - rhh - d)); -#endif - d = hh - rhh; - } else { - numout(hh - rhh); - chrcmd('b'); - d = hh - rhh; - } - } else { - numout(hh - rhh); - chrcmd('w'); - } - } - rhh = hh; - } else { - if (rhh != hh || jflag) { - if (instring) { - stringend(); - numout(vv); - numout(-hh); - chrcmd('y'); - } else if (rvv != vv || jflag) { - numout(vv); - numout(-hh); - chrcmd('a'); - } else { /* hard to get this case, but it's there when you need it! */ - numout(rhh - hh); - chrcmd('x'); - } - rhh = hh; - } else if (rvv != vv || jflag) { - if (instring) { - stringend(); - if (vv - rvv < 5 && rvv - vv < 5) { -#if defined(VMCMS) || defined (MVSXA) /* should replace 'p' in non-VMCMS, non-MVSXA line as well */ - chrcmd(ascii2ebcdic[(char)(112 + vv - rvv)]); -#else - chrcmd((char)('p' + vv - rvv)); -#endif - } else if (vv - rvv < d + 5 && rvv - vv < 5 - d) { -#if defined(VMCMS) || defined (MVSXA) /* should replace 'g' in non-VMCMS, non-MVSXA line as well */ - chrcmd(ascii2ebcdic[(char)(103 + vv - rvv - d)]); -#else - chrcmd((char)('g' + vv - rvv - d)); -#endif - d = vv - rvv; - } else { - numout(vv - rvv); - chrcmd('b'); - d = vv - rvv; - } - } else { - numout(vv - rvv); - chrcmd('w'); - } - } - rvv = vv; - } -} - -/* - * initprinter opens the bitfile and writes the initialization sequence - * to it. - */ -void -newline(void) -{ - if (linepos != 0) { - fprintf(bitfile, "\n"); - linepos = 0; - } - lastspecial = 1; -} - -void -nlcmdout(const char *s) -{ - newline(); - cmdout(s); - newline(); -} -/* - * Is the dimension close enough for a match? We use 5bp - * as a match; this is 65536*72.27*5/72 or 328909 scaled points. - */ -static int -indelta(integer i) -{ - if (i < 0) - i = -i; - return (i <= 328909); -} -/* - * A case-irrelevant string compare. - */ -static int -mlower(int c) -{ - if ('A' <= c && c <= 'Z') - return c - 'A' + 'a'; - else - return c; -} -static int -ncstrcmp(const char *a, const char *b) -{ - while (*a && (*a == *b || - mlower(*a) == mlower(*b))) - a++, b++; - if (*a == 0 && *b == 0) - return 0; - else - return 1; -} -/* - * Find the paper size. - */ -static void -findpapersize(void) { - if (finpapsiz == 0) { - struct papsiz *ps; - struct papsiz *fps = 0; - int ih, iv, it; - int mindiff = 0x7fffffff; - - if (tryepsf && !landscape) { - finpapsiz = &defpapsiz; - hpapersize = defpapsiz.xsize; - vpapersize = defpapsiz.ysize; - return; - } - if (cropmarks) { -/* - * If user wanted crop marks, we increase the size of the page by - * a half inch all around. - */ - if (hpapersize == 0 || vpapersize == 0) { - error( - "warning: -k crop marks wanted, but no paper size specified; using default"); - if (landscape) { - hpapersize = defpapsiz.ysize; - vpapersize = defpapsiz.xsize; - } else { - hpapersize = defpapsiz.xsize; - vpapersize = defpapsiz.ysize; - } - } - hpapersize += 2368143L; - vpapersize += 2368143L; - add_header(CROPHEADER); - } - if (paperfmt && *paperfmt) { - for (ps = papsizes; ps; ps = ps->next) - if (ncstrcmp(paperfmt, ps->name)==0) - finpapsiz = ps; - if (finpapsiz == 0) - error("no match for papersize"); - } - if (finpapsiz == 0 && hpapersize > 0 && vpapersize > 0) { - for (ps=papsizes; ps; ps = ps->next) { - ih = ps->xsize-hpapersize; - iv = ps->ysize-vpapersize; - if (ih < 0) ih = -ih; - if (iv < 0) iv = -iv; - it = ih; - if (it < iv) it = iv; - if (it < mindiff) { - mindiff = it; - fps = ps; - } - } - if (indelta(mindiff)) - landscape = 0; - else - fps = 0; - mindiff = 0x7fffffff; - if (fps == 0) { - for (ps=papsizes; ps; ps = ps->next) { - iv = ps->ysize-hpapersize; - ih = ps->xsize-vpapersize; - if (ih < 0) ih = -ih; - if (iv < 0) iv = -iv; - it = ih; - if (it < iv) it = iv; - if (it < mindiff) { - mindiff = it; - fps = ps; - } - } - if (indelta(mindiff)) - landscape = 1; - else - fps = 0; - if (fps == 0) { - for (ps=papsizes; ps; ps = ps->next) { - if (ps->ysize == 0 && ps->xsize == 0) { - fps = ps; - break; - } - } - if (fps == 0) { - landscape = (hpapersize > vpapersize); - error( - "no match for special paper size found; using default"); - } - } - } - finpapsiz = fps; - } - if (finpapsiz == 0) { - if (papsizes) - finpapsiz = papsizes; - else - finpapsiz = &defpapsiz; -/* - * But change xsize/ysize to match so bounding box works. - */ - if (hpapersize && vpapersize) { - if (landscape) { - finpapsiz->ysize = hpapersize; - finpapsiz->xsize = vpapersize; - } else { - finpapsiz->xsize = hpapersize; - finpapsiz->ysize = vpapersize; - } - } - } -/* - * Here, there was no papersize special. We set the paper size from - * the selected paper format. If the selected paper format has no - * sizes, we use the defaults. - */ - if (hpapersize == 0 || vpapersize == 0) { - if (finpapsiz->xsize == 0 || finpapsiz->ysize == 0) { - finpapsiz->xsize = defpapsiz.xsize; - finpapsiz->ysize = defpapsiz.ysize; - } - if (landscape) { - vpapersize = finpapsiz->xsize; - hpapersize = finpapsiz->ysize; - } else { - hpapersize = finpapsiz->xsize; - vpapersize = finpapsiz->ysize; - } -/* - * Here, there was a papersize special, but the selected paper - * format has 0 0 for sizes. We set the sizes here so that the - * bounding box works. - */ - } else if (finpapsiz->xsize == 0 || finpapsiz->ysize == 0) { - finpapsiz->xsize = hpapersize; - finpapsiz->ysize = vpapersize; -/* - * Here, the user specified a size with -t, and there was a - * papersize special, and its sizes were greater than zero. - * We make sure the sizes are okay. Note that the user must have - * specified landscape if this is desired. - */ - } else if (paperfmt && *paperfmt) { - if (landscape) { - if (!indelta(vpapersize - finpapsiz->xsize) || - !indelta(hpapersize - finpapsiz->ysize)) { - if (vpapersize > finpapsiz->xsize || - hpapersize > finpapsiz->ysize) - error("warning: -t selected paper may be too small"); - else - error("note: -t selected paper may be too large"); - } - } else { - if (!indelta(hpapersize - finpapsiz->xsize) || - !indelta(vpapersize - finpapsiz->ysize)) { - if (hpapersize > finpapsiz->xsize || - vpapersize > finpapsiz->ysize) - error("warning: -t selected paper may be too small"); - else - error("note: -t selected paper may be too large"); - } - } - } - } -} -/* - * Convert scaled points to PostScript points. This is the same - * as return (i * 72 / (65536 * 72.27)), which is the same as - * dividing by 65781.76, but we want to round up. - */ -static int -topoints(integer i) -{ - i += 65780L; - return (i / 6578176L)*100 + (i % 6578176) * 100 / 6578176; -} -/* - * Send out the special paper stuff. If `hed' is non-zero, only - * send out lines starting with `!' else send all other lines out. - */ -static void -paperspec(const char *s, int hed) -{ - int sendit; - - while (*s) { - s++; - if (*s == '\0') - return; - if (*s == '!') { - s++; - while (*s == ' ') s++; - sendit = hed; - } else - sendit = ! hed; - if (sendit) { - while (*s && *s != '\n') - putc(*s++, bitfile); - putc('\n', bitfile); - } else { - while (*s && *s != '\n') - s++; - } - } -} -static char * -epsftest(integer bop) -{ - if (tryepsf && paperfmt == 0 && *iname) { - findbb(bop+44); - return nextstring; - } - return 0; -} -static char *isepsf = 0; -static int endprologsent; -void -open_output(void) { - FILE * pf = NULL; - if (*oname != 0) { -/* - * We check to see if the first character is a exclamation - * point, and popen if so. - */ - if (*oname == '!' || *oname == '|') { -#if defined(MSDOS) && !defined(__DJGPP__) || defined(VMS) || defined(VMCMS) || defined(MVSXA) || defined(__THINK__) || defined(ATARIST) - error("! can't open output pipe"); -#else -#ifdef OS2 - if (_osmode != OS2_MODE) { - error("! can't open output pipe"); - } else { -#endif -#ifdef __DJGPP__ - /* Feature: if they pipe to "lpr" and there's no executable by - that name anywhere in sight, write to local printer instead. - - We do this up front, before even trying to popen, because on - MS-DOS popen always succeeds for writing (it only opens a - temporary file), and by the time we get to actually run the - (possibly nonexistent) program in pclose, it's too late to - fall back. - - We don't use kpathsea functions here because they don't - know about DOS-specific executable extensions, while we - want to be able to find "lpr.exe", "lpr.com", "lpr.bat" etc. */ - extern char *__dosexec_find_on_path(const char *, - char **, char *); - extern char **environ; - char *p = oname + 1; - char found[FILENAME_MAX]; - - while (ISSPACE(*p)) - p++; - if (strncmp(p, "lpr", 3) == 0 && (ISSPACE(p[3]) || p[3] == '\0') - && !__dosexec_find_on_path(oname+1, (char **)0, found) - && !__dosexec_find_on_path(oname+1, environ, found)) - pf = fopen("PRN", "w"); -#endif - if (pf == NULL && (pf = popen(oname+1, "w")) != NULL) { - popened = 1; - SET_BINARY(fileno(pf)); - } - if (pf == NULL) - error("! couldn't open output pipe"); - bitfile = pf; -#ifdef OS2 - } -#endif -#endif /* MSDOS && !__DJGPP__ || VMS || ... */ - } else { - if ((bitfile=fopen(oname,"w"))==NULL) - error("! couldn't open PostScript file"); - SET_BINARY(fileno(bitfile)); - } - } else { - bitfile = stdout; - } - - /* Even PostScript output may include binary characters, so switch - bitfile to binary mode. */ - if (O_BINARY && !isatty(fileno(bitfile))) - SET_BINARY(fileno(bitfile)); -} -void -initprinter(sectiontype *sect) -{ - int n = sect->numpages * pagecopies * collatedcopies; -#ifdef HPS - if (!HPS_FLAG) -#endif - open_output(); - - findpapersize(); - if (disablecomments) { - fprintf(bitfile, - "%%!PS (but not EPSF; comments have been disabled)\n"); - fprintf(stderr, "Warning: no %%%%Page comments generated.\n"); - } else { - if (multiplesects) { - fprintf(bitfile, - "%%!PS (but not EPSF because of memory limits)\n"); - fprintf(stderr, "Warning: no %%%%Page comments generated.\n"); - } else { - isepsf = epsftest(sect->bos); - if (isepsf) - fprintf(bitfile, "%%!PS-Adobe-2.0 EPSF-2.0\n"); - else - fprintf(bitfile, "%%!PS-Adobe-2.0\n"); - } - if (tryepsf && isepsf == 0) - error("We tried, but couldn't make it EPSF."); - fprintf(bitfile, "%%%%Creator: %s\n", banner + 8); - if (*titlename) - fprintf(bitfile, "%%%%Title: %s\n", titlename); - else if (*iname) - fprintf(bitfile, "%%%%Title: %s\n", xbasename(iname)); -#ifdef CREATIONDATE - jobtime = get_unique_time_if_given(); - if (jobtime == INVALID_EPOCH_VALUE) { - jobtime = time(0); - } - fprintf(bitfile, "%%%%CreationDate: %s", asctime(gmtime(&jobtime))); -#endif - if (! isepsf) { -/* - * Normally, we wouldn't want to add that second field - * indicating that the page order is reversed, as per page - * 644 of the Red book. But we have to, for many existing - * spoolers. - */ - fprintf(bitfile, "%%%%Pages: %d%s\n", (sepfiles ? n : totalpages), - (reverse?" -1":"")); - fprintf(bitfile, "%%%%PageOrder: %sscend\n", reverse?"De":"A"); - } - if (landscape) { - fprintf(bitfile, "%%%%Orientation: Landscape\n"); - fprintf(bitfile, "%%%%BoundingBox: 0 0 %d %d\n", - topoints(finpapsiz->xsize), topoints(finpapsiz->ysize)); - } else if (isepsf) - fprintf(bitfile, "%%%%BoundingBox: %s\n", isepsf); - else - fprintf(bitfile, "%%%%BoundingBox: 0 0 %d %d\n", - topoints(finpapsiz->xsize), topoints(finpapsiz->ysize)); - tell_needed_fonts(); - paperspec(finpapsiz->specdat, 1); - fprintf(bitfile, "%%%%EndComments\n"); -/* - * If we encode Type 3 fonts with an encoding vector, this can cause - * Distiller's autoorientation to get confused. We remedy this by - * emitting underdocumented ViewingOrientation comments right after - * EndComments. Known defect: if a user "flips" the landscape to be - * 180 degrees using one of the \special{} commands available, the - * document will be rendered in the viewer upside down. (But only - * with bitmap font encoding enabled and bitmapped fonts actually used.) - * --tgr, 29 February 2020. - */ - if (encodetype3 && bitmapfontseen) { - fprintf(bitfile, "%%%%BeginDefaults\n") ; - if (landscape) { - fprintf(bitfile, "%%%%ViewingOrientation: 0 -1 1 0\n") ; - } else { - fprintf(bitfile, "%%%%ViewingOrientation: 1 0 0 1\n") ; - } - fprintf(bitfile, "%%%%EndDefaults\n") ; - } - } - { - int i, len; - char *p; - -/* - * Here, too, we have to be careful not to exceed the line length - * limitation, if possible. - */ - fprintf(bitfile, "%%DVIPSWebPage: %s\n", banner2); - fprintf(bitfile, "%%DVIPSCommandLine:"); - len = 18; - for (i=0; i<gargc; i++) { - p = gargv[i]; - while (*p > ' ') - p++; - if (*p) - len += 2; - len += strlen(gargv[i]) + 1; - if (len > LINELENGTH) { - fprintf(bitfile, "\n%%+"); - len = strlen(gargv[i]) + 3; - if (*p) - len += 2; - } - fprintf(bitfile, (*p ? " \"%s\"" : " %s"), gargv[i]); - } - fprintf(bitfile, "\n%%DVIPSParameters: dpi=%d", actualdpi); - if (actualdpi != vactualdpi) - fprintf(bitfile, "x%d", vactualdpi); - if (compressed) - fprintf(bitfile, ", compressed"); - if (removecomments) - fprintf(bitfile, ", comments removed"); - fputc('\n', bitfile); - } -#if defined(VMCMS) || defined (MVSXA) /* convert preamblecomment to ebcdic so we can read it */ - { - int i; - for ( i=0; preamblecomment[i]; i++ ) - preamblecomment[i] = ascii2ebcdic[preamblecomment[i]]; - } -#endif - fprintf(bitfile, "%%DVIPSSource: %s\n", preamblecomment); - linepos = 0; - endprologsent = 0; - if (safetyenclose) - fprintf(bitfile, "/SafetyEnclosure save def\n"); - print_composefont(); - if (! headers_off) - send_headers(); -} -void -setup(void) { - newline(); - if (endprologsent == 0 && !disablecomments) { - fprintf(bitfile, "%%%%EndProlog\n"); - fprintf(bitfile, "%%%%BeginSetup\n"); - if (vactualdpi == actualdpi) - fprintf(bitfile, "%%%%Feature: *Resolution %ddpi\n", - actualdpi); - else - fprintf(bitfile, "%%%%Feature: *Resolution %dx%ddpi\n", - actualdpi, vactualdpi); - if (multiplesects && *(finpapsiz->specdat)) { - fprintf(bitfile, "TeXDict begin\n"); - paperspec(finpapsiz->specdat, 0); - fprintf(bitfile, "end\n"); - } - if (manualfeed) - fprintf(bitfile, "%%%%Feature: *ManualFeed True\n"); -#ifdef HPS - if (!HPS_FLAG) -#endif - if (multiplesects) - fprintf(bitfile, "%%%%EndSetup\n"); - } - if (multiplesects && ! disablecomments) - fprintf(bitfile, "%%DVIPSBeginSection\n"); - cmdout("TeXDict"); - cmdout("begin"); - if (endprologsent || disablecomments || multiplesects == 0) { - fprintf(bitfile, "\n"); - paperspec(finpapsiz->specdat, 0); - } - if (manualfeed) cmdout("@manualfeed"); - if (landscape) cmdout("@landscape"); - if (numcopies != 1) { - numout((integer)numcopies); - cmdout("@copies"); - } - cmdout("end"); - if (endprologsent == 0 && !disablecomments) { - newline(); - endprologsent = 1; -#ifdef HPS - if (!HPS_FLAG) -#endif - if (! multiplesects) - fprintf(bitfile, "%%%%EndSetup\n"); - } -#ifdef HPS - if (HPS_FLAG) { - fclose(bitfile); - set_bitfile("body.tmp",0); - } -#endif -} -/* - * cleanprinter is the antithesis of the above routine. - */ -void -cleanprinter(void) -{ - fprintf(bitfile, "\n"); - fprintf(bitfile, "userdict /end-hook known{end-hook}if\n"); - if (safetyenclose) - fprintf(bitfile, "SafetyEnclosure restore\n"); - if (!disablecomments) - fprintf(bitfile, "%%%%EOF\n"); - if (sendcontrolD) - putc(4, bitfile); - if (ferror(bitfile)) - error("Problems with file writing; probably disk full."); -#if !defined(MSDOS) || defined(__DJGPP__) -#ifndef VMS -#ifndef MVSXA -#ifndef VMCMS -#ifndef __THINK__ -#ifndef ATARIST -#ifdef OS2 - if (_osmode == OS2_MODE) -#endif - if (popened) - pclose(bitfile); -#endif -#endif -#endif -#endif -#endif -#endif - if (popened == 0) - fclose(bitfile); - bitfile = NULL; -} - -/* this tells dvips that it has no clue where it is. */ -static int thispage = 0; -static integer rulex, ruley; -void -psflush(void) { - rulex = ruley = rhh = rvv = -314159265; - lastfont = -1; -} -/* - * pageinit initializes the output variables. - */ -void -pageinit(void) -{ - psflush(); - newline(); - thispage++; - if (!disablecomments) { - if (multiplesects) -#ifdef SHORTINT - fprintf(bitfile, "%%DVIPSSectionPage: %ld\n", pagenum); - else if (! isepsf) - fprintf(bitfile, "%%%%Page: %ld %d\n", pagenum, thispage); -#else - fprintf(bitfile, "%%DVIPSSectionPage: %d\n", pagenum); - else if (! isepsf) - fprintf(bitfile, "%%%%Page: %d %d\n", pagenum, thispage); -#endif - } - linepos = 0; - cmdout("TeXDict"); - cmdout("begin"); -#ifdef HPS - if (HPS_FLAG) { - cmdout("HPSdict"); - cmdout("begin"); - } -#endif - if (landscape) cmdout("@landscape"); - numout((integer)pagenum); - numout((integer)thispage-1); - cmdout("bop"); - d = 0; -} - - - -/* - * This routine ends a page. - */ -void -pageend(void) -{ - if (instring) { - stringend(); - chrcmd('p'); - } - if (dir) - cmdout("-90 rotate"); - if (any_dir) - cmdout("dyy"); - cmdout("eop"); - cmdout("end"); -#ifdef HPS - if (HPS_FLAG) - cmdout("end"); -#endif -} - -/* - * drawrule draws a rule at the specified position. - * It does nothing to save/restore the current position, - * or even draw the current string. (Rules are normally - * set below the baseline anyway, so this saves us on - * output size almost always.) - */ -void -drawrule(integer rw, integer rh) -{ - if (!dir) { - numout((integer)hh); - numout((integer)vv); - } else { - numout((integer)vv); - numout((integer)-hh); - } - if (rw == rulex && rh == ruley) - chrcmd('V'); - else { - numout((integer)rw); - numout((integer)rh); - chrcmd('v'); - rulex = rw; - ruley = rh; - } -} - -/* - * drawchar draws a character at the specified position. - */ -void -drawchar(chardesctype *c, int cc) -{ - if (rdir != dir || fdir != curfnt->dir) { - if (curfnt->dir == 9) - setdir(dir+2); - else - setdir(dir); - rdir = dir; - fdir = curfnt->dir; - } - - if (curfnt->iswide == 0 && curfnt->codewidth == 2) { - Boolean savejflag = jflag; - jflag = 1; - hvpos(); - jflag = savejflag; - if (lastfont != curfnt->psname) - fontout(curfnt->psname); - scout2(cc); - } - else if (curfnt->iswide) { - if (lastfont != curfnt->psname) - fontout(curfnt->psname); - jscout(cc, curfnt->resfont->PSname); - } - else { - if (jflag) { - if (!dir){ - numout(hh); - numout(vv); - } - else { - numout(vv); - numout(-hh); - } - chrcmd('a'); - rhh = hh; - rvv = vv; - } - else hvpos(); - if (lastfont != curfnt->psname) - fontout(curfnt->psname); - scout((unsigned char)cc); - } - if (!dir) - rhh = hh + c->pixelwidth; /* rvv = rv */ - else - rvv = vv + c->pixelwidth; /* rhh = rh */ -} -/* - * This routine sends out the document fonts comment. - */ -static void -tell_needed_fonts(void) { - struct header_list *hl = ps_fonts_used; - char *q; - int roomleft = -1; - - if (hl == 0) - return; - while (0 != (q=get_name(&hl))) { - if ((int)strlen(q) >= roomleft) { - if (roomleft != -1) { - fprintf(bitfile, "\n%%%%+"); - roomleft = LINELENGTH - 3; - } else { - fprintf(bitfile, "%%%%DocumentFonts:"); - roomleft = LINELENGTH - 16; - } - } - fprintf(bitfile, " %s", q); - roomleft -= strlen(q) + 1; - } - fprintf(bitfile, "\n"); -} - -static void print_composefont(void) -{ - struct header_list *hl = ps_fonts_used; - int len; - char *q, *p; - - if (hl == 0) - return; - while (0 != (q=get_name(&hl))) { - len = strlen(q); - if(len > 11 && (!strncmp(q+len-10, "Identity-H", 10) || - !strncmp(q+len-10, "Identity-V", 10))) { - fprintf(bitfile, "%%%%BeginFont: %s\n", q); - fprintf(bitfile, "/%s ", q); - fprintf(bitfile, "/%s ", q+len-10); - fprintf(bitfile, "[/"); - for(p=q; p <= q+len-12; p++) - fprintf(bitfile, "%c", *p); - fprintf(bitfile, "] composefont pop\n"); - fprintf(bitfile, "%%%%EndFont\n"); - } - } -} - -static void setdir(int d) -{ - if (instring) { - stringend(); - chrcmd('p'); - } - switch(d) { - case 1 : - cmdout("dyt"); - break; - case 2 : - cmdout("dty"); - break; - case 3 : - cmdout("dtt"); - break; - default : - cmdout("dyy"); - break; - } - linepos += 4; - any_dir = 1; -} - -void cmddir(void) -{ - if (dir != rdir) { - if (dir) - cmdout("90 rotate"); - else - cmdout("-90 rotate"); - rdir = dir; - } -} - -static int JIStoSJIS(int c) -{ - int high, low; - int nh,nl; - - high = (c>>8) & 0xff; - low = c & 0xff; - nh = ((high-0x21)>>1) + 0x81; - if (nh>0x9f) - nh += 0x40; - if (high & 1) { - nl = low + 0x1f; - if (low>0x5f) - nl++; - } - else - nl = low + 0x7e; - if (((nh >= 0x81 && nh <= 0x9f) || (nh >= 0xe0 && nh <= 0xfc)) && - (nl >= 0x40 && nl <= 0xfc && nl != 0x7f)) - return((nh<<8) | nl); - else - return(0x813f); -} |