/* * Copyright (c) 1994 Sony Corporation * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL SONY CORPORATION BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of Sony Corporation * shall not be used in advertising or otherwise to promote the sale, use * or other dealings in this Software without prior written authorization * from Sony Corporation. * */ #include #include "wchar16.h" #include "sj2.h" #include "key.h" #include "Paths.h" #include "sj3.h" struct cvtkey { char* key_word; char key_seq[SEQLEN]; } cvtkeytbl[] = { {"F1", ""}, {"F2", ""}, {"F3", ""}, {"F4", ""}, {"F5", ""}, {"F6", ""}, {"F7", ""}, {"F8", ""}, {"F9", ""}, {"F10", ""}, {"F11", ""}, {"F12", ""}, {"F13", ""}, {"F14", ""}, {"F15", ""}, {"F16", ""}, {"F17", ""}, {"F18", ""}, {"F19", ""}, {"F20", ""}, {"Select", ""}, {"Kanji", ""}, {"Cancel", ""}, {"Execute", ""}, {"Up", ""}, {"Down", ""}, {"Right", ""}, {"Left", ""}, {NULL, ""}}; extern struct wcvtkey wcvtkeytbl[]; int Uvalue[UKEYNUM]; wchar16_t Ukey[UKEYNUM][SEQLEN + 1]; int Unumber = 0; int comvalue[COMNUM]; wchar16_t comkey[COMNUM]; int comnumber = 0; #define ETCKEYS 10 int u_etckeys = 0; int Uetckey[ETCKEYS]; int Uetcval[ETCKEYS]; extern wchar16_t* comstr[]; int comstrvalue[KEY_OTHER] = { KEY_CONV, KEY_HENKAN, KEY_MUHENKAN, KEY_KETTEI, KEY_ZHIRA, KEY_HALPHA, KEY_ZALPHA, KEY_HKATA, KEY_ZKATA, KEY_CODE, KEY_ETC, KEY_RIGHT, KEY_LEFT, KEY_UP, KEY_DOWN, KEY_EDIT, KEY_TOGGLE, KEY_WRAPBACK, KEY_WRAP, KEY_SJRC, KEY_BUFFER, KEY_TOROKU, KEY_SHOUKYO, KEY_HELP, KEY_HA_KET, KEY_FLUSH, KEY_DEBUG, KEY_CANCEL, KEY_RECONV, KEY_IGNORE, KEY_TOP, KEY_END, KEY_RECONNECT, KEY_KILL, KEY_OTHER}; void mk_cvtkey(char* term) { char* p; char line[MAXLINE], rstr[16]; FILE* fd; char cvtkey_file[LONGLENGTH]; struct cvtkey* ckeyp; struct wcvtkey* wckeyp; /* * Change a default value. * Patched by Hidekazu Kuroki(hidekazu@cs.titech.ac.jp) 1996/8/10 */ strcpy(cvtkey_file, DEFKEYFILE); strcpy(line, term); if((p = strchr(line, '-')) != NULL) *p = '\0'; strcat(cvtkey_file, line); if((fd = fopen(cvtkey_file, "r")) != NULL) { while((p = fgets(line, MAXLINE, fd)) != NULL) { if(*p == '#' || *p == '\n' || *p == '\0') continue; if((p = getkey2(p, rstr)) == NULL) continue; ckeyp = cvtkeytbl; wckeyp = wcvtkeytbl; while(ckeyp->key_word != NULL) { if(strcmp(ckeyp->key_word, rstr) == 0) { p = getkey2(p, ckeyp->key_seq); (void)mbstowcs(wckeyp->key_seq, ckeyp->key_seq, SEQLEN); break; } ckeyp++; wckeyp++; } } fclose(fd); } } char* getkey2(char* istr, char* ostr) { char* p; int i; while(*istr == ' ' || *istr == '\t') istr++; p = istr; i = 0; while(*p != ' ' && *p != '\t' && *p != '\n' && *p != '\0') { *ostr++ = *p; if(++i > SEQLEN) { i = 0; break; } p++; } *ostr = '\0'; if(i > 0) return (p); return (NULL); } void clear_ukeys(void) { Unumber = 0; } void set_func(struct wordent word[]) { int i, num; wchar16_t * p, *s; struct wcvtkey* ckeyp; if(Unumber >= UKEYNUM) return; for(i = 0; i < KEY_OTHER && *comstr[i] != '\0'; i++) { if(match(word[1].word_str, comstr[i])) { p = word[2].word_str; if(iswupper(*p)) { ckeyp = wcvtkeytbl; while(ckeyp->key_word != NULL) { if(wscmp(p, ckeyp->key_word) == 0) { p = ckeyp->key_seq; if(*p == '\0') return; break; } ckeyp++; } } s = Ukey[Unumber]; if((num = eval_keys(p, s)) > 1) { if(Unumber < UKEYNUM) Uvalue[Unumber++] = comstrvalue[i]; } else if(num >= 0) { if(comnumber < COMNUM) { comkey[comnumber] = *s; comvalue[comnumber++] = comstrvalue[i]; } } return; } } } wchar16_t eval_keys(wchar16_t* s, wchar16_t* p) { wchar16_t c, i; if(wslen(s) > SEQLEN) return (-1); i = 0; while((c = *(s++)) != '\0') { if(c == '^') { c = *(s++); if('@' <= c && c <= '_') c = c - '@'; else if(c == '?') c = DEL; else c = *(--s); } i++; *(p++) = c; } *p = '\0'; return (i); } void clear_key(void) { clear_commkeys(); clear_etckeys(); clear_ukeys(); } void clear_commkeys(void) { comnumber = 0; } int eval_key(wchar16_t* s) { wchar16_t c; c = *s; if(c == '^') { c = s[1]; if('@' <= c && c <= '_') return (c - '@'); else if(c == '?') return (DEL); } else if(c <= '~') return (c); return (-1); } void clear_etckeys(void) { u_etckeys = 0; } int set_etckeys(struct wordent word[]) { int i; if(u_etckeys >= ETCKEYS) return (1); for(i = 0; i < KEY_OTHER && *comstr[i] != '\0'; i++) { if(match(word[1].word_str, comstr[i])) { Uetcval[u_etckeys] = comstrvalue[i]; break; } } if(i >= KEY_OTHER) return (1); for(i = 0; i < KEY_OTHER && *comstr[i] != '\0'; i++) { if(match(word[2].word_str, comstr[i])) { Uetckey[u_etckeys] = comstrvalue[i]; break; } } if(i >= KEY_OTHER) return (1); u_etckeys++; return (0); } wchar16_t parse_command(wchar16_t* s, int* count) { extern wchar16_t pars_seq[]; extern int pars_n; int i, j; wchar16_t c; c = *s; for(i = 0; i < comnumber; i++) { if(c == comkey[i]) { for(j = 1; j < *count; j++) s[j - 1] = s[j]; (*count)--; *pars_seq = c; pars_seq[1] = 0; pars_n = 1; return (comvalue[i]); } } return (KEY_NORMAL); }