int
main(int argc, char *argv[])
{
	bin_mdef_t *mdef;
	dict_t *dict;
	cmd_ln_t *config;

	int i;
	char buf[100];

	TEST_ASSERT(config = cmd_ln_init(NULL, NULL, FALSE,
						   "-dict", MODELDIR "/en-us/cmudict-en-us.dict",
						   "-fdict", MODELDIR "/en-us/en-us/noisedict",
						   NULL));

	/* Test dictionary in standard fashion. */
	TEST_ASSERT(mdef = bin_mdef_read(NULL, MODELDIR "/en-us/en-us/mdef"));
	TEST_ASSERT(dict = dict_init(config, mdef, NULL));

	printf("Word ID (CARNEGIE) = %d\n",
	       dict_wordid(dict, "CARNEGIE"));
	printf("Word ID (ASDFASFASSD) = %d\n",
	       dict_wordid(dict, "ASDFASFASSD"));

	TEST_EQUAL(0, dict_write(dict, "_cmu07a.dic", NULL));
	TEST_EQUAL(0, system("diff -uw " MODELDIR "/en-us/cmudict-en-us.dict _cmu07a.dic"));

	dict_free(dict);
	bin_mdef_free(mdef);

	/* Now test an empty dictionary. */
	TEST_ASSERT(dict = dict_init(NULL, NULL, NULL));
	printf("Word ID(<s>) = %d\n", dict_wordid(dict, "<s>"));
	TEST_ASSERT(BAD_S3WID != dict_add_word(dict, "FOOBIE", NULL, 0));
	TEST_ASSERT(BAD_S3WID != dict_add_word(dict, "BLETCH", NULL, 0));
	printf("Word ID(FOOBIE) = %d\n", dict_wordid(dict, "FOOBIE"));
	printf("Word ID(BLETCH) = %d\n", dict_wordid(dict, "BLETCH"));
	TEST_ASSERT(dict_real_word(dict, dict_wordid(dict, "FOOBIE")));
	TEST_ASSERT(dict_real_word(dict, dict_wordid(dict, "BLETCH")));
	TEST_ASSERT(!dict_real_word(dict, dict_wordid(dict, "</s>")));
	dict_free(dict);

	/* Test to add 500k words. */
	TEST_ASSERT(dict = dict_init(NULL, NULL, NULL));
	for (i = 0; i < 500000; i++) {
	    sprintf(buf, "word_%d", i);
    	    TEST_ASSERT(BAD_S3WID != dict_add_word(dict, buf, NULL, 0));
	}
	dict_free(dict);

	cmd_ln_free_r(config);

	return 0;
}
Beispiel #2
0
int
ps_save_dict(ps_decoder_t *ps, char const *dictfile,
             char const *format)
{
    return dict_write(ps->dict, dictfile, format);
}
Beispiel #3
0
uforth_stat exec(CELL wd_idx, char toplevelprim,uint8_t last_exec_rdix) {
  while(1) {
    if (wd_idx == 0) {
      uforth_abort_request(ABORT_ILLEGAL);
      uforth_abort();           /* bad instruction */
      return E_NOT_A_WORD;
    }
    cmd = uforth_dict[wd_idx++];
    switch (cmd) {
    case 0:
      uforth_abort_request(ABORT_ILLEGAL);
      uforth_abort();           /* bad instruction */
      return E_NOT_A_WORD;
    case ABORT:
      uforth_abort_request(ABORT_WORD);
      break;
    case IMMEDIATE:
      make_immediate();
      break;
    case IRAM_FETCH:
      r1 = dpop();
      dpush(((DCELL*)uforth_iram)[r1]);
      break;
    case URAM_BASE_ADDR:
      dpush((RAM_START_IDX + (sizeof(struct uforth_iram))) + curtask_idx);
      break;
    case SKIP_IF_ZERO:
      r1 = dpop(); r2 = dpop();
      if (r2 == 0) wd_idx += r1;
      break;
    case DROP:
      dpop();
      break;
    case JMP:
      wd_idx = dpop();
      break;
    case JMP_IF_ZERO:
      r1 = dpop(); r2 = dpop();
      if (r2 == 0) wd_idx = r1;
      break;
    case HERE:
      dpush(dict_here());
      break;
    case INCR_HERE:
      dict_incr_here(1);
      break;
    case LIT:  
      dpush(uforth_dict[wd_idx++]);
      break;
    case DLIT:  
      dpush((((uint32_t)uforth_dict[wd_idx])<<16) |
            (uint16_t)uforth_dict[wd_idx+1]); 
      wd_idx+=2;
      break;
    case LESS_THAN:
      r1 = dpop(); r2 = dpop();
      dpush(r2 < r1);
      break;
    case ABS:
      r1 = dpop(); 
      dpush(abs32(r1)); 
      break;
    case ADD:
      r1 = dpop(); r2 = dtop(); 
      dtop() = r1+r2;
      break;
    case SUB:
      r1 = dpop(); r2 = dtop(); 
      dtop() = r2-r1;
      break;
    case AND:
      r1 = dpop(); r2 = dtop();
      dtop() = r1&r2;
      break;
    case LSHIFT:
      r1 = dpop(); r2 = dtop();
      dtop() = r2<<r1;
      break;
    case RSHIFT:
      r1 = dpop(); r2 = dtop(); 
      dtop() = r2>>r1;
      break;
    case OR:
      r1 = dpop(); r2 = dtop(); 
      dtop() = r1|r2;
      break;
    case XOR:
      r1 = dpop(); r2 = dtop(); 
      dtop() = r1^r2;
      break;
    case INVERT:
      dtop() = ~dtop();
      break;
    case MULT:
      r1 = dpop(); r2 = dtop(); 
      dtop() = r1*r2;
      break;
    case DIV :
      r1 = dpop(); r2 = dtop(); 
      dtop() = r2/r1;
      break;
    case SWAP:
      r1 = dpop(); r2 = dpop(); 
      dpush(r1); dpush(r2);
      break;
    case RPICK:
      r1 = dpop();
      r2 = rpick(r1);
      dpush(r2);
      break;
    case PICK:
      r1 = dpop();
      r2 = dpick(r1);
      dpush(r2);
      break;
    case EQ_ZERO:
      dtop() = (dtop() == 0);
      break;
    case RPUSH:
      rpush(dpop());
      break;
    case RPOP:
      dpush(rpop());
      break;
    case FETCH:
      r1 = dpop();
      if (r1 >= RAM_START_IDX) {
        dpush(uforth_ram[r1-RAM_START_IDX]);
      } else {
        dpush(uforth_dict[r1]);
      }
      break;
    case STORE:
      r1 = dpop();
      r2 = dpop();
      if (r1 >= RAM_START_IDX) {
        uforth_ram[r1-RAM_START_IDX] = r2;
      } else {
        dict_write(r1,r2);
      }
      break;
    case EXEC:
      r1 = dpop();
      rpush(wd_idx);
      wd_idx = r1;
      break;
    case EXIT:
      if (uforth_uram->ridx > last_exec_rdix) return OK;
      wd_idx = rpop();
      break;
    case CNEXT:
      b = next_char();
      dpush(b);
      break;
    case STR_STORE:
      r1 = dpop();
      r2 = uforth_ram[(r1-RAM_START_IDX)];
      str1 =(char*)&uforth_ram[(r1-RAM_START_IDX)+1];
      str1+=r2;
      b = dpop();
      *str1 = b;
      uforth_ram[(r1-RAM_START_IDX)]++;
      break;
    case NEXT:
      str2 = PAD_STR;
      str1 = uforth_next_word();
      memcpy(str2,str1, uforth_iram->currwordlen);
      PAD_STRLEN = uforth_iram->currwordlen;            /* length */
      dpush(PAD_ADDR+RAM_START_IDX);
      break;
    case COMMA_STRING:
      if (uforth_iram->compiling > 0) {
        dict_append(LIT);
        dict_append(dict_here()+4); /* address of counted string */

        dict_append(LIT);
        rpush(dict_here());     /* address holding adress  */
        dict_incr_here(1);      /* place holder for jump address */
        dict_append(JMP);
      }
      rpush(dict_here());
      dict_incr_here(1);        /* place holder for count*/
      r1 = 0;
      b = next_char();          /* eat space */
      while (b != 0 && b!= '"') {
        r2 = 0;
        b = next_char();
        if (b == 0 || b == '"') break;
        r2 |= BYTEPACK_FIRST(b);
        ++r1;
        b = next_char();
        if (b != 0 && b != '"') {
          ++r1;
          r2 |= BYTEPACK_SECOND(b);
        }
        dict_append(r2);
      } 
      dict_write(rpop(),r1);
      if (uforth_iram->compiling > 0) {
        dict_write(rpop(),dict_here()); /* jump over string */
      }
      break;
    case CALLC:
      r1 = c_handle();
      if (r1 != OK) return (uforth_stat)r1;
      break;
    case VAR_ALLOT:
      dpush(VAR_ALLOT_1());
      break;
    case DEF:
      uforth_iram->compiling = 1;
    case _CREATE:
      dict_start_def();
      uforth_next_word();
      make_word(uforth_iram->currword,uforth_iram->currwordlen);
      if (cmd == _CREATE) {
        dict_end_def();
      } else {
        defining_word = dict_here();
      }
      break;
    case COMMA:
      dict_append(dpop());
      break;
    case DCOMMA:
      r1 = dpop();
      dict_append((uint32_t)r1>>16);
      dict_append(r1);
      break;
    case PARSE_NUM:
      r1 = dpop();
      str1=uforth_count_str((CELL)r1,(CELL*)&r1);
      str1[r1] = '\0';
      dpush(parse_num(str1,uforth_uram->base));
      break;
    case PARSE_FNUM:
      r1 = dpop();
      str1=uforth_count_str((CELL)r1,(CELL*)&r1);
      str1[r1] = '.';
      str1[r1+1] = '\0';
      dpush(parse_num(str1,uforth_uram->base));
      break;
    case FIND:
    case FIND_ADDR:
      r1 = dpop();
      str1=uforth_count_str((CELL)r1,(CELL*)&r1);
      r1 = find_word(str1, r1, &r2, 0, &b);
      if (r1 > 0) {
        if (b) r1 = uforth_dict[r1];
      }
      if (cmd == FIND) {
        dpush(r1);
      } else {
        dpush(r2);
      }
      break;
    case POSTPONE:
      str1 = uforth_next_word();
      r1 = find_word(str1, uforth_iram->currwordlen, 0, 0, &b);
      if (r1 == 0) {
        uforth_abort_request(ABORT_NAW);
        uforth_abort();
        return E_NOT_A_WORD;
      }
      if (b) {
        dict_append(uforth_dict[r1]);
      } else {
        dict_append(r1);
      }
      break;
    case MOVE:
      r1 = dpop();              /* count */
      rpush(r1);

      r1 = dpop();              /* dest */
      r2 = dpop();              /* source */

      if (r1 < RAM_START_IDX) {
        (void)rpop();
        uforth_abort_request(ABORT_ILLEGAL);
        uforth_abort();         /* can't cmove into dictionary */
        return E_ABORT;
      }
      str1 =(char*)&uforth_ram[(r1-RAM_START_IDX)];

      if (r2 > RAM_START_IDX) {
        str2 =(char*)&uforth_ram[(r2-RAM_START_IDX)];
      } else {
        str2 =  (char*)&uforth_dict[r2];
      }
      memcpy(str1, str2, rpop());
      break;
    case MAKE_TASK:
      r1 = dpop();
      r2 = dpop();
      r3 = dpop();
      r4 = dpop();
      uforth_make_task(r1-RAM_START_IDX, r2, r3, r4);
      dpush(r1-RAM_START_IDX);
      break;
    case SELECT_TASK:
      uforth_select_task(dpop());
      break;
    default:
      /* Execute user word by calling until we reach primitives */
      rpush(wd_idx);
      wd_idx = uforth_dict[wd_idx-1]; /* wd_idx-1 is current word */
      break;
    }
    if (uforth_aborting()) {
      uforth_abort();
      return E_ABORT;
    }
    if (toplevelprim) return OK;
  } /* while(1) */
}
Beispiel #4
0
void store_prim(char* str, CELL val) {
  make_word(str,strlen(str));
  dict_append(val);
  dict_append(EXIT);
  dict_write((dict->last_word_idx+1), uforth_dict[dict->last_word_idx+1]|PRIM_BIT);
}
Beispiel #5
0
void make_immediate(void) {
  dict_write((dict->last_word_idx+1), uforth_dict[dict->last_word_idx+1]|IMMEDIATE_BIT);
}