int isNumber (int *number, const wchar_t *characters, int length) { if (length > 0) { char string[length + 1]; string[length] = 0; { int index; for (index=0; index<length; index+=1) { wchar_t wc = characters[index]; if (!iswLatin1(wc)) return 0; string[index] = wc; } } { char *end; long value = strtol(string, &end, 0); if (!*end) { *number = value; return 1; } } } return 0; }
static int brl_writeWindow(BrailleDisplay *brl, const wchar_t *text) { if(text) { char bytes[brl->textColumns]; int i; for(i = 0; i < brl->textColumns; ++i) { wchar_t character = text[i]; bytes[i] = iswLatin1(character)? character: '?'; } braille_write(bytes, brl->textColumns); if(brl->cursor >= 0) { braille_filter(translateOutputCell(cursorDots()), brl->cursor); } braille_render(); } return 1; }
wint_t convertCharToWchar (char c) { if (getCharset()) { uint16_t wc = characterSet->toUnicode[(unsigned char)c & 0XFF]; if (wc || !c) if ((sizeof(wchar_t) > 1) || iswLatin1(wc)) return wc; } return WEOF; }
static int writeVisualText (BrailleDisplay *brl) { unsigned char bytes[brl->textColumns]; int i; for (i=0; i<brl->textColumns; ++i) { wchar_t character = visualText[i]; bytes[i] = iswLatin1(character)? character: '?'; } return writePacket(brl, 2, bytes, brl->textColumns); }
void setKeyModifiers (ScreenKey *key, ScreenKey which) { if (!isSpecialKey(*key)) { wchar_t character = *key & SCR_KEY_CHAR_MASK; ScreenKey modifiers = *key & ~SCR_KEY_CHAR_MASK; if (which & (SCR_KEY_UPPER | SCR_KEY_SHIFT)) { if (!(modifiers & (SCR_KEY_UPPER | SCR_KEY_SHIFT))) { if (iswupper(character)) { character = towlower(character); if (which & SCR_KEY_UPPER) { modifiers |= SCR_KEY_UPPER; } else { modifiers |= SCR_KEY_SHIFT; } } } } else { if (modifiers & (SCR_KEY_UPPER | SCR_KEY_SHIFT)) { if (iswalpha(character)) { character = towupper(character); modifiers &= ~SCR_KEY_SHIFT; } modifiers &= ~SCR_KEY_UPPER; } } if (which & SCR_KEY_CONTROL) { if (!(modifiers & SCR_KEY_CONTROL)) { if (character < 0X20) { character |= 0X60; modifiers |= SCR_KEY_CONTROL; } } } else { if (modifiers & SCR_KEY_CONTROL) { if (iswLatin1(character)) { if ((character & 0X6F) == 0X2F) { character |= 0X50; } else { character &= 0X9F; } } modifiers &= ~SCR_KEY_CONTROL; } } *key = character | modifiers; } }
static int getByteOperand (DataFile *file, unsigned char *byte) { DataString string; const char *description = "local character"; if (getDataString(file, &string, 1, description)) { if ((string.length == 1) && iswLatin1(string.characters[0])) { *byte = string.characters[0]; return 1; } else { reportDataError(file, "invalid %s: %.*" PRIws, description, string.length, string.characters); } } return 0; }
int main (int argc, char *argv[]) { ProgramExitStatus exitStatus; void *driverObject; { static const OptionsDescriptor descriptor = { OPTION_TABLE(programOptions), .applicationName = "scrtest", .argumentsSummary = "[parameter=value ...]" }; PROCESS_OPTIONS(descriptor, argc, argv); } if ((screen = loadScreenDriver(opt_screenDriver, &driverObject, opt_driversDirectory))) { const char *const *parameterNames = getScreenParameters(screen); char **parameterSettings; if (!parameterNames) { static const char *const noNames[] = {NULL}; parameterNames = noNames; } { const char *const *name = parameterNames; unsigned int count; char **setting; while (*name) ++name; count = name - parameterNames; if (!(parameterSettings = malloc((count + 1) * sizeof(*parameterSettings)))) { logMallocError(); return PROG_EXIT_FATAL; } setting = parameterSettings; while (count--) *setting++ = ""; *setting = NULL; } while (argc) { char *assignment = *argv++; int ok = 0; char *delimiter = strchr(assignment, '='); if (!delimiter) { logMessage(LOG_ERR, "missing screen parameter value: %s", assignment); } else if (delimiter == assignment) { logMessage(LOG_ERR, "missing screen parameter name: %s", assignment); } else { size_t nameLength = delimiter - assignment; const char *const *name = parameterNames; while (*name) { if (strncasecmp(assignment, *name, nameLength) == 0) { parameterSettings[name - parameterNames] = delimiter + 1; ok = 1; break; } ++name; } if (!ok) logMessage(LOG_ERR, "invalid screen parameter: %s", assignment); } if (!ok) return PROG_EXIT_SYNTAX; --argc; } if (constructScreenDriver(parameterSettings)) { ScreenDescription description; int left, top, width, height; describeScreen(&description); printf("Screen: %dx%d\n", description.cols, description.rows); printf("Cursor: [%d,%d]\n", description.posx, description.posy); if (setRegion(&left, opt_boxLeft, "starting column", &width, opt_boxWidth, description.cols, "region width")) { if (setRegion(&top, opt_boxTop, "starting row", &height, opt_boxHeight, description.rows, "region height")) { printf("Region: %dx%d@[%d,%d]\n", width, height, left, top); { ScreenCharacter buffer[width * height]; if (readScreen(left, top, width, height, buffer)) { int line; for (line=0; line<height; line++) { int column; for (column=0; column<width; column++) { wchar_t character = buffer[line * width + column].text; if (!iswLatin1(character)) { putchar('?'); } else if (!isprint(character)) { putchar('*'); } else { putchar(character); } } putchar('\n'); } exitStatus = PROG_EXIT_SUCCESS; } else { logMessage(LOG_ERR, "Can't read screen."); exitStatus = PROG_EXIT_FATAL; } } } else { exitStatus = PROG_EXIT_SYNTAX; } } else { exitStatus = PROG_EXIT_SYNTAX; } } else { logMessage(LOG_ERR, "can't open screen."); exitStatus = PROG_EXIT_FATAL; } destructScreenDriver(); } else { logMessage(LOG_ERR, "can't load screen driver."); exitStatus = PROG_EXIT_FATAL; } return exitStatus; }