int any_DSR(MENU_ARGS, const char *text, void (*explain) (char *report)) { char *report; unsigned pmode = (unsigned) ((*text == '?') ? 1 : 0); vt_move(1, 1); printf("Testing DSR: %s\n", the_title); set_tty_raw(TRUE); set_tty_echo(FALSE); do_csi("%s", text); report = get_reply(); vt_move(3, 10); chrprint(report); if ((report = skip_csi(report)) != 0 && strlen(report) > (1 + pmode) && (!pmode || (*report++ == '?'))) { if (explain != 0) (*explain) (report); else show_result(SHOW_SUCCESS); } else { show_result(SHOW_FAILURE); } restore_ttymodes(); vt_move(max_lines - 1, 1); return MENU_HOLD; }
/* Test Window Report - VT340, VT420 */ static int tst_DECRQDE(MENU_ARGS) { char *report; char chr; int Ph, Pw, Pml, Pmt, Pmp; vt_move(1, 1); println("Testing DECRQDE/DECRPDE Window Report"); set_tty_raw(TRUE); set_tty_echo(FALSE); do_csi("\"v"); report = get_reply(); vt_move(3, 10); chrprint(report); if ((report = skip_csi(report)) != 0 && sscanf(report, "%d;%d;%d;%d;%d\"%c", &Ph, &Pw, &Pml, &Pmt, &Pmp, &chr) == 6 && chr == 'w') { vt_move(5, 10); show_result("lines:%d, cols:%d, left col:%d, top line:%d, page %d", Ph, Pw, Pml, Pmt, Pmp); } else { show_result(SHOW_FAILURE); } restore_ttymodes(); vt_move(max_lines - 1, 1); return MENU_HOLD; }
static void check_rc(int row, int col) { char *report; char *params; char expected[80]; sprintf(expected, "%d;%dR", row, col); set_tty_raw(TRUE); set_tty_echo(FALSE); do_csi("6n"); report = get_reply(); restore_ttymodes(); vt_move(row, 1); el(2); if ((params = skip_csi(report)) == 0 || strcmp(params, expected) != 0) { printf("cursor save/restore %s, got \"%s\", expected \"%s\"", SHOW_FAILURE, params, expected); } else { printf("cursor save/restore %s", SHOW_SUCCESS); } }
static int check_8bit_toggle(void) { char *report; set_tty_raw(TRUE); cup(1,1); dsr(6); padding(5); /* FIXME: may not be needed */ report = get_reply(); restore_ttymodes(); if ((report = skip_csi(report)) != 0 && !strcmp(report, "1;1R")) return TRUE; return FALSE; }
/* * Determine the current and maximum operating levels of the terminal */ static void find_levels(void) { char *report; set_tty_raw(TRUE); set_tty_echo(FALSE); da(); report = get_reply(); if (!strcmp(report, "\033/Z")) { cur_level = max_level = 0; /* must be a VT52 */ } else if ((report = skip_csi(report)) == 0 || strncmp(report, "?6", 2) || !isdigit(report[2]) || report[3] != ';') { cur_level = max_level = 1; /* must be a VT100 */ } else { /* "CSI ? 6 x ; ..." */ cur_level = max_level = report[2] - '0'; /* VT220=2, VT320=3, VT420=4 */ if (max_level >= 4) { decrqss("\"p"); report = get_reply(); if ((report = skip_dcs(report)) != 0 && isdigit(*report++) /* 0 or 1 (by observation, though 1 is an err) */ && *report++ == '$' && *report++ == 'r' && *report++ == '6' && isdigit(*report)) cur_level = *report - '0'; } } if (LOG_ENABLED) { fprintf(log_fp, "Max Operating Level: %d\n", max_level); fprintf(log_fp, "Cur Operating Level: %d\n", cur_level); } restore_ttymodes(); }
static void analyze_string(const char *name, const char *cap, TERMTYPE *tp) { char buf[MAX_TERMINFO_LENGTH]; char buf2[MAX_TERMINFO_LENGTH]; const char *sp; const assoc *ap; int tp_lines = tp->Numbers[2]; if (cap == ABSENT_STRING || cap == CANCELLED_STRING) return; (void) printf("%s: ", name); buf[0] = '\0'; for (sp = cap; *sp; sp++) { int i; int csi; size_t len = 0; size_t next; const char *expansion = 0; char buf3[MAX_TERMINFO_LENGTH]; /* first, check other capabilities in this entry */ for (i = 0; i < STRCOUNT; i++) { char *cp = tp->Strings[i]; /* don't use soft-key capabilities */ if (strnames[i][0] == 'k' && strnames[i][0] == 'f') continue; if (cp != ABSENT_STRING && cp != CANCELLED_STRING && cp[0] && cp != cap) { len = strlen(cp); (void) strncpy(buf2, sp, len); buf2[len] = '\0'; if (_nc_capcmp(cp, buf2)) continue; #define ISRS(s) (!strncmp((s), "is", 2) || !strncmp((s), "rs", 2)) /* * Theoretically we just passed the test for translation * (equality once the padding is stripped). However, there * are a few more hoops that need to be jumped so that * identical pairs of initialization and reset strings * don't just refer to each other. */ if (ISRS(name) || ISRS(strnames[i])) if (cap < cp) continue; #undef ISRS expansion = strnames[i]; break; } } /* now check the standard capabilities */ if (!expansion) { csi = skip_csi(sp); for (ap = std_caps; ap->from; ap++) { size_t adj = csi ? 2 : 0; len = strlen(ap->from); if (csi && skip_csi(ap->from) != csi) continue; if (len > adj && strncmp(ap->from + adj, sp + csi, len - adj) == 0) { expansion = ap->to; len -= adj; len += csi; break; } } } /* now check for standard-mode sequences */ if (!expansion && (csi = skip_csi(sp)) != 0 && (len = strspn(sp + csi, "0123456789;")) && (next = csi + len) && ((sp[next] == 'h') || (sp[next] == 'l'))) { (void) strcpy(buf2, (sp[next] == 'h') ? "ECMA+" : "ECMA-"); (void) strncpy(buf3, sp + csi, len); buf3[len] = '\0'; len += csi + 1; expansion = lookup_params(std_modes, buf2, buf3); } /* now check for private-mode sequences */ if (!expansion && (csi = skip_csi(sp)) != 0 && sp[csi] == '?' && (len = strspn(sp + csi + 1, "0123456789;")) && (next = csi + 1 + len) && ((sp[next] == 'h') || (sp[next] == 'l'))) { (void) strcpy(buf2, (sp[next] == 'h') ? "DEC+" : "DEC-"); (void) strncpy(buf3, sp + csi + 1, len); buf3[len] = '\0'; len += csi + 2; expansion = lookup_params(private_modes, buf2, buf3); } /* now check for ECMA highlight sequences */ if (!expansion && (csi = skip_csi(sp)) != 0 && (len = strspn(sp + csi, "0123456789;")) != 0 && (next = csi + len) && sp[next] == 'm') { (void) strcpy(buf2, "SGR:"); (void) strncpy(buf3, sp + csi, len); buf3[len] = '\0'; len += csi + 1; expansion = lookup_params(ecma_highlights, buf2, buf3); } if (!expansion && (csi = skip_csi(sp)) != 0 && sp[csi] == 'm') { len = csi + 1; (void) strcpy(buf2, "SGR:"); strcat(buf2, ecma_highlights[0].to); expansion = buf2; } /* now check for scroll region reset */ if (!expansion && (csi = skip_csi(sp)) != 0) { if (sp[csi] == 'r') { expansion = "RSR"; len = 1; } else { (void) sprintf(buf2, "1;%dr", tp_lines); len = strlen(buf2); if (strncmp(buf2, sp + csi, len) == 0) expansion = "RSR"; } len += csi; } /* now check for home-down */ if (!expansion && (csi = skip_csi(sp)) != 0) { (void) sprintf(buf2, "%d;1H", tp_lines); len = strlen(buf2); if (strncmp(buf2, sp + csi, len) == 0) { expansion = "LL"; } else { (void) sprintf(buf2, "%dH", tp_lines); len = strlen(buf2); if (strncmp(buf2, sp + csi, len) == 0) { expansion = "LL"; } } len += csi; } /* now look at the expansion we got, if any */ if (expansion) { (void) sprintf(buf + strlen(buf), "{%s}", expansion); sp += len - 1; continue; } else { /* couldn't match anything */ buf2[0] = *sp; buf2[1] = '\0'; (void) strcat(buf, TIC_EXPAND(buf2)); } } (void) printf("%s\n", buf); }