/* Copyright 1992 NEC Corporation, Tokyo, Japan. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of NEC * Corporation not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior * permission. NEC Corporation makes no representations about the * suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* ¤³¤Î¥×¥í¥°¥é¥à¤Ï¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤ÇÆþÎϤµ¤ì¤ë XFER¡¢¢¬¢¢ª¢«¡¢F1¡¢ F2¡¢PF1¡¢PF2¡¢HELP¡¢¤Ê¤É¤Î¥¡¼¤òŬÅö¤Ê£É£Ä¤ËÊÑ´¹¤¹¤ë¤¿¤á¤Î¥×¥í¥°¥é¥à ¤Ç¤¢¤ë¡£É½¤ò½àÈ÷¤·¤Æ¤ª¤¤¤Æ initIS ¤ò¸Æ¤Ù¤Ð¡¢¤¢¤È¤Ï identifySequence ¤ò»È¤¦¤³¤È¤Ë¤è¤ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤òǧ¼±¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£ ¾ÜºÙ¤Î»È¤¤Êý¤Ï main() ¤ò»²¹Í¤Ë¤·¤ÆÍߤ·¤¤¡£¤³¤Î¥Õ¥¡¥¤¥ë¤ÏñÂΤǥ³¥ó¥Ñ ¥¤¥ë¤·¼Â¹Ô²Äǽ¤Ç¤¢¤ë¡£a.out ¤Ïɸ½àÆþÎϤ«¤é¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤òÆþÎÏ ¤·¡¢¡Ø¤«¤ó¤Ê¡Ù¤ÇÍѤ¤¤ë¥¡¼£É£Ä¤òɽ¼¨¤¹¤ë¡£Ã±ÂΤǥ³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¤¤Ï USED_AS_LIBRARY ¤ÎÄêµÁ¤ò¥³¥á¥ó¥È¥¢¥¦¥È¤¹¤ì¤ÐÎɤ¤¡£ $Id: is.c,v 1.1.1.1 2002/10/19 08:27:52 aida_s Exp $ */ /* #define USED_AS_LIBRARY /* ¥é¥¤¥Ö¥é¥ê¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë */ #include <canna/keydef.h> typedef struct { int id; char *seq; } SeqToID; static SeqToID keywordtable[] = { {CANNA_KEY_Nfer, "&U51" }, /* nfer */ {CANNA_KEY_PF1, "&U52" }, /* PF1 */ {CANNA_KEY_PF2, "&U53" }, /* PF2 */ {CANNA_KEY_PF3, "&U54" }, /* PF3 */ {CANNA_KEY_PF4, "&U55" }, /* PF4 */ {CANNA_KEY_Up, "[A" }, /* ¢¬ */ {CANNA_KEY_Down, "[B" }, /* ¢ */ {CANNA_KEY_Right, "[C" }, /* ¢ª */ {CANNA_KEY_Left, "[D" }, /* ¢« */ /* ddy880 */ {CANNA_KEY_Up, "OA" }, /* ¢¬ */ {CANNA_KEY_Down, "OB" }, /* ¢ */ {CANNA_KEY_Right, "OC" }, /* ¢ª */ {CANNA_KEY_Left, "OD" }, /* ¢« */ {CANNA_KEY_PF1, "OP" }, /* PF1 */ {CANNA_KEY_PF2, "OQ" }, /* PF2 */ {CANNA_KEY_PF3, "OR" }, /* PF3 */ {CANNA_KEY_PF4, "OS" }, /* PF4 */ {CANNA_KEY_F1, "[11~" }, /* F1 */ {CANNA_KEY_F2, "[12~" }, /* F2 */ {CANNA_KEY_F3, "[13~" }, /* F3 */ {CANNA_KEY_F4, "[14~" }, /* F4 */ {CANNA_KEY_F5, "[15~" }, /* F5 */ {CANNA_KEY_F6, "[17~" }, /* F6 */ {CANNA_KEY_F7, "[18~" }, /* F7 */ {CANNA_KEY_F8, "[19~" }, /* F8 */ {CANNA_KEY_F9, "[20~" }, /* F9 */ {CANNA_KEY_F10, "[21~" }, /* F10 */ {CANNA_KEY_Nfer, "[209z" }, /* nfer */ {CANNA_KEY_Xfer, "[210z" }, /* xfer */ {CANNA_KEY_Insert, "[2~" }, /* insert */ {CANNA_KEY_Insert, "[193z" }, /* insert */ {CANNA_KEY_Help, "[28~" }, /* help */ {CANNA_KEY_Help, "[197z" }, /* help */ {CANNA_KEY_Rollup, "[5~" }, /* Roll Up */ {CANNA_KEY_Rollup, "[194z" }, /* Roll Up */ {CANNA_KEY_Rolldown, "[6~" }, /* Roll Down */ {CANNA_KEY_Rolldown, "[195z" }, /* Roll Down */ {0, 0 }, }; #define charToNum(c) charToNumTbl[(c) - ' '] static int *charToNumTbl; static int longestkeywordlen; typedef struct { int id; int *tbl; } seqlines; static seqlines *seqTbl; /* ÆâÉô¤Îɽ(¼ÂºÝ¤Ë¤Ïɽ¤Îɽ) */ static int nseqtbl; /* ¾õÂ֤οô¡£¾õÂ֤οô¤À¤±É½¤¬¤¢¤ë */ static int nseq; static int seqline; /* cfuncdef initIS -- ¥¡¼¥·¡¼¥±¥ó¥¹¤ò¹â®¤Ë¥¹¥¥ã¥ó¤¹¤ë¤¿¤á¤Î¥Æ¡¼¥Ö¥ë¤òºî¤ë ¹â®¥Æ¡¼¥Ö¥ë¤Ï seqTbl ¤Î¥Ý¥¤¥ó¥¿¤È¤·¤ÆºîÀ®¤µ¤ì¤ë¡£¤Þ¤¿¡¢¥¥ã¥é¥¯¥¿¤« ¤é¿ô»ú¤Ø¤ÎÊÑ´¹ÍѤΥơ¼¥Ö¥ë¤âºîÀ®¤µ¤ì¤ë(charToNumTbl)¡£ ¤³¤ì¤Ï¥Ç¡¼¥¿ SeqToID ¤ò´ð¤Ë½é´ü²½¤µ¤ì¤ë¡£ ¹â®¥Æ¡¼¥Ö¥ë¤Ï¾õÂÖ¤ÈÆþÎϤµ¤ì¤¿¥¡¼¤Î¥³¡¼¥É¤«¤é¼¡¤Î¾õÂÖ¤òÆÀ¤ë¤¿¤á¤Î¥Æ¡¼ ¥Ö¥ë¤Ç¤¢¤ë¡£¥·¡¼¥±¥ó¥¹¤¬½ª¤ï¤Ã¤¿»þ¤Ë¡¢¤½¤Î»þ¤Î¾õÂÖ¤Ç id ¥á¥ó¥Ð¤Ë¤½¤Î ¥·¡¼¥±¥ó¥¹¤ËÂбþ¤¹¤ë¥¡¼¤Î¼±Ê̻Ҥ¬Æþ¤Ã¤Æ¤¤¤ë¡£¼¡¤Î¾õÂÖ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤ ¤Ê¤¤(£°¤¬Æþ¤Ã¤Æ¤¤¤ë)¤È¤¤Ï¥·¡¼¥±¥ó¥¹¤¬½ª¤ï¤Ã¤Æ¤¤¤ë¡£¤½¤Î¤È¤¤Ë id ¥á ¥ó¥Ð£°¤¬Æþ¤Ã¤Æ¤¤¤ë»þ¤Ï¥¤¥ê¡¼¥¬¥ë¤Ê¥·¡¼¥±¥ó¥¹¤Ç¤¢¤ë¡£ */ static initIS() { SeqToID *p; char *s; int i; seqlines seqTbls[1024]; seqTbl = (seqlines *)0; seqline = 0; nseqtbl = 0; nseq = 0; longestkeywordlen = 0; for (i = 0 ; i < 1024 ; i++) { seqTbls[i].tbl = (int *)0; seqTbls[i].id = 0; } charToNumTbl = (int *)calloc('~' - ' ' + 1, sizeof(int)); if ( !charToNumTbl ) { return 0; } /* ¤Þ¤º²¿Ê¸»ú»È¤ï¤ì¤Æ¤¤¤ë¤«¤òÄ´¤Ù¤ë¡£ nseq ¤Ï»È¤ï¤ì¤Æ¤¤¤ëʸ»ú¿ô¤è¤ê£±Â礤¤ÃͤǤ¢¤ë */ for (p = keywordtable ; p->id ; p++) { int len = 0; for (s = p->seq ; *s ; s++) { if ( !charToNumTbl[*s - ' '] ) { charToNumTbl[*s - ' '] = nseq; /* ³Æʸ»ú¤Ë¥·¥ê¥¢¥ëÈÖ¹æ¤ò¿¶¤ë */ nseq++; } len ++; } if (len > longestkeywordlen) { longestkeywordlen = len; } } /* ʸ»ú¿ôʬ¤Î¥Æ¡¼¥Ö¥ë */ seqTbls[nseqtbl].tbl = (int *)calloc(nseq, sizeof(int)); if ( !seqTbls[nseqtbl].tbl ) { goto initISerr; } nseqtbl++; for (p = keywordtable ; p->id ; p++) { int line, nextline; line = 0; for (s = p->seq ; *s ; s++) { if (seqTbls[line].tbl == 0) { /* ¥Æ¡¼¥Ö¥ë¤¬¤Ê¤¤ */ seqTbls[line].tbl = (int *)calloc(nseq, sizeof(int)); if ( !seqTbls[line].tbl ) { goto initISerr; } } nextline = seqTbls[line].tbl[charToNum(*s)]; /* ¤Á¤Ê¤ß¤Ë¡¢charToNum(*s) ¤ÏÀäÂФˣ°¤Ë¤Ê¤é¤Ê¤¤ */ if ( nextline ) { line = nextline; } else { /* ºÇ½é¤Ë¥¢¥¯¥»¥¹¤·¤¿ */ line = seqTbls[line].tbl[charToNum(*s)] = nseqtbl++; } } seqTbls[line].id = p->id; } seqTbl = (seqlines *)calloc(nseqtbl, sizeof(seqlines)); if ( !seqTbl ) { goto initISerr; } for (i = 0 ; i < nseqtbl ; i++) { seqTbl[i].id = seqTbls[i].id; seqTbl[i].tbl = seqTbls[i].tbl; } return 1; initISerr: free(charToNumTbl); charToNumTbl = (int *)0; if (seqTbl) { free(seqTbl); seqTbl = (seqlines *)0; } for (i = 0 ; i < nseqtbl ; i++) { if (seqTbls[i].tbl) { free(seqTbls[i].tbl); seqTbls[i].tbl = (int *)0; } } return 0; } static finIS() /* identifySequence ¤ËÍѤ¤¤¿¥á¥â¥ê»ñ¸»¤ò³«Êü¤¹¤ë */ { int i; for (i = 0 ; i < nseqtbl ; i++) { if (seqTbl[i].tbl) free(seqTbl[i].tbl); seqTbl[i].tbl = (int *)0; } free(seqTbl); seqTbl = (seqlines *)0; free(charToNumTbl); charToNumTbl = (int *)0; } /* cvariable seqline: identifySequence ¤Ç¤Î¾õÂÖ¤òÊÝ»ý¤¹¤ëÊÑ¿ô */ #define CONTINUE 1 #define END 0 static identifySequence(c, val) char c; int *val; { int nextline; if (charToNum(c) && (nextline = seqTbl[seqline].tbl[charToNum(c)]) ) { seqline = nextline; if (*val = seqTbl[seqline].id) { seqline = 0; return END; } else { return CONTINUE; /* continue */ } } else { *val = -1; seqline = 0; return END; } } #ifndef USED_AS_LIBRARY main() { int c, code; initIS(2); /* 2 ¤Ï VT ¥³¥ó¥Ñ¥Á¥¿¡¼¥ß¥Ê¥ë */ c = getchar(); while (c != -1) { if (c == 0x1b) { char foo[8]; int n = 1; int res; foo[0] = 0x1b; do { foo[n++] = c = getchar(); res = identifySequence(c, &code); } while (res == CONTINUE); if (code != -1) { printf("<0x%x>", code); } else { int i; for (i = 0 ; i < n ; i++) { printchar(foo[i]); } } } else { printchar(c); } c = getchar(); } finIS(); } static printchar(c) char c; { if (c < 0x20) { if (c == '\n' || c == '\t' || c == '\b') { putchar(c); } else if (c == 0x1b) { printf("\\e"); } else { printf("^%c", c + '@'); } } else { putchar(c); } } #endif /* USED_AS_LIBRARY */