Author: delphij
Date: Wed May  7 08:06:54 2014
New Revision: 265533
URL: http://svnweb.freebsd.org/changeset/base/265533

Log:
  MFC r264573+264608+264609:
  
  Sync with OpenBSD.

Added:
  stable/10/usr.bin/bc/tty.c
     - copied unchanged from r264573, head/usr.bin/bc/tty.c
Modified:
  stable/10/usr.bin/bc/Makefile
  stable/10/usr.bin/bc/bc.1
  stable/10/usr.bin/bc/bc.library
  stable/10/usr.bin/bc/bc.y
  stable/10/usr.bin/bc/extern.h
  stable/10/usr.bin/bc/scan.l
  stable/10/usr.bin/dc/bcode.c
  stable/10/usr.bin/dc/bcode.h
  stable/10/usr.bin/dc/dc.1
  stable/10/usr.bin/dc/inout.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.bin/bc/Makefile
==============================================================================
--- stable/10/usr.bin/bc/Makefile       Wed May  7 08:04:41 2014        
(r265532)
+++ stable/10/usr.bin/bc/Makefile       Wed May  7 08:06:54 2014        
(r265533)
@@ -1,12 +1,12 @@
 #      $FreeBSD$
-#      $OpenBSD: Makefile,v 1.4 2006/06/30 19:02:28 otto Exp $
+#      $OpenBSD: Makefile,v 1.7 2013/09/19 16:12:00 otto Exp $
 
-PROG=  bc
-SRCS=  bc.y scan.l
-CFLAGS+= -I. -I${.CURDIR}
+PROG=          bc
+SRCS=          bc.y scan.l tty.c
+CFLAGS+=       -I. -I${.CURDIR}
 
-DPADD= ${LIBEDIT} ${LIBTERMCAP}
-LDADD= -ledit -ltermcap
+LDADD+=                -ledit -lcurses
+DPADD+=                ${LIBEDIT} ${LIBCURSES}
 
 NO_WMISSING_VARIABLE_DECLARATIONS=
 

Modified: stable/10/usr.bin/bc/bc.1
==============================================================================
--- stable/10/usr.bin/bc/bc.1   Wed May  7 08:04:41 2014        (r265532)
+++ stable/10/usr.bin/bc/bc.1   Wed May  7 08:06:54 2014        (r265533)
@@ -1,5 +1,5 @@
 .\"    $FreeBSD$
-.\"    $OpenBSD: bc.1,v 1.25 2010/01/02 19:48:56 schwarze Exp $
+.\"    $OpenBSD: bc.1,v 1.30 2014/01/14 07:42:42 jmc Exp $
 .\"
 .\" Copyright (C) Caldera International Inc.  2001-2002.
 .\" All rights reserved.
@@ -35,7 +35,7 @@
 .\"
 .\"    @(#)bc.1        6.8 (Berkeley) 8/8/91
 .\"
-.Dd December 6, 2013
+.Dd April 16, 2014
 .Dt BC 1
 .Os
 .Sh NAME
@@ -140,8 +140,7 @@ The following arithmetic and logical ope
 The semantics of the operators is the same as in the C language.
 They are listed in order of decreasing precedence.
 Operators in the same group have the same precedence.
-.Bl -column -offset indent "= += \-= *= /= %= ^=" "Associativity" \
-"multiply, divide, modulus"
+.Bl -column "= += \-= *= /= %= ^=" "Associativity" "multiply, divide, modulus" 
-offset indent
 .It Sy "Operator" Ta Sy "Associativity" Ta Sy "Description"
 .It "++ \-\-" Ta "none" Ta "increment, decrement"
 .It "\-" Ta "none" Ta "unary minus"
@@ -160,7 +159,7 @@ Note the following:
 .It
 The relational operators may appear in any expression.
 The
-.St -p1003.2
+.St -p1003.1-2008
 standard only allows them in the conditional expression of an
 .Sq if ,
 .Sq while
