コード例 #1
0
ファイル: rtc.c プロジェクト: frazahod/SUBGEN-NuLAB-EcoLAB-
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;
}
コード例 #2
0
ファイル: gencin.c プロジェクト: chinese-opendesktop/oxim
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++;
    }
}
コード例 #3
0
ファイル: gencin.c プロジェクト: chinese-opendesktop/oxim
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;
}
コード例 #4
0
ファイル: gencin.c プロジェクト: chinese-opendesktop/oxim
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);
}