]> pd.if.org Git - pd_readline/blobdiff - mg/cinfo.c
Added mg from an OpenBSD mirror site. Many thanks to the OpenBSD team and the mg...
[pd_readline] / mg / cinfo.c
diff --git a/mg/cinfo.c b/mg/cinfo.c
new file mode 100644 (file)
index 0000000..f568897
--- /dev/null
@@ -0,0 +1,154 @@
+/*     $OpenBSD: cinfo.c,v 1.16 2011/11/28 04:41:39 lum Exp $  */
+
+/* This file is in the public domain. */
+
+/*
+ *             Character class tables.
+ * Do it yourself character classification
+ * macros, that understand the multinational character set,
+ * and let me ask some questions the standard macros (in
+ * ctype.h) don't let you ask.
+ */
+#include       "def.h"
+
+/*
+ * This table, indexed by a character drawn
+ * from the 256 member character set, is used by my
+ * own character type macros to answer questions about the
+ * type of a character. It handles the full multinational
+ * character set, and lets me ask some questions that the
+ * standard "ctype" macros cannot ask.
+ */
+/*
+ * Due to incompatible behaviour between "standard" emacs and
+ * ctags word traversing, '_' character's value is changed on 
+ * the fly in ctags mode, hence non-const.
+ */
+char cinfo[256] = {
+       _MG_C, _MG_C, _MG_C, _MG_C,                                   /* 0x0X */
+       _MG_C, _MG_C, _MG_C, _MG_C,
+       _MG_C, _MG_C, _MG_C, _MG_C,
+       _MG_C, _MG_C, _MG_C, _MG_C,
+       _MG_C, _MG_C, _MG_C, _MG_C,                                   /* 0x1X */
+       _MG_C, _MG_C, _MG_C, _MG_C,
+       _MG_C, _MG_C, _MG_C, _MG_C,
+       _MG_C, _MG_C, _MG_C, _MG_C,
+       0, _MG_P, 0, 0,                                               /* 0x2X */
+       _MG_W, _MG_W, 0, _MG_W,
+       0, 0, 0, 0,
+       0, 0, _MG_P, 0,
+       _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,   /* 0x3X */
+       _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,
+       _MG_D | _MG_W, _MG_D | _MG_W, 0, 0,
+       0, 0, 0, _MG_P,
+       0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,               /* 0x4X */
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,   /* 0x5X */
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, 0,
+       0, 0, 0, 0,
+       0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,               /* 0x6X */
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,   /* 0x7X */
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, 0,
+       0, 0, 0, _MG_C,
+       0, 0, 0, 0,                                                   /* 0x8X */
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0, 0,                                                   /* 0x9X */
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0, 0,                                                   /* 0xAX */
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0, 0,                                                   /* 0xBX */
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,   /* 0xCX */
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,               /* 0xDX */
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
+       _MG_U | _MG_W, _MG_U | _MG_W, 0, _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,   /* 0xEX */
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,               /* 0xFX */
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
+       _MG_L | _MG_W, _MG_L | _MG_W, 0, 0
+};
+
+/*
+ * Find the name of a keystroke.  Needs to be changed to handle 8-bit printing
+ * characters and function keys better.         Returns a pointer to the terminating
+ * '\0'.  Returns NULL on failure.
+ */
+char *
+getkeyname(char *cp, size_t len, int k)
+{
+       const char      *np;
+       size_t           copied;
+
+       if (k < 0)
+               k = CHARMASK(k);        /* sign extended char */
+       switch (k) {
+       case CCHR('@'):
+               np = "C-SPC";
+               break;
+       case CCHR('I'):
+               np = "TAB";
+               break;
+       case CCHR('M'):
+               np = "RET";
+               break;
+       case CCHR('['):
+               np = "ESC";
+               break;
+       case ' ':
+               np = "SPC";
+               break;          /* yuck again */
+       case CCHR('?'):
+               np = "DEL";
+               break;
+       default:
+#ifdef FKEYS
+               if (k >= KFIRST && k <= KLAST &&
+                   (np = keystrings[k - KFIRST]) != NULL)
+                       break;
+#endif
+               if (k > CCHR('?')) {
+                       *cp++ = '0';
+                       *cp++ = ((k >> 6) & 7) + '0';
+                       *cp++ = ((k >> 3) & 7) + '0';
+                       *cp++ = (k & 7) + '0';
+                       *cp = '\0';
+                       return (cp);
+               } else if (k < ' ') {
+                       *cp++ = 'C';
+                       *cp++ = '-';
+                       k = CCHR(k);
+                       if (ISUPPER(k))
+                               k = TOLOWER(k);
+               }
+               *cp++ = k;
+               *cp = '\0';
+               return (cp);
+       }
+       copied = strlcpy(cp, np, len);
+       if (copied >= len)
+               copied = len - 1;
+       return (cp + copied);
+}