Date: Tue, 07 May 2002 23:04:11 -0400 From: "Brian F. Feldman" <green@FreeBSD.ORG> To: "J. Mallett" <jmallett@FreeBSD.ORG> Cc: "David O'Brien" <obrien@FreeBSD.ORG>, Garance A Drosihn <drosih@rpi.edu>, arch@FreeBSD.ORG, cvs-all@FreeBSD.ORG, cvs-committers@FreeBSD.ORG Subject: Re: cvs commit: src/usr.bin/sed main.c sed.1 Message-ID: <200205080304.g4834BL42647@green.bikeshed.org> In-Reply-To: Your message of "Wed, 08 May 2002 01:36:53 -0000." <20020508013651.GA28536@FreeBSD.ORG>
next in thread | previous in thread | raw e-mail | index | archive | help
"J. Mallett" <jmallett@FreeBSD.ORG> wrote:
> On Tue, May 07, 2002 at 06:27:50PM -0700, David O'Brien wrote:
> > On Wed, May 08, 2002 at 12:59:58AM +0000, J. Mallett wrote:
> > > > If a user can not be bothered to use '-I .blah' instead of
> > > > '-i.blah', then they can continue to use perl for all I care.
> > ...
> > > I like your logic better than the logic I've been using.
> > > If one or two more people will agree to this, I'll happily make
> > > the necessary changes.
> >
> > I do not agree, I WILL not agree. I will commit -i[ext] later if anyone
> > takes it away (or fails to add it). The ENTIRE PURPOSE HERE is to add
> > "perl -i" functionality. NOT find how many different ways things can be
> > proposed.
>
> But unless people will shut the hell up about allowing -i with no argument,
> we cannot achieve that without adding another option one way or the other.
>
> [...]
Trying to move this to arch:
Another option would be to extend getopt(3) in what could simply be a very
reasonable way. Here's my proposition for making a "clean" version that
acts like Perl:
Index: Makefile
===================================================================
RCS file: /usr2/ncvs/src/usr.bin/sed/Makefile,v
retrieving revision 1.4
diff -u -r1.4 Makefile
--- Makefile 8 Feb 2002 23:07:35 -0000 1.4
+++ Makefile 8 May 2002 02:49:35 -0000
@@ -3,6 +3,7 @@
PROG= sed
SRCS= compile.c main.c misc.c process.c
+SRCS+= getopt.c
.include <bsd.prog.mk>
Index: main.c
===================================================================
RCS file: /usr2/ncvs/src/usr.bin/sed/main.c,v
retrieving revision 1.19
diff -u -r1.19 main.c
--- main.c 7 May 2002 23:33:44 -0000 1.19
+++ main.c 8 May 2002 02:58:58 -0000
@@ -124,7 +124,7 @@
fflag = 0;
inplace = NULL;
- while ((c = getopt(argc, argv, "Eae:f:i:n")) != -1)
+ while ((c = getopt(argc, argv, "Eae:f:i;n")) != -1)
switch (c) {
case 'E':
rflags = REG_EXTENDED;
@@ -146,6 +146,8 @@
break;
case 'i':
inplace = optarg;
+ if (inplace == NULL)
+ inplace = "";
break;
case 'n':
nflag = 1;
@@ -182,8 +184,8 @@
usage()
{
(void)fprintf(stderr, "%s\n%s\n",
- "usage: sed script [-Ean] [-i extension] [file ...]",
- " sed [-an] [-i extension] [-e script] ... [-f script_file] ... [file ...]");
+ "usage: sed script [-Ean] [-i[extension]] [file ...]",
+ " sed [-an] [-i[extension]] [-e script] ... [-f script_file] ... [file ...]");
exit(1);
}
@@ -434,20 +436,21 @@
if (*inplace == '\0') {
char template[] = "/tmp/sed.XXXXXXXXXX";
- if (mktemp(template) == NULL)
- err(1, "mktemp");
+ output = mkstemp(template);
+ if (output == -1)
+ err(1, "mkstemp");
strlcpy(backup, template, MAXPATHLEN);
} else {
strlcpy(backup, *filename, MAXPATHLEN);
strlcat(backup, inplace, MAXPATHLEN);
+ output = open(backup, O_WRONLY|O_CREAT);
+ if (output == -1)
+ err(1, "open(%s)", backup);
}
input = open(*filename, O_RDONLY);
if (input == -1)
err(1, "open(%s)", *filename);
- output = open(backup, O_WRONLY|O_CREAT);
- if (output == -1)
- err(1, "open(%s)", backup);
if (fchmod(output, orig.st_mode & ~S_IFMT) == -1)
err(1, "chmod");
buffer = malloc(orig.st_size);
--- ../../lib/libc/stdlib/getopt.c Thu Sep 6 02:47:20 2001
+++ getopt.c Tue May 7 22:49:22 2002
@@ -93,12 +93,8 @@
"%s: illegal option -- %c\n", __progname, optopt);
return (BADCH);
}
- if (*++oli != ':') { /* don't need argument */
- optarg = NULL;
- if (!*place)
- ++optind;
- }
- else { /* need an argument */
+ switch (*++oli) {
+ case ':': /* need an argument */
if (*place) /* no white space */
optarg = place;
else if (nargc <= ++optind) { /* no arg */
@@ -115,6 +111,19 @@
optarg = nargv[optind];
place = EMSG;
++optind;
+ break;
+ case ';': /* argument optional */
+ if (*place)
+ optarg = place;
+ else
+ optarg = NULL;
+ place = EMSG;
+ optind++;
+ break;
+ default: /* don't need argument */
+ optarg = NULL;
+ if (!*place)
+ ++optind;
}
return (optopt); /* dump back option letter */
}
--
Brian Fundakowski Feldman \'[ FreeBSD ]''''''''''\
<> green@FreeBSD.org <> bfeldman@tislabs.com \ The Power to Serve! \
Opinions expressed are my own. \,,,,,,,,,,,,,,,,,,,,,,\
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200205080304.g4834BL42647>
