unsigned char convertCharacterToDots (TextTable *table, wchar_t character) { switch (character & ~UNICODE_CELL_MASK) { case UNICODE_BRAILLE_ROW: return character & UNICODE_CELL_MASK; case 0XF000: { wint_t wc = convertCharToWchar(character & UNICODE_CELL_MASK); if (wc == WEOF) goto unknownCharacter; character = wc; } default: { { SetBrailleRepresentationData sbr = { .table = table, .dots = 0 }; if (handleBestCharacter(character, setBrailleRepresentation, &sbr)) { return sbr.dots; } } unknownCharacter: { const unsigned char *cell; if ((cell = getUnicodeCellEntry(table, UNICODE_REPLACEMENT_CHARACTER))) return *cell; if ((cell = getUnicodeCellEntry(table, WC_C('?')))) return *cell; } return BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8; } } } wchar_t convertDotsToCharacter (TextTable *table, unsigned char dots) { const TextTableHeader *header = table->header.fields; if (BITMASK_TEST(header->dotsCharacterDefined, dots)) return header->dotsToCharacter[dots]; return UNICODE_REPLACEMENT_CHARACTER; } int replaceTextTable (const char *directory, const char *name) { int ok = 0; char *path; if ((path = makeTextTablePath(directory, name))) { TextTable *newTable; logMessage(LOG_DEBUG, "compiling text table: %s", path); if ((newTable = compileTextTable(path))) { TextTable *oldTable = textTable; textTable = newTable; destroyTextTable(oldTable); ok = 1; } else { logMessage(LOG_ERR, "%s: %s", gettext("cannot compile text table"), path); } free(path); } if (!ok) logMessage(LOG_ERR, "%s: %s", gettext("cannot load text table"), name); return ok; }
unsigned char convertCharacterToDots (TextTable *table, wchar_t character) { switch (character & ~UNICODE_CELL_MASK) { case UNICODE_BRAILLE_ROW: return character & UNICODE_CELL_MASK; case 0XF000: { wint_t wc = convertCharToWchar(character & UNICODE_CELL_MASK); if (wc == WEOF) break; character = wc; } default: { { unsigned int counter = 0; while (++counter < 0X10) { const UnicodeRowEntry *row = getUnicodeRowEntry(table, character); if (row) { unsigned int cellNumber = UNICODE_CELL_NUMBER(character); if (BITMASK_TEST(row->cellDefined, cellNumber)) { return row->cells[cellNumber]; } if (BITMASK_TEST(row->cellAliased, cellNumber)) { const TextTableAliasEntry *alias = findTextTableAlias(table, character); if (alias) { character = alias->to; continue; } } } break; } } if (table->options.tryBaseCharacter) { SetBrailleRepresentationData sbr = { .table = table, .dots = 0 }; if (handleBestCharacter(character, setBrailleRepresentation, &sbr)) { return sbr.dots; } } break; } } { const unsigned char *cell; if ((cell = getUnicodeCellEntry(table, UNICODE_REPLACEMENT_CHARACTER))) return *cell; if ((cell = getUnicodeCellEntry(table, WC_C('?')))) return *cell; } return BRL_DOT_1 | BRL_DOT_2 | BRL_DOT_3 | BRL_DOT_4 | BRL_DOT_5 | BRL_DOT_6 | BRL_DOT_7 | BRL_DOT_8; }