/* CRAYON.C Top level of Scribble print driver Copyright (C) 1981 by Mark of the Unicorn, Inc. Created 81.3.12 Gyro This code interprets the command line and the Scribble output file, and calls the low-level abstraction to do the printing. This might turn into a generalized driver. Modifications Schedule: 08/03/81 -page option hack by Jeffrey D. Stone. */ #include "crayon.h" int stpage, curpage; /* jds */ main (argc, argv) int argc; char **argv; { int ntimes, itime; puts ("Crayon v1.1, Copyright (C) 1981 by Mark of the Unicorn, Inc.\n"); ntimes = 1; stflag = TRUE; /* jds */ curpage = 1; /* jds */ stpage = 0; /* jds */ char *cstpage; pausep = FALSE; remark = ""; portname = NULL; quietp = FALSE; while (--argc > 0) { if (**++argv == '-') { if (isdigit ((*argv)[1])) ntimes = atoi (&(*argv)[1]); else if (match ((*argv) + 1, "Pause") || match ((*argv) + 1, "P")) { pausep = TRUE; if (!quietp) puts ("Pausing between pages.\n"); } else if (match ((*argv) + 1, "Port")) { portname = *++argv; --argc; if (!quietp) printf ("Using '%s' port(s).\n", portname); } else if (match ((*argv) + 1, "Page")) { cstpage = *++argv; --argc; stpage = atoi(cstpage); if (!quietp) printf("Starting at page %d - first page is # 1.\n",stpage); stflag = FALSE; } else if (match ((*argv) + 1, "Q")) quietp = TRUE; else if (match ((*argv) + 1, "R")) { remark = *++argv; --argc; if (!quietp) printf ("Remark: '%s'.\n", remark); } else printf ("Unknown command line option: '%s'\n", *argv); } else { if (PrintFile (*argv, ntimes) == ABORTALL) break; } } } ReadLine () { FLAG done, vanilla; inchars = intokens = 0; superp = subp = FALSE; justp = FALSE; ForceTok(); done = FALSE; while (!done) { switch (IChar()) { case LF: linelead += PrLineV(); break; case FF: ++curpage; /* jds */ if (!stflag && curpage >= stpage) { /* jds */ if (PrVPos() != 0) PrFF(); PrFlush(); stflag = TRUE; linelead = 0; break; } if (pausep) { PagePause(); linelead = 0; } else linelead += PrPageV() - (linelead + PrVPos()) % PrPageV(); break; case VERTSPACE: linelead += PrUnMica ((INext() << 8) + INext(), VERTICAL); break; default: done = TRUE; break; } if (!done) INext(); } done = FALSE; repeat { vanilla = FALSE; switch (IChar()) { case CR: INext(); case LF: case FF: done = TRUE; break; case EOF: return (NULL); break; case VERTSPACE: done = TRUE; break; case HORIZSPACE: ForceTok(); GetTok(); itokens[intokens-1].toklead += PrUnMica ((INext() << 8) + INext(), HORIZONTAL); break; case BOLDON: AttrPush(); attrstack[attrsp].tokbold = TRUE; ForceTok(); break; case ROMANON: AttrPush(); attrstack[attrsp].tokbold = FALSE; attrstack[attrsp].tokital = FALSE; ForceTok(); break; case UNNBON: case UNALLON: case UNANON: AttrPush(); attrstack[attrsp].tokuscore = IChar(); ForceTok(); break; case ITALON: AttrPush(); attrstack[attrsp].tokital = TRUE; ForceTok(); break; case BITALON: AttrPush(); attrstack[attrsp].tokbold = TRUE; attrstack[attrsp].tokital = TRUE; ForceTok(); break; case SUPERON: superp = TRUE; AttrPush(); attrstack[attrsp].tokscript = IChar(); ForceTok(); break; case SUBON: subp = TRUE; AttrPush(); attrstack[attrsp].tokscript = IChar(); ForceTok(); break; case SUBOFF: case SUPEROFF: case BITALOFF: case ITALOFF: case UNANOFF: case UNALLOFF: case UNNBOFF: case ROMANOFF: case BOLDOFF: AttrPop(); ForceTok(); break; case JUSTIFY: justp = TRUE; just.jlefttok = intokens; just.jspace = (INext() << 8) + INext(); break; case TOKENBREAK: ForceTok(); GetTok(); itokens[intokens-1].tokjust = TRUE; itokens[intokens-1].toklead += PrSpaceH(); break; default: vanilla = TRUE; break; } if (done) break; if (vanilla) { GetTok(); iline[inchars++] = IChar(); itokens[intokens-1].tokwidth += PrWidChar (IChar()); } if (!done) INext(); } itokens[intokens].tokbegin = inchars; return (TRUE); } /* End of CRAYON.C -- Scribble print driver top level */