summaryrefslogtreecommitdiff
path: root/usr.bin/vim/digraph.c
diff options
context:
space:
mode:
authorJason Downs <downsj@cvs.openbsd.org>1996-09-07 21:40:33 +0000
committerJason Downs <downsj@cvs.openbsd.org>1996-09-07 21:40:33 +0000
commitc224fc199c25dd257673c273eb344786b9bf532c (patch)
tree8f8ed1297120c537480d9e5d46bfe7452bd8505b /usr.bin/vim/digraph.c
parentd0d91e2d3d6569e4defdd5178241f28fa678d753 (diff)
Initial import of vim 4.2.
This is meant to replace nvi in the tree. Vim, in general, works better, provides more features, and does not suffer from the license problems being imposed upon nvi. On the other hand, vim lacks a non-visual ex mode, in addition to open mode. This includes the GUI (X11) code, but doesn't try to compile it.
Diffstat (limited to 'usr.bin/vim/digraph.c')
-rw-r--r--usr.bin/vim/digraph.c552
1 files changed, 552 insertions, 0 deletions
diff --git a/usr.bin/vim/digraph.c b/usr.bin/vim/digraph.c
new file mode 100644
index 00000000000..957b793e1c5
--- /dev/null
+++ b/usr.bin/vim/digraph.c
@@ -0,0 +1,552 @@
+/* $OpenBSD: digraph.c,v 1.1 1996/09/07 21:40:26 downsj Exp $ */
+/* vi:set ts=4 sw=4:
+ *
+ * VIM - Vi IMproved by Bram Moolenaar
+ *
+ * Do ":help uganda" in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ */
+
+/*
+ * digraph.c: code for digraphs
+ */
+
+#include "vim.h"
+#include "globals.h"
+#include "proto.h"
+#include "option.h"
+
+#ifdef DIGRAPHS
+
+static int getexactdigraph __ARGS((int, int, int));
+static void printdigraph __ARGS((char_u *));
+
+static char_u (*digraphnew)[3]; /* pointer to added digraphs */
+static int digraphcount = 0; /* number of added digraphs */
+
+#if defined(MSDOS) || defined(WIN32) || defined(OS2)
+char_u digraphdefault[][3] = /* standard MSDOS digraphs */
+ {{'C', ',', 128}, /* ~@ (SAS C can't handle the real char) */
+ {'u', '"', 129}, /* */
+ {'e', '\'', 130}, /* */
+ {'a', '^', 131}, /* */
+ {'a', '"', 132}, /* */
+ {'a', '`', 133}, /* */
+ {'a', '@', 134}, /* */
+ {'c', ',', 135}, /* ~G (SAS C can't handle the real char) */
+ {'e', '^', 136}, /* ~H (SAS C can't handle the real char) */
+ {'e', '"', 137}, /* */
+ {'e', '`', 138}, /* */
+ {'i', '"', 139}, /* */
+ {'i', '^', 140}, /* */
+ {'i', '`', 141}, /* */
+ {'A', '"', 142}, /* */
+ {'A', '@', 143}, /* */
+ {'E', '\'', 144}, /* */
+ {'a', 'e', 145}, /* */
+ {'A', 'E', 146}, /* */
+ {'o', '^', 147}, /* */
+ {'o', '"', 148}, /* */
+ {'o', '`', 149}, /* */
+ {'u', '^', 150}, /* */
+ {'u', '`', 151}, /* */
+ {'y', '"', 152}, /* */
+ {'O', '"', 153}, /* */
+ {'U', '"', 154}, /* */
+ {'c', '|', 155}, /* */
+ {'$', '$', 156}, /* */
+ {'Y', '-', 157}, /* ~] (SAS C can't handle the real char) */
+ {'P', 't', 158}, /* */
+ {'f', 'f', 159}, /* */
+ {'a', '\'', 160}, /* */
+ {'i', '\'', 161}, /* */
+ {'o', '\'', 162}, /* */
+ {'u', '\'', 163}, /* xx (SAS C can't handle the real char) */
+ {'n', '~', 164}, /* */
+ {'N', '~', 165}, /* */
+ {'a', 'a', 166}, /* */
+ {'o', 'o', 167}, /* */
+ {'~', '?', 168}, /* */
+ {'-', 'a', 169}, /* */
+ {'a', '-', 170}, /* */
+ {'1', '2', 171}, /* */
+ {'1', '4', 172}, /* */
+ {'~', '!', 173}, /* */
+ {'<', '<', 174}, /* */
+ {'>', '>', 175}, /* */
+
+ {'s', 's', 225}, /* */
+ {'j', 'u', 230}, /* */
+ {'o', '/', 237}, /* */
+ {'+', '-', 241}, /* */
+ {'>', '=', 242}, /* */
+ {'<', '=', 243}, /* */
+ {':', '-', 246}, /* */
+ {'~', '~', 247}, /* */
+ {'~', 'o', 248}, /* */
+ {'2', '2', 253}, /* */
+ {NUL, NUL, NUL}
+ };
+
+#else /* !MSDOS && !WIN32 */
+# ifdef MINT
+char_u digraphdefault[][3] = /* standard ATARI digraphs */
+ {{'C', ',', 128}, /* ~@ */
+ {'u', '"', 129}, /* */
+ {'e', '\'', 130}, /* */
+ {'a', '^', 131}, /* */
+ {'a', '"', 132}, /* */
+ {'a', '`', 133}, /* */
+ {'a', '@', 134}, /* */
+ {'c', ',', 135}, /* ~G */
+ {'e', '^', 136}, /* ~H */
+ {'e', '"', 137}, /* */
+ {'e', '`', 138}, /* */
+ {'i', '"', 139}, /* */
+ {'i', '^', 140}, /* */
+ {'i', '`', 141}, /* */
+ {'A', '"', 142}, /* */
+ {'A', '@', 143}, /* */
+ {'E', '\'', 144}, /* */
+ {'a', 'e', 145}, /* */
+ {'A', 'E', 146}, /* */
+ {'o', '^', 147}, /* */
+ {'o', '"', 148}, /* */
+ {'o', '`', 149}, /* */
+ {'u', '^', 150}, /* */
+ {'u', '`', 151}, /* */
+ {'y', '"', 152}, /* */
+ {'O', '"', 153}, /* */
+ {'U', '"', 154}, /* */
+ {'c', '|', 155}, /* */
+ {'$', '$', 156}, /* */
+ {'Y', '-', 157}, /* ~] */
+ {'s', 's', 158}, /* */
+ {'f', 'f', 159}, /* */
+ {'a', '\'', 160}, /* */
+ {'i', '\'', 161}, /* */
+ {'o', '\'', 162}, /* */
+ {'u', '\'', 163}, /* */
+ {'n', '~', 164}, /* */
+ {'N', '~', 165}, /* */
+ {'a', 'a', 166}, /* */
+ {'o', 'o', 167}, /* */
+ {'~', '?', 168}, /* */
+ {'-', 'a', 169}, /* */
+ {'a', '-', 170}, /* */
+ {'1', '2', 171}, /* */
+ {'1', '4', 172}, /* */
+ {'~', '!', 173}, /* */
+ {'<', '<', 174}, /* */
+ {'>', '>', 175}, /* */
+ {'j', 'u', 230}, /* */
+ {'o', '/', 237}, /* */
+ {'+', '-', 241}, /* */
+ {'>', '=', 242}, /* */
+ {'<', '=', 243}, /* */
+ {':', '-', 246}, /* */
+ {'~', '~', 247}, /* */
+ {'~', 'o', 248}, /* */
+ {'2', '2', 253}, /* */
+ {NUL, NUL, NUL}
+ };
+
+# else /* !MINT */
+# ifdef _INCLUDE_HPUX_SOURCE
+
+char_u digraphdefault[][3] = /* default HPUX digraphs */
+ {{'A', '`', 161}, /* */
+ {'A', '^', 162}, /* */
+ {'E', '`', 163}, /* */
+ {'E', '^', 164}, /* */
+ {'E', '"', 165}, /* */
+ {'I', '^', 166}, /* */
+ {'I', '"', 167}, /* */
+ {'\'', '\'', 168}, /* */
+ {'`', '`', 169}, /* */
+ {'^', '^', 170}, /* */
+ {'"', '"', 171}, /* */
+ {'~', '~', 172}, /* */
+ {'U', '`', 173}, /* */
+ {'U', '^', 174}, /* */
+ {'L', '=', 175}, /* */
+ {'~', '_', 176}, /* */
+ {'Y', '\'', 177}, /* */
+ {'y', '\'', 178}, /* */
+ {'~', 'o', 179}, /* */
+ {'C', ',', 180}, /* */
+ {'c', ',', 181}, /* */
+ {'N', '~', 182}, /* */
+ {'n', '~', 183}, /* */
+ {'~', '!', 184}, /* */
+ {'~', '?', 185}, /* */
+ {'o', 'x', 186}, /* */
+ {'L', '-', 187}, /* */
+ {'Y', '=', 188}, /* */
+ {'p', 'p', 189}, /* */
+ {'f', 'l', 190}, /* */
+ {'c', '|', 191}, /* */
+ {'a', '^', 192}, /* */
+ {'e', '^', 193}, /* */
+ {'o', '^', 194}, /* */
+ {'u', '^', 195}, /* */
+ {'a', '\'', 196}, /* */
+ {'e', '\'', 197}, /* */
+ {'o', '\'', 198}, /* */
+ {'u', '\'', 199}, /* */
+ {'a', '`', 200}, /* */
+ {'e', '`', 201}, /* */
+ {'o', '`', 202}, /* */
+ {'u', '`', 203}, /* */
+ {'a', '"', 204}, /* */
+ {'e', '"', 205}, /* */
+ {'o', '"', 206}, /* */
+ {'u', '"', 207}, /* */
+ {'A', 'o', 208}, /* */
+ {'i', '^', 209}, /* */
+ {'O', '/', 210}, /* */
+ {'A', 'E', 211}, /* */
+ {'a', 'o', 212}, /* */
+ {'i', '\'', 213}, /* */
+ {'o', '/', 214}, /* */
+ {'a', 'e', 215}, /* */
+ {'A', '"', 216}, /* */
+ {'i', '`', 217}, /* */
+ {'O', '"', 218}, /* */
+ {'U', '"', 219}, /* */
+ {'E', '\'', 220}, /* */
+ {'i', '"', 221}, /* */
+ {'s', 's', 222}, /* */
+ {'O', '^', 223}, /* */
+ {'A', '\'', 224}, /* */
+ {'A', '~', 225}, /* */
+ {'a', '~', 226}, /* */
+ {'D', '-', 227}, /* */
+ {'d', '-', 228}, /* */
+ {'I', '\'', 229}, /* */
+ {'I', '`', 230}, /* */
+ {'O', '\'', 231}, /* */
+ {'O', '`', 232}, /* */
+ {'O', '~', 233}, /* */
+ {'o', '~', 234}, /* */
+ {'S', '~', 235}, /* */
+ {'s', '~', 236}, /* */
+ {'U', '\'', 237}, /* */
+ {'Y', '"', 238}, /* */
+ {'y', '"', 239}, /* */
+ {'p', '-', 240}, /* */
+ {'p', '~', 241}, /* */
+ {'~', '.', 242}, /* */
+ {'j', 'u', 243}, /* */
+ {'P', 'p', 244}, /* */
+ {'3', '4', 245}, /* */
+ {'-', '-', 246}, /* */
+ {'1', '4', 247}, /* */
+ {'1', '2', 248}, /* */
+ {'a', '_', 249}, /* */
+ {'o', '_', 250}, /* */
+ {'<', '<', 251}, /* */
+ {'x', 'x', 252}, /* */
+ {'>', '>', 253}, /* */
+ {'+', '-', 254}, /* */
+ {'n', 'u', 255}, /* (char excluded, is EOF on some systems */
+ {NUL, NUL, NUL}
+ };
+
+# else /* _INCLUDE_HPUX_SOURCE */
+
+char_u digraphdefault[][3] = /* standard ISO digraphs */
+ {{'~', '!', 161}, /* */
+ {'c', '|', 162}, /* */
+ {'$', '$', 163}, /* */
+ {'o', 'x', 164}, /* */
+ {'Y', '-', 165}, /* */
+ {'|', '|', 166}, /* */
+ {'p', 'a', 167}, /* */
+ {'"', '"', 168}, /* */
+ {'c', 'O', 169}, /* */
+ {'a', '-', 170}, /* */
+ {'<', '<', 171}, /* */
+ {'-', ',', 172}, /* */
+ {'-', '-', 173}, /* */
+ {'r', 'O', 174}, /* */
+ {'-', '=', 175}, /* */
+ {'~', 'o', 176}, /* */
+ {'+', '-', 177}, /* */
+ {'2', '2', 178}, /* */
+ {'3', '3', 179}, /* */
+ {'\'', '\'', 180}, /* */
+ {'j', 'u', 181}, /* */
+ {'p', 'p', 182}, /* */
+ {'~', '.', 183}, /* */
+ {',', ',', 184}, /* */
+ {'1', '1', 185}, /* */
+ {'o', '-', 186}, /* */
+ {'>', '>', 187}, /* */
+ {'1', '4', 188}, /* */
+ {'1', '2', 189}, /* */
+ {'3', '4', 190}, /* */
+ {'~', '?', 191}, /* */
+ {'A', '`', 192}, /* */
+ {'A', '\'', 193}, /* */
+ {'A', '^', 194}, /* */
+ {'A', '~', 195}, /* */
+ {'A', '"', 196}, /* */
+ {'A', '@', 197}, /* */
+ {'A', 'E', 198}, /* */
+ {'C', ',', 199}, /* */
+ {'E', '`', 200}, /* */
+ {'E', '\'', 201}, /* */
+ {'E', '^', 202}, /* */
+ {'E', '"', 203}, /* */
+ {'I', '`', 204}, /* */
+ {'I', '\'', 205}, /* */
+ {'I', '^', 206}, /* */
+ {'I', '"', 207}, /* */
+ {'D', '-', 208}, /* */
+ {'N', '~', 209}, /* */
+ {'O', '`', 210}, /* */
+ {'O', '\'', 211}, /* */
+ {'O', '^', 212}, /* */
+ {'O', '~', 213}, /* */
+ {'O', '"', 214}, /* */
+ {'/', '\\', 215}, /* */
+ {'O', '/', 216}, /* */
+ {'U', '`', 217}, /* */
+ {'U', '\'', 218}, /* */
+ {'U', '^', 219}, /* */
+ {'U', '"', 220}, /* */
+ {'Y', '\'', 221}, /* */
+ {'I', 'p', 222}, /* */
+ {'s', 's', 223}, /* */
+ {'a', '`', 224}, /* */
+ {'a', '\'', 225}, /* */
+ {'a', '^', 226}, /* */
+ {'a', '~', 227}, /* */
+ {'a', '"', 228}, /* */
+ {'a', '@', 229}, /* */
+ {'a', 'e', 230}, /* */
+ {'c', ',', 231}, /* */
+ {'e', '`', 232}, /* */
+ {'e', '\'', 233}, /* */
+ {'e', '^', 234}, /* */
+ {'e', '"', 235}, /* */
+ {'i', '`', 236}, /* */
+ {'i', '\'', 237}, /* */
+ {'i', '^', 238}, /* */
+ {'i', '"', 239}, /* */
+ {'d', '-', 240}, /* */
+ {'n', '~', 241}, /* */
+ {'o', '`', 242}, /* */
+ {'o', '\'', 243}, /* */
+ {'o', '^', 244}, /* */
+ {'o', '~', 245}, /* */
+ {'o', '"', 246}, /* */
+ {':', '-', 247}, /* */
+ {'o', '/', 248}, /* */
+ {'u', '`', 249}, /* */
+ {'u', '\'', 250}, /* */
+ {'u', '^', 251}, /* */
+ {'u', '"', 252}, /* */
+ {'y', '\'', 253}, /* */
+ {'i', 'p', 254}, /* */
+ {'y', '"', 255}, /* (char excluded, is EOF on some systems */
+ {NUL, NUL, NUL}
+ };
+
+# endif /* _INCLUDE_HPUX_SOURCE */
+# endif /* !MINT */
+#endif /* !MSDOS && !WIN32 */
+
+/*
+ * handle digraphs after typing a character
+ */
+ int
+do_digraph(c)
+ int c;
+{
+ static int backspaced; /* character before K_BS */
+ static int lastchar; /* last typed character */
+
+ if (c == -1) /* init values */
+ {
+ backspaced = -1;
+ }
+ else if (p_dg)
+ {
+ if (backspaced >= 0)
+ c = getdigraph(backspaced, c, FALSE);
+ backspaced = -1;
+ if ((c == K_BS || c == Ctrl('H')) && lastchar >= 0)
+ backspaced = lastchar;
+ }
+ lastchar = c;
+ return c;
+}
+
+/*
+ * lookup the pair char1, char2 in the digraph tables
+ * if no match, return char2
+ */
+ static int
+getexactdigraph(char1, char2, meta)
+ int char1;
+ int char2;
+ int meta;
+{
+ int i;
+ int retval;
+
+ if (IS_SPECIAL(char1) || IS_SPECIAL(char2))
+ return char2;
+ retval = 0;
+ for (i = 0; ; ++i) /* search added digraphs first */
+ {
+ if (i == digraphcount) /* end of added table, search defaults */
+ {
+ for (i = 0; digraphdefault[i][0] != 0; ++i)
+ if (digraphdefault[i][0] == char1 && digraphdefault[i][1] == char2)
+ {
+ retval = digraphdefault[i][2];
+ break;
+ }
+ break;
+ }
+ if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
+ {
+ retval = digraphnew[i][2];
+ break;
+ }
+ }
+
+ if (retval == 0) /* digraph deleted or not found */
+ {
+ if (char1 == ' ' && meta) /* <space> <char> --> meta-char */
+ return (char2 | 0x80);
+ return char2;
+ }
+ return retval;
+}
+
+/*
+ * Get digraph.
+ * Allow for both char1-char2 and char2-char1
+ */
+ int
+getdigraph(char1, char2, meta)
+ int char1;
+ int char2;
+ int meta;
+{
+ int retval;
+
+ if (((retval = getexactdigraph(char1, char2, meta)) == char2) &&
+ (char1 != char2) &&
+ ((retval = getexactdigraph(char2, char1, meta)) == char1))
+ return char2;
+ return retval;
+}
+
+/*
+ * put the digraphs in the argument string in the digraph table
+ * format: {c1}{c2} char {c1}{c2} char ...
+ */
+ void
+putdigraph(str)
+ char_u *str;
+{
+ int char1, char2, n;
+ char_u (*newtab)[3];
+ int i;
+
+ while (*str)
+ {
+ str = skipwhite(str);
+ if ((char1 = *str++) == 0 || (char2 = *str++) == 0)
+ return;
+ if (char1 == ESC || char2 == ESC)
+ {
+ EMSG("Escape not allowed in digraph");
+ return;
+ }
+ str = skipwhite(str);
+ if (!isdigit(*str))
+ {
+ emsg(e_number);
+ return;
+ }
+ n = getdigits(&str);
+ if (digraphnew) /* search the table for existing entry */
+ {
+ for (i = 0; i < digraphcount; ++i)
+ if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
+ {
+ digraphnew[i][2] = n;
+ break;
+ }
+ if (i < digraphcount)
+ continue;
+ }
+ newtab = (char_u (*)[3])alloc(digraphcount * 3 + 3);
+ if (newtab)
+ {
+ vim_memmove((char *)newtab, (char *)digraphnew,
+ (size_t)(digraphcount * 3));
+ vim_free(digraphnew);
+ digraphnew = newtab;
+ digraphnew[digraphcount][0] = char1;
+ digraphnew[digraphcount][1] = char2;
+ digraphnew[digraphcount][2] = n;
+ ++digraphcount;
+ }
+ }
+}
+
+ void
+listdigraphs()
+{
+ int i;
+
+ msg_outchar('\n');
+ printdigraph(NULL);
+ for (i = 0; digraphdefault[i][0] && !got_int; ++i)
+ {
+ if (getexactdigraph(digraphdefault[i][0], digraphdefault[i][1],
+ FALSE) == digraphdefault[i][2])
+ printdigraph(digraphdefault[i]);
+ mch_breakcheck();
+ }
+ for (i = 0; i < digraphcount && !got_int; ++i)
+ {
+ printdigraph(digraphnew[i]);
+ mch_breakcheck();
+ }
+ must_redraw = CLEAR; /* clear screen, because some digraphs may be wrong,
+ * in which case we messed up NextScreen */
+}
+
+ static void
+printdigraph(p)
+ char_u *p;
+{
+ char_u buf[9];
+ static int len;
+
+ if (p == NULL)
+ len = 0;
+ else if (p[2] != 0)
+ {
+ if (len > Columns - 11)
+ {
+ msg_outchar('\n');
+ len = 0;
+ }
+ if (len)
+ MSG_OUTSTR(" ");
+ sprintf((char *)buf, "%c%c %c %3d", p[0], p[1], p[2], p[2]);
+ msg_outstr(buf);
+ len += 11;
+ }
+}
+
+#endif /* DIGRAPHS */