int8 get_time() { int8 c, n; int8 t_entry[12]; int8 time_error; for(n=0; n<12; n++) t_entry[n] = 0x00; //blank it time_error = 0; fputc('[', COM_A); for (n=0; n<12; ++n){ c = fgetc(COM_A); fputc(c, COM_A); if (c > 47 && c < 58) t_entry[n] = c; else { // it's not a number - kick it out time_error = 1; break; } } if (time_error == 0){ fputc(']', COM_A); for (n=0; n<12; ++n){ t_entry[n] = (t_entry[n] - 48); } RTC_Mon_Data = (10 * t_entry[0]) + t_entry[1]; if (RTC_Mon_Data < 1 || RTC_Mon_Data > 12) time_error = 2; RTC_DOM_Data = (10 * t_entry[2]) + t_entry[3]; if (RTC_DOM_Data < 1 || RTC_DOM_Data > 31) time_error = 2; RTC_Yr_Data = (10 * t_entry[4]) + t_entry[5]; if (RTC_Yr_Data > 99) time_error = 2; RTC_Hr_Data = (10 * t_entry[6]) + t_entry[7]; if (RTC_Hr_Data > 24) time_error = 2; RTC_Min_Data = (10 * t_entry[8]) + t_entry[9]; if (RTC_Min_Data > 60) time_error = 2; RTC_Sec_Data = (10 * t_entry[10]) + t_entry[11]; if (RTC_Sec_Data > 60) time_error = 2; fprintf(COM_A, "\n\r%02u/%02u/%02u %02u:%02u:%02u\n\r", RTC_Mon_Data, RTC_DOM_Data,RTC_Yr_Data,RTC_Hr_Data,RTC_Min_Data,RTC_Sec_Data); if (time_error == 2) cmd_inv(); } else cmd_arg(); return time_error; }
static void cin_keyname(char *arg, cintab_t *cintab) { char cmd1[64], arg1[64]; int k, argc; while (argc = cmd_arg(True, cmd1, 64, arg1, 64, NULL)) { if ((strcasecmp("%keyname", cmd1) == 0 && strcasecmp("end", arg1) == 0) || strcasecmp("END_CHAR_PROMPTS_DEFINITION", cmd1) == 0) { break; } if (argc != 2 || strlen(cmd1) != 1) { continue; } cmd1[0] = tolower(cmd1[0]); if (! (k = oxim_key2code(cmd1[0]))) { oxim_perr(OXIMMSG_ERROR, N_("%s(%d): illegal key \"%c\" specified.\n"), cintab->fname_cin, cintab->lineno, cmd1[0]); } if (th.keyname[k].uch) { oxim_perr(OXIMMSG_NORMAL, N_("%s(%d): key \"%c\" is already in used.overwrite it.\n"), cintab->fname_cin, cintab->lineno, cmd1[0]); strncpy((char *)th.keyname[k].s, arg1, UCH_SIZE); continue; } validkey[cmd1[0]] = '\1'; if (! read_hexwch(th.keyname[k].s, arg1)) strncpy((char *)th.keyname[k].s, arg1, UCH_SIZE); th.n_keyname++; } }
void gencin(cintab_t *cintab) { int i; char cmd[64], arg1[64], arg2[64]; size_t ret; bzero(validkey, 128); bzero(&th, sizeof(cintab_head_t)); strncpy(th.version, GENCIN_VERSION, VERLEN); strncpy(th.encoding, "UTF-8", ENCLEN); while (cmd_arg(False, cmd, 64, arg1, 64, arg2, 64, NULL)) { for (i=0; genfunc[i].name != NULL; i++) { if (strcasecmp(genfunc[i].name, cmd) == 0) { if (strlen(arg1) == 1 && arg1[0] == '=') { genfunc[i].func(arg2, cintab); } else { genfunc[i].func(arg1, cintab); } genfunc[i].gotit = 1; break; } /* SCIM 的 Locale Name */ else if (strncasecmp("NAME.", cmd, 5) == 0) { cin_cname(arg2, cintab); } } if (genfunc[i].name == NULL) oxim_perr(OXIMMSG_NORMAL, N_("%s(%d): unknown command: %s, ignore.\n"), cintab->fname_cin, cintab->lineno, cmd); } for (i=0; genfunc[i].name != NULL; i++) { if (genfunc[i].gotit == 0) oxim_perr(OXIMMSG_ERROR, N_("%s: command \"%s\" not specified.\n"), cintab->fname_cin, genfunc[i].name); } oxim_perr(OXIMMSG_NORMAL, N_("number of keyname: %d\n"), th.n_keyname); oxim_perr(OXIMMSG_NORMAL, N_("max length of keystroke: %d\n"), th.n_max_keystroke); oxim_perr(OXIMMSG_NORMAL, N_("number of keystroke code defined: %d\n"), th.n_icode); oxim_perr(OXIMMSG_NORMAL, N_("number of char defined: %d\n"), th.n_icode - n_word); oxim_perr(OXIMMSG_NORMAL, N_("number of word: %d\n"), n_word); oxim_perr(OXIMMSG_NORMAL, N_("memory model: %d\n"), th.icode_mode); if (!cintab->fname_outcin) { ret = gzwrite(cintab->fw, &th, sizeof(cintab_head_t)); ret = gzwrite(cintab->fw, icode1, sizeof(icode_t) * th.n_icode); ret = gzwrite(cintab->fw, ichar, sizeof(ichar_t) * th.n_icode); if (th.icode_mode == ICODE_MODE2) { ret = gzwrite(cintab->fw, icode2, sizeof(icode_t) * th.n_icode); } if (n_word) { ret = gzwrite(cintab->fw, word_table, table_size); } return; } FILE *fp = cintab->cinfp; /* 標準 cin 檔頭標記 */ fprintf(fp, "%%gen_inp\n"); /* English Name */ if (strlen(th.ename)) { fprintf(fp, "%%ename %s\n", th.ename); } /* Chinese Name */ if (strlen(th.cname)) { fprintf(fp, "%%cname %s\n", th.cname); } /* Selection keys */ if (strlen(th.selkey)) { fprintf(fp, "%%selkey %s\n", th.selkey); } /* End keys */ if (strlen(th.endkey)) { fprintf(fp, "%%endkey %s\n", th.endkey); } /* */ if (th.n_keyname) { int k, kn; fprintf(fp, "%%keyname begin\n"); for (k=0 ; k < N_KEYCODE ; k++) { kn = oxim_code2key(k); if (th.keyname[k].uch) { kn = oxim_code2key(k); fprintf(fp, "%c %s\n", (char)kn, (char *)th.keyname[k].s); } } fprintf(fp, "%%keyname end\n"); } /* 寫入字根與字元對照段落*/ fprintf(fp, "%%chardef begin\n"); char utf8[UCH_SIZE]; cin_char_t *cch; for (i=0, cch = cchar ; i < th.n_icode ; i++, cch++) { if (ichar[i] & WORD_MASK) { char *slash = oxim_addslashes(cch->word); if (slash) { fprintf(fp, "%s\t\"%s\"\n", cch->keystroke, slash); free(slash); } else { fprintf(fp, "%s\t\"%s\"\n", cch->keystroke, cch->word); } } else { if (oxim_ucs4_to_utf8(ichar[i], utf8)) { switch (ichar[i]) { case ' ': fprintf(fp, "%s\t\" \"\n", cch->keystroke); break; case '\"': fprintf(fp, "%s\t%s\n", cch->keystroke, "\\\""); break; default: fprintf(fp, "%s\t%s\n", cch->keystroke, utf8); break; } } } } fprintf(fp, "%%chardef end\n"); return; }
static void cin_chardef(char *arg, cintab_t *cintab) { char cmd1[64], arg1[1024] = {'\0'}, arg2[32]= {'\0'}; cin_char_t *cch=NULL; int len, ret, argc; unsigned int i, key, key_len; while ((argc=cmd_arg(True, cmd1, 64, arg1, 1024, arg2, 32, NULL))) { if ((strcasecmp("%chardef", cmd1) == 0 && strcasecmp("end", arg1) == 0) || strcasecmp("END_TABLE", cmd1) == 0) { break; } if (argc < 2 || argc > 3) { oxim_perr(OXIMMSG_WARNING, N_("%s(%d): arguement expected.\n"), cintab->fname_cin, cintab->lineno); continue; } /* TODO : 字根目前限制不能超過 10 個(未來要改為不限制)*/ key_len = strlen(cmd1); if (key_len > 10) { continue; } /* * 看看字根中,是否有不合法的字元 * 所謂不合法,就是在 selkey、keyname、endkey 沒有定義的字元 */ int allkey_valid = True; for (i=0 ; i < key_len ; i++) { cmd1[i] = tolower(cmd1[i]); int kk = cmd1[i]; if (!validkey[kk]) { if (i || cmd1[i] != '#') { oxim_perr(OXIMMSG_WARNING, N_("%s(%d): illegal key \"%c\" specified.\n"), cintab->fname_cin, cintab->lineno, cmd1[i]); } allkey_valid = False; break; } } if (!allkey_valid) { continue; } th.n_icode ++; if (th.n_icode == 1) { cchar = oxim_malloc(sizeof(cin_char_t), True); } else { cchar = oxim_realloc(cchar, (th.n_icode+1) * sizeof(cin_char_t)); } cch = (cchar + th.n_icode) - 1; bzero(cch, sizeof(cin_char_t)); if ((cch->ucs4 = ccode_to_ucs4(arg1)) == 0) { n_word ++; cch->word_len = strlen(arg1); cch->word = strdup(arg1); table_size += cch->word_len + sizeof(cch->word_len); } if (arg2[0] != '\0') { cch->order = atoi(arg2); } oxim_keys2codes(cch->key, 2, cmd1); cch->keystroke = strdup(cmd1); th.n_ichar ++; len = strlen(cmd1); if (th.n_max_keystroke < len) th.n_max_keystroke = len; arg2[0] = '\0'; } /* * Determine the memory model. */ ret = (th.n_max_keystroke <= 5) ? ICODE_MODE1 : ICODE_MODE2; th.icode_mode = ret; /* * Fill in the ichar, icode_idx and icode1, icode2 arrays. */ stable_sort(cchar, th.n_icode, sizeof(cin_char_t), icode_cmp); ichar = oxim_malloc(th.n_icode * sizeof(ichar_t), True); icode1 = oxim_malloc(th.n_icode*sizeof(icode_t), True); if (ret == ICODE_MODE2) { icode2 = oxim_malloc(th.n_icode*sizeof(icode_t), True); } if (n_word) { word_table = oxim_malloc(table_size, True); } unsigned int word_idx = 0; unsigned int offset = 0; unsigned int rec_len = 0; for (i=0, cch=cchar; i<th.n_icode; i++, cch++) { ichar[i] = cch->ucs4; /* ucs4 為 0 表示該筆紀錄是詞而不是字元 */ if (!ichar[i]) { /* usc4 改成指向 offset_table 索引,再 or 0x80000000,讓程式可以判別這是字元或是指向 offset table */ /* 紀錄詞的偏移位置 */ ichar[i] = WORD_MASK | offset; /* 計算下一個 offset */ rec_len = sizeof(cch->word_len) + cch->word_len; memcpy(word_table + offset, &cch->word_len, sizeof(cch->word_len)); memcpy(word_table + offset + sizeof(cch->word_len), cch->word, cch->word_len); offset += rec_len; //free(cch->word); } icode1[i] = (icode_t)(cch->key[0]); if (ret == ICODE_MODE2) icode2[i] = (icode_t)(cch->key[1]); } //free(cchar); }