int main (int argc, char *argv[]) { ProgramExitStatus exitStatus = PROG_EXIT_FATAL; { static const OptionsDescriptor descriptor = { OPTION_TABLE(programOptions), .applicationName = "brltty-trtxt", .argumentsSummary = "[{input-file | -} ...]" }; PROCESS_OPTIONS(descriptor, argc, argv); } if (getTable(&inputTable, opt_inputTable)) { if (getTable(&outputTable, opt_outputTable)) { outputStream = stdout; outputName = standardOutputName; toDots = inputTable? toDots_mapped: toDots_unicode; toCharacter = outputTable? toCharacter_mapped: toCharacter_unicode; if (argc) { do { const char *file = argv[0]; FILE *stream; if (strcmp(file, standardStreamArgument) == 0) { if (!processStream(stdin, standardInputName)) break; } else if ((stream = fopen(file, "r"))) { int ok = processStream(stream, file); fclose(stream); if (!ok) break; } else { logMessage(LOG_ERR, "cannot open file: %s: %s", file, strerror(errno)); exitStatus = PROG_EXIT_SEMANTIC; break; } argv += 1, argc -= 1; } while (argc); if (!argc) exitStatus = PROG_EXIT_SUCCESS; } else if (processStream(stdin, standardInputName)) { exitStatus = PROG_EXIT_SUCCESS; } if (outputTable) destroyTextTable(outputTable); } if (inputTable) destroyTextTable(inputTable); } return exitStatus; }
int replaceTextTable (const char *directory, const char *name) { TextTable *newTable = NULL; if (name) { char *path; if ((path = makeTextTablePath(directory, name))) { logMessage(LOG_DEBUG, "compiling text table: %s", path); if (!(newTable = compileTextTable(path))) { logMessage(LOG_ERR, "%s: %s", gettext("cannot compile text table"), path); } free(path); } } else { newTable = &internalTextTable; } if (newTable) { TextTable *oldTable = textTable; textTable = newTable; destroyTextTable(oldTable); return 1; } logMessage(LOG_ERR, "%s: %s", gettext("cannot load text table"), name); return 0; }
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; }