Sophie

Sophie

distrib > Fedora > 13 > i386 > media > os > by-pkgid > a6767573ac38ad6a741b524013faa072 > files > 85

Canna-3.7p3-29.fc13.i686.rpm

/* 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 */