=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/less/decode.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/less/decode.c 2014/04/25 13:38:21 1.7 --- src/usr.bin/less/decode.c 2015/11/05 22:08:44 1.8 *************** *** 6,13 **** * * For more information, see the README file. */ - /* * Routines to decode user commands. * --- 6,16 ---- * * For more information, see the README file. */ + /* + * Modified for use with illumos. + * Copyright 2014 Garrett D'Amore + */ /* * Routines to decode user commands. * *************** *** 34,42 **** #include "lesskey.h" extern int erase_char, erase2_char, kill_char; ! extern int secure; ! #define SK(k) \ SK_SPECIAL_KEY, (k), 6, 1, 1, 1 /* * Command table is ordered roughly according to expected --- 37,45 ---- #include "lesskey.h" extern int erase_char, erase2_char, kill_char; ! extern int secure, less_is_more; ! #define SK(k) \ SK_SPECIAL_KEY, (k), 6, 1, 1, 1 /* * Command table is ordered roughly according to expected *************** *** 45,208 **** static unsigned char cmdtable[] = { ! '\r',0, A_F_LINE, ! '\n',0, A_F_LINE, ! 'e',0, A_F_LINE, ! 'j',0, A_F_LINE, ! SK(SK_DOWN_ARROW),0, A_F_LINE, ! CONTROL('E'),0, A_F_LINE, ! CONTROL('N'),0, A_F_LINE, ! 'k',0, A_B_LINE, ! 'y',0, A_B_LINE, ! CONTROL('Y'),0, A_B_LINE, ! SK(SK_CONTROL_K),0, A_B_LINE, ! CONTROL('P'),0, A_B_LINE, ! SK(SK_UP_ARROW),0, A_B_LINE, ! 'J',0, A_FF_LINE, ! 'K',0, A_BF_LINE, ! 'Y',0, A_BF_LINE, ! 'd',0, A_F_SCROLL, ! CONTROL('D'),0, A_F_SCROLL, ! 'u',0, A_B_SCROLL, ! CONTROL('U'),0, A_B_SCROLL, ! ' ',0, A_F_SCREEN, ! 'f',0, A_F_SCREEN, ! CONTROL('F'),0, A_F_SCREEN, ! CONTROL('V'),0, A_F_SCREEN, ! SK(SK_PAGE_DOWN),0, A_F_SCREEN, ! 'b',0, A_B_SCREEN, ! CONTROL('B'),0, A_B_SCREEN, ! ESC,'v',0, A_B_SCREEN, ! SK(SK_PAGE_UP),0, A_B_SCREEN, ! 'z',0, A_F_WINDOW, ! 'w',0, A_B_WINDOW, ! ESC,' ',0, A_FF_SCREEN, ! 'F',0, A_F_FOREVER, ! ESC,'F',0, A_F_UNTIL_HILITE, ! 'R',0, A_FREPAINT, ! 'r',0, A_REPAINT, ! CONTROL('R'),0, A_REPAINT, ! CONTROL('L'),0, A_REPAINT, ! ESC,'u',0, A_UNDO_SEARCH, ! 'g',0, A_GOLINE, ! SK(SK_HOME),0, A_GOLINE, ! '<',0, A_GOLINE, ! ESC,'<',0, A_GOLINE, ! 'p',0, A_PERCENT, ! '%',0, A_PERCENT, ! ESC,'[',0, A_LSHIFT, ! ESC,']',0, A_RSHIFT, ! ESC,'(',0, A_LSHIFT, ! ESC,')',0, A_RSHIFT, ! SK(SK_RIGHT_ARROW),0, A_RSHIFT, ! SK(SK_LEFT_ARROW),0, A_LSHIFT, ! '{',0, A_F_BRACKET|A_EXTRA, '{','}',0, ! '}',0, A_B_BRACKET|A_EXTRA, '{','}',0, ! '(',0, A_F_BRACKET|A_EXTRA, '(',')',0, ! ')',0, A_B_BRACKET|A_EXTRA, '(',')',0, ! '[',0, A_F_BRACKET|A_EXTRA, '[',']',0, ! ']',0, A_B_BRACKET|A_EXTRA, '[',']',0, ! ESC,CONTROL('F'),0, A_F_BRACKET, ! ESC,CONTROL('B'),0, A_B_BRACKET, ! 'G',0, A_GOEND, ! ESC,'>',0, A_GOEND, ! '>',0, A_GOEND, ! SK(SK_END),0, A_GOEND, ! 'P',0, A_GOPOS, ! '0',0, A_DIGIT, ! '1',0, A_DIGIT, ! '2',0, A_DIGIT, ! '3',0, A_DIGIT, ! '4',0, A_DIGIT, ! '5',0, A_DIGIT, ! '6',0, A_DIGIT, ! '7',0, A_DIGIT, ! '8',0, A_DIGIT, ! '9',0, A_DIGIT, ! '.',0, A_DIGIT, ! '=',0, A_STAT, ! CONTROL('G'),0, A_STAT, ! ':','f',0, A_STAT, ! '/',0, A_F_SEARCH, ! '?',0, A_B_SEARCH, ! ESC,'/',0, A_F_SEARCH|A_EXTRA, '*',0, ! ESC,'?',0, A_B_SEARCH|A_EXTRA, '*',0, ! 'n',0, A_AGAIN_SEARCH, ! ESC,'n',0, A_T_AGAIN_SEARCH, ! 'N',0, A_REVERSE_SEARCH, ! ESC,'N',0, A_T_REVERSE_SEARCH, ! '&',0, A_FILTER, ! 'm',0, A_SETMARK, ! '\'',0, A_GOMARK, ! CONTROL('X'),CONTROL('X'),0, A_GOMARK, ! 'E',0, A_EXAMINE, ! ':','e',0, A_EXAMINE, ! CONTROL('X'),CONTROL('V'),0, A_EXAMINE, ! ':','n',0, A_NEXT_FILE, ! ':','p',0, A_PREV_FILE, ! 't',0, A_NEXT_TAG, ! 'T',0, A_PREV_TAG, ! ':','x',0, A_INDEX_FILE, ! ':','d',0, A_REMOVE_FILE, ! '-',0, A_OPT_TOGGLE, ! ':','t',0, A_OPT_TOGGLE|A_EXTRA, 't',0, ! 's',0, A_OPT_TOGGLE|A_EXTRA, 'o',0, ! '_',0, A_DISP_OPTION, ! '|',0, A_PIPE, ! 'v',0, A_VISUAL, ! '!',0, A_SHELL, ! '+',0, A_FIRSTCMD, ! 'H',0, A_HELP, ! 'h',0, A_HELP, ! SK(SK_F1),0, A_HELP, ! 'V',0, A_VERSION, ! 'q',0, A_QUIT, ! 'Q',0, A_QUIT, ! ':','q',0, A_QUIT, ! ':','Q',0, A_QUIT, ! 'Z','Z',0, A_QUIT }; static unsigned char edittable[] = { ! '\t',0, EC_F_COMPLETE, /* TAB */ ! '\17',0, EC_B_COMPLETE, /* BACKTAB */ ! SK(SK_BACKTAB),0, EC_B_COMPLETE, /* BACKTAB */ ! ESC,'\t',0, EC_B_COMPLETE, /* ESC TAB */ ! CONTROL('L'),0, EC_EXPAND, /* CTRL-L */ ! CONTROL('V'),0, EC_LITERAL, /* BACKSLASH */ ! CONTROL('A'),0, EC_LITERAL, /* BACKSLASH */ ! ESC,'l',0, EC_RIGHT, /* ESC l */ ! SK(SK_RIGHT_ARROW),0, EC_RIGHT, /* RIGHTARROW */ ! ESC,'h',0, EC_LEFT, /* ESC h */ ! SK(SK_LEFT_ARROW),0, EC_LEFT, /* LEFTARROW */ ! ESC,'b',0, EC_W_LEFT, /* ESC b */ ! ESC,SK(SK_LEFT_ARROW),0, EC_W_LEFT, /* ESC LEFTARROW */ ! SK(SK_CTL_LEFT_ARROW),0, EC_W_LEFT, /* CTRL-LEFTARROW */ ! ESC,'w',0, EC_W_RIGHT, /* ESC w */ ! ESC,SK(SK_RIGHT_ARROW),0, EC_W_RIGHT, /* ESC RIGHTARROW */ ! SK(SK_CTL_RIGHT_ARROW),0, EC_W_RIGHT, /* CTRL-RIGHTARROW */ ! ESC,'i',0, EC_INSERT, /* ESC i */ ! SK(SK_INSERT),0, EC_INSERT, /* INSERT */ ! ESC,'x',0, EC_DELETE, /* ESC x */ ! SK(SK_DELETE),0, EC_DELETE, /* DELETE */ ! ESC,'X',0, EC_W_DELETE, /* ESC X */ ! ESC,SK(SK_DELETE),0, EC_W_DELETE, /* ESC DELETE */ ! SK(SK_CTL_DELETE),0, EC_W_DELETE, /* CTRL-DELETE */ ! SK(SK_CTL_BACKSPACE),0, EC_W_BACKSPACE, /* CTRL-BACKSPACE */ ! ESC,'\b',0, EC_W_BACKSPACE, /* ESC BACKSPACE */ ! ESC,'0',0, EC_HOME, /* ESC 0 */ ! SK(SK_HOME),0, EC_HOME, /* HOME */ ! ESC,'$',0, EC_END, /* ESC $ */ ! SK(SK_END),0, EC_END, /* END */ ! ESC,'k',0, EC_UP, /* ESC k */ ! SK(SK_UP_ARROW),0, EC_UP, /* UPARROW */ ! ESC,'j',0, EC_DOWN, /* ESC j */ ! SK(SK_DOWN_ARROW),0, EC_DOWN, /* DOWNARROW */ ! CONTROL('G'),0, EC_ABORT, /* CTRL-G */ }; /* --- 48,218 ---- static unsigned char cmdtable[] = { ! '\r', 0, A_F_LINE, ! '\n', 0, A_F_LINE, ! 'e', 0, A_F_LINE, ! 'j', 0, A_F_LINE, ! SK(SK_DOWN_ARROW), 0, A_F_LINE, ! CONTROL('E'), 0, A_F_LINE, ! CONTROL('N'), 0, A_F_LINE, ! 'k', 0, A_B_LINE, ! 'y', 0, A_B_LINE, ! CONTROL('Y'), 0, A_B_LINE, ! SK(SK_CONTROL_K), 0, A_B_LINE, ! CONTROL('P'), 0, A_B_LINE, ! SK(SK_UP_ARROW), 0, A_B_LINE, ! 'J', 0, A_FF_LINE, ! 'K', 0, A_BF_LINE, ! 'Y', 0, A_BF_LINE, ! 'd', 0, A_F_SCROLL, ! CONTROL('D'), 0, A_F_SCROLL, ! 'u', 0, A_B_SCROLL, ! CONTROL('U'), 0, A_B_SCROLL, ! ' ', 0, A_F_SCREEN, ! 'f', 0, A_F_SCREEN, ! CONTROL('F'), 0, A_F_SCREEN, ! CONTROL('V'), 0, A_F_SCREEN, ! SK(SK_PAGE_DOWN), 0, A_F_SCREEN, ! 'b', 0, A_B_SCREEN, ! CONTROL('B'), 0, A_B_SCREEN, ! ESC, 'v', 0, A_B_SCREEN, ! SK(SK_PAGE_UP), 0, A_B_SCREEN, ! 'z', 0, A_F_WINDOW, ! 'w', 0, A_B_WINDOW, ! ESC, ' ', 0, A_FF_SCREEN, ! 'F', 0, A_F_FOREVER, ! ESC, 'F', 0, A_F_UNTIL_HILITE, ! 'R', 0, A_FREPAINT, ! 'r', 0, A_REPAINT, ! CONTROL('R'), 0, A_REPAINT, ! CONTROL('L'), 0, A_REPAINT, ! ESC, 'u', 0, A_UNDO_SEARCH, ! 'g', 0, A_GOLINE, ! SK(SK_HOME), 0, A_GOLINE, ! '<', 0, A_GOLINE, ! ESC, '<', 0, A_GOLINE, ! 'p', 0, A_PERCENT, ! '%', 0, A_PERCENT, ! ESC, '[', 0, A_LSHIFT, ! ESC, ']', 0, A_RSHIFT, ! ESC, '(', 0, A_LSHIFT, ! ESC, ')', 0, A_RSHIFT, ! SK(SK_RIGHT_ARROW), 0, A_RSHIFT, ! SK(SK_LEFT_ARROW), 0, A_LSHIFT, ! '{', 0, A_F_BRACKET|A_EXTRA, '{', '}', 0, ! '}', 0, A_B_BRACKET|A_EXTRA, '{', '}', 0, ! '(', 0, A_F_BRACKET|A_EXTRA, '(', ')', 0, ! ')', 0, A_B_BRACKET|A_EXTRA, '(', ')', 0, ! '[', 0, A_F_BRACKET|A_EXTRA, '[', ']', 0, ! ']', 0, A_B_BRACKET|A_EXTRA, '[', ']', 0, ! ESC, CONTROL('F'), 0, A_F_BRACKET, ! ESC, CONTROL('B'), 0, A_B_BRACKET, ! 'G', 0, A_GOEND, ! ESC, '>', 0, A_GOEND, ! '>', 0, A_GOEND, ! SK(SK_END), 0, A_GOEND, ! 'P', 0, A_GOPOS, ! '0', 0, A_DIGIT, ! '1', 0, A_DIGIT, ! '2', 0, A_DIGIT, ! '3', 0, A_DIGIT, ! '4', 0, A_DIGIT, ! '5', 0, A_DIGIT, ! '6', 0, A_DIGIT, ! '7', 0, A_DIGIT, ! '8', 0, A_DIGIT, ! '9', 0, A_DIGIT, ! '.', 0, A_DIGIT, ! '=', 0, A_STAT, ! CONTROL('G'), 0, A_STAT, ! ':', 'f', 0, A_STAT, ! '/', 0, A_F_SEARCH, ! '?', 0, A_B_SEARCH, ! ESC, '/', 0, A_F_SEARCH|A_EXTRA, '*', 0, ! ESC, '?', 0, A_B_SEARCH|A_EXTRA, '*', 0, ! 'n', 0, A_AGAIN_SEARCH, ! ESC, 'n', 0, A_T_AGAIN_SEARCH, ! 'N', 0, A_REVERSE_SEARCH, ! ESC, 'N', 0, A_T_REVERSE_SEARCH, ! '&', 0, A_FILTER, ! 'm', 0, A_SETMARK, ! '\'', 0, A_GOMARK, ! CONTROL('X'), CONTROL('X'), 0, A_GOMARK, ! 'E', 0, A_EXAMINE, ! ':', 'e', 0, A_EXAMINE, ! CONTROL('X'), CONTROL('V'), 0, A_EXAMINE, ! ':', 'n', 0, A_NEXT_FILE, ! ':', 'p', 0, A_PREV_FILE, ! 't', 0, A_NEXT_TAG, ! 'T', 0, A_PREV_TAG, ! ':', 'x', 0, A_INDEX_FILE, ! ':', 'd', 0, A_REMOVE_FILE, ! ':', 't', 0, A_OPT_TOGGLE|A_EXTRA, 't', 0, ! '|', 0, A_PIPE, ! 'v', 0, A_VISUAL, ! '!', 0, A_SHELL, ! '+', 0, A_FIRSTCMD, ! 'H', 0, A_HELP, ! 'h', 0, A_HELP, ! SK(SK_F1), 0, A_HELP, ! 'V', 0, A_VERSION, ! 'q', 0, A_QUIT, ! 'Q', 0, A_QUIT, ! ':', 'q', 0, A_QUIT, ! ':', 'Q', 0, A_QUIT, ! 'Z', 'Z', 0, A_QUIT }; + static unsigned char lesstable[] = { + '-', 0, A_OPT_TOGGLE, + 's', 0, A_OPT_TOGGLE|A_EXTRA, 'o', 0, + '_', 0, A_DISP_OPTION + }; + + static unsigned char moretable[] = { + 's', 0, A_F_SKIP + }; + static unsigned char edittable[] = { ! '\t', 0, EC_F_COMPLETE, /* TAB */ ! '\17', 0, EC_B_COMPLETE, /* BACKTAB */ ! SK(SK_BACKTAB), 0, EC_B_COMPLETE, /* BACKTAB */ ! ESC, '\t', 0, EC_B_COMPLETE, /* ESC TAB */ ! CONTROL('L'), 0, EC_EXPAND, /* CTRL-L */ ! CONTROL('V'), 0, EC_LITERAL, /* BACKSLASH */ ! CONTROL('A'), 0, EC_LITERAL, /* BACKSLASH */ ! ESC, 'l', 0, EC_RIGHT, /* ESC l */ ! SK(SK_RIGHT_ARROW), 0, EC_RIGHT, /* RIGHTARROW */ ! ESC, 'h', 0, EC_LEFT, /* ESC h */ ! SK(SK_LEFT_ARROW), 0, EC_LEFT, /* LEFTARROW */ ! ESC, 'b', 0, EC_W_LEFT, /* ESC b */ ! ESC, SK(SK_LEFT_ARROW), 0, EC_W_LEFT, /* ESC LEFTARROW */ ! SK(SK_CTL_LEFT_ARROW), 0, EC_W_LEFT, /* CTRL-LEFTARROW */ ! ESC, 'w', 0, EC_W_RIGHT, /* ESC w */ ! ESC, SK(SK_RIGHT_ARROW), 0, EC_W_RIGHT, /* ESC RIGHTARROW */ ! SK(SK_CTL_RIGHT_ARROW), 0, EC_W_RIGHT, /* CTRL-RIGHTARROW */ ! ESC, 'i', 0, EC_INSERT, /* ESC i */ ! SK(SK_INSERT), 0, EC_INSERT, /* INSERT */ ! ESC, 'x', 0, EC_DELETE, /* ESC x */ ! SK(SK_DELETE), 0, EC_DELETE, /* DELETE */ ! ESC, 'X', 0, EC_W_DELETE, /* ESC X */ ! ESC, SK(SK_DELETE), 0, EC_W_DELETE, /* ESC DELETE */ ! SK(SK_CTL_DELETE), 0, EC_W_DELETE, /* CTRL-DELETE */ ! SK(SK_CTL_BACKSPACE), 0, EC_W_BACKSPACE, /* CTRL-BACKSPACE */ ! ESC, '\b', 0, EC_W_BACKSPACE, /* ESC BACKSPACE */ ! ESC, '0', 0, EC_HOME, /* ESC 0 */ ! SK(SK_HOME), 0, EC_HOME, /* HOME */ ! ESC, '$', 0, EC_END, /* ESC $ */ ! SK(SK_END), 0, EC_END, /* END */ ! ESC, 'k', 0, EC_UP, /* ESC k */ ! SK(SK_UP_ARROW), 0, EC_UP, /* UPARROW */ ! ESC, 'j', 0, EC_DOWN, /* ESC j */ ! SK(SK_DOWN_ARROW), 0, EC_DOWN, /* DOWNARROW */ ! CONTROL('G'), 0, EC_ABORT, /* CTRL-G */ }; /* *************** *** 227,253 **** /* * Expand special key abbreviations in a command table. */ ! static void ! expand_special_keys(table, len) ! char *table; ! int len; { ! register char *fm; ! register char *to; ! register int a; char *repl; int klen; ! for (fm = table; fm < table + len; ) ! { /* * Rewrite each command in the table with any * special key abbreviations expanded. */ ! for (to = fm; *fm != '\0'; ) ! { ! if (*fm != SK_SPECIAL_KEY) ! { *to++ = *fm++; continue; } --- 237,258 ---- /* * Expand special key abbreviations in a command table. */ ! static void ! expand_special_keys(char *table, int len) { ! char *fm; ! char *to; ! int a; char *repl; int klen; ! for (fm = table; fm < table + len; ) { /* * Rewrite each command in the table with any * special key abbreviations expanded. */ ! for (to = fm; *fm != '\0'; ) { ! if (*fm != SK_SPECIAL_KEY) { *to++ = *fm++; continue; } *************** *** 263,284 **** repl = special_key_str(fm[1]); klen = fm[2] & 0377; fm += klen; ! if (repl == NULL || (int) strlen(repl) > klen) repl = "\377"; while (*repl != '\0') *to++ = *repl++; } *to++ = '\0'; /* ! * Fill any unused bytes between end of command and * the action byte with A_SKIP. */ while (to <= fm) *to++ = A_SKIP; fm++; a = *fm++ & 0377; ! if (a & A_EXTRA) ! { while (*fm++ != '\0') continue; } --- 268,288 ---- repl = special_key_str(fm[1]); klen = fm[2] & 0377; fm += klen; ! if (repl == NULL || strlen(repl) > klen) repl = "\377"; while (*repl != '\0') *to++ = *repl++; } *to++ = '\0'; /* ! * Fill any unused bytes between end of command and * the action byte with A_SKIP. */ while (to <= fm) *to++ = A_SKIP; fm++; a = *fm++ & 0377; ! if (a & A_EXTRA) { while (*fm++ != '\0') continue; } *************** *** 288,310 **** /* * Initialize the command lists. */ ! public void ! init_cmds() { /* * Add the default command tables. */ ! add_fcmd_table((char*)cmdtable, sizeof(cmdtable)); ! add_ecmd_table((char*)edittable, sizeof(edittable)); ! #if USERFILE /* - * For backwards compatibility, - * try to add tables in the OLD system lesskey file. - */ - #ifdef BINDIR - add_hometable(NULL, BINDIR "/.sysless", 1); - #endif - /* * Try to add the tables in the system lesskey file. */ add_hometable("LESSKEY_SYSTEM", LESSKEYFILE_SYS, 1); --- 292,313 ---- /* * Initialize the command lists. */ ! void ! init_cmds(void) { /* * Add the default command tables. */ ! add_fcmd_table((char *)cmdtable, sizeof (cmdtable)); ! add_ecmd_table((char *)edittable, sizeof (edittable)); ! if (less_is_more) { ! add_fcmd_table((char *)moretable, sizeof (moretable)); ! return; ! } else { ! add_fcmd_table((char *)lesstable, sizeof (lesstable)); ! } ! /* * Try to add the tables in the system lesskey file. */ add_hometable("LESSKEY_SYSTEM", LESSKEYFILE_SYS, 1); *************** *** 312,340 **** * Try to add the tables in the standard lesskey file "$HOME/.less". */ add_hometable("LESSKEY", LESSKEYFILE, 0); - #endif } /* * Add a command table. */ ! static int ! add_cmd_table(tlist, buf, len) ! struct tablelist **tlist; ! char *buf; ! int len; { ! register struct tablelist *t; if (len == 0) return (0); /* ! * Allocate a tablelist structure, initialize it, * and link it into the list of tables. */ ! if ((t = (struct tablelist *) ! calloc(1, sizeof(struct tablelist))) == NULL) ! { return (-1); } expand_special_keys(buf, len); --- 315,337 ---- * Try to add the tables in the standard lesskey file "$HOME/.less". */ add_hometable("LESSKEY", LESSKEYFILE, 0); } /* * Add a command table. */ ! static int ! add_cmd_table(struct tablelist **tlist, char *buf, int len) { ! struct tablelist *t; if (len == 0) return (0); /* ! * Allocate a tablelist structure, initialize it, * and link it into the list of tables. */ ! if ((t = calloc(1, sizeof (struct tablelist))) == NULL) { return (-1); } expand_special_keys(buf, len); *************** *** 348,357 **** /* * Add a command table. */ ! public void ! add_fcmd_table(buf, len) ! char *buf; ! int len; { if (add_cmd_table(&list_fcmd_tables, buf, len) < 0) error("Warning: some commands disabled", NULL_PARG); --- 345,352 ---- /* * Add a command table. */ ! void ! add_fcmd_table(char *buf, int len) { if (add_cmd_table(&list_fcmd_tables, buf, len) < 0) error("Warning: some commands disabled", NULL_PARG); *************** *** 360,369 **** /* * Add an editing command table. */ ! public void ! add_ecmd_table(buf, len) ! char *buf; ! int len; { if (add_cmd_table(&list_ecmd_tables, buf, len) < 0) error("Warning: some edit commands disabled", NULL_PARG); --- 355,362 ---- /* * Add an editing command table. */ ! void ! add_ecmd_table(char *buf, int len) { if (add_cmd_table(&list_ecmd_tables, buf, len) < 0) error("Warning: some edit commands disabled", NULL_PARG); *************** *** 372,406 **** /* * Add an environment variable table. */ ! static void ! add_var_table(tlist, buf, len) ! struct tablelist **tlist; ! char *buf; ! int len; { if (add_cmd_table(tlist, buf, len) < 0) ! error("Warning: environment variables from lesskey file unavailable", NULL_PARG); } /* * Search a single command table for the command string in cmd. */ ! static int ! cmd_search(cmd, table, endtable, sp) ! char *cmd; ! char *table; ! char *endtable; ! char **sp; { ! register char *p; ! register char *q; ! register int a; *sp = NULL; ! for (p = table, q = cmd; p < endtable; p++, q++) ! { ! if (*p == *q) ! { /* * Current characters match. * If we're at the end of the string, we've found it. --- 365,391 ---- /* * Add an environment variable table. */ ! static void ! add_var_table(struct tablelist **tlist, char *buf, int len) { if (add_cmd_table(tlist, buf, len) < 0) ! error("Warning: environment variables from " ! "lesskey file unavailable", NULL_PARG); } /* * Search a single command table for the command string in cmd. */ ! static int ! cmd_search(const char *cmd, char *table, char *endtable, char **sp) { ! char *p; ! const char *q; ! int a; *sp = NULL; ! for (p = table, q = cmd; p < endtable; p++, q++) { ! if (*p == *q) { /* * Current characters match. * If we're at the end of the string, we've found it. *************** *** 408,420 **** * after the null at the end of the string * in the command table. */ ! if (*p == '\0') ! { a = *++p & 0377; while (a == A_SKIP) a = *++p & 0377; ! if (a == A_END_LIST) ! { /* * We get here only if the original * cmd string passed in was empty (""). --- 393,403 ---- * after the null at the end of the string * in the command table. */ ! if (*p == '\0') { a = *++p & 0377; while (a == A_SKIP) a = *++p & 0377; ! if (a == A_END_LIST) { /* * We get here only if the original * cmd string passed in was empty (""). *************** *** 426,458 **** /* * Check for an "extra" string. */ ! if (a & A_EXTRA) ! { *sp = ++p; a &= ~A_EXTRA; } return (a); } ! } else if (*q == '\0') ! { /* * Hit the end of the user's command, * but not the end of the string in the command table. * The user's command is incomplete. */ return (A_PREFIX); ! } else ! { /* * Not a match. * Skip ahead to the next command in the * command table, and reset the pointer * to the beginning of the user's command. */ ! if (*p == '\0' && p[1] == A_END_LIST) ! { /* ! * A_END_LIST is a special marker that tells * us to abort the cmd search. */ return (A_UINVALID); --- 409,437 ---- /* * Check for an "extra" string. */ ! if (a & A_EXTRA) { *sp = ++p; a &= ~A_EXTRA; } return (a); } ! } else if (*q == '\0') { /* * Hit the end of the user's command, * but not the end of the string in the command table. * The user's command is incomplete. */ return (A_PREFIX); ! } else { /* * Not a match. * Skip ahead to the next command in the * command table, and reset the pointer * to the beginning of the user's command. */ ! if (*p == '\0' && p[1] == A_END_LIST) { /* ! * A_END_LIST is a special marker that tells * us to abort the cmd search. */ return (A_UINVALID); *************** *** 477,497 **** * Decode a command character and return the associated action. * The "extra" string, if any, is returned in sp. */ ! static int ! cmd_decode(tlist, cmd, sp) ! struct tablelist *tlist; ! char *cmd; ! char **sp; { ! register struct tablelist *t; ! register int action = A_INVALID; /* * Search thru all the command tables. * Stop when we find an action which is not A_INVALID. */ ! for (t = tlist; t != NULL; t = t->t_next) ! { action = cmd_search(cmd, t->t_start, t->t_end, sp); if (action != A_INVALID) break; --- 456,472 ---- * Decode a command character and return the associated action. * The "extra" string, if any, is returned in sp. */ ! static int ! cmd_decode(struct tablelist *tlist, const char *cmd, char **sp) { ! struct tablelist *t; ! int action = A_INVALID; /* * Search thru all the command tables. * Stop when we find an action which is not A_INVALID. */ ! for (t = tlist; t != NULL; t = t->t_next) { action = cmd_search(cmd, t->t_start, t->t_end, sp); if (action != A_INVALID) break; *************** *** 504,513 **** /* * Decode a command from the cmdtables list. */ ! public int ! fcmd_decode(cmd, sp) ! char *cmd; ! char **sp; { return (cmd_decode(list_fcmd_tables, cmd, sp)); } --- 479,486 ---- /* * Decode a command from the cmdtables list. */ ! int ! fcmd_decode(const char *cmd, char **sp) { return (cmd_decode(list_fcmd_tables, cmd, sp)); } *************** *** 515,524 **** /* * Decode a command from the edittables list. */ ! public int ! ecmd_decode(cmd, sp) ! char *cmd; ! char **sp; { return (cmd_decode(list_ecmd_tables, cmd, sp)); } --- 488,495 ---- /* * Decode a command from the edittables list. */ ! int ! ecmd_decode(const char *cmd, char **sp) { return (cmd_decode(list_ecmd_tables, cmd, sp)); } *************** *** 527,539 **** * Get the value of an environment variable. * Looks first in the lesskey file, then in the real environment. */ ! public char * ! lgetenv(var) ! char *var; { int a; char *s; a = cmd_decode(list_var_tables, var, &s); if (a == EV_OK) return (s); --- 498,519 ---- * Get the value of an environment variable. * Looks first in the lesskey file, then in the real environment. */ ! char * ! lgetenv(char *var) { int a; char *s; + /* + * Ignore lookups of any LESS* setting when we are more, and ignore + * the less key files + */ + if (less_is_more) { + if (strncmp(var, "LESS", 4) == 0) { + return (NULL); + } + return (getenv(var)); + } a = cmd_decode(list_var_tables, var, &s); if (a == EV_OK) return (s); *************** *** 546,560 **** return (NULL); } - #if USERFILE /* * Get an "integer" from a lesskey file. ! * Integers are stored in a funny format: * two bytes, low order first, in radix KRADIX. */ ! static int ! gint(sp) ! char **sp; { int n; --- 526,538 ---- return (NULL); } /* * Get an "integer" from a lesskey file. ! * Integers are stored in a funny format: * two bytes, low order first, in radix KRADIX. */ ! static int ! gint(char **sp) { int n; *************** *** 566,581 **** /* * Process an old (pre-v241) lesskey file. */ ! static int ! old_lesskey(buf, len) ! char *buf; ! int len; { /* * Old-style lesskey file. ! * The file must end with either ! * ...,cmd,0,action ! * or ...,cmd,0,action|A_EXTRA,string,0 * So the last byte or the second to last byte must be zero. */ if (buf[len-1] != '\0' && buf[len-2] != '\0') --- 544,557 ---- /* * Process an old (pre-v241) lesskey file. */ ! static int ! old_lesskey(char *buf, int len) { /* * Old-style lesskey file. ! * The file must end with either ! * ..,cmd,0,action ! * or ...,cmd,0,action|A_EXTRA,string,0 * So the last byte or the second to last byte must be zero. */ if (buf[len-1] != '\0' && buf[len-2] != '\0') *************** *** 584,601 **** return (0); } ! /* * Process a new (post-v241) lesskey file. */ ! static int ! new_lesskey(buf, len, sysvar) ! char *buf; ! int len; ! int sysvar; { char *p; ! register int c; ! register int n; /* * New-style lesskey file. --- 560,574 ---- return (0); } ! /* * Process a new (post-v241) lesskey file. */ ! static int ! new_lesskey(char *buf, int len, int sysvar) { char *p; ! int c; ! int n; /* * New-style lesskey file. *************** *** 606,616 **** buf[len-1] != C2_END_LESSKEY_MAGIC) return (-1); p = buf + 4; ! for (;;) ! { c = *p++; ! switch (c) ! { case CMD_SECTION: n = gint(&p); add_fcmd_table(p, n); --- 579,587 ---- buf[len-1] != C2_END_LESSKEY_MAGIC) return (-1); p = buf + 4; ! for (;;) { c = *p++; ! switch (c) { case CMD_SECTION: n = gint(&p); add_fcmd_table(p, n); *************** *** 623,630 **** break; case VAR_SECTION: n = gint(&p); ! add_var_table((sysvar) ? ! &list_sysvar_tables : &list_var_tables, p, n); p += n; break; case END_SECTION: --- 594,601 ---- break; case VAR_SECTION: n = gint(&p); ! add_var_table((sysvar) ? ! &list_sysvar_tables : &list_var_tables, p, n); p += n; break; case END_SECTION: *************** *** 641,655 **** /* * Set up a user command table, based on a "lesskey" file. */ ! public int ! lesskey(filename, sysvar) ! char *filename; ! int sysvar; { ! register char *buf; ! register POSITION len; ! register long n; ! register int f; if (secure) return (1); --- 612,624 ---- /* * Set up a user command table, based on a "lesskey" file. */ ! int ! lesskey(char *filename, int sysvar) { ! char *buf; ! off_t len; ! long n; ! int f; if (secure) return (1); *************** *** 671,699 **** * rely on the lesskey program to generate a good .less file. }} */ len = filesize(f); ! if (len == NULL_POSITION || len < 3) ! { /* * Bad file (valid file must have at least 3 chars). */ ! close(f); return (-1); } ! if ((buf = (char *) calloc((int)len, sizeof(char))) == NULL) ! { ! close(f); return (-1); } ! if (lseek(f, (off_t)0, SEEK_SET) == BAD_LSEEK) ! { free(buf); ! close(f); return (-1); } n = read(f, buf, (unsigned int) len); close(f); ! if (n != len) ! { free(buf); return (-1); } --- 640,664 ---- * rely on the lesskey program to generate a good .less file. }} */ len = filesize(f); ! if (len == -1 || len < 3) { /* * Bad file (valid file must have at least 3 chars). */ ! (void) close(f); return (-1); } ! if ((buf = calloc((int)len, sizeof (char))) == NULL) { ! (void) close(f); return (-1); } ! if (lseek(f, (off_t)0, SEEK_SET) == BAD_LSEEK) { free(buf); ! (void) close(f); return (-1); } n = read(f, buf, (unsigned int) len); close(f); ! if (n != len) { free(buf); return (-1); } *************** *** 711,721 **** /* * Add the standard lesskey file "$HOME/.less" */ ! public void ! add_hometable(envname, def_filename, sysvar) ! char *envname; ! char *def_filename; ! int sysvar; { char *filename; PARG parg; --- 676,683 ---- /* * Add the standard lesskey file "$HOME/.less" */ ! void ! add_hometable(char *envname, char *def_filename, int sysvar) { char *filename; PARG parg; *************** *** 728,755 **** filename = homefile(def_filename); if (filename == NULL) return; ! if (lesskey(filename, sysvar) < 0) ! { parg.p_string = filename; error("Cannot use lesskey file \"%s\"", &parg); } free(filename); } - #endif /* * See if a char is a special line-editing command. */ ! public int ! editchar(c, flags) ! int c; ! int flags; { int action; int nch; char *s; char usercmd[MAX_CMDLEN+1]; ! /* * An editing character could actually be a sequence of characters; * for example, an escape sequence sent by pressing the uparrow key. --- 690,713 ---- filename = homefile(def_filename); if (filename == NULL) return; ! if (lesskey(filename, sysvar) < 0) { parg.p_string = filename; error("Cannot use lesskey file \"%s\"", &parg); } free(filename); } /* * See if a char is a special line-editing command. */ ! int ! editchar(int c, int flags) { int action; int nch; char *s; char usercmd[MAX_CMDLEN+1]; ! /* * An editing character could actually be a sequence of characters; * for example, an escape sequence sent by pressing the uparrow key. *************** *** 761,816 **** return (EC_BACKSPACE); if (c == kill_char) return (EC_LINEKILL); ! /* * Collect characters in a buffer. * Start with the one we have, and get more if we need them. */ nch = 0; do { ! if (nch > 0) c = getcc(); ! usercmd[nch] = c; usercmd[nch+1] = '\0'; nch++; action = ecmd_decode(usercmd, &s); } while (action == A_PREFIX); ! ! if (flags & EC_NORIGHTLEFT) ! { ! switch (action) ! { case EC_RIGHT: case EC_LEFT: action = A_INVALID; break; } } ! #if CMD_HISTORY ! if (flags & EC_NOHISTORY) ! { /* * The caller says there is no history list. * Reject any history-manipulation action. */ ! switch (action) ! { case EC_UP: case EC_DOWN: action = A_INVALID; break; } } ! #endif ! #if TAB_COMPLETE_FILENAME ! if (flags & EC_NOCOMPLETE) ! { /* * The caller says we don't want any filename completion cmds. * Reject them. */ ! switch (action) ! { case EC_F_COMPLETE: case EC_B_COMPLETE: case EC_EXPAND: --- 719,765 ---- return (EC_BACKSPACE); if (c == kill_char) return (EC_LINEKILL); ! /* * Collect characters in a buffer. * Start with the one we have, and get more if we need them. */ nch = 0; do { ! if (nch > 0) c = getcc(); ! usercmd[nch] = (char)c; usercmd[nch+1] = '\0'; nch++; action = ecmd_decode(usercmd, &s); } while (action == A_PREFIX); ! ! if (flags & EC_NORIGHTLEFT) { ! switch (action) { case EC_RIGHT: case EC_LEFT: action = A_INVALID; break; } } ! if (flags & EC_NOHISTORY) { /* * The caller says there is no history list. * Reject any history-manipulation action. */ ! switch (action) { case EC_UP: case EC_DOWN: action = A_INVALID; break; } } ! if (flags & EC_NOCOMPLETE) { /* * The caller says we don't want any filename completion cmds. * Reject them. */ ! switch (action) { case EC_F_COMPLETE: case EC_B_COMPLETE: case EC_EXPAND: *************** *** 818,841 **** break; } } ! #endif ! if ((flags & EC_PEEK) || action == A_INVALID) ! { /* * We're just peeking, or we didn't understand the command. * Unget all the characters we read in the loop above. ! * This does NOT include the original character that was * passed in as a parameter. */ ! while (nch > 1) ! { ungetcc(usercmd[--nch]); } ! } else ! { if (s != NULL) ungetsc(s); } ! return action; } - --- 767,785 ---- break; } } ! if ((flags & EC_PEEK) || action == A_INVALID) { /* * We're just peeking, or we didn't understand the command. * Unget all the characters we read in the loop above. ! * This does NOT include the original character that was * passed in as a parameter. */ ! while (nch > 1) { ungetcc(usercmd[--nch]); } ! } else { if (s != NULL) ungetsc(s); } ! return (action); }