Merge branch 'vendor/LESS'
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 30 Apr 2011 21:59:07 +0000 (11:59 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 30 Apr 2011 21:59:07 +0000 (11:59 -1000)
50 files changed:
contrib/less/LICENSE
contrib/less/NEWS
contrib/less/brac.c
contrib/less/ch.c
contrib/less/charset.c
contrib/less/charset.h
contrib/less/cmd.h
contrib/less/cmdbuf.c
contrib/less/command.c
contrib/less/cvt.c
contrib/less/decode.c
contrib/less/edit.c
contrib/less/filename.c
contrib/less/forwback.c
contrib/less/funcs.h
contrib/less/help.c
contrib/less/ifile.c
contrib/less/input.c
contrib/less/jump.c
contrib/less/less.h
contrib/less/less.nro
contrib/less/lessecho.c
contrib/less/lessecho.nro
contrib/less/lesskey.c
contrib/less/lesskey.h
contrib/less/lesskey.nro
contrib/less/lglob.h
contrib/less/line.c
contrib/less/linenum.c
contrib/less/lsystem.c
contrib/less/main.c
contrib/less/mark.c
contrib/less/optfunc.c
contrib/less/option.c
contrib/less/option.h
contrib/less/opttbl.c
contrib/less/os.c
contrib/less/output.c
contrib/less/pattern.c
contrib/less/pattern.h
contrib/less/pckeys.h
contrib/less/position.c
contrib/less/position.h
contrib/less/prompt.c
contrib/less/screen.c
contrib/less/search.c
contrib/less/signal.c
contrib/less/tags.c
contrib/less/ttyin.c
contrib/less/version.c

index 54a2a1f..c7168e7 100644 (file)
@@ -2,7 +2,7 @@
                           ------------
 
 Less
-Copyright (C) 1984-2009  Mark Nudelman
+Copyright (C) 1984-2011  Mark Nudelman
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
index 161795c..4beefaf 100644 (file)
   To report bugs, suggestions or comments, send email to 
   bug-less@gnu.org or markn@greenwoodsoftware.com.
 
+======================================================================
+
+       Major changes between "less" versions 436 and 443
+
+* Change search behavior such that when a search is given an explicit 
+  pattern, the entire displayed screen is included in the search and 
+  not just the portion after the target line.
+
+* Add -A option to change search behavior to the old way: only
+  the portion of the screen after the target line is searched.
+
+* Add %F formatting to prompt strings, replaced by the last component
+  of the input file.
+
+* Control-G while editing a command exits the command.
+
+* Less now exits with status 2 if control-C is pressed and -K is in effect.
+
+* Fix "ungetc overflow" when passing long commands via the -p option.
+
+* Fix bug in using line filtering via the & command 
+  in combination with -i and -I.
+
+* Fix bug in handling negative arguments to the -j option.
+
+* Fix bug in handling %t in prompt strings.
+
+* Improve handling of long option names.
+
+* Improve percentage calculation for very large files.
+
 ======================================================================
 
        Major changes between "less" versions 429 and 436
index 45e4009..22c71eb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 51d6bd8..1b84ec1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index ab4bc53..12b59d6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -395,7 +395,7 @@ init_charset()
 binary_char(c)
        LWCHAR c;
 {
-    if (utf_mode)
+       if (utf_mode)
                return (is_ubin_char(c));
        c &= 0377;
        return (chardef[c] & IS_BINARY_CHAR);
@@ -817,7 +817,7 @@ static struct wchar_range ubin_table[] = {
        {  0x000B,  0x000C} /* Cc */, 
        {  0x000E,  0x001A} /* Cc */, 
        {  0x001C,  0x001F} /* Cc */, 
-    {  0x007F,  0x009F} /* Cc */,
+       {  0x007F,  0x009F} /* Cc */,
 #if 0
        {  0x00AD,  0x00AD} /* Cf */,
 #endif
index af2ec63..8ccf748 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2009  Mark Nudelman
+ * Copyright (C) 2005-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 3eda647..3176b91 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -98,6 +98,7 @@
 #define        EC_F_COMPLETE   17
 #define        EC_B_COMPLETE   18
 #define        EC_LITERAL      19
+#define        EC_ABORT        20
 
 #define        EC_NOACTION     101
 #define        EC_UINVALID     102
index fea9da3..74a74ff 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -857,6 +857,10 @@ cmd_edit(c)
        case EC_LINEKILL:
                not_in_completion();
                return (cmd_kill());
+       case EC_ABORT:
+               not_in_completion();
+               (void) cmd_kill();
+               return (CC_QUIT);
        case EC_W_BACKSPACE:
                not_in_completion();
                return (cmd_werase());
index 40bf8fd..aa69a47 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -55,8 +55,6 @@ extern int shift_count;
 extern int oldbot;
 extern int forw_prompt;
 
-static char ungot[UNGOT_SIZE];
-static char *ungotp = NULL;
 #if SHELL_ESCAPE
 static char *shellcmd = NULL;  /* For holding last shell command for "!!" */
 #endif
@@ -64,7 +62,8 @@ static int mca;                       /* The multicharacter command (action) */
 static int search_type;                /* The previous type of search */
 static LINENUM number;         /* The number typed by the user */
 static long fraction;          /* The fractional part of the number */
-static char optchar;
+static struct loption *curropt;
+static int opt_lower;
 static int optflag;
 static int optgetname;
 static POSITION bottompos;
@@ -73,6 +72,13 @@ static int save_hshift;
 static char pipec;
 #endif
 
+struct ungot {
+       struct ungot *ug_next;
+       char ug_char;
+};
+static struct ungot* ungot = NULL;
+static int unget_end = 0;
+
 static void multi_search();
 
 /*
@@ -226,8 +232,8 @@ exec_mca()
                        every_first_cmd = save(cbuf);
                break;
        case A_OPT_TOGGLE:
-               toggle_option(optchar, cbuf, optflag);
-               optchar = '\0';
+               toggle_option(curropt, opt_lower, cbuf, optflag);
+               curropt = NULL;
                break;
        case A_F_BRACKET:
                match_brac(cbuf[0], cbuf[1], 1, (int) number);
@@ -280,22 +286,249 @@ exec_mca()
 }
 
 /*
- * Add a character to a multi-character command.
+ * Is a character an erase or kill char?
  */
        static int
-mca_char(c)
+is_erase_char(c)
+       int c;
+{
+       return (c == erase_char || c == erase2_char || c == kill_char);
+}
+
+/*
+ * Handle the first char of an option (after the initial dash).
+ */
+       static int
+mca_opt_first_char(c)
+{
+       int flag = (optflag & ~OPT_NO_PROMPT);
+       if (flag == OPT_NO_TOGGLE)
+       {
+               switch (c)
+               {
+               case '_':
+                       /* "__" = long option name. */
+                       optgetname = TRUE;
+                       mca_opt_toggle();
+                       return (MCA_MORE);
+               }
+       } else
+       {
+               switch (c)
+               {
+               case '+':
+                       /* "-+" = UNSET. */
+                       optflag = (flag == OPT_UNSET) ?
+                               OPT_TOGGLE : OPT_UNSET;
+                       mca_opt_toggle();
+                       return (MCA_MORE);
+               case '!':
+                       /* "-!" = SET */
+                       optflag = (flag == OPT_SET) ?
+                               OPT_TOGGLE : OPT_SET;
+                       mca_opt_toggle();
+                       return (MCA_MORE);
+               case CONTROL('P'):
+                       optflag ^= OPT_NO_PROMPT;
+                       mca_opt_toggle();
+                       return (MCA_MORE);
+               case '-':
+                       /* "--" = long option name. */
+                       optgetname = TRUE;
+                       mca_opt_toggle();
+                       return (MCA_MORE);
+               }
+       }
+       /* Char was not handled here. */
+       return (NO_MCA);
+}
+
+/*
+ * Add a char to a long option name.
+ * See if we've got a match for an option name yet.
+ * If so, display the complete name and stop 
+ * accepting chars until user hits RETURN.
+ */
+       static int
+mca_opt_nonfirst_char(c)
        int c;
 {
        char *p;
-       int flag;
-       char buf[3];
+       char *oname;
+
+       if (curropt != NULL)
+       {
+               /*
+                * Already have a match for the name.
+                * Don't accept anything but erase/kill.
+                */
+               if (is_erase_char(c))
+                       return (MCA_DONE);
+               return (MCA_MORE);
+       }
+       /*
+        * Add char to cmd buffer and try to match
+        * the option name.
+        */
+       if (cmd_char(c) == CC_QUIT)
+               return (MCA_DONE);
+       p = get_cmdbuf();
+       opt_lower = ASCII_IS_LOWER(p[0]);
+       curropt = findopt_name(&p, &oname, NULL);
+       if (curropt != NULL)
+       {
+               /*
+                * Got a match.
+                * Remember the option and
+                * display the full option name.
+                */
+               cmd_reset();
+               mca_opt_toggle();
+               for (p = oname;  *p != '\0';  p++)
+               {
+                       c = *p;
+                       if (!opt_lower && ASCII_IS_LOWER(c))
+                               c = ASCII_TO_UPPER(c);
+                       if (cmd_char(c) != CC_OK)
+                               return (MCA_DONE);
+               }
+       }
+       return (MCA_MORE);
+}
+
+/*
+ * Handle a char of an option toggle command.
+ */
+       static int
+mca_opt_char(c)
+       int c;
+{
        PARG parg;
 
+       /*
+        * This may be a short option (single char),
+        * or one char of a long option name,
+        * or one char of the option parameter.
+        */
+       if (curropt == NULL && len_cmdbuf() == 0)
+       {
+               int ret = mca_opt_first_char(c);
+               if (ret != NO_MCA)
+                       return (ret);
+       }
+       if (optgetname)
+       {
+               /* We're getting a long option name.  */
+               if (c != '\n' && c != '\r')
+                       return (mca_opt_nonfirst_char(c));
+               if (curropt == NULL)
+               {
+                       parg.p_string = get_cmdbuf();
+                       error("There is no --%s option", &parg);
+                       return (MCA_DONE);
+               }
+               optgetname = FALSE;
+               cmd_reset();
+       } else
+       {
+               if (is_erase_char(c))
+                       return (NO_MCA);
+               if (curropt != NULL)
+                       /* We're getting the option parameter. */
+                       return (NO_MCA);
+               curropt = findopt(c);
+               if (curropt == NULL)
+               {
+                       parg.p_string = propt(c);
+                       error("There is no %s option", &parg);
+                       return (MCA_DONE);
+               }
+       }
+       /*
+        * If the option which was entered does not take a 
+        * parameter, toggle the option immediately,
+        * so user doesn't have to hit RETURN.
+        */
+       if ((optflag & ~OPT_NO_PROMPT) != OPT_TOGGLE ||
+           !opt_has_param(curropt))
+       {
+               toggle_option(curropt, ASCII_IS_LOWER(c), "", optflag);
+               return (MCA_DONE);
+       }
+       /*
+        * Display a prompt appropriate for the option parameter.
+        */
+       start_mca(A_OPT_TOGGLE, opt_prompt(curropt), (void*)NULL, 0);
+       return (MCA_MORE);
+}
+
+/*
+ * Handle a char of a search command.
+ */
+       static int
+mca_search_char(c)
+       int c;
+{
+       int flag = 0;
+
+       /*
+        * Certain characters as the first char of 
+        * the pattern have special meaning:
+        *      !  Toggle the NO_MATCH flag
+        *      *  Toggle the PAST_EOF flag
+        *      @  Toggle the FIRST_FILE flag
+        */
+       if (len_cmdbuf() > 0)
+               return (NO_MCA);
+
+       switch (c)
+       {
+       case CONTROL('E'): /* ignore END of file */
+       case '*':
+               if (mca != A_FILTER)
+                       flag = SRCH_PAST_EOF;
+               break;
+       case CONTROL('F'): /* FIRST file */
+       case '@':
+               if (mca != A_FILTER)
+                       flag = SRCH_FIRST_FILE;
+               break;
+       case CONTROL('K'): /* KEEP position */
+               if (mca != A_FILTER)
+                       flag = SRCH_NO_MOVE;
+               break;
+       case CONTROL('R'): /* Don't use REGULAR EXPRESSIONS */
+               flag = SRCH_NO_REGEX;
+               break;
+       case CONTROL('N'): /* NOT match */
+       case '!':
+               flag = SRCH_NO_MATCH;
+               break;
+       }
+
+       if (flag != 0)
+       {
+               search_type ^= flag;
+               mca_search();
+               return (MCA_MORE);
+       }
+       return (NO_MCA);
+}
+
+/*
+ * Handle a character of a multi-character command.
+ */
+       static int
+mca_char(c)
+       int c;
+{
+       int ret;
+
        switch (mca)
        {
        case 0:
                /*
-                * Not in a multicharacter command.
+                * We're not in a multicharacter command.
                 */
                return (NO_MCA);
 
@@ -318,7 +551,8 @@ mca_char(c)
                {
                        /*
                         * Not part of the number.
-                        * Treat as a normal command character.
+                        * End the number and treat this char 
+                        * as a normal command character.
                         */
                        number = cmd_int(&fraction);
                        mca = 0;
@@ -328,214 +562,26 @@ mca_char(c)
                break;
 
        case A_OPT_TOGGLE:
-               /*
-                * Special case for the TOGGLE_OPTION command.
-                * If the option letter which was entered is a
-                * single-char option, execute the command immediately,
-                * so user doesn't have to hit RETURN.
-                * If the first char is + or -, this indicates
-                * OPT_UNSET or OPT_SET respectively, instead of OPT_TOGGLE.
-                * "--" begins inputting a long option name.
-                */
-               if (optchar == '\0' && len_cmdbuf() == 0)
-               {
-                       flag = (optflag & ~OPT_NO_PROMPT);
-                       if (flag == OPT_NO_TOGGLE)
-                       {
-                               switch (c)
-                               {
-                               case '_':
-                                       /* "__" = long option name. */
-                                       optgetname = TRUE;
-                                       mca_opt_toggle();
-                                       return (MCA_MORE);
-                               }
-                       } else
-                       {
-                               switch (c)
-                               {
-                               case '+':
-                                       /* "-+" = UNSET. */
-                                       optflag = (flag == OPT_UNSET) ?
-                                               OPT_TOGGLE : OPT_UNSET;
-                                       mca_opt_toggle();
-                                       return (MCA_MORE);
-                               case '!':
-                                       /* "-!" = SET */
-                                       optflag = (flag == OPT_SET) ?
-                                               OPT_TOGGLE : OPT_SET;
-                                       mca_opt_toggle();
-                                       return (MCA_MORE);
-                               case CONTROL('P'):
-                                       optflag ^= OPT_NO_PROMPT;
-                                       mca_opt_toggle();
-                                       return (MCA_MORE);
-                               case '-':
-                                       /* "--" = long option name. */
-                                       optgetname = TRUE;
-                                       mca_opt_toggle();
-                                       return (MCA_MORE);
-                               }
-                       }
-               }
-               if (optgetname)
-               {
-                       /*
-                        * We're getting a long option name.
-                        * See if we've matched an option name yet.
-                        * If so, display the complete name and stop 
-                        * accepting chars until user hits RETURN.
-                        */
-                       struct loption *o;
-                       char *oname;
-                       int lc;
-
-                       if (c == '\n' || c == '\r')
-                       {
-                               /*
-                                * When the user hits RETURN, make sure
-                                * we've matched an option name, then
-                                * pretend he just entered the equivalent
-                                * option letter.
-                                */
-                               if (optchar == '\0')
-                               {
-                                       parg.p_string = get_cmdbuf();
-                                       error("There is no --%s option", &parg);
-                                       return (MCA_DONE);
-                               }
-                               optgetname = FALSE;
-                               cmd_reset();
-                               c = optchar;
-                       } else
-                       {
-                               if (optchar != '\0')
-                               {
-                                       /*
-                                        * Already have a match for the name.
-                                        * Don't accept anything but erase/kill.
-                                        */
-                                       if (c == erase_char ||
-                                           c == erase2_char ||
-                                           c == kill_char)
-                                               return (MCA_DONE);
-                                       return (MCA_MORE);
-                               }
-                               /*
-                                * Add char to cmd buffer and try to match
-                                * the option name.
-                                */
-                               if (cmd_char(c) == CC_QUIT)
-                                       return (MCA_DONE);
-                               p = get_cmdbuf();
-                               lc = ASCII_IS_LOWER(p[0]);
-                               o = findopt_name(&p, &oname, NULL);
-                               if (o != NULL)
-                               {
-                                       /*
-                                        * Got a match.
-                                        * Remember the option letter and
-                                        * display the full option name.
-                                        */
-                                       optchar = o->oletter;
-                                       if (!lc && ASCII_IS_LOWER(optchar))
-                                               optchar = ASCII_TO_UPPER(optchar);
-                                       cmd_reset();
-                                       mca_opt_toggle();
-                                       for (p = oname;  *p != '\0';  p++)
-                                       {
-                                               c = *p;
-                                               if (!lc && ASCII_IS_LOWER(c))
-                                                       c = ASCII_TO_UPPER(c);
-                                               if (cmd_char(c) != CC_OK)
-                                                       return (MCA_DONE);
-                                       }
-                               }
-                               return (MCA_MORE);
-                       }
-               } else
-               {
-                       if (c == erase_char || c == erase2_char || c == kill_char)
-                               break;
-                       if (optchar != '\0')
-                               /* We already have the option letter. */
-                               break;
-               }
-
-               optchar = c;
-               if ((optflag & ~OPT_NO_PROMPT) != OPT_TOGGLE ||
-                   single_char_option(c))
-               {
-                       toggle_option(c, "", optflag);
-                       return (MCA_DONE);
-               }
-               /*
-                * Display a prompt appropriate for the option letter.
-                */
-               if ((p = opt_prompt(c)) == NULL)
-               {
-                       buf[0] = '-';
-                       buf[1] = c;
-                       buf[2] = '\0';
-                       p = buf;
-               }
-               start_mca(A_OPT_TOGGLE, p, (void*)NULL, 0);
-               return (MCA_MORE);
+               ret = mca_opt_char(c);
+               if (ret != NO_MCA)
+                       return (ret);
+               break;
 
        case A_F_SEARCH:
        case A_B_SEARCH:
        case A_FILTER:
-               /*
-                * Special case for search commands.
-                * Certain characters as the first char of 
-                * the pattern have special meaning:
-                *      !  Toggle the NO_MATCH flag
-                *      *  Toggle the PAST_EOF flag
-                *      @  Toggle the FIRST_FILE flag
-                */
-               if (len_cmdbuf() > 0)
-                       /*
-                        * Only works for the first char of the pattern.
-                        */
-                       break;
+               ret = mca_search_char(c);
+               if (ret != NO_MCA)
+                       return (ret);
+               break;
 
-               flag = 0;
-               switch (c)
-               {
-               case CONTROL('E'): /* ignore END of file */
-               case '*':
-                       if (mca != A_FILTER)
-                               flag = SRCH_PAST_EOF;
-                       break;
-               case CONTROL('F'): /* FIRST file */
-               case '@':
-                       if (mca != A_FILTER)
-                               flag = SRCH_FIRST_FILE;
-                       break;
-               case CONTROL('K'): /* KEEP position */
-                       if (mca != A_FILTER)
-                               flag = SRCH_NO_MOVE;
-                       break;
-               case CONTROL('R'): /* Don't use REGULAR EXPRESSIONS */
-                       flag = SRCH_NO_REGEX;
-                       break;
-               case CONTROL('N'): /* NOT match */
-               case '!':
-                       flag = SRCH_NO_MATCH;
-                       break;
-               }
-               if (flag != 0)
-               {
-                       search_type ^= flag;
-                       mca_search();
-                       return (MCA_MORE);
-               }
+       default:
+               /* Other multicharacter command. */
                break;
        }
 
        /*
-        * Any other multicharacter command
-        * is terminated by a newline.
+        * The multichar command is terminated by a newline.
         */
        if (c == '\n' || c == '\r')
        {
@@ -635,7 +681,7 @@ prompt()
 {
        register char *p;
 
-       if (ungotp != NULL && ungotp > ungot)
+       if (ungot != NULL)
        {
                /*
                 * No prompt necessary if commands are from 
@@ -725,48 +771,59 @@ dispversion()
        public int
 getcc()
 {
-       if (ungotp == NULL)
+       if (unget_end) 
+       {
                /*
-                * Normal case: no ungotten chars, so get one from the user.
+                * We have just run out of ungotten chars.
                 */
-               return (getchr());
-
-       if (ungotp > ungot)
+               unget_end = 0;
+               if (len_cmdbuf() == 0 || !empty_screen())
+                       return (getchr());
                /*
-                * Return the next ungotten char.
+                * Command is incomplete, so try to complete it.
                 */
-               return (*--ungotp);
+               switch (mca)
+               {
+               case A_DIGIT:
+                       /*
+                        * We have a number but no command.  Treat as #g.
+                        */
+                       return ('g');
 
-       /*
-        * We have just run out of ungotten chars.
-        */
-       ungotp = NULL;
-       if (len_cmdbuf() == 0 || !empty_screen())
-               return (getchr());
-       /*
-        * Command is incomplete, so try to complete it.
-        */
-       switch (mca)
-       {
-       case A_DIGIT:
-               /*
-                * We have a number but no command.  Treat as #g.
-                */
-               return ('g');
+               case A_F_SEARCH:
+               case A_B_SEARCH:
+                       /*
+                        * We have "/string" but no newline.  Add the \n.
+                        */
+                       return ('\n'); 
 
-       case A_F_SEARCH:
-       case A_B_SEARCH:
-               /*
-                * We have "/string" but no newline.  Add the \n.
-                */
-               return ('\n'); 
+               default:
+                       /*
+                        * Some other incomplete command.  Let user complete it.
+                        */
+                       return (getchr());
+               }
+       }
 
-       default:
+       if (ungot == NULL)
+       {
                /*
-                * Some other incomplete command.  Let user complete it.
+                * Normal case: no ungotten chars, so get one from the user.
                 */
                return (getchr());
        }
+
+       /*
+        * Return the next ungotten char.
+        */
+       {
+               struct ungot *ug = ungot;
+               char c = ug->ug_char;
+               ungot = ug->ug_next;
+               free(ug);
+               unget_end = (ungot == NULL);
+               return (c);
+       }
 }
 
 /*
@@ -777,14 +834,11 @@ getcc()
 ungetcc(c)
        int c;
 {
-       if (ungotp == NULL)
-               ungotp = ungot;
-       if (ungotp >= ungot + sizeof(ungot))
-       {
-               error("ungetcc overflow", NULL_PARG);
-               quit(QUIT_ERROR);
-       }
-       *ungotp++ = c;
+       struct ungot *ug = (struct ungot *) ecalloc(1, sizeof(struct ungot));
+
+       ug->ug_char = c;
+       ug->ug_next = ungot;
+       ungot = ug;
 }
 
 /*
@@ -927,7 +981,7 @@ commands()
                mca = 0;
                cmd_accept();
                number = 0;
-               optchar = '\0';
+               curropt = NULL;
 
                /*
                 * See if any signals need processing.
index ec54b59..7443984 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 628856d..65d65bb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -202,6 +202,7 @@ static unsigned char edittable[] =
        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 */
 };
 
 /*
index 001ce5f..4781d95 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index fb6f389..0bbe82a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -400,6 +400,7 @@ fexpand(s)
        return (e);
 }
 
+
 #if TAB_COMPLETE_FILENAME
 
 /*
@@ -1057,3 +1058,22 @@ shell_coption()
 {
        return ("-c");
 }
+
+/*
+ * Return last component of a pathname.
+ */
+       public char *
+last_component(name)
+       char *name;
+{
+       char *slash;
+
+       for (slash = name + strlen(name);  slash > name; )
+       {
+               --slash;
+               if (*slash == *PATHNAME_SEP || *slash == '/')
+                       return (slash + 1);
+       }
+       return (name);
+}
+
index 6c49bf6..ebe422d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 38b82f4..8464ada 100644 (file)
        public char * bad_file ();
        public POSITION filesize ();
        public char * shell_coption ();
+       public char * last_component ();
        public int eof_displayed ();
        public int entire_file_displayed ();
        public void squish_check ();
        public void opt_quote ();
        public void opt_query ();
        public int get_swindow ();
+       public char * propt ();
        public void scan_option ();
        public void toggle_option ();
-       public int single_char_option ();
+       public int opt_has_param ();
        public char * opt_prompt ();
        public int isoptpending ();
        public void nopendopt ();
index 531aa16..85b0a4a 100644 (file)
@@ -115,6 +115,8 @@ constant char helpdata[] = {
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','i','s','p','l','a','y',' ','h','e','l','p',' ','(','f','r','o','m',' ','c','o','m','m','a','n','d',' ','l','i','n','e',')','.','\n',
 ' ',' ','-','a',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','s','e','a','r','c','h','-','s','k','i','p','-','s','c','r','e','e','n','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','F','o','r','w','a','r','d',' ','s','e','a','r','c','h',' ','s','k','i','p','s',' ','c','u','r','r','e','n','t',' ','s','c','r','e','e','n','.','\n',
+' ',' ','-','A',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','S','E','A','R','C','H','-','S','K','I','P','-','S','C','R','E','E','N','\n',
+' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','F','o','r','w','a','r','d',' ','s','e','a','r','c','h',' ','a','l','w','a','y','s',' ','s','k','i','p','s',' ','t','a','r','g','e','t',' ','l','i','n','e','.','\n',
 ' ',' ','-','b',' ','[','_','\b','N',']',' ',' ','.','.','.','.',' ',' ','-','-','b','u','f','f','e','r','s','=','[','_','\b','N',']','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','N','u','m','b','e','r',' ','o','f',' ','b','u','f','f','e','r','s','.','\n',
 ' ',' ','-','B',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','a','u','t','o','-','b','u','f','f','e','r','s','\n',
@@ -147,6 +149,8 @@ constant char helpdata[] = {
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','i','s','p','l','a','y',' ','a',' ','s','t','a','t','u','s',' ','c','o','l','u','m','n',' ','a','t',' ','l','e','f','t',' ','e','d','g','e',' ','o','f',' ','s','c','r','e','e','n','.','\n',
 ' ',' ','-','k',' ','[','_','\b','f','_','\b','i','_','\b','l','_','\b','e',']',' ',' ','.',' ',' ','-','-','l','e','s','s','k','e','y','-','f','i','l','e','=','[','_','\b','f','_','\b','i','_','\b','l','_','\b','e',']','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','U','s','e',' ','a',' ','l','e','s','s','k','e','y',' ','f','i','l','e','.','\n',
+' ',' ','-','K',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','-','-','q','u','i','t','-','o','n','-','i','n','t','r','\n',
+' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','E','x','i','t',' ','l','e','s','s',' ','i','n',' ','r','e','s','p','o','n','s','e',' ','t','o',' ','c','t','r','l','-','C','.','\n',
 ' ',' ','-','L',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','n','o','-','l','e','s','s','o','p','e','n','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','I','g','n','o','r','e',' ','t','h','e',' ','L','E','S','S','O','P','E','N',' ','e','n','v','i','r','o','n','m','e','n','t',' ','v','a','r','i','a','b','l','e','.','\n',
 ' ',' ','-','m',' ',' ','-','M',' ',' ','.','.','.','.',' ',' ','-','-','l','o','n','g','-','p','r','o','m','p','t',' ',' ','-','-','L','O','N','G','-','P','R','O','M','P','T','\n',
@@ -197,6 +201,11 @@ constant char helpdata[] = {
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','o','n','\'','t',' ','d','i','s','p','l','a','y',' ','t','i','l','d','e','s',' ','a','f','t','e','r',' ','e','n','d',' ','o','f',' ','f','i','l','e','.','\n',
 ' ',' ','-','#',' ','[','_','\b','N',']',' ',' ','.','.','.','.',' ',' ','-','-','s','h','i','f','t','=','[','_','\b','N',']','\n',
 ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','H','o','r','i','z','o','n','t','a','l',' ','s','c','r','o','l','l',' ','a','m','o','u','n','t',' ','(','0',' ','=',' ','o','n','e',' ','h','a','l','f',' ','s','c','r','e','e','n',' ','w','i','d','t','h',')','\n',
+' ',' ',' ',' ',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','n','o','-','k','e','y','p','a','d','\n',
+' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','D','o','n','\'','t',' ','s','e','n','d',' ','k','e','y','p','a','d',' ','i','n','i','t','/','d','e','i','n','i','t',' ','s','e','q','u','e','n','c','e','.','\n',
+' ',' ',' ',' ',' ',' ','.','.','.','.','.','.','.','.',' ',' ','-','-','f','o','l','l','o','w','-','n','a','m','e','\n',
+' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','T','h','e',' ','F',' ','c','o','m','m','a','n','d',' ','c','h','a','n','g','e','s',' ','f','i','l','e','s',' ','i','f',' ','t','h','e',' ','i','n','p','u','t',' ','f','i','l','e',' ','i','s',' ','r','e','n','a','m','e','d','.','\n',
+'\n',
 '\n',
 ' ','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','\n',
 '\n',
index 2a351d1..971e3b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 058dec3..b82868b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -181,6 +181,11 @@ get_forw_line:
                        {
                                do
                                {
+                                       if (ABORT_SIGS())
+                                       {
+                                               null_line();
+                                               return (NULL_POSITION);
+                                       }
                                        c = ch_forw_get();
                                } while (c != '\n' && c != EOI);
                                new_pos = ch_tell();
index e4bfa80..d7ec770 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index a65870c..d013345 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -344,6 +344,7 @@ struct textlist
 #define SRCH_FIRST_FILE (1 << 10) /* Search starting at the first file */
 #define SRCH_NO_REGEX   (1 << 12) /* Don't use regular expressions */
 #define SRCH_FILTER     (1 << 13) /* Search is for '&' (filter) command */
+#define SRCH_AFTER_TARGET (1 << 14) /* Start search after the target line */
 
 #define        SRCH_REVERSE(t) (((t) & SRCH_FORW) ? \
                                (((t) & ~SRCH_FORW) | SRCH_BACK) : \
@@ -473,6 +474,7 @@ struct textlist
 
 #define        QUIT_OK         0
 #define        QUIT_ERROR      1
+#define        QUIT_INTERRUPT  2
 #define        QUIT_SAVED_STATUS (-1)
 
 #define FOLLOW_DESC     0
index 952a3f9..33050e1 100644 (file)
@@ -1,4 +1,4 @@
-.TH LESS 1 "Version 436: 07 Jul 2009"
+.TH LESS 1 "Version 443: 09 Apr 2011"
 .SH NAME
 less \- opposite of more
 .SH SYNOPSIS
@@ -10,7 +10,7 @@ less \- opposite of more
 .br
 .B "less \-\-version"
 .br
-.B "less [\-[+]aBcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]"
+.B "less [\-[+]aABcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]"
 .br
 .B "     [\-b \fIspace\fP] [\-h \fIlines\fP] [\-j \fIline\fP] [\-k \fIkeyfile\fP]"
 .br
@@ -65,7 +65,7 @@ Like SPACE, but if N is specified, it becomes the new window size.
 .IP "ESC-SPACE"
 Like SPACE, but scrolls a full screenful, even if it reaches
 end-of-file in the process.
-.IP "RETURN or ^N or e or ^E or j or ^J"
+.IP "ENTER or RETURN or ^N or e or ^E or j or ^J"
 Scroll forward N lines, default 1.
 The entire N lines are displayed, even if N is more than the screen size.
 .IP "d or ^D"
@@ -178,7 +178,7 @@ Search forward in the file for the N-th line containing the pattern.
 N defaults to 1.
 The pattern is a regular expression, as recognized by
 the regular expression library supplied by your system.
-The search starts at the second line displayed
+The search starts at the first line displayed
 (but see the \-a and \-j options, which change this).
 .sp
 Certain characters are special
@@ -333,7 +333,7 @@ the current setting is printed and nothing is changed.
 .IP \-\-
 Like the \- command, but takes a long option name (see OPTIONS below)
 rather than a single option letter.
-You must press RETURN after typing the option name.
+You must press ENTER or RETURN after typing the option name.
 A ^P immediately after the second dash suppresses printing of a 
 message describing the new setting, as in the \- command.
 .IP \-+
@@ -363,7 +363,7 @@ The setting of the option is not changed.
 (Double underscore.)
 Like the _ (underscore) command, but takes a long option name
 rather than a single option letter.
-You must press RETURN after typing the option name.
+You must press ENTER or RETURN after typing the option name.
 .IP +cmd
 Causes the specified cmd to be executed each time a new file is examined.
 For example, +G causes 
@@ -465,11 +465,24 @@ This option displays a summary of the commands accepted by
 (Depending on how your shell interprets the question mark,
 it may be necessary to quote the question mark, thus: "\-\e?".)
 .IP "\-a or \-\-search-skip-screen"
-Causes searches to start after the last line
-displayed on the screen, 
+By default, forward searches start at the top of the displayed screen
+and backwards searches start at the bottom of the displayed screen
+(except for repeated searches invoked by the n or N commands,
+which start after or before the "target" line respectively;
+see the \-j option for more about the target line).
+The \-a option causes forward searches to instead start at
+the bottom of the screen
+and backward searches to start at the top of the screen,
 thus skipping all lines displayed on the screen.
-By default, searches start at the second line on the screen
-(or after the last found line; see the \-j option).
+.IP "\-A or \-\-SEARCH-SKIP-SCREEN"
+Causes all forward searches (not just non-repeated searches) 
+to start just after the target line, and all backward searches 
+to start just before the target line.
+Thus, forward searches will skip part of the displayed screen
+(from the first line up to and including the target line).
+Similarly backwards searches will skip the displayed screen
+from the last line up to and including the target line.
+This was the default behavior in less versions prior to 441.
 .IP "\-b\fIn\fP or \-\-buffers=\fIn\fP"
 Specifies the amount of buffer space
 .I less
@@ -590,7 +603,8 @@ is recalculated if the terminal window is resized, so that the
 target line remains at the specified fraction of the screen height.
 If any form of the \-j option is used, 
 forward searches begin at the line immediately after the target line,
-and backward searches begin at the target line.
+and backward searches begin at the target line,
+unless changed by \-a or \-A.
 For example, if "\-j4" is used, the target line is the
 fourth line on the screen, so forward searches begin at the fifth line
 on the screen.
@@ -613,7 +627,8 @@ file.
 .IP "\-K or \-\-quit-on-intr"
 Causes
 .I less
-to exit immediately when an interrupt character (usually ^C) is typed.
+to exit immediately (with status 2)
+when an interrupt character (usually ^C) is typed.
 Normally, an interrupt character causes
 .I less
 to stop whatever it is doing and return to its command prompt.
@@ -970,6 +985,8 @@ Delete the entire command line,
 or cancel the command if the command line is empty.
 If you have changed your line-kill character in Unix to something
 other than ^U, that character is used instead of ^U.
+.IP "^G"
+Delete the entire command line and return to the main prompt.
 
 .SH "KEY BINDINGS"
 You may define your own 
@@ -1290,7 +1307,6 @@ The remainder of LESSBINFMT is a string which may include one
 printf-style escape sequence (a % followed by x, X, o, d, etc.).
 For example, if LESSBINFMT is "*u[%x]", binary characters
 are displayed in underlined hexadecimal surrounded by brackets.
-The default if no LESSBINFMT is specified is "*s<%X>".
 The default if no LESSBINFMT is specified is "*s<%02X>".
 Warning: the result of expanding the character via LESSBINFMT must
 be less than 31 characters.
@@ -1347,6 +1363,8 @@ or the EDITOR environment variable if VISUAL is not defined).
 See the discussion of the LESSEDIT feature below.
 .IP "%f"
 Replaced by the name of the current input file.
+.IP "%F"
+Replaced by the last component of the name of the current input file.
 .IP "%i"
 Replaced by the index of the current file in the list of
 input files.
@@ -1664,7 +1682,7 @@ The name of the editor (used for the v command).
 lesskey(1)
 
 .SH COPYRIGHT
-Copyright (C) 1984-2009  Mark Nudelman
+Copyright (C) 1984-2011  Mark Nudelman
 .PP
 less is part of the GNU project and is free software.
 You can redistribute it and/or modify it
@@ -1689,11 +1707,9 @@ See the GNU General Public License for more details.
 .PP
 Mark Nudelman <markn@greenwoodsoftware.com>
 .br
-See http://www.greenwoodsoftware.com/less/bugs.html for the latest list of known bugs in less.
-.br
-Send bug reports or comments to the above address or to 
+Send bug reports or comments to the above address or to bug-less@gnu.org.
 .br
-bug-less@gnu.org.
+See http://www.greenwoodsoftware.com/less/bugs.html for the latest list of known bugs in less.
 .br
 For more information, see the less homepage at 
 .br
index bf6f19d..6dcaf6c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -28,7 +28,7 @@
 
 #include "less.h"
 
-static char *version = "$Revision: 1.13 $";
+static char *version = "$Revision: 1.14 $";
 
 static int quote_all = 0;
 static char openquote = '"';
index 613dff6..5c17708 100644 (file)
@@ -1,4 +1,4 @@
-.TH LESSECHO 1 "Version 436: 07 Jul 2009"
+.TH LESSECHO 1 "Version 443: 09 Apr 2011"
 .SH NAME
 lessecho \- expand metacharacters
 .SH SYNOPSIS
index 54d6b77..1ee2c40 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -166,6 +166,7 @@ struct cmdname editnames[] =
        { "insert",             EC_INSERT },
        { "invalid",            EC_UINVALID },
        { "kill-line",          EC_LINEKILL },
+       { "abort",              EC_ABORT },
        { "left",               EC_LEFT },
        { "literal",            EC_LITERAL },
        { "right",              EC_RIGHT },
index 088f95a..9a457a9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index fb6c61a..8c99a0f 100644 (file)
@@ -1,4 +1,4 @@
-.TH LESSKEY 1 "Version 436: 07 Jul 2009"
+.TH LESSKEY 1 "Version 443: 09 Apr 2011"
 .SH NAME
 lesskey \- specify key bindings for less
 .SH SYNOPSIS
@@ -13,7 +13,7 @@ lesskey \- specify key bindings for less
 .I Lesskey
 is used to specify a set of key bindings to be used by 
 .I less.
-The input file is a text file which describes the key bindings,
+The input file is a text file which describes the key bindings.
 If the input file is "-", standard input is read.
 If no input file is specified, a standard filename is used
 as the name of the input file, which depends on the system being used:
@@ -311,6 +311,7 @@ default line-editing keys used by less:
        \eek            up
        \eku            up
        \eej            down
+       ^G              abort
 .fi
 .sp
 
@@ -349,17 +350,12 @@ is run, and specifies the character set to be "latin1":
 less(1)
 
 .SH WARNINGS
-It is not possible to specify special keys, such as uparrow, 
-in a keyboard-independent manner.
-The only way to specify such keys is to specify the escape sequence
-which a particular keyboard sends when such a key is pressed.
-.PP
 On MS-DOS and OS/2 systems, certain keys send a sequence of characters
 which start with a NUL character (0).
 This NUL character should be represented as \e340 in a lesskey file.
 
 .SH COPYRIGHT
-Copyright (C) 2000-2009  Mark Nudelman
+Copyright (C) 2000-2011  Mark Nudelman
 .PP
 lesskey is part of the GNU project and is free software;
 you can redistribute it and/or modify it
index e5d0c50..e2427e3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 217c8fc..798d4f2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index ae45085..4369f87 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 18b259e..0a8ca52 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index ed6a616..0af1762 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -32,7 +32,6 @@ public char * progname;
 public int     quitting;
 public int     secure;
 public int     dohelp;
-public int     less_is_more;
 
 #if LOGFILE
 public int     logfile = -1;
@@ -55,6 +54,7 @@ extern int    jump_sline;
 static char consoleTitle[256];
 #endif
 
+extern int     less_is_more;
 extern int     missing_cap;
 extern int     know_dumb;
 extern int     quit_if_one_screen;
@@ -406,7 +406,7 @@ quit(status)
         */
        close(2);
 #endif
-#if WIN32
+#ifdef WIN32
        SetConsoleTitle(consoleTitle);
 #endif
        close_getchr();
index 5e2215e..585b412 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 2416afd..79ac7c6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 9841916..acb8962 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -24,7 +24,6 @@
 static struct loption *pendopt;
 public int plusoption = FALSE;
 
-static char *propt();
 static char *optstring();
 static int flip_triple();
 
@@ -33,6 +32,35 @@ extern int less_is_more;
 extern int quit_at_eof;
 extern char *every_first_cmd;
 
+/*
+ * Return a printable description of an option.
+ */
+       static char *
+opt_desc(o)
+       struct loption *o;
+{
+       static char buf[OPTNAME_MAX + 10];
+       if (o->oletter == OLETTER_NONE)
+               SNPRINTF1(buf, sizeof(buf), "--%s", o->onames->oname);
+       else
+               SNPRINTF2(buf, sizeof(buf), "-%c (--%s)", o->oletter, o->onames->oname);
+       return (buf);
+}
+
+/*
+ * Return a string suitable for printing as the "name" of an option.
+ * For example, if the option letter is 'x', just return "-x".
+ */
+       public char *
+propt(c)
+       int c;
+{
+       static char buf[8];
+
+       sprintf(buf, "-%s", prchar(c));
+       return (buf);
+}
+
 /* 
  * Scan an argument (either from the command line or from the 
  * LESS environment variable) and process it.
@@ -69,7 +97,7 @@ scan_option(s)
                        (*pendopt->ofunc)(INIT, s);
                        break;
                case NUMBER:
-                       printopt = propt(pendopt->oletter);
+                       printopt = opt_desc(pendopt);
                        *(pendopt->ovar) = getnum(&s, printopt, (int*)NULL);
                        break;
                }
@@ -261,12 +289,12 @@ scan_option(s)
  *     OPT_SET         set to the inverse of the default value
  */
        public void
-toggle_option(c, s, how_toggle)
-       int c;
+toggle_option(o, lower, s, how_toggle)
+       struct loption *o;
+       int lower;
        char *s;
        int how_toggle;
 {
-       register struct loption *o;
        register int num;
        int no_prompt;
        int err;
@@ -275,27 +303,22 @@ toggle_option(c, s, how_toggle)
        no_prompt = (how_toggle & OPT_NO_PROMPT);
        how_toggle &= ~OPT_NO_PROMPT;
 
-       /*
-        * Look up the option letter in the option table.
-        */
-       o = findopt(c);
        if (o == NULL)
        {
-               parg.p_string = propt(c);
-               error("There is no %s option", &parg);
+               error("No such option", NULL_PARG);
                return;
        }
 
        if (how_toggle == OPT_TOGGLE && (o->otype & NO_TOGGLE))
        {
-               parg.p_string = propt(c);
+               parg.p_string = opt_desc(o);
                error("Cannot change the %s option", &parg);
                return;
-       } 
+       }
 
        if (how_toggle == OPT_NO_TOGGLE && (o->otype & NO_QUERY))
        {
-               parg.p_string = propt(c);
+               parg.p_string = opt_desc(o);
                error("Cannot query the %s option", &parg);
                return;
        } 
@@ -355,15 +378,13 @@ toggle_option(c, s, how_toggle)
                        switch (how_toggle)
                        {
                        case OPT_TOGGLE:
-                               *(o->ovar) = flip_triple(*(o->ovar), 
-                                               ASCII_IS_LOWER(c));
+                               *(o->ovar) = flip_triple(*(o->ovar), lower);
                                break;
                        case OPT_UNSET:
                                *(o->ovar) = o->odefault;
                                break;
                        case OPT_SET:
-                               *(o->ovar) = flip_triple(o->odefault,
-                                               ASCII_IS_LOWER(c));
+                               *(o->ovar) = flip_triple(o->odefault, lower);
                                break;
                        }
                        break;
@@ -465,33 +486,17 @@ flip_triple(val, lc)
 }
 
 /*
- * Return a string suitable for printing as the "name" of an option.
- * For example, if the option letter is 'x', just return "-x".
- */
-       static char *
-propt(c)
-       int c;
-{
-       static char buf[8];
-
-       sprintf(buf, "-%s", prchar(c));
-       return (buf);
-}
-
-/*
- * Determine if an option is a single character option (BOOL or TRIPLE),
- * or if it a multi-character option (NUMBER).
+ * Determine if an option takes a parameter.
  */
        public int
-single_char_option(c)
-       int c;
+opt_has_param(o)
+       struct loption *o;
 {
-       register struct loption *o;
-
-       o = findopt(c);
        if (o == NULL)
-               return (TRUE);
-       return ((o->otype & (BOOL|TRIPLE|NOVAR|NO_TOGGLE)) != 0);
+               return (0);
+       if (o->otype & (BOOL|TRIPLE|NOVAR|NO_TOGGLE))
+               return (0);
+       return (1);
 }
 
 /*
@@ -499,14 +504,11 @@ single_char_option(c)
  * Only string and number valued options have prompts.
  */
        public char *
-opt_prompt(c)
-       int c;
+opt_prompt(o)
+       struct loption *o;
 {
-       register struct loption *o;
-
-       o = findopt(c);
        if (o == NULL || (o->otype & (STRING|NUMBER)) == 0)
-               return (NULL);
+               return ("?");
        return (o->odesc[0]);
 }
 
@@ -541,7 +543,7 @@ nostring(printopt)
        public void
 nopendopt()
 {
-       nostring(propt(pendopt->oletter));
+       nostring(opt_desc(pendopt));
 }
 
 /*
index c393ed4..a32139e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -27,6 +27,8 @@
 
 #define        OTYPE           (BOOL|TRIPLE|NUMBER|STRING|NOVAR)
 
+#define OLETTER_NONE    '\1'     /* Invalid option letter */
+
 /*
  * Argument to a handling function tells what type of activity:
  */
@@ -50,6 +52,8 @@ struct optname
        struct optname *onext;  /* List of synonymous option names */
 };
 
+#define OPTNAME_MAX    32      /* Max length of long option name */
+
 struct loption
 {
        char oletter;           /* The controlling letter (a-z) */
index c96b333..d1c60a2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -133,11 +133,11 @@ static struct optname follow_optname = { "follow-name",          NULL };
 static struct loption option[] =
 {
        { 'a', &a_optname,
-               BOOL, OPT_OFF, &how_search, NULL,
+               TRIPLE, OPT_ONPLUS, &how_search, NULL,
                {
                        "Search includes displayed screen",
                        "Search skips displayed screen",
-                       NULL
+                       "Search includes all of displayed screen"
                }
        },
 
@@ -237,7 +237,7 @@ static struct loption option[] =
                STRING, 0, NULL, opt_j,
                {
                        "Target line: ",
-                       "0123456789.",
+                       "0123456789.-",
                        NULL
                }
        },
@@ -427,7 +427,7 @@ static struct loption option[] =
                        NULL
                }
        },
-       { '.', &keypad_optname,
+       { OLETTER_NONE, &keypad_optname,
                BOOL|NO_TOGGLE, OPT_OFF, &no_keypad, NULL,
                {
                        "Use keypad mode",
@@ -435,7 +435,7 @@ static struct loption option[] =
                        NULL
                }
        },
-       { '.', &oldbot_optname,
+       { OLETTER_NONE, &oldbot_optname,
                BOOL, OPT_OFF, &oldbot, NULL,
                {
                        "Use new bottom of screen behavior",
@@ -443,11 +443,11 @@ static struct loption option[] =
                        NULL
                }
        },
-       { '.', &follow_optname,
+       { OLETTER_NONE, &follow_optname,
                BOOL, FOLLOW_DESC, &follow_mode, NULL,
                {
-                       "F command Follows file descriptor",
-                       "F command Follows file name",
+                       "F command follows file descriptor",
+                       "F command follows file name",
                        NULL
                }
        },
index ffa495d..dbb52fe 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -250,6 +250,28 @@ errno_message(filename)
        return (m);
 }
 
+/* #define HAVE_FLOAT 0 */
+
+       static POSITION
+muldiv(val, num, den)
+       POSITION val, num, den;
+{
+#if HAVE_FLOAT
+       double v = (((double) val) * num) / den;
+       return ((POSITION) (v + 0.5));
+#else
+       POSITION v = ((POSITION) val) * num;
+
+       if (v / num == val)
+               /* No overflow */
+               return (POSITION) (v / den);
+       else
+               /* Above calculation overflows; 
+                * use a method that is less precise but won't overflow. */
+               return (POSITION) (val / (den / num));
+#endif
+}
+
 /*
  * Return the ratio of two POSITIONS, as a percentage.
  * {{ Assumes a POSITION is a long int. }}
@@ -258,12 +280,7 @@ errno_message(filename)
 percentage(num, den)
        POSITION num, den;
 {
-       POSITION num100 = num * 100;
-
-       if (num100 / 100 == num)
-               return (num100 / den);
-       else
-               return (num / (den / 100));
+       return (int) muldiv(num,  (POSITION) 100, den);
 }
 
 /*
@@ -276,19 +293,11 @@ percent_pos(pos, percent, fraction)
        long fraction;
 {
        /* Change percent (parts per 100) to perden (parts per NUM_FRAC_DENOM). */
-       long perden = (percent * (NUM_FRAC_DENOM / 100)) + (fraction / 100);
-       POSITION temp;
+       POSITION perden = (percent * (NUM_FRAC_DENOM / 100)) + (fraction / 100);
 
        if (perden == 0)
                return (0);
-       temp = pos * perden;  /* This might overflow. */
-       if (temp / perden == pos)
-               /* No overflow */
-               return (temp / NUM_FRAC_DENOM);
-       else
-               /* Above calculation overflows; 
-                * use a method that is less precise but won't overflow. */
-               return (perden * (pos / NUM_FRAC_DENOM));
+       return (POSITION) muldiv(pos, perden, (POSITION) NUM_FRAC_DENOM);
 }
 
 #if !HAVE_STRCHR
index 2e7b31c..a4fdada 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -532,6 +532,7 @@ error(fmt, parg)
 
        get_return();
        lower_left();
+    clear_eol();
 
        if (col >= sc_width)
                /*
index f1fb3ef..ca349b6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -254,8 +254,8 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type)
 
        if (search_type & SRCH_NO_REGEX)
                matched = match(tpattern, strlen(tpattern), line, line_len, sp, ep);
-    else
-    {
+       else
+       {
 #if HAVE_POSIX_REGCOMP
        {
                regmatch_t rm;
@@ -314,7 +314,7 @@ match_pattern(pattern, tpattern, line, line_len, sp, ep, notbol, search_type)
 #if NO_REGEX
        matched = match(tpattern, strlen(tpattern), line, line_len, sp, ep);
 #endif
-    }
+       }
        matched = (!(search_type & SRCH_NO_MATCH) && matched) ||
                        ((search_type & SRCH_NO_MATCH) && !matched);
        return (matched);
index 759234a..3b44e2d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 04bac1d..3708d85 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 883a0fb..8c05c5d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index e7291b7..146972c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index ff2345c..dce34f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -303,6 +303,9 @@ protochar(c, where, iseditproto)
        case 'f':       /* File name */
                ap_str(get_filename(curr_ifile));
                break;
+       case 'F':       /* Last component of file name */
+               ap_str(last_component(get_filename(curr_ifile)));
+               break;
        case 'i':       /* Index into list of files */
 #if TAGS
                if (ntags())
@@ -363,6 +366,7 @@ protochar(c, where, iseditproto)
        case 't':       /* Truncate trailing spaces in the message */
                while (mp > message && mp[-1] == ' ')
                        mp--;
+               *mp = '\0';
                break;
        case 'T':       /* Type of list */
 #if TAGS
index edb7e86..b8bc666 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -1788,7 +1788,7 @@ win32_scroll_up(n)
 
        /* Move the source text to the top of the screen. */
        new_org.X = rcSrc.Left;
-       /* new_org.Y = rcClip.top; -- doesn't compile under MSVC6 */
+       new_org.Y = rcClip.Top;
 
        /* Fill the right character and attributes. */
        fillchar.Char.AsciiChar = ' ';
index 90db0eb..143779e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -70,6 +70,25 @@ struct pattern_info {
 static struct pattern_info search_info;
 static struct pattern_info filter_info;
 
+/*
+ * Are there any uppercase letters in this string?
+ */
+       static int
+is_ucase(str)
+       char *str;
+{
+       char *str_end = str + strlen(str);
+       LWCHAR ch;
+
+       while (str < str_end)
+       {
+               ch = step_char(&str, +1, str_end);
+               if (IS_UPPER(ch))
+                       return (1);
+       }
+       return (0);
+}
+
 /*
  * Compile and save a search pattern.
  */
@@ -93,6 +112,16 @@ set_pattern(info, pattern, search_type)
                strcpy(info->text, pattern);
        }
        info->search_type = search_type;
+
+       /*
+        * Ignore case if -I is set OR
+        * -i is set AND the pattern is all lowercase.
+        */
+       is_ucase_pattern = is_ucase(pattern);
+       if (is_ucase_pattern && caseless != OPT_ONPLUS)
+               is_caseless = 0;
+       else
+               is_caseless = caseless;
        return 0;
 }
 
@@ -155,25 +184,6 @@ get_cvt_ops()
        return (ops);
 }
 
-/*
- * Are there any uppercase letters in this string?
- */
-       static int
-is_ucase(str)
-       char *str;
-{
-       char *str_end = str + strlen(str);
-       LWCHAR ch;
-
-       while (str < str_end)
-       {
-               ch = step_char(&str, +1, str_end);
-               if (IS_UPPER(ch))
-                       return (1);
-       }
-       return (0);
-}
-
 /*
  * Is there a previous (remembered) search pattern?
  */
@@ -229,7 +239,7 @@ repaint_hilite(on)
                goto_line(slinenum);
                put_line();
        }
-       lower_left(); // if !oldbot
+       lower_left();
        hide_hilite = save_hide_hilite;
 }
 
@@ -599,7 +609,7 @@ search_pos(search_type)
                 */
                if (search_type & SRCH_FORW)
                {
-                       return (ch_zero());
+                       pos = ch_zero();
                } else
                {
                        pos = ch_length();
@@ -608,46 +618,66 @@ search_pos(search_type)
                                (void) ch_end_seek();
                                pos = ch_length();
                        }
-                       return (pos);
                }
-       }
-       if (how_search)
+               linenum = 0;
+       } else 
        {
-               /*
-                * Search does not include current screen.
-                */
-               if (search_type & SRCH_FORW)
-                       linenum = BOTTOM_PLUS_ONE;
-               else
-                       linenum = TOP;
-               pos = position(linenum);
-       } else
-       {
-               /*
-                * Search includes current screen.
-                * It starts at the jump target (if searching backwards),
-                * or at the jump target plus one (if forwards).
-                */
-               linenum = adjsline(jump_sline);
-               pos = position(linenum);
-               if (search_type & SRCH_FORW)
+               int add_one = 0;
+
+               if (how_search == OPT_ON)
                {
-                       pos = forw_raw_line(pos, (char **)NULL, (int *)NULL);
-                       while (pos == NULL_POSITION)
-                       {
-                               if (++linenum >= sc_height)
-                                       break;
-                               pos = position(linenum);
-                       }
+                       /*
+                        * Search does not include current screen.
+                        */
+                       if (search_type & SRCH_FORW)
+                               linenum = BOTTOM_PLUS_ONE;
+                       else
+                               linenum = TOP;
+               } else if (how_search == OPT_ONPLUS && !(search_type & SRCH_AFTER_TARGET))
+               {
+                       /*
+                        * Search includes all of displayed screen.
+                        */
+                       if (search_type & SRCH_FORW)
+                               linenum = TOP;
+                       else
+                               linenum = BOTTOM_PLUS_ONE;
                } else 
                {
-                       while (pos == NULL_POSITION)
-                       {
-                               if (--linenum < 0)
-                                       break;
-                               pos = position(linenum);
-                       }
+                       /*
+                        * Search includes the part of current screen beyond the jump target.
+                        * It starts at the jump target (if searching backwards),
+                        * or at the jump target plus one (if forwards).
+                        */
+                       linenum = jump_sline;
+                       if (search_type & SRCH_FORW) 
+                           add_one = 1;
                }
+               linenum = adjsline(linenum);
+               pos = position(linenum);
+               if (add_one)
+                       pos = forw_raw_line(pos, (char **)NULL, (int *)NULL);
+       }
+
+       /*
+        * If the line is empty, look around for a plausible starting place.
+        */
+       if (search_type & SRCH_FORW) 
+       {
+           while (pos == NULL_POSITION)
+           {
+               if (++linenum >= sc_height)
+                   break;
+               pos = position(linenum);
+           }
+       } else 
+       {
+           while (pos == NULL_POSITION)
+           {
+               if (--linenum < 0)
+                   break;
+               pos = position(linenum);
+           }
        }
        return (pos);
 }
