On Tue, Nov 19, 2013 at 09:34:22PM +0000, Stuart Henderson wrote:
> On 2013/11/19 14:10, Theo de Raadt wrote:
> > In general, new non-standard options are bad.

I know and this is my own opinion to, in general.

> > Basically, if we add this someone will use it in a script.  Then it will
> > become non-portable.  You cannot just invent something on your own like
> > this, without doing research to find out if someone else added a different
> > option.  I don't see evidence of that, so the gut answer is no.

You are right, I forgot to have a look on other UNIX OSs before writing
this diff.  I just saw that -u in sed(1) is an extension to POSIX like
this diff would be.  So I think, may be it is a good extension?!?

Thanks to Stuart for doing my homework :-)
> Only FreeBSD/Dragonfly seem to use -u in tr.  How about sed -u instead?

At the moment I use sed(1) for that job, but for deleting one character
sed it to big. (Just my opinion and feeling during writing that script.)

It there a way to get the -u option in tr(1) a BSD extension like the
others?  In this case I would change my diff from line buffering to
unbuffered, like FreeBSD does.

> > > here is a diff that adds optional linebuffering to tr(1) with command
> > > line switch -u like in sed(1).  I need this to remove '\r' characters
> > > from a continues input steam which lines have to be there immediately.
> > > 
> > > Please write me if something is wrong with this diff or the change
> > > itself.  I will fix it.
> > > 
> > > bye,
> > > Jan
> > > 
> > > Index: tr.1
> > > ===================================================================
> > > RCS file: /cvs/src/usr.bin/tr/tr.1,v
> > > retrieving revision 1.20
> > > diff -u -p -r1.20 tr.1
> > > --- tr.1  14 Aug 2013 08:39:27 -0000      1.20
> > > +++ tr.1  19 Nov 2013 20:46:33 -0000
> > > @@ -41,18 +41,18 @@
> > >  .Nd translate characters
> > >  .Sh SYNOPSIS
> > >  .Nm tr
> > > -.Op Fl cs
> > > +.Op Fl csu
> > >  .Ar string1 string2
> > >  .Nm tr
> > > -.Op Fl c
> > > +.Op Fl cu
> > >  .Fl d
> > >  .Ar string1
> > >  .Nm tr
> > > -.Op Fl c
> > > +.Op Fl cu
> > >  .Fl s
> > >  .Ar string1
> > >  .Nm tr
> > > -.Op Fl c
> > > +.Op Fl cu
> > >  .Fl ds
> > >  .Ar string1 string2
> > >  .Sh DESCRIPTION
> > > @@ -86,6 +86,14 @@ or
> > >  .Ar string2 )
> > >  in the input into a single instance of the character.
> > >  This occurs after all deletion and translation is completed.
> > > +.It Fl u
> > > +Force output to be line buffered,
> > > +printing each line as it becomes available.
> > > +By default, output is line buffered when standard output is a terminal
> > > +and block buffered otherwise.
> > > +See
> > > +.Xr setbuf 3
> > > +for a more detailed explanation.
> > >  .El
> > >  .Pp
> > >  In the first synopsis form, the characters in
> > > @@ -284,6 +292,10 @@ The
> > >  utility is compliant with the
> > >  .St -p1003.1-2008
> > >  specification.
> > > +.Pp
> > > +The flag
> > > +.Op Fl u
> > > +is an extension to that specification.
> > >  .Pp
> > >  System V has historically implemented character ranges using the syntax
> > >  .Dq [c-c]
> > > Index: tr.c
> > > ===================================================================
> > > RCS file: /cvs/src/usr.bin/tr/tr.c,v
> > > retrieving revision 1.15
> > > diff -u -p -r1.15 tr.c
> > > --- tr.c  27 Oct 2009 23:59:46 -0000      1.15
> > > +++ tr.c  19 Nov 2013 20:46:33 -0000
> > > @@ -88,7 +88,7 @@ main(int argc, char *argv[])
> > >   int cflag, dflag, sflag, isstring2;
> > >  
> > >   cflag = dflag = sflag = 0;
> > > - while ((ch = getopt(argc, argv, "cds")) != -1)
> > > + while ((ch = getopt(argc, argv, "cdsu")) != -1)
> > >           switch((char)ch) {
> > >           case 'c':
> > >                   cflag = 1;
> > > @@ -99,6 +99,9 @@ main(int argc, char *argv[])
> > >           case 's':
> > >                   sflag = 1;
> > >                   break;
> > > +         case 'u':
> > > +                 setlinebuf(stdout);
> > > +                 break;
> > >           case '?':
> > >           default:
> > >                   usage();
> > > @@ -239,9 +242,9 @@ static void
> > >  usage(void)
> > >  {
> > >   fprintf(stderr,
> > > -     "usage: tr [-cs] string1 string2\n"
> > > -     "       tr [-c] -d string1\n"
> > > -     "       tr [-c] -s string1\n"
> > > -     "       tr [-c] -ds string1 string2\n");
> > > +     "usage: tr [-csu] string1 string2\n"
> > > +     "       tr [-cu] -d string1\n"
> > > +     "       tr [-cu] -s string1\n"
> > > +     "       tr [-cu] -ds string1 string2\n");
> > >   exit(1);
> > >  }
> > > 
> > 
> 

Reply via email to