/* * BRLTTY - A background process providing access to the console screen (when in * text mode) for a blind person using a refreshable braille display. * * Copyright (C) 1995-2021 by The BRLTTY Developers. * * BRLTTY comes with ABSOLUTELY NO WARRANTY. * * This is free software, placed under the terms of the * GNU Lesser General Public License, as published by the Free Software * Foundation; either version 2.1 of the License, or (at your option) any * later version. Please see the file LICENSE-LGPL for details. * * Web Page: http://brltty.app/ * * This software is maintained by Dave Mielke . */ #include "prologue.h" #include #include #include #include "log.h" #include "program.h" #include "options.h" #include "messages.h" #include "parse.h" #include "file.h" static char *opt_localeDirectory; static char *opt_localeSpecifier; static char *opt_domainName; static FILE *outputStream; static int opt_utf8Output; BEGIN_OPTION_TABLE(programOptions) { .word = "directory", .letter = 'd', .argument = strtext("path"), .setting.string = &opt_localeDirectory, .internal.adjust = fixInstallPath, .description = strtext("the locale directory containing the translations") }, { .word = "locale", .letter = 'l', .argument = strtext("specifier"), .setting.string = &opt_localeSpecifier, .description = strtext("the locale in which to look up a translation") }, { .word = "domain", .letter = 'n', .argument = strtext("name"), .setting.string = &opt_domainName, .description = strtext("the name of the domain containing the translations") }, { .word = "utf8", .letter = 'u', .setting.flag = &opt_utf8Output, .description = strtext("write the translations using UTF-8") }, END_OPTION_TABLE static int noOutputErrorYet (void) { if (!ferror(outputStream)) return 1; logMessage(LOG_ERR, "output error: %s", strerror(errno)); return 0; } static int putCharacter (char c) { fputc(c, outputStream); return noOutputErrorYet(); } static int putNewline (void) { return putCharacter('\n'); } static int putBytes (const char *bytes, size_t count) { while (count) { uint32_t last = count - 1; if (bytes[last] != '\n') break; count = last; } if (opt_utf8Output) { fwrite(bytes, 1, count, outputStream); } else { writeWithConsoleEncoding(outputStream, bytes, count); } return noOutputErrorYet(); } static int putString (const char *string) { return putBytes(string, strlen(string)); } static int putMessage (const Message *message) { return putBytes(getMessageText(message), getMessageLength(message)); } static int listTranslation (const Message *original, const Message *translation) { return putMessage(original) && putString(" -> ") && putMessage(translation) && putNewline(); } static int listTranslations (void) { uint32_t count = getMessageCount(); for (unsigned int index=0; index