@@ -789,7 +819,7 @@ search_range(pos, endpos, search_type, matches, maxlines, plinepos, pendpos)
                if (prev_pattern(&search_info))
                {
                        line_match = match_pattern(search_info.compiled, search_info.text,
-                               cline, line_len, &sp, &ep, 0, search_type); //FIXME search_info.search_type
+                               cline, line_len, &sp, &ep, 0, search_type);
                        if (line_match)
                        {
                                /*
@@ -853,12 +883,6 @@ hist_pattern(search_type)
        if (set_pattern(&search_info, pattern, search_type) < 0)
                return (0);
 
-       is_ucase_pattern = is_ucase(pattern);
-       if (is_ucase_pattern && caseless != OPT_ONPLUS)
-               is_caseless = 0;
-       else
-               is_caseless = caseless;
-
 #if HILITE_SEARCH
        if (hilite_search == OPT_ONPLUS && !hide_hilite)
                hilite_screen();
@@ -892,6 +916,7 @@ search(search_type, pattern, n)
                /*
                 * A null pattern means use the previously compiled pattern.
                 */
+               search_type |= SRCH_AFTER_TARGET;
                if (!prev_pattern(&search_info) && !hist_pattern(search_type))
                {
                        error("No previous regular expression", NULL_PARG);
@@ -930,15 +955,6 @@ search(search_type, pattern, n)
                 */
                if (set_pattern(&search_info, pattern, search_type) < 0)
                        return (-1);
-               /*
-                * Ignore case if -I is set OR
-                * -i is set AND the pattern is all lowercase.
-                */
-               is_ucase_pattern = is_ucase(pattern);
-               if (is_ucase_pattern && caseless != OPT_ONPLUS)
-                       is_caseless = 0;
-               else
-                       is_caseless = caseless;
 #if HILITE_SEARCH
                if (hilite_search)
                {
index b5e2977..0fbaf7e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -252,6 +252,6 @@ psignals()
        if (tsignals & S_INTERRUPT)
        {
                if (quit_on_intr)
-                       quit(QUIT_OK);
+                       quit(QUIT_INTERRUPT);
        }
 }
index 2f39d42..c00f9d4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 131d443..00f2c9e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
index 84c7613..be75d20 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1984-2009  Mark Nudelman
+ * Copyright (C) 1984-2011  Mark Nudelman
  *
  * You may distribute under the terms of either the GNU General Public
  * License or the Less License, as specified in the README file.
@@ -729,6 +729,19 @@ v433  6/28/09   Cleanup search code.
 v434  6/29/09   More cleanup.
 v435  7/04/09   Fix bugs with non-regex filtering.
 v436  7/05/09   Fix memory leak.
+-----------------------------------------------------------------
+v437  7/14/09   Fix bug in handling some long option names;
+                make percentage calculation more accurate.
+v438  12/29/10  Fix bugs with -i/-I and & filtering; 
+                exit with status 2 on ctrl-C with -K.
+v439  12/31/10  Add -A option.
+v440  1/5/11    Fix bug displaying prompt after = command.
+v441  1/21/11   Fix semi-infinite loop if no newlines in file;
+                make new -A behavior the default.
+-----------------------------------------------------------------
+v442  3/2/11    Fix search bug.
+                Add ctrl-G line edit command.
+v443  4/9/11    Fix Windows build.
 */
 
-char version[] = "436";
+char version[] = "443";