Trivial conversion to strtonum().
- todd
Index: bin/ed/ed.h
===================================================================
RCS file: /cvs/src/bin/ed/ed.h,v
retrieving revision 1.15
diff -u -r1.15 ed.h
--- bin/ed/ed.h 16 Jan 2015 06:39:32 -0000 1.15
+++ bin/ed/ed.h 18 Mar 2015 21:30:03 -0000
@@ -103,17 +103,6 @@
if (sigflags & (1 << (SIGINT - 1))) handle_int(SIGINT); \
}
-/* STRTOI: convert a string to int */
-#define STRTOI(i, p) { \
- long l = strtol(p, &p, 10); \
- if (l <= INT_MIN || l >= INT_MAX) { \
- seterrmsg("number out of range"); \
- i = 0; \
- return ERR; \
- } else \
- i = (int)l; \
-}
-
/* REALLOC: assure at least a minimum size for buffer b */
#define REALLOC(b,n,i,err) \
if ((i) > (n)) { \
@@ -202,7 +191,7 @@
int read_stream(FILE *, int);
int search_and_replace(pattern_t *, int, int);
int set_active_node(line_t *);
-void seterrmsg(char *);
+void seterrmsg(const char *, ...);
void signal_hup(int);
void signal_int(int);
char *strip_escapes(char *);
Index: bin/ed/main.c
===================================================================
RCS file: /cvs/src/bin/ed/main.c,v
retrieving revision 1.43
diff -u -r1.43 main.c
--- bin/ed/main.c 16 Jan 2015 06:39:32 -0000 1.43
+++ bin/ed/main.c 18 Mar 2015 21:32:17 -0000
@@ -45,9 +45,10 @@
#include <sys/stat.h>
#include <sys/wait.h>
#include <ctype.h>
+#include <pwd.h>
#include <setjmp.h>
+#include <stdarg.h>
#include <unistd.h>
-#include <pwd.h>
#include "ed.h"
@@ -92,9 +93,13 @@
char *home; /* home directory */
void
-seterrmsg(char *s)
+seterrmsg(const char *fmt, ...)
{
- strlcpy(errmsg, s, sizeof(errmsg));
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsnprintf(errmsg, sizeof(errmsg), fmt, ap);
+ va_end(ap);
}
/* ed: line editor */
@@ -304,6 +309,7 @@
next_addr(void)
{
char *hd;
+ const char *errstr;
int addr = current_addr;
int n;
int first = 1;
@@ -320,7 +326,11 @@
ibufp++;
SKIP_BLANKS();
if (isdigit((unsigned char)*ibufp)) {
- STRTOI(n, ibufp);
+ n = strtonum(ibufp, INT_MIN, INT_MAX, &errstr);
+ if (errstr != NULL) {
+ seterrmsg("number is %s", errstr);
+ return ERR;
+ }
addr += (c == '-' || c == '^') ? -n : n;
} else if (!isspace(c))
addr += (c == '-' || c == '^') ? -1 : 1;
@@ -329,7 +339,11 @@
case '3': case '4': case '5':
case '6': case '7': case '8': case '9':
MUST_BE_FIRST();
- STRTOI(addr, ibufp);
+ addr = strtonum(ibufp, INT_MIN, INT_MAX, &errstr);
+ if (errstr != NULL) {
+ seterrmsg("number is %s", errstr);
+ return ERR;
+ }
break;
case '.':
case '$':
@@ -470,6 +484,7 @@
static int sgflag = 0;
static int sgnum = 0;
+ const char *errstr;
pattern_t *tpat;
char *fnp;
int gflag = 0;
@@ -718,7 +733,11 @@
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
- STRTOI(sgnum, ibufp);
+ sgnum = strtonum(ibufp, INT_MIN, INT_MAX,
&errstr);
+ if (errstr != NULL) {
+ seterrmsg("number is %s", errstr);
+ return ERR;
+ }
sflags |= SGF;
sgflag &= ~GSG; /* override GSG */
break;
@@ -856,8 +875,13 @@
if (check_addr_range(first_addr, current_addr + !isglobal) < 0)
#endif
return ERR;
- else if ('0' < *ibufp && *ibufp <= '9')
- STRTOI(rows, ibufp);
+ else if ('0' < *ibufp && *ibufp <= '9') {
+ rows = strtonum(ibufp, INT_MIN, INT_MAX, &errstr);
+ if (errstr != NULL) {
+ seterrmsg("number is %s", errstr);
+ return ERR;
+ }
+ }
GET_COMMAND_SUFFIX();
if (display_lines(second_addr, min(addr_last,
second_addr + rows), gflag) < 0)
Index: bin/ed/sub.c
===================================================================
RCS file: /cvs/src/bin/ed/sub.c,v
retrieving revision 1.11
diff -u -r1.11 sub.c
--- bin/ed/sub.c 27 Oct 2009 23:59:21 -0000 1.11
+++ bin/ed/sub.c 18 Mar 2015 21:32:36 -0000
@@ -40,6 +40,7 @@
int
extract_subst_tail(int *flagp, int *np)
{
+ const char *errstr;
char delimiter;
*flagp = *np = 0;
@@ -55,7 +56,11 @@
} else if (*ibufp == delimiter)
ibufp++;
if ('1' <= *ibufp && *ibufp <= '9') {
- STRTOI(*np, ibufp);
+ *np = strtonum(ibufp, INT_MIN, INT_MAX, &errstr);
+ if (errstr != NULL) {
+ seterrmsg("number is %s", errstr);
+ return ERR;
+ }
return 0;
} else if (*ibufp == 'g') {
ibufp++;