/* * PUBLIC: int f_print __P((SCR *, OPTION *, char *, u_long *)); */ int f_print( SCR *sp, OPTION *op, char *str, u_long *valp) { int offset = op - sp->opts; /* Preset the value, needed for reinitialization of lookup table. */ if (offset == O_OCTAL) { if (*valp) O_SET(sp, offset); else O_CLR(sp, offset); } else if (o_set(sp, offset, OS_STRDUP, str, 0)) return(1); /* Reinitialize the key fast lookup table. */ v_key_ilookup(sp); /* Reformat the screen. */ F_SET(sp, SC_SCR_REFORMAT); return (0); }
/* * v_key_init -- * Initialize the special key lookup table. * * PUBLIC: int v_key_init __P((SCR *)); */ int v_key_init(SCR *sp) { CHAR_T ch; GS *gp; KEYLIST *kp; int cnt; gp = sp->gp; /* * XXX * 8-bit only, for now. Recompilation should get you any 8-bit * character set, as long as nul isn't a character. */ (void)setlocale(LC_ALL, ""); #if __linux__ /* * In libc 4.5.26, setlocale(LC_ALL, ""), doesn't setup the table * for ctype(3c) correctly. This bug is fixed in libc 4.6.x. * * This code works around this problem for libc 4.5.x users. * Note that this code is harmless if you're using libc 4.6.x. */ (void)setlocale(LC_CTYPE, ""); #endif v_key_ilookup(sp); v_keyval(sp, K_CNTRLD, KEY_VEOF); v_keyval(sp, K_VERASE, KEY_VERASE); v_keyval(sp, K_VKILL, KEY_VKILL); v_keyval(sp, K_VWERASE, KEY_VWERASE); /* Sort the special key list. */ qsort(keylist, nkeylist, sizeof(keylist[0]), v_key_cmp); /* Initialize the fast lookup table. */ for (gp->max_special = 0, kp = keylist, cnt = nkeylist; cnt--; ++kp) { if (gp->max_special < kp->ch) gp->max_special = kp->ch; if (kp->ch <= MAX_FAST_KEY) gp->special_key[kp->ch] = kp->value; } /* Find a non-printable character to use as a message separator. */ for (ch = 1; ch <= MAX_CHAR_T; ++ch) if (!ISPRINT(ch)) { gp->noprint = ch; break; } if (ch != gp->noprint) { msgq(sp, M_ERR, "079|No non-printable character found"); return (1); } return (0); }
/* * v_key_init -- * Initialize the special key lookup table. * * PUBLIC: int v_key_init __P((SCR *)); */ int v_key_init(SCR *sp) { int ch; GS *gp; KEYLIST *kp; int cnt; gp = sp->gp; v_key_ilookup(sp); v_keyval(sp, K_CNTRLD, KEY_VEOF); v_keyval(sp, K_VERASE, KEY_VERASE); v_keyval(sp, K_VKILL, KEY_VKILL); v_keyval(sp, K_VWERASE, KEY_VWERASE); /* Sort the special key list. */ qsort(keylist, nkeylist, sizeof(keylist[0]), v_key_cmp); /* Initialize the fast lookup table. */ for (kp = keylist, cnt = nkeylist; cnt--; ++kp) gp->special_key[kp->ch] = kp->value; /* Find a non-printable character to use as a message separator. */ for (ch = 1; ch <= UCHAR_MAX; ++ch) if (!isprint(ch)) { gp->noprint = ch; break; } if (ch != gp->noprint) { msgq(sp, M_ERR, "079|No non-printable character found"); return (1); } return (0); }