int ml_unicode_renderer(varnam *handle, vtoken *previous, vtoken *current, strbuf *output) { int rc; vtoken *virama; bool removed; rc = vst_get_virama (handle, &virama); if (rc) return rc; if (previous != NULL && current->type == VARNAM_TOKEN_VOWEL && strcmp(current->pattern, "r") == 0) { strbuf_add (output, current->value3); return VARNAM_SUCCESS; } if (strcmp(current->tag, RENDER_VALUE2_TAG) == 0 && previous != NULL) { #ifdef _VARNAM_VERBOSE varnam_debug (handle, "ml-unicode-renderer - Found %s tag", RENDER_VALUE2_TAG); #endif strbuf_add(output, current->value2); return VARNAM_SUCCESS; } if (current->type == VARNAM_TOKEN_VOWEL && previous != NULL && strcmp(previous->tag, CHIL_TAG) == 0) { removed = strbuf_remove_from_last (output, previous->value1); if (!removed) { removed = strbuf_remove_from_last (output, previous->value2); } if (removed) { strbuf_add (output, previous->value3); strbuf_add (output, current->value2); return VARNAM_SUCCESS; } } return VARNAM_PARTIAL_RENDERING; }
int varnam_create_token( varnam *handle, const char *pattern, const char *value1, const char *value2, int token_type, int match_type, int buffered) { int rc; size_t pattern_len; char p[VARNAM_SYMBOL_MAX], v1[VARNAM_SYMBOL_MAX], v2[VARNAM_SYMBOL_MAX]; struct token *virama; set_last_error (handle, NULL); if (handle == NULL || pattern == NULL || value1 == NULL) return VARNAM_ARGS_ERROR; if (strlen(pattern) > VARNAM_SYMBOL_MAX || strlen(value1) > VARNAM_SYMBOL_MAX || (value2 != NULL && strlen(value2) > VARNAM_SYMBOL_MAX)) { set_last_error (handle, "Length of pattern, value1 or value2 should be less than VARNAM_SYMBOL_MAX"); return VARNAM_ARGS_ERROR; } if (match_type != VARNAM_MATCH_EXACT && match_type != VARNAM_MATCH_POSSIBILITY) { set_last_error (handle, "match_type should be either VARNAM_MATCH_EXACT or VARNAM_MATCH_POSSIBILITY"); return VARNAM_ARGS_ERROR; } if (buffered) { rc = vst_start_buffering (handle); if (rc != VARNAM_SUCCESS) return rc; } pattern_len = strlen(pattern); if (token_type == VARNAM_TOKEN_CONSONANT && handle->internal->config_use_dead_consonants) { rc = vst_get_virama(handle, &virama); if (rc != VARNAM_SUCCESS) return rc; else if (virama == NULL) { set_last_error (handle, "Virama needs to be set before auto generating dead consonants"); return VARNAM_ERROR; } if (utf8_ends_with(value1, virama->value1)) { token_type = VARNAM_TOKEN_DEAD_CONSONANT; } else if (can_generate_dead_consonant(pattern, pattern_len)) { substr(p, pattern, 1, (int) (pattern_len - 1)); snprintf(v1, VARNAM_SYMBOL_MAX, "%s%s", value1, virama->value1); if (value2 != NULL) snprintf(v2, VARNAM_SYMBOL_MAX, "%s%s", value2, virama->value1); else v2[0] = '\0'; rc = vst_persist_token (handle, p, v1, v2, VARNAM_TOKEN_DEAD_CONSONANT, match_type); if (rc != VARNAM_SUCCESS) { if (buffered) vst_discard_changes(handle); return rc; } } } rc = vst_persist_token (handle, pattern, value1, value2, token_type, match_type); if (rc != VARNAM_SUCCESS) { if (buffered) vst_discard_changes(handle); } return rc; }