BSD 2 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Wed, 9 May 1979 07:09:11 +0000 (23:09 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Wed, 9 May 1979 07:09:11 +0000 (23:09 -0800)
Work on file src/expand.c

Synthesized-from: 2bsd

src/expand.c [new file with mode: 0644]

diff --git a/src/expand.c b/src/expand.c
new file mode 100644 (file)
index 0000000..f236ee5
--- /dev/null
@@ -0,0 +1,112 @@
+/* Copyright (c) 1979 Regents of the University of California */
+#include <stdio.h>
+/*
+ * expand - expand tabs to equivalent spaces
+ */
+char   obuf[BUFSIZ];
+int    nstops;
+int    tabstops[100];
+
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       register int c, column;
+       register int n;
+
+       setbuf(stdout, obuf);
+       argc--, argv++;
+       do {
+               while (argc > 0 && argv[0][0] == '-') {
+                       getstops(argv[0]);
+                       argc--, argv++;
+               }
+               if (argc > 0) {
+                       if (freopen(argv[0], "r", stdin) == NULL) {
+                               perror(argv[0]);
+                               exit(1);
+                       }
+                       argc--, argv++;
+               }
+               column = 0;
+               for (;;) {
+                       c = getc(stdin);
+                       if (c == -1)
+                               break;
+                       switch (c) {
+
+                       case '\t':
+                               if (nstops == 0) {
+                                       do {
+                                               putchar(' ');
+                                               column++;
+                                       } while (column & 07);
+                                       continue;
+                               }
+                               if (nstops == 1) {
+                                       do {
+                                               putchar(' ');
+                                               column++;
+                                       } while (((column - 1) % tabstops[0]) != (tabstops[0] - 1));
+                                       continue;
+                               }
+                               for (n = 0; n < nstops; n++)
+                                       if (tabstops[n] > column)
+                                               break;
+                               if (n == nstops) {
+                                       putchar(' ');
+                                       column++;
+                                       continue;
+                               }
+                               while (column < tabstops[n]) {
+                                       putchar(' ');
+                                       column++;
+                               }
+                               continue;
+
+                       case '\b':
+                               if (column)
+                                       column--;
+                               putchar('\b');
+                               continue;
+
+                       default:
+                               putchar(c);
+                               column++;
+                               continue;
+
+                       case '\n':
+                               putchar(c);
+                               column = 0;
+                               continue;
+                       }
+               }
+       } while (argc > 0);
+       exit(0);
+}
+
+getstops(cp)
+       register char *cp;
+{
+       register int i;
+
+       nstops = 0;
+       cp++;
+       for (;;) {
+               i = 0;
+               while (*cp >= '0' && *cp <= '9')
+                       i = i * 10 + *cp++ - '0';
+               if (i <= 0 || i > 256) {
+bad:
+                       fprintf(stderr, "Bad tab stop spec\n");
+                       exit(1);
+               }
+               if (nstops > 0 && i <= tabstops[nstops])
+                       goto bad;
+               tabstops[nstops++] = i;
+               if (*cp == 0)
+                       break;
+               if (*cp++ != ',')
+                       goto bad;
+       }
+}