=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/less/option.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/less/option.c 2011/09/16 18:12:09 1.7 --- src/usr.bin/less/option.c 2014/04/25 13:38:21 1.8 *************** *** 1,11 **** /* ! * 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. * ! * For more information about less, or for information on how to ! * contact the author, see the README file. */ --- 1,10 ---- /* ! * Copyright (C) 1984-2012 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. * ! * For more information, see the README file. */ *************** *** 31,36 **** --- 30,36 ---- extern int less_is_more; extern int quit_at_eof; extern char *every_first_cmd; + extern int opt_use_backslash; /* * Return a printable description of an option. *************** *** 149,158 **** */ plusoption = TRUE; s = optstring(s, &str, propt('+'), NULL); if (*str == '+') ! every_first_cmd = save(++str); else ungetsc(str); continue; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': --- 149,161 ---- */ plusoption = TRUE; s = optstring(s, &str, propt('+'), NULL); + if (s == NULL) + return; if (*str == '+') ! every_first_cmd = save(str+1); else ungetsc(str); + free(str); continue; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': *************** *** 207,213 **** parg.p_string = printopt; error("The %s option should not be followed by =", &parg); ! quit(QUIT_ERROR); } s++; } else --- 210,216 ---- parg.p_string = printopt; error("The %s option should not be followed by =", &parg); ! return; } s++; } else *************** *** 229,235 **** else error("There is no %s option (\"less --help\" for help)", &parg); ! quit(QUIT_ERROR); } str = NULL; --- 232,238 ---- else error("There is no %s option (\"less --help\" for help)", &parg); ! return; } str = NULL; *************** *** 266,271 **** --- 269,276 ---- while (*s == ' ') s++; s = optstring(s, &str, printopt, o->odesc[1]); + if (s == NULL) + return; break; case NUMBER: if (*s == '\0') *************** *** 281,286 **** --- 286,293 ---- */ if (o->ofunc != NULL) (*o->ofunc)(INIT, str); + if (str != NULL) + free(str); } } *************** *** 564,598 **** char *validchars; { register char *p; if (*s == '\0') { nostring(printopt); ! quit(QUIT_ERROR); } ! *p_str = s; for (p = s; *p != '\0'; p++) { ! if (*p == END_OPTION_STRING || ! (validchars != NULL && strchr(validchars, *p) == NULL)) { ! switch (*p) ! { ! case END_OPTION_STRING: ! case ' ': case '\t': case '-': ! /* Replace the char with a null to terminate string. */ ! *p++ = '\0'; break; - default: - /* Cannot replace char; make a copy of the string. */ - *p_str = (char *) ecalloc(p-s+1, sizeof(char)); - strncpy(*p_str, s, p-s); - (*p_str)[p-s] = '\0'; - break; - } - break; } } return (p); } --- 571,603 ---- char *validchars; { register char *p; + register char *out; if (*s == '\0') { nostring(printopt); ! return (NULL); } ! /* Alloc could be more than needed, but not worth trimming. */ ! *p_str = (char *) ecalloc(strlen(s)+1, sizeof(char)); ! out = *p_str; ! for (p = s; *p != '\0'; p++) { ! if (opt_use_backslash && *p == '\\' && p[1] != '\0') { ! /* Take next char literally. */ ! ++p; ! } else ! { ! if (*p == END_OPTION_STRING || ! (validchars != NULL && strchr(validchars, *p) == NULL)) ! /* End of option string. */ break; } + *out++ = *p; } + *out = '\0'; return (p); } *************** *** 615,622 **** parg.p_string = printopt; error("Number is required after %s", &parg); } - quit(QUIT_ERROR); - /* NOTREACHED */ return (-1); } --- 620,625 ----