@@ -342,6 +341,22 @@ $ bc -l -e 'scale = 500; 2 * a(2^10000)'
 .Ed
 .Pp
 prints an approximation of pi.
+.Sh COMMAND LINE EDITING
+.Nm
+supports interactive command line editing, via the
+.Xr editline 3
+library.
+It is enabled by default if input is from a tty.
+Previous lines can be recalled and edited with the arrow keys,
+and other GNU Emacs-style editing keys may be used as well.
+.Pp
+The
+.Xr editline 3
+library is configured with a
+.Pa .editrc
+file \- refer to
+.Xr editrc 5
+for more information.
 .Sh FILES
 .Bl -tag -width /usr/share/misc/bc.library -compact
 .It Pa /usr/share/misc/bc.library
@@ -359,9 +374,6 @@ options are no-ops for compatibility wit
 and their use is discouraged.
 .Sh SEE ALSO
 .Xr dc 1
-.Pp
-"BC \- An Arbitrary Precision Desk-Calculator Language",
-.Pa /usr/share/doc/usd/06.bc/ .
 .Sh STANDARDS
 The
 .Nm
@@ -370,7 +382,8 @@ utility is compliant with the
 specification.
 .Pp
 The flags
-.Op Fl ce
+.Op Fl ce ,
+as well as the parts noted above,
 are extensions to that specification.
 .Sh HISTORY
 The

Modified: stable/10/usr.bin/bc/bc.library
==============================================================================
--- stable/10/usr.bin/bc/bc.library     Wed May  7 08:04:41 2014        
(r265532)
+++ stable/10/usr.bin/bc/bc.library     Wed May  7 08:06:54 2014        
(r265533)
@@ -1,5 +1,5 @@
 /*     $FreeBSD$                                                       */
