- document non-literal format string

- use err/errx
- prototypes
This commit is contained in:
christos 2011-08-16 12:00:46 +00:00
parent abf73dc18d
commit 855e98819b
2 changed files with 54 additions and 81 deletions

View File

@ -1,5 +1,7 @@
# $NetBSD: Makefile,v 1.3 2006/10/08 17:52:29 peter Exp $
# $NetBSD: Makefile,v 1.4 2011/08/16 12:00:46 christos Exp $
PROG= nl
COPTS.nl.c += -Wno-format-nonliteral
.include <bsd.prog.mk>

View File

@ -1,4 +1,4 @@
/* $NetBSD: nl.c,v 1.10 2009/04/12 23:37:12 lukem Exp $ */
/* $NetBSD: nl.c,v 1.11 2011/08/16 12:00:46 christos Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@ -33,7 +33,7 @@
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1999\
The NetBSD Foundation, Inc. All rights reserved.");
__RCSID("$NetBSD: nl.c,v 1.10 2009/04/12 23:37:12 lukem Exp $");
__RCSID("$NetBSD: nl.c,v 1.11 2011/08/16 12:00:46 christos Exp $");
#endif
#include <errno.h>
@ -44,6 +44,7 @@ __RCSID("$NetBSD: nl.c,v 1.10 2009/04/12 23:37:12 lukem Exp $");
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <err.h>
typedef enum {
number_all, /* number all lines */
@ -83,10 +84,9 @@ static struct numbering_property numbering_properties[NP_LAST + 1] = {
#define INT_STRLEN_MAXIMUM \
((sizeof (int) * CHAR_BIT - 1) * 302 / 1000 + 2)
static void filter __P((void));
int main __P((int, char *[]));
static void parse_numbering __P((const char *, int));
static void usage __P((void));
static void filter(void);
static void parse_numbering(const char *, int);
static void usage(void) __attribute__((__noreturn__));
/*
* Pointer to dynamically allocated input line buffer, and its size.
@ -98,6 +98,7 @@ static size_t buffersize;
* Dynamically allocated buffer suitable for string representation of ints.
*/
static char *intbuffer;
static size_t intbuffersize;
/*
* Configurable parameters.
@ -129,15 +130,12 @@ static int width = 6;
int
main(argc, argv)
int argc;
char *argv[];
main(int argc, char *argv[])
{
int c;
long val;
unsigned long uval;
char *ep;
size_t intbuffersize;
(void)setlocale(LC_ALL, "");
@ -163,10 +161,9 @@ main(argc, argv)
delim[1] = optarg[1];
/* at most two delimiter characters */
if (optarg[2] != '\0') {
(void)fprintf(stderr,
"nl: invalid delim argument -- %s\n",
errx(EXIT_FAILURE,
"invalid delim argument -- %s",
optarg);
exit(EXIT_FAILURE);
/* NOTREACHED */
}
break;
@ -180,22 +177,18 @@ main(argc, argv)
errno = 0;
val = strtol(optarg, &ep, 10);
if ((ep != NULL && *ep != '\0') ||
((val == LONG_MIN || val == LONG_MAX) && errno != 0)) {
(void)fprintf(stderr,
"invalid incr argument -- %s\n", optarg);
exit(EXIT_FAILURE);
}
((val == LONG_MIN || val == LONG_MAX) && errno != 0))
errx(EXIT_FAILURE,
"invalid incr argument -- %s", optarg);
incr = (int)val;
break;
case 'l':
errno = 0;
uval = strtoul(optarg, &ep, 10);
if ((ep != NULL && *ep != '\0') ||
(uval == ULONG_MAX && errno != 0)) {
(void)fprintf(stderr,
"invalid num argument -- %s\n", optarg);
exit(EXIT_FAILURE);
}
(uval == ULONG_MAX && errno != 0))
errx(EXIT_FAILURE,
"invalid num argument -- %s", optarg);
nblank = (unsigned int)uval;
break;
case 'n':
@ -205,11 +198,9 @@ main(argc, argv)
format = FORMAT_RN;
} else if (strcmp(optarg, "rz") == 0) {
format = FORMAT_RZ;
} else {
(void)fprintf(stderr,
"nl: illegal format -- %s\n", optarg);
exit(EXIT_FAILURE);
}
} else
errx(EXIT_FAILURE,
"illegal format -- %s", optarg);
break;
case 's':
sep = optarg;
@ -218,29 +209,23 @@ main(argc, argv)
errno = 0;
val = strtol(optarg, &ep, 10);
if ((ep != NULL && *ep != '\0') ||
((val == LONG_MIN || val == LONG_MAX) && errno != 0)) {
(void)fprintf(stderr,
"invalid startnum value -- %s\n", optarg);
exit(EXIT_FAILURE);
}
((val == LONG_MIN || val == LONG_MAX) && errno != 0))
errx(EXIT_FAILURE,
"invalid startnum value -- %s", optarg);
startnum = (int)val;
break;
case 'w':
errno = 0;
val = strtol(optarg, &ep, 10);
if ((ep != NULL && *ep != '\0') ||
((val == LONG_MIN || val == LONG_MAX) && errno != 0)) {
(void)fprintf(stderr,
"invalid width value -- %s\n", optarg);
exit(EXIT_FAILURE);
}
((val == LONG_MIN || val == LONG_MAX) && errno != 0))
errx(EXIT_FAILURE,
"invalid width value -- %s", optarg);
width = (int)val;
if (!(width > 0)) {
(void)fprintf(stderr,
"nl: width argument must be > 0 -- %d\n",
if (!(width > 0))
errx(EXIT_FAILURE,
"width argument must be > 0 -- %d",
width);
exit(EXIT_FAILURE);
}
break;
case '?':
default:
@ -255,10 +240,8 @@ main(argc, argv)
case 0:
break;
case 1:
if (freopen(argv[0], "r", stdin) == NULL) {
perror(argv[0]);
exit(EXIT_FAILURE);
}
if (freopen(argv[0], "r", stdin) == NULL)
err(EXIT_FAILURE, "Cannot open `%s'", argv[0]);
break;
default:
usage();
@ -270,27 +253,23 @@ main(argc, argv)
val = LINE_MAX;
/* Allocate sufficient buffer space (including the terminating NUL). */
buffersize = (size_t)val + 1;
if ((buffer = malloc(buffersize)) == NULL) {
perror("cannot allocate input line buffer");
exit(EXIT_FAILURE);
}
if ((buffer = malloc(buffersize)) == NULL)
err(EXIT_FAILURE, "Cannot allocate input line buffer");
/* Allocate a buffer suitable for preformatting line number. */
intbuffersize = max((int)INT_STRLEN_MAXIMUM, width) + 1; /* NUL */
if ((intbuffer = malloc(intbuffersize)) == NULL) {
perror("cannot allocate preformatting buffer");
exit(EXIT_FAILURE);
}
if ((intbuffer = malloc(intbuffersize)) == NULL)
err(EXIT_FAILURE, "cannot allocate preformatting buffer");
/* Do the work. */
filter();
exit(EXIT_SUCCESS);
return EXIT_SUCCESS;
/* NOTREACHED */
}
static void
filter()
filter(void)
{
int line; /* logical line number */
int section; /* logical page section */
@ -349,8 +328,8 @@ filter()
}
if (donumber) {
/* Note: sprintf() is safe here. */
consumed = sprintf(intbuffer, format, width, line);
consumed = snprintf(intbuffer, intbuffersize, format,
width, line);
(void)printf("%s",
intbuffer + max(0, consumed - width));
line += incr;
@ -359,18 +338,14 @@ filter()
}
(void)printf("%s%s", sep, buffer);
if (ferror(stdout)) {
perror("output error");
exit(EXIT_FAILURE);
}
if (ferror(stdout))
err(EXIT_FAILURE, "output error");
nextline:
;
}
if (ferror(stdin)) {
perror("input error");
exit(EXIT_FAILURE);
}
if (ferror(stdin))
err(EXIT_FAILURE, "input error");
}
/*
@ -378,9 +353,7 @@ nextline:
*/
static void
parse_numbering(argstr, section)
const char *argstr;
int section;
parse_numbering(const char *argstr, int section)
{
int error;
char errorbuf[NL_TEXTMAX];
@ -408,27 +381,25 @@ parse_numbering(argstr, section)
(void)regerror(error,
&numbering_properties[section].expr,
errorbuf, sizeof (errorbuf));
(void)fprintf(stderr,
"nl: %s expr: %s -- %s\n",
errx(EXIT_FAILURE,
"%s expr: %s -- %s",
numbering_properties[section].name, errorbuf,
&argstr[1]);
exit(EXIT_FAILURE);
}
break;
default:
(void)fprintf(stderr,
"nl: illegal %s line numbering type -- %s\n",
errx(EXIT_FAILURE,
"illegal %s line numbering type -- %s",
numbering_properties[section].name, argstr);
exit(EXIT_FAILURE);
}
}
static void
usage()
usage(void)
{
(void)fprintf(stderr, "usage: nl [-p] [-b type] [-d delim] [-f type] \
[-h type] [-i incr] [-l num]\n\t[-n format] [-s sep] [-v startnum] [-w width] \
[file]\n");
(void)fprintf(stderr, "Usage: %s [-p] [-b type] [-d delim] [-f type] "
"[-h type] [-i incr] [-l num]\n\t[-n format] [-s sep] "
"[-v startnum] [-w width] [file]\n", getprogname());
exit(EXIT_FAILURE);
}