/* Apply all transformations in a list of transformations into a result string. input_list = [{ type: TRANS_APPEND, key: "a" }, { type: TRANS_TONE, key: "s", effect: TONE_ACUTE, targets: [input_list[0]] }] output = "á" */ void flatten(bgstr output, struct List *transList) { int output_index = 0; struct ListItem *iterator = transList->first; while (iterator != NULL) { struct TransT trans = *((struct TransT *) iterator->item); switch (trans.rule->type) { case TRANS_APPEND: bgstrAssign(output + output_index, trans.rule->key); trans.dest_index = output_index; output_index++; // Only TRANS_APPEND creates a new char break; case TRANS_TONE: addToneToChar(output + trans.target->dest_index, trans.rule->transMethod.tone); break; case TRANS_MARK: addMarkToChar(output + trans.target->dest_index, trans.rule->transMethod.mark); break; } iterator = iterator->next; } }
int testAddMarkToChar(void) { initTestCase("Add mark to char"); bgstr target = "a"; addMarkToChar(target, MARK_HAT); assertStr("â", target); // Char should stay the same if non-compatible mark is applied bgstrAssign(target, "a"); addMarkToChar(target, MARK_DASH); assertStr("a", target); // Should change/remove mark bgstrAssign(target, "â"); addMarkToChar(target, MARK_NONE); assertStr("a", target); // Should work with upper case chars bgstrAssign(target, "D"); addMarkToChar(target, MARK_DASH); assertStr("Đ", target); return finishTestCase(); }
ustring addMarkToChar (guint ch, Marks mark) { return addMarkToChar (_(ch), mark); }
ustring addMarkToChar (const gchar *ch, Marks mark) { return addMarkToChar (_(ch), mark); }