cst_val *en_exp_real(const char *numstring) { char *aaa, *p; cst_val *r; if (numstring && (numstring[0] == '-')) r = cons_val(string_val("minus"), en_exp_real(&numstring[1])); else if (numstring && (numstring[0] == '+')) r = cons_val(string_val("plus"), en_exp_real(&numstring[1])); else if (((p=strchr(numstring,'e')) != 0) || ((p=strchr(numstring,'E')) != 0)) { aaa = cst_strdup(numstring); aaa[cst_strlen(numstring)-cst_strlen(p)] = '\0'; r = val_append(en_exp_real(aaa), cons_val(string_val("e"), en_exp_real(p+1))); cst_free(aaa); } else if ((p=strchr(numstring,'.')) != 0) { aaa = cst_strdup(numstring); aaa[cst_strlen(numstring)-cst_strlen(p)] = '\0'; r = val_append(en_exp_number(aaa), cons_val(string_val("point"), en_exp_digits(p+1))); cst_free(aaa); } else r = en_exp_number(numstring); /* I don't think you can get here */ return r; }
cst_val *en_exp_id(const char *numstring) { /* Expand numstring as pairs as in years or ids */ char aaa[3]; if ((cst_strlen(numstring) == 4) && (numstring[2] == '0') && (numstring[3] == '0')) { if (numstring[1] == '0') return en_exp_number(numstring); /* 2000, 3000 */ else { aaa[0] = numstring[0]; aaa[1] = numstring[1]; aaa[2] = '\0'; return val_append(en_exp_number(aaa), cons_val(string_val("hundred"),0)); } } else if ((cst_strlen(numstring) == 3) && (numstring[0] != '0') && (numstring[1] == '0') && (numstring[2] == '0')) { return cons_val(string_val(digit2num[numstring[0]-'0']), cons_val(string_val("hundred"),0)); } else if ((cst_strlen(numstring) == 2) && (numstring[0] == '0') && (numstring[1] == '0')) return cons_val(string_val("zero"), cons_val(string_val("zero"),NULL)); else if ((cst_strlen(numstring) == 2) && (numstring[0] == '0')) return cons_val(string_val("oh"), en_exp_digits(&numstring[1])); else if (((cst_strlen(numstring) == 4) && (numstring[1] == '0') && (numstring[2] == '0')) || (cst_strlen(numstring) < 3)) return en_exp_number(numstring); else if (cst_strlen(numstring)%2 == 1) { return cons_val(string_val(digit2num[numstring[0]-'0']), en_exp_id(&numstring[1])); } else { aaa[0] = numstring[0]; aaa[1] = numstring[1]; aaa[2] = '\0'; return val_append(en_exp_number(aaa),en_exp_id(&numstring[2])); } }
int flite_voice_add_lex_addenda(cst_voice *v, const cst_string *lexfile) { /* Add addenda in lexfile to current voice */ cst_lexicon *lex; const cst_val *lex_addenda = NULL; cst_val *new_addenda; lex = val_lexicon(feat_val(v->features,"lexicon")); if (feat_present(v->features, "lex_addenda")) lex_addenda = feat_val(v->features, "lex_addenda"); new_addenda = cst_lex_load_addenda(lex,lexfile); #if 0 printf("\naddenda: "); val_print(stdout,new_addenda); printf("\n"); #endif new_addenda = val_append(new_addenda,(cst_val *)lex_addenda); if (lex->lex_addenda) delete_val(lex->lex_addenda); lex->lex_addenda = new_addenda; return 0; }
val_ptr val_append0(val_ptr op, ...) { assert(op->type == T_STRING); va_list params; va_start(params, op); for(;;) { val_ptr v = va_arg(params, val_ptr); if (!v) break; val_append(op, v); } va_end(params); return op; }
cst_val *en_exp_number(const char *numstring) { /* Expand given token to list of words pronouncing it as a number */ int num_digits = cst_strlen(numstring); char part[4]; cst_val *p; int i; if (num_digits == 0) return NULL; else if (num_digits == 1) return en_exp_digits(numstring); else if (num_digits == 2) { if (numstring[0] == '0') { if (numstring[1] == '0') return 0; else return cons_val(string_val(digit2num[numstring[1]-'0']),0); } else if (numstring[1] == '0') return cons_val(string_val(digit2enty[numstring[0]-'0']),0); else if (numstring[0] == '1') return cons_val(string_val(digit2teen[numstring[1]-'0']),0); else return cons_val(string_val(digit2enty[numstring[0]-'0']), en_exp_digits(numstring+1)); } else if (num_digits == 3) { if (numstring[0] == '0') return en_exp_number(numstring+1); else return cons_val(string_val(digit2num[numstring[0]-'0']), cons_val(string_val("hundred"), en_exp_number(numstring+1))); } else if (num_digits < 7) { for (i=0; i < num_digits-3; i++) part[i] = numstring[i]; part[i]='\0'; p = en_exp_number(part); if (p == 0) /* no thousands */ return en_exp_number(numstring+i); else return val_append(p,cons_val(string_val("thousand"), en_exp_number(numstring+i))); } else if (num_digits < 10) { for (i=0; i < num_digits-6; i++) part[i] = numstring[i]; part[i]='\0'; p = en_exp_number(part); if (p == 0) /* no millions */ return en_exp_number(numstring+i); else return val_append(p,cons_val(string_val("million"), en_exp_number(numstring+i))); } else if (num_digits < 13) { /* If there are pedantic brits out there, tough!, 10^9 is a billion */ for (i=0; i < num_digits-9; i++) part[i] = numstring[i]; part[i]='\0'; p = en_exp_number(part); if (p == 0) /* no billions */ return en_exp_number(numstring+i); else return val_append(p,cons_val(string_val("billion"), en_exp_number(numstring+i))); } else /* Way too many digits here, to be a number */ { return en_exp_digits(numstring); } }