File: [local] / src / usr.bin / vim / Attic / digraph.c (download)
Revision 1.2, Sat Sep 21 06:22:56 1996 UTC (27 years, 8 months ago) by downsj
Branch: MAIN
CVS Tags: OPENBSD_2_2_BASE, OPENBSD_2_2, OPENBSD_2_1_BASE, OPENBSD_2_1, OPENBSD_2_0_BASE, OPENBSD_2_0 Changes since 1.1: +2 -3 lines
update to vim 4.4beta
|
/* $OpenBSD: digraph.c,v 1.2 1996/09/21 06:22:56 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(newtab, 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 */