home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / share / doc / ps1 / 04.pascal / csfix.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-17  |  4.9 KB  |  219 lines

  1. /*-
  2.  * Copyright (c) 1980 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. char copyright[] =
  36. "@(#) Copyright (c) 1980 The Regents of the University of California.\n\
  37.  All rights reserved.\n";
  38. #endif /* not lint */
  39.  
  40. #ifndef lint
  41. static char sccsid[] = "@(#)csfix.c    6.3 (Berkeley) 4/17/91";
  42. #endif /* not lint */
  43.  
  44. #include <stdio.h>
  45. /*
  46.  * csfix - fix constant spacing for error message flags in troff
  47.  *
  48.  * Bill Joy UCB September 11, 1977
  49.  *
  50.  * This would be better written in snobol!
  51.  *
  52.  * Normally fixes error flags in a pi listing
  53.  * Optional - causes fixing of '---' and initial blank widthin a pxp profile.
  54.  */
  55.  
  56. char    flag, dflag;
  57.  
  58. main(argc, argv)
  59.     int argc;
  60.     char *argv[];
  61. {
  62.  
  63.     argc--, argv++;
  64.     if (argc > 0 && argv[0][0] == '-' && argv[0][1] == 'd')
  65.         dflag++, argc--, argv++;
  66.     if (argc > 0 && argv[0][0] == '-')
  67.         flag++, argc--, argv++;
  68.     if (argc != 0) {
  69.         write(2, "Usage: csfix\n", 13);
  70.         exit(1);
  71.     }
  72.     while (getline()) {
  73.         if (errline()) {
  74.             flag ? fixpxp() : reformat();
  75.             continue;
  76.         }
  77.         if (flag) {
  78.             fixdigits();
  79.             continue;
  80.         }
  81.         if (spwarn())
  82.             continue;
  83.         if (nontriv())
  84.             save();
  85.         if (dflag)
  86.             fixdigits();
  87.         else
  88.             putline();
  89.     }
  90.     exit(0);
  91. }
  92.  
  93. char    line[160], flagee[160], *digitty();
  94.  
  95. getline()
  96. {
  97.     register char *cp, c;
  98.  
  99.     for (cp = line, c = getchar(); c != '\n' && c != EOF; c = getchar())
  100.         *cp++ = c;
  101.     if (c == EOF)
  102.         return (0);
  103.     *cp = 0;
  104.     return (1);
  105. }
  106.  
  107. errline()
  108. {
  109.     register int i;
  110.     register char *cp;
  111.  
  112.     for (cp = line; cp[0] && cp[1] && cp[2]; cp++)
  113.         if (cp[0] == '-' && cp[1] == '-' && cp[2] == '-')
  114.             return (1);
  115.     return (0);
  116. }
  117.  
  118. reformat()
  119. {
  120.     register char *cp, c, *tail;
  121.  
  122.     printf("%2.2s", line);
  123.     if (line[0] != 'w')
  124.         printf("\\l'\\w`w `u-\\w`%2.2s`u '", line);
  125.     for (cp = line; *cp != 0 && *cp != '^'; cp++)
  126.         continue;
  127.     tail = cp + 1;
  128.     if (cp[-1] == '\b' && cp[-2] == '|')
  129.         cp -= 2;
  130.     c = flagee[cp - line];
  131.     flagee[cp - line] = 0;
  132.     printf("\\l'\\w`%s`u-\\w`w `u\\&\\(rh'", flagee);
  133.     flagee[cp - line] = c;
  134.     if (c == '\0')
  135.         c = flagee[cp - line - 1];
  136.     printf("\\l'(\\w`%c`u-\\w`^`u)/2 '", c);
  137.     printf("\\(ua");
  138.     printf("\\l'(\\w`%c`u-\\w`^`u)/2 '", c);
  139.     printf("\\l'\\w`---`u\\&\\(rh'%s\n", tail+3);
  140. }
  141.  
  142. nontriv()
  143. {
  144.  
  145.     switch (line[0]) {
  146.         case 'E':
  147.         case 'e':
  148.         case 'w':
  149.         case 's':
  150.         case 0:
  151.             return (0);
  152.     }
  153.     return (1);
  154. }
  155.  
  156. save()
  157. {
  158.  
  159.     strcpy(flagee, line);
  160. }
  161.  
  162. putline()
  163. {
  164.  
  165.     printf("%s\n", flag ? digitty(0) : line);
  166. }
  167.  
  168. spwarn()
  169. {
  170.  
  171.     if (line[0] != ' ' || line[1] != ' ' || line[2] != 'w')
  172.         return (0);
  173.     printf("  \\l'(\\w`E`u-\\w`w`u)/2 'w\\l'(\\w`E`u-\\w`w`u)/2 '");
  174.     printf(&line[3]);
  175.     printf("\n");
  176.     return (1);
  177. }
  178.  
  179. fixpxp()
  180. {
  181.     register char *cp;
  182.  
  183.     for (cp = line; *cp != '-'; cp++)
  184.         continue;
  185.     *cp = 0;
  186.     printf("%s\\l'\\w`\\0\\0\\0\\0`u-\\w`.`u\\&\\(rh'%s\n", digitty(1), cp + 3);
  187. }
  188.  
  189. char *
  190. digitty(yup)
  191.     char yup;
  192. {
  193.     register char *cp, *dp, *lp;
  194.  
  195.     for (lp = line; *lp && *lp != '|'; lp++)
  196.         continue;
  197.     if (yup == 0 && !*lp)
  198.         return (line);
  199.     for (cp = line, dp = flagee; cp < lp; cp++)
  200.         if (*cp == ' ')
  201.             *dp++ = '\\', *dp++ = '0';
  202.         else
  203.             *dp++ = *cp;
  204.     strcpy(dp, cp);
  205.     return (flagee);
  206. }
  207.  
  208. fixdigits()
  209. {
  210.     register char *cp, c;
  211.  
  212.     for (cp = line; *cp == ' ' || *cp >= '0' && *cp <= '9'; cp++)
  213.         continue;
  214.     c = *cp, *cp = 0;
  215.     digitty(1);
  216.     *cp = c;
  217.     printf("%s%s\n", flagee, cp);
  218. }
  219.