home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / net / wp < prev    next >
Internet Message Format  |  1987-01-14  |  29KB

  1. From pete@kvvax4.UUCP Tue Jan 13 07:05:30 1987
  2. Path: beno!seismo!mcvax!kvvax4!pete
  3. From: pete@kvvax4.UUCP (Peter J Story)
  4. Newsgroups: net.sources
  5. Subject: wp - a programmers text & comment formatter
  6. Message-ID: <389@kvvax4.UUCP>
  7. Date: 13 Jan 87 12:05:30 GMT
  8. Reply-To: pete@kvvax4.UUCP (Peter J Story)
  9. Organization: Kongsberg Vaapenfabrikk A/S, Kongsberg, Norway
  10. Lines: 972
  11.  
  12. This article header:
  13.  
  14. > Subject: It's hard to edit Ada comments and then reformat (FILL) them
  15.  
  16. in comp.lang.ada, prompted me to finally send what I consider to be one of
  17. the most useful tools in my toolbox  ...  the article contains the full
  18. sources for wp(1) - a simple programmer's text formatter.  As well as
  19. handling normal text it also knows about comments in programs.  For the
  20. first time you can edit your comments (in almost any language), and get
  21. them reformatted easily and neatly afterwards.  How about changing:
  22.    /* this is a lump of comment     */
  23.    /* text that has been horribly hacked about and
  24.    /* changed */
  25. into this:
  26.    /* this is a lump of comment text that has been horribly      */
  27.    /* hacked about and changed                                   */
  28. easily?  Or this:
  29.    -- this is a comment
  30.    -- which looks pretty untidy, but can be made 
  31.    -- to look nicer
  32. into this:
  33.    -- this is a comment which looks pretty untidy,
  34.    -- but can be made to look nicer
  35.  
  36. Like it?  Then wp(1) is the thing for you!  It runs on both Ultrix
  37. and System V machines.  I suppose this will qualify it for most
  38. Unices, since it does nothing especially non portable.  The source
  39. bears marks of its stepwise development (ie no serious design!) but
  40. the result is pretty handy anyway.
  41.  
  42.  
  43. # ----------------------- cut here ----------------------------------
  44. #! /bin/sh
  45. # This is a shell archive, meaning:
  46. # 1. Remove everything above the #! /bin/sh line.
  47. # 2. Save the resulting text in a file.
  48. # 3. Execute the file with /bin/sh (not csh) to create the files:
  49. #    README
  50. #    wp.1
  51. #    wp.c
  52. #    string.h
  53. #    getopt.c
  54. #    strspn.c
  55. #    strtok.c
  56. #    Makefile
  57. # This archive created: Wed Oct  1 10:05:16 1986
  58. export PATH; PATH=/bin:$PATH
  59. echo shar: extracting "'README'" '(1279 characters)'
  60. if test -f 'README'
  61. then
  62.     echo shar: will not over-write existing file "'README'"
  63. else
  64. sed 's/^    X//' << \SHAR_EOF > 'README'
  65.     XTue Sep 30 15:48:26 EET 1986
  66.     X============================
  67.     X
  68.     Xwp(1) - the programmer's text formatter.  Not another one?  Well, this one
  69.     Xis really for programmers.  As well as handling normal text it also knows
  70.     Xabout comments in programs.  For the first time you can edit your comments,
  71.     Xand get them reformatted easily and neatly afterwards.  How about changing
  72.     X
  73.     X   /* this is a lump of comment     */
  74.     X   /* text that has been horribly hacked about and
  75.     X   /* changed */
  76.     X
  77.     Xinto this:
  78.     X
  79.     X   /* this is a lump of comment text that has been horribly      */
  80.     X   /* hacked about and changed                                   */
  81.     X
  82.     Xeasily?  Like it?  Then read on.  You can handle almost any comment
  83.     Xconvention.  Of course wp handles normal text as well.  It understands
  84.     Xnroff commands (like Berkeleys fmt command), so you can use it on document
  85.     Xinput as well.  It knows about first and subsequent line indents in
  86.     Xparagraphs (like INed's ffill command) so you won't miss that feature.  It
  87.     Xeven handles them inside comments.
  88.     X
  89.     XThis program is available for distribution to anyone for any purpose. But
  90.     Xplease do me the courtesy of retaining my credit line!
  91.     X
  92.     X---
  93.     XPete Story, Avd FF441, A/S Kongsberg Vaapenfabrikk
  94.     XPO Box 25, N3601 Kongsberg, Norway.
  95.     XTel: (+47 3) 739480  Uucp:    mcvax!kvvax4!pete
  96. SHAR_EOF
  97. if test 1279 -ne "`wc -c < 'README'`"
  98. then
  99.     echo shar: error transmitting "'README'" '(should have been 1279 characters)'
  100. fi
  101. fi # end of overwriting check
  102. echo shar: extracting "'wp.1'" '(4698 characters)'
  103. if test -f 'wp.1'
  104. then
  105.     echo shar: will not over-write existing file "'wp.1'"
  106. else
  107. sed 's/^    X//' << \SHAR_EOF > 'wp.1'
  108.     X'\" SCCS id: @(#)wp.1    1.2
  109.     X'\" page setup for European paper
  110.     X.nr )O 1.5c
  111.     X.nr )L 12i
  112.     X.nr LL 6.5i
  113.     X.pl \n()Lu
  114.     X.ll \n(LLu
  115.     X.lt \n(LLu
  116.     X.po \n()Ou
  117.     X'\" actual manual page
  118.     X.TH WP 1
  119.     X.SH NAME
  120.     Xwp \- reformat text to even right margin
  121.     X.SH SYNOPSIS
  122.     X.B wp
  123.     X.RB [ \-c " commentstring [" \-bBfs "] ]"
  124.     Xlinelength
  125.     X.SH DESCRIPTION
  126.     X.I Wp
  127.     Xfilters standard input to standard output reformatting the text to
  128.     Xlines approximately equal to
  129.     X.I linelength
  130.     X(default 67).
  131.     X.PP
  132.     XThe text is regarded as "paragraphs", defined to be sections of text
  133.     Xseparated by one or more empty lines (including lines containing only
  134.     Xwhite space - that is, spaces and tabs).  The output paragraphs are indented
  135.     Xsuch that the first line indentation is the same as that of the first
  136.     Xline of the input paragraph, and
  137.     Xsecond and subsequent lines are indented to the level of the second
  138.     Xinput line of the paragraph.  The indentation of the third and
  139.     Xsubsequent lines of the input paragraph is thus ignored.
  140.     X.PP
  141.     XSince text lines rarely begin with the character ".", such a line will
  142.     Xhave the same effect on the line counting as does a blank line [ie,
  143.     Xlike fmt(1), wp can be used to reformat nroff input].
  144.     X.PP
  145.     XA "word" is defined to be all characters between white space.
  146.     XThe lines are "turned" at word boundaries - no hyphenation is
  147.     Xattempted.  The characters ".", "!", and "?" are regarded as sentence
  148.     Xendings, and will be followed by two spaces instead of the normal one
  149.     Xspace between words.
  150.     X.PP
  151.     XThe option
  152.     X.B \-c
  153.     Xspecifies that the following argument is to be treated as a comment
  154.     Xprefix.  This prefix is stripped off input lines before reformatting.
  155.     XThe prefix is then added to the beginning of
  156.     X.I all
  157.     Xnon blank output lines, regardless of whether they originally started with the
  158.     Xcomment prefix or not.  This facility is intended to ease the inclusion or
  159.     Xreformatting of comments in programs and shell procedures.
  160.     X.PP
  161.     XAny indentation preceding a comment symbol on the
  162.     X.I first
  163.     Xline of a paragraph will be retained for all the output lines.  This
  164.     Xis reset only by a genuine blank line in the text.
  165.     X.PP
  166.     XThe text
  167.     Xindentation within the comment symbols is controlled as for normal
  168.     Xtext paragraphs, with indentations relative to the comment symbol if
  169.     Xit is present in the input text, otherwise relative to the beginning
  170.     Xof the line.
  171.     X.PP
  172.     XIf
  173.     X.B \-b
  174.     Xis specified in addition, then "block commenting" is used.  The
  175.     Xspecified comment prefix with the character order reversed and
  176.     X"paired" characters
  177.     X.BR [ "(), [], {}" ]
  178.     Xinverted is assumed to be a comment suffix.
  179.     XAny existing suffix is removed from input lines before reformatting. All
  180.     Xoutput lines, including blank lines, will be preceded by the comment
  181.     Xprefix, and terminated by the comment suffix after padding with spaces
  182.     Xto
  183.     X.IR linelength .
  184.     X.PP
  185.     XOption
  186.     X.B \-B
  187.     Xalso produces block commenting, but no linelength padding is
  188.     Xdone, and blank lines remain blank.
  189.     X.PP
  190.     XIt can be difficult to understand the exact interplay of comment
  191.     Xindentations and text indentations.  The basic rule is to make the
  192.     Xindentations and comment prefix correct on the first two lines of your
  193.     Xparagraph - wp will handle the rest.
  194.     X.PP
  195.     XOption
  196.     X.B \-f
  197.     Xwill "frame" paragraphs with lines of dashes, inside comment
  198.     Xsymbols.  This option implies
  199.     X.BR \-b .
  200.     XThe behaviour is currently rather unsatisfactory on more than single
  201.     Xparagraphs, but extremely useful for those!
  202.     X.PP
  203.     XOption
  204.     X.B \-s
  205.     Xmay be used to strip off comment symbols (including dashed lines if -f
  206.     Xis specified), without replacing them after reformatting.  Either
  207.     Xleading or both leading and trailing comments are stripped, depending
  208.     Xon the absence or presence of a block comment option.
  209.     X.SH EXAMPLES
  210.     X.I wp
  211.     Xis typically used within vi(1) to reformat text while editing. The
  212.     Xcommand:
  213.     X.sp
  214.     X   !}wp
  215.     X.PP
  216.     Xreplaces the paragraph starting at the cursor with a reformatted
  217.     Xversion.
  218.     X.PP
  219.     X.sp
  220.     X   !}wp -c '\e#\ ' 55
  221.     X.PP
  222.     Xreplaces the paragraph with a version reformatted to lines of not more
  223.     Xthan 55 characters, each line commencing with "#\ ".  Observe the
  224.     Xnecessity to use both quotes and the backslash in the case of the "#" character,
  225.     Xbecause this character is special to both vi(1) and to sh(1).
  226.     X.PP
  227.     X.sp
  228.     X   !}wp -c '(* ' -b 
  229.     X.PP
  230.     Xreplaces the paragraph with a reformatted version, 
  231.     Xwith preceding and trailing comment markers (* and *) -
  232.     XPascal block commenting.
  233.     X.PP
  234.     X.I wp
  235.     Xcan also be used with INed.  The command:
  236.     X.PP
  237.     X.sp
  238.     X   <enter>wp -c '(* ' -b<do>
  239.     X.PP
  240.     Xhas the same effect as the previous example.
  241.     X.SH BUGS
  242.     XInput lines are silently limited to 512 characters.
  243.     X.PP
  244.     XIf the first line of a paragraph is long enough to create more than
  245.     Xone line in the output, then the indentation of the second input line
  246.     Xis ignored.  Workaround: divide the first line!
  247.     X.PP
  248.     XOthers, probably - mail kvvax6!pete
  249. SHAR_EOF
  250. if test 4698 -ne "`wc -c < 'wp.1'`"
  251. then
  252.     echo shar: error transmitting "'wp.1'" '(should have been 4698 characters)'
  253. fi
  254. fi # end of overwriting check
  255. echo shar: extracting "'wp.c'" '(11514 characters)'
  256. if test -f 'wp.c'
  257. then
  258.     echo shar: will not over-write existing file "'wp.c'"
  259. else
  260. sed 's/^    X//' << \SHAR_EOF > 'wp.c'
  261.     X/* SCCS id : @(#)wp.c    1.11 (Peter J Story)                                 */
  262.     X
  263.     X/* ------------------------------------------------------------- */
  264.     X/* Copyright: P J Story, Eikervn 67, 3600 KONGSBERG, Norway 1986 */
  265.     X/*   This program may be copied for any purpose, as long as the  */
  266.     X/*   above credit line is retained                 */
  267.     X/* ------------------------------------------------------------- */
  268.     X
  269.     X/* trivial text formatter, operating as a filter, to enable me   */
  270.     X/* to format text into roughly equal length lines.  Most often   */
  271.     X/* used from vi(1).  Getting less trivial and messier, but still */
  272.     X/* useful                                                        */
  273.     X
  274.     X/* will run on System V systems, and 4.x BSD if you have the     */
  275.     X/* missing System V getopt, strtok, strspn routines or           */
  276.     X/* equivalents which are usually packaged with my source,        */
  277.     X/* courtesy of Henry Spencer                                     */
  278.     X
  279.     X/* modified: Sun Sep 22 14:54:10 GMT+1:00 1985, by KVVAX6!pete     */
  280.     X/*   -s option strips comment symbols and doesnt put them back   */
  281.     X/*   return 0 on exit, so it works from mail                     */
  282.     X/* modified: Fri Sep 6 10:00:06 GMT+1:00 1985, by KVVAX6!esa     */
  283.     X/*   -f option for framing (adopted into my version as is,       */
  284.     X/*   though I don't like its behaviour wrt more than one         */
  285.     X/*   paragraph)                                                  */
  286.     X/* modified: Fri May 24 18:16:27 GMT+1:00 1985, by kvvax6!pete   */
  287.     X/*  even more corrections to comment feature - comment indents   */
  288.     X/*  are handled, and non padded block comments                   */
  289.     X/* modified: Mon May 20 16:43:01 GMT+1:00 1985, by kvvax6!pete   */
  290.     X/*  to correctly handle leading tabs (simply replacing by        */
  291.     X/*  spaces) to add the -b option for block commenting            */
  292.     X/* modified: Wed Apr 24 08:57:33 MET 1985, by olhqmc!pete        */
  293.     X/*  Rewritten from awk to C.  Indenting facilities added, so     */
  294.     X/*  that output paragraphs retain the first and second line      */
  295.     X/*  indents of the input para for the first and subsequent lines */
  296.     X/*  of the output para.                                          */
  297.     X/* modified: Fri Jun 22 08:04:40 CET 1984, by pete @ Olivetti HQ */
  298.     X/* To give me formatting of 'commented' lines.  Normal text will */
  299.     X/* be made into comments with the given comment symbol.          */
  300.     X/* Existing comment text will be reformatted.                    */
  301.     X
  302.     X
  303.     X#include <stdio.h>
  304.     X
  305.     X#define LINELENGTH 67
  306.     X#define WHITE "     "
  307.     X#define DASH '-'
  308.     X
  309.     Xchar buf[512];
  310.     Xchar revcomment[20];    /* comment symbol reversed */
  311.     Xchar *progname;
  312.     Xchar *commentstart;
  313.     Xchar *ipline;
  314.     X
  315.     Xint oplth;        /* current length output on this line */
  316.     Xint iplth;
  317.     Xint fplth;
  318.     Xint initblanks;        /* actual number of WHITE chars at start of ipline */
  319.     Xint oplinenum;        /* in the output paragraph */
  320.     Xint iplinenum;        /* in the input paragraph */
  321.     Xint spacesbefore;    /* the next word */
  322.     Xint commenting = 0;    /* on if lines are to be preceded by comment symbol */
  323.     Xint commentlth = 0;
  324.     Xint blocking = 0;    /* on if lines are to be succeeded by comment symbol
  325.     X               reversed */
  326.     Xint framing = 0;    /* will be blocking and framing */
  327.     Xint padding = 1;    /* on if block commented lines are padded out */
  328.     Xint stripping = 0;      /* on if comment symbols are to be stripped off */
  329.     X            /*  and left off */
  330.     Xint comindent = 0;    /* comment indent on all lines in para */
  331.     Xint linelength = LINELENGTH;    /* output length to aim at */
  332.     X
  333.     X
  334.     X/* BEWARE, this program grew like topsy, and most of these have  */
  335.     X/* side effects.  Sorry about that!                              */
  336.     X
  337.     Xint    chkblank();    /* return true if line is blank */
  338.     Xvoid    dash();        /* output this many dashes */
  339.     Xvoid    dashline();    /* block out the line with dashes */
  340.     Xvoid    emptyline();    /* output empty line */
  341.     Xint    initcount();    /* how many effective initial spaces are there */
  342.     Xvoid    newline();    /* clear off this op line, init for next */
  343.     Xint    prefix();    /* return true if pre is prefix in s */
  344.     Xvoid    space();    /* output this many spaces */
  345.     Xvoid    usage();
  346.     X
  347.     Xchar    *gets();
  348.     Xchar    *strtok();
  349.     Xint    strcmp();
  350.     Xint    strlen();
  351.     Xint    strspn();
  352.     X
  353.     X
  354.     Xmain(argc,argv)
  355.     X   char **argv;
  356.     X{
  357.     X   extern char *optarg;
  358.     X   extern int optind;
  359.     X
  360.     X   int c;
  361.     X   int errflg = 0;
  362.     X   int indent;        /* text indent on the current line */
  363.     X   int indent1;        /* text indent on 1st o/p line in para */
  364.     X   int indent2;        /* text indent on subs o/p line in para */
  365.     X
  366.     X   progname=argv[0];
  367.     X
  368.     X   while ((c=getopt(argc, argv, "Bbc:fs")) != EOF) {
  369.     X      switch (c) {
  370.     X     case 'B':    /* block commenting, do not pad to full lth */
  371.     X        padding = 0;
  372.     X        blocking++;
  373.     X        break;
  374.     X     case 'f':    /* framing, which implies a block comment */
  375.     X        framing++;
  376.     X        blocking++;
  377.     X        break;
  378.     X     case 'b':    /* block commenting */
  379.     X        blocking++;
  380.     X        break;
  381.     X     case 's':      /* stripping comments */
  382.     X        stripping++;
  383.     X        break;
  384.     X     case 'c':
  385.     X        commenting++;
  386.     X        commentstart = optarg;
  387.     X        commentlth = strlen(commentstart);
  388.     X        break;
  389.     X     case '?':
  390.     X        errflg++;
  391.     X        break;
  392.     X      }
  393.     X   }
  394.     X   argc -= optind;
  395.     X   argv = &argv[optind];
  396.     X
  397.     X   if ((blocking || stripping) && ! commenting) errflg++;
  398.     X
  399.     X   if (errflg) usage();
  400.     X
  401.     X   if (argc > 0) {
  402.     X      if ((linelength = atoi(*argv)) <= 0 ) {
  403.     X     usage();
  404.     X      }
  405.     X   }
  406.     X
  407.     X   if (blocking) {
  408.     X      /* this section attempts a reasonable inverse of the comment string */
  409.     X      char *s = commentstart + commentlth - 1;
  410.     X      char *d = &revcomment[0];
  411.     X      while (s >= commentstart) {
  412.     X     char c = *s--;
  413.     X     switch (c) {
  414.     X     case '(':
  415.     X        c = ')'; break;
  416.     X     case '{':
  417.     X        c = '}'; break;
  418.     X     case '[':
  419.     X        c = ']'; break;
  420.     X     case '<':
  421.     X        c = '>'; break;
  422.     X     }
  423.     X     *d++ = c;
  424.     X      }
  425.     X      *d = '\0';
  426.     X      linelength -= commentlth;
  427.     X   }
  428.     X
  429.     X   iplinenum = 0;
  430.     X   oplinenum = 0;
  431.     X
  432.     X   while ((ipline = gets(buf)) != NULL) {
  433.     X      int initspaces;    /* number of spaces equivalent */
  434.     X
  435.     X      iplth = strlen(ipline);
  436.     X      initblanks = strspn(ipline,WHITE);
  437.     X
  438.     X      if (iplth == initblanks) { /* current line is really empty */
  439.     X     if (oplth) newline();
  440.     X     emptyline();
  441.     X     comindent = 0;
  442.     X      } else if ((*ipline == '.') && ! commenting) {
  443.     X     /* current line is an nroff command */
  444.     X     if (oplth) newline();
  445.     X     /* Yugh, this really uses a side effect of emptyline */
  446.     X     printf("%s",ipline);
  447.     X     oplth += iplth;
  448.     X     emptyline();
  449.     X     comindent = 0;
  450.     X      } else {            /* current line is non empty */
  451.     X     char *word;
  452.     X
  453.     X     iplinenum++;
  454.     X
  455.     X     if (blocking) {
  456.     X        /* strip trailing comment marker */
  457.     X        char *p = ipline + strlen(ipline) - commentlth;
  458.     X        if (strcmp(p,revcomment) == 0) {
  459.     X           *p = '\0';
  460.     X        }
  461.     X        if (chkblank()) continue; /* resets iplth and initblanks */
  462.     X     }
  463.     X
  464.     X     initspaces = initcount(ipline,initblanks,0);
  465.     X
  466.     X     if (commenting) {
  467.     X        if (prefix(commentstart,ipline + initblanks)) {
  468.     X           int offset;
  469.     X           if (iplinenum == 1) {
  470.     X          comindent = initspaces;    /* comment indentation */
  471.     X           }
  472.     X
  473.     X           /* strip leading comment marker */
  474.     X           offset = initblanks + commentlth;
  475.     X           ipline += offset;
  476.     X           if (chkblank()) continue; /* sets iplth and initblanks */
  477.     X
  478.     X           /* now reset for text indents inside the comments */
  479.     X           initspaces = initcount(ipline,initblanks,offset);
  480.     X        } else {
  481.     X           if (iplinenum == 1) {
  482.     X          comindent = 0;    /* comment indentation */
  483.     X           }
  484.     X        }
  485.     X         }
  486.     X
  487.     X     if (iplinenum <= 2) {
  488.     X        if (iplinenum == 1) {
  489.     X           if (framing) {
  490.     X          space(comindent);
  491.     X          dashline();
  492.     X           }
  493.     X           indent2 = indent1 = initspaces;    /* 1st line indent */
  494.     X        } else {
  495.     X           indent2 = initspaces;        /* subs line indent */
  496.     X        }
  497.     X     }
  498.     X
  499.     X         while ((word = strtok(ipline,WHITE)) != NULL) {
  500.     X        int wordlth = strlen(word);
  501.     X        char lastchar = word[wordlth - 1];
  502.     X
  503.     X        if ((oplth + spacesbefore + wordlth) > linelength) {
  504.     X           newline();
  505.     X        }
  506.     X
  507.     X            if (oplth == 0) {    /* start of new line */
  508.     X           if (oplinenum < 2) {
  509.     X          indent = (oplinenum == 1) ? indent2 : indent1;
  510.     X           }
  511.     X           if (commenting) {
  512.     X          space(comindent);
  513.     X          if (!stripping) {
  514.     X             printf("%s",commentstart);
  515.     X             oplth += commentlth;
  516.     X          }
  517.     X           }
  518.     X           space(indent);
  519.     X            }
  520.     X
  521.     X        space(spacesbefore);
  522.     X        printf("%s",word);
  523.     X        oplth += wordlth;
  524.     X
  525.     X        spacesbefore =
  526.     X           ((lastchar=='.') || (lastchar=='!') || (lastchar=='?')) ? 2 : 1;
  527.     X
  528.     X        ipline = (char *) NULL;
  529.     X     }
  530.     X      }
  531.     X   }
  532.     X   if (oplth) newline();
  533.     X   if (framing && !stripping) {
  534.     X      space(comindent);
  535.     X      dashline();
  536.     X   }
  537.     X   return(0);
  538.     X}
  539.     X
  540.     X/* ------------------------------------------------------------- */
  541.     X/* output routines of various kinds                  */
  542.     X/* ------------------------------------------------------------- */
  543.     X
  544.     Xvoid
  545.     Xspace(howmany)
  546.     X   register int howmany;
  547.     X{
  548.     X   register int t;
  549.     X   t = howmany;
  550.     X   while (t-- > 0) putchar(' ');
  551.     X   oplth += howmany;
  552.     X}
  553.     X
  554.     Xvoid
  555.     Xdash(howmany)
  556.     X   register int howmany;
  557.     X{
  558.     X   register int t;
  559.     X   t = howmany;
  560.     X   while (t-- > 0) putchar(DASH);
  561.     X   oplth += howmany;
  562.     X}
  563.     X
  564.     Xvoid
  565.     Xnewline()
  566.     X{
  567.     X   if (blocking) {
  568.     X      if (padding) {
  569.     X     space(linelength - oplth);
  570.     X      }
  571.     X      if (!stripping) {
  572.     X     printf("%s",revcomment);
  573.     X     oplth += commentlth;
  574.     X      }
  575.     X   }
  576.     X   putchar('\n');
  577.     X   oplth = 0;
  578.     X   spacesbefore = 0;
  579.     X   oplinenum++;
  580.     X}
  581.     X
  582.     Xvoid
  583.     Xemptyline()
  584.     X{
  585.     X   if (blocking && padding) {
  586.     X      /* need comment start and end as well */
  587.     X      space(comindent);
  588.     X      if (!stripping) {
  589.     X     printf("%s",commentstart);
  590.     X     oplth += commentlth;
  591.     X      }
  592.     X      newline();
  593.     X   } else {
  594.     X      /* ordinary text or start only commenting just get blank lines */
  595.     X      putchar('\n');
  596.     X      oplth = 0;
  597.     X      spacesbefore = 0;
  598.     X   }
  599.     X   iplinenum = 0;
  600.     X   oplinenum = 0;
  601.     X}
  602.     X
  603.     Xvoid
  604.     Xdashline(len)          /* block out the line with a dash comment */
  605.     X   int len;
  606.     X{
  607.     X   if (!stripping) {
  608.     X      printf("%s",commentstart);
  609.     X      oplth += commentlth;
  610.     X   }
  611.     X   dash(linelength - oplth);
  612.     X   newline();
  613.     X   oplinenum--; /* messy - dashlines shouldn't count */
  614.     X}
  615.     X
  616.     X/* ------------------------------------------------------------- */
  617.     X/* input routines of various kinds                  */
  618.     X/* ------------------------------------------------------------- */
  619.     X
  620.     Xint
  621.     Xprefix(pre, s)            /* return true if pre is prefix in s */
  622.     X   register char *pre, *s;
  623.     X{
  624.     X   register char c;
  625.     X   while ((c = *pre++) == *s++)
  626.     X   if (c == '\0')
  627.     X       return(1);
  628.     X   return((c == '\0')?1:0);
  629.     X}
  630.     X
  631.     Xint
  632.     Xchkblank()    /* return true if line is blank, with side effects */
  633.     X        /* like the line is output as well!           */
  634.     X{
  635.     X   /* any comment symbols should already have been stripped */
  636.     X   iplth = strlen(ipline);
  637.     X   initblanks = strspn(ipline,WHITE);
  638.     X   if (iplth == initblanks) { /* current text is empty */
  639.     X      if (oplth) newline();
  640.     X      emptyline();
  641.     X      return(1);    /* was blank, indicate to caller */
  642.     X   }
  643.     X   if (framing) { /* then a line of dashes should be lost */
  644.     X      char *s = ipline + initblanks;
  645.     X      char *e = ipline + iplth;
  646.     X      while (s < e && *s++ == DASH) ;
  647.     X      if (s == e) {
  648.     X     /* effectively an empty line, but don't output it */
  649.     X     iplinenum = 0;
  650.     X     oplinenum = 0;
  651.     X     return(1);
  652.     X      }
  653.     X   }
  654.     X   return(0);
  655.     X}
  656.     X
  657.     Xint
  658.     Xinitcount(line,blanks,offset)     /* count initial tabs into spaces */
  659.     X   char* line;             /* return effective blank length */
  660.     X   int blanks;
  661.     X   int offset;
  662.     X{  
  663.     X   char *s,*e;
  664.     X   int spaces;
  665.     X   s = line;
  666.     X   e = line + blanks;
  667.     X   spaces = 0;
  668.     X   while (s < e) {
  669.     X      if (*s++ == '\t') {
  670.     X     spaces += (8 - ((offset + spaces + 8) % 8));
  671.     X      } else {
  672.     X     spaces++;
  673.     X      }
  674.     X   }
  675.     X   return(spaces);
  676.     X}
  677.     X
  678.     X/* ------------------------------------------------------------- */
  679.     X/* miscellaneous routines                     */
  680.     X/* ------------------------------------------------------------- */
  681.     X
  682.     Xvoid
  683.     Xusage()
  684.     X{
  685.     X   fprintf(stderr, "usage: %s [-c commentchar [-bBfs] ] linelength\n",progname);
  686.     X   exit(1);
  687.     X}
  688. SHAR_EOF
  689. if test 11514 -ne "`wc -c < 'wp.c'`"
  690. then
  691.     echo shar: error transmitting "'wp.c'" '(should have been 11514 characters)'
  692. fi
  693. fi # end of overwriting check
  694. echo shar: extracting "'string.h'" '(1431 characters)'
  695. if test -f 'string.h'
  696. then
  697.     echo shar: will not over-write existing file "'string.h'"
  698. else
  699. sed 's/^    X//' << \SHAR_EOF > 'string.h'
  700.     X/*
  701.     X * String functions.
  702.     X */
  703.     X
  704.     Xchar *memcpy(/*char *dst, const char *src, int size*/);
  705.     Xchar *memccpy(/*char *dst, const char *src, int ucharstop, int size*/);
  706.     Xchar *strcpy(/*char *dst, const char *src*/);
  707.     Xchar *strncpy(/*char *dst, const char *src, int size*/);
  708.     Xchar *strcat(/*char *dst, const char *src*/);
  709.     Xchar *strncat(/*char *dst, const char *src, int size*/);
  710.     Xint memcmp(/*const char *s1, const char *s2, int size*/);
  711.     Xint strcmp(/*const char *s1, const char *s2*/);
  712.     Xint strncmp(/*const char *s1, const char *s2, int size*/);
  713.     Xchar *memchr(/*const char *s, int ucharwanted, int size*/);
  714.     Xchar *strchr(/*const char *s, int charwanted*/);
  715.     Xint strcspn(/*const char *s, const char *reject*/);
  716.     Xchar *strpbrk(/*const char *s, const char *breakat*/);
  717.     Xchar *strrchr(/*const char *s, int charwanted*/);
  718.     Xint strspn(/*const char *s, const char *accept*/);
  719.     Xchar *strstr(/*const char *s, const char *wanted*/);
  720.     Xchar *strtok(/*char *s, const char *delim*/);
  721.     Xchar *memset(/*char *s, int ucharfill, int size*/);
  722.     Xint strlen(/*const char *s*/);
  723.     X
  724.     X/*
  725.     X * V7 and Berklix compatibility.
  726.     X */
  727.     Xchar *index(/*const char *s, int charwanted*/);
  728.     Xchar *rindex(/*const char *s, int charwanted*/);
  729.     Xint bcopy(/*const char *src, char *dst, int length*/);
  730.     Xint bcmp(/*const char *s1, const char *s2, int length*/);
  731.     Xint bzero(/*char *dst, int length*/);
  732.     X
  733.     X/*
  734.     X * Putting this in here is really silly, but who am I to argue with X3J11?
  735.     X */
  736.     Xchar *strerror(/*int errnum*/);
  737. SHAR_EOF
  738. if test 1431 -ne "`wc -c < 'string.h'`"
  739. then
  740.     echo shar: error transmitting "'string.h'" '(should have been 1431 characters)'
  741. fi
  742. fi # end of overwriting check
  743. echo shar: extracting "'getopt.c'" '(1161 characters)'
  744. if test -f 'getopt.c'
  745. then
  746.     echo shar: will not over-write existing file "'getopt.c'"
  747. else
  748. sed 's/^    X//' << \SHAR_EOF > 'getopt.c'
  749.     X/*LINTLIBRARY*/
  750.     X
  751.     X#ifdef BSD
  752.     X/* fix differences in string routine names */
  753.     X#define    strchr    index
  754.     X#endif
  755.     X
  756.     X#include    <stdio.h>
  757.     X#define ERR(s, c)    if(opterr){\
  758.     X    fputs(argv[0], stderr);\
  759.     X    fputs(s, stderr);\
  760.     X    fputc(c, stderr);\
  761.     X    fputc('\n', stderr);}
  762.     X
  763.     Xint    opterr = 1;
  764.     Xint    optind = 1;
  765.     Xint    optopt;
  766.     Xchar    *optarg;
  767.     Xchar    *strchr();
  768.     X
  769.     X
  770.     Xint
  771.     Xgetopt (argc, argv, opts)
  772.     Xchar **argv, *opts;
  773.     X{
  774.     X    static int sp = 1;
  775.     X    register c;
  776.     X    register char *cp;
  777.     X
  778.     X    if (sp == 1)
  779.     X        if (optind >= argc ||
  780.     X           argv[optind][0] != '-' || argv[optind][1] == '\0')
  781.     X            return EOF;
  782.     X        else if (strcmp(argv[optind], "--") == NULL) {
  783.     X            optind++;
  784.     X            return EOF;
  785.     X        }
  786.     X    optopt = c = argv[optind][sp];
  787.     X    if (c == ':' || (cp=strchr(opts, c)) == NULL) {
  788.     X        ERR (": illegal option -- ", c);
  789.     X        if (argv[optind][++sp] == '\0') {
  790.     X            optind++;
  791.     X            sp = 1;
  792.     X        }
  793.     X        return '?';
  794.     X    }
  795.     X    if (*++cp == ':') {
  796.     X        if (argv[optind][sp+1] != '\0')
  797.     X            optarg = &argv[optind++][sp+1];
  798.     X        else if (++optind >= argc) {
  799.     X            ERR (": option requires an argument -- ", c);
  800.     X            sp = 1;
  801.     X            return '?';
  802.     X        } else
  803.     X            optarg = argv[optind++];
  804.     X        sp = 1;
  805.     X    }
  806.     X    else {
  807.     X        if (argv[optind][++sp] == '\0') {
  808.     X            sp = 1;
  809.     X            optind++;
  810.     X        }
  811.     X        optarg=NULL;
  812.     X    }
  813.     X    return c;
  814.     X}
  815. SHAR_EOF
  816. if test 1161 -ne "`wc -c < 'getopt.c'`"
  817. then
  818.     echo shar: error transmitting "'getopt.c'" '(should have been 1161 characters)'
  819. fi
  820. fi # end of overwriting check
  821. echo shar: extracting "'strspn.c'" '(460 characters)'
  822. if test -f 'strspn.c'
  823. then
  824.     echo shar: will not over-write existing file "'strspn.c'"
  825. else
  826. sed 's/^    X//' << \SHAR_EOF > 'strspn.c'
  827.     X/*
  828.     X * strspn - find length of initial segment of s consisting entirely
  829.     X * of characters from accept
  830.     X */
  831.     X
  832.     XSIZET
  833.     Xstrspn(s, accept)
  834.     XCONST char *s;
  835.     XCONST char *accept;
  836.     X{
  837.     X    register CONST char *sscan;
  838.     X    register CONST char *ascan;
  839.     X    register SIZET count;
  840.     X
  841.     X    count = 0;
  842.     X    for (sscan = s; *sscan != '\0'; sscan++) {
  843.     X        for (ascan = accept; *ascan != '\0'; ascan++)
  844.     X            if (*sscan == *ascan)
  845.     X                break;
  846.     X        if (*ascan == '\0')
  847.     X            return(count);
  848.     X        count++;
  849.     X    }
  850.     X    return(count);
  851.     X}
  852. SHAR_EOF
  853. if test 460 -ne "`wc -c < 'strspn.c'`"
  854. then
  855.     echo shar: error transmitting "'strspn.c'" '(should have been 460 characters)'
  856. fi
  857. fi # end of overwriting check
  858. echo shar: extracting "'strtok.c'" '(1103 characters)'
  859. if test -f 'strtok.c'
  860. then
  861.     echo shar: will not over-write existing file "'strtok.c'"
  862. else
  863. sed 's/^    X//' << \SHAR_EOF > 'strtok.c'
  864.     X/*
  865.     X * Get next token from string s (NULL on 2nd, 3rd, etc. calls),
  866.     X * where tokens are nonempty strings separated by runs of
  867.     X * chars from delim.  Writes NULs into s to end tokens.  delim need not
  868.     X * remain constant from call to call.
  869.     X */
  870.     X
  871.     X#define    NULL    0
  872.     X
  873.     Xstatic char *scanpoint = NULL;
  874.     X
  875.     Xchar *                /* NULL if no token left */
  876.     Xstrtok(s, delim)
  877.     Xchar *s;
  878.     Xregister CONST char *delim;
  879.     X{
  880.     X    register char *scan;
  881.     X    char *tok;
  882.     X    register CONST char *dscan;
  883.     X
  884.     X    if (s == NULL && scanpoint == NULL)
  885.     X        return(NULL);
  886.     X    if (s != NULL)
  887.     X        scan = s;
  888.     X    else
  889.     X        scan = scanpoint;
  890.     X
  891.     X    /*
  892.     X     * Scan leading delimiters.
  893.     X     */
  894.     X    for (; *scan != '\0'; scan++) {
  895.     X        for (dscan = delim; *dscan != '\0'; dscan++)
  896.     X            if (*scan == *dscan)
  897.     X                break;
  898.     X        if (*dscan == '\0')
  899.     X            break;
  900.     X    }
  901.     X    if (*scan == '\0') {
  902.     X        scanpoint = NULL;
  903.     X        return(NULL);
  904.     X    }
  905.     X
  906.     X    tok = scan;
  907.     X
  908.     X    /*
  909.     X     * Scan token.
  910.     X     */
  911.     X    for (; *scan != '\0'; scan++) {
  912.     X        for (dscan = delim; *dscan != '\0';)    /* ++ moved down. */
  913.     X            if (*scan == *dscan++) {
  914.     X                scanpoint = scan+1;
  915.     X                *scan = '\0';
  916.     X                return(tok);
  917.     X            }
  918.     X    }
  919.     X
  920.     X    /*
  921.     X     * Reached end of string.
  922.     X     */
  923.     X    scanpoint = NULL;
  924.     X    return(tok);
  925.     X}
  926. SHAR_EOF
  927. if test 1103 -ne "`wc -c < 'strtok.c'`"
  928. then
  929.     echo shar: error transmitting "'strtok.c'" '(should have been 1103 characters)'
  930. fi
  931. fi # end of overwriting check
  932. echo shar: extracting "'Makefile'" '(906 characters)'
  933. if test -f 'Makefile'
  934. then
  935.     echo shar: will not over-write existing file "'Makefile'"
  936. else
  937. sed 's/^    X//' << \SHAR_EOF > 'Makefile'
  938.     X# @(#)Makefile    1.6
  939.     X# modified: Tue Sep 30 15:41:23 EET 1986, by kvvax6!pete
  940.     X#   include Henry Spencers public domain string handling
  941.     X# modified: Mon Jul  1 08:43:55 GMT+1:00 1985, by KVVAX6!pete
  942.     X#   actually I didn't modify the makefile, but I should note
  943.     X#   somewhere that the version of getopt is now the public domain
  944.     X#   one from the network, not the system V version
  945.     X# created : Mon Jul  2 13:53:50 CET 1984, by pete @ Olivetti HQ Milan
  946.     X
  947.     X# for System V:
  948.     X# CFLAGS = -Dindex=strchr -O $(CONF) -DUNIXERR -I.
  949.     X
  950.     XSIZET = int
  951.     XVOIDSTAR = char *
  952.     XCONST = 
  953.     XCONF = -DSIZET=$(SIZET) -DVOIDSTAR='$(VOIDSTAR)' -DCONST='$(CONST)'
  954.     X
  955.     XCFLAGS = -DBSD -O $(CONF) -DBERKERR -I.
  956.     X
  957.     XOBJS = wp.o 
  958.     XUTIL = getopt.o strspn.o strtok.o 
  959.     XUTILSRC = string.h getopt.c strspn.c strtok.c 
  960.     X
  961.     Xwp: $(OBJS) $(UTIL)
  962.     X    $(CC) $(OBJS) $(UTIL) -o wp
  963.     X
  964.     Xman:
  965.     X    @nroff -man wp.1
  966.     X
  967.     Xclean:
  968.     X    rm -f *.o wp
  969.     X
  970.     Xshar:
  971.     X    @shar -a README wp.1 wp.c $(UTILSRC) Makefile
  972. SHAR_EOF
  973. if test 906 -ne "`wc -c < 'Makefile'`"
  974. then
  975.     echo shar: error transmitting "'Makefile'" '(should have been 906 characters)'
  976. fi
  977. fi # end of overwriting check
  978. #    End of shell archive
  979. exit 0
  980. -- 
  981. Pete Story          {decvax,philabs}!mcvax!kvport!kvvax4!pete
  982. A/S Kongsberg Vaapenfabrikk, PO Box 25, N3601 Kongsberg, Norway
  983. Tel:  + 47 3 739480   Tlx:  71491 vaapn n
  984.  
  985.  
  986.