make cshputchar a macro; some reformatting
[unix-history] / usr / src / bin / csh / char.h
index 7f385c3..b950f8c 100644 (file)
@@ -3,34 +3,48 @@
  * All rights reserved.  The Berkeley Software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley Software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)char.h      5.3 (Berkeley) %G%
- */
-
-/*
- * Table for spotting special characters quickly
- *
- * Makes for very obscure but efficient coding.
+ *     @(#)char.h      5.4 (Berkeley) %G%
  */
 
 extern unsigned short _cmap[];
 
  */
 
 extern unsigned short _cmap[];
 
-#define _Q     0x01            /* '" */
-#define _Q1    0x02            /* ` */
-#define _SP    0x04            /* space and tab */
-#define _NL    0x08            /* \n */
-#define _META  0x10            /* lex meta characters, sp #'`";&<>()|\t\n */
-#define _GLOB  0x20            /* glob characters, *?{[` */
-#define _ESC   0x40            /* \ */
-#define _DOL   0x80            /* $ */
-#define _DIG   0x100           /* 0-9 */
-#define _LET   0x200           /* a-z, A-Z, _ */
+#define        _Q      0x001           /* '" */
+#define        _Q1     0x002           /* ` */
+#define        _SP     0x004           /* space and tab */
+#define        _NL     0x008           /* \n */
+#define        _META   0x010           /* lex meta characters, sp #'`";&<>()|\t\n */
+#define        _GLOB   0x020           /* glob characters, *?{[` */
+#define        _ESC    0x040           /* \ */
+#define        _DOL    0x080           /* $ */
+#define        _DIG    0x100           /* 0-9 */
+#define        _LET    0x200           /* a-z, A-Z, _ */
+
+#define        cmap(c, bits)   (_cmap[(unsigned char)(c)] & (bits))
+
+#define        isglob(c)       cmap(c, _GLOB)
+#define        isspace(c)      cmap(c, _SP)
+#define        isspnl(c)       cmap(c, _SP|_NL)
+#define        ismeta(c)       cmap(c, _META)
+#define        digit(c)        cmap(c, _DIG)
+#define        letter(c)       cmap(c, _LET)
+#define        alnum(c)        (digit(c) || letter(c))
 
 
-#define cmap(c, bits)  (_cmap[(unsigned char)(c)] & (bits))
+#define        LINELEN         128
+extern char *linp, linbuf[LINELEN];
 
 
-#define isglob(c)      cmap(c, _GLOB)
-#define isspace(c)     cmap(c, _SP)
-#define isspnl(c)      cmap(c, _SP|_NL)
-#define ismeta(c)      cmap(c, _META)
-#define digit(c)       cmap(c, _DIG)
-#define letter(c)      cmap(c, _LET)
-#define alnum(c)       (digit(c) || letter(c))
+#define        CSHPUTCHAR { \
+       if (!(ch&QUOTE) && (ch == 0177 || ch < ' ' && ch != '\t' && \
+           ch != '\n')) { \
+               *linp++ = '^'; \
+               if (ch == 0177) \
+                       ch = '?'; \
+               else \
+                       ch |= 'A' - 1; \
+               if (linp >= &linbuf[sizeof linbuf - 2]) \
+                       flush(); \
+       } \
+       ch &= TRIM; \
+       *linp++ = ch; \
+       if (ch == '\n' || linp >= &linbuf[sizeof(linbuf) - 2]) \
+               flush(); \
+}