-/*      $OpenBSD: bc.library,v 1.3 2007/02/03 21:15:06 otto Exp $      */
+/*      $OpenBSD: bc.library,v 1.4 2012/03/14 07:35:53 otto Exp $      */
 
 /*
  * Copyright (C) Caldera International Inc.  2001-2002.
@@ -100,13 +100,13 @@ define l(x) {
        if (x < 1) {
                s = scale(x)
        } else {
-               s = length(x) - scale(x)
+               s = length(x)-scale(x)
        }
        scale = 0
        a = (2.31*s)/1 /* estimated integer part of the answer */
        s = t + length(a) + 2 /* estimated length of the answer */
        while (x > 2) {
-               scale=0
+               scale = 0
                scale = (length(x) + scale(x))/2 + 1
                if (scale < s) scale = s
                x = sqrt(x)

Modified: stable/10/usr.bin/bc/bc.y
==============================================================================
--- stable/10/usr.bin/bc/bc.y   Wed May  7 08:04:41 2014        (r265532)
+++ stable/10/usr.bin/bc/bc.y   Wed May  7 08:06:54 2014        (r265533)
@@ -1,5 +1,5 @@
 %{
-/*     $OpenBSD: bc.y,v 1.33 2009/10/27 23:59:36 deraadt Exp $ */
+/*     $OpenBSD: bc.y,v 1.44 2013/11/20 21:33:54 deraadt Exp $ */
 
 /*
  * Copyright (c) 2003, Otto Moerbeek <o...@drijf.net>
@@ -45,7 +45,6 @@ __FBSDID("$FreeBSD$");
 #include <search.h>
 #include <signal.h>
 #include <stdarg.h>
-#include <stdbool.h>
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
@@ -53,7 +52,7 @@ __FBSDID("$FreeBSD$");
 #include "extern.h"
 #include "pathnames.h"
 
-#define BC_VER         "1.0-FreeBSD"
+#define BC_VER         "1.1-FreeBSD"
 #define END_NODE       ((ssize_t) -1)
 #define CONST_STRING   ((ssize_t) -2)
 #define ALLOC_STRING   ((ssize_t) -3)
@@ -971,7 +970,12 @@ yyerror(const char *s)
        if (yyin != NULL && feof(yyin))
                n = asprintf(&str, "%s: %s:%d: %s: unexpected EOF",
                    __progname, filename, lineno, s);
-       else if (isspace(yytext[0]) || !isprint(yytext[0]))
+       else if (yytext[0] == '\n')
+               n = asprintf(&str,
+                   "%s: %s:%d: %s: newline unexpected",
+                   __progname, filename, lineno, s);
+       else if (isspace((unsigned char)yytext[0]) ||
+           !isprint((unsigned char)yytext[0]))
                n = asprintf(&str,
                    "%s: %s:%d: %s: ascii char 0x%02x unexpected",
                    __progname, filename, lineno, s, yytext[0]);
@@ -1085,26 +1089,25 @@ escape(const char *str)
 
 /* ARGSUSED */
 static void
-sigchld(int signo)
+sigchld(int signo __unused)
 {
        pid_t pid;
-       int status;
+       int status, save_errno = errno;
 
-       switch (signo) {
-       default:
-               for (;;) {
-                       pid = waitpid(dc, &status, WUNTRACED);
-                       if (pid == -1) {
-                               if (errno == EINTR)
-                                       continue;
-                               _exit(0);
-                       }
-                       if (WIFEXITED(status) || WIFSIGNALED(status))
-                               _exit(0);
-                       else
-                               break;
-               }
+       for (;;) {
+               pid = waitpid(dc, &status, WCONTINUED | WNOHANG);
+               if (pid == -1) {
+                       if (errno == EINTR)
+                               continue;
+                       _exit(0);
+               } else if (pid == 0)
+                       break;
+               if (WIFEXITED(status) || WIFSIGNALED(status))
+                       _exit(0);
+               else
+                       break;
        }
+       errno = save_errno;
 }
 
 static const char *
@@ -1191,6 +1194,7 @@ main(int argc, char *argv[])
                }
        }
        if (interactive) {
+               gettty(&ttysaved);
                el = el_init("bc", stdin, stderr, stderr);
                hist = history_init();
                history(hist, &he, H_SETSIZE, 100);
@@ -1198,6 +1202,8 @@ main(int argc, char *argv[])
                el_set(el, EL_EDITOR, "emacs");
                el_set(el, EL_SIGNAL, 1);
                el_set(el, EL_PROMPT, dummy_prompt);
+               el_set(el, EL_ADDFN, "bc_eof", "", bc_eof);
+               el_set(el, EL_BIND, "^D", "bc_eof", NULL);
                el_source(el, NULL);
        }
        yywrap();

Modified: stable/10/usr.bin/bc/extern.h
==============================================================================
--- stable/10/usr.bin/bc/extern.h       Wed May  7 08:04:41 2014        
(r265532)
+++ stable/10/usr.bin/bc/extern.h       Wed May  7 08:06:54 2014        
(r265533)
@@ -1,5 +1,5 @@
 /*     $FreeBSD$                                               */
-/*      $OpenBSD: extern.h,v 1.6 2006/03/18 20:44:43 otto Exp $        */
+/*      $OpenBSD: extern.h,v 1.10 2013/09/19 16:12:01 otto Exp $       */
 
 /*
  * Copyright (c) 2003, Otto Moerbeek <o...@drijf.net>
@@ -17,26 +17,31 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <stdbool.h>
 #include <stdio.h>
 
 struct lvalue {
-       ssize_t  load;
-       ssize_t  store;
+       ssize_t load;
+       ssize_t store;
 };
 
-int                     yylex(void);
-void                    yyerror(const char *);
-void                    fatal(const char *);
-void                    abort_line(int);
-
-extern int              lineno;
-extern int              fileindex;
-extern int              sargc;
+int            yylex(void);
+void           yyerror(const char *);
+void           fatal(const char *);
+void           abort_line(int);
+struct termios;
+int            gettty(struct termios *);
+void           tstpcont(int);
+unsigned char  bc_eof(EditLine *, int);
+
+extern int     lineno;
+extern int     fileindex;
+extern int     sargc;
 extern const char      **sargv;
 extern const char      *filename;
-extern char            *cmdexpr;
 extern bool             interactive;
 extern EditLine                *el;
 extern History         *hist;
 extern HistEvent        he;
-
+extern char    *cmdexpr;
+extern struct termios ttysaved;

Modified: stable/10/usr.bin/bc/scan.l
==============================================================================
--- stable/10/usr.bin/bc/scan.l Wed May  7 08:04:41 2014        (r265532)
+++ stable/10/usr.bin/bc/scan.l Wed May  7 08:06:54 2014        (r265533)
@@ -1,5 +1,5 @@
 %{
-/*      $OpenBSD: scan.l,v 1.23 2009/10/27 23:59:36 deraadt Exp $      */
+/*      $OpenBSD: scan.l,v 1.28 2013/09/19 16:12:01 otto Exp $ */
 
 /*
  * Copyright (c) 2003, Otto Moerbeek <o...@drijf.net>
@@ -24,6 +24,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <histedit.h>
 #include <stdbool.h>
+#include <signal.h>
 #include <string.h>
 #include <unistd.h>
 
@@ -31,19 +32,22 @@ __FBSDID("$FreeBSD$");
 #include "bc.h"
 #include "pathnames.h"
 
-int             lineno;
+int            lineno;
+bool           interactive;
 
-bool            interactive;
 HistEvent       he;
 EditLine       *el;
 History                *hist;
 
 static char    *strbuf = NULL;
-static size_t   strbuf_sz = 1;
-static bool     dot_seen;
+static size_t  strbuf_sz = 1;
+static bool    dot_seen;
+static int     use_el;
+static volatile sig_atomic_t skipchars;
+
+static void    init_strbuf(void);
+static void    add_str(const char *);
 
-static void     init_strbuf(void);
-static void     add_str(const char *);
 static int      bc_yyinput(char *, int);
 
 #define YY_DECL        int yylex(void)
@@ -51,6 +55,7 @@ static int     bc_yyinput(char *, int);
 #undef YY_INPUT
 #define YY_INPUT(buf,retval,max) \
        (retval = bc_yyinput(buf, max))
+
 %}
 
 %option always-interactive
@@ -102,7 +107,7 @@ ALPHANUM    [a-z_0-9]
                                BEGIN(INITIAL);
                                yylval.str = strbuf;
                                unput('.');
-                               return (NUMBER);
+                               return NUMBER;
                        } else {
                                dot_seen = true;
                                add_str(".");
@@ -113,73 +118,73 @@ ALPHANUM  [a-z_0-9]
                        BEGIN(INITIAL);
                        unput(yytext[0]);
                        if (strcmp(strbuf, ".") == 0)
-                               return (DOT);
+                               return DOT;
                        else {
                                yylval.str = strbuf;
-                               return (NUMBER);
+                               return NUMBER;
                        }
                }
 }
 
-"auto"         return (AUTO);
-"break"                return (BREAK);
-"continue"     return (CONTINUE);
-"define"       return (DEFINE);
-"else"         return (ELSE);
-"ibase"                return (IBASE);
-"if"           return (IF);
-"last"         return (DOT);
-"for"          return (FOR);
-"length"       return (LENGTH);
-"obase"                return (OBASE);
-"print"                return (PRINT);
-"quit"         return (QUIT);
-"return"       return (RETURN);
-"scale"                return (SCALE);
-"sqrt"         return (SQRT);
-"while"                return (WHILE);
-
-"^"            return (EXPONENT);
-"*"            return (MULTIPLY);
-"/"            return (DIVIDE);
-"%"            return (REMAINDER);
-
-"!"            return (BOOL_NOT);
-"&&"           return (BOOL_AND);
-"||"           return (BOOL_OR);
-
-"+"            return (PLUS);
-"-"            return (MINUS);
-
-"++"           return (INCR);
-"--"           return (DECR);
-
-"="            yylval.str = ""; return (ASSIGN_OP);
-"+="           yylval.str = "+"; return (ASSIGN_OP);
-"-="           yylval.str = "-"; return (ASSIGN_OP);
-"*="           yylval.str = "*"; return (ASSIGN_OP);
-"/="           yylval.str = "/"; return (ASSIGN_OP);
-"%="           yylval.str = "%"; return (ASSIGN_OP);
-"^="           yylval.str = "^"; return (ASSIGN_OP);
-
-"=="           return (EQUALS);
-"<="           return (LESS_EQ);
-">="           return (GREATER_EQ);
-"!="           return (UNEQUALS);
-"<"            return (LESS);
-">"            return (GREATER);
-
-","            return (COMMA);
-";"            return (SEMICOLON);
+"auto"         return AUTO;
+"break"                return BREAK;
+"continue"     return CONTINUE;
+"define"       return DEFINE;
+"else"         return ELSE;
+"ibase"                return IBASE;
+"if"           return IF;
+"last"         return DOT;
+"for"          return FOR;
+"length"       return LENGTH;
+"obase"                return OBASE;
+"print"                return PRINT;
+"quit"         return QUIT;
+"return"       return RETURN;
+"scale"                return SCALE;
+"sqrt"         return SQRT;
+"while"                return WHILE;
+
+"^"            return EXPONENT;
+"*"            return MULTIPLY;
+"/"            return DIVIDE;
+"%"            return REMAINDER;
+
+"!"            return BOOL_NOT;
+"&&"           return BOOL_AND;
+"||"           return BOOL_OR;
+
+"+"            return PLUS;
+"-"            return MINUS;
+
+"++"           return INCR;
+"--"           return DECR;
+
+"="            yylval.str = ""; return ASSIGN_OP;
+"+="           yylval.str = "+"; return ASSIGN_OP;
+"-="           yylval.str = "-"; return ASSIGN_OP;
+"*="           yylval.str = "*"; return ASSIGN_OP;
+"/="           yylval.str = "/"; return ASSIGN_OP;
+"%="           yylval.str = "%"; return ASSIGN_OP;
+"^="           yylval.str = "^"; return ASSIGN_OP;
+
+"=="           return EQUALS;
+"<="           return LESS_EQ;
+">="           return GREATER_EQ;
+"!="           return UNEQUALS;
+"<"            return LESS;
+">"            return GREATER;
+
+","            return COMMA;
+";"            return SEMICOLON;
 
-"("            return (LPAR);
-")"            return (RPAR);
+"("            return LPAR;
+")"            return RPAR;
 
-"["            return (LBRACKET);
-"]"            return (RBRACKET);
+"["            return LBRACKET;
+"]"            return RBRACKET;
 
-"{"            return (LBRACE);
-"}"            return (RBRACE);
+"{"            return LBRACE;
+"}"            return RBRACE;
 
 {ALPHA}{ALPHANUM}* {
                        /* alloc an extra byte for the type marker */
@@ -188,15 +193,15 @@ ALPHANUM  [a-z_0-9]
                                err(1, NULL);
                        strlcpy(p, yytext, yyleng + 1);
                        yylval.astr = p;
-                       return (LETTER);
+                       return LETTER;
                }
 
 \\\n           lineno++;
