static size_t formatLogTransformedCommandData (char *buffer, size_t size, const void *data) { const LogTransformedCommandData *cmd = data; size_t length; STR_BEGIN(buffer, size); STR_PRINTF("command: "); { size_t sublength = formatCommand(STR_NEXT, STR_LEFT, cmd->oldCommand); STR_ADJUST(sublength); } STR_PRINTF(" -> "); { size_t sublength = formatCommand(STR_NEXT, STR_LEFT, cmd->newCommand); STR_ADJUST(sublength); } length = STR_LENGTH; STR_END return length; }
static size_t formatCommand (char *buffer, size_t size, int command) { size_t length; STR_BEGIN(buffer, size); STR_PRINTF("%06X (", command); { size_t length = describeCommand(command, STR_NEXT, STR_LEFT, CDO_IncludeName | CDO_IncludeOperand); STR_ADJUST(length); } STR_PRINTF(")"); length = STR_LENGTH; STR_END; return length; }
void logData (int level, LogDataFormatter *formatLogData, const void *data) { const char *prefix = NULL; if (level & LOG_FLG_CATEGORY) { int category = level & LOG_MSK_CATEGORY; if (!logCategoryFlags[category]) return; level = categoryLogLevel; { const LogCategoryEntry *ctg = &logCategoryTable[category]; prefix = ctg->prefix; } } { int write = level <= systemLogLevel; int print = level <= stderrLogLevel; if (write || print) { int oldErrno = errno; char record[0X1000]; STR_BEGIN(record, sizeof(record)); if (prefix) STR_PRINTF("%s: ", prefix); { size_t sublength = formatLogData(STR_NEXT, STR_LEFT, data); STR_ADJUST(sublength); } STR_END if (write) { writeLogRecord(record); #if defined(WINDOWS) if (windowsEventLog != INVALID_HANDLE_VALUE) { const char *strings[] = {record}; ReportEvent(windowsEventLog, toWindowsEventType(level), 0, 0, NULL, ARRAY_COUNT(strings), 0, strings, NULL); } #elif defined(__MSDOS__) #elif defined(__ANDROID__) __android_log_write(toAndroidLogPriority(level), PACKAGE_TARNAME, record); #elif defined(HAVE_SYSLOG_H) if (syslogOpened) syslog(level, "%s", record); #endif /* write system log */ } if (print) { FILE *stream = stderr; lockStream(stream); if (logPrefixStack) { const char *prefix = logPrefixStack->prefix; if (*prefix) { fputs(prefix, stream); fputs(": ", stream); } } fputs(record, stream); fputc('\n', stream); flushStream(stream); unlockStream(stream); } errno = oldErrno; } }
size_t describeCommand (int command, char *buffer, size_t size, CommandDescriptionOption options) { size_t length; STR_BEGIN(buffer, size); unsigned int arg = BRL_ARG_GET(command); unsigned int arg1 = BRL_CODE_GET(ARG, command); unsigned int arg2 = BRL_CODE_GET(EXT, command); const CommandEntry *cmd = getCommandEntry(command); if (!cmd) { STR_PRINTF("%s: %06X", gettext("unknown command"), command); } else { if (options & CDO_IncludeName) { STR_PRINTF("%s: ", cmd->name); } if (cmd->isToggle && (command & BRL_FLG_TOGGLE_MASK)) { const char *text = gettext(cmd->description); size_t length = strlen(text); char buffer[length + 1]; char *delimiter; strcpy(buffer, text); delimiter = strchr(buffer, '/'); if (delimiter) { char *source; char *target; if (command & BRL_FLG_TOGGLE_ON) { target = delimiter; if (!(source = strchr(target, ' '))) source = target + strlen(target); } else if (command & BRL_FLG_TOGGLE_OFF) { { char oldDelimiter = *delimiter; *delimiter = 0; target = strrchr(buffer, ' '); *delimiter = oldDelimiter; } target = target? (target + 1): buffer; source = delimiter + 1; } else { goto toggleReady; } memmove(target, source, (strlen(source) + 1)); } toggleReady: STR_PRINTF("%s", buffer); } else { STR_PRINTF("%s", gettext(cmd->description)); } if (options & CDO_IncludeOperand) { if (cmd->isCharacter) { STR_PRINTF(" [U+%04X]", arg); } if (cmd->isBraille) { int none = 1; STR_PRINTF(" ["); { static const int dots[] = { BRL_DOTC, BRL_DOT1, BRL_DOT2, BRL_DOT3, BRL_DOT4, BRL_DOT5, BRL_DOT6, BRL_DOT7, BRL_DOT8, 0 }; const int *dot = dots; while (*dot) { if (command & *dot) { none = 0; if (dot == dots) { STR_PRINTF("C"); } else { unsigned int number = dot - dots; STR_PRINTF("%u", number); } } dot += 1; } } if (none) STR_PRINTF("%s", gettext("space")); STR_PRINTF("]"); } if (cmd->isKeyboard) { STR_PRINTF(" [\\X%02X]", arg1); } if (cmd->isColumn && !cmd->isRouting && ( (arg == BRL_MSK_ARG) /* key event processing */ || ((options & CDO_DefaultOperand) && !arg) /* key table listing */ )) { STR_PRINTF(" %s", gettext("at cursor")); } else if (cmd->isColumn || cmd->isRow || cmd->isOffset) { STR_PRINTF(" #%u", arg - (cmd->code & BRL_MSK_ARG) + 1); } else if (cmd->isRange) { STR_PRINTF(" #%u-%u", arg1, arg2); } if (cmd->isInput) { size_t length = formatCommandModifiers(STR_NEXT, STR_LEFT, command, commandModifierTable_input); STR_ADJUST(length); } if (cmd->isCharacter) { size_t length = formatCommandModifiers(STR_NEXT, STR_LEFT, command, commandModifierTable_character); STR_ADJUST(length); } if (cmd->isKeyboard) { size_t length = formatCommandModifiers(STR_NEXT, STR_LEFT, command, commandModifierTable_keyboard); STR_ADJUST(length); } } if (cmd->isMotion) { if (cmd->isRow) { if (command & BRL_FLG_LINE_TOLEFT) { STR_PRINTF(", %s", gettext("left margin")); } if (command & BRL_FLG_LINE_SCALED) { STR_PRINTF(", %s", gettext("normalized position")); } } if (command & BRL_FLG_MOTION_ROUTE) { STR_PRINTF(", %s", gettext("drag cursor")); } } } length = STR_LENGTH; STR_END; return length; }