home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume1 / 8707 / 61 < prev    next >
Internet Message Format  |  1990-07-13  |  7KB

  1. From: amos@nsta.UUCP (Amos Shapir)
  2. Newsgroups: comp.sources.misc
  3. Subject: Simple Text Formatter
  4. Message-ID: <3291@ncoast.UUCP>
  5. Date: 23 Jul 87 23:55:31 GMT
  6. Sender: allbery@ncoast.UUCP
  7. Organization: National Semiconductor (Israel) Ltd. Home of the 32532
  8. Lines: 317
  9. Approved: allbery@ncoast.UUCP
  10. Summary: May the Source be with you, always...
  11. X-Archive: comp.sources.misc/8707/61
  12.  
  13. (I posted this just before the Great Renaming, and never so it coming
  14. back; if you saw this already please ignore).
  15.  
  16.                     Have    you    ever
  17.                  wished  you had  something
  18.               to  replace   nroff?  Something
  19.             small, fast  and versatile,  yet at
  20.            the same time  flexible and powerful?
  21.           Well, your troubles  are over. 'Adj' is
  22.           not  as powerful  as nroff  or TeX,  but
  23.           it's ok for small portions of text, (and
  24.           much  more  useful than  4BSD's  'fmt').
  25.           Combined  with  the  trivial  centering
  26.            filter 'ctr',  it can do  fancy stuff
  27.             like  this  text.   This  text  was
  28.                   produced by the command:
  29.                               
  30. adj -w 19,26,31,35,37,39,40,40,40,39,37,35,31,26,19 | ctr -w 60
  31.  
  32.         o /        o /        o /        o /
  33. -----------------X---------------X---------------X---------------X----
  34.         o \        o \        o \        o \
  35.  
  36. #!/bin/sh
  37. : "This is a shell archive, meaning:                              "
  38. : "1. Remove everything above the #! /bin/sh line.                "
  39. : "2. Save the rest in a file.                                    "
  40. : "3. Execute the file with /bin/sh (not csh) to create the files:"
  41. : "    adj.6"
  42. : "    adj.c"
  43. : "    ctr.6"
  44. : "    ctr.c"
  45. : "This archive created:  Thu Mar 19 12:31:56 EET 1987 "
  46. if [ -f adj.6 ]
  47. then
  48. echo file adj.6 exists
  49. else
  50. echo extracting file: adj.6
  51. sed 's/^X//' >adj.6 << 'END-of-adj.6'
  52. X.TH ADJ 6 Local
  53. X.UC 4
  54. X.SH NAME
  55. Xadj \- fill and adjust text lines
  56. X.SH SYNOPSIS
  57. X.B adj
  58. X[
  59. X.B \-h
  60. X] [
  61. X.B \-n
  62. X] [
  63. X.B \-p
  64. X] [
  65. X.B \-w
  66. X.I n1,...
  67. X] [ file ]
  68. X.SH DESCRIPTION
  69. X.I Adj
  70. Xcopies the given file (standard input if none is given) to the standard output,
  71. Xfilling lines and adjusting the right margin. Indentation and empty lines
  72. Xare preserved.
  73. X.PP
  74. XNormally, words (uninterrupted sequences of non-blank characters) are not
  75. Xbroken, unless the
  76. X.B \-h
  77. X(hyphen) flag is given.
  78. X.PP
  79. XThe
  80. X.B \-n
  81. X(no adjust) prevents
  82. X.I adj
  83. Xfrom adjusting the right margin.
  84. X.PP
  85. XIf the 
  86. X.B \-p
  87. X(paragraph) option is specified, indentation is preserved only on
  88. Xthe first line of a paragraph, assuming paragraphs are separated by empty lines.
  89. X.PP
  90. XThe
  91. X.B \-w
  92. X.I n
  93. X(width) option sets the line width to
  94. X.I n
  95. X(default 65).
  96. XWhen given as
  97. X.B \-w
  98. X.I n1,n2,...
  99. X(a comma-separated sequence of numbers) the output lines will be
  100. X.I "n1, n2"
  101. Xetc. characters long, respectively.
  102. XWhen the sequence is exhausted, it is restarted.
  103. X.SH "SEE ALSO"
  104. Xctr(6)
  105. X.SH BUGS
  106. X.B \-n
  107. Xdoes not break words intelligently.
  108. X.PP
  109. XChange of indentation is done ungracefully.
  110. X.PP
  111. XThere's probably a better way tp specify line lengths.
  112. END-of-adj.6
  113. fi
  114. if [ -f adj.c ]
  115. then
  116. echo file adj.c exists
  117. else
  118. echo extracting file: adj.c
  119. sed 's/^X//' >adj.c << 'END-of-adj.c'
  120. X/*
  121. X * Trivial line-fill filter
  122. X * white space at col 1 and empty lines
  123. X * are preserved.
  124. X * flags: -n - dont adjust right margin
  125. X *      -w {n} line is {n} chars wide
  126. X *      -w {n1,n2,...} line is cyclically n1, n2... chars wide
  127. X *      -h - break words with a hyphen
  128. X *      -p - indent only 1st line of a paragraph
  129. X */
  130. X#define MAXB 1024
  131. X#define MAXW 100    /* words in a line */
  132. X#define NLL  50        /* line lengths vector size */
  133. X#define EOF (-1)
  134. X/* flags */
  135. X#define NOADJ 01    /* no adjust */
  136. X#define HYPHN 02    /* hyphenate */
  137. X#define PARAG 04    /* indent 1 line */
  138. Xint ll[NLL] = { 65 };    /* line lengths */
  139. Xint nll;        /* current line length index */
  140. Xint nw;        /* current no. of words */
  141. Xint ind;    /* current indentation */
  142. Xstatic char buf[MAXB];
  143. Xmain(argc, argv)
  144. X    char **argv;
  145. X{
  146. X    register char *pb, *pw, *pe;
  147. X    register c, flags, nl;
  148. X
  149. X    while(--argc > 0)
  150. X        if(**++argv == '-')
  151. X            switch(argv[0][1]) {
  152. X            case 'n':
  153. X                flags = NOADJ;
  154. X                break;
  155. X            case 'h':
  156. X                flags = HYPHN;
  157. X                break;
  158. X            case 'p':
  159. X                flags |= PARAG;
  160. X                break;
  161. X            case 'w':
  162. X                --argc;
  163. X                pb = *++argv;
  164. X                nl=0;
  165. X                do {
  166. X                    for(ll[nl]=0; *pb>='0' && *pb<='9'; pb++)
  167. X                        ll[nl] = ll[nl]*10+*pb-'0';
  168. X                    nl++;
  169. X                }while(*pb++);
  170. X            }
  171. X        else {
  172. X            close(0);
  173. X            open(*argv, 0, 0);
  174. X        }
  175. X    nl = 2;
  176. X    pb = pw = buf-1;
  177. X    while((c = getchar()) != EOF) {
  178. X        if(c==' ' || c=='\t' || c=='\n') {
  179. X            if(pb>=buf && *pb!=' ') {
  180. X                *++pb = ' ';
  181. X                nw++;
  182. X                pw = pb;    /* word marker in buf */
  183. X            }
  184. X            if(c == '\n') {
  185. X                if(++nl > 1) {
  186. X                    if(nw > 0) {
  187. X                        putline(pb, NOADJ);
  188. X                        pb = pw = buf-1;
  189. X                        nw = 0;
  190. X                    }
  191. X                    putchar('\n');
  192. X                    ind = 0;
  193. X                }
  194. X            } else if(nl > 1) {
  195. X                if(c == '\t')
  196. X                    ind = (ind/8+1)*8;
  197. X                else
  198. X                    ind++;
  199. X            }
  200. X        } else if(c>' ' && c<0177) {
  201. X            *++pb = c;
  202. X            if(nl) {
  203. X                nl = 0;
  204. X                pe = &buf[ll[nll]-ind];
  205. X            }
  206. X        }
  207. X        if(pb == pe) {    /* line overflow */
  208. X            if((flags&HYPHN) && pb-pw>2) {    /* insert hyphen */
  209. X                *++pb = pe[-1];
  210. X                pe[-1] = '-';
  211. X                *++pb = c;
  212. X                pw = pe;
  213. X                nw++;
  214. X            } else if(nw == 0) {    /* insert blank */
  215. X                *++pb = c;
  216. X                pw = pe;
  217. X                nw++;
  218. X            }
  219. X            putline(pw, flags);
  220. X            for(pe=buf, ++pw; pw<=pb; )
  221. X                *pe++ = *pw++;
  222. X            pb = pe-1;
  223. X            pw = buf-1;
  224. X            pe = &buf[ll[nll]-ind];
  225. X            nw = 0;
  226. X        }
  227. X    }
  228. X    if(nw > 0)
  229. X        putline(pb, NOADJ);
  230. X    return(0);
  231. X}
  232. X
  233. X/*
  234. X * adjust & print line
  235. X */
  236. Xputline(pw, flags)
  237. X    register char *pw;
  238. X{
  239. X    register char *pb;
  240. X    register i, n, b, m;
  241. X
  242. X    for(i=ind; i>=8; i-=8)
  243. X        putchar('\t');
  244. X    for(; i>0; i--)
  245. X        putchar(' ');
  246. X    n = nw-1;
  247. X    b = buf+ll[nll]-ind-pw;    /* no. of blanks to distribute */
  248. X    m = n/2;
  249. X    for(pb=buf; pb<pw; pb++) {
  250. X        putchar(*pb);
  251. X        if(!(flags&NOADJ) && *pb==' ') {
  252. X            m += b;
  253. X            for(i=m/n; i>0; i--)
  254. X                putchar(' ');
  255. X            m %= n;
  256. X        }
  257. X    }
  258. X    putchar('\n');
  259. X    /* cyclic increment line lengths vector */
  260. X    if(ll[++nll] == 0)
  261. X        nll = 0;
  262. X    if(flags&PARAG)
  263. X        ind = 0;
  264. X}
  265. END-of-adj.c
  266. fi
  267. if [ -f ctr.6 ]
  268. then
  269. echo file ctr.6 exists
  270. else
  271. echo extracting file: ctr.6
  272. sed 's/^X//' >ctr.6 << 'END-of-ctr.6'
  273. X.TH CTR 6 Local
  274. X.UC 4
  275. X.SH NAME
  276. Xctr \- center text lines
  277. X.SH SYNOPSIS
  278. X.B ctr
  279. X[
  280. X.B \-w
  281. X.I n
  282. X]
  283. X.SH DESCRIPTION
  284. X.I Ctr
  285. Xcopies its standard input to its standard output,
  286. Xcentering text in the output lines.
  287. X.PP
  288. XThe
  289. X.B \-w
  290. X.I n
  291. X(width) option sets the output line width to
  292. X.I n
  293. X(default 65).
  294. X.SH "SEE ALSO"
  295. Xadj(6)
  296. X.SH BUGS
  297. END-of-ctr.6
  298. fi
  299. if [ -f ctr.c ]
  300. then
  301. echo file ctr.c exists
  302. else
  303. echo extracting file: ctr.c
  304. sed 's/^X//' >ctr.c << 'END-of-ctr.c'
  305. X#define NULL ((char *)0)
  306. Xmain(argc, argv)
  307. X    char **argv;
  308. X{
  309. X    static int ll = 65;    /* line length */
  310. X    static buf[100];
  311. X
  312. X    if(argc > 1 && **++argv == '-' && argv[0][1] == 'w')
  313. X            ll = atoi(*++argv);
  314. X    while(gets(buf) != NULL)
  315. X        printf("%*s%s\n", (ll-strlen(buf))/2, "", buf);
  316. X}
  317. END-of-ctr.c
  318. fi
  319. exit 0
  320.  
  321.         o /        o /        o /        o /
  322. -----------------X---------------X---------------X---------------X----
  323.         o \        o \        o \        o \
  324. -- 
  325.     Amos Shapir            (My other cpu is a NS32532)
  326. National Semiconductor (Israel)
  327. 6 Maskit st. P.O.B. 3007, Herzlia 46104, Israel  Tel. (972)52-522261
  328. amos%nsta@nsc.com @{hplabs,pyramid,sun,decwrl} 34 48 E / 32 10 N
  329.