-\n             lineno++; return (NEWLINE);
+\n             lineno++; return NEWLINE;
 
 #[^\n]*                ;
 [ \t]          ;
-<<EOF>>                return (QUIT);
+<<EOF>>                return QUIT;
 .              yyerror("illegal character");
 
 %%
@@ -204,7 +209,6 @@ ALPHANUM    [a-z_0-9]
 static void
 init_strbuf(void)
 {
-
        if (strbuf == NULL) {
                strbuf = malloc(strbuf_sz);
                if (strbuf == NULL)
@@ -221,8 +225,8 @@ add_str(const char *str)
        arglen = strlen(str);
 
        if (strlen(strbuf) + arglen + 1 > strbuf_sz) {
-               size_t   newsize;
-               char    *p;
+               size_t newsize;
+               char *p;
 
                newsize = strbuf_sz + arglen + 1;
                p = realloc(strbuf, newsize);
@@ -236,11 +240,47 @@ add_str(const char *str)
        strlcat(strbuf, str, strbuf_sz);
 }
 
+/* ARGSUSED */
+void
+abort_line(int sig __unused)
+{
+       static const char str1[] = "[\n]P\n";
+       static const char str2[] = "[^C\n]P\n";
+       int save_errno;
+       const LineInfo *info;
+
+       save_errno = errno;
+       if (use_el) {
+               write(STDOUT_FILENO, str2, sizeof(str2) - 1);
+               info = el_line(el);
+               skipchars = info->lastchar - info->buffer;
+       } else
+               write(STDOUT_FILENO, str1, sizeof(str1) - 1);
+       errno = save_errno;
+}
+
+/*
+ * Avoid the echo of ^D by the default code of editline and take
+ * into account skipchars to make ^D work when the cursor is at start of
+ * line after a ^C.
+ */
+unsigned char
+bc_eof(EditLine *e, int ch __unused)
+{
+       const struct lineinfo *info = el_line(e);
+
+       if (info->buffer + skipchars == info->cursor &&
+           info->cursor == info->lastchar)
+               return (CC_EOF);
+       else
+               return (CC_ERROR);
+}
+
 int
 yywrap(void)
 {
-       static YY_BUFFER_STATE buf;
        static int state;
+       static YY_BUFFER_STATE buf;
 
        if (fileindex == 0 && sargc > 0 && strcmp(sargv[0], _PATH_LIBB) == 0) {
                filename = sargv[fileindex++];
@@ -273,6 +313,10 @@ yywrap(void)
        } else if (fileindex == sargc) {
                fileindex++;
                yyin = stdin;
+               if (interactive) {
+                       signal(SIGINT, abort_line);
+                       signal(SIGTSTP, tstpcont);
+               }
                lineno = 1;
                filename = "stdin";
                return (0);
@@ -284,17 +328,32 @@ static int
 bc_yyinput(char *buf, int maxlen)
 {
        int num;
-       if (yyin == stdin && interactive) {
+
+       if (el != NULL)
+               el_get(el, EL_EDITMODE, &use_el);
+               
+       if (yyin == stdin && interactive && use_el) {
                const char *bp;
+               sigset_t oset, nset;
 
                if ((bp = el_gets(el, &num)) == NULL || num == 0)
                        return (0);
+               sigemptyset(&nset);
+               sigaddset(&nset, SIGINT);
+               sigprocmask(SIG_BLOCK, &nset, &oset);
+               if (skipchars < num) {
+                       bp += skipchars;
+                       num -= skipchars;
+               }
+               skipchars = 0;
+               sigprocmask(SIG_SETMASK, &oset, NULL);
                if (num > maxlen) {
-                       el_push(el, (char *)(uintptr_t)(bp) + maxlen);
+                       el_push(el, bp + maxlen);
                        num = maxlen;
                }
                memcpy(buf, bp, num);
                history(hist, &he, H_ENTER, bp);
+               el_get(el, EL_EDITMODE, &use_el);
        } else {
                int c = '*';
                for (num = 0; num < maxlen &&
@@ -308,3 +367,4 @@ bc_yyinput(char *buf, int maxlen)
        return (num);
 }
 
+

Copied: stable/10/usr.bin/bc/tty.c (from r264573, head/usr.bin/bc/tty.c)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/10/usr.bin/bc/tty.c  Wed May  7 08:06:54 2014        (r265533, copy 
of r264573, head/usr.bin/bc/tty.c)
@@ -0,0 +1,65 @@
+/*     $FreeBSD$       */
+/*      $OpenBSD: tty.c,v 1.2 2013/11/12 13:54:51 deraadt Exp $        */
+
+/*
+ * Copyright (c) 2013, Otto Moerbeek <o...@drijf.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <errno.h>
+#include <signal.h>
+#include <histedit.h>
+#include <termios.h>
+#include "extern.h"
+
+struct termios ttysaved, ttyedit;
+
+static int
+settty(struct termios *t)
+{
+       int ret;
+
+       while ((ret = tcsetattr(0, TCSADRAIN,  t) == -1) && errno == EINTR)
+               continue;
+       return ret;
+}
+
+int
+gettty(struct termios *t)
+{
+       int ret;
+
+       while ((ret = tcgetattr(0, t) == -1) && errno == EINTR)
+               continue;
+       return ret;
+}
+
+/* ARGSUSED */
+void
+tstpcont(int sig)
+{
+       int save_errno = errno;
+
+       if (sig == SIGTSTP) {
+               signal(SIGCONT, tstpcont);
+               gettty(&ttyedit);
+               settty(&ttysaved);              
+       } else {
+               signal(SIGTSTP, tstpcont);
+               settty(&ttyedit);               
+       }
+       signal(sig, SIG_DFL);
+       kill(0, sig);
+       errno = save_errno;
+}

Modified: stable/10/usr.bin/dc/bcode.c
==============================================================================
--- stable/10/usr.bin/dc/bcode.c        Wed May  7 08:04:41 2014        
(r265532)
+++ stable/10/usr.bin/dc/bcode.c        Wed May  7 08:06:54 2014        
(r265533)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bcode.c,v 1.40 2009/10/27 23:59:37 deraadt Exp $      */
+/*     $OpenBSD: bcode.c,v 1.45 2012/11/07 11:06:14 otto Exp $ */
 
 /*
  * Copyright (c) 2003, Otto Moerbeek <o...@drijf.net>
@@ -29,7 +29,7 @@ __FBSDID("$FreeBSD$");
 
 #include "extern.h"
 
-#define __inline       
+/* #define     DEBUGGING */
 
 #define MAX_ARRAY_INDEX                2048
 #define READSTACK_SIZE         8
@@ -253,7 +253,7 @@ init_bmachine(bool extended_registers)
 u_int
 bmachine_scale(void)
 {
-       return (bmachine.scale);
+       return bmachine.scale;
 }
 
 /* Reset the things needed before processing a (new) file */
@@ -428,7 +428,6 @@ get_ulong(struct number *n)
 void
 negate(struct number *n)
 {
-
        BN_set_negative(n->number, !BN_is_negative(n->number));
 }
 
@@ -695,7 +694,7 @@ count_digits(const struct number *n)
        u_int i;
 
        if (BN_is_zero(n->number))
-               return (n->scale ? n->scale : 1);
+               return n->scale ? n->scale : 1;
 
        int_part = new_number();
        fract_part = new_number();
@@ -1171,9 +1170,10 @@ bdivmod(void)
 static void
 bexp(void)
 {
-       struct number *a, *p, *r;
-       u_int rscale;
-       bool neg;
+       struct number   *a, *p;
+       struct number   *r;
+       bool            neg;
+       u_int           rscale;
 
        p = pop_number();
        if (p == NULL) {
@@ -1193,8 +1193,7 @@ bexp(void)
                bn_checkp(f);
                split_number(p, i, f);
                if (!BN_is_zero(f))
-                       warnx("Runtime warning: non-zero fractional part "
-                           "in exponent");
+                       warnx("Runtime warning: non-zero fractional part in 
exponent");
                BN_free(i);
                BN_free(f);
        }

Modified: stable/10/usr.bin/dc/bcode.h
==============================================================================
--- stable/10/usr.bin/dc/bcode.h        Wed May  7 08:04:41 2014        
(r265532)
+++ stable/10/usr.bin/dc/bcode.h        Wed May  7 08:06:54 2014        
(r265533)
@@ -1,5 +1,5 @@
 /*     $FreeBSD$                                               */
-/*     $OpenBSD: bcode.h,v 1.5 2006/01/16 08:09:25 otto Exp $  */
+/*     $OpenBSD: bcode.h,v 1.7 2012/11/07 11:06:14 otto Exp $  */
 
 /*
  * Copyright (c) 2003, Otto Moerbeek <o...@drijf.net>
@@ -83,15 +83,15 @@ struct source {
        int              lastchar;
 };
 
-void                    init_bmachine(bool);
-void                    reset_bmachine(struct source *);
-u_int                   bmachine_scale(void);
-void                    scale_number(BIGNUM *, int);
-void                    normalize(struct number *, u_int);
-void                    eval(void);
-void                    pn(const char *, const struct number *);
-void                    pbn(const char *, const BIGNUM *);
-void                    negate(struct number *);
-void                    split_number(const struct number *, BIGNUM *, BIGNUM 
*);
-void                    bmul_number(struct number *, struct number *,
-                           struct number *, u_int);
+void                   init_bmachine(bool);
+void                   reset_bmachine(struct source *);
+u_int                  bmachine_scale(void);
+void                   scale_number(BIGNUM *, int);
+void                   normalize(struct number *, u_int);
+void                   eval(void);
+void                   pn(const char *, const struct number *);
+void                   pbn(const char *, const BIGNUM *);
+void                   negate(struct number *);
+void                   split_number(const struct number *, BIGNUM *, BIGNUM *);
+void                   bmul_number(struct number *, struct number *,
+                           struct number *, u_int scale);

Modified: stable/10/usr.bin/dc/dc.1
==============================================================================
--- stable/10/usr.bin/dc/dc.1   Wed May  7 08:04:41 2014        (r265532)
+++ stable/10/usr.bin/dc/dc.1   Wed May  7 08:06:54 2014        (r265533)
@@ -1,5 +1,5 @@
 .\"    $FreeBSD$
-.\"    $OpenBSD: dc.1,v 1.24 2010/01/02 19:48:56 schwarze Exp $
+.\"    $OpenBSD: dc.1,v 1.27 2012/08/19 12:07:21 jmc Exp $
 .\"
 .\" Copyright (C) Caldera International Inc.  2001-2002.
 .\" All rights reserved.
@@ -35,7 +35,7 @@
 .\"
 .\"    @(#)dc.1        8.1 (Berkeley) 6/6/93
 .\"
-.Dd January 22, 2010
+.Dd April 16, 2014
 .Dt DC 1
 .Os
 .Sh NAME
@@ -73,12 +73,6 @@ Evaluate
 If multiple
 .Fl e
 options are specified, they will be processed in the order given.
-If no
-.Ar filename
-argument is given, execution will stop after processing the expressions
-given on the command line,
-otherwise processing will continue with the contents of
-.Ar filename .
 .It Fl f Ar filename , Fl Fl file Ar filename
 Process the content of the given file before further calculations are done.
 If multiple
@@ -98,14 +92,26 @@ See
 for a more detailed description.
 .El
 .Pp
+If neither
+.Ar expression
+nor
+.Ar file
+are specified on the command line,
+.Nm
+reads from the standard input.
+Otherwise
+.Ar expression
+and
+.Ar file
+are processed and
+.Nm
+exits.
+.Pp
 Ordinarily,
 .Nm
 operates on decimal integers,
 but one may specify an input base, output base,
 and a number of fractional digits (scale) to be maintained.
-If an argument is given,
-input is taken from that file until its end,
-then from the standard input.
 Whitespace is ignored, except where it signals the end of a number,
 end of a line or when a register name is expected.
 The following constructions are recognized:

Modified: stable/10/usr.bin/dc/inout.c
==============================================================================
--- stable/10/usr.bin/dc/inout.c        Wed May  7 08:04:41 2014        
(r265532)
+++ stable/10/usr.bin/dc/inout.c        Wed May  7 08:06:54 2014        
(r265533)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: inout.c,v 1.15 2009/10/27 23:59:37 deraadt Exp $      */
+/*     $OpenBSD: inout.c,v 1.17 2012/11/07 11:06:14 otto Exp $ */
 
 /*
  * Copyright (c) 2003, Otto Moerbeek <o...@drijf.net>
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to