version 1.7, 2011/09/16 18:12:09 |
version 1.8, 2014/04/25 13:38:21 |
|
|
/* |
/* |
* Copyright (C) 1984-2011 Mark Nudelman |
* Copyright (C) 1984-2012 Mark Nudelman |
* |
* |
* You may distribute under the terms of either the GNU General Public |
* You may distribute under the terms of either the GNU General Public |
* License or the Less License, as specified in the README file. |
* License or the Less License, as specified in the README file. |
* |
* |
* For more information about less, or for information on how to |
* For more information, see the README file. |
* contact the author, see the README file. |
|
*/ |
*/ |
|
|
|
|
|
|
extern int less_is_more; |
extern int less_is_more; |
extern int quit_at_eof; |
extern int quit_at_eof; |
extern char *every_first_cmd; |
extern char *every_first_cmd; |
|
extern int opt_use_backslash; |
|
|
/* |
/* |
* Return a printable description of an option. |
* Return a printable description of an option. |
|
|
*/ |
*/ |
plusoption = TRUE; |
plusoption = TRUE; |
s = optstring(s, &str, propt('+'), NULL); |
s = optstring(s, &str, propt('+'), NULL); |
|
if (s == NULL) |
|
return; |
if (*str == '+') |
if (*str == '+') |
every_first_cmd = save(++str); |
every_first_cmd = save(str+1); |
else |
else |
ungetsc(str); |
ungetsc(str); |
|
free(str); |
continue; |
continue; |
case '0': case '1': case '2': case '3': case '4': |
case '0': case '1': case '2': case '3': case '4': |
case '5': case '6': case '7': case '8': case '9': |
case '5': case '6': case '7': case '8': case '9': |
|
|
parg.p_string = printopt; |
parg.p_string = printopt; |
error("The %s option should not be followed by =", |
error("The %s option should not be followed by =", |
&parg); |
&parg); |
quit(QUIT_ERROR); |
return; |
} |
} |
s++; |
s++; |
} else |
} else |
|
|
else |
else |
error("There is no %s option (\"less --help\" for help)", |
error("There is no %s option (\"less --help\" for help)", |
&parg); |
&parg); |
quit(QUIT_ERROR); |
return; |
} |
} |
|
|
str = NULL; |
str = NULL; |
|
|
while (*s == ' ') |
while (*s == ' ') |
s++; |
s++; |
s = optstring(s, &str, printopt, o->odesc[1]); |
s = optstring(s, &str, printopt, o->odesc[1]); |
|
if (s == NULL) |
|
return; |
break; |
break; |
case NUMBER: |
case NUMBER: |
if (*s == '\0') |
if (*s == '\0') |
|
|
*/ |
*/ |
if (o->ofunc != NULL) |
if (o->ofunc != NULL) |
(*o->ofunc)(INIT, str); |
(*o->ofunc)(INIT, str); |
|
if (str != NULL) |
|
free(str); |
} |
} |
} |
} |
|
|
|
|
char *validchars; |
char *validchars; |
{ |
{ |
register char *p; |
register char *p; |
|
register char *out; |
|
|
if (*s == '\0') |
if (*s == '\0') |
{ |
{ |
nostring(printopt); |
nostring(printopt); |
quit(QUIT_ERROR); |
return (NULL); |
} |
} |
*p_str = s; |
/* 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++) |
for (p = s; *p != '\0'; p++) |
{ |
{ |
if (*p == END_OPTION_STRING || |
if (opt_use_backslash && *p == '\\' && p[1] != '\0') |
(validchars != NULL && strchr(validchars, *p) == NULL)) |
|
{ |
{ |
switch (*p) |
/* Take next char literally. */ |
{ |
++p; |
case END_OPTION_STRING: |
} else |
case ' ': case '\t': case '-': |
{ |
/* Replace the char with a null to terminate string. */ |
if (*p == END_OPTION_STRING || |
*p++ = '\0'; |
(validchars != NULL && strchr(validchars, *p) == NULL)) |
|
/* End of option string. */ |
break; |
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; |
|
} |
} |
|
*out++ = *p; |
} |
} |
|
*out = '\0'; |
return (p); |
return (p); |
} |
} |
|
|
|
|
parg.p_string = printopt; |
parg.p_string = printopt; |
error("Number is required after %s", &parg); |
error("Number is required after %s", &parg); |
} |
} |
quit(QUIT_ERROR); |
|
/* NOTREACHED */ |
|
return (-1); |
return (-1); |
} |
} |
|
|