WordStar-like reformat for vi
Theo Pozzy/R. Green
cmi at dartvax.UUCP
Wed Nov 6 02:03:47 AEST 1985
Here is the source for the "WordStar" style reformating filter
printed in the November, 1985 issue of Unix/World magazine. It
simulates the ^B command available in the popular WordStar (tm Micropro)
editor. It is used to reformat the lines in a paragraph of text
so that no line is longer than 70 characters, and short lines
are joined where possible.
To compile it, simply "cc" it:
cc -O -o rf rf.c
I have renamed it from "reform" to "rf" to reduce the number
of keystrokes necessary to invoke it from vi, although if you
define a "map" for it, that won't matter. To invoke it, simply
position your cursor at the start of the paragraph you want to
reformat, and type:
!}rf
For more information, see the magazine article.
Theo Pozzy
...!decvax!dartvax!cmi (USENET)
cmi at dartmouth (CSNET)
---------------------------- cut here ---------------------------------------
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# rf.c
sed 's/^X//' << 'SHAR_EOF' > rf.c
X/*
X * rf.c - a "WordStar"-like paragraph reformatter for vi. From the
X * "Wizard's Grabbag" article (Dr. Rebecca Thomas) in the Nov. '85
X * issue of Unix/World.
X *
X */
X
X#include <stdio.h>
X#define YES 1
X#define NO 0
X#define LINELENGTH 70
X
Xmain()
X{
X
Xint endchar; /* does this word end a sentence? */
Xint getword(); /* get next word on stdin */
Xint length; /* length of word read by getword */
Xint count = 0; /* number of characters on line so far */
Xchar word[81]; /* word read from stdin */
X
Xwhile ((endchar = getword(word)) != EOF) {
X count += length = strlen(word);
X if (count > LINELENGTH) { /* split the line here */
X putchar('\n');
X count = length; /* beginning count for next line */
X printf("%s ", word);
X if (endchar == YES)
X putchar(' '); /* end of sentence space */
X }
X else if (endchar == YES) {
X printf("%s ", word); /* extra space */
X count++; /* and account for it */
X }
X else
X printf("%s ", word);
X count++; /* to account for the extra space */
X}
X
Xif (strlen(word) > 0)
X printf("%s", word); /* print any left over word */
Xputchar('\n');
Xexit(0);
X
X}
X
Xint getword(word)
Xchar *word; /* storage for word read */
X{
Xchar c;
Xint endflag = NO; /* does this word end a sentence? */
Xint beginflag = YES; /* is this the beginning of new word? */
X
Xwhile((c = getchar()) != EOF) {
X switch(c) {
X case '.':
X case '!': /* end of sentence characters */
X case '?':
X endflag = YES;
X *word++ = c;
X break;
X case ' ':
X case '\t': /* word delimiters - white space */
X case '\n':
X if (beginflag == YES)
X continue; /* skip leading white space */
X *word = '\0'; /* terminate word */
X return(endflag); /* non-EOF return */
X default: /* just another character */
X endflag = NO;
X *word++ = c;
X }
X beginflag = NO; /* no longer at beginning of word */
X}
X
X*word = '\0'; /* terminate the word */
Xreturn(EOF);
X
X}
SHAR_EOF
exit
More information about the Comp.sources.unix
mailing list