=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/rs/rs.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- src/usr.bin/rs/rs.c 2005/05/14 17:12:51 1.13 +++ src/usr.bin/rs/rs.c 2005/05/14 23:08:47 1.14 @@ -1,4 +1,4 @@ -/* $OpenBSD: rs.c,v 1.13 2005/05/14 17:12:51 millert Exp $ */ +/* $OpenBSD: rs.c,v 1.14 2005/05/14 23:08:47 millert Exp $ */ /*- * Copyright (c) 1993 @@ -39,7 +39,7 @@ #if 0 static const char sccsid[] = "@(#)rs.c 8.1 (Berkeley) 6/6/93"; #else -static const char rcsid[] = "$OpenBSD: rs.c,v 1.13 2005/05/14 17:12:51 millert Exp $"; +static const char rcsid[] = "$OpenBSD: rs.c,v 1.14 2005/05/14 23:08:47 millert Exp $"; #endif #endif /* not lint */ @@ -51,6 +51,8 @@ #include #include +#include +#include #include #include #include @@ -97,7 +99,6 @@ void getfile(void); int getline(void); char *getlist(short **, char *); -char *getnum(int *, char *, int); char **getptrs(char **); void prepfile(void); void prints(char *, int); @@ -374,6 +375,7 @@ getargs(int ac, char *av[]) { int ch; + const char *errstr; if (ac == 1) flags |= NOARGS | TRANSPOSE; @@ -408,9 +410,9 @@ osep = *optarg; break; case 'w': /* window width, default 80 */ - getnum(&owidth, optarg, 0); - if (owidth <= 0) { - warnx("width must be a positive integer"); + owidth = strtonum(optarg, 1, INT_MAX, &errstr); + if (errstr) { + warnx("width %s", errstr); usage(); } break; @@ -418,18 +420,30 @@ flags |= SKIPPRINT; /* FALLTHROUGH */ case 'k': /* skip, do not print */ - getnum(&skip, optarg, 0); - if (!skip) + skip = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) { + warnx("skip value %s", errstr); + usage(); + } + if (skip == 0) skip = 1; break; case 'm': flags |= NOTRIMENDCOL; break; - case 'g': /* gutter space */ - getnum(&gutter, optarg, 0); + case 'g': /* gutter width */ + gutter = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) { + warnx("gutter width %s", errstr); + usage(); + } break; case 'G': - getnum(&propgutter, optarg, 0); + propgutter = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) { + warnx("gutter proportion %s", errstr); + usage(); + } break; case 'e': /* each line is an entry */ flags |= ONEPERLINE; @@ -475,9 +489,17 @@ switch (ac) { case 2: - ocols = atoi(av[1]); + ocols = strtonum(av[1], 0, INT_MAX, &errstr); + if (errstr) { + warnx("columns value %s", errstr); + usage(); + } case 1: - orows = atoi(av[0]); + orows = strtonum(av[0], 0, INT_MAX, &errstr); + if (errstr) { + warnx("columns value %s", errstr); + usage(); + } case 0: break; default: @@ -489,7 +511,8 @@ getlist(short **list, char *p) { int count = 1; - char *t; + char *t, *ep; + long l; for (t = p + 1; *t; t++) { if (!isdigit(*t)) { @@ -506,36 +529,21 @@ errx(1, "No list space"); count = 0; for (t = p + 1; *t; t++) { - (*list)[count++] = atoi(t); + errno = 0; + l = strtol(t, &ep, 10); + if (t == ep) + break; /* can't happen */ + if ((errno == ERANGE && (l == LONG_MAX || l == LONG_MIN)) || + (l > SHRT_MAX || l < SHRT_MIN)) { + warnx("list value out of range"); + usage(); + } + (*list)[count++] = (short)l; printf("++ %d ", (*list)[count-1]); fflush(stdout); - while (*t && isdigit(*t)) - t++; - if (*t != ',') + if (*(t = ep) != ',') break; } (*list)[count] = 0; return(t - 1); -} - -/* num = number p points to; if (strict) complain */ -/* returns pointer to end of num */ -char * -getnum(int *num, char *p, int strict) -{ - char *t = p; - - if (!isdigit(*++t)) { - if (strict || *t == '-' || *t == '+') { - warnx("option -%c requires an unsigned integer", *p); - usage(); - } - *num = 0; - return(p); - } - *num = atoi(t); - while (*++t) - if (!isdigit(*t)) - break; - return(--t); }