sources-request@mirror.UUCP (03/02/87)
Submitted by: Bob Larson <seismo!usc-oberon!blarson> Mod.sources: Volume 8, Issue 93 Archive-name: tabs Here's a fairly simple program to convert tab stops, delete trailing spaces, optimize spaces, etc. It's probably not to hard to convice one (or more) standard unix utilities into doing this, but I wrote it for a non-unix system (Os9/68k). Probably the least portable thing about it is it expects input on stdin, and outputs to stdout. (I've only tested it on Os9/68k and 4.3 bsd.) Sorry I don't have a man page for it, but I havn't bothered to learn *roff yet. The comment block in the begining contains the nessisary information. [ I wrote the manpage, based on the comments, and the Makefile. There are Unix programs to do this, but not public-domain and this is useful. --r$ ] #! /bin/sh # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # If all goes well, you will see the message "End of shell archive." # Contents: Makefile tabs.1 tabs.c PATH=/bin:/usr/bin:/usr/ucb; export PATH echo shar: extracting "'Makefile'" '(197 characters)' if test -f 'Makefile' ; then echo shar: will not over-write existing file "'Makefile'" else sed 's/^X//' >Makefile <<'@//E*O*F Makefile//' Xtabs: tabs.c X $(CC) $(CFLAGS) -o tabs tabs.c X X# Edit appropriately XDESTDI = /usr/local/bin XMANDIR = /usr/man/man1 XMANDEST = tabs.1 Xinstall: tabs X cp tabs $(DESTDIR) X cp tabs.1 $(MANDIR)/$(MANDEST) @//E*O*F Makefile// if test 197 -ne "`wc -c <'Makefile'`"; then echo shar: error transmitting "'Makefile'" '(should have been 197 characters)' fi fi # end of overwriting check echo shar: extracting "'tabs.1'" '(1437 characters)' if test -f 'tabs.1' ; then echo shar: will not over-write existing file "'tabs.1'" else sed 's/^X//' >tabs.1 <<'@//E*O*F tabs.1//' X.TH TABS 1 LOCAL X.SH NAME Xtabs \- canonicalize spaces and tabs X.SH SYNOPSIS Xtabs X[ X.BI \-i NN X] [ X.BI \-o NN X] [ X.B \-t X] <input >output X.SH DESCRIPTION XThis program can be used to: X.RS X.nf Xconvert from one tab size to another Xoptimize spacing/tabbing to a minimum number of characters Xreplace tabs with spaces Xreplace spaces with tabs Xdelete trailing spaces/tabs on lines X.fi X.RE X.PP XIt is designed to be used as a filter, reading standard input and writing Xto standard output. X.PP X.I Tabs Xaccepts the following options: X.IP "\-iNN" XTabs on the input file are set every NN (default eight) spaces. XIf NN is 0 or omitted, input tabs are not treated as special characters; Xthis is probably only useful with the options ``-o0 and -t''. X.IP "\-oNN" XTabs on the output file are set every NN (default eight) spaces. XIf NN is 0 or omitted, tabs are not used in the output file. X.IP "\-t" XSuppress trailing spaces/tabs from output lines. X.PP XOptions may be specified separately or together. Spaces are not allowed Xbetween the i or o option and the number following. XThis program will always eliminate redundant spacing. If this is all Xthat is desired, set the input and output tab size identically. X.SH "EXAMPLES" X tabs -i8 -o8 <infile >outfile X.br XOptimize out extra spaces, normal tab stops. X.PP X tabs -i4t <infile >outfile X.br XConvert from Microware's silly four-character tabs to normal Xeight-character tabs and eliminate trailing spaces. @//E*O*F tabs.1// if test 1437 -ne "`wc -c <'tabs.1'`"; then echo shar: error transmitting "'tabs.1'" '(should have been 1437 characters)' fi fi # end of overwriting check echo shar: extracting "'tabs.c'" '(1711 characters)' if test -f 'tabs.c' ; then echo shar: will not over-write existing file "'tabs.c'" else sed 's/^X//' >tabs.c <<'@//E*O*F tabs.c//' X/* tabs.c by Robert A. Larson X */ X X#include <stdio.h> X#define inchar() getc(stdin) X#define outchar(c) putc(c, stdout) X#define TRUE 1 X#define FALSE 0 X Xstatic unsigned otab = 8; Xstatic unsigned lpos = 0; Xstatic unsigned nsp = 0; X Xoutspace() { X register int i; X if(otab) { X while(nsp>1 && nsp >= (i=otab-(lpos%otab))) { X outchar('\t'); X nsp -= i; X lpos += i; X } X } X lpos += nsp; X while(nsp--) outchar(' '); X nsp = 0; X} X Xmain(argc,argv) Xint argc; Xregister char **argv; X{ X register int c; X register unsigned itab = 8; X register int trailsup = FALSE; X X while(--argc) { X switch(**++argv) { X case '-': X for(;;) { X switch(*++*argv) { X case '\0': goto nextarg; X case 'i': X itab = 0; X while((c = *++*argv)>='0' && c<='9') { X itab *= 10; X itab += c - '0'; X } X (*argv)--; X break; X case 'o': X otab = 0; X while((c = *++*argv)>='0' && c<='9') { X otab *= 10; X otab += c - '0'; X } X (*argv)--; X break; X case 't': X trailsup = TRUE; X break; X default: X fprintf(stderr, "Unknown switch: %c\n", **argv); X exit(1); X } X } Xnextarg: break; X default: X fprintf(stderr, "Illegal agument: %s\n", *argv); X exit(1); X } X } X for(;;){ X switch(c = inchar()){ X case -1: X if(nsp && !trailsup) outspace(); /* in case the file ends in space */ X exit(0); X case ' ': X nsp++; X break; X case '\t': X if(itab) nsp += itab - ((lpos+nsp)%itab); X else { X if(nsp) outspace(); X outchar(c); X lpos++; X } X break; X case '\n': X if(nsp && !trailsup) outspace(); X outchar(c); X lpos = nsp = 0; X break; X default: X if(nsp) outspace(); X outchar(c); X lpos++; X break; X } X } X} @//E*O*F tabs.c// if test 1711 -ne "`wc -c <'tabs.c'`"; then echo shar: error transmitting "'tabs.c'" '(should have been 1711 characters)' fi fi # end of overwriting check echo shar: "End of shell archive." exit 0