home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Tex / Dvi / dvi2ttys.lzh / DVI2TTY.C < prev    next >
C/C++ Source or Header  |  1991-02-01  |  24KB  |  661 lines

  1. /******************************************************************************
  2.  * Jan Willamowius: 1990-01-19 (UUCP: jan@janhh.hanse.de)
  3.  *               Atari ST Version
  4.  * Marcel Mol: 1990-03-27  (UUCP: marcel@duteca.tudelft.nl)
  5.  *               Fixed bug that causes the program to hang when it finds a
  6.  *               fontname with an 's' in it not followed by an 'y'.
  7.  *               Thanks to Paul Orgren (orgren@Stars.Reston.Unisys.COM).
  8.  * Marcel Mol: 1990-02-04  (UUCP: marcel@duteca.tudelft.nl)
  9.  *               First attempt to recognize symbol fonts, so bullets (in
  10.  *               itemized lists) are translated to a proper character instead
  11.  *               an awfull ligature.
  12.  *               Version 4.0.
  13.  * Marcel Mol: 1990-02-01  (UUCP: marcel@duteca.tudelft.nl)
  14.  *               Included port to VMS (off Joseph Vasallo and Seppo Rantala)
  15.  *               into latest version. Hope things still work, cannot test it ...
  16.  * Joseph Vasallo & Seppo Rantala: 1989-09-05 (Internet: rantala@tut.FI)
  17.  *         Ported to work under VAX/VMS V4.4 & VAXC V2.4 or higher.
  18.  *         Fixed bugs in using Swedish/Finnish characters.
  19.  * Marcel Mol: 1989-02-14  (UUCP: duteca!marcel)
  20.  *               Fixed check for .dvi extension.
  21.  *               Allowed more ligatures.
  22.  *               Fixed side effect bugs (2 gets as function arguments).
  23.  *               Version 3.2.
  24.  * Marcel Mol: 1989-01-19  (UUCP: duteca!marcel)
  25.  *               Changed in option handling, no change
  26.  *               in user interface (only the undocumented
  27.  *               feature -e).
  28.  *               Version 3.1.
  29.  * Marcel Mol: 1989-01-11  (UUCP: duteca!marcel)
  30.  *               Changed some longs to ints.
  31.  *               It now also runs on MSDOS Microsoft C 5.1
  32.  *               New version: 3.0
  33.  * Marcel Mol: 1989-01-03  (UUCP: duteca!marcel)
  34.  *               Fixed a bugs concerning pager programs
  35.  *               and scanning environment variable DVI2TTY.
  36.  * Marcel Mol: 1988-10-25  (UUCP: duteca!marcel)
  37.  *        dvi2tty.c dvi2tty.h dvistuff.c commands.h
  38.  *               Converted program to C.
  39.  *               improved spacing between words/characters.
  40.  * bogart:/usr/alla/zap/dvitty/dvitty.p  1986-08-15 20:24:31,
  41.  *               Version to be sent to mod.sources ready.
  42.  * New option since last version:
  43.  *   -Fprog      Pipe output to prog. Can be used to get a different
  44.  *               pager than the default.
  45.  * bogart:/usr/alla/zap/dvitty/dvitty.p  1986-01-13 21:49:31,
  46.  *   Environment variable DVITTY is read and options can be set from it.
  47.  *   These are the currently implemented options:
  48.  *      -ofile   Write output to file, else write to stdout,
  49.  *               possibly piped through a pager if stdout is a tty.
  50.  *      -plist   Print pages whos TeX-page-number are in list.
  51.  *               List is on the form  1,3:6,8  to choose pages
  52.  *               1,3-6 and 8. TeX-nrs can be negative: -p-1:-4,4
  53.  *      -Plist   Print pages whos sequential number are in list.
  54.  *      -wn      Print the lines with width n characters, default is
  55.  *               80. Wider lines gives better results.
  56.  *      -q       Don't try to pipe to a pager.
  57.  *      -f       Try to pipe to a pager if output is a tty.
  58.  *      -Fname   Specify a pager program.
  59.  *               Default of -q and -f is a compile time option, a constant.
  60.  *      -l       Write '^L' instead of formfeed between pages.
  61.  *      -u       Don't try to find Scandinavian characters (they will
  62.  *               print as a:s and o:s if this option is choosen).
  63.  *      -s       Scandinavian characters printed as }{|][\.
  64.  *               Default of -s and -u is a compile time option, a constant.
  65.  * bogart:/usr/alla/zap/dvitty/dvitty.p  1986-01-10 18:51:03,
  66.  *   Argument parsing, and random access functions (external, in C)
  67.  *   and other OS-dependent stuff (in C). Removed private 'pager' &
  68.  *   tries to pipe through PAGER (environment var) or, if PAGER not
  69.  *   defined, /usr/ucb/more. Some changes for efficency.
  70.  * bogart:/usr/alla/svante/dvitty/dvitty.p  1985-07-15 20:51:00,
  71.  *   The code for processing dvi-files running on UNIX (UCB-Pascal)
  72.  *   but no argument parsing.
  73.  * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.140, 30-Mar-85 05:43:56,
  74.  *   Edit: Svante Lindahl
  75.  * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.136, 15-Jan-85 13:52:59,
  76.  *   Edit: Svante Lindahl, final Twenex version !!!??
  77.  * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.121, 14-Jan-85 03:10:22,
  78.  *   Edit: Svante Lindahl, cleaned up and fixed a lot of little things
  79.  * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.25, 15-Dec-84 05:29:56,
  80.  *   Edit: Svante Lindahl, COMND-interface, including command line scanning
  81.  * VERA::SS:<SVANTE-LINDAHL.WORK>DVITTY.PAS.23, 10-Dec-84 21:24:41,
  82.  *   Edit: Svante Lindahl, added command line scanning with Rscan-JSYS
  83.  * VERA::<SVANTE-LINDAHL.DVITTY>DVITTY.PAS.48,  8-Oct-84 13:26:30,
  84.  *  Edit: Svante Lindahl, fixed switch-parsing, destroyed by earlier patches
  85.  * VERA::<SVANTE-LINDAHL.DVITTY>DVITTY.PAS.45, 29-Sep-84 18:29:53,
  86.  *  Edit: Svante Lindahl
  87.  *
  88.  * dvitty - get an ascii representation of a dvi-file, suitable for ttys
  89.  *
  90.  * This program, and any documentation for it, is copyrighted by Svante
  91.  * Lindahl. It may be copied for non-commercial use only, provided that
  92.  * any and all copyright notices are preserved.
  93.  *
  94.  * Please report any bugs and/or fixes to:
  95.  *
  96.  * UUCP: {seismo,mcvax,cernvax,diku,ukc,unido}!enea!ttds!zap
  97.  * ARPA: enea!ttds!zap@seismo.CSS.GOV
  98.  *  or   Svante_Lindahl_NADA%QZCOM.MAILNET@MIT-MULTICS.ARPA
  99.  * EAN:  zap@cs.kth.sunet
  100.  */
  101.  
  102.  
  103. #include "dvi2tty.h"
  104. #if __STDC__
  105. #define TRUE 1
  106. #define FALSE 0
  107. #endif
  108.  
  109.     /*-----------------------------------------------------------------------*/
  110.     /* The following constants may be toggled before compilation to          */
  111.     /* customize the default behaviour of the program for your site.         */
  112.     /* Whichever their settings are, the defaults can be overridden at       */
  113.     /* runtime.                                                              */
  114.     /*-----------------------------------------------------------------------*/
  115.  
  116. #define DEFSCAND    FALSE     /* default is Scandinavian, toggle this if you */
  117.                               /* don't have terminals with Scand. nat. chars */
  118. #define WANTPAGER   TRUE      /* default: try to pipe through a pager (like  */
  119.                               /* more) if stdout is tty and no -o switch     */
  120. #define DEFPAGER    "/usr/bin/pg"   /* CHANGE TO YOUR LOCAL PAGER            */
  121.  
  122.     /*------------------ end of customization constants ---------------------*/
  123.  
  124. #define MAXLEN          100    /* size of char-arrays for strings            */
  125. #define OPTSET      "wepPousl"   /* legal options                            */
  126. #define OPTWARG     "wepPo"      /* options with argument                    */
  127.  
  128. /*
  129.  * USAGE CODES
  130.  */
  131.  
  132. #define wrnge  1                /* width switch arg out of range     */
  133. #define ign    2                /* ignore cause, print 'Usage:..'    */
  134. #define nan    3                /* not a number where one expected   */
  135. #define gae    4                /* garbage at end                    */
  136. #define bdlst  5                /* bad page-numberlist               */
  137. #define onef   6                /* only one dvifile allowed          */
  138. #define bdopt  7                /* bad option                        */
  139. #define onepp  8                /* only one page list allowed        */
  140. #define noarg  9                /* argument expected                 */
  141.  
  142. char *dvi2tty = "@(#) dvi2tty.c  4.1 27/03/90 M.J.E. Mol (c) 1989, 1990";
  143.  
  144. /*---------------------------------------------------------------------------*/
  145.  
  146. printlisttype * currentpage;    /* current page to print                     */
  147. printlisttype * firstpage;      /* first page selected                       */
  148. printlisttype * lastpage;       /* last page selected                        */
  149.  
  150. FILE *          DVIfile;
  151. FILE *          output;
  152. bool            outputtofile;   /* tells if output goes to file or stdout    */
  153. int             ttywidth;       /* max nr of chars per printed line          */
  154. int             espace;         /* to fake calcs with ttywidth               */
  155.  
  156. long            foo;            /* utility variable, "register"              */
  157. char  *         progname;       /* our name                                  */
  158. int             Argc;
  159. char **         Argv;
  160. char            DVIname[MAXLEN];
  161. char *          OUTfilename;
  162. char            optch;          /* for option handling                       */
  163.  
  164. /*---------------------------------------------------------------------------*/
  165.  
  166. #if __STDC__
  167. void setoption(char *optarg);
  168. void getargs(void);
  169. void getpages(int j, char *str);
  170. void plcnxt(int pagnr);
  171. void getfname(char *str);
  172. int getinteger(int *dest, int *j, char *str);
  173. void usage(int uerr);
  174. #else
  175. char *  getenv    ();
  176. FILE *  popen     ();
  177.  
  178. void    main      ();
  179. void    setoption ();
  180. void    getargs   ();
  181. void    getpages  ();
  182. void    plcnxt    ();
  183. void    getfname   ();
  184. int     getinteger();
  185. void    usage     ();
  186. #endif
  187.  
  188.  
  189. /****************************************************************************/
  190. /*                                                                          */
  191. /*                                 M A I N                                  */
  192. /*                                                                          */
  193. /****************************************************************************/
  194.  
  195. void main(argc, argv)
  196. int argc;
  197. char ** argv;
  198. {
  199.  
  200.     progname = *argv;
  201.     Argc = argc;
  202.     Argv = argv;
  203.  
  204.     getargs();                              /* read command line arguments   */
  205.     if ((DVIfile = fopen(DVIname, "rb")) == NULL)
  206.         errorexit(filop);                   /* can't open dvifile            */
  207.  
  208.     if (outputtofile) {                     /* open the outfile, if needed   */
  209.         if ((output = fopen(OUTfilename, "w")) == NULL)
  210.             errorexit(filcr);
  211.     }
  212.     else {
  213.         output = stdout;
  214.     }
  215.  
  216.     dvimain();
  217.  
  218.     exit(0);
  219.  
  220. } /* main */
  221.  
  222. /*----------------------------------------------------------------------------*/
  223.  
  224. #if __STDC__
  225. void setoption(char *optarg)
  226. #else
  227. void setoption(optarg)
  228. char *optarg;
  229. #endif
  230. {
  231.     int j = 0;
  232. #if !CORRECT_ERROR
  233.     int ret;
  234. #endif
  235.  
  236.     while (strchr(OPTSET, optch) != NULL) {
  237.         switch (optch) {
  238.         case 'l' : noffd = TRUE; break;
  239.         case 's' : scascii = TRUE; break;
  240.         case 'u' : scascii = FALSE; break;
  241.             case 'P' :
  242.                sequenceon = TRUE;     /* fall through */
  243.             case 'p' :
  244.                        if (pageswitchon)
  245.                            usage(onepp);
  246.                        getpages(j, optarg);
  247.                        break;
  248.             case 'w' :
  249.                if (getinteger(&ttywidth, &j, optarg))
  250.                            usage(nan);
  251.                        if (optarg[j] != '\0')
  252.                            usage(gae);
  253.                        if ((ttywidth < 16) || (ttywidth > 132))
  254.                            usage(wrnge);
  255.                        break;
  256.             case 'e' :
  257.                if (getinteger(&espace, &j, optarg))
  258.                            usage(nan);
  259.                        if (optarg[j] != '\0')
  260.                            usage(gae);
  261.                        break;
  262.             case 'o' :
  263.                        OUTfilename = optarg;
  264.                outputtofile = TRUE;
  265. #if __STDC__
  266.                        j = (int)strlen(optarg);
  267. #else
  268.                        j = strlen(optarg);
  269. #endif
  270.                        break;
  271.             default  :
  272.                        usage(bdopt);
  273.         }
  274. #if TURBO_C
  275. #pragma warn -wpia
  276. #endif
  277.         if ((optch = optarg[j]) == '\0')
  278. #if TURBO_C
  279. #pragma warn .wpia
  280. #endif
  281.             break;
  282.         j++;
  283. #if CORRECT_ERROR
  284.         if ((strchr(OPTWARG, optch) != NULL) && (optarg[j] == '\0')) {
  285. #else
  286.         if ((strchr(OPTWARG, optch) != NULL) && (optarg[j]='\0')) {
  287. #endif                if (--Argc <= 0)
  288.                     usage(noarg);
  289.                 optarg = *++Argv;
  290.                 j = 0;
  291.             }
  292.     }
  293. } /* setoption */
  294.  
  295. /*----------------------------------------------------------------------------*/
  296.  
  297. #if __STDC__
  298. void getargs(void)
  299. #else
  300. void getargs()
  301. #endif
  302. {
  303.     char *str, *envp;
  304.     bool DVIfound;                      /* if a dvi filename found           */
  305.  
  306.     if (Argc <= 1)
  307.         usage(ign);
  308.  
  309.     pageswitchon = FALSE;       /* show all pages                            */
  310.     sequenceon   = FALSE;       /* selected pages are TeX-numbered           */
  311.     outputtofile = FALSE;       /* write to stdout                           */
  312.     noffd        = FALSE;       /* print formfeed between pages              */
  313.     scascii      = DEFSCAND;    /* scandinavian, compile time option         */
  314.     ttywidth     = 80;          /* default terminal width                    */
  315.     espace       = 0;           /* to fake ttywith calcs                     */
  316.     DVIfound     = FALSE;
  317.  
  318.     if ((envp = getenv("DVI2TTY")) != NULL) {
  319.         while (*envp == ' ')
  320.              envp++;
  321.         while (*envp) {                     /* environment var args          */
  322.             if (strchr(OPTSET, optch = *envp++) != NULL) {
  323.                 /*
  324.                  * we always pass one option, and arrange for optarg ourselfves,
  325.                  * so setoption does not mesh up Argv
  326.                  */
  327.                 if (strchr(OPTWARG, optch) != NULL) {
  328.                     while (*envp == ' ')
  329.                         envp++;
  330.                     if (*envp == '\0')
  331.                         usage(noarg);
  332.                     str = envp;             /* str points to optarg          */
  333.                     while ((*envp != ' ') && (*envp != '\0'))
  334. #if CORRECT_ERROR
  335.                         envp++;            /* set envp just after optarg    */
  336. #else
  337.                         *envp++;            /* set envp just after optarg    */
  338. #endif
  339.                     if (*envp != '\0')
  340.                         *envp++ = '\0';     /* end optarg string             */
  341.                 }
  342.                 else
  343.                     str = "";
  344.                 setoption(str);
  345.             }
  346.             else
  347.                 usage(bdopt);
  348.             while (*envp == ' ')
  349.                  envp++;
  350.         }
  351.     }
  352.  
  353.     while (--Argc > 0) {                    /* command line args             */
  354.         str = *++Argv;
  355.         if (*str != '-') {                  /* argument is not an option     */
  356.             if (DVIfound)                   /* only one dvi file allowed     */
  357.                 usage(onef);
  358.             getfname(str);
  359.             DVIfound = TRUE;
  360.         }
  361.         else if (strchr(OPTSET, optch = *++str) != NULL) {
  362.             str++;                      /* point to rest of argument if any  */
  363.             if ((strchr(OPTWARG, optch) != NULL) && (*str == '\0')) {
  364.                 if (--Argc <= 0)
  365.                     usage(noarg);
  366.                 str = *++Argv;
  367.             }
  368.             setoption(str);
  369.         }
  370.         else
  371.             usage(bdopt);
  372.     }
  373.  
  374.     if (!DVIfound)
  375.         usage(ign);
  376.  
  377. } /* getargs */
  378.  
  379. /*---------------------------------------------------------------------------*/
  380.  
  381. #if __STDC__
  382. void getpages(int j, char *str)
  383. #else
  384. void getpages(j, str)
  385. int j;
  386. char *str;
  387. #endif
  388. {
  389.     int i, c;
  390.     int num;
  391.  
  392.     pageswitchon = TRUE;
  393.     firstpage = (printlisttype *) malloc(sizeof(printlisttype));
  394.     firstpage->all = FALSE;
  395.     firstpage->nxt = nil;
  396.     firstpage->pag = 0;
  397.     lastpage = firstpage;
  398.     currentpage = firstpage;
  399.     if (getinteger(&num, &j, str))
  400.         usage(nan);
  401.     plcnxt((int) num);
  402.     while (str[j]) {
  403.         c = str[j];
  404.         if (c == ',' || c == ':') {
  405.             j++;
  406.             if (getinteger(&num, &j, str))
  407.                 usage(nan);
  408.         }
  409.         else
  410.             break;
  411.         if (c == ',')
  412.             plcnxt(num);
  413.         else {
  414.             if (currentpage->pag < 0) {
  415.                 if (num > 0) {
  416.                     currentpage->all = TRUE;
  417.                     plcnxt(num);
  418.                 }
  419.                 else if (num < currentpage->pag)
  420.                     for (i = currentpage->pag - 1; i >= num; i--)
  421.                         plcnxt(i);
  422.                 else
  423.                     usage(bdlst);
  424.             }
  425.             else {
  426.                 if (num < currentpage->pag)
  427.                     usage(bdlst);
  428.                 for (i = currentpage->pag + 1; i <= num; i++)
  429.                     plcnxt(i);
  430.             }
  431.         }
  432.     }
  433. #if CORRECT_ERROR
  434.     if ((str[j] != ' ') && (str[j] != '\0')) {
  435. #else
  436.     if ((str[j] != ' ') && (str[j] != NULL)) {
  437. #endif
  438.         usage(gae);
  439.     }
  440.     currentpage = firstpage;
  441.  
  442. } /* getpages */
  443.  
  444.  
  445. #if __STDC__
  446. void plcnxt(int pagnr)
  447. #else
  448. void plcnxt(pagnr)      /* place page-nr next in list */
  449. int pagnr;
  450. #endif
  451. {
  452.     currentpage = lastpage;
  453.     currentpage->pag = pagnr;
  454.     lastpage = (printlisttype *) malloc(sizeof(printlisttype));
  455.     lastpage->all = FALSE;
  456.     lastpage->nxt = nil;
  457.     lastpage->pag = 0;
  458.     currentpage->nxt = lastpage;
  459.  
  460. } /* plcnxt */
  461.  
  462. /*----------------------------------------------------------------------------*/
  463.  
  464. #if __STDC__
  465. void getfname(char *str)
  466. #else
  467. void getfname(str)
  468. char *str;
  469. #endif
  470. {
  471.     int   i;
  472.  
  473. #if __STDC__
  474.     i = (int)strlen(str);
  475. #else
  476.     i = strlen(str);
  477. #endif
  478.     if (i == 0)
  479.         usage(ign);
  480.     strcpy(DVIname, str);
  481.     if (!((i >= 5) && (str[i-1] == 'i') && (str[i-2] == 'v') &&
  482.           (str[i-3] == 'd') && (str[i-4] == '.'))) {
  483.         strcat(DVIname, ".dvi");
  484.     }
  485.  
  486. } /* getfname */
  487.  
  488. /*----------------------------------------------------------------------------*/
  489.  
  490. #if __STDC__
  491. int getinteger(int *dest, int *j, char *str)
  492. #else
  493. int getinteger(dest, j, str)
  494. int *dest;
  495. int *j;
  496. char *str;
  497. #endif
  498. {
  499.     int  cum;
  500.     int  sgn;
  501.     char ch;
  502.  
  503.     ch = str[*j];
  504.     if (ch == '-') {
  505.         sgn = -1;
  506.         ch  = str[++(*j)];
  507.     }
  508.     else
  509.         sgn = 1;
  510.     if ((ch >= '0') && (ch <= '9')) {
  511.         cum = 0;
  512.         while ((ch >= '0') && (ch <= '9')) {
  513.             cum = cum*10 + ch - '0';
  514.             ch = str[++(*j)];
  515.         }
  516.         *dest = sgn * cum;
  517.         return 0;                   /* return ok */
  518.     }
  519.     return 1;                       /* return error */
  520.  
  521. }   /* getinteger */
  522.  
  523. /*----------------------------------------------------------------------------*/
  524.  
  525. void errorexit(errorcode)
  526. int errorcode;
  527. {
  528.  
  529.     fprintf(stderr, "%s: ", progname);
  530.     switch (errorcode) {
  531.         case  illop : fprintf(stderr, "Illegal op-code found: %d\n", opcode);
  532.                       break;
  533.         case  stkof : fprintf(stderr, "Stack overflow\n");
  534.                       break;
  535.         case  stkuf : fprintf(stderr, "Stack underflow\n");
  536.                       break;
  537.         case  stkrq : fprintf(stderr, "Cannot create dvi stack\n");
  538.                       break;
  539.         case  lnerq : fprintf(stderr, "Cannot allocate memory\n");
  540.                       break;
  541.         case  badid : fprintf(stderr, "Id-byte is not correct: %d\n ", opcode);
  542.                       break;
  543.         case  bdsgn : fprintf(stderr, "Bad signature: %d (not 223)\n",
  544.                                       (int) foo);
  545.                       break;
  546.         case  fwsgn : fprintf(stderr, "%d signature bytes (min. 4)\n",
  547.                                       (int) foo);
  548.                       break;
  549.         case  nopre : fprintf(stderr, "Missing preamble\n");
  550.                       break;
  551.         case  nobop : fprintf(stderr, "Missing beginning-of-page command\n");
  552.                       break;
  553.         case  nopp  : fprintf(stderr, "Missing post-post command\n");
  554.                       break;
  555.         case  bdpre : fprintf(stderr, "Preamble occured inside a page\n");
  556.                       break;
  557.         case  bdbop : fprintf(stderr, "BOP-command occured inside a page\n");
  558.                       break;
  559.         case  bdpst : fprintf(stderr, "Postamble occured before end-of-page\n");
  560.                       break;
  561.         case  bdpp  : fprintf(stderr, "Postpost occured before post-command\n");
  562.                       break;
  563.         case  nopst : fprintf(stderr, "Missing postamble\n");
  564.                       break;
  565.         case  illch : fprintf(stderr, "Character code out of range, 0..127\n");
  566.                       break;
  567.         case  filop : fprintf(stderr, "Cannot open dvifile\n");
  568.                       break;
  569.         case  filcr : fprintf(stderr, "Cannot create outfile\n");
  570.                       break;
  571.         default     : fprintf(stderr, "Unkown error code\n");
  572.                       break;
  573.     };
  574.     if (outputtofile)
  575.         unlink(OUTfilename);
  576.     exit(errorcode);
  577.  
  578. }  /* errorexit */
  579.  
  580. /*----------------------------------------------------------------------------*/
  581.  
  582. #if __STDC__
  583. void usage(int uerr)
  584. #else
  585. void usage(uerr)
  586. int uerr;
  587. #endif
  588. {
  589.  
  590.     if (uerr != ign) {
  591.         fprintf(stderr,"%s: ", progname);
  592.         switch (uerr) {
  593.             case   ign    : fprintf(stderr, "%s", Copyright);
  594.                             break;
  595.             case   wrnge  : fprintf(stderr, "width arg out of range:16-132");
  596.                             break;
  597.             case   nan    : fprintf(stderr, "numeric argument expected for option %c",
  598.                                             optch);
  599.                             break;
  600.             case   gae    : fprintf(stderr, "garbage in argument for option %c",
  601.                                             optch);
  602.                             break;
  603.             case   bdlst  : fprintf(stderr, "mal-formed list of pagenumbers");
  604.                             break;
  605.             case   onef   : fprintf(stderr, "only one infile argument allowed");
  606.                             break;
  607.             case   noarg  : fprintf(stderr, "option argument expected for option %c",
  608.                                             optch);
  609.                             break;
  610.             case   bdopt  : fprintf(stderr, "bad option %c", optch);
  611.                             break;
  612.             case   onepp  : fprintf(stderr, "only one pagelist allowed");
  613.                             break;
  614.             default       : fprintf(stderr, "unknown usage error");
  615.                             break;
  616.         }
  617.         fprintf(stderr, "\n");
  618.     }
  619.     fprintf(stderr, "Usage: %s [ options ] dvifile[.dvi]\n", progname);
  620.     fprintf(stderr, "Options are:\n");
  621.     fprintf(stderr,
  622.             " -ofile   Write output to file, else write to stdout.\n");
  623.     fprintf(stderr,
  624.             " -plist   Print pages whos TeX-page-number are in list.\n");
  625.     fprintf(stderr,
  626.             " -Plist   Print pages whos sequential number are in list.\n");
  627.     fprintf(stderr,
  628.             " -wn      Print the lines with width n characters, default 80.\n");
  629.     fprintf(stderr,
  630.             " -l       Write ''^L'' instead of formfeed between pages.\n");
  631.     fprintf(stderr,
  632.             " -u       National Swedish/Finnish characters printed as aaoAAO");
  633. #if CORRECT_ERROR
  634.  
  635. #if DEFSCAND
  636.     fprintf(stderr, ".\n");
  637.     fprintf(stderr, " (default).\n");
  638. #else
  639.     fprintf(stderr, " (default).\n");
  640.     fprintf(stderr,
  641.             " -s       National Swedish/Finnish characters printed as }{|][\\");
  642.     fprintf(stderr, ".\n");
  643. #endif
  644.  
  645. #else
  646.     if (DEFSCAND)
  647.         fprintf(stderr, ".\n");
  648.     else
  649.         fprintf(stderr, " (default).\n");
  650.     fprintf(stderr,
  651.             " -s       National Swedish/Finnish characters printed as }{|][\\");
  652.     if (DEFSCAND)
  653.         fprintf(stderr, " (default).\n");
  654.     else
  655.         fprintf(stderr, ".\n");
  656. #endif
  657.     exit(uerr);
  658.  
  659. } /* usage */
  660.  
  661.