I wrote: > Right, but stealing these small snippets from NetBSD wasn't very hard, > see patch below. Here's a better patch, including stty. If there are no objects, I'll commit this. /assar
Index: bin/stty/modes.c =================================================================== RCS file: /home/ncvs/src/bin/stty/modes.c,v retrieving revision 1.8 diff -u -w -r1.8 modes.c --- bin/stty/modes.c 1999/08/27 23:15:41 1.8 +++ bin/stty/modes.c 2000/12/29 22:47:29 @@ -191,10 +191,16 @@ { "-litout", OPOST, 0 }, { "onlcr", ONLCR, 0 }, { "-onlcr", 0, ONLCR }, + { "ocrnl", OCRNL, 0 }, + { "-ocrnl", 0, OCRNL }, { "tabs", 0, OXTABS }, /* "preserve" tabs */ { "-tabs", OXTABS, 0 }, { "oxtabs", OXTABS, 0 }, { "-oxtabs", 0, OXTABS }, + { "onocr", ONOCR, 0 }, + { "-onocr", 0, ONOCR }, + { "onlret", ONLRET, 0 }, + { "-onlret", 0, ONLRET }, { NULL }, }; Index: bin/stty/print.c =================================================================== RCS file: /home/ncvs/src/bin/stty/print.c,v retrieving revision 1.14 diff -u -w -r1.14 print.c --- bin/stty/print.c 2000/04/30 17:04:25 1.14 +++ bin/stty/print.c 2000/12/29 22:47:29 @@ -148,7 +148,10 @@ binit("oflags"); put("-opost", OPOST, 1); put("-onlcr", ONLCR, 1); + put("-ocrnl", OCRNL, 0); put("-oxtabs", OXTABS, 1); + put("-onocr", OXTABS, 0); + put("-onlret", OXTABS, 0); /* control flags (hardware state) */ tmp = tp->c_cflag; Index: bin/stty/stty.1 =================================================================== RCS file: /home/ncvs/src/bin/stty/stty.1,v retrieving revision 1.18 diff -u -w -r1.18 stty.1 --- bin/stty/stty.1 2000/11/28 19:48:06 1.18 +++ bin/stty/stty.1 2000/12/29 22:47:29 @@ -237,8 +237,18 @@ to .Dv CR-NL on output. +.It Cm ocrnl Pq Fl ocrnl +Map (do not map) +.Dv CR +to +.Dv NL +on output. .It Cm oxtabs Pq Fl oxtabs Expand (do not expand) tabs to spaces on output. +.It Cm onocr Pq Fl onocr +Do not (do) output CRs at column zero. +.It Cm onlret Pq Fl onlret +On the terminal NL performs (does not perform) the CR function. .El .Ss Local Modes: .Pp Index: share/man/man4/termios.4 =================================================================== RCS file: /home/ncvs/src/share/man/man4/termios.4,v retrieving revision 1.17 diff -u -w -r1.17 termios.4 --- share/man/man4/termios.4 2000/11/22 16:10:59 1.17 +++ share/man/man4/termios.4 2000/12/29 22:48:23 @@ -991,6 +991,8 @@ /* map NL to CR-NL (ala .Dv CRMOD) */ +.It Dv OCRNL +/* map CR to NL */ .It Dv OXTABS /* expand tabs to spaces */ .It Dv ONOEOT @@ -998,6 +1000,10 @@ .Dv EOT Ns 's .Ql \&^D on output) */ +.It Dv ONOCR +/* do not transmit CRs on column 0 */ +.It Dv ONLRET +/* on the termianl NL performs the CR function */ .El .Pp If @@ -1010,6 +1016,10 @@ is set, newlines are translated to carriage return, linefeeds. .Pp If +.Dv OCRNL +is set, carriage returns are translated to newlines. +.Pp +If .Dv OXTABS is set, tabs are expanded to the appropriate number of spaces (assuming 8 column tab stops). @@ -1020,6 +1030,15 @@ .Tn ASCII .Dv EOT Ns 's are discarded on output. +.Pp +If +.Dv ONOCR +is set, no CR character is transmitted when at column 0 (first position). +.Pp +If +.Dv ONLRET +is set, the NL character is assumed to do the carriage-return function; +the column pointer will be set to 0. .Ss Control Modes Values of the .Fa c_cflag Index: sys/kern/tty.c =================================================================== RCS file: /home/ncvs/src/sys/kern/tty.c,v retrieving revision 1.142 diff -u -w -r1.142 tty.c --- sys/kern/tty.c 2000/12/08 21:50:36 1.142 +++ sys/kern/tty.c 2000/12/29 22:48:54 @@ -663,9 +663,16 @@ if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) { tk_nout++; tp->t_outcc++; - if (putc('\r', &tp->t_outq)) + if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq)) return (c); } + /* If OCRNL is set, translate "\r" into "\n". */ + else if (c == '\r' && ISSET(tp->t_oflag, OCRNL)) + c = '\n'; + /* If ONOCR is set, don't transmit CRs when on column 0. */ + else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0) + return (-1); + tk_nout++; tp->t_outcc++; if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq)) @@ -680,6 +687,9 @@ case CONTROL: break; case NEWLINE: + if (ISSET(tp->t_oflag, ONLCR | ONLRET)) + col = 0; + break; case RETURN: col = 0; break; Index: sys/sys/termios.h =================================================================== RCS file: /home/ncvs/src/sys/sys/termios.h,v retrieving revision 1.14 diff -u -w -r1.14 termios.h --- sys/sys/termios.h 2000/11/28 20:03:23 1.14 +++ sys/sys/termios.h 2000/12/29 22:49:10 @@ -112,6 +112,9 @@ #define ONLCR 0x00000002 /* map NL to CR-NL (ala CRMOD) */ #define OXTABS 0x00000004 /* expand tabs to spaces */ #define ONOEOT 0x00000008 /* discard EOT's (^D) on output) */ +#define OCRNL 0x00000010 /* map CR to NL on output */ +#define ONOCR 0x00000020 /* no CR output at column 0 */ +#define ONLRET 0x00000040 /* NL performs CR function */ #endif /*_POSIX_SOURCE */ /*