Mercurial > freewnn
diff Wnn/uum/termcap.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wnn/uum/termcap.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,567 @@ +/* + * $Id: termcap.c,v 1.7 2006/03/04 19:01:46 aonoto Exp $ + */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright Kyoto University Research Institute for Mathematical Sciences + * 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright FreeWnn Project 1999, 2000, 2002 + * + * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#include <ctype.h> +#if STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# if HAVE_MALLOC_H +# include <malloc.h> +# endif +# if HAVE_STRINGS_H +# include <strings.h> +# endif +#endif /* STDC_HEADERS */ +#include <sys/errno.h> +#include <sys/ioctl.h> +#if HAVE_CURSES_H +# include <curses.h> +#elif HAVE_NCURSES_H +# include <ncurses.h> +#endif /* HAVE_CURSES_H */ +#if HAVE_TERM_H +# include <term.h> +#endif + +#include "commonhd.h" + +#include "sdefine.h" +#include "sheader.h" + +#undef DEFAULT_KKCAP +/* declaration about terminal */ + +int kkcap_mode; + +int Term_LineWidth; +int Term_RowWidth; +/* +char *Term_Bell; +*/ +char *Term_ClrScreen; +char *Term_ClrEofLine; +char *Term_CleEndScreen; +char *Term_ThrowCursor; +char *Term_StandOutStart; /* These variables has value even if terminfo is used. see termio.c. */ +char *Term_StandOutEnd; +static int bold_mode_fun; +char *Term_BoldOutStart; +char *Term_BoldOutEnd; +/* +int Term_StandOutBlankNum; +char *Term_DelChar; +*/ +char *Term_UnderScoreStart; +char *Term_UnderScoreEnd; + +char *Term_KeyPadOn; +char *Term_KeyPadOff; +#if !HAVE_TERMINFO /* Assume TERMCAP */ +char *Term_CursorNormal; +char *Term_CursorInvisible; + + +char *Term_SaveCursor; +char *Term_RestoreCursor; +char *Term_SetScrollRegion; +char *Term_ScrollRegion; +char *Term_ResetScreen; +char TermDataArea[1024]; +static char TermData[1024]; + +int cursor_state; + +#ifdef DCUREOR +FILE *debugc; +#endif + + +int +getTermData () +{ + char *name; + char *pter; + char *sr_set (); + char *j; + extern char *getenv (), *get_kbd_env (); + + +#ifdef DCUREOR + if ((debugc = fopen (DP, "w")) == NULL) + { + fprintf (stderr, "OPEN ERR IN %d. \n", DP); + } +#endif + + /* for convert_key --- added by Nide 10/3 */ + if (NULL == (name = get_kbd_env ()) || 0 != convert_getterm (name, (0 != verbose_option))) + { + fprintf (stderr, "Cannot get keyboard information.\n"); + return (-1); + } + + if (((name = getenv ("TERM")) == NULL) || (tgetent (TermData, name) <= 0)) + { + fprintf (stderr, "Cannot get terminal information.\n"); + return (-1); + } + strcpy (Term_Name, name); + pter = TermDataArea; + + Term_ResetScreen = tgetstr ("rs", &pter); + Term_UnderScoreEnd = tgetstr ("ue", &pter); + if (!((Term_UnderScoreEnd = tgetstr (j = "ue", &pter)) && ((Term_LineWidth = tgetnum (j = "co")) != -1) && ((Term_RowWidth = tgetnum (j = "li")) != -1) && /* line */ + /* (Term_Bell = tgetstr(j = "bl", &pter)) && */ + (Term_ClrScreen = tgetstr (j = "cl", &pter)) && + (Term_ClrEofLine = tgetstr (j = "ce", &pter)) && (Term_CleEndScreen = tgetstr (j = "cd", &pter)) && (Term_ThrowCursor = tgetstr (j = "cm", &pter)) && + /* Check padding */ + (Term_StandOutStart = tgetstr (j = "so", &pter)) && (Term_StandOutEnd = tgetstr (j = "se", &pter)) && + /* + ((Term_StandOutBlankNum = tgetnum(j = "sg")) != -1) && + (Term_DelChar = tgetstr(j = "dc", &pter)) && + */ + (Term_UnderScoreStart = tgetstr (j = "us", &pter)) && + (Term_SaveCursor = tgetstr (j = "sc", &pter)) && + (Term_RestoreCursor = tgetstr (j = "rc", &pter)) && (Term_SetScrollRegion = tgetstr (j = "cs", &pter)) && (Term_ScrollRegion = sr_set (&pter, 0, Term_RowWidth - 2)))) + { + fprintf (stderr, "Your terminal doesn't have %s entry in termcap.\n", j); + fprintf (stderr, "Maybe, your terminal is not strong enough to use Uum!\n"); + return (-1); + } + + if (Term_BoldOutStart && Term_BoldOutEnd) + { + bold_mode_fun = 1; + } + else + { + bold_mode_fun = 0; + } + Term_BoldOutStart = tgetstr ("md", &pter); + Term_BoldOutEnd = tgetstr ("me", &pter); + + Term_CursorInvisible = tgetstr ("vi", &pter); + Term_CursorNormal = tgetstr ("ve", &pter); + if (Term_CursorInvisible && Term_CursorNormal) + { + cursor_invisible_fun = 1; + } + else + { + cursor_invisible_fun = 0; + } + Term_KeyPadOn = tgetstr ("ks", &pter); + Term_KeyPadOff = tgetstr ("ke", &pter); + if (Term_KeyPadOn && Term_KeyPadOff) + { + keypad_fun = 1; + } + else + { + keypad_fun = 0; + } +/* and needs more precise check of Terminal status. */ +#ifdef DGUX /* copied from JLS5.4.2 */ + { + struct winsize ws; + if ((ioctl (0, TIOCGWINSZ, &ws) == 0) && (ws.ws_row > 0) && (ws.ws_col > 0)) + { + Term_LineWidth = ws.ws_col; + Term_RowWidth = ws.ws_row; + } + } +#endif /* DGUX */ + + maxlength = Term_LineWidth; + crow = Term_RowWidth - conv_lines; + +/* decfline(TermData); decfline is moved after reading uumrc.*/ + + return (0); +} + +char * +strsch (str1, str2) + char *str1, *str2; +{ + char *c = NULL; + int flag = 0; + for (; *str1++;) + { + if (!flag) + { + if (*str1 == *str2) + { + flag = 1; + c = str2 + 1; + } + } + else + { + if (*c == 0) + return (str1); + if (*c++ != *str1) + flag = 0; + } + } + return (NULL); +} + +/* Remove an entry from TERMCAP string by T.S. */ + +static char * +remove (p, ob) + char *p, *ob; +{ + char *r; + + if ((r = strsch (p, ob)) != NULL) + { + p = r - strlen (ob); + for (; *r != ':'; r++); + strcpy (p, r); + }; + return (r); +} + +static void strascii (); +static int decfline (); + +int +set_TERMCAP () +{ + return (decfline (TermData)); +} + + +/** termcap no entry no naka de li: to cs: wo kakikaemasu */ +static int +decfline (name) + char *name; +{ + char *name1; + char *c; + + if ((name1 = malloc (strlen (name) + 1024)) == NULL) + { + return (-1); + } + if ((c = strsch (name, "li#")) != NULL) + { + strncpy (name1, name, c - name); + name1[c - name] = 0; + for (; *c >= '0' && *c <= '9'; c++); + sprintf (name1 + strlen (name1), "%d", crow); + strcat (name1, c); + } +/* add rs entry to termcap */ + remove (name1, ":rs"); + strcat (name1, "rs="); + if (Term_ResetScreen) + strascii (name1 + strlen (name1), Term_ResetScreen); + strascii (name1 + strlen (name1), Term_ScrollRegion); + strcat (name1, ":"); + + if (remove_cs_from_termcap) + { + remove (name1, ":cs"); + } + remove (name1, ":sc"); + remove (name1, ":rc"); + setenv ("TERMCAP", name1, 1); + free (name1); + return (0); +} + +/* functions using Terminal Information. */ + +char * +sr_set (st, start, end) + int start, end; + char **st; +{ + char *string = *st; + char *pt = Term_SetScrollRegion; + char *pt1; + char nextch; + int params[2]; + int i = 0; /* points tp params */ + + *string = 0; + params[0] = start; + params[1] = end; + for (; *pt != 0; pt++) + { + if (i > 2) + { + fprintf (stderr, "ERROR in tparam few parameters."); + /* Message ga wakaridurai? */ + return (NULL); + } + if (*pt == '%') + { + switch (*++pt) + { + case 'd': + sprintf (string + strlen (string), "%d", params[i++]); + break; + case '2': + sprintf (string + strlen (string), "%2d", params[i++]); + break; + case '3': + sprintf (string + strlen (string), "%3d", params[i++]); + break; + case '.': + sprintf (string + strlen (string), "%c", params[i++]); + break; + case '+': + if (!(nextch = *++pt)) + { + fprintf (stderr, "Unexpected EOL in cs string.\n"); + return NULL; + } + sprintf (string + strlen (string), "%c", params[i++] + nextch); + break; + case '>': + if (!(nextch = *++pt)) + { + fprintf (stderr, "Unexpected EOL in cs string.\n"); + return NULL; + } + if (params[i] > nextch) + { + if (!(nextch = *++pt)) + { + fprintf (stderr, "Unexpected EOL in cs string.\n"); + return NULL; + } + params[i] += nextch; + } + break; + case 'r': + { + int temp; + temp = params[0]; + params[0] = params[1]; + params[1] = temp; + } + break; + case 'i': + params[0]++; + params[1]++; + break; + case '%': + strcat (string, "%"); + break; + case 'n': + params[0] ^= 0140; + params[1] ^= 0140; + break; + case 'B': + params[i] = ((params[i] / 10) << 4) + params[i] % 10; + break; + case 'D': + params[i] = params[i] - 2 * (params[i] % 16); + break; + case '\0': + fprintf (stderr, "Unexpected EOL in cs string.\n"); + return NULL; + } + } + else + { + pt1 = string + strlen (string); + *pt1 = *pt; + *++pt1 = 0; + } + } + *st = string + strlen (string); + return (string); +} + +void +set_keypad_on () +{ + tputs (Term_KeyPadOn, 1, putchar); +} + +void +set_keypad_off () +{ + tputs (Term_KeyPadOff, 1, putchar); +} + +void +set_scroll_region (start, end) + int start, end; +{ + char *a; + char TERM_SCROLLREGION[24]; + a = TERM_SCROLLREGION; + + sr_set (&a, start, end); /* changed in June 9 */ + fputs (TERM_SCROLLREGION, stdout); +} + +void +clr_end_screen () +{ + tputs (Term_CleEndScreen, 1, putchar); +} + +void +clr_screen () +{ + tputs (Term_ClrScreen, Term_RowWidth, putchar); +} + +void +clr_line1 () +{ + tputs (Term_ClrEofLine, 1, putchar); +} + +void +throw_cur_raw (col, row) + int col, row; +{ + tputs (tgoto (Term_ThrowCursor, col, row), 1, putchar); +} + +void +h_r_on_raw () +{ + tputs (Term_StandOutStart, 1, putchar); +} + +void +h_r_off_raw () +{ + tputs (Term_StandOutEnd, 1, putchar); +} + +void +u_s_on_raw () +{ + tputs (Term_UnderScoreStart, 1, putchar); +} + +void +u_s_off_raw () +{ + tputs (Term_UnderScoreEnd, 1, putchar); + flush (); +} + +void +b_s_on_raw () +{ + if (bold_mode_fun) + tputs (Term_BoldOutStart, 1, putchar); + else + tputs (Term_UnderScoreStart, 1, putchar); + flush (); +} + +void +b_s_off_raw () +{ + if (bold_mode_fun) + tputs (Term_BoldOutEnd, 1, putchar); + else + tputs (Term_UnderScoreEnd, 1, putchar); + flush (); +} + +void +ring_bell () +{ + putchar (Ctrl ('G')); + flush (); +/* + tputs(Term_Bell, 1, putchar); +*/ +} + +void +save_cursor_raw () +{ + tputs (Term_SaveCursor, 1, putchar); +} + +void +restore_cursor_raw () +{ + tputs (Term_RestoreCursor, 1, putchar); +} + +void +cursor_invisible_raw () +{ + tputs (Term_CursorInvisible, 1, putchar); +} + +void +cursor_normal_raw () +{ + fputs (Term_CursorNormal, stdout); +} + +static void +strascii (dest, str) + unsigned char *dest, *str; +{ + for (; *str; str++) + { + if (*str >= ' ') + { + *dest++ = *str; + } + else if (*str == '\033') + { + *dest++ = '\\'; + *dest++ = 'E'; + } + else + { + *dest++ = '^'; + *dest++ = *str + '@'; + } + } + *dest = '\0'; +} + +#endif /* !HAVE_TERMINFO */