[Zrouter-src-freebsd] ZRouter.org: push to FreeBSD HEAD tree
zrouter-src-freebsd at zrouter.org
zrouter-src-freebsd at zrouter.org
Wed Jul 25 14:36:07 UTC 2012
details: http://zrouter.org/hg/FreeBSD/head//rev/49f3e3227aef
changeset: 491:49f3e3227aef
user: Aleksandr Rybalko <ray at ddteam.net>
date: Wed Jul 25 16:31:11 2012 +0300
description:
Lazy update
diffstat:
head/usr.bin/Makefile | 36 +-
head/usr.bin/ar/Makefile | 6 +-
head/usr.bin/ar/acpyacc.y | 3 +-
head/usr.bin/bc/bc.y | 3 +-
head/usr.bin/calendar/calendar.1 | 4 +-
head/usr.bin/calendar/calendars/calendar.freebsd | 6 +-
head/usr.bin/chat/chat.c | 4 +-
head/usr.bin/clang/clang/Makefile | 3 +-
head/usr.bin/clang/clang/clang.1 | 4 +-
head/usr.bin/clang/tblgen/tblgen.1 | 4 +-
head/usr.bin/csup/csup.1 | 6 +-
head/usr.bin/ctlstat/ctlstat.8 | 6 +-
head/usr.bin/cut/cut.1 | 12 +-
head/usr.bin/cut/cut.c | 8 +-
head/usr.bin/dc/dc.1 | 8 +-
head/usr.bin/du/du.1 | 16 +-
head/usr.bin/du/du.c | 8 +-
head/usr.bin/fetch/fetch.1 | 13 +-
head/usr.bin/find/find.1 | 66 +-
head/usr.bin/find/getdate.y | 4 +-
head/usr.bin/fstat/Makefile | 4 +-
head/usr.bin/fstat/fstat.c | 4 +-
head/usr.bin/gprof/gprof.1 | 4 +-
head/usr.bin/gprof/lookup.c | 8 +-
head/usr.bin/gzip/zmore.1 | 4 +-
head/usr.bin/ipcrm/ipcrm.1 | 4 +-
head/usr.bin/join/join.1 | 2 +-
head/usr.bin/kdump/kdump.1 | 8 +-
head/usr.bin/kdump/kdump.c | 8 +-
head/usr.bin/kdump/mkioctls | 4 +-
head/usr.bin/killall/killall.1 | 8 +-
head/usr.bin/killall/killall.c | 42 +-
head/usr.bin/ktrace/ktrace.1 | 6 +-
head/usr.bin/ktrace/ktrace.h | 8 +-
head/usr.bin/lastcomm/lastcomm.1 | 15 +-
head/usr.bin/lastcomm/lastcomm.c | 30 +-
head/usr.bin/less/defines.h | 14 +-
head/usr.bin/lex/lex.1 | 5 +-
head/usr.bin/limits/limits.1 | 6 +-
head/usr.bin/login/login.1 | 4 +-
head/usr.bin/m4/parser.y | 7 +-
head/usr.bin/mail/popen.c | 6 +-
head/usr.bin/make/Makefile | 8 +-
head/usr.bin/make/make.1 | 30 +-
head/usr.bin/make/var.c | 31 +-
head/usr.bin/makewhatis/makewhatis.c | 4 +-
head/usr.bin/man/man.conf.5 | 9 +-
head/usr.bin/minigzip/Makefile | 4 +-
head/usr.bin/minigzip/minigzip.1 | 6 +-
head/usr.bin/mkcsmapper/ldef.h | 3 +-
head/usr.bin/mkcsmapper/lex.l | 4 +-
head/usr.bin/mkesdb/ldef.h | 3 +-
head/usr.bin/mkesdb/lex.l | 4 +-
head/usr.bin/mklocale/extern.h | 3 +-
head/usr.bin/mklocale/mklocale.1 | 4 +-
head/usr.bin/ncplogin/ncplogout.1 | 4 +-
head/usr.bin/netstat/Makefile | 6 +-
head/usr.bin/netstat/inet.c | 7 +-
head/usr.bin/netstat/sctp.c | 6 +-
head/usr.bin/nfsstat/nfsstat.c | 5 +-
head/usr.bin/pamtest/Makefile | 11 +
head/usr.bin/passwd/passwd.1 | 4 +-
head/usr.bin/procstat/Makefile | 4 +-
head/usr.bin/procstat/procstat.1 | 8 +-
head/usr.bin/procstat/procstat_rlimit.c | 6 +-
head/usr.bin/procstat/procstat_vm.c | 8 +-
head/usr.bin/rctl/rctl.8 | 4 +-
head/usr.bin/rlogin/rlogin.1 | 4 +-
head/usr.bin/rsh/rsh.1 | 4 +-
head/usr.bin/sockstat/sockstat.1 | 7 +-
head/usr.bin/sockstat/sockstat.c | 37 +-
head/usr.bin/sort/Makefile | 45 +
head/usr.bin/sort/bwstring.c | 1154 +++++++++++++
head/usr.bin/sort/bwstring.h | 142 +
head/usr.bin/sort/coll.c | 1301 ++++++++++++++
head/usr.bin/sort/coll.h | 167 +
head/usr.bin/sort/file.c | 1632 ++++++++++++++++++
head/usr.bin/sort/file.h | 138 +
head/usr.bin/sort/mem.c | 82 +
head/usr.bin/sort/mem.h | 45 +
head/usr.bin/sort/nls/C.msg | 16 +
head/usr.bin/sort/nls/hu_HU.ISO8859-2.msg | 16 +
head/usr.bin/sort/radixsort.c | 691 +++++++
head/usr.bin/sort/radixsort.h | 38 +
head/usr.bin/sort/sort.1.in | 638 +++++++
head/usr.bin/sort/sort.c | 1335 +++++++++++++++
head/usr.bin/sort/sort.h | 128 +
head/usr.bin/sort/vsort.c | 265 +++
head/usr.bin/sort/vsort.h | 37 +
head/usr.bin/stat/stat.1 | 8 +-
head/usr.bin/stdbuf/Makefile | 8 +
head/usr.bin/stdbuf/stdbuf.1 | 116 +
head/usr.bin/stdbuf/stdbuf.c | 110 +
head/usr.bin/tftp/tftp.1 | 6 +-
head/usr.bin/top/machine.c | 86 +-
head/usr.bin/top/top.local.1 | 27 +-
head/usr.bin/touch/touch.1 | 44 +-
head/usr.bin/touch/touch.c | 60 +-
head/usr.bin/unzip/unzip.1 | 14 +-
head/usr.bin/unzip/unzip.c | 17 +-
head/usr.bin/usbhidctl/usbhid.c | 8 +-
head/usr.bin/usbhidctl/usbhidctl.1 | 11 +-
head/usr.bin/who/who.1 | 4 +-
head/usr.bin/whois/whois.1 | 4 +-
head/usr.bin/xinstall/xinstall.c | 27 +-
head/usr.bin/yacc/ACKNOWLEDGEMENTS | 25 -
head/usr.bin/yacc/Makefile | 17 +-
head/usr.bin/yacc/NEW_FEATURES | 48 -
head/usr.bin/yacc/NOTES | 9 -
head/usr.bin/yacc/README | 23 -
head/usr.bin/yacc/closure.c | 306 ---
head/usr.bin/yacc/defs.h | 348 ---
head/usr.bin/yacc/error.c | 341 ---
head/usr.bin/yacc/lalr.c | 701 --------
head/usr.bin/yacc/lr0.c | 671 -------
head/usr.bin/yacc/main.c | 438 -----
head/usr.bin/yacc/mkpar.c | 404 ----
head/usr.bin/yacc/output.c | 1342 ---------------
head/usr.bin/yacc/reader.c | 1924 ----------------------
head/usr.bin/yacc/skeleton.c | 426 ----
head/usr.bin/yacc/symtab.c | 162 -
head/usr.bin/yacc/test/error.output | 27 -
head/usr.bin/yacc/test/error.tab.c | 317 ---
head/usr.bin/yacc/test/error.y | 6 -
head/usr.bin/yacc/test/ftp.output | 1625 ------------------
head/usr.bin/yacc/test/ftp.tab.c | 1785 --------------------
head/usr.bin/yacc/test/ftp.tab.h | 63 -
head/usr.bin/yacc/test/ftp.y | 1180 -------------
head/usr.bin/yacc/verbose.c | 381 ----
head/usr.bin/yacc/warshall.c | 123 -
head/usr.bin/yacc/yacc.1 | 169 -
head/usr.bin/yacc/yyfix.1 | 110 -
head/usr.bin/yacc/yyfix.sh | 74 -
133 files changed, 8771 insertions(+), 13353 deletions(-)
diffs (24393 lines):
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/Makefile
--- a/head/usr.bin/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,5 +1,5 @@
# From: @(#)Makefile 8.3 (Berkeley) 1/7/94
-# $FreeBSD: head/usr.bin/Makefile 233337 2012-03-23 03:16:35Z stas $
+# $FreeBSD: head/usr.bin/Makefile 238564 2012-07-18 07:07:54Z obrien $
.include <bsd.own.mk>
@@ -105,6 +105,7 @@
mkfifo \
mklocale \
mktemp \
+ mkulzma \
mkuzip \
mt \
ncal \
@@ -141,8 +142,10 @@
shar \
showmount \
sockstat \
+ sort \
split \
stat \
+ stdbuf \
su \
systat \
tabs \
@@ -205,10 +208,6 @@
SUBDIR+= atm
.endif
-.if ${MK_MAN_UTILS} != "no"
-SUBDIR+= catman
-.endif
-
.if ${MK_BIND_UTILS} != "no"
SUBDIR+= dig
SUBDIR+= host
@@ -232,6 +231,10 @@
_clang= clang
.endif
+.if ${MK_GROFF} != "no"
+SUBDIR+= vgrind
+.endif
+
.if ${MK_HESIOD} != "no"
SUBDIR+= hesinfo
.endif
@@ -242,15 +245,8 @@
_mkesdb= mkesdb
.endif
-.if ${MK_GROFF} != "no"
-SUBDIR+= vgrind
-.endif
-
-.if ${MK_OPENSSL} != "no"
-SUBDIR+= bc
-SUBDIR+= chkey
-SUBDIR+= dc
-SUBDIR+= newkey
+.if ${MK_KERBEROS_SUPPORT} != "no"
+SUBDIR+= compile_et
.endif
.if ${MK_LIBTHR} != "no"
@@ -261,10 +257,6 @@
SUBDIR+= locate
.endif
-.if ${MK_KERBEROS_SUPPORT} != "no"
-SUBDIR+= compile_et
-.endif
-
# XXX msgs?
.if ${MK_MAIL} != "no"
SUBDIR+= biff
@@ -278,6 +270,7 @@
.endif
.if ${MK_MAN_UTILS} != "no"
+SUBDIR+= catman
_makewhatis= makewhatis
_man= man
.endif
@@ -292,6 +285,13 @@
SUBDIR+= ypwhich
.endif
+.if ${MK_OPENSSL} != "no"
+SUBDIR+= bc
+SUBDIR+= chkey
+SUBDIR+= dc
+SUBDIR+= newkey
+.endif
+
.if ${MK_QUOTAS} != "no"
SUBDIR+= quota
.endif
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/ar/Makefile
--- a/head/usr.bin/ar/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/ar/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,6 @@
-# $FreeBSD$
+# $FreeBSD: head/usr.bin/ar/Makefile 234782 2012-04-29 09:32:44Z kib $
+
+.include <bsd.own.mk>
PROG= ar
SRCS= ar.c acplex.l acpyacc.y read.c util.c write.c y.tab.h
@@ -8,7 +10,9 @@
CFLAGS+=-I. -I${.CURDIR}
+.if ${MK_SHARED_TOOLCHAIN} == "no"
NO_SHARED?= yes
+.endif
LINKS= ${BINDIR}/ar ${BINDIR}/ranlib
MLINKS= ar.1 ranlib.1
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/ar/acpyacc.y
--- a/head/usr.bin/ar/acpyacc.y Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/ar/acpyacc.y Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/ar/acpyacc.y 222122 2011-05-20 11:29:09Z bcr $");
+__FBSDID("$FreeBSD: head/usr.bin/ar/acpyacc.y 235789 2012-05-22 16:33:10Z bapt $");
#include <sys/mman.h>
#include <sys/param.h>
@@ -54,7 +54,6 @@
extern int yylex(void);
-extern int yyparse(void);
static void yyerror(const char *);
static void arscp_addlib(char *archive, struct list *list);
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/bc/bc.y
--- a/head/usr.bin/bc/bc.y Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/bc/bc.y Wed Jul 25 16:31:11 2012 +0300
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/bc/bc.y 232994 2012-03-15 01:43:44Z kevlo $");
+__FBSDID("$FreeBSD: head/usr.bin/bc/bc.y 235789 2012-05-22 16:33:10Z bapt $");
#include <sys/types.h>
#include <sys/wait.h>
@@ -69,7 +69,6 @@
ssize_t index;
};
-int yyparse(void);
int yywrap(void);
int fileindex;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/calendar/calendar.1
--- a/head/usr.bin/calendar/calendar.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/calendar/calendar.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)calendar.1 8.1 (Berkeley) 6/29/93
-.\" $FreeBSD: head/usr.bin/calendar/calendar.1 233648 2012-03-29 05:02:12Z eadler $
+.\" $FreeBSD: head/usr.bin/calendar/calendar.1 235211 2012-05-10 02:07:00Z gjb $
.\"
.Dd June 13, 2002
.Dt CALENDAR 1
@@ -218,7 +218,7 @@
.Sh FILES
.Bl -tag -width calendar.christian -compact
.It Pa calendar
-file in current directory
+file in current directory.
.It Pa ~/.calendar
.Pa calendar
HOME directory.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/calendar/calendars/calendar.freebsd
--- a/head/usr.bin/calendar/calendars/calendar.freebsd Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/calendar/calendars/calendar.freebsd Wed Jul 25 16:31:11 2012 +0300
@@ -1,7 +1,7 @@
/*
* FreeBSD
*
- * $FreeBSD: head/usr.bin/calendar/calendars/calendar.freebsd 234446 2012-04-18 22:56:46Z dteske $
+ * $FreeBSD: head/usr.bin/calendar/calendars/calendar.freebsd 238058 2012-07-03 07:28:57Z zeising $
*/
#ifndef _calendar_freebsd_
@@ -144,6 +144,7 @@
05/08 Sean Kelly <smkelly at FreeBSD.org> born in Walnut Creek, California, United States, 1982
05/09 Daniel Eischen <deischen at FreeBSD.org> born in Syracuse, New York, United States, 1963
05/09 Aaron Dalton <aaron at FreeBSD.org> born in Boise, Idaho, United States, 1973
+05/09 Jase Thew <jase at FreeBSD.org> born in Abergavenny, Gwent, United Kingdom, 1974
05/10 Markus Brueffer <markus at FreeBSD.org> born in Gronau, Nordrhein-Westfalen, Germany, 1977
05/11 Jesus Rodriguez <jesusr at FreeBSD.org> born in Barcelona, Spain, 1972
05/11 Roman Kurakin <rik at FreeBSD.org> born in Moscow, USSR, 1979
@@ -309,6 +310,7 @@
10/23 Mario Sergio Fujikawa Ferreira <lioux at FreeBSD.org> born in Brasilia, Distrito Federal, Brazil, 1976
10/25 Eric Melville <eric at FreeBSD.org> born in Los Gatos, California, United States, 1980
10/25 Julien Laffaye <jlaffaye at FreeBSD.org> born in Toulouse, France, 1988
+10/25 Ashish SHUKLA <ashish at FreeBSD.org> born in Kanpur, India, 1985
10/26 Philip M. Gollucci <pgollucci at FreeBSD.org> born in Silver Spring, Maryland, United States, 1979
10/27 Takanori Watanabe <takawata at FreeBSD.org> born in Numazu, Shizuoka, Japan, 1972
11/05 M. Warner Losh <imp at FreeBSD.org> born in Kansas City, Kansas, United States, 1966
@@ -316,6 +318,7 @@
11/09 Antoine Brodin <antoine at FreeBSD.org> born in Bagnolet, France, 1981
11/10 Gregory Neil Shapiro <gshapiro at FreeBSD.org> born in Providence, Rhode Island, United States, 1970
11/13 John Baldwin <jhb at FreeBSD.org> born in Stuart, Virginia, United States, 1977
+11/14 Jeremie Le Hen <jlh at FreeBSD.org> born in Nancy, France, 1980
11/15 Lars Engels <lme at FreeBSD.org> born in Hilden, Nordrhein-Westfalen, Germany, 1980
11/15 Tijl Coosemans <tijl at FreeBSD.org> born in Duffel, Belgium, 1983
11/16 Jose Maria Alcaide Salinas <jmas at FreeBSD.org> born in Madrid, Spain, 1962
@@ -347,6 +350,7 @@
12/23 Sean Chittenden <seanc at FreeBSD.org> born in Seattle, Washington, United States, 1979
12/23 Alejandro Pulver <alepulver at FreeBSD.org> born in Buenos Aires, Argentina, 1989
12/24 Guido Falsi <madpilot at FreeBSD.org> born in Firenze, Italy, 1978
+12/25 Niclas Zeising <zeising at FreeBSD.org> born in Stockholm, Sweden, 1986
12/28 Soren Schmidt <sos at FreeBSD.org> born in Maribo, Denmark, 1960
12/28 Ade Lovett <ade at FreeBSD.org> born in London, England, 1969
12/28 Marius Strobl <marius at FreeBSD.org> born in Cham, Bavaria, Germany, 1978
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/chat/chat.c
--- a/head/usr.bin/chat/chat.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/chat/chat.c Wed Jul 25 16:31:11 2012 +0300
@@ -78,7 +78,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/usr.bin/chat/chat.c 236213 2012-05-29 01:48:06Z kevlo $");
#include <sys/types.h>
#include <sys/stat.h>
@@ -408,6 +408,7 @@
va_start(args, fmt);
vfmtmsg(line, sizeof(line), fmt, args);
+ va_end(args);
if (to_log)
syslog(LOG_INFO, "%s", line);
if (to_stderr)
@@ -425,6 +426,7 @@
va_start(args, fmt);
vfmtmsg(line, sizeof(line), fmt, args);
+ va_end(args);
if (to_log)
syslog(LOG_ERR, "%s", line);
if (to_stderr)
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/clang/clang/Makefile
--- a/head/usr.bin/clang/clang/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/clang/clang/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-# $FreeBSD: head/usr.bin/clang/clang/Makefile 234353 2012-04-16 21:23:25Z dim $
+# $FreeBSD: head/usr.bin/clang/clang/Makefile 234982 2012-05-03 20:41:21Z dim $
.include <bsd.own.mk>
@@ -41,7 +41,6 @@
clangstaticanalyzercheckers \
clangstaticanalyzercore \
clanganalysis \
- clangindex \
clangarcmigrate \
clangrewrite \
clangedit \
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/clang/clang/clang.1
--- a/head/usr.bin/clang/clang/clang.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/clang/clang/clang.1 Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-.\" $FreeBSD: head/usr.bin/clang/clang/clang.1 234353 2012-04-16 21:23:25Z dim $
+.\" $FreeBSD: head/usr.bin/clang/clang/clang.1 235211 2012-05-10 02:07:00Z gjb $
.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
.\"
.\" Standard preamble:
@@ -475,7 +475,7 @@
.IX Item "CPATH"
If this environment variable is present, it is treated as a delimited
list of paths to be added to the default system include path list. The
-delimiter is the platform dependent delimitor, as used in the \fI\s-1PATH\s0\fR
+delimiter is the platform dependent delimiter, as used in the \fI\s-1PATH\s0\fR
environment variable.
.Sp
Empty components in the environment variable are ignored.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/clang/tblgen/tblgen.1
--- a/head/usr.bin/clang/tblgen/tblgen.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/clang/tblgen/tblgen.1 Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-.\" $FreeBSD: head/usr.bin/clang/tblgen/tblgen.1 234353 2012-04-16 21:23:25Z dim $
+.\" $FreeBSD: head/usr.bin/clang/tblgen/tblgen.1 235211 2012-05-10 02:07:00Z gjb $
.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
.\"
.\" Standard preamble:
@@ -175,7 +175,7 @@
Print all records to standard output (default).
.IP "\fB\-print\-enums\fR" 4
.IX Item "-print-enums"
-Print enumeration values for a class
+Print enumeration values for a class.
.IP "\fB\-print\-sets\fR" 4
.IX Item "-print-sets"
Print expanded sets for testing \s-1DAG\s0 exprs.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/csup/csup.1
--- a/head/usr.bin/csup/csup.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/csup/csup.1 Wed Jul 25 16:31:11 2012 +0300
@@ -22,7 +22,7 @@
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.\" $Id: cvsup.1,v 1.70 2003/03/04 18:23:46 jdp Exp $
-.\" $FreeBSD: head/usr.bin/csup/csup.1 233648 2012-03-29 05:02:12Z eadler $
+.\" $FreeBSD: head/usr.bin/csup/csup.1 235211 2012-05-10 02:07:00Z gjb $
.\"
.Dd February 1, 2006
.Dt CSUP 1
@@ -311,7 +311,7 @@
The default
.Ar base
directory is
-.Pa /usr/local/etc/csup .
+.Pa /usr/local/etc/cvsup .
.It Cm prefix= Ns Ar prefix
This is the directory under which updated files will be placed.
By default, it is the same as
@@ -656,7 +656,7 @@
.El
.Pp
will not work because the file on the server is called
-.Ql Makefile,v.
+.Ql Makefile,v .
A better solution would be
.Pp
.Bl -item -compact -offset indent
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/ctlstat/ctlstat.8
--- a/head/usr.bin/ctlstat/ctlstat.8 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/ctlstat/ctlstat.8 Wed Jul 25 16:31:11 2012 +0300
@@ -32,7 +32,7 @@
.\" Author: Ken Merry <ken at FreeBSD.org>
.\"
.\" $Id: //depot/users/kenm/FreeBSD-test2/usr.bin/ctlstat/ctlstat.8#2 $
-.\" $FreeBSD: head/usr.bin/ctlstat/ctlstat.8 229997 2012-01-12 00:34:33Z ken $
+.\" $FreeBSD: head/usr.bin/ctlstat/ctlstat.8 235873 2012-05-24 02:24:03Z wblock $
.\"
.Dd June 4, 2010
.Dt CTLSTAT 8
@@ -86,8 +86,8 @@
No statistics are computed in this mode, only raw numbers are displayed.
.It Fl l Ar lun
Request statistics for the specified LUN.
-This option is incompatible with total (
-.Fl t )
+This option is incompatible with total
+.Fl ( t )
mode.
.It Fl n Ar numdevs
Display statistics for this many devices.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/cut/cut.1
--- a/head/usr.bin/cut/cut.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/cut/cut.1 Wed Jul 25 16:31:11 2012 +0300
@@ -29,7 +29,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)cut.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/cut/cut.1 236867 2012-06-11 03:10:15Z kevlo $
.\"
.Dd December 21, 2006
.Dt CUT 1
@@ -68,7 +68,7 @@
.Ar list
can be in terms of column position or in terms of fields delimited
by a special character.
-Column numbering starts from 1.
+Column and field numbering start from 1.
.Pp
The
.Ar list
@@ -78,14 +78,14 @@
Number ranges consist of a number, a dash
.Pq Sq \- ,
and a second number
-and select the fields or columns from the first number to the second,
+and select the columns or fields from the first number to the second,
inclusive.
Numbers or number ranges may be preceded by a dash, which selects all
-fields or columns from 1 to the last number.
+columns or fields from 1 to the last number.
Numbers or number ranges may be followed by a dash, which selects all
-fields or columns from the last number to the end of the line.
+columns or fields from the last number to the end of the line.
Numbers and number ranges may be repeated, overlapping, and in any order.
-It is not an error to select fields or columns not present in the
+It is not an error to select columns or fields not present in the
input line.
.Pp
The options are as follows:
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/cut/cut.c
--- a/head/usr.bin/cut/cut.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/cut/cut.c Wed Jul 25 16:31:11 2012 +0300
@@ -37,7 +37,7 @@
static const char sccsid[] = "@(#)cut.c 8.3 (Berkeley) 5/4/95";
#endif /* not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/cut/cut.c 227162 2011-11-06 08:14:51Z ed $");
+__FBSDID("$FreeBSD: head/usr.bin/cut/cut.c 236866 2012-06-11 03:02:40Z kevlo $");
#include <ctype.h>
#include <err.h>
@@ -164,7 +164,7 @@
* set a byte in the positions array to indicate if a field or
* column is to be selected; use +1, it's 1-based, not 0-based.
* Numbers and number ranges may be overlapping, repeated, and in
- * any order. We handle "-3-5" although there's no real reason too.
+ * any order. We handle "-3-5" although there's no real reason to.
*/
for (; (p = strsep(&list, ", \t")) != NULL;) {
setautostart = start = stop = 0;
@@ -187,9 +187,9 @@
}
}
if (*p)
- errx(1, "[-cf] list: illegal list value");
+ errx(1, "[-bcf] list: illegal list value");
if (!stop || !start)
- errx(1, "[-cf] list: values may not include zero");
+ errx(1, "[-bcf] list: values may not include zero");
if (maxval < stop) {
maxval = stop;
needpos(maxval + 1);
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/dc/dc.1
--- a/head/usr.bin/dc/dc.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/dc/dc.1 Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/dc/dc.1 235400 2012-05-13 14:16:04Z joel $
.\" $OpenBSD: dc.1,v 1.24 2010/01/02 19:48:56 schwarze Exp $
.\"
.\" Copyright (C) Caldera International Inc. 2001-2002.
@@ -315,7 +315,7 @@
and decimal point.
.It Ic z
The stack level is pushed onto the stack.
-.It Cm [ Ns ... Ns Cm ]
+.It Cm \&[ Ns ... Ns Cm \&]
Puts the bracketed
.Tn ASCII
string onto the top of the stack.
@@ -375,12 +375,12 @@
.It Ic \&?
A line of input is taken from the input source (usually the terminal)
and executed.
-.It Ic : Ns Ar r
+.It Ic \&: Ns Ar r
Pop two values from the stack.
The second value on the stack is stored into the array
.Ar r
indexed by the top of stack.
-.It Ic ; Ns Ar r
+.It Ic \&; Ns Ar r
Pop a value from the stack.
The value is used as an index into register
.Ar r .
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/du/du.1
--- a/head/usr.bin/du/du.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/du/du.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,9 +26,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)du.1 8.2 (Berkeley) 4/1/94
-.\" $FreeBSD: head/usr.bin/du/du.1 228669 2011-12-17 23:18:14Z jilles $
+.\" $FreeBSD: head/usr.bin/du/du.1 238602 2012-07-18 19:28:22Z des $
.\"
-.Dd December 17, 2011
+.Dd July 18, 2012
.Dt DU 1
.Os
.Sh NAME
@@ -38,7 +38,7 @@
.Nm
.Op Fl Aclnx
.Op Fl H | L | P
-.Op Fl h | k | m
+.Op Fl g | h | k | m
.Op Fl a | s | d Ar depth
.Op Fl B Ar blocksize
.Op Fl I Ar mask
@@ -63,9 +63,9 @@
.Ar blocksize
byte blocks.
This is different from the
-.Fl h, k
+.Fl h, k, m
and
-.Fl m
+.Fl g
options or setting
.Ev BLOCKSIZE
and gives an estimate of how much space the examined file hierarchy would
@@ -95,13 +95,15 @@
Display an entry for all files and directories
.Ar depth
directories deep.
+.It Fl g
+Display block counts in 1073741824-byte (1 GiB) blocks.
.It Fl h
.Dq Human-readable
output.
Use unit suffixes: Byte, Kilobyte, Megabyte,
Gigabyte, Terabyte and Petabyte.
.It Fl k
-Display block counts in 1024-byte (1-Kbyte) blocks.
+Display block counts in 1024-byte (1 kiB) blocks.
.It Fl l
If a file has multiple hard links, count its size multiple times.
The default behavior of
@@ -112,7 +114,7 @@
option is specified, the hard link checks are disabled, and these files
are counted (and displayed) as many times as they are found.
.It Fl m
-Display block counts in 1048576-byte (1-Mbyte) blocks.
+Display block counts in 1048576-byte (1 MiB) blocks.
.It Fl n
Ignore files and directories with user
.Dq nodump
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/du/du.c
--- a/head/usr.bin/du/du.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/du/du.c Wed Jul 25 16:31:11 2012 +0300
@@ -42,7 +42,7 @@
#endif
#endif /* not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/du/du.c 228669 2011-12-17 23:18:14Z jilles $");
+__FBSDID("$FreeBSD: head/usr.bin/du/du.c 238602 2012-07-18 19:28:22Z des $");
#include <sys/param.h>
#include <sys/queue.h>
@@ -109,7 +109,7 @@
depth = INT_MAX;
SLIST_INIT(&ignores);
- while ((ch = getopt(argc, argv, "AB:HI:LPasd:chklmnrt:x")) != -1)
+ while ((ch = getopt(argc, argv, "AB:HI:LPasd:cghklmnrt:x")) != -1)
switch (ch) {
case 'A':
Aflag = 1;
@@ -156,6 +156,10 @@
case 'c':
cflag = 1;
break;
+ case 'g':
+ hflag = 0;
+ blocksize = 1073741824;
+ break;
case 'h':
hflag = 1;
break;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/fetch/fetch.1
--- a/head/usr.bin/fetch/fetch.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/fetch/fetch.1 Wed Jul 25 16:31:11 2012 +0300
@@ -1,5 +1,5 @@
.\"-
-.\" Copyright (c) 2000-2012 Dag-Erling Smørgrav
+.\" Copyright (c) 2000-2011 Dag-Erling Smørgrav
.\" All rights reserved.
.\" Portions Copyright (c) 1999 Massachusetts Institute of Technology; used
.\" by permission.
@@ -27,9 +27,9 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $FreeBSD: head/usr.bin/fetch/fetch.1 232274 2012-02-28 22:15:46Z obrien $
+.\" $FreeBSD: head/usr.bin/fetch/fetch.1 236110 2012-05-26 17:19:41Z des $
.\"
-.Dd February 28, 2012
+.Dd September 27, 2011
.Dt FETCH 1
.Os
.Sh NAME
@@ -214,11 +214,6 @@
flag is specified, wait this many seconds between successive retries.
.El
.Pp
-.Ar URL
-.Bd -literal
- <scheme>:(//(<user>(:<pwd>)?@)?<host>(:<port>)?)?/(<document>)?
-.Ed
-.Pp
If
.Nm
receives a
@@ -254,7 +249,7 @@
.Ev HTTP_REFERER ,
.Ev HTTP_USER_AGENT ,
.Ev NETRC ,
-.Ev NO_PROXY and
+.Ev NO_PROXY No and
.Ev no_proxy .
.Sh EXIT STATUS
The
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/find/find.1
--- a/head/usr.bin/find/find.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/find/find.1 Wed Jul 25 16:31:11 2012 +0300
@@ -29,9 +29,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)find.1 8.7 (Berkeley) 5/9/95
-.\" $FreeBSD: head/usr.bin/find/find.1 233648 2012-03-29 05:02:12Z eadler $
+.\" $FreeBSD: head/usr.bin/find/find.1 237035 2012-06-13 21:53:40Z jilles $
.\"
-.Dd September 28, 2011
+.Dd June 13, 2012
.Dt FIND 1
.Os
.Sh NAME
@@ -126,36 +126,15 @@
.It Fl d
Cause
.Nm
-to perform a depth-first traversal, i.e., directories
-are visited in post-order and all entries in a directory will be acted
-on before the directory itself.
-By default,
-.Nm
-visits directories in pre-order, i.e., before their contents.
-Note, the default is
-.Em not
-a breadth-first traversal.
+to perform a depth-first traversal.
.Pp
-This option is equivalent to the
+This option is a BSD-specific equivalent of the
.Ic -depth
-primary of
+primary specified by
.St -p1003.1-2001 .
-The
-.Fl d
-option
-can be useful when
-.Nm
-is used with
-.Xr cpio 1
-to process files that are contained in directories with unusual permissions.
-It ensures that you have write permission while you are placing files in a
-directory, then sets the directory's permissions as the last thing.
-.It Fl f
-Specify a file hierarchy for
-.Nm
-to traverse.
-File hierarchies may also be specified as the operands immediately
-following the options.
+Refer to its description under
+.Sx PRIMARIES
+for more information.
.It Fl s
Cause
.Nm
@@ -301,7 +280,7 @@
.Ic -atime
primary description for information on supported time units.
.It Ic -d
-Same as
+Non-portable, BSD-specific version of
.Ic depth .
GNU find implements this as a primary in mistaken emulation of
.Fx
@@ -319,12 +298,37 @@
.Dq Pa \&.
for security reasons.
Depth-first traversal processing is implied by this option.
+The
+.Ic -delete
+primary will fail to delete a directory if it is not empty.
Following symlinks is incompatible with this option.
.It Ic -depth
Always true;
-same as the
+same as the non-portable
.Fl d
option.
+Cause
+.Nm
+to perform a depth-first traversal, i.e., directories
+are visited in post-order and all entries in a directory will be acted
+on before the directory itself.
+By default,
+.Nm
+visits directories in pre-order, i.e., before their contents.
+Note, the default is
+.Em not
+a breadth-first traversal.
+.Pp
+The
+.Ic -depth
+primary
+can be useful when
+.Nm
+is used with
+.Xr cpio 1
+to process files that are contained in directories with unusual permissions.
+It ensures that you have write permission while you are placing files in a
+directory, then sets the directory's permissions as the last thing.
.It Ic -depth Ar n
True if the depth of the file relative to the starting point of the traversal
is
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/find/getdate.y
--- a/head/usr.bin/find/getdate.y Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/find/getdate.y Wed Jul 25 16:31:11 2012 +0300
@@ -13,7 +13,7 @@
/* SUPPRESS 288 on yyerrlab *//* Label unused */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/usr.bin/find/getdate.y 235789 2012-05-22 16:33:10Z bapt $");
#include <stdio.h>
#include <ctype.h>
@@ -60,11 +60,9 @@
#include <time.h>
-#define yyparse getdate_yyparse
#define yylex getdate_yylex
#define yyerror getdate_yyerror
-static int yyparse(void);
static int yylex(void);
static int yyerror(const char *);
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/fstat/Makefile
--- a/head/usr.bin/fstat/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/fstat/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,10 +1,10 @@
# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD: head/usr.bin/fstat/Makefile 221807 2011-05-12 10:11:39Z stas $
+# $FreeBSD: head/usr.bin/fstat/Makefile 235642 2012-05-19 05:07:03Z marcel $
PROG= fstat
SRCS= fstat.c fuser.c main.c
LINKS= ${BINDIR}/fstat ${BINDIR}/fuser
-DPADD= ${LIBKVM}
+DPADD= ${LIBKVM} ${LIBUTIL} ${LIBPROCSTAT}
LDADD= -lkvm -lutil -lprocstat
MAN1= fuser.1 fstat.1
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/fstat/fstat.c
--- a/head/usr.bin/fstat/fstat.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/fstat/fstat.c Wed Jul 25 16:31:11 2012 +0300
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/fstat/fstat.c 233760 2012-04-01 18:22:48Z jhb $");
+__FBSDID("$FreeBSD: head/usr.bin/fstat/fstat.c 235602 2012-05-18 10:15:46Z gleb $");
#include <sys/param.h>
#include <sys/user.h>
@@ -244,7 +244,7 @@
for (d = devs; d != NULL; d = d->next)
if (d->fsid == vn.vn_fsid) {
fsmatch = 1;
- if ((unsigned)d->ino == vn.vn_fileid) {
+ if (d->ino == vn.vn_fileid) {
filename = d->name;
break;
}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/gprof/gprof.1
--- a/head/usr.bin/gprof/gprof.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/gprof/gprof.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)gprof.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/gprof/gprof.1 235211 2012-05-10 02:07:00Z gjb $
.\"
.Dd December 25, 2008
.Dt GPROF 1
@@ -73,7 +73,7 @@
instead of
.Fl l Ns Ar c .
Read the given object file (the default is
-.Pa a.out)
+.Pa a.out )
and establishes the relation between its symbol table
and the call graph profile.
The default graph profile file name is the name
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/gprof/lookup.c
--- a/head/usr.bin/gprof/lookup.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/gprof/lookup.c Wed Jul 25 16:31:11 2012 +0300
@@ -34,7 +34,7 @@
#endif
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/usr.bin/gprof/lookup.c 235975 2012-05-25 06:48:42Z gber $");
#include "gprof.h"
@@ -66,6 +66,12 @@
printf( "[nllookup] %d (%d) probes\n" , probes , nname-1 );
}
# endif /* DEBUG */
+#if defined(__arm__)
+ if (nl[middle].name[0] == '$' &&
+ nl[middle-1].value == nl[middle].value)
+ middle--;
+#endif
+
return &nl[ middle ];
}
if ( nl[ middle ].value > address ) {
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/gzip/zmore.1
--- a/head/usr.bin/gzip/zmore.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/gzip/zmore.1 Wed Jul 25 16:31:11 2012 +0300
@@ -19,8 +19,8 @@
.\" Agency (DARPA) and Air Force Research Laboratory, Air Force
.\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
.\"
-.\" $FreeBSD$
-.Dd February 06, 2011
+.\" $FreeBSD: head/usr.bin/gzip/zmore.1 236596 2012-06-05 03:14:39Z eadler $
+.Dd February 6, 2011
.Dt ZMORE 1
.Os
.Sh NAME
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/ipcrm/ipcrm.1
--- a/head/usr.bin/ipcrm/ipcrm.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/ipcrm/ipcrm.1 Wed Jul 25 16:31:11 2012 +0300
@@ -21,7 +21,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: head/usr.bin/ipcrm/ipcrm.1 233648 2012-03-29 05:02:12Z eadler $
+.\" $FreeBSD: head/usr.bin/ipcrm/ipcrm.1 235211 2012-05-10 02:07:00Z gjb $
.\""
.Dd December 12, 2007
.Dt IPCRM 1
@@ -112,7 +112,7 @@
.Xr ipcs 1
.Sh HISTORY
The wiping of all System V IPC objects was first implemented in
-.Fx 6.4 and 7.1.
+.Fx 6.4 No and 7.1.
.Sh AUTHORS
The original author was Adam Glass.
The wiping of all System V IPC objects was thought up by Callum
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/join/join.1
--- a/head/usr.bin/join/join.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/join/join.1 Wed Jul 25 16:31:11 2012 +0300
@@ -29,7 +29,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)join.1 8.3 (Berkeley) 4/28/95
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/join/join.1 235597 2012-05-18 03:30:50Z gjb $
.\"
.Dd July 5, 2004
.Dt JOIN 1
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/kdump/kdump.1
--- a/head/usr.bin/kdump/kdump.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/kdump/kdump.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,9 +26,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)kdump.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD: head/usr.bin/kdump/kdump.1 234494 2012-04-20 15:32:36Z jhb $
+.\" $FreeBSD: head/usr.bin/kdump/kdump.1 236577 2012-06-04 19:09:14Z jhb $
.\"
-.Dd April 20, 2012
+.Dd June 4, 2012
.Dt KDUMP 1
.Os
.Sh NAME
@@ -86,9 +86,9 @@
Suppressing this feature yields a more consistent output format and is
easily amenable to further processing.
.It Fl p Ar pid
-Display only trace events that correspond to the process
+Display only trace events that correspond to the process or thread
.Ar pid .
-This may be useful when there are multiple processes recorded in the
+This may be useful when there are multiple processes or threads recorded in the
same trace file.
.It Fl R
Display relative timestamps (time since previous entry).
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/kdump/kdump.c
--- a/head/usr.bin/kdump/kdump.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/kdump/kdump.c Wed Jul 25 16:31:11 2012 +0300
@@ -39,7 +39,7 @@
#endif
#endif /* not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/kdump/kdump.c 234494 2012-04-20 15:32:36Z jhb $");
+__FBSDID("$FreeBSD: head/usr.bin/kdump/kdump.c 236577 2012-06-04 19:09:14Z jhb $");
#define _KERNEL
extern int errno;
@@ -251,7 +251,8 @@
}
}
if (trpoints & (1<<ktr_header.ktr_type))
- if (pid == 0 || ktr_header.ktr_pid == pid)
+ if (pid == 0 || ktr_header.ktr_pid == pid ||
+ ktr_header.ktr_tid == pid)
dumpheader(&ktr_header);
if ((ktrlen = ktr_header.ktr_len) < 0)
errx(1, "bogus length 0x%x", ktrlen);
@@ -266,7 +267,8 @@
if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
continue;
sv_flags = abidump(&ktr_header);
- if (pid && ktr_header.ktr_pid != pid)
+ if (pid && ktr_header.ktr_pid != pid &&
+ ktr_header.ktr_tid != pid)
continue;
if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
continue;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/kdump/mkioctls
--- a/head/usr.bin/kdump/mkioctls Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/kdump/mkioctls Wed Jul 25 16:31:11 2012 +0300
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# $FreeBSD: head/usr.bin/kdump/mkioctls 234058 2012-04-09 14:47:18Z dim $
+# $FreeBSD: head/usr.bin/kdump/mkioctls 235911 2012-05-24 14:07:44Z mav $
#
# When editing this script, keep in mind that truss also uses it.
#
@@ -63,6 +63,8 @@
print "#include <netinet6/ip6_mroute.h>"
print "#include <stdio.h>"
print "#include <cam/cam.h>"
+ print "#include <stddef.h>"
+ print "#include <stdint.h>"
print ""
print ioctl_includes
print ""
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/killall/killall.1
--- a/head/usr.bin/killall/killall.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/killall/killall.1 Wed Jul 25 16:31:11 2012 +0300
@@ -22,9 +22,9 @@
.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $FreeBSD: head/usr.bin/killall/killall.1 233510 2012-03-26 15:18:14Z joel $
+.\" $FreeBSD: head/usr.bin/killall/killall.1 237618 2012-06-27 00:50:25Z delphij $
.\"
-.Dd December 25, 2009
+.Dd June 27, 2012
.Dt KILLALL 1
.Os
.Sh NAME
@@ -34,6 +34,7 @@
.Nm
.Op Fl delmsvz
.Op Fl help
+.Op Fl I
.Op Fl j Ar jail
.Op Fl u Ar user
.Op Fl t Ar tty
@@ -71,6 +72,9 @@
option.
.It Fl help
Give a help on the command usage and exit.
+.It Fl I
+Request confirmation before attempting to signal each
+process.
.It Fl l
List the names of the available signals and exit, like in
.Xr kill 1 .
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/killall/killall.c
--- a/head/usr.bin/killall/killall.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/killall/killall.c Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/usr.bin/killall/killall.c 237847 2012-06-30 16:36:22Z kib $");
#include <sys/param.h>
#include <sys/jail.h>
@@ -53,7 +53,7 @@
usage(void)
{
- fprintf(stderr, "usage: killall [-delmsvz] [-help] [-j jail]\n");
+ fprintf(stderr, "usage: killall [-delmsvz] [-help] [-I] [-j jail]\n");
fprintf(stderr,
" [-u user] [-t tty] [-c cmd] [-SIGNAL] [cmd]...\n");
fprintf(stderr, "At least one option or argument to specify processes must be given.\n");
@@ -90,13 +90,14 @@
int
main(int ac, char **av)
{
- struct kinfo_proc *procs = NULL, *newprocs;
+ struct kinfo_proc *procs, *newprocs;
struct stat sb;
struct passwd *pw;
regex_t rgx;
regmatch_t pmatch;
- int i, j;
+ int i, j, ch;
char buf[256];
+ char first;
char *user = NULL;
char *tty = NULL;
char *cmd = NULL;
@@ -104,6 +105,7 @@
int sflag = 0;
int dflag = 0;
int eflag = 0;
+ int Iflag = 0;
int jflag = 0;
int mflag = 0;
int zflag = 0;
@@ -141,6 +143,9 @@
if (**av == '-') {
++*av;
switch (**av) {
+ case 'I':
+ Iflag = 1;
+ break;
case 'j':
++*av;
if (**av == '\0') {
@@ -273,9 +278,6 @@
size = 0;
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PROC;
- mib[3] = 0;
- miblen = 3;
if (user) {
mib[2] = eflag ? KERN_PROC_UID : KERN_PROC_RUID;
@@ -285,16 +287,20 @@
mib[2] = KERN_PROC_TTY;
mib[3] = tdev;
miblen = 4;
+ } else {
+ mib[2] = KERN_PROC_PROC;
+ mib[3] = 0;
+ miblen = 3;
}
+ procs = NULL;
st = sysctl(mib, miblen, NULL, &size, NULL, 0);
do {
size += size / 10;
newprocs = realloc(procs, size);
- if (newprocs == 0) {
- if (procs)
- free(procs);
- errx(1, "could not reallocate memory");
+ if (newprocs == NULL) {
+ free(procs);
+ err(1, "could not reallocate memory");
}
procs = newprocs;
st = sysctl(mib, miblen, procs, &size, NULL, 0);
@@ -304,7 +310,7 @@
if (size % sizeof(struct kinfo_proc) != 0) {
fprintf(stderr, "proc size mismatch (%zu total, %zu chunks)\n",
size, sizeof(struct kinfo_proc));
- fprintf(stderr, "userland out of sync with kernel, recompile libkvm etc\n");
+ fprintf(stderr, "userland out of sync with kernel\n");
exit(1);
}
nprocs = size / sizeof(struct kinfo_proc);
@@ -313,7 +319,7 @@
mypid = getpid();
for (i = 0; i < nprocs; i++) {
- if ((procs[i].ki_stat & SZOMB) == SZOMB && !zflag)
+ if (procs[i].ki_stat == SZOMB && !zflag)
continue;
thispid = procs[i].ki_pid;
strlcpy(thiscmd, procs[i].ki_comm, sizeof(thiscmd));
@@ -382,6 +388,16 @@
if (matched)
break;
}
+ if (matched != 0 && Iflag) {
+ printf("Send signal %d to %s (pid %d uid %d)? ",
+ sig, thiscmd, thispid, thisuid);
+ fflush(stdout);
+ first = ch = getchar();
+ while (ch != '\n' && ch != EOF)
+ ch = getchar();
+ if (first != 'y' && first != 'Y')
+ matched = 0;
+ }
if (matched == 0)
continue;
if (dflag)
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/ktrace/ktrace.1
--- a/head/usr.bin/ktrace/ktrace.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/ktrace/ktrace.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,9 +26,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)ktrace.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD: head/usr.bin/ktrace/ktrace.1 233925 2012-04-05 17:13:14Z jhb $
+.\" $FreeBSD: head/usr.bin/ktrace/ktrace.1 236357 2012-05-31 14:46:02Z jhb $
.\"
-.Dd April 5, 2012
+.Dd May 31, 2012
.Dt KTRACE 1
.Os
.Sh NAME
@@ -131,7 +131,7 @@
requests
.It Cm +
trace the default set of trace points -
-.Cm c , f , i , n , p , s , t , u , y
+.Cm c , i , n , p , s , t , u , y
.El
.It Ar command
Execute
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/ktrace/ktrace.h
--- a/head/usr.bin/ktrace/ktrace.h Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/ktrace/ktrace.h Wed Jul 25 16:31:11 2012 +0300
@@ -27,17 +27,17 @@
* SUCH DAMAGE.
*
* @(#)ktrace.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD: head/usr.bin/ktrace/ktrace.h 233925 2012-04-05 17:13:14Z jhb $
+ * $FreeBSD: head/usr.bin/ktrace/ktrace.h 236357 2012-05-31 14:46:02Z jhb $
*/
#define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | \
- KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_CAPFAIL | \
- KTRFAC_FAULT | KTRFAC_FAULTEND)
+ KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_CAPFAIL)
#define PROC_ABI_POINTS (KTRFAC_PROCCTOR | KTRFAC_PROCDTOR)
-#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW | PROC_ABI_POINTS)
+#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW | PROC_ABI_POINTS | \
+ KTRFAC_FAULT | KTRFAC_FAULTEND)
#define DEF_TRACEFILE "ktrace.out"
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/lastcomm/lastcomm.1
--- a/head/usr.bin/lastcomm/lastcomm.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/lastcomm/lastcomm.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,9 +26,9 @@
.\" SUCH DAMAGE.
.\"
.\" From: @(#)lastcomm.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/lastcomm/lastcomm.1 235541 2012-05-17 11:10:13Z kib $
.\"
-.Dd May 14, 2007
+.Dd May 17, 2012
.Dt LASTCOMM 1
.Os
.Sh NAME
@@ -38,6 +38,7 @@
.Nm
.Op Fl EScesu
.Op Fl f Ar file
+.Op Cm + Ns Ar format
.Op Ar command ...\&
.Op Ar user ...\&
.Op Ar terminal ...\&
@@ -77,6 +78,15 @@
reads accounting entries from the standard input.
.El
.Pp
+An operand with a leading plus sign
+.Pq Sq +
+is followed a user-defined format string which specifies the format
+in which to display the process's start or exit date and time.
+The format string may contain any of the conversion specifications
+described in the
+.Xr strftime 3
+manual page, as well as arbitrary text.
+.Pp
If no options are specified,
.Fl cS
is assumed.
@@ -165,6 +175,7 @@
.Sh SEE ALSO
.Xr last 1 ,
.Xr sigaction 2 ,
+.Xr strftime 3 ,
.Xr acct 5 ,
.Xr core 5
.Sh HISTORY
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/lastcomm/lastcomm.c
--- a/head/usr.bin/lastcomm/lastcomm.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/lastcomm/lastcomm.c Wed Jul 25 16:31:11 2012 +0300
@@ -39,7 +39,7 @@
#endif
#endif /* not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/lastcomm/lastcomm.c 223375 2011-06-21 20:36:10Z delphij $");
+__FBSDID("$FreeBSD: head/usr.bin/lastcomm/lastcomm.c 235541 2012-05-17 11:10:13Z kib $");
#include <sys/param.h>
#include <sys/stat.h>
@@ -52,6 +52,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
#include <unistd.h>
#include "pathnames.h"
@@ -82,10 +83,12 @@
int (*readrec)(FILE *f, struct acctv2 *av2);
time_t t;
int ch, rv;
- const char *acctfile;
+ const char *acctfile, *format;
+ char buf[1024];
int flags = 0;
acctfile = _PATH_ACCT;
+ format = NULL;
while ((ch = getopt(argc, argv, "f:usecSE")) != -1)
switch((char)ch) {
case 'f':
@@ -126,6 +129,12 @@
argc -= optind;
argv += optind;
+ if (argc > 0 && **argv == '+') {
+ format = *argv + 1; /* skip + */
+ argc--;
+ argv++;
+ }
+
if (strcmp(acctfile, "-") == 0) {
fp = stdin;
readrec = readrec_forward;
@@ -177,14 +186,24 @@
/* starting time */
if (flags & AC_BTIME) {
- (void)printf(" %.16s", ctime(&ab.ac_btime));
+ if (format != NULL) {
+ (void)strftime(buf, sizeof(buf), format,
+ localtime(&ab.ac_btime));
+ (void)printf(" %s", buf);
+ } else
+ (void)printf(" %.16s", ctime(&ab.ac_btime));
}
/* exit time (starting time + elapsed time )*/
if (flags & AC_FTIME) {
t = ab.ac_btime;
t += (time_t)(ab.ac_etime / 1000000);
- (void)printf(" %.16s", ctime(&t));
+ if (format != NULL) {
+ (void)strftime(buf, sizeof(buf), format,
+ localtime(&t));
+ (void)printf(" %s", buf);
+ } else
+ (void)printf(" %.16s", ctime(&t));
}
printf("\n");
}
@@ -250,6 +269,7 @@
usage(void)
{
(void)fprintf(stderr,
-"usage: lastcomm [-EScesu] [-f file] [command ...] [user ...] [terminal ...]\n");
+ "usage: lastcomm [-EScesu] [-f file] [+format] [command ...] "
+ "[user ...] [terminal ...]\n");
exit(1);
}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/less/defines.h
--- a/head/usr.bin/less/defines.h Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/less/defines.h Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-/* $FreeBSD: head/usr.bin/less/defines.h 221718 2011-05-10 01:05:41Z delphij $ */
+/* $FreeBSD: head/usr.bin/less/defines.h 237613 2012-06-26 23:17:33Z delphij $ */
/* defines.h. Generated from defines.h.in by configure. */
/* defines.h.in. Generated from configure.ac by autoheader. */
@@ -227,18 +227,12 @@
/* Define to 1 if you have the `fsync' function. */
#define HAVE_FSYNC 1
+/* GNU regex library */
+/* #undef HAVE_GNU_REGEX */
+
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
-/* Define to 1 if you have the `gen' library (-lgen). */
-/* #undef HAVE_LIBGEN */
-
-/* Define to 1 if you have the `intl' library (-lintl). */
-/* #undef HAVE_LIBINTL */
-
-/* Define to 1 if you have the `PW' library (-lPW). */
-/* #undef HAVE_LIBPW */
-
/* Define to 1 if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/lex/lex.1
--- a/head/usr.bin/lex/lex.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/lex/lex.1 Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/lex/lex.1 235853 2012-05-23 18:41:45Z joel $
.\"
.TH FLEX 1 "April 1995" "Version 2.5"
.SH NAME
@@ -2247,8 +2247,7 @@
.TP
.B \-F
specifies that the
-.ul
-fast
+.I fast
scanner table representation should be used (and stdio
bypassed). This representation is
about as fast as the full table representation
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/limits/limits.1
--- a/head/usr.bin/limits/limits.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/limits/limits.1 Wed Jul 25 16:31:11 2012 +0300
@@ -17,9 +17,9 @@
.\" 5. Modifications may be freely made to this file providing the above
.\" conditions are met.
.\"
-.\" $FreeBSD: head/usr.bin/limits/limits.1 230549 2012-01-25 20:14:41Z trociny $
+.\" $FreeBSD: head/usr.bin/limits/limits.1 235211 2012-05-10 02:07:00Z gjb $
.\"
-.Dd January 23, 2011
+.Dd January 23, 2012
.Dt LIMITS 1
.Os
.Sh NAME
@@ -179,7 +179,7 @@
or
.Fl H
options.
-.Fl e
+.It Fl e
Select
.Dq "eval mode"
formatting for output.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/login/login.1
--- a/head/usr.bin/login/login.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/login/login.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)login.1 8.2 (Berkeley) 5/5/94
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/login/login.1 236892 2012-06-11 16:18:39Z des $
.\"
.Dd September 13, 2006
.Dt LOGIN 1
@@ -137,8 +137,6 @@
system mailboxes
.It Pa \&.hushlogin
makes login quieter
-.It Pa /etc/auth.conf
-configure authentication services
.It Pa /etc/pam.d/login
.Xr pam 8
configuration file
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/m4/parser.y
--- a/head/usr.bin/m4/parser.y Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/m4/parser.y Wed Jul 25 16:31:11 2012 +0300
@@ -15,15 +15,14 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $FreeBSD: head/usr.bin/m4/parser.y 228697 2011-12-18 22:04:55Z bapt $
+ * $FreeBSD: head/usr.bin/m4/parser.y 235789 2012-05-22 16:33:10Z bapt $
*/
+#include <math.h>
#include <stdint.h>
-#include <math.h>
#define YYSTYPE int32_t
extern int32_t end_result;
extern int yylex(void);
extern int yyerror(const char *);
-extern int yyparse(void);
%}
%token NUMBER
%token ERROR
@@ -35,9 +34,9 @@
%left EQ NE
%left '<' LE '>' GE
%left LSHIFT RSHIFT
-%right EXPONENT
%left '+' '-'
%left '*' '/' '%'
+%right EXPONENT
%right UMINUS UPLUS '!' '~'
%%
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/mail/popen.c
--- a/head/usr.bin/mail/popen.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/mail/popen.c Wed Jul 25 16:31:11 2012 +0300
@@ -33,7 +33,7 @@
#endif
#endif /* not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/usr.bin/mail/popen.c 236286 2012-05-30 03:55:44Z eadler $");
#include "rcv.h"
#include <sys/wait.h>
@@ -336,12 +336,14 @@
wait_child(int pid)
{
sigset_t nset, oset;
- struct child *cp = findchild(pid);
+ struct child *cp;
(void)sigemptyset(&nset);
(void)sigaddset(&nset, SIGCHLD);
(void)sigprocmask(SIG_BLOCK, &nset, &oset);
+ cp = findchild(pid);
+
while (!cp->done)
(void)sigsuspend(&oset);
wait_status = cp->status;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/make/Makefile
--- a/head/usr.bin/make/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/make/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,6 +1,8 @@
# @(#)Makefile 5.2 (Berkeley) 12/28/90
# $Id: Makefile,v 1.6 1994/06/30 05:33:39 cgd Exp $
-# $FreeBSD: head/usr.bin/make/Makefile 228525 2011-12-15 06:25:19Z fjoe $
+# $FreeBSD: head/usr.bin/make/Makefile 237282 2012-06-20 00:37:00Z obrien $
+
+.include <bsd.own.mk>
PROG= make
CFLAGS+=-I${.CURDIR}
@@ -8,10 +10,12 @@
lst.c main.c make.c parse.c proc.c shell.c str.c suff.c targ.c \
util.c var.c
+.if !defined(MK_SHARED_TOOLCHAIN) || ${MK_SHARED_TOOLCHAIN} == "no"
NO_SHARED?= YES
+.endif
# Version has the RYYYYMMDDX format, where R is from RELENG_<R>
-CFLAGS+=-DMAKE_VERSION=\"5201111300\"
+CFLAGS+=-DMAKE_VERSION=\"10201205300\"
# There is no obvious performance improvement currently.
# CFLAGS+=-DUSE_KQUEUE
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/make/make.1
--- a/head/usr.bin/make/make.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/make/make.1 Wed Jul 25 16:31:11 2012 +0300
@@ -30,9 +30,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)make.1 8.8 (Berkeley) 6/13/95
-.\" $FreeBSD: head/usr.bin/make/make.1 227121 2011-11-05 21:32:17Z jilles $
+.\" $FreeBSD: head/usr.bin/make/make.1 236365 2012-05-31 20:13:44Z obrien $
.\"
-.Dd November 5, 2011
+.Dd May 30, 2012
.Dt MAKE 1
.Os
.Sh NAME
@@ -320,6 +320,11 @@
Multiple instances of this option may be specified;
the variables will be printed one per line,
with a blank line for each null or undefined variable.
+If
+.Ar variable
+contains a
+.Sq Ic $
+then the value will be expanded before printing.
.It Fl v
Be extra verbose.
Print any extra information.
@@ -902,6 +907,7 @@
Replaces each word in the variable with everything but the last component.
.It Cm :L
Converts variable to lower-case letters.
+(deprecated)
.It Cm :M Ns Ar pattern
Select only those words that match the rest of the modifier.
The standard shell wildcard characters
@@ -993,8 +999,13 @@
.Ar new_string .
.It Cm :T
Replaces each word in the variable with its last component.
+.It Cm :tl
+Converts variable to lower-case letters.
+.It Cm :tu
+Converts variable to upper-case letters.
.It Cm :U
Converts variable to upper-case letters.
+(deprecated)
.It Cm :u
Remove adjacent duplicate words (like
.Xr uniq 1 ) .
@@ -1661,7 +1672,7 @@
.Ic ::
targets that have no prerequisites
.It
-.Ic !
+.Ic \&!
targets
.It
targets that have
@@ -1742,6 +1753,19 @@
.Va .MAKE ;
support for this may be removed in the future.
.Pp
+The use of the
+.Cm :L
+and
+.Cm :U
+modifiers are deprecated
+in
+.Fx 10.0
+and the more portable (among Pmake decedents)
+.Cm :tl
+and
+.Cm :tu
+should be used instead.
+.Pp
Most of the more esoteric features of
.Nm
should probably be avoided for greater compatibility.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/make/var.c
--- a/head/usr.bin/make/var.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/make/var.c Wed Jul 25 16:31:11 2012 +0300
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/make/var.c 228992 2011-12-30 11:02:40Z uqs $");
+__FBSDID("$FreeBSD: head/usr.bin/make/var.c 236346 2012-05-31 00:36:56Z obrien $");
/**
* var.c --
@@ -1746,6 +1746,19 @@
case 'C':
newStr = modifier_C(vp, value, v);
break;
+ case 't':
+ /* :tl :tu for OSF ODE & NetBSD make compatibility */
+ switch (vp->ptr[1]) {
+ case 'l':
+ vp->ptr++;
+ goto mod_lower;
+ break;
+ case 'u':
+ vp->ptr++;
+ goto mod_upper;
+ break;
+ }
+ /* FALLTHROUGH */
default:
if (vp->ptr[1] != endc && vp->ptr[1] != ':') {
#ifdef SUNSHCMD
@@ -1774,6 +1787,7 @@
switch (vp->ptr[0]) {
case 'L':
+ mod_lower:
{
const char *cp;
Buffer *buf;
@@ -1799,6 +1813,7 @@
vp->ptr++;
break;
case 'U':
+ mod_upper:
{
const char *cp;
Buffer *buf;
@@ -2578,7 +2593,7 @@
Var_Print(Lst *vlist, Boolean expandVars)
{
LstNode *n;
- const char *name;
+ char *name;
LST_FOREACH(n, vlist) {
name = Lst_Datum(n);
@@ -2586,13 +2601,17 @@
char *value;
char *v;
- v = emalloc(strlen(name) + 1 + 3);
- sprintf(v, "${%s}", name);
-
+ if (*name == '$') {
+ v = name;
+ } else {
+ v = emalloc(strlen(name) + 1 + 3);
+ sprintf(v, "${%s}", name);
+ }
value = Buf_Peel(Var_Subst(v, VAR_GLOBAL, FALSE));
printf("%s\n", value);
- free(v);
+ if (v != name)
+ free(v);
free(value);
} else {
const char *value = Var_Value(name, VAR_GLOBAL);
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/makewhatis/makewhatis.c
--- a/head/usr.bin/makewhatis/makewhatis.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/makewhatis/makewhatis.c Wed Jul 25 16:31:11 2012 +0300
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/usr.bin/makewhatis/makewhatis.c 237348 2012-06-20 23:53:36Z delphij $");
#include <sys/types.h>
#include <sys/stat.h>
@@ -693,7 +693,7 @@
static void
process_page(struct page_info *page, char *section_dir)
{
- gzFile *in;
+ gzFile in;
char buffer[4096];
char *line;
StringList *names;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/man/man.conf.5
--- a/head/usr.bin/man/man.conf.5 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/man/man.conf.5 Wed Jul 25 16:31:11 2012 +0300
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: head/usr.bin/man/man.conf.5 233520 2012-03-26 19:23:57Z joel $
+.\" $FreeBSD: head/usr.bin/man/man.conf.5 236508 2012-06-03 11:09:51Z joel $
.\"
.Dd June 3, 2011
.Dt MAN.CONF 5
@@ -57,7 +57,7 @@
is intended to be used by the local administrator to set additional policy.
.Pp
Currently supported configuration variables include:
-.Bl -tag -offset indent
+.Bl -tag -width 12n -offset indent
.It MANCONFIG
Overrides the default location to import additional manual configuration files.
Defaults to
@@ -70,7 +70,8 @@
.Pp
For pages in a given language, overriding the default toolset for
display is supported via the following definitions:
-.Bl -tag -offset indent -compact
+.Pp
+.Bl -tag -width 12n -offset indent -compact
.It EQN Ns _ Ns Va LANG
.It NROFF Ns _ Ns Va LANG
.It PIC Ns _ Ns Va LANG
@@ -87,7 +88,7 @@
The parser used for this utility is very basic and only supports comment
characters (#) at the beginning of a line.
.Sh FILES
-.Bl -tag -compact
+.Bl -tag -width "Pa /usr/local/etc/man.d/*.conf" -compact
.It Pa /etc/man.conf
System configuration file.
.It Pa /usr/local/etc/man.d/*.conf
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/minigzip/Makefile
--- a/head/usr.bin/minigzip/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/minigzip/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,6 +1,6 @@
-# $FreeBSD$
+# $FreeBSD: head/usr.bin/minigzip/Makefile 237410 2012-06-21 21:47:08Z delphij $
-SRCDIR= ${.CURDIR}/../../lib/libz
+SRCDIR= ${.CURDIR}/../../lib/libz/test
.PATH: ${SRCDIR}
PROG= minigzip
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/minigzip/minigzip.1
--- a/head/usr.bin/minigzip/minigzip.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/minigzip/minigzip.1 Wed Jul 25 16:31:11 2012 +0300
@@ -22,9 +22,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/minigzip/minigzip.1 235802 2012-05-22 19:40:54Z delphij $
.\"
-.Dd October 3, 2002
+.Dd May 22, 2012
.Dt MINIGZIP 1
.Os
.Sh NAME
@@ -48,7 +48,7 @@
The default operation is compression, decompression can be
selected by supplying the
.Fl d
-flag on the commandline.
+flag on the command line.
.Pp
If any
.Ar file
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/mkcsmapper/ldef.h
--- a/head/usr.bin/mkcsmapper/ldef.h Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/mkcsmapper/ldef.h Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: head/usr.bin/mkcsmapper/ldef.h 235789 2012-05-22 16:33:10Z bapt $ */
/* $NetBSD: ldef.h,v 1.2 2006/09/09 14:35:17 tnozaki Exp $ */
/*-
@@ -39,4 +39,3 @@
extern int line_number;
extern int yyerror(const char *);
extern int yylex(void);
-extern int yyparse(void);
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/mkcsmapper/lex.l
--- a/head/usr.bin/mkcsmapper/lex.l Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/mkcsmapper/lex.l Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: head/usr.bin/mkcsmapper/lex.l 238197 2012-07-07 17:05:55Z eadler $ */
/* $NetBSD: lex.l,v 1.4 2006/02/09 22:03:15 dogcow Exp $ */
%{
@@ -57,7 +57,7 @@
<COMMENT>[\n] { line_number++; }
<COMMENT>. { }
<COMMENT><<EOF>> {
- yyerror("unexpected file end (unterminate comment)\n");
+ yyerror("unexpected file end (unterminated comment)\n");
exit(1);
}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/mkesdb/ldef.h
--- a/head/usr.bin/mkesdb/ldef.h Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/mkesdb/ldef.h Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: head/usr.bin/mkesdb/ldef.h 238185 2012-07-07 04:14:28Z kientzle $ */
/* $NetBSD: ldef.h,v 1.2 2005/06/27 01:23:59 fvdl Exp $ */
/*-
@@ -30,7 +30,6 @@
extern int line_number;
extern int yyerror(const char *);
extern int yylex(void);
-extern int yyparse(void);
struct named_csid {
STAILQ_ENTRY(named_csid) ci_entry;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/mkesdb/lex.l
--- a/head/usr.bin/mkesdb/lex.l Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/mkesdb/lex.l Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-/* $FreeBSD$ */
+/* $FreeBSD: head/usr.bin/mkesdb/lex.l 238197 2012-07-07 17:05:55Z eadler $ */
/* $NetBSD: lex.l,v 1.3 2006/02/09 22:03:15 dogcow Exp $ */
%{
@@ -59,7 +59,7 @@
<COMMENT>[\n] { line_number++; }
<COMMENT>. { }
<COMMENT><<EOF>> {
- yyerror("unexpected file end (unterminate comment)\n");
+ yyerror("unexpected file end (unterminated comment)\n");
exit(1);
}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/mklocale/extern.h
--- a/head/usr.bin/mklocale/extern.h Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/mklocale/extern.h Wed Jul 25 16:31:11 2012 +0300
@@ -29,8 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD$
+ * $FreeBSD: head/usr.bin/mklocale/extern.h 235789 2012-05-22 16:33:10Z bapt $
*/
int yylex(void);
-int yyparse(void);
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/mklocale/mklocale.1
--- a/head/usr.bin/mklocale/mklocale.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/mklocale/mklocale.1 Wed Jul 25 16:31:11 2012 +0300
@@ -29,7 +29,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)mklocale.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/mklocale/mklocale.1 235400 2012-05-13 14:16:04Z joel $
.\"
.Dd October 17, 2004
.Dt MKLOCALE 1
@@ -123,7 +123,7 @@
.It Dv ">\|\^)\|]"
Used to end a mapping.
All are equivalent.
-.It Dv :
+.It Dv ":"
Used as a delimiter in mappings.
.El
.El
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/ncplogin/ncplogout.1
--- a/head/usr.bin/ncplogin/ncplogout.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/ncplogin/ncplogout.1 Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/ncplogin/ncplogout.1 235211 2012-05-10 02:07:00Z gjb $
.Dd September 15, 1999
.Dt NCPLOGOUT 1
.Os
@@ -30,7 +30,7 @@
.Bl -tag -width indent
.It Fl S Ar server
Specify the name of the
-.Tn Netware
+.Tn NetWare
server to which the connection should be terminated.
Can be omitted if there is only
one connection active.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/netstat/Makefile
--- a/head/usr.bin/netstat/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/netstat/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,5 +1,5 @@
# @(#)Makefile 8.1 (Berkeley) 6/12/93
-# $FreeBSD: head/usr.bin/netstat/Makefile 232748 2012-03-09 20:50:15Z dim $
+# $FreeBSD: head/usr.bin/netstat/Makefile 238514 2012-07-16 06:43:04Z tuexen $
.include <bsd.own.mk>
@@ -13,6 +13,10 @@
CFLAGS+=-DIPSEC
CFLAGS+=-DSCTP
+.if ${MK_INET_SUPPORT} != "no"
+CFLAGS+=-DINET
+.endif
+
.if ${MK_INET6_SUPPORT} != "no"
SRCS+= inet6.c
CFLAGS+=-DINET6
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/netstat/inet.c
--- a/head/usr.bin/netstat/inet.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/netstat/inet.c Wed Jul 25 16:31:11 2012 +0300
@@ -34,7 +34,7 @@
#endif
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/netstat/inet.c 234245 2012-04-13 22:35:53Z delphij $");
+__FBSDID("$FreeBSD: head/usr.bin/netstat/inet.c 237263 2012-06-19 07:34:13Z np $");
#include <sys/param.h>
#include <sys/queue.h>
@@ -461,7 +461,10 @@
#endif
vchar = ((inp->inp_vflag & INP_IPV4) != 0) ?
"4 " : " ";
- printf("%-3.3s%-2.2s ", name, vchar);
+ if (istcp && (tp->t_flags & TF_TOE) != 0)
+ printf("%-3.3s%-2.2s ", "toe", vchar);
+ else
+ printf("%-3.3s%-2.2s ", name, vchar);
if (Lflag) {
char buf1[15];
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/netstat/sctp.c
--- a/head/usr.bin/netstat/sctp.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/netstat/sctp.c Wed Jul 25 16:31:11 2012 +0300
@@ -36,7 +36,7 @@
#endif
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/netstat/sctp.c 230555 2012-01-25 21:49:48Z tuexen $");
+__FBSDID("$FreeBSD: head/usr.bin/netstat/sctp.c 238514 2012-07-16 06:43:04Z tuexen $");
#include <sys/param.h>
#include <sys/queue.h>
@@ -107,6 +107,7 @@
* If numeric_addr has been supplied, give
* numeric value, otherwise try for symbolic name.
*/
+#ifdef INET
static char *
inetname(struct in_addr *inp)
{
@@ -146,6 +147,7 @@
}
return (line);
}
+#endif
#ifdef INET6
static char ntop_buf[INET6_ADDRSTRLEN];
@@ -197,9 +199,11 @@
int width;
switch (address->sa.sa_family) {
+#ifdef INET
case AF_INET:
sprintf(line, "%.*s.", Wflag ? 39 : 16, inetname(&address->sin.sin_addr));
break;
+#endif
#ifdef INET6
case AF_INET6:
sprintf(line, "%.*s.", Wflag ? 39 : 16, inet6name(&address->sin6.sin6_addr));
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/nfsstat/nfsstat.c
--- a/head/usr.bin/nfsstat/nfsstat.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/nfsstat/nfsstat.c Wed Jul 25 16:31:11 2012 +0300
@@ -41,7 +41,7 @@
static char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95";
#endif
static const char rcsid[] =
- "$FreeBSD: head/usr.bin/nfsstat/nfsstat.c 225113 2011-08-23 13:44:56Z rmacklem $";
+ "$FreeBSD: head/usr.bin/nfsstat/nfsstat.c 238701 2012-07-22 18:59:31Z hrs $";
#endif /* not lint */
#include <sys/param.h>
@@ -995,7 +995,6 @@
);
}
printf("\n");
- lastst = nfsstats;
}
if (serverOnly) {
printf("%s %6d %6d %6d %6d %6d %6d %6d %6d",
@@ -1019,8 +1018,8 @@
(nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS] -
lastst.srvrpccnt[NFSV4OP_READDIRPLUS]));
printf("\n");
- lastst = nfsstats;
}
+ lastst = nfsstats;
fflush(stdout);
sleep(interval);
}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/pamtest/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/pamtest/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,11 @@
+# $FreeBSD: head/usr.bin/pamtest/Makefile 236109 2012-05-26 17:10:16Z des $
+
+OPENPAM= ${.CURDIR}/../../contrib/openpam
+.PATH: ${OPENPAM}/include ${OPENPAM}/bin/pamtest
+
+PROG= pamtest
+SRCS= pamtest.c
+DPADD= ${LIBPAM}
+LDADD= ${MINUSLPAM}
+
+.include <bsd.prog.mk>
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/passwd/passwd.1
--- a/head/usr.bin/passwd/passwd.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/passwd/passwd.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)passwd.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/passwd/passwd.1 236892 2012-06-11 16:18:39Z des $
.\"
.Dd June 6, 1993
.Dt PASSWD 1
@@ -221,8 +221,6 @@
temporary copy of the password file
.It Pa /etc/login.conf
login class capabilities database
-.It Pa /etc/auth.conf
-configure authentication services
.El
.Sh SEE ALSO
.Xr chpass 1 ,
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/procstat/Makefile
--- a/head/usr.bin/procstat/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/procstat/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,4 +1,4 @@
-# $FreeBSD: head/usr.bin/procstat/Makefile 227956 2011-11-24 20:54:06Z trociny $
+# $FreeBSD: head/usr.bin/procstat/Makefile 235642 2012-05-19 05:07:03Z marcel $
PROG= procstat
MAN= procstat.1
@@ -16,6 +16,6 @@
procstat_vm.c
LDADD+= -lutil -lprocstat -lkvm
-DPADD+= ${LIBUTIL}
+DPADD+= ${LIBUTIL} ${LIBPROCSTAT} ${LIBKVM}
.include <bsd.prog.mk>
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/procstat/procstat.1
--- a/head/usr.bin/procstat/procstat.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/procstat/procstat.1 Wed Jul 25 16:31:11 2012 +0300
@@ -23,9 +23,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: head/usr.bin/procstat/procstat.1 233648 2012-03-29 05:02:12Z eadler $
+.\" $FreeBSD: head/usr.bin/procstat/procstat.1 238527 2012-07-16 09:38:19Z pgj $
.\"
-.Dd March 23, 2012
+.Dd July 11, 2012
.Dt PROCSTAT 1
.Os
.Sh NAME
@@ -433,6 +433,10 @@
needs copy
.It S
one or more superpage mappings are used
+.It D
+grows down (top-down stack)
+.It U
+grows up (bottom-up stack)
.El
.Sh EXIT STATUS
.Ex -std
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/procstat/procstat_rlimit.c
--- a/head/usr.bin/procstat/procstat_rlimit.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/procstat/procstat_rlimit.c Wed Jul 25 16:31:11 2012 +0300
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/usr.bin/procstat/procstat_rlimit.c 230548 2012-01-25 20:13:37Z trociny $
+ * $FreeBSD: head/usr.bin/procstat/procstat_rlimit.c 238086 2012-07-03 19:11:38Z trociny $
*/
#include <sys/param.h>
@@ -66,8 +66,8 @@
#error "Resource limits have grown. Add new entries to rlimit_param[]."
#endif
-static
-const char *humanize_rlimit(int indx, rlim_t limit)
+static const char *
+humanize_rlimit(int indx, rlim_t limit)
{
static char buf[14];
int scale;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/procstat/procstat_vm.c
--- a/head/usr.bin/procstat/procstat_vm.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/procstat/procstat_vm.c Wed Jul 25 16:31:11 2012 +0300
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/usr.bin/procstat/procstat_vm.c 227317 2011-11-07 21:16:19Z trociny $
+ * $FreeBSD: head/usr.bin/procstat/procstat_vm.c 238753 2012-07-24 19:40:12Z trociny $
*/
#include <sys/param.h>
@@ -50,7 +50,7 @@
ptrwidth = 2*sizeof(void *) + 2;
if (!hflag)
- printf("%5s %*s %*s %3s %4s %4s %3s %3s %3s %-2s %-s\n",
+ printf("%5s %*s %*s %3s %4s %4s %3s %3s %4s %-2s %-s\n",
"PID", ptrwidth, "START", ptrwidth, "END", "PRT", "RES",
"PRES", "REF", "SHD", "FL", "TP", "PATH");
@@ -72,7 +72,9 @@
printf("%-1s", kve->kve_flags & KVME_FLAG_COW ? "C" : "-");
printf("%-1s", kve->kve_flags & KVME_FLAG_NEEDS_COPY ? "N" :
"-");
- printf("%-1s ", kve->kve_flags & KVME_FLAG_SUPER ? "S" : "-");
+ printf("%-1s", kve->kve_flags & KVME_FLAG_SUPER ? "S" : "-");
+ printf("%-1s ", kve->kve_flags & KVME_FLAG_GROWS_UP ? "U" :
+ kve->kve_flags & KVME_FLAG_GROWS_DOWN ? "D" : "-");
switch (kve->kve_type) {
case KVME_TYPE_NONE:
str = "--";
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/rctl/rctl.8
--- a/head/usr.bin/rctl/rctl.8 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/rctl/rctl.8 Wed Jul 25 16:31:11 2012 +0300
@@ -23,7 +23,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $FreeBSD: head/usr.bin/rctl/rctl.8 233667 2012-03-29 16:07:22Z joel $
+.\" $FreeBSD: head/usr.bin/rctl/rctl.8 234568 2012-04-22 07:55:56Z delphij $
.\"
.Dd March 1, 2012
.Dt RCTL 8
@@ -186,7 +186,7 @@
The
.Nm
command appeared in
-.Fx 9.0.
+.Fx 9.0 .
.Sh AUTHORS
.An -nosplit
The
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/rlogin/rlogin.1
--- a/head/usr.bin/rlogin/rlogin.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/rlogin/rlogin.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)rlogin.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/rlogin/rlogin.1 236892 2012-06-11 16:18:39Z des $
.\"
.Dd September 26, 2003
.Dt RLOGIN 1
@@ -128,7 +128,6 @@
.Bl -tag -width /etc/hosts -compact
.It Pa /etc/hosts
.It Pa /etc/hosts.equiv
-.It Pa /etc/auth.conf
.It Ev $HOME Ns Pa /.rhosts
.El
.Sh SEE ALSO
@@ -138,7 +137,6 @@
.Xr setsockopt 2 ,
.Xr ruserok 3 ,
.Xr tty 4 ,
-.Xr auth.conf 5 ,
.Xr hosts 5 ,
.Xr hosts.equiv 5 ,
.Xr rlogind 8 ,
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/rsh/rsh.1
--- a/head/usr.bin/rsh/rsh.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/rsh/rsh.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)rsh.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/rsh/rsh.1 236892 2012-06-11 16:18:39Z des $
.\"
.Dd October 16, 2002
.Dt RSH 1
@@ -125,14 +125,12 @@
.Sh FILES
.Bl -tag -width /etc/hosts -compact
.It Pa /etc/hosts
-.It Pa /etc/auth.conf
.El
.Sh SEE ALSO
.Xr rlogin 1 ,
.Xr setsockopt 2 ,
.Xr rcmd 3 ,
.Xr ruserok 3 ,
-.Xr auth.conf 5 ,
.Xr hosts 5 ,
.Xr hosts.equiv 5 ,
.Xr rlogind 8 ,
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sockstat/sockstat.1
--- a/head/usr.bin/sockstat/sockstat.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/sockstat/sockstat.1 Wed Jul 25 16:31:11 2012 +0300
@@ -25,9 +25,9 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $FreeBSD: head/usr.bin/sockstat/sockstat.1 230512 2012-01-24 21:33:34Z jilles $
+.\" $FreeBSD: head/usr.bin/sockstat/sockstat.1 235870 2012-05-24 01:31:10Z thompsa $
.\"
-.Dd January 24, 2012
+.Dd May 16, 2012
.Dt SOCKSTAT 1
.Os
.Sh NAME
@@ -36,6 +36,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl 46cLlu
+.Op Fl j Ar jid
.Op Fl p Ar ports
.Op Fl P Ar protocols
.Sh DESCRIPTION
@@ -57,6 +58,8 @@
(IPv6) sockets.
.It Fl c
Show connected sockets.
+.It Fl j Ar jid
+Show only sockets belonging to the specified jail ID.
.It Fl L
Only show Internet sockets if the local or foreign addresses are not
in the loopback network prefix
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sockstat/sockstat.c
--- a/head/usr.bin/sockstat/sockstat.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/sockstat/sockstat.c Wed Jul 25 16:31:11 2012 +0300
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/sockstat/sockstat.c 230874 2012-02-01 18:03:21Z trociny $");
+__FBSDID("$FreeBSD: head/usr.bin/sockstat/sockstat.c 237674 2012-06-27 23:26:32Z thompsa $");
#include <sys/param.h>
#include <sys/socket.h>
@@ -62,6 +62,7 @@
static int opt_4; /* Show IPv4 sockets */
static int opt_6; /* Show IPv6 sockets */
static int opt_c; /* Show connected sockets */
+static int opt_j; /* Show specified jail */
static int opt_L; /* Don't show IPv4 or IPv6 loopback sockets */
static int opt_l; /* Show listening sockets */
static int opt_u; /* Show Unix domain sockets */
@@ -324,6 +325,7 @@
}
inp = &xtp->xt_inp;
so = &xtp->xt_socket;
+ protoname = xtp->xt_tp.t_flags & TF_TOE ? "toe" : "tcp";
break;
case IPPROTO_UDP:
case IPPROTO_DIVERT:
@@ -549,6 +551,27 @@
}
static int
+getprocjid(pid_t pid)
+{
+ static struct kinfo_proc proc;
+ size_t len;
+ int mib[4];
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+ mib[3] = (int)pid;
+ len = sizeof proc;
+ if (sysctl(mib, 4, &proc, &len, NULL, 0) == -1) {
+ /* Do not warn if the process exits before we get its jid. */
+ if (errno != ESRCH)
+ warn("sysctl()");
+ return (-1);
+ }
+ return (proc.ki_jid);
+}
+
+static int
check_ports(struct sock *s)
{
int port;
@@ -643,6 +666,8 @@
for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) {
if (xf->xf_data == NULL)
continue;
+ if (opt_j >= 0 && opt_j != getprocjid(xf->xf_pid))
+ continue;
hash = (int)((uintptr_t)xf->xf_data % HASHSIZE);
for (s = sockhash[hash]; s != NULL; s = s->next)
if ((void *)s->socket == xf->xf_data)
@@ -668,6 +693,8 @@
pos += xprintf("%d ", xf->xf_fd);
displaysock(s, pos);
}
+ if (opt_j >= 0)
+ return;
for (hash = 0; hash < HASHSIZE; hash++) {
for (s = sockhash[hash]; s != NULL; s = s->next) {
if (s->shown)
@@ -706,7 +733,7 @@
usage(void)
{
fprintf(stderr,
- "Usage: sockstat [-46cLlu] [-p ports] [-P protocols]\n");
+ "Usage: sockstat [-46cLlu] [-j jid] [-p ports] [-P protocols]\n");
exit(1);
}
@@ -716,7 +743,8 @@
int protos_defined = -1;
int o, i;
- while ((o = getopt(argc, argv, "46cLlp:P:uv")) != -1)
+ opt_j = -1;
+ while ((o = getopt(argc, argv, "46cj:Llp:P:uv")) != -1)
switch (o) {
case '4':
opt_4 = 1;
@@ -727,6 +755,9 @@
case 'c':
opt_c = 1;
break;
+ case 'j':
+ opt_j = atoi(optarg);
+ break;
case 'L':
opt_L = 1;
break;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,45 @@
+# $FreeBSD: head/usr.bin/sort/Makefile 237629 2012-06-27 05:59:01Z gabor $
+
+.include <bsd.own.mk>
+
+.if ${MK_GNU_SORT} != "yes"
+PROG= sort
+.else
+PROG= bsdsort
+CLEANFILES+= bsdsort.1
+
+bsdsort.1: sort.1
+ cp ${.ALLSRC} ${.TARGET}
+.endif
+
+SRCS= bwstring.c coll.c file.c mem.c radixsort.c sort.c vsort.c
+
+WARNS= 6
+
+sort.1: sort.1.in
+ /usr/bin/sed ${MAN_SUB} ${.ALLSRC} >${.TARGET}
+
+CLEANFILES+= sort.1
+
+.if defined(WITH_THREADS)
+CFLAGS+= -DSORT_THREADS
+LDFLAGS+= -lpthread -lmd
+MAN_SUB+= -e 's|%%THREADS%%||g'
+.else
+LDFLAGS+= -lmd
+MAN_SUB+= -e 's|%%THREADS%%|\.\\"|g'
+.endif
+
+.if !defined(WITHOUT_NLS)
+NLS+= hu_HU.ISO8859-2
+NLSSRCFILES= ${NLS:S@[email protected]@}
+MAN_SUB+= -e 's|%%NLS%%||g'
+.for lang in ${NLS}
+NLSSRCDIR_${lang}= ${.CURDIR}/nls
+.endfor
+.else
+CFLAGS+= -DWITHOUT_NLS
+MAN_SUB+= -e 's|%%NLS%%|\.\\"|g'
+.endif
+
+.include <bsd.prog.mk>
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/bwstring.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/bwstring.c Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,1154 @@
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/usr.bin/sort/bwstring.c 235987 2012-05-25 09:30:16Z gabor $");
+
+#include <ctype.h>
+#include <errno.h>
+#include <err.h>
+#include <langinfo.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "bwstring.h"
+#include "sort.h"
+
+bool byte_sort;
+
+static wchar_t **wmonths;
+static unsigned char **cmonths;
+
+/* initialise months */
+
+void
+initialise_months(void)
+{
+ const nl_item item[12] = { ABMON_1, ABMON_2, ABMON_3, ABMON_4,
+ ABMON_5, ABMON_6, ABMON_7, ABMON_8, ABMON_9, ABMON_10,
+ ABMON_11, ABMON_12 };
+ unsigned char *tmp;
+ size_t len;
+
+ if (MB_CUR_MAX == 1) {
+ if (cmonths == NULL) {
+ unsigned char *m;
+
+ cmonths = sort_malloc(sizeof(unsigned char*) * 12);
+ for (int i = 0; i < 12; i++) {
+ cmonths[i] = NULL;
+ tmp = (unsigned char *) nl_langinfo(item[i]);
+ if (tmp == NULL)
+ continue;
+ if (debug_sort)
+ printf("month[%d]=%s\n", i, tmp);
+ len = strlen(tmp);
+ if (len < 1)
+ continue;
+ while (isblank(*tmp))
+ ++tmp;
+ m = sort_malloc(len + 1);
+ memcpy(m, tmp, len + 1);
+ m[len] = '\0';
+ for (unsigned int j = 0; j < len; j++)
+ m[j] = toupper(m[j]);
+ cmonths[i] = m;
+ }
+ }
+
+ } else {
+ if (wmonths == NULL) {
+ wchar_t *m;
+
+ wmonths = sort_malloc(sizeof(wchar_t *) * 12);
+ for (int i = 0; i < 12; i++) {
+ wmonths[i] = NULL;
+ tmp = (unsigned char *) nl_langinfo(item[i]);
+ if (tmp == NULL)
+ continue;
+ if (debug_sort)
+ printf("month[%d]=%s\n", i, tmp);
+ len = strlen(tmp);
+ if (len < 1)
+ continue;
+ while (isblank(*tmp))
+ ++tmp;
+ m = sort_malloc(SIZEOF_WCHAR_STRING(len + 1));
+ if (mbstowcs(m, tmp, len) == ((size_t) -1))
+ continue;
+ m[len] = L'\0';
+ for (unsigned int j = 0; j < len; j++)
+ m[j] = towupper(m[j]);
+ wmonths[i] = m;
+ }
+ }
+ }
+}
+
+/*
+ * Compare two wide-character strings
+ */
+static int
+wide_str_coll(const wchar_t *s1, const wchar_t *s2)
+{
+ int ret = 0;
+
+ errno = 0;
+ ret = wcscoll(s1, s2);
+ if (errno == EILSEQ) {
+ errno = 0;
+ ret = wcscmp(s1, s2);
+ if (errno != 0) {
+ for (size_t i = 0; ; ++i) {
+ wchar_t c1 = s1[i];
+ wchar_t c2 = s2[i];
+ if (c1 == L'\0')
+ return ((c2 == L'\0') ? 0 : -1);
+ if (c2 == L'\0')
+ return (+1);
+ if (c1 == c2)
+ continue;
+ return ((int)(c1 - c2));
+ }
+ }
+ }
+ return (ret);
+}
+
+/* counterparts of wcs functions */
+
+void
+bwsprintf(FILE *f, struct bwstring *bws, const char *prefix, const char *suffix)
+{
+
+ if (MB_CUR_MAX == 1)
+ fprintf(f, "%s%s%s", prefix, bws->data.cstr, suffix);
+ else
+ fprintf(f, "%s%S%s", prefix, bws->data.wstr, suffix);
+}
+
+const void* bwsrawdata(const struct bwstring *bws)
+{
+
+ return (&(bws->data));
+}
+
+size_t bwsrawlen(const struct bwstring *bws)
+{
+
+ return ((MB_CUR_MAX == 1) ? bws->len : SIZEOF_WCHAR_STRING(bws->len));
+}
+
+size_t
+bws_memsize(const struct bwstring *bws)
+{
+
+ return ((MB_CUR_MAX == 1) ? (bws->len + 2 + sizeof(struct bwstring)) :
+ (SIZEOF_WCHAR_STRING(bws->len + 1) + sizeof(struct bwstring)));
+}
+
+void
+bws_setlen(struct bwstring *bws, size_t newlen)
+{
+
+ if (bws && newlen != bws->len && newlen <= bws->len) {
+ bws->len = newlen;
+ if (MB_CUR_MAX == 1)
+ bws->data.cstr[newlen] = '\0';
+ else
+ bws->data.wstr[newlen] = L'\0';
+ }
+}
+
+/*
+ * Allocate a new binary string of specified size
+ */
+struct bwstring *
+bwsalloc(size_t sz)
+{
+ struct bwstring *ret;
+
+ if (MB_CUR_MAX == 1)
+ ret = sort_malloc(sizeof(struct bwstring) + 1 + sz);
+ else
+ ret = sort_malloc(sizeof(struct bwstring) +
+ SIZEOF_WCHAR_STRING(sz + 1));
+ ret->len = sz;
+
+ if (MB_CUR_MAX == 1)
+ ret->data.cstr[ret->len] = '\0';
+ else
+ ret->data.wstr[ret->len] = L'\0';
+
+ return (ret);
+}
+
+/*
+ * Create a copy of binary string.
+ * New string size equals the length of the old string.
+ */
+struct bwstring *
+bwsdup(const struct bwstring *s)
+{
+
+ if (s == NULL)
+ return (NULL);
+ else {
+ struct bwstring *ret = bwsalloc(s->len);
+
+ if (MB_CUR_MAX == 1)
+ memcpy(ret->data.cstr, s->data.cstr, (s->len));
+ else
+ memcpy(ret->data.wstr, s->data.wstr,
+ SIZEOF_WCHAR_STRING(s->len));
+
+ return (ret);
+ }
+}
+
+/*
+ * Create a new binary string from a raw binary buffer.
+ */
+struct bwstring *
+bwssbdup(const wchar_t *str, size_t len)
+{
+
+ if (str == NULL)
+ return ((len == 0) ? bwsalloc(0) : NULL);
+ else {
+ struct bwstring *ret;
+
+ ret = bwsalloc(len);
+
+ if (MB_CUR_MAX == 1)
+ for (size_t i = 0; i < len; ++i)
+ ret->data.cstr[i] = (unsigned char) str[i];
+ else
+ memcpy(ret->data.wstr, str, SIZEOF_WCHAR_STRING(len));
+
+ return (ret);
+ }
+}
+
+/*
+ * Create a new binary string from a raw binary buffer.
+ */
+struct bwstring *
+bwscsbdup(const unsigned char *str, size_t len)
+{
+ struct bwstring *ret;
+
+ ret = bwsalloc(len);
+
+ if (str) {
+ if (MB_CUR_MAX == 1)
+ memcpy(ret->data.cstr, str, len);
+ else {
+ mbstate_t mbs;
+ const char *s;
+ size_t charlen, chars, cptr;
+
+ charlen = chars = 0;
+ cptr = 0;
+ s = (const char *) str;
+
+ memset(&mbs, 0, sizeof(mbs));
+
+ while (cptr < len) {
+ size_t n = MB_CUR_MAX;
+
+ if (n > len - cptr)
+ n = len - cptr;
+ charlen = mbrlen(s + cptr, n, &mbs);
+ switch (charlen) {
+ case 0:
+ /* FALLTHROUGH */
+ case (size_t) -1:
+ /* FALLTHROUGH */
+ case (size_t) -2:
+ ret->data.wstr[chars++] =
+ (unsigned char) s[cptr];
+ ++cptr;
+ break;
+ default:
+ n = mbrtowc(ret->data.wstr + (chars++),
+ s + cptr, charlen, &mbs);
+ if ((n == (size_t)-1) || (n == (size_t)-2))
+ /* NOTREACHED */
+ err(2, "mbrtowc error");
+ cptr += charlen;
+ };
+ }
+
+ ret->len = chars;
+ ret->data.wstr[ret->len] = L'\0';
+ }
+ }
+ return (ret);
+}
+
+/*
+ * De-allocate object memory
+ */
+void
+bwsfree(const struct bwstring *s)
+{
+
+ if (s)
+ sort_free(s);
+}
+
+/*
+ * Copy content of src binary string to dst.
+ * If the capacity of the dst string is not sufficient,
+ * then the data is truncated.
+ */
+size_t
+bwscpy(struct bwstring *dst, const struct bwstring *src)
+{
+ size_t nums = src->len;
+
+ if (nums > dst->len)
+ nums = dst->len;
+ dst->len = nums;
+
+ if (MB_CUR_MAX == 1) {
+ memcpy(dst->data.cstr, src->data.cstr, nums);
+ dst->data.cstr[dst->len] = '\0';
+ } else {
+ memcpy(dst->data.wstr, src->data.wstr,
+ SIZEOF_WCHAR_STRING(nums + 1));
+ dst->data.wstr[dst->len] = L'\0';
+ }
+
+ return (nums);
+}
+
+/*
+ * Copy content of src binary string to dst,
+ * with specified number of symbols to be copied.
+ * If the capacity of the dst string is not sufficient,
+ * then the data is truncated.
+ */
+struct bwstring *
+bwsncpy(struct bwstring *dst, const struct bwstring *src, size_t size)
+{
+ size_t nums = src->len;
+
+ if (nums > dst->len)
+ nums = dst->len;
+ if (nums > size)
+ nums = size;
+ dst->len = nums;
+
+ if (MB_CUR_MAX == 1) {
+ memcpy(dst->data.cstr, src->data.cstr, nums);
+ dst->data.cstr[dst->len] = '\0';
+ } else {
+ memcpy(dst->data.wstr, src->data.wstr,
+ SIZEOF_WCHAR_STRING(nums + 1));
+ dst->data.wstr[dst->len] = L'\0';
+ }
+
+ return (dst);
+}
+
+/*
+ * Copy content of src binary string to dst,
+ * with specified number of symbols to be copied.
+ * An offset value can be specified, from the start of src string.
+ * If the capacity of the dst string is not sufficient,
+ * then the data is truncated.
+ */
+struct bwstring *
+bwsnocpy(struct bwstring *dst, const struct bwstring *src, size_t offset,
+ size_t size)
+{
+
+ if (offset >= src->len) {
+ dst->data.wstr[0] = 0;
+ dst->len = 0;
+ } else {
+ size_t nums = src->len - offset;
+
+ if (nums > dst->len)
+ nums = dst->len;
+ if (nums > size)
+ nums = size;
+ dst->len = nums;
+ if (MB_CUR_MAX == 1) {
+ memcpy(dst->data.cstr, src->data.cstr + offset,
+ (nums));
+ dst->data.cstr[dst->len] = '\0';
+ } else {
+ memcpy(dst->data.wstr, src->data.wstr + offset,
+ SIZEOF_WCHAR_STRING(nums));
+ dst->data.wstr[dst->len] = L'\0';
+ }
+ }
+ return (dst);
+}
+
+/*
+ * Write binary string to the file.
+ * The output is ended either with '\n' (nl == true)
+ * or '\0' (nl == false).
+ */
+int
+bwsfwrite(struct bwstring *bws, FILE *f, bool zero_ended)
+{
+
+ if (MB_CUR_MAX == 1) {
+ size_t len = bws->len;
+
+ if (!zero_ended) {
+ bws->data.cstr[len] = '\n';
+
+ if (fwrite(bws->data.cstr, len + 1, 1, f) < 1)
+ err(2, NULL);
+
+ bws->data.cstr[len] = '\0';
+ } else if (fwrite(bws->data.cstr, len + 1, 1, f) < 1)
+ err(2, NULL);
+
+ return (len + 1);
+
+ } else {
+ wchar_t eols;
+ int printed = 0;
+
+ eols = zero_ended ? btowc('\0') : btowc('\n');
+
+ while (printed < (int) BWSLEN(bws)) {
+ const wchar_t *s = bws->data.wstr + printed;
+
+ if (*s == L'\0') {
+ int nums;
+
+ nums = fwprintf(f, L"%lc", *s);
+
+ if (nums != 1)
+ err(2, NULL);
+ ++printed;
+ } else {
+ int nums;
+
+ nums = fwprintf(f, L"%ls", s);
+
+ if (nums < 1)
+ err(2, NULL);
+ printed += nums;
+ }
+ }
+ fwprintf(f, L"%lc", eols);
+ return (printed + 1);
+ }
+}
+
+/*
+ * Allocate and read a binary string from file.
+ * The strings are nl-ended or zero-ended, depending on the sort setting.
+ */
+struct bwstring *
+bwsfgetln(FILE *f, size_t *len, bool zero_ended, struct reader_buffer *rb)
+{
+ wchar_t eols;
+
+ eols = zero_ended ? btowc('\0') : btowc('\n');
+
+ if (!zero_ended && (MB_CUR_MAX > 1)) {
+ wchar_t *ret;
+
+ ret = fgetwln(f, len);
+
+ if (ret == NULL) {
+ if (!feof(f))
+ err(2, NULL);
+ return (NULL);
+ }
+ if (*len > 0) {
+ if (ret[*len - 1] == eols)
+ --(*len);
+ }
+ return (bwssbdup(ret, *len));
+
+ } else if (!zero_ended && (MB_CUR_MAX == 1)) {
+ char *ret;
+
+ ret = fgetln(f, len);
+
+ if (ret == NULL) {
+ if (!feof(f))
+ err(2, NULL);
+ return (NULL);
+ }
+ if (*len > 0) {
+ if (ret[*len - 1] == '\n')
+ --(*len);
+ }
+ return (bwscsbdup(ret, *len));
+
+ } else {
+ wchar_t c = 0;
+
+ *len = 0;
+
+ if (feof(f))
+ return (NULL);
+
+ if (2 >= rb->fgetwln_z_buffer_size) {
+ rb->fgetwln_z_buffer_size += 256;
+ rb->fgetwln_z_buffer = sort_realloc(rb->fgetwln_z_buffer,
+ sizeof(wchar_t) * rb->fgetwln_z_buffer_size);
+ }
+ rb->fgetwln_z_buffer[*len] = 0;
+
+ if (MB_CUR_MAX == 1)
+ while (!feof(f)) {
+ c = fgetc(f);
+
+ if (c == EOF) {
+ if (*len == 0)
+ return (NULL);
+ goto line_read_done;
+ }
+ if (c == eols)
+ goto line_read_done;
+
+ if (*len + 1 >= rb->fgetwln_z_buffer_size) {
+ rb->fgetwln_z_buffer_size += 256;
+ rb->fgetwln_z_buffer = sort_realloc(rb->fgetwln_z_buffer,
+ SIZEOF_WCHAR_STRING(rb->fgetwln_z_buffer_size));
+ }
+
+ rb->fgetwln_z_buffer[*len] = c;
+ rb->fgetwln_z_buffer[++(*len)] = 0;
+ }
+ else
+ while (!feof(f)) {
+ c = fgetwc(f);
+
+ if (c == WEOF) {
+ if (*len == 0)
+ return (NULL);
+ goto line_read_done;
+ }
+ if (c == eols)
+ goto line_read_done;
+
+ if (*len + 1 >= rb->fgetwln_z_buffer_size) {
+ rb->fgetwln_z_buffer_size += 256;
+ rb->fgetwln_z_buffer = sort_realloc(rb->fgetwln_z_buffer,
+ SIZEOF_WCHAR_STRING(rb->fgetwln_z_buffer_size));
+ }
+
+ rb->fgetwln_z_buffer[*len] = c;
+ rb->fgetwln_z_buffer[++(*len)] = 0;
+ }
+
+line_read_done:
+ /* we do not count the last 0 */
+ return (bwssbdup(rb->fgetwln_z_buffer, *len));
+ }
+}
+
+int
+bwsncmp(const struct bwstring *bws1, const struct bwstring *bws2,
+ size_t offset, size_t len)
+{
+ size_t cmp_len, len1, len2;
+ int res = 0;
+
+ cmp_len = 0;
+ len1 = bws1->len;
+ len2 = bws2->len;
+
+ if (len1 <= offset) {
+ return ((len2 <= offset) ? 0 : -1);
+ } else {
+ if (len2 <= offset)
+ return (+1);
+ else {
+ len1 -= offset;
+ len2 -= offset;
+
+ cmp_len = len1;
+
+ if (len2 < cmp_len)
+ cmp_len = len2;
+
+ if (len < cmp_len)
+ cmp_len = len;
+
+ if (MB_CUR_MAX == 1) {
+ const unsigned char *s1, *s2;
+
+ s1 = bws1->data.cstr + offset;
+ s2 = bws2->data.cstr + offset;
+
+ res = memcmp(s1, s2, cmp_len);
+
+ } else {
+ const wchar_t *s1, *s2;
+
+ s1 = bws1->data.wstr + offset;
+ s2 = bws2->data.wstr + offset;
+
+ res = memcmp(s1, s2, SIZEOF_WCHAR_STRING(cmp_len));
+ }
+ }
+ }
+
+ if (res == 0) {
+ if (len1 < cmp_len && len1 < len2)
+ res = -1;
+ else if (len2 < cmp_len && len2 < len1)
+ res = +1;
+ }
+
+ return (res);
+}
+
+int
+bwscmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset)
+{
+ size_t len1, len2, cmp_len;
+ int res;
+
+ len1 = bws1->len;
+ len2 = bws2->len;
+
+ len1 -= offset;
+ len2 -= offset;
+
+ cmp_len = len1;
+
+ if (len2 < cmp_len)
+ cmp_len = len2;
+
+ res = bwsncmp(bws1, bws2, offset, cmp_len);
+
+ if (res == 0) {
+ if( len1 < len2)
+ res = -1;
+ else if (len2 < len1)
+ res = +1;
+ }
+
+ return (res);
+}
+
+int
+bws_iterator_cmp(bwstring_iterator iter1, bwstring_iterator iter2, size_t len)
+{
+ wchar_t c1, c2;
+ size_t i = 0;
+
+ for (i = 0; i < len; ++i) {
+ c1 = bws_get_iter_value(iter1);
+ c2 = bws_get_iter_value(iter2);
+ if (c1 != c2)
+ return (c1 - c2);
+ iter1 = bws_iterator_inc(iter1, 1);
+ iter2 = bws_iterator_inc(iter2, 1);
+ }
+
+ return (0);
+}
+
+int
+bwscoll(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset)
+{
+ size_t len1, len2;
+
+ len1 = bws1->len;
+ len2 = bws2->len;
+
+ if (len1 <= offset)
+ return ((len2 <= offset) ? 0 : -1);
+ else {
+ if (len2 <= offset)
+ return (+1);
+ else {
+ len1 -= offset;
+ len2 -= offset;
+
+ if (MB_CUR_MAX == 1) {
+ const unsigned char *s1, *s2;
+
+ s1 = bws1->data.cstr + offset;
+ s2 = bws2->data.cstr + offset;
+
+ if (byte_sort) {
+ int res = 0;
+
+ if (len1 > len2) {
+ res = memcmp(s1, s2, len2);
+ if (!res)
+ res = +1;
+ } else if (len1 < len2) {
+ res = memcmp(s1, s2, len1);
+ if (!res)
+ res = -1;
+ } else
+ res = memcmp(s1, s2, len1);
+
+ return (res);
+
+ } else {
+ int res = 0;
+ size_t i, maxlen;
+
+ i = 0;
+ maxlen = len1;
+
+ if (maxlen > len2)
+ maxlen = len2;
+
+ while (i < maxlen) {
+ /* goto next non-zero part: */
+ while ((i < maxlen) &&
+ !s1[i] && !s2[i])
+ ++i;
+
+ if (i >= maxlen)
+ break;
+
+ if (s1[i] == 0) {
+ if (s2[i] == 0)
+ /* NOTREACHED */
+ err(2, "bwscoll error 01");
+ else
+ return (-1);
+ } else if (s2[i] == 0)
+ return (+1);
+
+ res = strcoll(s1 + i, s2 + i);
+ if (res)
+ return (res);
+
+ while ((i < maxlen) &&
+ s1[i] && s2[i])
+ ++i;
+
+ if (i >= maxlen)
+ break;
+
+ if (s1[i] == 0) {
+ if (s2[i] == 0) {
+ ++i;
+ continue;
+ } else
+ return (-1);
+ } else if (s2[i] == 0)
+ return (+1);
+ else
+ /* NOTREACHED */
+ err(2, "bwscoll error 02");
+ }
+
+ if (len1 < len2)
+ return (-1);
+ else if (len1 > len2)
+ return (+1);
+
+ return (0);
+ }
+ } else {
+ const wchar_t *s1, *s2;
+ size_t i, maxlen;
+ int res = 0;
+
+ s1 = bws1->data.wstr + offset;
+ s2 = bws2->data.wstr + offset;
+
+ i = 0;
+ maxlen = len1;
+
+ if (maxlen > len2)
+ maxlen = len2;
+
+ while (i < maxlen) {
+
+ /* goto next non-zero part: */
+ while ((i < maxlen) &&
+ !s1[i] && !s2[i])
+ ++i;
+
+ if (i >= maxlen)
+ break;
+
+ if (s1[i] == 0) {
+ if (s2[i] == 0)
+ /* NOTREACHED */
+ err(2, "bwscoll error 1");
+ else
+ return (-1);
+ } else if (s2[i] == 0)
+ return (+1);
+
+ res = wide_str_coll(s1 + i, s2 + i);
+ if (res)
+ return (res);
+
+ while ((i < maxlen) && s1[i] && s2[i])
+ ++i;
+
+ if (i >= maxlen)
+ break;
+
+ if (s1[i] == 0) {
+ if (s2[i] == 0) {
+ ++i;
+ continue;
+ } else
+ return (-1);
+ } else if (s2[i] == 0)
+ return (+1);
+ else
+ /* NOTREACHED */
+ err(2, "bwscoll error 2");
+ }
+
+ if (len1 < len2)
+ return (-1);
+ else if (len1 > len2)
+ return (+1);
+
+ return (0);
+ }
+ }
+ }
+}
+
+/*
+ * Correction of the system API
+ */
+double
+bwstod(struct bwstring *s0, bool *empty)
+{
+ double ret = 0;
+
+ if (MB_CUR_MAX == 1) {
+ unsigned char *end, *s;
+ char *ep;
+
+ s = s0->data.cstr;
+ end = s + s0->len;
+ ep = NULL;
+
+ while (isblank(*s) && s < end)
+ ++s;
+
+ if (!isprint(*s)) {
+ *empty = true;
+ return (0);
+ }
+
+ ret = strtod(s, &ep);
+ if ((unsigned char*) ep == s) {
+ *empty = true;
+ return (0);
+ }
+ } else {
+ wchar_t *end, *ep, *s;
+
+ s = s0->data.wstr;
+ end = s + s0->len;
+ ep = NULL;
+
+ while (iswblank(*s) && s < end)
+ ++s;
+
+ if (!iswprint(*s)) {
+ *empty = true;
+ return (0);
+ }
+
+ ret = wcstod(s, &ep);
+ if (ep == s) {
+ *empty = true;
+ return (0);
+ }
+ }
+
+ *empty = false;
+ return (ret);
+}
+
+/*
+ * A helper function for monthcoll. If a line matches
+ * a month name, it returns (number of the month - 1),
+ * while if there is no match, it just return -1.
+ */
+
+int
+bws_month_score(const struct bwstring *s0)
+{
+
+ if (MB_CUR_MAX == 1) {
+ const unsigned char *end, *s;
+ size_t len;
+
+ s = s0->data.cstr;
+ end = s + s0->len;
+
+ while (isblank(*s) && s < end)
+ ++s;
+
+ len = strlen(s);
+
+ for (int i = 11; i >= 0; --i) {
+ if (cmonths[i] &&
+ (s == (unsigned char*)strstr(s, cmonths[i])))
+ return (i);
+ }
+
+ } else {
+ const wchar_t *end, *s;
+ size_t len;
+
+ s = s0->data.wstr;
+ end = s + s0->len;
+
+ while (iswblank(*s) && s < end)
+ ++s;
+
+ len = wcslen(s);
+
+ for (int i = 11; i >= 0; --i) {
+ if (wmonths[i] && (s == wcsstr(s, wmonths[i])))
+ return (i);
+ }
+ }
+
+ return (-1);
+}
+
+/*
+ * Rips out leading blanks (-b).
+ */
+struct bwstring *
+ignore_leading_blanks(struct bwstring *str)
+{
+
+ if (MB_CUR_MAX == 1) {
+ unsigned char *dst, *end, *src;
+
+ src = str->data.cstr;
+ dst = src;
+ end = src + str->len;
+
+ while (src < end && isblank(*src))
+ ++src;
+
+ if (src != dst) {
+ size_t newlen;
+
+ newlen = BWSLEN(str) - (src - dst);
+
+ while (src < end) {
+ *dst = *src;
+ ++dst;
+ ++src;
+ }
+ bws_setlen(str, newlen);
+ }
+ } else {
+ wchar_t *dst, *end, *src;
+
+ src = str->data.wstr;
+ dst = src;
+ end = src + str->len;
+
+ while (src < end && iswblank(*src))
+ ++src;
+
+ if (src != dst) {
+
+ size_t newlen = BWSLEN(str) - (src - dst);
+
+ while (src < end) {
+ *dst = *src;
+ ++dst;
+ ++src;
+ }
+ bws_setlen(str, newlen);
+
+ }
+ }
+ return (str);
+}
+
+/*
+ * Rips out nonprinting characters (-i).
+ */
+struct bwstring *
+ignore_nonprinting(struct bwstring *str)
+{
+ size_t newlen = str->len;
+
+ if (MB_CUR_MAX == 1) {
+ unsigned char *dst, *end, *src;
+ unsigned char c;
+
+ src = str->data.cstr;
+ dst = src;
+ end = src + str->len;
+
+ while (src < end) {
+ c = *src;
+ if (isprint(c)) {
+ *dst = c;
+ ++dst;
+ ++src;
+ } else {
+ ++src;
+ --newlen;
+ }
+ }
+ } else {
+ wchar_t *dst, *end, *src;
+ wchar_t c;
+
+ src = str->data.wstr;
+ dst = src;
+ end = src + str->len;
+
+ while (src < end) {
+ c = *src;
+ if (iswprint(c)) {
+ *dst = c;
+ ++dst;
+ ++src;
+ } else {
+ ++src;
+ --newlen;
+ }
+ }
+ }
+ bws_setlen(str, newlen);
+
+ return (str);
+}
+
+/*
+ * Rips out any characters that are not alphanumeric characters
+ * nor blanks (-d).
+ */
+struct bwstring *
+dictionary_order(struct bwstring *str)
+{
+ size_t newlen = str->len;
+
+ if (MB_CUR_MAX == 1) {
+ unsigned char *dst, *end, *src;
+ unsigned char c;
+
+ src = str->data.cstr;
+ dst = src;
+ end = src + str->len;
+
+ while (src < end) {
+ c = *src;
+ if (isalnum(c) || isblank(c)) {
+ *dst = c;
+ ++dst;
+ ++src;
+ } else {
+ ++src;
+ --newlen;
+ }
+ }
+ } else {
+ wchar_t *dst, *end, *src;
+ wchar_t c;
+
+ src = str->data.wstr;
+ dst = src;
+ end = src + str->len;
+
+ while (src < end) {
+ c = *src;
+ if (iswalnum(c) || iswblank(c)) {
+ *dst = c;
+ ++dst;
+ ++src;
+ } else {
+ ++src;
+ --newlen;
+ }
+ }
+ }
+ bws_setlen(str, newlen);
+
+ return (str);
+}
+
+/*
+ * Converts string to lower case(-f).
+ */
+struct bwstring *
+ignore_case(struct bwstring *str)
+{
+
+ if (MB_CUR_MAX == 1) {
+ unsigned char *end, *s;
+
+ s = str->data.cstr;
+ end = s + str->len;
+
+ while (s < end) {
+ *s = toupper(*s);
+ ++s;
+ }
+ } else {
+ wchar_t *end, *s;
+
+ s = str->data.wstr;
+ end = s + str->len;
+
+ while (s < end) {
+ *s = towupper(*s);
+ ++s;
+ }
+ }
+ return (str);
+}
+
+void
+bws_disorder_warnx(struct bwstring *s, const char *fn, size_t pos)
+{
+
+ if (MB_CUR_MAX == 1)
+ warnx("%s:%zu: disorder: %s", fn, pos + 1, s->data.cstr);
+ else
+ warnx("%s:%zu: disorder: %ls", fn, pos + 1, s->data.wstr);
+}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/bwstring.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/bwstring.h Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,142 @@
+/* $FreeBSD: head/usr.bin/sort/bwstring.h 235267 2012-05-11 12:37:16Z gabor $ */
+
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__BWSTRING_H__)
+#define __BWSTRING_H__
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sysexits.h>
+#include <wchar.h>
+
+#include "mem.h"
+
+extern bool byte_sort;
+
+/* wchar_t is of 4 bytes: */
+#define SIZEOF_WCHAR_STRING(LEN) ((LEN)*sizeof(wchar_t))
+
+/*
+ * Binary "wide" string
+ */
+struct bwstring
+{
+ size_t len;
+ union
+ {
+ wchar_t wstr[0];
+ unsigned char cstr[0];
+ } data;
+};
+
+struct reader_buffer
+{
+ wchar_t *fgetwln_z_buffer;
+ size_t fgetwln_z_buffer_size;
+};
+
+typedef void *bwstring_iterator;
+
+#define BWSLEN(s) ((s)->len)
+
+struct bwstring *bwsalloc(size_t sz);
+
+size_t bwsrawlen(const struct bwstring *bws);
+const void* bwsrawdata(const struct bwstring *bws);
+void bws_setlen(struct bwstring *bws, size_t newlen);
+size_t bws_memsize(const struct bwstring *bws);
+double bwstod(struct bwstring *s0, bool *empty);
+int bws_month_score(const struct bwstring *s0);
+
+struct bwstring *ignore_leading_blanks(struct bwstring *str);
+struct bwstring *ignore_nonprinting(struct bwstring *str);
+struct bwstring *dictionary_order(struct bwstring *str);
+struct bwstring *ignore_case(struct bwstring *str);
+
+void bwsprintf(FILE*, struct bwstring*, const char *prefix, const char *suffix);
+void bws_disorder_warnx(struct bwstring *s, const char *fn, size_t pos);
+
+struct bwstring *bwsdup(const struct bwstring *s);
+struct bwstring *bwssbdup(const wchar_t *str, size_t size);
+struct bwstring *bwscsbdup(const unsigned char *str, size_t size);
+void bwsfree(const struct bwstring *s);
+size_t bwscpy(struct bwstring *dst, const struct bwstring *src);
+struct bwstring *bwsncpy(struct bwstring *dst, const struct bwstring *src, size_t size);
+struct bwstring *bwsnocpy(struct bwstring *dst, const struct bwstring *src, size_t offset, size_t size);
+int bwscmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset);
+int bwsncmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset, size_t len);
+int bwscoll(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset);
+int bwsfwrite(struct bwstring *bws, FILE *f, bool zero_ended);
+struct bwstring *bwsfgetln(FILE *file, size_t *len, bool zero_ended, struct reader_buffer *rb);
+
+static inline bwstring_iterator
+bws_begin(struct bwstring *bws)
+{
+
+ return (bwstring_iterator) (&(bws->data));
+}
+
+static inline bwstring_iterator
+bws_end(struct bwstring *bws)
+{
+
+ return ((MB_CUR_MAX == 1) ?
+ (bwstring_iterator) (bws->data.cstr + bws->len) :
+ (bwstring_iterator) (bws->data.wstr + bws->len));
+}
+
+static inline bwstring_iterator
+bws_iterator_inc(bwstring_iterator iter, size_t pos)
+{
+
+ if (MB_CUR_MAX == 1)
+ return ((unsigned char *) iter) + pos;
+ else
+ return ((wchar_t*) iter) + pos;
+}
+
+static inline wchar_t
+bws_get_iter_value(bwstring_iterator iter)
+{
+
+ if (MB_CUR_MAX == 1)
+ return *((unsigned char *) iter);
+ else
+ return *((wchar_t*) iter);
+}
+
+int
+bws_iterator_cmp(bwstring_iterator iter1, bwstring_iterator iter2, size_t len);
+
+#define BWS_GET(bws, pos) ((MB_CUR_MAX == 1) ? ((bws)->data.cstr[(pos)]) : (bws)->data.wstr[(pos)])
+
+void initialise_months(void);
+
+#endif /* __BWSTRING_H__ */
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/coll.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/coll.c Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,1301 @@
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/usr.bin/sort/coll.c 236764 2012-06-08 19:21:49Z gabor $");
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <err.h>
+#include <langinfo.h>
+#include <limits.h>
+#include <math.h>
+#include <md5.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "coll.h"
+#include "vsort.h"
+
+struct key_specs *keys;
+size_t keys_num = 0;
+
+wchar_t symbol_decimal_point = L'.';
+/* there is no default thousands separator in collate rules: */
+wchar_t symbol_thousands_sep = 0;
+wchar_t symbol_negative_sign = L'-';
+wchar_t symbol_positive_sign = L'+';
+
+static int wstrcoll(struct key_value *kv1, struct key_value *kv2, size_t offset);
+static int gnumcoll(struct key_value*, struct key_value *, size_t offset);
+static int monthcoll(struct key_value*, struct key_value *, size_t offset);
+static int numcoll(struct key_value*, struct key_value *, size_t offset);
+static int hnumcoll(struct key_value*, struct key_value *, size_t offset);
+static int randomcoll(struct key_value*, struct key_value *, size_t offset);
+static int versioncoll(struct key_value*, struct key_value *, size_t offset);
+
+/*
+ * Allocate keys array
+ */
+struct keys_array *
+keys_array_alloc(void)
+{
+ struct keys_array *ka;
+ size_t sz;
+
+ sz = keys_array_size();
+ ka = sort_malloc(sz);
+ memset(ka, 0, sz);
+
+ return (ka);
+}
+
+/*
+ * Calculate whether we need key hint space
+ */
+static size_t
+key_hint_size(void)
+{
+
+ return (need_hint ? sizeof(struct key_hint) : 0);
+}
+
+/*
+ * Calculate keys array size
+ */
+size_t
+keys_array_size(void)
+{
+
+ return (keys_num * (sizeof(struct key_value) + key_hint_size()));
+}
+
+/*
+ * Clean data of keys array
+ */
+void
+clean_keys_array(const struct bwstring *s, struct keys_array *ka)
+{
+
+ if (ka) {
+ for (size_t i = 0; i < keys_num; ++i)
+ if (ka->key[i].k && ka->key[i].k != s)
+ bwsfree(ka->key[i].k);
+ memset(ka, 0, keys_array_size());
+ }
+}
+
+/*
+ * Set value of a key in the keys set
+ */
+void
+set_key_on_keys_array(struct keys_array *ka, struct bwstring *s, size_t ind)
+{
+
+ if (ka && keys_num > ind) {
+ struct key_value *kv;
+
+ kv = &(ka->key[ind]);
+
+ if (kv->k && kv->k != s)
+ bwsfree(kv->k);
+ kv->k = s;
+ }
+}
+
+/*
+ * Initialize a sort list item
+ */
+struct sort_list_item *
+sort_list_item_alloc(void)
+{
+ struct sort_list_item *si;
+ size_t sz;
+
+ sz = sizeof(struct sort_list_item) + keys_array_size();
+ si = sort_malloc(sz);
+ memset(si, 0, sz);
+
+ return (si);
+}
+
+size_t
+sort_list_item_size(struct sort_list_item *si)
+{
+ size_t ret = 0;
+
+ if (si) {
+ ret = sizeof(struct sort_list_item) + keys_array_size();
+ if (si->str)
+ ret += bws_memsize(si->str);
+ for (size_t i = 0; i < keys_num; ++i) {
+ struct key_value *kv;
+
+ kv = &(si->ka.key[i]);
+
+ if (kv->k != si->str)
+ ret += bws_memsize(kv->k);
+ }
+ }
+ return (ret);
+}
+
+/*
+ * Calculate key for a sort list item
+ */
+static void
+sort_list_item_make_key(struct sort_list_item *si)
+{
+
+ preproc(si->str, &(si->ka));
+}
+
+/*
+ * Set value of a sort list item.
+ * Return combined string and keys memory size.
+ */
+void
+sort_list_item_set(struct sort_list_item *si, struct bwstring *str)
+{
+
+ if (si) {
+ clean_keys_array(si->str, &(si->ka));
+ if (si->str) {
+ if (si->str == str) {
+ /* we are trying to reset the same string */
+ return;
+ } else {
+ bwsfree(si->str);
+ si->str = NULL;
+ }
+ }
+ si->str = str;
+ sort_list_item_make_key(si);
+ }
+}
+
+/*
+ * De-allocate a sort list item object memory
+ */
+void
+sort_list_item_clean(struct sort_list_item *si)
+{
+
+ if (si) {
+ clean_keys_array(si->str, &(si->ka));
+ if (si->str) {
+ bwsfree(si->str);
+ si->str = NULL;
+ }
+ }
+}
+
+/*
+ * Skip columns according to specs
+ */
+static size_t
+skip_cols_to_start(const struct bwstring *s, size_t cols, size_t start,
+ bool skip_blanks, bool *empty_key)
+{
+ if (cols < 1)
+ return (BWSLEN(s) + 1);
+
+ if (skip_blanks)
+ while (start < BWSLEN(s) && iswblank(BWS_GET(s,start)))
+ ++start;
+
+ while (start < BWSLEN(s) && cols > 1) {
+ --cols;
+ ++start;
+ }
+
+ if (start >= BWSLEN(s))
+ *empty_key = true;
+
+ return (start);
+}
+
+/*
+ * Skip fields according to specs
+ */
+static size_t
+skip_fields_to_start(const struct bwstring *s, size_t fields, bool *empty_field)
+{
+
+ if (fields < 2) {
+ if (BWSLEN(s) == 0)
+ *empty_field = true;
+ return (0);
+ } else if (!(sort_opts_vals.tflag)) {
+ size_t cpos = 0;
+ bool pb = true;
+
+ while (cpos < BWSLEN(s)) {
+ bool isblank;
+
+ isblank = iswblank(BWS_GET(s,cpos));
+
+ if (isblank && !pb) {
+ --fields;
+ if (fields <= 1)
+ return (cpos);
+ }
+ pb = isblank;
+ ++cpos;
+ }
+ if (fields > 1)
+ *empty_field = true;
+ return (cpos);
+ } else {
+ size_t cpos = 0;
+
+ while (cpos < BWSLEN(s)) {
+ if (BWS_GET(s,cpos) == sort_opts_vals.field_sep) {
+ --fields;
+ if (fields <= 1)
+ return (cpos + 1);
+ }
+ ++cpos;
+ }
+ if (fields > 1)
+ *empty_field = true;
+ return (cpos);
+ }
+}
+
+/*
+ * Find fields start
+ */
+static void
+find_field_start(const struct bwstring *s, struct key_specs *ks,
+ size_t *field_start, size_t *key_start, bool *empty_field, bool *empty_key)
+{
+
+ *field_start = skip_fields_to_start(s, ks->f1, empty_field);
+ if (!*empty_field)
+ *key_start = skip_cols_to_start(s, ks->c1, *field_start,
+ ks->pos1b, empty_key);
+ else
+ *empty_key = true;
+}
+
+/*
+ * Find end key position
+ */
+static size_t
+find_field_end(const struct bwstring *s, struct key_specs *ks)
+{
+ size_t f2, next_field_start, pos_end;
+ bool empty_field, empty_key;
+
+ pos_end = 0;
+ next_field_start = 0;
+ empty_field = false;
+ empty_key = false;
+ f2 = ks->f2;
+
+ if (f2 == 0)
+ return (BWSLEN(s) + 1);
+ else {
+ if (ks->c2 == 0) {
+ next_field_start = skip_fields_to_start(s, f2 + 1,
+ &empty_field);
+ if ((next_field_start > 0) && sort_opts_vals.tflag &&
+ (sort_opts_vals.field_sep == BWS_GET(s,
+ next_field_start - 1)))
+ --next_field_start;
+ } else
+ next_field_start = skip_fields_to_start(s, f2,
+ &empty_field);
+ }
+
+ if (empty_field || (next_field_start >= BWSLEN(s)))
+ return (BWSLEN(s) + 1);
+
+ if (ks->c2) {
+ pos_end = skip_cols_to_start(s, ks->c2, next_field_start,
+ ks->pos2b, &empty_key);
+ if (pos_end < BWSLEN(s))
+ ++pos_end;
+ } else
+ pos_end = next_field_start;
+
+ return (pos_end);
+}
+
+/*
+ * Cut a field according to the key specs
+ */
+static struct bwstring *
+cut_field(const struct bwstring *s, struct key_specs *ks)
+{
+ struct bwstring *ret = NULL;
+
+ if (s && ks) {
+ size_t field_start, key_end, key_start, sz;
+ bool empty_field, empty_key;
+
+ field_start = 0;
+ key_start = 0;
+ empty_field = false;
+ empty_key = false;
+
+ find_field_start(s, ks, &field_start, &key_start,
+ &empty_field, &empty_key);
+
+ if (empty_key)
+ sz = 0;
+ else {
+ key_end = find_field_end(s, ks);
+ sz = (key_end < key_start) ? 0 : (key_end - key_start);
+ }
+
+ ret = bwsalloc(sz);
+ if (sz)
+ bwsnocpy(ret, s, key_start, sz);
+ } else
+ ret = bwsalloc(0);
+
+ return (ret);
+}
+
+/*
+ * Preprocesses a line applying the necessary transformations
+ * specified by command line options and returns the preprocessed
+ * string, which can be used to compare.
+ */
+int
+preproc(struct bwstring *s, struct keys_array *ka)
+{
+
+ if (sort_opts_vals.kflag)
+ for (size_t i = 0; i < keys_num; i++) {
+ struct bwstring *key;
+ struct key_specs *kspecs;
+ struct sort_mods *sm;
+
+ kspecs = &(keys[i]);
+ key = cut_field(s, kspecs);
+
+ sm = &(kspecs->sm);
+ if (sm->dflag)
+ key = dictionary_order(key);
+ else if (sm->iflag)
+ key = ignore_nonprinting(key);
+ if (sm->fflag || sm->Mflag)
+ key = ignore_case(key);
+
+ set_key_on_keys_array(ka, key, i);
+ }
+ else {
+ struct bwstring *ret = NULL;
+ struct sort_mods *sm = default_sort_mods;
+
+ if (sm->bflag) {
+ if (ret == NULL)
+ ret = bwsdup(s);
+ ret = ignore_leading_blanks(ret);
+ }
+ if (sm->dflag) {
+ if (ret == NULL)
+ ret = bwsdup(s);
+ ret = dictionary_order(ret);
+ } else if (sm->iflag) {
+ if (ret == NULL)
+ ret = bwsdup(s);
+ ret = ignore_nonprinting(ret);
+ }
+ if (sm->fflag || sm->Mflag) {
+ if (ret == NULL)
+ ret = bwsdup(s);
+ ret = ignore_case(ret);
+ }
+ if (ret == NULL)
+ set_key_on_keys_array(ka, s, 0);
+ else
+ set_key_on_keys_array(ka, ret, 0);
+ }
+
+ return 0;
+}
+
+cmpcoll_t
+get_sort_func(struct sort_mods *sm)
+{
+
+ if (sm->nflag)
+ return (numcoll);
+ else if (sm->hflag)
+ return (hnumcoll);
+ else if (sm->gflag)
+ return (gnumcoll);
+ else if (sm->Mflag)
+ return (monthcoll);
+ else if (sm->Rflag)
+ return (randomcoll);
+ else if (sm->Vflag)
+ return (versioncoll);
+ else
+ return (wstrcoll);
+}
+
+/*
+ * Compares the given strings. Returns a positive number if
+ * the first precedes the second, a negative number if the second is
+ * the preceding one, and zero if they are equal. This function calls
+ * the underlying collate functions, which done the actual comparison.
+ */
+int
+key_coll(struct keys_array *ps1, struct keys_array *ps2, size_t offset)
+{
+ struct sort_mods *sm;
+ int res = 0;
+
+ for (size_t i = 0; i < keys_num; ++i) {
+ sm = &(keys[i].sm);
+
+ if (sm->rflag)
+ res = sm->func(&(ps2->key[i]), &(ps1->key[i]), offset);
+ else
+ res = sm->func(&(ps1->key[i]), &(ps2->key[i]), offset);
+
+ if (res)
+ break;
+
+ /* offset applies to only the first key */
+ offset = 0;
+ }
+ return (res);
+}
+
+/*
+ * Compare two strings.
+ * Plain symbol-by-symbol comparison.
+ */
+int
+top_level_str_coll(const struct bwstring *s1, const struct bwstring *s2)
+{
+
+ if (default_sort_mods->rflag) {
+ const struct bwstring *tmp;
+
+ tmp = s1;
+ s1 = s2;
+ s2 = tmp;
+ }
+
+ return (bwscoll(s1, s2, 0));
+}
+
+/*
+ * Compare a string and a sort list item, according to the sort specs.
+ */
+int
+str_list_coll(struct bwstring *str1, struct sort_list_item **ss2)
+{
+ struct keys_array *ka1;
+ int ret = 0;
+
+ ka1 = keys_array_alloc();
+
+ preproc(str1, ka1);
+
+ sort_list_item_make_key(*ss2);
+
+ if (debug_sort) {
+ bwsprintf(stdout, str1, "; s1=<", ">");
+ bwsprintf(stdout, (*ss2)->str, ", s2=<", ">");
+ }
+
+ ret = key_coll(ka1, &((*ss2)->ka), 0);
+
+ if (debug_sort)
+ printf("; cmp1=%d", ret);
+
+ clean_keys_array(str1, ka1);
+ sort_free(ka1);
+
+ if ((ret == 0) && !(sort_opts_vals.sflag) && sort_opts_vals.complex_sort) {
+ ret = top_level_str_coll(str1, ((*ss2)->str));
+ if (debug_sort)
+ printf("; cmp2=%d", ret);
+ }
+
+ if (debug_sort)
+ printf("\n");
+
+ return (ret);
+}
+
+/*
+ * Compare two sort list items, according to the sort specs.
+ */
+int
+list_coll_offset(struct sort_list_item **ss1, struct sort_list_item **ss2,
+ size_t offset)
+{
+ int ret;
+
+ ret = key_coll(&((*ss1)->ka), &((*ss2)->ka), offset);
+
+ if (debug_sort) {
+ if (offset)
+ printf("; offset=%d", (int) offset);
+ bwsprintf(stdout, ((*ss1)->str), "; s1=<", ">");
+ bwsprintf(stdout, ((*ss2)->str), ", s2=<", ">");
+ printf("; cmp1=%d\n", ret);
+ }
+
+ if (ret)
+ return (ret);
+
+ if (!(sort_opts_vals.sflag) && sort_opts_vals.complex_sort) {
+ ret = top_level_str_coll(((*ss1)->str), ((*ss2)->str));
+ if (debug_sort)
+ printf("; cmp2=%d\n", ret);
+ }
+
+ return (ret);
+}
+
+/*
+ * Compare two sort list items, according to the sort specs.
+ */
+int
+list_coll(struct sort_list_item **ss1, struct sort_list_item **ss2)
+{
+
+ return (list_coll_offset(ss1, ss2, 0));
+}
+
+#define LSCDEF(N) \
+static int \
+list_coll_##N(struct sort_list_item **ss1, struct sort_list_item **ss2) \
+{ \
+ \
+ return (list_coll_offset(ss1, ss2, N)); \
+}
+
+LSCDEF(1)
+LSCDEF(2)
+LSCDEF(3)
+LSCDEF(4)
+LSCDEF(5)
+LSCDEF(6)
+LSCDEF(7)
+LSCDEF(8)
+LSCDEF(9)
+LSCDEF(10)
+LSCDEF(11)
+LSCDEF(12)
+LSCDEF(13)
+LSCDEF(14)
+LSCDEF(15)
+LSCDEF(16)
+LSCDEF(17)
+LSCDEF(18)
+LSCDEF(19)
+LSCDEF(20)
+
+listcoll_t
+get_list_call_func(size_t offset)
+{
+ static const listcoll_t lsarray[] = { list_coll, list_coll_1,
+ list_coll_2, list_coll_3, list_coll_4, list_coll_5,
+ list_coll_6, list_coll_7, list_coll_8, list_coll_9,
+ list_coll_10, list_coll_11, list_coll_12, list_coll_13,
+ list_coll_14, list_coll_15, list_coll_16, list_coll_17,
+ list_coll_18, list_coll_19, list_coll_20 };
+
+ if (offset <= 20)
+ return (lsarray[offset]);
+
+ return (list_coll);
+}
+
+/*
+ * Compare two sort list items, only by their original string.
+ */
+int
+list_coll_by_str_only(struct sort_list_item **ss1, struct sort_list_item **ss2)
+{
+
+ return (top_level_str_coll(((*ss1)->str), ((*ss2)->str)));
+}
+
+/*
+ * Maximum size of a number in the string (before or after decimal point)
+ */
+#define MAX_NUM_SIZE (128)
+
+/*
+ * Set suffix value
+ */
+static void setsuffix(wchar_t c, unsigned char *si)
+{
+ switch (c){
+ case L'k':
+ case L'K':
+ *si = 1;
+ break;
+ case L'M':
+ *si = 2;
+ break;
+ case L'G':
+ *si = 3;
+ break;
+ case L'T':
+ *si = 4;
+ break;
+ case L'P':
+ *si = 5;
+ break;
+ case L'E':
+ *si = 6;
+ break;
+ case L'Z':
+ *si = 7;
+ break;
+ case L'Y':
+ *si = 8;
+ break;
+ default:
+ *si = 0;
+ };
+}
+
+/*
+ * Read string s and parse the string into a fixed-decimal-point number.
+ * sign equals -1 if the number is negative (explicit plus is not allowed,
+ * according to GNU sort's "info sort".
+ * The number part before decimal point is in the smain, after the decimal
+ * point is in sfrac, tail is the pointer to the remainder of the string.
+ */
+static int
+read_number(struct bwstring *s0, int *sign, wchar_t *smain, int *main_len, wchar_t *sfrac, int *frac_len, unsigned char *si)
+{
+ bwstring_iterator s;
+
+ s = bws_begin(s0);
+
+ /* always end the fraction with zero, even if we have no fraction */
+ sfrac[0] = 0;
+
+ while (iswblank(bws_get_iter_value(s)))
+ s = bws_iterator_inc(s, 1);
+
+ if (bws_get_iter_value(s) == symbol_negative_sign) {
+ *sign = -1;
+ s = bws_iterator_inc(s, 1);
+ }
+
+ // This is '0', not '\0', do not change this
+ while (iswdigit(bws_get_iter_value(s)) &&
+ (bws_get_iter_value(s) == L'0'))
+ s = bws_iterator_inc(s, 1);
+
+ while (bws_get_iter_value(s) && *main_len < MAX_NUM_SIZE) {
+ if (iswdigit(bws_get_iter_value(s))) {
+ smain[*main_len] = bws_get_iter_value(s);
+ s = bws_iterator_inc(s, 1);
+ *main_len += 1;
+ } else if (symbol_thousands_sep &&
+ (bws_get_iter_value(s) == symbol_thousands_sep))
+ s = bws_iterator_inc(s, 1);
+ else
+ break;
+ }
+
+ smain[*main_len] = 0;
+
+ if (bws_get_iter_value(s) == symbol_decimal_point) {
+ s = bws_iterator_inc(s, 1);
+ while (iswdigit(bws_get_iter_value(s)) &&
+ *frac_len < MAX_NUM_SIZE) {
+ sfrac[*frac_len] = bws_get_iter_value(s);
+ s = bws_iterator_inc(s, 1);
+ *frac_len += 1;
+ }
+ sfrac[*frac_len] = 0;
+
+ while (*frac_len > 0 && sfrac[*frac_len - 1] == L'0') {
+ --(*frac_len);
+ sfrac[*frac_len] = L'\0';
+ }
+ }
+
+ setsuffix(bws_get_iter_value(s),si);
+
+ if ((*main_len + *frac_len) == 0)
+ *sign = 0;
+
+ return (0);
+}
+
+/*
+ * Implements string sort.
+ */
+static int
+wstrcoll(struct key_value *kv1, struct key_value *kv2, size_t offset)
+{
+
+ if (debug_sort) {
+ if (offset)
+ printf("; offset=%d\n", (int) offset);
+ bwsprintf(stdout, kv1->k, "; k1=<", ">");
+ printf("(%zu)", BWSLEN(kv1->k));
+ bwsprintf(stdout, kv2->k, ", k2=<", ">");
+ printf("(%zu)", BWSLEN(kv2->k));
+ }
+
+ return (bwscoll(kv1->k, kv2->k, offset));
+}
+
+/*
+ * Compare two suffixes
+ */
+static inline int
+cmpsuffix(unsigned char si1, unsigned char si2)
+{
+
+ return ((char)si1 - (char)si2);
+}
+
+/*
+ * Implements numeric sort for -n and -h.
+ */
+static int
+numcoll_impl(struct key_value *kv1, struct key_value *kv2,
+ size_t offset __unused, bool use_suffix)
+{
+ struct bwstring *s1, *s2;
+ wchar_t sfrac1[MAX_NUM_SIZE + 1], sfrac2[MAX_NUM_SIZE + 1];
+ wchar_t smain1[MAX_NUM_SIZE + 1], smain2[MAX_NUM_SIZE + 1];
+ int cmp_res, frac1, frac2, main1, main2, sign1, sign2;
+ unsigned char SI1, SI2;
+ bool e1, e2, key1_read, key2_read;
+
+ s1 = kv1->k;
+ s2 = kv2->k;
+ sign1 = sign2 = 0;
+ main1 = main2 = 0;
+ frac1 = frac2 = 0;
+
+ cmp_res = 0;
+ key1_read = key2_read = false;
+
+ if (debug_sort) {
+ bwsprintf(stdout, s1, "; k1=<", ">");
+ bwsprintf(stdout, s2, ", k2=<", ">");
+ }
+
+ if (s1 == s2)
+ return (0);
+
+ if (kv1->hint->status == HS_UNINITIALIZED) {
+ /* read the number from the string */
+ read_number(s1, &sign1, smain1, &main1, sfrac1, &frac1, &SI1);
+ key1_read = true;
+ kv1->hint->v.nh.n1 = wcstoull(smain1, NULL, 10);
+ if(main1 < 1 && frac1 < 1)
+ kv1->hint->v.nh.empty=true;
+ kv1->hint->v.nh.si = SI1;
+ kv1->hint->status = (kv1->hint->v.nh.n1 != ULLONG_MAX) ?
+ HS_INITIALIZED : HS_ERROR;
+ kv1->hint->v.nh.neg = (sign1 < 0) ? true : false;
+ }
+
+ if (kv2->hint->status == HS_UNINITIALIZED) {
+ /* read the number from the string */
+ read_number(s2, &sign2, smain2, &main2, sfrac2, &frac2,&SI2);
+ key2_read = true;
+ kv2->hint->v.nh.n1 = wcstoull(smain2, NULL, 10);
+ if(main2 < 1 && frac2 < 1)
+ kv2->hint->v.nh.empty=true;
+ kv2->hint->v.nh.si = SI2;
+ kv2->hint->status = (kv2->hint->v.nh.n1 != ULLONG_MAX) ?
+ HS_INITIALIZED : HS_ERROR;
+ kv2->hint->v.nh.neg = (sign2 < 0) ? true : false;
+ }
+
+ if (kv1->hint->status == HS_INITIALIZED && kv2->hint->status ==
+ HS_INITIALIZED) {
+ unsigned long long n1, n2;
+ bool neg1, neg2;
+
+ e1 = kv1->hint->v.nh.empty;
+ e2 = kv2->hint->v.nh.empty;
+
+ if (e1 && e2)
+ return (0);
+
+ neg1 = kv1->hint->v.nh.neg;
+ neg2 = kv2->hint->v.nh.neg;
+
+ if (neg1 && !neg2)
+ return (-1);
+ if (neg2 && !neg1)
+ return (+1);
+
+ if (e1)
+ return (neg2 ? +1 : -1);
+ else if (e2)
+ return (neg1 ? -1 : +1);
+
+
+ if (use_suffix) {
+ cmp_res = cmpsuffix(kv1->hint->v.nh.si, kv2->hint->v.nh.si);
+ if (cmp_res)
+ return (neg1 ? -cmp_res : cmp_res);
+ }
+
+ n1 = kv1->hint->v.nh.n1;
+ n2 = kv2->hint->v.nh.n1;
+ if (n1 < n2)
+ return (neg1 ? +1 : -1);
+ else if (n1 > n2)
+ return (neg1 ? -1 : +1);
+ }
+
+ /* read the numbers from the strings */
+ if (!key1_read)
+ read_number(s1, &sign1, smain1, &main1, sfrac1, &frac1, &SI1);
+ if (!key2_read)
+ read_number(s2, &sign2, smain2, &main2, sfrac2, &frac2, &SI2);
+
+ e1 = ((main1 + frac1) == 0);
+ e2 = ((main2 + frac2) == 0);
+
+ if (e1 && e2)
+ return (0);
+
+ /* we know the result if the signs are different */
+ if (sign1 < 0 && sign2 >= 0)
+ return (-1);
+ if (sign1 >= 0 && sign2 < 0)
+ return (+1);
+
+ if (e1)
+ return ((sign2 < 0) ? +1 : -1);
+ else if (e2)
+ return ((sign1 < 0) ? -1 : +1);
+
+ if (use_suffix) {
+ cmp_res = cmpsuffix(SI1, SI2);
+ if (cmp_res)
+ return ((sign1 < 0) ? -cmp_res : cmp_res);
+ }
+
+ /* if both numbers are empty assume that the strings are equal */
+ if (main1 < 1 && main2 < 1 && frac1 < 1 && frac2 < 1)
+ return (0);
+
+ /*
+ * if the main part is of different size, we know the result
+ * (because the leading zeros are removed)
+ */
+ if (main1 < main2)
+ cmp_res = -1;
+ else if (main1 > main2)
+ cmp_res = +1;
+ /* if the sizes are equal then simple non-collate string compare gives the correct result */
+ else
+ cmp_res = wcscmp(smain1, smain2);
+
+ /* check fraction */
+ if (!cmp_res)
+ cmp_res = wcscmp(sfrac1, sfrac2);
+
+ if (!cmp_res)
+ return (0);
+
+ /* reverse result if the signs are negative */
+ if (sign1 < 0 && sign2 < 0)
+ cmp_res = -cmp_res;
+
+ return (cmp_res);
+}
+
+/*
+ * Implements numeric sort (-n).
+ */
+static int
+numcoll(struct key_value *kv1, struct key_value *kv2, size_t offset)
+{
+
+ return (numcoll_impl(kv1, kv2, offset, false));
+}
+
+/*
+ * Implements 'human' numeric sort (-h).
+ */
+static int
+hnumcoll(struct key_value *kv1, struct key_value *kv2, size_t offset)
+{
+
+ return (numcoll_impl(kv1, kv2, offset, true));
+}
+
+/*
+ * Implements random sort (-R).
+ */
+static int
+randomcoll(struct key_value *kv1, struct key_value *kv2,
+ size_t offset __unused)
+{
+ struct bwstring *s1, *s2;
+ MD5_CTX ctx1, ctx2;
+ char *b1, *b2;
+
+ s1 = kv1->k;
+ s2 = kv2->k;
+
+ if (debug_sort) {
+ bwsprintf(stdout, s1, "; k1=<", ">");
+ bwsprintf(stdout, s2, ", k2=<", ">");
+ }
+
+ if (s1 == s2)
+ return (0);
+
+ memcpy(&ctx1,&md5_ctx,sizeof(MD5_CTX));
+ memcpy(&ctx2,&md5_ctx,sizeof(MD5_CTX));
+
+ MD5Update(&ctx1, bwsrawdata(s1), bwsrawlen(s1));
+ MD5Update(&ctx2, bwsrawdata(s2), bwsrawlen(s2));
+ b1 = MD5End(&ctx1, NULL);
+ b2 = MD5End(&ctx2, NULL);
+ if (b1 == NULL) {
+ if (b2 == NULL)
+ return (0);
+ else {
+ sort_free(b2);
+ return (-1);
+ }
+ } else if (b2 == NULL) {
+ sort_free(b1);
+ return (+1);
+ } else {
+ int cmp_res;
+
+ cmp_res = strcmp(b1,b2);
+ sort_free(b1);
+ sort_free(b2);
+
+ if (!cmp_res)
+ cmp_res = bwscoll(s1, s2, 0);
+
+ return (cmp_res);
+ }
+}
+
+/*
+ * Implements version sort (-V).
+ */
+static int
+versioncoll(struct key_value *kv1, struct key_value *kv2,
+ size_t offset __unused)
+{
+ struct bwstring *s1, *s2;
+
+ s1 = kv1->k;
+ s2 = kv2->k;
+
+ if (debug_sort) {
+ bwsprintf(stdout, s1, "; k1=<", ">");
+ bwsprintf(stdout, s2, ", k2=<", ">");
+ }
+
+ if (s1 == s2)
+ return (0);
+
+ return (vcmp(s1, s2));
+}
+
+/*
+ * Check for minus infinity
+ */
+static inline bool
+huge_minus(double d, int err1)
+{
+
+ if (err1 == ERANGE)
+ if (d == -HUGE_VAL || d == -HUGE_VALF || d == -HUGE_VALL)
+ return (+1);
+
+ return (0);
+}
+
+/*
+ * Check for plus infinity
+ */
+static inline bool
+huge_plus(double d, int err1)
+{
+
+ if (err1 == ERANGE)
+ if (d == HUGE_VAL || d == HUGE_VALF || d == HUGE_VALL)
+ return (+1);
+
+ return (0);
+}
+
+/*
+ * Check whether a function is a NAN
+ */
+static bool
+is_nan(double d)
+{
+
+ return ((d == NAN) || (isnan(d)));
+}
+
+/*
+ * Compare two NANs
+ */
+static int
+cmp_nans(double d1, double d2)
+{
+
+ if (d1 < d2)
+ return (-1);
+ if (d2 > d2)
+ return (+1);
+ return (0);
+}
+
+/*
+ * Implements general numeric sort (-g).
+ */
+static int
+gnumcoll(struct key_value *kv1, struct key_value *kv2,
+ size_t offset __unused)
+{
+ double d1, d2;
+ int err1, err2;
+ bool empty1, empty2, key1_read, key2_read;
+
+ d1 = d2 = 0;
+ err1 = err2 = 0;
+ key1_read = key2_read = false;
+
+ if (debug_sort) {
+ bwsprintf(stdout, kv1->k, "; k1=<", ">");
+ bwsprintf(stdout, kv2->k, "; k2=<", ">");
+ }
+
+ if (kv1->hint->status == HS_UNINITIALIZED) {
+ errno = 0;
+ d1 = bwstod(kv1->k, &empty1);
+ err1 = errno;
+
+ if (empty1)
+ kv1->hint->v.gh.notnum = true;
+ else if (err1 == 0) {
+ kv1->hint->v.gh.d = d1;
+ kv1->hint->v.gh.nan = is_nan(d1);
+ kv1->hint->status = HS_INITIALIZED;
+ } else
+ kv1->hint->status = HS_ERROR;
+
+ key1_read = true;
+ }
+
+ if (kv2->hint->status == HS_UNINITIALIZED) {
+ errno = 0;
+ d2 = bwstod(kv2->k, &empty2);
+ err2 = errno;
+
+ if (empty2)
+ kv2->hint->v.gh.notnum = true;
+ else if (err2 == 0) {
+ kv2->hint->v.gh.d = d2;
+ kv2->hint->v.gh.nan = is_nan(d2);
+ kv2->hint->status = HS_INITIALIZED;
+ } else
+ kv2->hint->status = HS_ERROR;
+
+ key2_read = true;
+ }
+
+ if (kv1->hint->status == HS_INITIALIZED &&
+ kv2->hint->status == HS_INITIALIZED) {
+ if (kv1->hint->v.gh.notnum)
+ return ((kv2->hint->v.gh.notnum) ? 0 : -1);
+ else if (kv2->hint->v.gh.notnum)
+ return (+1);
+
+ if (kv1->hint->v.gh.nan)
+ return ((kv2->hint->v.gh.nan) ?
+ cmp_nans(kv1->hint->v.gh.d, kv2->hint->v.gh.d) :
+ -1);
+ else if (kv2->hint->v.gh.nan)
+ return (+1);
+
+ d1 = kv1->hint->v.gh.d;
+ d2 = kv2->hint->v.gh.d;
+
+ if (d1 < d2)
+ return (-1);
+ else if (d1 > d2)
+ return (+1);
+ else
+ return (0);
+ }
+
+ if (!key1_read) {
+ errno = 0;
+ d1 = bwstod(kv1->k, &empty1);
+ err1 = errno;
+ }
+
+ if (!key2_read) {
+ errno = 0;
+ d2 = bwstod(kv2->k, &empty2);
+ err2 = errno;
+ }
+
+ /* Non-value case: */
+ if (empty1)
+ return (empty2 ? 0 : -1);
+ else if (empty2)
+ return (+1);
+
+ /* NAN case */
+ if (is_nan(d1))
+ return (is_nan(d2) ? cmp_nans(d1, d2) : -1);
+ else if (is_nan(d2))
+ return (+1);
+
+ /* Infinities */
+ if (err1 == ERANGE || err2 == ERANGE) {
+ /* Minus infinity case */
+ if (huge_minus(d1, err1)) {
+ if (huge_minus(d2, err2)) {
+ if (d1 < d2)
+ return (-1);
+ if (d1 > d2)
+ return (+1);
+ return (0);
+ } else
+ return (-1);
+
+ } else if (huge_minus(d2, err2)) {
+ if (huge_minus(d1, err1)) {
+ if (d1 < d2)
+ return (-1);
+ if (d1 > d2)
+ return (+1);
+ return (0);
+ } else
+ return (+1);
+ }
+
+ /* Plus infinity case */
+ if (huge_plus(d1, err1)) {
+ if (huge_plus(d2, err2)) {
+ if (d1 < d2)
+ return (-1);
+ if (d1 > d2)
+ return (+1);
+ return (0);
+ } else
+ return (+1);
+ } else if (huge_plus(d2, err2)) {
+ if (huge_plus(d1, err1)) {
+ if (d1 < d2)
+ return (-1);
+ if (d1 > d2)
+ return (+1);
+ return (0);
+ } else
+ return (-1);
+ }
+ }
+
+ if (d1 < d2)
+ return (-1);
+ if (d1 > d2)
+ return (+1);
+
+ return (0);
+}
+
+/*
+ * Implements month sort (-M).
+ */
+static int
+monthcoll(struct key_value *kv1, struct key_value *kv2, size_t offset __unused)
+{
+ int val1, val2;
+ bool key1_read, key2_read;
+
+ val1 = val2 = 0;
+ key1_read = key2_read = false;
+
+ if (debug_sort) {
+ bwsprintf(stdout, kv1->k, "; k1=<", ">");
+ bwsprintf(stdout, kv2->k, "; k2=<", ">");
+ }
+
+ if (kv1->hint->status == HS_UNINITIALIZED) {
+ kv1->hint->v.Mh.m = bws_month_score(kv1->k);
+ key1_read = true;
+ kv1->hint->status = HS_INITIALIZED;
+ }
+
+ if (kv2->hint->status == HS_UNINITIALIZED) {
+ kv2->hint->v.Mh.m = bws_month_score(kv2->k);
+ key2_read = true;
+ kv2->hint->status = HS_INITIALIZED;
+ }
+
+ if (kv1->hint->status == HS_INITIALIZED) {
+ val1 = kv1->hint->v.Mh.m;
+ key1_read = true;
+ }
+
+ if (kv2->hint->status == HS_INITIALIZED) {
+ val2 = kv2->hint->v.Mh.m;
+ key2_read = true;
+ }
+
+ if (!key1_read)
+ val1 = bws_month_score(kv1->k);
+ if (!key2_read)
+ val2 = bws_month_score(kv2->k);
+
+ if (val1 == val2) {
+ return (0);
+ }
+ if (val1 < val2)
+ return (-1);
+ return (+1);
+}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/coll.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/coll.h Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,167 @@
+/* $FreeBSD: head/usr.bin/sort/coll.h 235267 2012-05-11 12:37:16Z gabor $ */
+
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__COLL_H__)
+#define __COLL_H__
+
+#include "bwstring.h"
+#include "sort.h"
+
+/*
+ * Sort hint data for -n
+ */
+struct n_hint
+{
+ unsigned long long n1;
+ unsigned char si;
+ bool empty;
+ bool neg;
+};
+
+/*
+ * Sort hint data for -g
+ */
+struct g_hint
+{
+ double d;
+ bool nan;
+ bool notnum;
+};
+
+/*
+ * Sort hint data for -M
+ */
+struct M_hint
+{
+ int m;
+};
+
+/*
+ * Status of a sort hint object
+ */
+typedef enum
+{
+ HS_ERROR = -1, HS_UNINITIALIZED = 0, HS_INITIALIZED = 1
+} hint_status;
+
+/*
+ * Sort hint object
+ */
+struct key_hint
+{
+ hint_status status;
+ union
+ {
+ struct n_hint nh;
+ struct g_hint gh;
+ struct M_hint Mh;
+ } v;
+};
+
+/*
+ * Key value
+ */
+struct key_value
+{
+ struct bwstring *k; /* key string */
+ struct key_hint hint[0]; /* key sort hint */
+};
+
+/*
+ * Set of keys container object.
+ */
+struct keys_array
+{
+ struct key_value key[0];
+};
+
+/*
+ * Parsed -k option data
+ */
+struct key_specs
+{
+ struct sort_mods sm;
+ size_t c1;
+ size_t c2;
+ size_t f1;
+ size_t f2;
+ bool pos1b;
+ bool pos2b;
+};
+
+/*
+ * Single entry in sort list.
+ */
+struct sort_list_item
+{
+ struct bwstring *str;
+ struct keys_array ka;
+};
+
+/*
+ * Function type, used to compare two list objects
+ */
+typedef int (*listcoll_t)(struct sort_list_item **ss1, struct sort_list_item **ss2);
+
+extern struct key_specs *keys;
+extern size_t keys_num;
+
+/*
+ * Main localised symbols
+ */
+extern wchar_t symbol_decimal_point;
+extern wchar_t symbol_thousands_sep;
+extern wchar_t symbol_negative_sign;
+extern wchar_t symbol_positive_sign;
+
+/* funcs */
+
+cmpcoll_t get_sort_func(struct sort_mods *sm);
+
+struct keys_array *keys_array_alloc(void);
+size_t keys_array_size(void);
+void set_key_on_keys_array(struct keys_array *ka, struct bwstring *s, size_t ind);
+void clean_keys_array(const struct bwstring *s, struct keys_array *ka);
+
+struct sort_list_item *sort_list_item_alloc(void);
+void sort_list_item_set(struct sort_list_item *si, struct bwstring *str);
+void sort_list_item_clean(struct sort_list_item *si);
+size_t sort_list_item_size(struct sort_list_item *si);
+
+int preproc(struct bwstring *s, struct keys_array *ka);
+int top_level_str_coll(const struct bwstring *, const struct bwstring *);
+int key_coll(struct keys_array *ks1, struct keys_array *ks2, size_t offset);
+int str_list_coll(struct bwstring *str1, struct sort_list_item **ss2);
+int list_coll_by_str_only(struct sort_list_item **ss1, struct sort_list_item **ss2);
+int list_coll(struct sort_list_item **ss1, struct sort_list_item **ss2);
+int list_coll_offset(struct sort_list_item **ss1, struct sort_list_item **ss2, size_t offset);
+
+listcoll_t get_list_call_func(size_t offset);
+
+#endif /* __COLL_H__ */
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/file.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/file.c Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,1632 @@
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/usr.bin/sort/file.c 238108 2012-07-04 16:25:11Z gabor $");
+
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/queue.h>
+
+#include <err.h>
+#include <fcntl.h>
+#if defined(SORT_THREADS)
+#include <pthread.h>
+#endif
+#include <semaphore.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "coll.h"
+#include "file.h"
+#include "radixsort.h"
+
+unsigned long long free_memory = 1000000;
+unsigned long long available_free_memory = 1000000;
+
+bool use_mmap;
+
+const char *tmpdir = "/var/tmp";
+const char *compress_program;
+
+size_t max_open_files = 16;
+
+/*
+ * How much space we read from file at once
+ */
+#define READ_CHUNK (4096)
+
+/*
+ * File reader structure
+ */
+struct file_reader
+{
+ struct reader_buffer rb;
+ FILE *file;
+ char *fname;
+ unsigned char *buffer;
+ unsigned char *mmapaddr;
+ unsigned char *mmapptr;
+ size_t bsz;
+ size_t cbsz;
+ size_t mmapsize;
+ size_t strbeg;
+ int fd;
+ char elsymb;
+};
+
+/*
+ * Structure to be used in file merge process.
+ */
+struct file_header
+{
+ struct file_reader *fr;
+ struct sort_list_item *si; /* current top line */
+ size_t file_pos;
+};
+
+/*
+ * List elements of "cleanable" files list.
+ */
+struct CLEANABLE_FILE
+{
+ char *fn;
+ LIST_ENTRY(CLEANABLE_FILE) files;
+};
+
+/*
+ * List header of "cleanable" files list.
+ */
+static LIST_HEAD(CLEANABLE_FILES,CLEANABLE_FILE) tmp_files;
+
+/*
+ * Semaphore to protect the tmp file list.
+ * We use semaphore here because it is signal-safe, according to POSIX.
+ * And semaphore does not require pthread library.
+ */
+static sem_t tmp_files_sem;
+
+static void mt_sort(struct sort_list *list,
+ int (*sort_func)(void *, size_t, size_t,
+ int (*)(const void *, const void *)), const char* fn);
+
+/*
+ * Init tmp files list
+ */
+void
+init_tmp_files(void)
+{
+
+ LIST_INIT(&tmp_files);
+ sem_init(&tmp_files_sem, 0, 1);
+}
+
+/*
+ * Save name of a tmp file for signal cleanup
+ */
+void
+tmp_file_atexit(const char *tmp_file)
+{
+
+ if (tmp_file) {
+ sem_wait(&tmp_files_sem);
+ struct CLEANABLE_FILE *item =
+ sort_malloc(sizeof(struct CLEANABLE_FILE));
+ item->fn = sort_strdup(tmp_file);
+ LIST_INSERT_HEAD(&tmp_files, item, files);
+ sem_post(&tmp_files_sem);
+ }
+}
+
+/*
+ * Clear tmp files
+ */
+void
+clear_tmp_files(void)
+{
+ struct CLEANABLE_FILE *item;
+
+ sem_wait(&tmp_files_sem);
+ LIST_FOREACH(item,&tmp_files,files) {
+ if ((item) && (item->fn))
+ unlink(item->fn);
+ }
+ sem_post(&tmp_files_sem);
+}
+
+/*
+ * Check whether a file is a temporary file
+ */
+static bool
+file_is_tmp(const char* fn)
+{
+ struct CLEANABLE_FILE *item;
+ bool ret = false;
+
+ if (fn) {
+ sem_wait(&tmp_files_sem);
+ LIST_FOREACH(item,&tmp_files,files) {
+ if ((item) && (item->fn))
+ if (strcmp(item->fn, fn) == 0) {
+ ret = true;
+ break;
+ }
+ }
+ sem_post(&tmp_files_sem);
+ }
+
+ return (ret);
+}
+
+/*
+ * Read zero-terminated line from a file
+ */
+char *
+read_file0_line(struct file0_reader *f0r)
+{
+ size_t pos = 0;
+ int c;
+
+ if ((f0r->f == NULL) || feof(f0r->f))
+ return (NULL);
+
+ if (f0r->current_line && f0r->current_sz > 0)
+ f0r->current_line[0] = 0;
+
+ while (!feof(f0r->f)) {
+ c = fgetc(f0r->f);
+ if (feof(f0r->f) || (c == -1))
+ break;
+ if ((pos + 1) >= f0r->current_sz) {
+ size_t newsz = (f0r->current_sz + 2) * 2;
+ f0r->current_line = sort_realloc(f0r->current_line,
+ newsz);
+ f0r->current_sz = newsz;
+ }
+ f0r->current_line[pos] = (char)c;
+ if (c == 0)
+ break;
+ else
+ f0r->current_line[pos + 1] = 0;
+ ++pos;
+ }
+
+ return f0r->current_line;
+}
+
+/*
+ * Generate new temporary file name
+ */
+char *
+new_tmp_file_name(void)
+{
+ static unsigned int tfcounter = 0;
+ static const char *fn = ".bsdsort.";
+ char *ret;
+ size_t sz;
+
+ sz = strlen(tmpdir) + 1 + strlen(fn) + 32 + 1;
+ ret = sort_malloc(sz);
+
+ sprintf(ret, "%s/%s%d.%u", tmpdir, fn, (int) getpid(), tfcounter++);
+ tmp_file_atexit(ret);
+ return (ret);
+}
+
+/*
+ * Initialize file list
+ */
+void
+file_list_init(struct file_list *fl, bool tmp)
+{
+
+ if (fl) {
+ fl->count = 0;
+ fl->sz = 0;
+ fl->fns = NULL;
+ fl->tmp = tmp;
+ }
+}
+
+/*
+ * Add a file name to the list
+ */
+void
+file_list_add(struct file_list *fl, char *fn, bool allocate)
+{
+
+ if (fl && fn) {
+ if (fl->count >= fl->sz || (fl->fns == NULL)) {
+ fl->sz = (fl->sz) * 2 + 1;
+ fl->fns = sort_realloc(fl->fns, fl->sz *
+ sizeof(char *));
+ }
+ fl->fns[fl->count] = allocate ? sort_strdup(fn) : fn;
+ fl->count += 1;
+ }
+}
+
+/*
+ * Populate file list from array of file names
+ */
+void
+file_list_populate(struct file_list *fl, int argc, char **argv, bool allocate)
+{
+
+ if (fl && argv) {
+ int i;
+
+ for (i = 0; i < argc; i++)
+ file_list_add(fl, argv[i], allocate);
+ }
+}
+
+/*
+ * Clean file list data and delete the files,
+ * if this is a list of temporary files
+ */
+void
+file_list_clean(struct file_list *fl)
+{
+
+ if (fl) {
+ if (fl->fns) {
+ int i;
+
+ for (i = 0; i < fl->count; i++) {
+ if (fl->fns[i]) {
+ if (fl->tmp)
+ unlink(fl->fns[i]);
+ sort_free(fl->fns[i]);
+ fl->fns[i] = 0;
+ }
+ }
+ sort_free(fl->fns);
+ fl->fns = NULL;
+ }
+ fl->sz = 0;
+ fl->count = 0;
+ fl->tmp = false;
+ }
+}
+
+/*
+ * Init sort list
+ */
+void
+sort_list_init(struct sort_list *l)
+{
+
+ if (l) {
+ l->count = 0;
+ l->size = 0;
+ l->memsize = sizeof(struct sort_list);
+ l->list = NULL;
+ }
+}
+
+/*
+ * Add string to sort list
+ */
+void
+sort_list_add(struct sort_list *l, struct bwstring *str)
+{
+
+ if (l && str) {
+ size_t indx = l->count;
+
+ if ((l->list == NULL) || (indx >= l->size)) {
+ int newsize = (l->size + 1) + 1024;
+
+ l->list = sort_realloc(l->list,
+ sizeof(struct sort_list_item*) * newsize);
+ l->memsize += (newsize - l->size) *
+ sizeof(struct sort_list_item*);
+ l->size = newsize;
+ }
+ l->list[indx] = sort_list_item_alloc();
+ sort_list_item_set(l->list[indx], str);
+ l->memsize += sort_list_item_size(l->list[indx]);
+ l->count += 1;
+ }
+}
+
+/*
+ * Clean sort list data
+ */
+void
+sort_list_clean(struct sort_list *l)
+{
+
+ if (l) {
+ if (l->list) {
+ size_t i;
+
+ for (i = 0; i < l->count; i++) {
+ struct sort_list_item *item;
+
+ item = l->list[i];
+
+ if (item) {
+ sort_list_item_clean(item);
+ sort_free(item);
+ l->list[i] = NULL;
+ }
+ }
+ sort_free(l->list);
+ l->list = NULL;
+ }
+ l->count = 0;
+ l->size = 0;
+ l->memsize = sizeof(struct sort_list);
+ }
+}
+
+/*
+ * Write sort list to file
+ */
+void
+sort_list_dump(struct sort_list *l, const char *fn)
+{
+
+ if (l && fn) {
+ FILE *f;
+
+ f = openfile(fn, "w");
+ if (f == NULL)
+ err(2, NULL);
+
+ if (l->list) {
+ size_t i;
+ if (!(sort_opts_vals.uflag)) {
+ for (i = 0; i < l->count; ++i)
+ bwsfwrite(l->list[i]->str, f,
+ sort_opts_vals.zflag);
+ } else {
+ struct sort_list_item *last_printed_item = NULL;
+ struct sort_list_item *item;
+ for (i = 0; i < l->count; ++i) {
+ item = l->list[i];
+ if ((last_printed_item == NULL) ||
+ list_coll(&last_printed_item, &item)) {
+ bwsfwrite(item->str, f, sort_opts_vals.zflag);
+ last_printed_item = item;
+ }
+ }
+ }
+ }
+
+ closefile(f, fn);
+ }
+}
+
+/*
+ * Checks if the given file is sorted. Stops at the first disorder,
+ * prints the disordered line and returns 1.
+ */
+int
+check(const char *fn)
+{
+ struct bwstring *s1, *s2, *s1disorder, *s2disorder;
+ struct file_reader *fr;
+ struct keys_array *ka1, *ka2;
+ int res, pos, posdisorder;
+
+ s1 = s2 = s1disorder = s2disorder = NULL;
+ ka1 = ka2 = NULL;
+
+ fr = file_reader_init(fn);
+
+ res = 0;
+ pos = 1;
+ posdisorder = 1;
+
+ if (fr == NULL) {
+ err(2, NULL);
+ goto end;
+ }
+
+ s1 = file_reader_readline(fr);
+ if (s1 == NULL)
+ goto end;
+
+ ka1 = keys_array_alloc();
+ preproc(s1, ka1);
+
+ s2 = file_reader_readline(fr);
+ if (s2 == NULL)
+ goto end;
+
+ ka2 = keys_array_alloc();
+ preproc(s2, ka2);
+
+ for (;;) {
+
+ if (debug_sort) {
+ bwsprintf(stdout, s2, "s1=<", ">");
+ bwsprintf(stdout, s1, "s2=<", ">");
+ }
+ int cmp = key_coll(ka2, ka1, 0);
+ if (debug_sort)
+ printf("; cmp1=%d", cmp);
+
+ if (!cmp && sort_opts_vals.complex_sort &&
+ !(sort_opts_vals.uflag) && !(sort_opts_vals.sflag)) {
+ cmp = top_level_str_coll(s2, s1);
+ if (debug_sort)
+ printf("; cmp2=%d", cmp);
+ }
+ if (debug_sort)
+ printf("\n");
+
+ if ((sort_opts_vals.uflag && (cmp <= 0)) || (cmp < 0)) {
+ if (!(sort_opts_vals.csilentflag)) {
+ s2disorder = bwsdup(s2);
+ posdisorder = pos;
+ if (debug_sort)
+ s1disorder = bwsdup(s1);
+ }
+ res = 1;
+ goto end;
+ }
+
+ pos++;
+
+ clean_keys_array(s1, ka1);
+ sort_free(ka1);
+ ka1 = ka2;
+ ka2 = NULL;
+
+ bwsfree(s1);
+ s1 = s2;
+
+ s2 = file_reader_readline(fr);
+ if (s2 == NULL)
+ goto end;
+
+ ka2 = keys_array_alloc();
+ preproc(s2, ka2);
+ }
+
+end:
+ if (ka1) {
+ clean_keys_array(s1, ka1);
+ sort_free(ka1);
+ }
+
+ if (s1)
+ bwsfree(s1);
+
+ if (ka2) {
+ clean_keys_array(s2, ka2);
+ sort_free(ka2);
+ }
+
+ if (s2)
+ bwsfree(s2);
+
+ if ((fn == NULL) || (*fn == 0) || (strcmp(fn, "-") == 0)) {
+ for (;;) {
+ s2 = file_reader_readline(fr);
+ if (s2 == NULL)
+ break;
+ bwsfree(s2);
+ }
+ }
+
+ file_reader_free(fr);
+
+ if (s2disorder) {
+ bws_disorder_warnx(s2disorder, fn, posdisorder);
+ if (s1disorder) {
+ bws_disorder_warnx(s1disorder, fn, posdisorder);
+ if (s1disorder != s2disorder)
+ bwsfree(s1disorder);
+ }
+ bwsfree(s2disorder);
+ s1disorder = NULL;
+ s2disorder = NULL;
+ }
+
+ if (res)
+ exit(res);
+
+ return (0);
+}
+
+/*
+ * Opens a file. If the given filename is "-", stdout will be
+ * opened.
+ */
+FILE *
+openfile(const char *fn, const char *mode)
+{
+ FILE *file;
+
+ if (strcmp(fn, "-") == 0) {
+ return ((mode && mode[0] == 'r') ? stdin : stdout);
+ } else {
+ mode_t orig_file_mask = 0;
+ int is_tmp = file_is_tmp(fn);
+
+ if (is_tmp && (mode[0] == 'w'))
+ orig_file_mask = umask(S_IWGRP | S_IWOTH |
+ S_IRGRP | S_IROTH);
+
+ if (is_tmp && (compress_program != NULL)) {
+ char *cmd;
+ size_t cmdsz;
+
+ cmdsz = strlen(fn) + 128;
+ cmd = sort_malloc(cmdsz);
+
+ fflush(stdout);
+
+ if (mode[0] == 'r')
+ snprintf(cmd, cmdsz - 1, "cat %s | %s -d",
+ fn, compress_program);
+ else if (mode[0] == 'w')
+ snprintf(cmd, cmdsz - 1, "%s > %s",
+ compress_program, fn);
+ else
+ err(2, "%s", getstr(7));
+
+ if ((file = popen(cmd, mode)) == NULL)
+ err(2, NULL);
+
+ sort_free(cmd);
+
+ } else
+ if ((file = fopen(fn, mode)) == NULL)
+ err(2, NULL);
+
+ if (is_tmp && (mode[0] == 'w'))
+ umask(orig_file_mask);
+ }
+
+ return (file);
+}
+
+/*
+ * Close file
+ */
+void
+closefile(FILE *f, const char *fn)
+{
+ if (f == NULL) {
+ ;
+ } else if (f == stdin) {
+ ;
+ } else if (f == stdout) {
+ fflush(f);
+ } else {
+ if (file_is_tmp(fn) && compress_program != NULL) {
+ if(pclose(f)<0)
+ err(2,NULL);
+ } else
+ fclose(f);
+ }
+}
+
+/*
+ * Reads a file into the internal buffer.
+ */
+struct file_reader *
+file_reader_init(const char *fsrc)
+{
+ struct file_reader *ret;
+
+ if (fsrc == NULL)
+ fsrc = "-";
+
+ ret = sort_malloc(sizeof(struct file_reader));
+ memset(ret, 0, sizeof(struct file_reader));
+
+ ret->elsymb = '\n';
+ if (sort_opts_vals.zflag)
+ ret->elsymb = 0;
+
+ ret->fname = sort_strdup(fsrc);
+
+ if (strcmp(fsrc, "-") && (compress_program == NULL) && use_mmap) {
+
+ do {
+ struct stat stat_buf;
+ void *addr;
+ size_t sz = 0;
+ int fd, flags;
+
+ flags = MAP_NOCORE | MAP_NOSYNC;
+ addr = MAP_FAILED;
+
+ fd = open(fsrc, O_RDONLY);
+ if (fd < 0)
+ err(2, NULL);
+
+ if (fstat(fd, &stat_buf) < 0) {
+ close(fd);
+ break;
+ }
+
+ sz = stat_buf.st_size;
+
+#if defined(MAP_PREFAULT_READ)
+ flags |= MAP_PREFAULT_READ;
+#endif
+
+ addr = mmap(NULL, sz, PROT_READ, flags, fd, 0);
+ if (addr == MAP_FAILED) {
+ close(fd);
+ break;
+ }
+
+ ret->fd = fd;
+ ret->mmapaddr = addr;
+ ret->mmapsize = sz;
+ ret->mmapptr = ret->mmapaddr;
+
+ } while (0);
+ }
+
+ if (ret->mmapaddr == NULL) {
+ ret->file = openfile(fsrc, "r");
+ if (ret->file == NULL)
+ err(2, NULL);
+
+ if (strcmp(fsrc, "-")) {
+ ret->cbsz = READ_CHUNK;
+ ret->buffer = sort_malloc(ret->cbsz);
+ ret->bsz = 0;
+ ret->strbeg = 0;
+
+ ret->bsz = fread(ret->buffer, 1, ret->cbsz, ret->file);
+ if (ret->bsz == 0) {
+ if (ferror(ret->file))
+ err(2, NULL);
+ }
+ }
+ }
+
+ return (ret);
+}
+
+struct bwstring *
+file_reader_readline(struct file_reader *fr)
+{
+ struct bwstring *ret = NULL;
+
+ if (fr->mmapaddr) {
+ unsigned char *mmapend;
+
+ mmapend = fr->mmapaddr + fr->mmapsize;
+ if (fr->mmapptr >= mmapend)
+ return (NULL);
+ else {
+ unsigned char *strend;
+ size_t sz;
+
+ sz = mmapend - fr->mmapptr;
+ strend = memchr(fr->mmapptr, fr->elsymb, sz);
+
+ if (strend == NULL) {
+ ret = bwscsbdup(fr->mmapptr, sz);
+ fr->mmapptr = mmapend;
+ } else {
+ ret = bwscsbdup(fr->mmapptr, strend -
+ fr->mmapptr);
+ fr->mmapptr = strend + 1;
+ }
+ }
+
+ } else if (fr->file != stdin) {
+ unsigned char *strend;
+ size_t bsz1, remsz, search_start;
+
+ search_start = 0;
+ remsz = 0;
+ strend = NULL;
+
+ if (fr->bsz > fr->strbeg)
+ remsz = fr->bsz - fr->strbeg;
+
+ /* line read cycle */
+ for (;;) {
+ if (remsz > search_start)
+ strend = memchr(fr->buffer + fr->strbeg +
+ search_start, fr->elsymb, remsz -
+ search_start);
+ else
+ strend = NULL;
+
+ if (strend)
+ break;
+ if (feof(fr->file))
+ break;
+
+ if (fr->bsz != fr->cbsz)
+ /* NOTREACHED */
+ err(2, "File read software error 1");
+
+ if (remsz > (READ_CHUNK >> 1)) {
+ search_start = fr->cbsz - fr->strbeg;
+ fr->cbsz += READ_CHUNK;
+ fr->buffer = sort_realloc(fr->buffer,
+ fr->cbsz);
+ bsz1 = fread(fr->buffer + fr->bsz, 1,
+ READ_CHUNK, fr->file);
+ if (bsz1 == 0) {
+ if (ferror(fr->file))
+ err(2, NULL);
+ break;
+ }
+ fr->bsz += bsz1;
+ remsz += bsz1;
+ } else {
+ if (remsz > 0 && fr->strbeg>0)
+ bcopy(fr->buffer + fr->strbeg,
+ fr->buffer, remsz);
+
+ fr->strbeg = 0;
+ search_start = remsz;
+ bsz1 = fread(fr->buffer + remsz, 1,
+ fr->cbsz - remsz, fr->file);
+ if (bsz1 == 0) {
+ if (ferror(fr->file))
+ err(2, NULL);
+ break;
+ }
+ fr->bsz = remsz + bsz1;
+ remsz = fr->bsz;
+ }
+ }
+
+ if (strend == NULL)
+ strend = fr->buffer + fr->bsz;
+
+ if ((fr->buffer + fr->strbeg <= strend) &&
+ (fr->strbeg < fr->bsz) && (remsz>0))
+ ret = bwscsbdup(fr->buffer + fr->strbeg, strend -
+ fr->buffer - fr->strbeg);
+
+ fr->strbeg = (strend - fr->buffer) + 1;
+
+ } else {
+ size_t len = 0;
+
+ ret = bwsfgetln(fr->file, &len, sort_opts_vals.zflag,
+ &(fr->rb));
+ }
+
+ return (ret);
+}
+
+static void
+file_reader_clean(struct file_reader *fr)
+{
+
+ if (fr) {
+ if (fr->mmapaddr)
+ munmap(fr->mmapaddr, fr->mmapsize);
+
+ if (fr->fd)
+ close(fr->fd);
+
+ if (fr->buffer)
+ sort_free(fr->buffer);
+
+ if (fr->file)
+ if (fr->file != stdin)
+ closefile(fr->file, fr->fname);
+
+ if(fr->fname)
+ sort_free(fr->fname);
+
+ memset(fr, 0, sizeof(struct file_reader));
+ }
+}
+
+void
+file_reader_free(struct file_reader *fr)
+{
+
+ if (fr) {
+ file_reader_clean(fr);
+ sort_free(fr);
+ }
+}
+
+int
+procfile(const char *fsrc, struct sort_list *list, struct file_list *fl)
+{
+ struct file_reader *fr;
+
+ fr = file_reader_init(fsrc);
+ if (fr == NULL)
+ err(2, NULL);
+
+ /* file browse cycle */
+ for (;;) {
+ struct bwstring *bws;
+
+ bws = file_reader_readline(fr);
+
+ if (bws == NULL)
+ break;
+
+ sort_list_add(list, bws);
+
+ if (list->memsize >= available_free_memory) {
+ char *fn;
+
+ fn = new_tmp_file_name();
+ sort_list_to_file(list, fn);
+ file_list_add(fl, fn, false);
+ sort_list_clean(list);
+ }
+ }
+
+ file_reader_free(fr);
+
+ return (0);
+}
+
+/*
+ * Compare file headers. Files with EOF always go to the end of the list.
+ */
+static int
+file_header_cmp(struct file_header *f1, struct file_header *f2)
+{
+
+ if (f1 == f2)
+ return (0);
+ else {
+ if (f1->fr == NULL) {
+ return ((f2->fr == NULL) ? 0 : +1);
+ } else if (f2->fr == NULL)
+ return (-1);
+ else {
+ int ret;
+
+ ret = list_coll(&(f1->si), &(f2->si));
+ if (!ret)
+ return ((f1->file_pos < f2->file_pos) ? -1 : +1);
+ return (ret);
+ }
+ }
+}
+
+/*
+ * Allocate and init file header structure
+ */
+static void
+file_header_init(struct file_header **fh, const char *fn, size_t file_pos)
+{
+
+ if (fh && fn) {
+ struct bwstring *line;
+
+ *fh = sort_malloc(sizeof(struct file_header));
+ (*fh)->file_pos = file_pos;
+ (*fh)->fr = file_reader_init(fn);
+ if ((*fh)->fr == NULL) {
+ perror(fn);
+ err(2, "%s", getstr(8));
+ }
+ line = file_reader_readline((*fh)->fr);
+ if (line == NULL) {
+ file_reader_free((*fh)->fr);
+ (*fh)->fr = NULL;
+ (*fh)->si = NULL;
+ } else {
+ (*fh)->si = sort_list_item_alloc();
+ sort_list_item_set((*fh)->si, line);
+ }
+ }
+}
+
+/*
+ * Close file
+ */
+static void
+file_header_close(struct file_header **fh)
+{
+
+ if (fh && *fh) {
+ if ((*fh)->fr) {
+ file_reader_free((*fh)->fr);
+ (*fh)->fr = NULL;
+ }
+ if ((*fh)->si) {
+ sort_list_item_clean((*fh)->si);
+ sort_free((*fh)->si);
+ (*fh)->si = NULL;
+ }
+ sort_free(*fh);
+ *fh = NULL;
+ }
+}
+
+/*
+ * Swap two array elements
+ */
+static void
+file_header_swap(struct file_header **fh, int i1, int i2)
+{
+ struct file_header *tmp;
+
+ tmp = fh[i1];
+ fh[i1] = fh[i2];
+ fh[i2] = tmp;
+}
+
+/* heap algorithm ==>> */
+
+/*
+ * See heap sort algorithm
+ * "Raises" last element to its right place
+ */
+static void
+file_header_heap_swim(struct file_header **fh, int indx)
+{
+
+ if (indx > 0) {
+ int parent_index;
+
+ parent_index = (indx - 1) >> 1;
+
+ if (file_header_cmp(fh[indx], fh[parent_index]) < 0) {
+ /* swap child and parent and continue */
+ file_header_swap(fh, indx, parent_index);
+ file_header_heap_swim(fh, parent_index);
+ }
+ }
+}
+
+/*
+ * Sink the top element to its correct position
+ */
+static void
+file_header_heap_sink(struct file_header **fh, int indx, int size)
+{
+ int left_child_index;
+ int right_child_index;
+
+ left_child_index = indx + indx + 1;
+ right_child_index = left_child_index + 1;
+
+ if (left_child_index < size) {
+ int min_child_index;
+
+ min_child_index = left_child_index;
+
+ if ((right_child_index < size) &&
+ (file_header_cmp(fh[left_child_index],
+ fh[right_child_index]) > 0))
+ min_child_index = right_child_index;
+ if (file_header_cmp(fh[indx], fh[min_child_index]) > 0) {
+ file_header_swap(fh, indx, min_child_index);
+ file_header_heap_sink(fh, min_child_index, size);
+ }
+ }
+}
+
+/* <<== heap algorithm */
+
+/*
+ * Adds element to the "left" end
+ */
+static void
+file_header_list_rearrange_from_header(struct file_header **fh, int size)
+{
+
+ file_header_heap_sink(fh, 0, size);
+}
+
+/*
+ * Adds element to the "right" end
+ */
+static void
+file_header_list_push(struct file_header *f, struct file_header **fh, int size)
+{
+
+ fh[size++] = f;
+ file_header_heap_swim(fh, size - 1);
+}
+
+struct last_printed
+{
+ struct bwstring *str;
+};
+
+/*
+ * Prints the current line of the file
+ */
+static void
+file_header_print(struct file_header *fh, FILE *f_out, struct last_printed *lp)
+{
+
+ if (fh && fh->fr && f_out && fh->si && fh->si->str) {
+ if (sort_opts_vals.uflag) {
+ if ((lp->str == NULL) || (str_list_coll(lp->str, &(fh->si)))) {
+ bwsfwrite(fh->si->str, f_out, sort_opts_vals.zflag);
+ if (lp->str)
+ bwsfree(lp->str);
+ lp->str = bwsdup(fh->si->str);
+ }
+ } else
+ bwsfwrite(fh->si->str, f_out, sort_opts_vals.zflag);
+ }
+}
+
+/*
+ * Read next line
+ */
+static void
+file_header_read_next(struct file_header *fh)
+{
+
+ if (fh && fh->fr) {
+ struct bwstring *tmp;
+
+ tmp = file_reader_readline(fh->fr);
+ if (tmp == NULL) {
+ file_reader_free(fh->fr);
+ fh->fr = NULL;
+ if (fh->si) {
+ sort_list_item_clean(fh->si);
+ sort_free(fh->si);
+ fh->si = NULL;
+ }
+ } else {
+ if (fh->si == NULL)
+ fh->si = sort_list_item_alloc();
+ sort_list_item_set(fh->si, tmp);
+ }
+ }
+}
+
+/*
+ * Merge array of "files headers"
+ */
+static void
+file_headers_merge(int fnum, struct file_header **fh, FILE *f_out)
+{
+ struct last_printed lp;
+ int i;
+
+ memset(&lp, 0, sizeof(lp));
+
+ /*
+ * construct the initial sort structure
+ */
+ for (i = 0; i < fnum; i++)
+ file_header_list_push(fh[i], fh, i);
+
+ while (fh[0]->fr) { /* unfinished files are always in front */
+ /* output the smallest line: */
+ file_header_print(fh[0], f_out, &lp);
+ /* read a new line, if possible: */
+ file_header_read_next(fh[0]);
+ /* re-arrange the list: */
+ file_header_list_rearrange_from_header(fh, fnum);
+ }
+
+ if (lp.str)
+ bwsfree(lp.str);
+}
+
+/*
+ * Merges the given files into the output file, which can be
+ * stdout.
+ */
+static void
+merge_files_array(int argc, char **argv, const char *fn_out)
+{
+
+ if (argv && fn_out) {
+ struct file_header **fh;
+ FILE *f_out;
+ int i;
+
+ f_out = openfile(fn_out, "w");
+
+ if (f_out == NULL)
+ err(2, NULL);
+
+ fh = sort_malloc((argc + 1) * sizeof(struct file_header *));
+
+ for (i = 0; i < argc; i++)
+ file_header_init(fh + i, argv[i], (size_t) i);
+
+ file_headers_merge(argc, fh, f_out);
+
+ for (i = 0; i < argc; i++)
+ file_header_close(fh + i);
+
+ sort_free(fh);
+
+ closefile(f_out, fn_out);
+ }
+}
+
+/*
+ * Shrinks the file list until its size smaller than max number of opened files
+ */
+static int
+shrink_file_list(struct file_list *fl)
+{
+
+ if ((fl == NULL) || (size_t) (fl->count) < max_open_files)
+ return (0);
+ else {
+ struct file_list new_fl;
+ int indx = 0;
+
+ file_list_init(&new_fl, true);
+ while (indx < fl->count) {
+ char *fnew;
+ int num;
+
+ num = fl->count - indx;
+ fnew = new_tmp_file_name();
+
+ if ((size_t) num >= max_open_files)
+ num = max_open_files - 1;
+ merge_files_array(num, fl->fns + indx, fnew);
+ if (fl->tmp) {
+ int i;
+
+ for (i = 0; i < num; i++)
+ unlink(fl->fns[indx + i]);
+ }
+ file_list_add(&new_fl, fnew, false);
+ indx += num;
+ }
+ fl->tmp = false; /* already taken care of */
+ file_list_clean(fl);
+
+ fl->count = new_fl.count;
+ fl->fns = new_fl.fns;
+ fl->sz = new_fl.sz;
+ fl->tmp = new_fl.tmp;
+
+ return (1);
+ }
+}
+
+/*
+ * Merge list of files
+ */
+void
+merge_files(struct file_list *fl, const char *fn_out)
+{
+
+ if (fl && fn_out) {
+ while (shrink_file_list(fl));
+
+ merge_files_array(fl->count, fl->fns, fn_out);
+ }
+}
+
+static const char *
+get_sort_method_name(int sm)
+{
+
+ if (sm == SORT_MERGESORT)
+ return "mergesort";
+ else if (sort_opts_vals.sort_method == SORT_RADIXSORT)
+ return "radixsort";
+ else if (sort_opts_vals.sort_method == SORT_HEAPSORT)
+ return "heapsort";
+ else
+ return "quicksort";
+}
+
+/*
+ * Wrapper for qsort
+ */
+static int sort_qsort(void *list, size_t count, size_t elem_size,
+ int (*cmp_func)(const void *, const void *))
+{
+
+ qsort(list, count, elem_size, cmp_func);
+ return (0);
+}
+
+/*
+ * Sort list of lines and writes it to the file
+ */
+void
+sort_list_to_file(struct sort_list *list, const char *outfile)
+{
+ struct sort_mods *sm = &(keys[0].sm);
+
+ if (!(sm->Mflag) && !(sm->Rflag) && !(sm->Vflag) && !(sm->Vflag) &&
+ !(sm->gflag) && !(sm->hflag) && !(sm->nflag)) {
+ if ((sort_opts_vals.sort_method == SORT_DEFAULT) && byte_sort)
+ sort_opts_vals.sort_method = SORT_RADIXSORT;
+
+ } else if (sort_opts_vals.sort_method == SORT_RADIXSORT)
+ err(2, "%s", getstr(9));
+
+ /*
+ * to handle stable sort and the unique cases in the
+ * right order, we need stable basic algorithm
+ */
+ if (sort_opts_vals.sflag) {
+ switch (sort_opts_vals.sort_method){
+ case SORT_MERGESORT:
+ break;
+ case SORT_RADIXSORT:
+ break;
+ case SORT_DEFAULT:
+ sort_opts_vals.sort_method = SORT_MERGESORT;
+ break;
+ default:
+ errx(2, "%s", getstr(10));
+ };
+ }
+
+ if (sort_opts_vals.sort_method == SORT_DEFAULT)
+ sort_opts_vals.sort_method = DEFAULT_SORT_ALGORITHM;
+
+ if (debug_sort)
+ printf("sort_method=%s\n",
+ get_sort_method_name(sort_opts_vals.sort_method));
+
+ switch (sort_opts_vals.sort_method){
+ case SORT_RADIXSORT:
+ rxsort(list->list, list->count);
+ sort_list_dump(list, outfile);
+ break;
+ case SORT_MERGESORT:
+ mt_sort(list, mergesort, outfile);
+ break;
+ case SORT_HEAPSORT:
+ mt_sort(list, heapsort, outfile);
+ break;
+ case SORT_QSORT:
+ mt_sort(list, sort_qsort, outfile);
+ break;
+ default:
+ mt_sort(list, DEFAULT_SORT_FUNC, outfile);
+ break;
+ }
+}
+
+/******************* MT SORT ************************/
+
+#if defined(SORT_THREADS)
+/* semaphore to count threads */
+static sem_t mtsem;
+
+/* current system sort function */
+static int (*g_sort_func)(void *, size_t, size_t,
+ int(*)(const void *, const void *));
+
+/*
+ * Sort cycle thread (in multi-threaded mode)
+ */
+static void*
+mt_sort_thread(void* arg)
+{
+ struct sort_list *list = arg;
+
+ g_sort_func(list->list, list->count, sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) list_coll);
+
+ sem_post(&mtsem);
+
+ return (arg);
+}
+
+/*
+ * Compare sub-lists. Empty sub-lists always go to the end of the list.
+ */
+static int
+sub_list_cmp(struct sort_list *l1, struct sort_list *l2)
+{
+
+ if (l1 == l2)
+ return (0);
+ else {
+ if (l1->count == 0) {
+ return ((l2->count == 0) ? 0 : +1);
+ } else if (l2->count == 0) {
+ return (-1);
+ } else {
+ int ret;
+
+ ret = list_coll(&(l1->list[0]), &(l2->list[0]));
+ if (!ret)
+ return ((l1->sub_list_pos < l2->sub_list_pos) ?
+ -1 : +1);
+ return (ret);
+ }
+ }
+}
+
+/*
+ * Swap two array elements
+ */
+static void
+sub_list_swap(struct sort_list **sl, int i1, int i2)
+{
+ struct sort_list *tmp;
+
+ tmp = sl[i1];
+ sl[i1] = sl[i2];
+ sl[i2] = tmp;
+}
+
+/* heap algorithm ==>> */
+
+/*
+ * See heap sort algorithm
+ * "Raises" last element to its right place
+ */
+static void
+sub_list_swim(struct sort_list **sl, int indx)
+{
+
+ if (indx > 0) {
+ int parent_index;
+
+ parent_index = (indx - 1) >> 1;
+
+ if (sub_list_cmp(sl[indx], sl[parent_index]) < 0) {
+ /* swap child and parent and continue */
+ sub_list_swap(sl, indx, parent_index);
+ sub_list_swim(sl, parent_index);
+ }
+ }
+}
+
+/*
+ * Sink the top element to its correct position
+ */
+static void
+sub_list_sink(struct sort_list **sl, int indx, int size)
+{
+ int left_child_index;
+ int right_child_index;
+
+ left_child_index = indx + indx + 1;
+ right_child_index = left_child_index + 1;
+
+ if (left_child_index < size) {
+ int min_child_index;
+
+ min_child_index = left_child_index;
+
+ if ((right_child_index < size) &&
+ (sub_list_cmp(sl[left_child_index],
+ sl[right_child_index]) > 0))
+ min_child_index = right_child_index;
+ if (sub_list_cmp(sl[indx], sl[min_child_index]) > 0) {
+ sub_list_swap(sl, indx, min_child_index);
+ sub_list_sink(sl, min_child_index, size);
+ }
+ }
+}
+
+/* <<== heap algorithm */
+
+/*
+ * Adds element to the "right" end
+ */
+static void
+sub_list_push(struct sort_list *s, struct sort_list **sl, int size)
+{
+
+ sl[size++] = s;
+ sub_list_swim(sl, size - 1);
+}
+
+struct last_printed_item
+{
+ struct sort_list_item *item;
+};
+
+/*
+ * Prints the current line of the file
+ */
+static void
+sub_list_header_print(struct sort_list *sl, FILE *f_out,
+ struct last_printed_item *lp)
+{
+
+ if (sl && sl->count && f_out && sl->list[0]->str) {
+ if (sort_opts_vals.uflag) {
+ if ((lp->item == NULL) || (list_coll(&(lp->item),
+ &(sl->list[0])))) {
+ bwsfwrite(sl->list[0]->str, f_out,
+ sort_opts_vals.zflag);
+ lp->item = sl->list[0];
+ }
+ } else
+ bwsfwrite(sl->list[0]->str, f_out,
+ sort_opts_vals.zflag);
+ }
+}
+
+/*
+ * Read next line
+ */
+static void
+sub_list_next(struct sort_list *sl)
+{
+
+ if (sl && sl->count) {
+ sl->list += 1;
+ sl->count -= 1;
+ }
+}
+
+/*
+ * Merge sub-lists to a file
+ */
+static void
+merge_sub_lists(struct sort_list **sl, size_t n, FILE* f_out)
+{
+ struct last_printed_item lp;
+ size_t i;
+
+ memset(&lp,0,sizeof(lp));
+
+ /* construct the initial list: */
+ for (i = 0; i < n; i++)
+ sub_list_push(sl[i], sl, i);
+
+ while (sl[0]->count) { /* unfinished lists are always in front */
+ /* output the smallest line: */
+ sub_list_header_print(sl[0], f_out, &lp);
+ /* move to a new line, if possible: */
+ sub_list_next(sl[0]);
+ /* re-arrange the list: */
+ sub_list_sink(sl, 0, n);
+ }
+}
+
+/*
+ * Merge sub-lists to a file
+ */
+static void
+merge_list_parts(struct sort_list **parts, size_t n, const char *fn)
+{
+ FILE* f_out;
+
+ f_out = openfile(fn,"w");
+
+ merge_sub_lists(parts, n, f_out);
+
+ closefile(f_out, fn);
+}
+
+#endif /* defined(SORT_THREADS) */
+/*
+ * Multi-threaded sort algorithm "driver"
+ */
+static void
+mt_sort(struct sort_list *list,
+ int(*sort_func)(void *, size_t, size_t, int(*)(const void *, const void *)),
+ const char* fn)
+{
+#if defined(SORT_THREADS)
+ if (nthreads < 2 || list->count < MT_SORT_THRESHOLD) {
+ size_t nthreads_save = nthreads;
+ nthreads = 1;
+#endif
+ /* if single thread or small data, do simple sort */
+ sort_func(list->list, list->count,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) list_coll);
+ sort_list_dump(list, fn);
+#if defined(SORT_THREADS)
+ nthreads = nthreads_save;
+ } else {
+ /* multi-threaded sort */
+ struct sort_list **parts;
+ size_t avgsize, cstart, i;
+
+ /* array of sub-lists */
+ parts = sort_malloc(sizeof(struct sort_list*) * nthreads);
+ cstart = 0;
+ avgsize = list->count / nthreads;
+
+ /* set global system sort function */
+ g_sort_func = sort_func;
+
+ /* set sublists */
+ for (i = 0; i < nthreads; ++i) {
+ size_t sz = 0;
+
+ parts[i] = sort_malloc(sizeof(struct sort_list));
+ parts[i]->list = list->list + cstart;
+ parts[i]->memsize = 0;
+ parts[i]->sub_list_pos = i;
+
+ sz = (i == nthreads - 1) ? list->count - cstart :
+ avgsize;
+
+ parts[i]->count = sz;
+
+ parts[i]->size = parts[i]->count;
+
+ cstart += sz;
+ }
+
+ /* init threads counting semaphore */
+ sem_init(&mtsem, 0, 0);
+
+ /* start threads */
+ for (i = 0; i < nthreads; ++i) {
+ pthread_t pth;
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_DETACHED);
+
+ for (;;) {
+ int res = pthread_create(&pth, &attr,
+ mt_sort_thread, parts[i]);
+
+ if (res >= 0)
+ break;
+ if (errno == EAGAIN) {
+ pthread_yield();
+ continue;
+ }
+ err(2, NULL);
+ }
+
+ pthread_attr_destroy(&attr);
+ }
+
+ /* wait for threads completion */
+ for (i = 0; i < nthreads; ++i) {
+ sem_wait(&mtsem);
+ }
+ /* destroy the semaphore - we do not need it anymore */
+ sem_destroy(&mtsem);
+
+ /* merge sorted sub-lists to the file */
+ merge_list_parts(parts, nthreads, fn);
+
+ /* free sub-lists data */
+ for (i = 0; i < nthreads; ++i) {
+ sort_free(parts[i]);
+ }
+ sort_free(parts);
+ }
+#endif /* defined(SORT_THREADS) */
+}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/file.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/file.h Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,138 @@
+/* $FreeBSD: head/usr.bin/sort/file.h 238108 2012-07-04 16:25:11Z gabor $ */
+
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__SORT_FILE_H__)
+#define __SORT_FILE_H__
+
+#include "coll.h"
+#include "sort.h"
+
+#define SORT_DEFAULT 0
+#define SORT_QSORT 1
+#define SORT_MERGESORT 2
+#define SORT_HEAPSORT 3
+#define SORT_RADIXSORT 4
+
+#define DEFAULT_SORT_ALGORITHM SORT_HEAPSORT
+#define DEFAULT_SORT_FUNC heapsort
+
+/*
+ * List of data to be sorted.
+ */
+struct sort_list
+{
+ struct sort_list_item **list;
+ unsigned long long memsize;
+ size_t count;
+ size_t size;
+ size_t sub_list_pos;
+};
+
+/*
+ * File reader object
+ */
+struct file_reader;
+
+/*
+ * List of files to be sorted
+ */
+struct file_list
+{
+ char **fns;
+ int count;
+ int sz;
+ bool tmp;
+};
+
+/*
+ * Structure for zero-separated file reading (for input files list)
+ */
+struct file0_reader
+{
+ char *current_line;
+ FILE *f;
+ size_t current_sz;
+};
+
+/* memory */
+
+/**/
+
+extern unsigned long long free_memory;
+extern unsigned long long available_free_memory;
+
+/* Are we using mmap ? */
+extern bool use_mmap;
+
+/* temporary file dir */
+
+extern const char *tmpdir;
+
+/*
+ * Max number of simultaneously open files (including the output file).
+ */
+extern size_t max_open_files;
+
+/*
+ * Compress program
+ */
+extern const char* compress_program;
+
+/* funcs */
+
+struct file_reader *file_reader_init(const char *fsrc);
+struct bwstring *file_reader_readline(struct file_reader *fr);
+void file_reader_free(struct file_reader *fr);
+
+char *read_file0_line(struct file0_reader *f0r);
+
+void init_tmp_files(void);
+void clear_tmp_files(void);
+char *new_tmp_file_name(void);
+void tmp_file_atexit(const char *tmp_file);
+
+void file_list_init(struct file_list *fl, bool tmp);
+void file_list_add(struct file_list *fl, char *fn, bool allocate);
+void file_list_populate(struct file_list *fl, int argc, char **argv, bool allocate);
+void file_list_clean(struct file_list *fl);
+
+int check(const char *);
+void merge_files(struct file_list *fl, const char *fn_out);
+FILE *openfile(const char *, const char *);
+void closefile(FILE *, const char *);
+int procfile(const char *fn, struct sort_list *list, struct file_list *fl);
+
+void sort_list_init(struct sort_list *l);
+void sort_list_add(struct sort_list *l, struct bwstring *str);
+void sort_list_clean(struct sort_list *l);
+void sort_list_dump(struct sort_list *l, const char *fn);
+
+void sort_list_to_file(struct sort_list *list, const char *outfile);
+
+#endif /* __SORT_FILE_H__ */
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/mem.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/mem.c Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,82 @@
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/usr.bin/sort/mem.c 235267 2012-05-11 12:37:16Z gabor $");
+
+#include <err.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "mem.h"
+
+/*
+ * malloc() wrapper.
+ */
+void *
+sort_malloc(size_t size)
+{
+ void *ptr;
+
+ if ((ptr = malloc(size)) == NULL)
+ err(2, NULL);
+ return (ptr);
+}
+
+/*
+ * free() wrapper.
+ */
+void
+sort_free(const void *ptr)
+{
+
+ if (ptr)
+ free(__DECONST(void *, ptr));
+}
+
+/*
+ * realloc() wrapper.
+ */
+void *
+sort_realloc(void *ptr, size_t size)
+{
+
+ if ((ptr = realloc(ptr, size)) == NULL)
+ err(2, NULL);
+ return (ptr);
+}
+
+char *
+sort_strdup(const char *str)
+{
+ char *dup;
+
+ if ((dup = strdup(str)) == NULL)
+ err(2, NULL);
+ return (dup);
+}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/mem.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/mem.h Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,45 @@
+/* $FreeBSD: head/usr.bin/sort/mem.h 235267 2012-05-11 12:37:16Z gabor $ */
+
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__SORT_MEM_H__)
+#define __SORT_MEM_H__
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+/*
+ * mem.c
+ */
+void *sort_malloc(size_t);
+void sort_free(const void *ptr);
+void *sort_realloc(void *, size_t);
+char *sort_strdup(const char *);
+
+#endif /* __SORT_MEM_H__ */
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/nls/C.msg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/nls/C.msg Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,16 @@
+$ $FreeBSD: head/usr.bin/sort/nls/C.msg 235434 2012-05-14 09:55:23Z gabor $
+$
+$set 1
+$quote "
+1 "mutually exclusive flags"
+2 "extra argument not allowed with -c"
+3 "Unknown feature"
+4 "Wrong memory buffer specification"
+5 "0 field in key specs"
+6 "0 column in key specs"
+7 "Wrong file mode"
+8 "Cannot open file for reading"
+9 "Radix sort cannot be used with these sort options"
+10 "The chosen sort method cannot be used with stable and/or unique sort"
+11 "Invalid key position"
+12 "Usage: %s [-bcCdfigMmnrsuz] [-kPOS1[,POS2] ... ] [+POS1 [-POS2]] [-S memsize] [-T tmpdir] [-t separator] [-o outfile] [--batch-size size] [--files0-from file] [--heapsort] [--mergesort] [--radixsort] [--qsort] [--nthreads thread_no] [--human-numeric-sort] [--version-sort] [--random-sort [--random-source file]] [--compress-program program] [file ...]\n"
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/nls/hu_HU.ISO8859-2.msg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/nls/hu_HU.ISO8859-2.msg Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,16 @@
+$ $FreeBSD: head/usr.bin/sort/nls/hu_HU.ISO8859-2.msg 235434 2012-05-14 09:55:23Z gabor $
+$
+$set 1
+$quote "
+1 "egymást kizáró opciók"
+2 "extra argumentum a -%c opcióval"
+3 "Ismeretlen funkció\n"
+4 "Rossz memória puffer érték"
+5 "0 mezõ a kulcsspecifikációban\n"
+6 "0 oszlop a kulcsspecifikációban\n"
+7 "Helytelen fájl mód"
+8 "A fájl nem nyitható meg olvasásra"
+9 "A radix rendezés nem használható a megadott rendezési opciókkal"
+10 "A választott rendezési mód nem használható a --stable és --unique opciókkal"
+11 "Érvénytelen kulcs pozíció"
+12 "Használat: %s [-bcCdfigMmnrsuz] [-kPOS1[,POS2] ... ] [+POS1 [-POS2]] [-S memóriaméret] [-T ideiglenes_könyvtár] [-t elválasztó] [-o kimeneti_fájl] [--batch-size méret] [--files0-from fájl] [--heapsort] [--mergesort] [--radixsort] [--qsort] [--nthreads szálak_száma] [--human-numeric-sort] [--version-sort] [--random-sort [--random-source fájl]] [--compress-program program] [fájl ...]\n"
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/radixsort.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/radixsort.c Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,691 @@
+/*-
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * Copyright (C) 2012 Gabor Kovesdan <gabor at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/usr.bin/sort/radixsort.c 238108 2012-07-04 16:25:11Z gabor $");
+
+#include <errno.h>
+#include <err.h>
+#include <langinfo.h>
+#include <math.h>
+#if defined(SORT_THREADS)
+#include <pthread.h>
+#include <semaphore.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <unistd.h>
+
+#include "coll.h"
+#include "radixsort.h"
+
+#define DEFAULT_SORT_FUNC_RADIXSORT mergesort
+
+#define TINY_NODE(sl) ((sl)->tosort_num < 65)
+#define SMALL_NODE(sl) ((sl)->tosort_num < 5)
+
+/* are we sorting in reverse order ? */
+static bool reverse_sort;
+
+/* sort sub-levels array size */
+static const size_t slsz = 256 * sizeof(struct sort_level*);
+
+/* one sort level structure */
+struct sort_level
+{
+ struct sort_level **sublevels;
+ struct sort_list_item **leaves;
+ struct sort_list_item **sorted;
+ struct sort_list_item **tosort;
+ size_t leaves_num;
+ size_t leaves_sz;
+ size_t level;
+ size_t real_sln;
+ size_t start_position;
+ size_t sln;
+ size_t tosort_num;
+ size_t tosort_sz;
+};
+
+/* stack of sort levels ready to be sorted */
+struct level_stack {
+ struct level_stack *next;
+ struct sort_level *sl;
+};
+
+static struct level_stack *g_ls;
+
+#if defined(SORT_THREADS)
+/* stack guarding mutex */
+static pthread_mutex_t g_ls_mutex;
+
+/* counter: how many items are left */
+static size_t sort_left;
+/* guarding mutex */
+static pthread_mutex_t sort_left_mutex;
+
+/* semaphore to count threads */
+static sem_t mtsem;
+
+/*
+ * Decrement items counter
+ */
+static inline void
+sort_left_dec(size_t n)
+{
+
+ pthread_mutex_lock(&sort_left_mutex);
+ sort_left -= n;
+ pthread_mutex_unlock(&sort_left_mutex);
+}
+
+/*
+ * Do we have something to sort ?
+ */
+static inline bool
+have_sort_left(void)
+{
+ bool ret;
+
+ pthread_mutex_lock(&sort_left_mutex);
+ ret = (sort_left > 0);
+ pthread_mutex_unlock(&sort_left_mutex);
+ return (ret);
+}
+
+#else
+
+#define sort_left_dec(n)
+
+#endif /* SORT_THREADS */
+
+/*
+ * Push sort level to the stack
+ */
+static inline void
+push_ls(struct sort_level* sl)
+{
+ struct level_stack *new_ls;
+
+ new_ls = sort_malloc(sizeof(struct level_stack));
+ new_ls->sl = sl;
+
+#if defined(SORT_THREADS)
+ if (nthreads > 1)
+ pthread_mutex_lock(&g_ls_mutex);
+#endif
+
+ new_ls->next = g_ls;
+ g_ls = new_ls;
+
+#if defined(SORT_THREADS)
+ if (nthreads > 1)
+ pthread_mutex_unlock(&g_ls_mutex);
+#endif
+}
+
+/*
+ * Pop sort level from the stack (single-threaded style)
+ */
+static inline struct sort_level*
+pop_ls_st(void)
+{
+ struct sort_level *sl;
+
+ if (g_ls) {
+ struct level_stack *saved_ls;
+
+ sl = g_ls->sl;
+ saved_ls = g_ls;
+ g_ls = g_ls->next;
+ sort_free(saved_ls);
+ } else
+ sl = NULL;
+
+ return (sl);
+}
+
+/*
+ * Pop sort level from the stack (multi-threaded style)
+ */
+static inline struct sort_level*
+pop_ls_mt(void)
+{
+ struct level_stack *saved_ls;
+ struct sort_level *sl;
+
+#if defined(SORT_THREADS)
+ pthread_mutex_lock(&g_ls_mutex);
+#endif
+
+ if (g_ls) {
+ sl = g_ls->sl;
+ saved_ls = g_ls;
+ g_ls = g_ls->next;
+ } else {
+ sl = NULL;
+ saved_ls = NULL;
+ }
+
+#if defined(SORT_THREADS)
+ pthread_mutex_unlock(&g_ls_mutex);
+#endif
+
+ sort_free(saved_ls);
+
+ return (sl);
+}
+
+static void
+add_to_sublevel(struct sort_level *sl, struct sort_list_item *item, int indx)
+{
+ struct sort_level *ssl;
+
+ ssl = sl->sublevels[indx];
+
+ if (ssl == NULL) {
+ ssl = sort_malloc(sizeof(struct sort_level));
+ memset(ssl, 0, sizeof(struct sort_level));
+
+ ssl->level = sl->level + 1;
+ sl->sublevels[indx] = ssl;
+
+ ++(sl->real_sln);
+ }
+
+ if (++(ssl->tosort_num) > ssl->tosort_sz) {
+ ssl->tosort_sz = ssl->tosort_num + 128;
+ ssl->tosort = sort_realloc(ssl->tosort,
+ sizeof(struct sort_list_item*) * (ssl->tosort_sz));
+ }
+
+ ssl->tosort[ssl->tosort_num - 1] = item;
+}
+
+static inline void
+add_leaf(struct sort_level *sl, struct sort_list_item *item)
+{
+
+ if (++(sl->leaves_num) > sl->leaves_sz) {
+ sl->leaves_sz = sl->leaves_num + 128;
+ sl->leaves = sort_realloc(sl->leaves,
+ (sizeof(struct sort_list_item*) * (sl->leaves_sz)));
+ }
+ sl->leaves[sl->leaves_num - 1] = item;
+}
+
+static inline int
+get_wc_index(struct sort_list_item *sli, size_t level)
+{
+ const struct bwstring *bws;
+
+ bws = sli->ka.key[0].k;
+
+ if ((BWSLEN(bws) > level))
+ return (unsigned char) BWS_GET(bws,level);
+ return (-1);
+}
+
+static void
+place_item(struct sort_level *sl, size_t item)
+{
+ struct sort_list_item *sli;
+ int c;
+
+ sli = sl->tosort[item];
+ c = get_wc_index(sli, sl->level);
+
+ if (c == -1)
+ add_leaf(sl, sli);
+ else
+ add_to_sublevel(sl, sli, c);
+}
+
+static void
+free_sort_level(struct sort_level *sl)
+{
+
+ if (sl) {
+ if (sl->leaves)
+ sort_free(sl->leaves);
+
+ if (sl->level > 0)
+ sort_free(sl->tosort);
+
+ if (sl->sublevels) {
+ struct sort_level *slc;
+ size_t sln;
+
+ sln = sl->sln;
+
+ for (size_t i = 0; i < sln; ++i) {
+ slc = sl->sublevels[i];
+ if (slc)
+ free_sort_level(slc);
+ }
+
+ sort_free(sl->sublevels);
+ }
+
+ sort_free(sl);
+ }
+}
+
+static void
+run_sort_level_next(struct sort_level *sl)
+{
+ struct sort_level *slc;
+ size_t i, sln, tosort_num;
+
+ if (sl->sublevels) {
+ sort_free(sl->sublevels);
+ sl->sublevels = NULL;
+ }
+
+ switch (sl->tosort_num){
+ case 0:
+ goto end;
+ case (1):
+ sl->sorted[sl->start_position] = sl->tosort[0];
+ sort_left_dec(1);
+ goto end;
+ case (2):
+ if (list_coll_offset(&(sl->tosort[0]), &(sl->tosort[1]),
+ sl->level) > 0) {
+ sl->sorted[sl->start_position++] = sl->tosort[1];
+ sl->sorted[sl->start_position] = sl->tosort[0];
+ } else {
+ sl->sorted[sl->start_position++] = sl->tosort[0];
+ sl->sorted[sl->start_position] = sl->tosort[1];
+ }
+ sort_left_dec(2);
+
+ goto end;
+ default:
+ if (TINY_NODE(sl) || (sl->level > 15)) {
+ listcoll_t func;
+
+ func = get_list_call_func(sl->level);
+
+ sl->leaves = sl->tosort;
+ sl->leaves_num = sl->tosort_num;
+ sl->leaves_sz = sl->leaves_num;
+ sl->leaves = sort_realloc(sl->leaves,
+ (sizeof(struct sort_list_item *) *
+ (sl->leaves_sz)));
+ sl->tosort = NULL;
+ sl->tosort_num = 0;
+ sl->tosort_sz = 0;
+ sl->sln = 0;
+ sl->real_sln = 0;
+ if (sort_opts_vals.sflag) {
+ if (mergesort(sl->leaves, sl->leaves_num,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) func) == -1)
+ /* NOTREACHED */
+ err(2, "Radix sort error 3");
+ } else
+ DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) func);
+
+ memcpy(sl->sorted + sl->start_position,
+ sl->leaves, sl->leaves_num *
+ sizeof(struct sort_list_item*));
+
+ sort_left_dec(sl->leaves_num);
+
+ goto end;
+ } else {
+ sl->tosort_sz = sl->tosort_num;
+ sl->tosort = sort_realloc(sl->tosort,
+ sizeof(struct sort_list_item*) * (sl->tosort_sz));
+ }
+ }
+
+ sl->sln = 256;
+ sl->sublevels = sort_malloc(slsz);
+ memset(sl->sublevels, 0, slsz);
+
+ sl->real_sln = 0;
+
+ tosort_num = sl->tosort_num;
+ for (i = 0; i < tosort_num; ++i)
+ place_item(sl, i);
+
+ sort_free(sl->tosort);
+ sl->tosort = NULL;
+ sl->tosort_num = 0;
+ sl->tosort_sz = 0;
+
+ if (sl->leaves_num > 1) {
+ if (keys_num > 1) {
+ if (sort_opts_vals.sflag) {
+ mergesort(sl->leaves, sl->leaves_num,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) list_coll);
+ } else {
+ DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) list_coll);
+ }
+ } else if (!sort_opts_vals.sflag && sort_opts_vals.complex_sort) {
+ DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) list_coll_by_str_only);
+ }
+ }
+
+ sl->leaves_sz = sl->leaves_num;
+ sl->leaves = sort_realloc(sl->leaves, (sizeof(struct sort_list_item *) *
+ (sl->leaves_sz)));
+
+ if (!reverse_sort) {
+ memcpy(sl->sorted + sl->start_position, sl->leaves,
+ sl->leaves_num * sizeof(struct sort_list_item*));
+ sl->start_position += sl->leaves_num;
+ sort_left_dec(sl->leaves_num);
+
+ sort_free(sl->leaves);
+ sl->leaves = NULL;
+ sl->leaves_num = 0;
+ sl->leaves_sz = 0;
+
+ sln = sl->sln;
+
+ for (i = 0; i < sln; ++i) {
+ slc = sl->sublevels[i];
+
+ if (slc) {
+ slc->sorted = sl->sorted;
+ slc->start_position = sl->start_position;
+ sl->start_position += slc->tosort_num;
+ if (SMALL_NODE(slc))
+ run_sort_level_next(slc);
+ else
+ push_ls(slc);
+ sl->sublevels[i] = NULL;
+ }
+ }
+
+ } else {
+ size_t n;
+
+ sln = sl->sln;
+
+ for (i = 0; i < sln; ++i) {
+ n = sln - i - 1;
+ slc = sl->sublevels[n];
+
+ if (slc) {
+ slc->sorted = sl->sorted;
+ slc->start_position = sl->start_position;
+ sl->start_position += slc->tosort_num;
+ if (SMALL_NODE(slc))
+ run_sort_level_next(slc);
+ else
+ push_ls(slc);
+ sl->sublevels[n] = NULL;
+ }
+ }
+
+ memcpy(sl->sorted + sl->start_position, sl->leaves,
+ sl->leaves_num * sizeof(struct sort_list_item*));
+ sort_left_dec(sl->leaves_num);
+ }
+
+end:
+ free_sort_level(sl);
+}
+
+/*
+ * Single-threaded sort cycle
+ */
+static void
+run_sort_cycle_st(void)
+{
+ struct sort_level *slc;
+
+ for (;;) {
+ slc = pop_ls_st();
+ if (slc == NULL) {
+ break;
+ }
+ run_sort_level_next(slc);
+ }
+}
+
+#if defined(SORT_THREADS)
+
+/*
+ * Multi-threaded sort cycle
+ */
+static void
+run_sort_cycle_mt(void)
+{
+ struct sort_level *slc;
+
+ for (;;) {
+ slc = pop_ls_mt();
+ if (slc == NULL) {
+ if (have_sort_left()) {
+ pthread_yield();
+ continue;
+ }
+ break;
+ }
+ run_sort_level_next(slc);
+ }
+}
+
+/*
+ * Sort cycle thread (in multi-threaded mode)
+ */
+static void*
+sort_thread(void* arg)
+{
+
+ run_sort_cycle_mt();
+
+ sem_post(&mtsem);
+
+ return (arg);
+}
+
+#endif /* defined(SORT_THREADS) */
+
+static void
+run_top_sort_level(struct sort_level *sl)
+{
+ struct sort_level *slc;
+
+ reverse_sort = sort_opts_vals.kflag ? keys[0].sm.rflag :
+ default_sort_mods->rflag;
+
+ sl->start_position = 0;
+ sl->sln = 256;
+ sl->sublevels = sort_malloc(slsz);
+ memset(sl->sublevels, 0, slsz);
+
+ for (size_t i = 0; i < sl->tosort_num; ++i)
+ place_item(sl, i);
+
+ if (sl->leaves_num > 1) {
+ if (keys_num > 1) {
+ if (sort_opts_vals.sflag) {
+ mergesort(sl->leaves, sl->leaves_num,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) list_coll);
+ } else {
+ DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) list_coll);
+ }
+ } else if (!sort_opts_vals.sflag && sort_opts_vals.complex_sort) {
+ DEFAULT_SORT_FUNC_RADIXSORT(sl->leaves, sl->leaves_num,
+ sizeof(struct sort_list_item *),
+ (int(*)(const void *, const void *)) list_coll_by_str_only);
+ }
+ }
+
+ if (!reverse_sort) {
+ memcpy(sl->tosort + sl->start_position, sl->leaves,
+ sl->leaves_num * sizeof(struct sort_list_item*));
+ sl->start_position += sl->leaves_num;
+ sort_left_dec(sl->leaves_num);
+
+ for (size_t i = 0; i < sl->sln; ++i) {
+ slc = sl->sublevels[i];
+
+ if (slc) {
+ slc->sorted = sl->tosort;
+ slc->start_position = sl->start_position;
+ sl->start_position += slc->tosort_num;
+ push_ls(slc);
+ sl->sublevels[i] = NULL;
+ }
+ }
+
+ } else {
+ size_t n;
+
+ for (size_t i = 0; i < sl->sln; ++i) {
+
+ n = sl->sln - i - 1;
+ slc = sl->sublevels[n];
+
+ if (slc) {
+ slc->sorted = sl->tosort;
+ slc->start_position = sl->start_position;
+ sl->start_position += slc->tosort_num;
+ push_ls(slc);
+ sl->sublevels[n] = NULL;
+ }
+ }
+
+ memcpy(sl->tosort + sl->start_position, sl->leaves,
+ sl->leaves_num * sizeof(struct sort_list_item*));
+
+ sort_left_dec(sl->leaves_num);
+ }
+
+#if defined(SORT_THREADS)
+ if (nthreads < 2) {
+#endif
+ run_sort_cycle_st();
+#if defined(SORT_THREADS)
+ } else {
+ size_t i;
+
+ for(i = 0; i < nthreads; ++i) {
+ pthread_attr_t attr;
+ pthread_t pth;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr,
+ PTHREAD_DETACHED);
+
+ for (;;) {
+ int res = pthread_create(&pth, &attr,
+ sort_thread, NULL);
+ if (res >= 0)
+ break;
+ if (errno == EAGAIN) {
+ pthread_yield();
+ continue;
+ }
+ err(2, NULL);
+ }
+
+ pthread_attr_destroy(&attr);
+ }
+
+ for(i = 0; i < nthreads; ++i)
+ sem_wait(&mtsem);
+ }
+#endif /* defined(SORT_THREADS) */
+}
+
+static void
+run_sort(struct sort_list_item **base, size_t nmemb)
+{
+ struct sort_level *sl;
+
+#if defined(SORT_THREADS)
+ size_t nthreads_save = nthreads;
+ if (nmemb < MT_SORT_THRESHOLD)
+ nthreads = 1;
+
+ if (nthreads > 1) {
+ pthread_mutexattr_t mattr;
+
+ pthread_mutexattr_init(&mattr);
+ pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_ADAPTIVE_NP);
+
+ pthread_mutex_init(&g_ls_mutex, &mattr);
+ pthread_mutex_init(&sort_left_mutex, &mattr);
+
+ pthread_mutexattr_destroy(&mattr);
+
+ sem_init(&mtsem, 0, 0);
+
+ }
+#endif
+
+ sl = sort_malloc(sizeof(struct sort_level));
+ memset(sl, 0, sizeof(struct sort_level));
+
+ sl->tosort = base;
+ sl->tosort_num = nmemb;
+ sl->tosort_sz = nmemb;
+
+#if defined(SORT_THREADS)
+ sort_left = nmemb;
+#endif
+
+ run_top_sort_level(sl);
+
+ free_sort_level(sl);
+
+#if defined(SORT_THREADS)
+ if (nthreads > 1) {
+ sem_destroy(&mtsem);
+ pthread_mutex_destroy(&g_ls_mutex);
+ pthread_mutex_destroy(&sort_left_mutex);
+ }
+ nthreads = nthreads_save;
+#endif
+}
+
+void
+rxsort(struct sort_list_item **base, size_t nmemb)
+{
+
+ run_sort(base, nmemb);
+}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/radixsort.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/radixsort.h Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,38 @@
+/* $FreeBSD: head/usr.bin/sort/radixsort.h 235267 2012-05-11 12:37:16Z gabor $ */
+
+/*-
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * Copyright (C) 2012 Gabor Kovesdan <gabor at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__SORT_RADIX_H__)
+#define __SORT_RADIX_H__
+
+#include "coll.h"
+#include "sort.h"
+
+void rxsort(struct sort_list_item **base, size_t nmemb);
+
+#endif /* __SORT_RADIX_H__ */
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/sort.1.in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/sort.1.in Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,638 @@
+.\" $OpenBSD: sort.1,v 1.31 2007/08/21 21:22:37 millert Exp $
+.\" $FreeBSD: head/usr.bin/sort/sort.1.in 238108 2012-07-04 16:25:11Z gabor $
+.\"
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)sort.1 8.1 (Berkeley) 6/6/93
+.\"
+.Dd July 3, 2012
+.Dt SORT 1
+.Os
+.Sh NAME
+.Nm sort
+.Nd sort or merge records (lines) of text and binary files
+.Sh SYNOPSIS
+.Nm sort
+.Bk -words
+.Op Fl bcCdfghiRMmnrsuVz
+.Sm off
+.Op Fl k\ \& Ar field1 Op , Ar field2
+.Sm on
+.Op Fl S Ar memsize
+.Ek
+.Op Fl T Ar dir
+.Op Fl t Ar char
+.Op Fl o Ar output
+.Op Ar file ...
+.Nm sort
+.Fl Fl help
+.Nm sort
+.Fl Fl version
+.Sh DESCRIPTION
+The
+.Nm
+utility sorts text and binary files by lines.
+A line is a record separated from the subsequent record by a
+newline (default) or NUL \'\\0\' character (-z option).
+A record can contain any printable or unprintable characters.
+Comparisons are based on one or more sort keys extracted from
+each line of input, and are performed lexicographically,
+according to the current locale's collating rules and the
+specified command-line options that can tune the actual
+sorting behavior.
+By default, if keys are not given,
+.Nm
+uses entire lines for comparison.
+.Pp
+The command line options are as follows:
+.Bl -tag -width Ds
+.It Fl c, Fl Fl check, Fl C, Fl Fl check=silent|quiet
+Check that the single input file is sorted.
+If the file is not sorted,
+.Nm
+produces the appropriate error messages and exits with code 1,
+otherwise returns 0.
+If
+.Fl C
+or
+.Fl Fl check=silent
+is specified,
+.Nm
+produces no output.
+This is a "silent" version of
+.Fl c.
+.It Fl m , Fl Fl merge
+Merge only.
+The input files are assumed to be pre-sorted.
+If they are not sorted the output order is undefined.
+.It Fl o Ar output , Fl Fl output Ns = Ns Ar output
+Print the output to the
+.Ar output
+file instead of the standard output.
+.It Fl S Ar size, Fl Fl buffer-size Ns = Ns Ar size
+Use
+.Ar size
+for the maximum size of the memory buffer.
+Size modifiers %,b,K,M,G,T,P,E,Z,Y can be used.
+If a memory limit is not explicitly specified,
+.Nm
+takes up to about 90% of available memory.
+If the file size is too big to fit into the memory buffer,
+the temporary disk files are used to perform the sorting.
+.It Fl T Ar dir , Fl Fl temporary-directory Ns = Ns Ar dir
+Store temporary files in the directory
+.Ar dir .
+The default path is the value of the environment variable
+.Ev TMPDIR
+or
+.Pa /var/tmp
+if
+.Ev TMPDIR
+is not defined.
+.It Fl u , Fl Fl unique
+Unique keys.
+Suppress all lines that have a key that is equal to an already
+processed one.
+This option, similarly to
+.Fl s ,
+implies a stable sort.
+If used with
+.Fl c
+or
+.Fl C ,
+.Nm
+also checks that there are no lines with duplicate keys.
+.It Fl s
+Stable sort.
+This option maintains the original record order of records that have
+and equal key.
+This is a non-standard feature, but it is widely accepted and used.
+.It Fl Fl version
+Print the version and silently exits.
+.It Fl Fl help
+Print the help text and silently exits.
+.El
+.Pp
+The following options override the default ordering rules.
+When ordering options appear independently of key field
+specifications, they apply globally to all sort keys.
+When attached to a specific key (see
+.Fl k ) ,
+the ordering options override all global ordering options for
+the key they are attahced to.
+.Bl -tag -width indent
+.It Fl b, Fl Fl ignore-leading-blanks
+Ignore leading blank characters when comparing lines.
+.It Fl d , Fl Fl dictionary-order
+Consider only blank spaces and alphanumeric characters in comparisons.
+.It Fl f , Fl Fl ignore-case
+Convert all lowercase characters to their uppercase equivalent
+before comparison, that is, perform case-independent sorting.
+.It Fl g, Fl Fl general-numeric-sort, Fl Fl sort=general-numeric
+Sort by general numerical value.
+As opposed to
+.Fl n ,
+this option handles general floating points, which have a much
+permissive format than those allowed by
+. Fl n ,
+but it has a significant performance drawback.
+.It Fl h, Fl Fl human-numeric-sort, Fl Fl sort=human-numeric
+Sort by numerical value, but take into account the SI suffix,
+if present.
+Sort first by numeric sign (negative, zero, or
+positive); then by SI suffix (either empty, or `k' or `K', or one
+of `MGTPEZY', in that order); and finally by numeric value.
+The SI suffix must immediately follow the number.
+For example, '12345K' sorts before '1M', because M is "larger" than K.
+This sort option is useful for sorting the output of a single invocation
+of 'df' command with
+.Fl h
+or
+.Fl H
+options (human-readable).
+.It Fl i , Fl Fl ignore-nonprinting
+Ignore all non-printable characters.
+.It Fl M, Fl Fl month-sort, Fl Fl sort=month
+Sort by month abbreviations.
+Unknown strings are considered smaller than the month names.
+.It Fl n , Fl Fl numeric-sort, Fl Fl sort=numeric
+Sort fields numerically by arithmetic value.
+Fields are supposed to have optional blanks in the beginning, an
+optional minus sign, zero or more digits (including decimal point and
+possible thousand separators).
+.It Fl R, Fl Fl random-sort, Fl Fl sort=random
+Sort by a random order.
+This is a random permutation of the inputs except that
+the equal keys sort together.
+It is implemented by hashing the input keys and sorting
+the hash values.
+The hash function is choosen randomly.
+The hash function is randomized by
+.Cm /dev/random
+content, or by file content if it is specified by
+.Fl Fl random-source .
+Even if multiple sort fields are specified,
+the same random hash function is used for all of them.
+.It Fl r , Fl Fl reverse
+Sort in reverse order.
+.It Fl V, Fl Fl version-sort
+Sort version numbers.
+The input lines are treated as file names in form
+PREFIX VERSION SUFFIX, where SUFFIX matches the regular expression
+"(\.([A-Za-z~][A-Za-z0-9~]*)?)*".
+The files are compared by their prefixes and versions (leading
+zeros are ignored in version numbers, see example below).
+If an input string does not match the pattern, then it is compared
+using the byte compare function.
+All string comparisions are performed in C locale, the locale
+environment setting is ignored.
+.Bl -tag -width indent
+.It Example:
+.It $ ls sort* | sort -V
+.It sort-1.022.tgz
+.It sort-1.23.tgz
+.It sort-1.23.1.tgz
+.It sort-1.024.tgz
+.It sort-1.024.003.
+.It sort-1.024.003.tgz
+.It sort-1.024.07.tgz
+.It sort-1.024.009.tgz
+.El
+.El
+.Pp
+The treatment of field separators can be altered using these options:
+.Bl -tag -width indent
+.It Fl b , Fl Fl ignore-leading-blanks
+Ignore leading blank space when determining the start
+and end of a restricted sort key (see
+.Fl k
+).
+If
+.Fl b
+is specified before the first
+.Fl k
+option, it applies globally to all key specifications.
+Otherwise,
+.Fl b
+can be attached independently to each
+.Ar field
+argument of the key specifications.
+.Fl b .
+.It Xo
+.Sm off
+.Fl k\ \& Ar field1 Op , Ar field2 , Fl Fl key Ns = Ns Ar field1 Op , Ar field2
+.Sm on
+.Xc
+Define a restricted sort key that has the starting position
+.Ar field1 ,
+and optional ending position
+.Ar field2
+of a key field.
+The
+.Fl k
+option may be specified multiple times,
+in which case subsequent keys are compared when earlier keys compare equal.
+The
+.Fl k
+option replaces the obsolete options
+.Cm \(pl Ns Ar pos1
+and
+.Fl Ns Ar pos2 ,
+but the old notation is also supported.
+.It Fl t Ar char , Fl Fl field-separator Ns = Ns Ar char
+Use
+.Ar char
+as a field separator character.
+The initial
+.Ar char
+is not considered to be part of a field when determining key offsets.
+Each occurrence of
+.Ar char
+is significant (for example,
+.Dq Ar charchar
+delimits an empty field).
+If
+.Fl t
+is not specified, the default field separator is a sequence of
+blank space characters, and consecutive blank spaces do
+.Em not
+delimit an empty field, however, the initial blank space
+.Em is
+considered part of a field when determining key offsets.
+To use NUL as field separator, use
+.Fl t
+\'\\0\'.
+.It Fl z , Fl Fl zero-terminated
+Use NUL as record separator.
+By default, records in the files are supposed to be separated by
+the newline characters.
+With this option, NUL (\'\\0\') is used as a record separator character.
+.El
+.Pp
+Other options:
+.Bl -tag -width indent
+.It Fl Fl batch-size Ns = Ns Ar num
+Specify maximum number of files that can be opened by
+.Nm
+at once.
+This option affects behavior when having many input files or using
+temporary files.
+The default value is 16.
+.It Fl Fl compress-program Ns = Ns Ar PROGRAM
+Use PROGRAM to compress temporary files.
+PROGRAM must compress standard input to standard output, when called
+without arguments.
+When called with argument
+.Fl d
+it must decompress standard input to standard output.
+If PROGRAM fails,
+.Nm
+must exit with error.
+An example of PROGRAM that can be used here is bzip2.
+.It Fl Fl random-source Ns = Ns Ar filename
+In random sort, the file content is used as the source of the 'seed' data
+for the hash function choice.
+Two invocations of random sort with the same seed data will use
+the same hash function and will produce the same result if the input is
+also identical.
+By default, file
+.Cm /dev/random
+is used.
+.It Fl Fl debug
+Print some extra information about the sorting process to the
+standard output.
+%%THREADS%%.It Fl Fl parallel
+%%THREADS%%Set the maximum number of execution threads.
+%%THREADS%%Default number equals to the number of CPUs.
+.It Fl Fl files0-from Ns = Ns Ar filename
+Take the input file list from the file
+.Ar filename.
+The file names must be separated by NUL
+(like the output produced by the command "find ... -print0").
+.It Fl Fl radixsort
+Try to use radix sort, if the sort specifications allow.
+The radix sort can only be used for trivial locales (C and POSIX),
+and it cannot be used for numeric or month sort.
+Radix sort is very fast and stable.
+.It Fl Fl mergesort
+Use mergesort.
+This is a universal algorithm that can always be used,
+but it is not always the fastest.
+.It Fl Fl qsort
+Try to use quick sort, if the sort specifications allow.
+This sort algorithm cannot be used with
+.Fl u
+and
+.Fl s .
+.It Fl Fl heapsort
+Try to use heap sort, if the sort specifications allow.
+This sort algorithm cannot be used with
+.Fl u
+and
+.Fl s .
+.It Fl Fl mmap
+Try to use file memory mapping system call.
+It may increase speed in some cases.
+.El
+.Pp
+The following operands are available:
+.Bl -tag -width indent
+.It Ar file
+The pathname of a file to be sorted, merged, or checked.
+If no
+.Ar file
+operands are specified, or if a
+.Ar file
+operand is
+.Fl ,
+the standard input is used.
+.El
+.Pp
+A field is defined as a maximal sequence of characters other than the
+field separator and record separator (newline by default).
+Initial blank spaces are included in the field unless
+.Fl b
+has been specified;
+the first blank space of a sequence of blank spaces acts as the field
+separator and is included in the field (unless
+.Fl t
+is specified).
+For example, all blank spaces at the beginning of a line are
+considered to be part of the first field.
+.Pp
+Fields are specified by the
+.Sm off
+.Fl k\ \& Ar field1 Op , Ar field2
+.Sm on
+command-line option.
+If
+.Ar field2
+is missing, the end of the key defaults to the end of the line.
+.Pp
+The arguments
+.Ar field1
+and
+.Ar field2
+have the form
+.Em m.n
+.Em (m,n > 0)
+and can be followed by one or more of the modifiers
+.Cm b , d , f , i ,
+.Cm n , g , M
+and
+.Cm r ,
+which correspond to the options discussed above.
+When
+.Cm b
+is specified it applies only to
+.Ar field1
+or
+.Ar field2
+where it is specified while the rest of the modifiers
+apply to the whole key field regardless if they are
+specified only with
+.Ar field1
+or
+.Ar field2
+or both.
+A
+.Ar field1
+position specified by
+.Em m.n
+is interpreted as the
+.Em n Ns th
+character from the beginning of the
+.Em m Ns th
+field.
+A missing
+.Em \&.n
+in
+.Ar field1
+means
+.Ql \&.1 ,
+indicating the first character of the
+.Em m Ns th
+field; if the
+.Fl b
+option is in effect,
+.Em n
+is counted from the first non-blank character in the
+.Em m Ns th
+field;
+.Em m Ns \&.1b
+refers to the first non-blank character in the
+.Em m Ns th
+field.
+.No 1\&. Ns Em n
+refers to the
+.Em n Ns th
+character from the beginning of the line;
+if
+.Em n
+is greater than the length of the line, the field is taken to be empty.
+.Pp
+.Em n Ns th
+positions are always counted from the field beginning, even if the field
+is shorter than the number of specified positions.
+Thus, the key can really start from a position in a subsequent field.
+.Pp
+A
+.Ar field2
+position specified by
+.Em m.n
+is interpreted as the
+.Em n Ns th
+character (including separators) from the beginning of the
+.Em m Ns th
+field.
+A missing
+.Em \&.n
+indicates the last character of the
+.Em m Ns th
+field;
+.Em m
+= \&0
+designates the end of a line.
+Thus the option
+.Fl k Ar v.x,w.y
+is synonymous with the obsolete option
+.Cm \(pl Ns Ar v-\&1.x-\&1
+.Fl Ns Ar w-\&1.y ;
+when
+.Em y
+is omitted,
+.Fl k Ar v.x,w
+is synonymous with
+.Cm \(pl Ns Ar v-\&1.x-\&1
+.Fl Ns Ar w\&.0 .
+The obsolete
+.Cm \(pl Ns Ar pos1
+.Fl Ns Ar pos2
+option is still supported, except for
+.Fl Ns Ar w\&.0b ,
+which has no
+.Fl k
+equivalent.
+.Sh ENVIRONMENT
+.Bl -tag -width Fl
+.It Ev LC_COLLATE
+Locale settings to be used to determine the collation for
+sorting records.
+.It Ev LC_CTYPE
+Locale settings to be used to case conversion and classification
+of characters, that is, which characters are considered
+whitespaces, etc.
+.It Ev LC_MESSAGES
+Locale settings that determine the language of output messages
+that
+.Nm
+prints out.
+.It Ev LC_NUMERIC
+Locale settings that determine the number format used in numeric sort.
+.It Ev LC_TIME
+Locale settings that determine the month format used in month sort.
+.It Ev LC_ALL
+Locale settings that override all of the above locale settings.
+This environment variable can be used to set all these settings
+to the same value at once.
+.It Ev LANG
+Used as a last resort to determine different kinds of locale-specific
+behavior if neither the respective environment variable, nor
+.Ev LC_ALL
+are set.
+%%NLS%%.It Ev NLSPATH
+%%NLS%%Path to NLS catalogs.
+.It Ev TMPDIR
+Path to the directory in which temporary files will be stored.
+Note that
+.Ev TMPDIR
+may be overridden by the
+.Fl T
+option.
+.It Ev GNUSORT_NUMERIC_COMPATIBILITY
+If defined
+.Fl t
+will not override the locale numeric symbols, that is, thousand
+separators and decimal separators.
+By default, if we specify
+.Fl t
+with the same symbol as the thousand separator or decimal point,
+the symbol will be treated as the field separator.
+Older behavior was less definite; the symbol was treated as both field
+separator and numeric separator, simultaneously.
+This environment variable enables the old behavior.
+.El
+.Sh FILES
+.Bl -tag -width Pa -compact
+.It Pa /var/tmp/.bsdsort.PID.*
+Temporary files.
+.It Pa /dev/random
+Default seed file for the random sort.
+.El
+.Sh EXIT STATUS
+The
+.Nm
+utility shall exit with one of the following values:
+.Pp
+.Bl -tag -width flag -compact
+.It 0
+Successfully sorted the input files or if used with
+.Fl c
+or
+.Fl C ,
+the input file already met the sorting criteria.
+.It 1
+On disorder (or non-uniqueness) with the
+.Fl c
+or
+.Fl C
+options.
+.It 2
+An error occurred.
+.El
+.Sh SEE ALSO
+.Xr comm 1 ,
+.Xr join 1 ,
+.Xr uniq 1 .
+.Sh STANDARDS
+The
+.Nm
+utility is compliant with the
+.St -p1003.1-2008
+specification.
+.Pp
+The flags
+.Op Fl ghRMSsTVz
+are extensions to the POSIX specification.
+.Pp
+All long options are extensions to the specification, some of them are
+provided for compatibility with GNU versions and some of them are
+own extensions.
+.Pp
+The old key notations
+.Cm \(pl Ns Ar pos1
+and
+.Fl Ns Ar pos2
+come from older versions of
+.Nm
+and are still supported but their use is highly discouraged.
+.Sh HISTORY
+A
+.Nm
+command first appeared in
+.At v3 .
+.Sh AUTHORS
+Gabor Kovesdan <gabor at FreeBSD.org>,
+.Pp
+Oleg Moskalenko <oleg.moskalenko at citrix.com>
+.Sh NOTES
+This implementation of
+.Nm
+has no limits on input line length (other than imposed by available
+memory) or any restrictions on bytes allowed within lines.
+.Pp
+The performance depends highly on locale settings,
+efficient choice of sort keys and key complexity.
+The fastest sort is with locale C, on whole lines,
+with option
+.Fl s.
+In general, locale C is the fastest, then single-byte
+locales follow and multi-byte locales as the slowest but
+the correct collation order is always respected.
+As for the key specification, the simpler to process the
+lines the faster the search will be.
+.Pp
+When sorting by arithmetic value, using
+.Fl n
+results in much better performance than
+.Fl g
+so its use is encouraged
+whenever possible.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/sort.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/sort.c Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,1335 @@
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/usr.bin/sort/sort.c 238108 2012-07-04 16:25:11Z gabor $");
+
+#include <sys/stat.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
+
+#include <err.h>
+#include <errno.h>
+#include <getopt.h>
+#include <limits.h>
+#include <locale.h>
+#include <md5.h>
+#include <regex.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "coll.h"
+#include "file.h"
+#include "sort.h"
+
+#ifndef WITHOUT_NLS
+#include <nl_types.h>
+nl_catd catalog;
+#endif
+
+#define OPTIONS "bcCdfghik:Mmno:RrsS:t:T:uVz"
+
+#define DEFAULT_RANDOM_SORT_SEED_FILE ("/dev/random")
+#define MAX_DEFAULT_RANDOM_SEED_DATA_SIZE (1024)
+
+static bool need_random;
+static const char *random_source = DEFAULT_RANDOM_SORT_SEED_FILE;
+static const void *random_seed;
+static size_t random_seed_size;
+
+MD5_CTX md5_ctx;
+
+/*
+ * Default messages to use when NLS is disabled or no catalogue
+ * is found.
+ */
+const char *nlsstr[] = { "",
+/* 1*/"mutually exclusive flags",
+/* 2*/"extra argument not allowed with -c",
+/* 3*/"Unknown feature",
+/* 4*/"Wrong memory buffer specification",
+/* 5*/"0 field in key specs",
+/* 6*/"0 column in key specs",
+/* 7*/"Wrong file mode",
+/* 8*/"Cannot open file for reading",
+/* 9*/"Radix sort cannot be used with these sort options",
+/*10*/"The chosen sort method cannot be used with stable and/or unique sort",
+/*11*/"Invalid key position",
+/*12*/"Usage: %s [-bcCdfigMmnrsuz] [-kPOS1[,POS2] ... ] "
+ "[+POS1 [-POS2]] [-S memsize] [-T tmpdir] [-t separator] "
+ "[-o outfile] [--batch-size size] [--files0-from file] "
+ "[--heapsort] [--mergesort] [--radixsort] [--qsort] "
+ "[--mmap] "
+#if defined(SORT_THREADS)
+ "[--parallel thread_no] "
+#endif
+ "[--human-numeric-sort] "
+ "[--version-sort] [--random-sort [--random-source file]] "
+ "[--compress-program program] [file ...]\n" };
+
+struct sort_opts sort_opts_vals;
+
+bool debug_sort;
+bool need_hint;
+
+#if defined(SORT_THREADS)
+size_t ncpu = 1;
+size_t nthreads = 1;
+#endif
+
+static bool gnusort_numeric_compatibility;
+
+static struct sort_mods default_sort_mods_object;
+struct sort_mods * const default_sort_mods = &default_sort_mods_object;
+
+static bool print_symbols_on_debug;
+
+/*
+ * Arguments from file (when file0-from option is used:
+ */
+static int argc_from_file0 = -1;
+static char **argv_from_file0;
+
+/*
+ * Placeholder symbols for options which have no single-character equivalent
+ */
+enum
+{
+ SORT_OPT = CHAR_MAX + 1,
+ HELP_OPT,
+ FF_OPT,
+ BS_OPT,
+ VERSION_OPT,
+ DEBUG_OPT,
+#if defined(SORT_THREADS)
+ PARALLEL_OPT,
+#endif
+ RANDOMSOURCE_OPT,
+ COMPRESSPROGRAM_OPT,
+ QSORT_OPT,
+ MERGESORT_OPT,
+ HEAPSORT_OPT,
+ RADIXSORT_OPT,
+ MMAP_OPT
+};
+
+#define NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS 6
+static const char mutually_exclusive_flags[NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS] = { 'M', 'n', 'g', 'R', 'h', 'V' };
+
+struct option long_options[] = {
+ { "batch-size", required_argument, NULL, BS_OPT },
+ { "buffer-size", required_argument, NULL, 'S' },
+ { "check", optional_argument, NULL, 'c' },
+ { "check=silent|quiet", optional_argument, NULL, 'C' },
+ { "compress-program", required_argument, NULL, COMPRESSPROGRAM_OPT },
+ { "debug", no_argument, NULL, DEBUG_OPT },
+ { "dictionary-order", no_argument, NULL, 'd' },
+ { "field-separator", required_argument, NULL, 't' },
+ { "files0-from", required_argument, NULL, FF_OPT },
+ { "general-numeric-sort", no_argument, NULL, 'g' },
+ { "heapsort", no_argument, NULL, HEAPSORT_OPT },
+ { "help",no_argument, NULL, HELP_OPT },
+ { "human-numeric-sort", no_argument, NULL, 'h' },
+ { "ignore-leading-blanks", no_argument, NULL, 'b' },
+ { "ignore-case", no_argument, NULL, 'f' },
+ { "ignore-nonprinting", no_argument, NULL, 'i' },
+ { "key", required_argument, NULL, 'k' },
+ { "merge", no_argument, NULL, 'm' },
+ { "mergesort", no_argument, NULL, MERGESORT_OPT },
+ { "mmap", no_argument, NULL, MMAP_OPT },
+ { "month-sort", no_argument, NULL, 'M' },
+ { "numeric-sort", no_argument, NULL, 'n' },
+ { "output", required_argument, NULL, 'o' },
+#if defined(SORT_THREADS)
+ { "parallel", required_argument, NULL, PARALLEL_OPT },
+#endif
+ { "qsort", no_argument, NULL, QSORT_OPT },
+ { "radixsort", no_argument, NULL, RADIXSORT_OPT },
+ { "random-sort", no_argument, NULL, 'R' },
+ { "random-source", required_argument, NULL, RANDOMSOURCE_OPT },
+ { "reverse", no_argument, NULL, 'r' },
+ { "sort", required_argument, NULL, SORT_OPT },
+ { "stable", no_argument, NULL, 's' },
+ { "temporary-directory",required_argument, NULL, 'T' },
+ { "unique", no_argument, NULL, 'u' },
+ { "version", no_argument, NULL, VERSION_OPT },
+ { "version-sort",no_argument, NULL, 'V' },
+ { "zero-terminated", no_argument, NULL, 'z' },
+ { NULL, no_argument, NULL, 0 }
+};
+
+void fix_obsolete_keys(int *argc, char **argv);
+
+/*
+ * Check where sort modifier is present
+ */
+static bool
+sort_modifier_empty(struct sort_mods *sm)
+{
+
+ if (sm == NULL)
+ return (true);
+ return (!(sm->Mflag || sm->Vflag || sm->nflag || sm->gflag ||
+ sm->rflag || sm->Rflag || sm->hflag || sm->dflag || sm->fflag));
+}
+
+/*
+ * Print out usage text.
+ */
+static void
+usage(bool opt_err)
+{
+ struct option *o;
+ FILE *out;
+
+ out = stdout;
+ o = &(long_options[0]);
+
+ if (opt_err)
+ out = stderr;
+ fprintf(out, getstr(12), getprogname());
+ if (opt_err)
+ exit(2);
+ exit(0);
+}
+
+/*
+ * Read input file names from a file (file0-from option).
+ */
+static void
+read_fns_from_file0(const char *fn)
+{
+ if (fn) {
+ struct file0_reader f0r;
+ FILE *f;
+
+ f = fopen(fn, "r");
+ if (f == NULL)
+ err(2, NULL);
+
+ memset(&f0r, 0, sizeof(f0r));
+ f0r.f = f;
+
+ while (!feof(f)) {
+ char *line = read_file0_line(&f0r);
+
+ if (line && *line) {
+ ++argc_from_file0;
+ if (argc_from_file0 < 1)
+ argc_from_file0 = 1;
+ argv_from_file0 = sort_realloc(argv_from_file0,
+ argc_from_file0 * sizeof(char *));
+ if (argv_from_file0 == NULL)
+ err(2, NULL);
+ argv_from_file0[argc_from_file0 - 1] =
+ sort_strdup(line);
+ }
+ }
+ closefile(f, fn);
+ }
+}
+
+/*
+ * Check how much RAM is available for the sort.
+ */
+static void
+set_hw_params(void)
+{
+#if defined(SORT_THREADS)
+ size_t ncpusz;
+#endif
+ size_t pages, psize, psz, pszsz;
+
+ pages = psize = 0;
+#if defined(SORT_THREADS)
+ ncpu = 1;
+ ncpusz = sizeof(size_t);
+#endif
+ psz = pszsz = sizeof(size_t);
+
+ if (sysctlbyname("vm.stats.vm.v_free_count", &pages, &psz,
+ NULL, 0) < 0) {
+ perror("vm.stats.vm.v_free_count");
+ return;
+ }
+ if (sysctlbyname("vm.stats.vm.v_page_size", &psize, &pszsz,
+ NULL, 0) < 0) {
+ perror("vm.stats.vm.v_page_size");
+ return;
+ }
+#if defined(SORT_THREADS)
+ if (sysctlbyname("hw.ncpu", &ncpu, &ncpusz,
+ NULL, 0) < 0)
+ ncpu = 1;
+ else if(ncpu > 32)
+ ncpu = 32;
+
+ nthreads = ncpu;
+#endif
+
+ free_memory = (unsigned long long) pages * (unsigned long long) psize;
+ available_free_memory = (free_memory * 9) / 10;
+}
+
+/*
+ * Convert "plain" symbol to wide symbol, with default value.
+ */
+static void
+conv_mbtowc(wchar_t *wc, const char *c, const wchar_t def)
+{
+
+ if (wc && c) {
+ int res;
+
+ res = mbtowc(wc, c, MB_CUR_MAX);
+ if (res < 1)
+ *wc = def;
+ }
+}
+
+/*
+ * Set current locale symbols.
+ */
+static void
+set_locale(void)
+{
+ struct lconv *lc;
+ const char *locale;
+
+ setlocale(LC_ALL, "");
+
+ lc = localeconv();
+
+ if (lc) {
+ /* obtain LC_NUMERIC info */
+ /* Convert to wide char form */
+ conv_mbtowc(&symbol_decimal_point, lc->decimal_point,
+ symbol_decimal_point);
+ conv_mbtowc(&symbol_thousands_sep, lc->thousands_sep,
+ symbol_thousands_sep);
+ conv_mbtowc(&symbol_positive_sign, lc->positive_sign,
+ symbol_positive_sign);
+ conv_mbtowc(&symbol_negative_sign, lc->negative_sign,
+ symbol_negative_sign);
+ }
+
+ if (getenv("GNUSORT_NUMERIC_COMPATIBILITY"))
+ gnusort_numeric_compatibility = true;
+
+ locale = setlocale(LC_COLLATE, NULL);
+
+ if (locale) {
+ char *tmpl;
+ const char *cclocale;
+
+ tmpl = sort_strdup(locale);
+ cclocale = setlocale(LC_COLLATE, "C");
+ if (cclocale && !strcmp(cclocale, tmpl))
+ byte_sort = true;
+ else {
+ const char *pclocale;
+
+ pclocale = setlocale(LC_COLLATE, "POSIX");
+ if (pclocale && !strcmp(pclocale, tmpl))
+ byte_sort = true;
+ }
+ setlocale(LC_COLLATE, tmpl);
+ sort_free(tmpl);
+ }
+}
+
+/*
+ * Set directory temporary files.
+ */
+static void
+set_tmpdir(void)
+{
+ char *td;
+
+ td = getenv("TMPDIR");
+ if (td != NULL)
+ tmpdir = sort_strdup(td);
+}
+
+/*
+ * Parse -S option.
+ */
+static unsigned long long
+parse_memory_buffer_value(const char *value)
+{
+
+ if (value == NULL)
+ return (available_free_memory);
+ else {
+ char *endptr;
+ unsigned long long membuf;
+
+ endptr = NULL;
+ errno = 0;
+ membuf = strtoll(value, &endptr, 10);
+
+ if (errno != 0) {
+ warn("%s",getstr(4));
+ membuf = available_free_memory;
+ } else {
+ switch (*endptr){
+ case 'Y':
+ membuf *= 1024;
+ /* FALLTHROUGH */
+ case 'Z':
+ membuf *= 1024;
+ /* FALLTHROUGH */
+ case 'E':
+ membuf *= 1024;
+ /* FALLTHROUGH */
+ case 'P':
+ membuf *= 1024;
+ /* FALLTHROUGH */
+ case 'T':
+ membuf *= 1024;
+ /* FALLTHROUGH */
+ case 'G':
+ membuf *= 1024;
+ /* FALLTHROUGH */
+ case 'M':
+ membuf *= 1024;
+ /* FALLTHROUGH */
+ case '\0':
+ case 'K':
+ membuf *= 1024;
+ /* FALLTHROUGH */
+ case 'b':
+ break;
+ case '%':
+ membuf = (available_free_memory * membuf) /
+ 100;
+ break;
+ default:
+ fprintf(stderr, "%s: %s\n", strerror(EINVAL),
+ optarg);
+ membuf = available_free_memory;
+ }
+ }
+ return (membuf);
+ }
+}
+
+/*
+ * Signal handler that clears the temporary files.
+ */
+static void
+sig_handler(int sig __unused, siginfo_t *siginfo __unused,
+ void *context __unused)
+{
+
+ clear_tmp_files();
+ exit(-1);
+}
+
+/*
+ * Set signal handler on panic signals.
+ */
+static void
+set_signal_handler(void)
+{
+ struct sigaction sa;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_sigaction = &sig_handler;
+ sa.sa_flags = SA_SIGINFO;
+
+ if (sigaction(SIGTERM, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+ if (sigaction(SIGHUP, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+ if (sigaction(SIGINT, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+ if (sigaction(SIGQUIT, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+ if (sigaction(SIGABRT, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+ if (sigaction(SIGBUS, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+ if (sigaction(SIGSEGV, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+ if (sigaction(SIGUSR1, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+ if (sigaction(SIGUSR2, &sa, NULL) < 0) {
+ perror("sigaction");
+ return;
+ }
+}
+
+/*
+ * Print "unknown" message and exit with status 2.
+ */
+static void
+unknown(const char *what)
+{
+
+ errx(2, "%s: %s", getstr(3), what);
+}
+
+/*
+ * Check whether contradictory input options are used.
+ */
+static void
+check_mutually_exclusive_flags(char c, bool *mef_flags)
+{
+ int fo_index, mec;
+ bool found_others, found_this;
+
+ found_others = found_this =false;
+ fo_index = 0;
+
+ for (int i = 0; i < NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS; i++) {
+ mec = mutually_exclusive_flags[i];
+
+ if (mec != c) {
+ if (mef_flags[i]) {
+ if (found_this)
+ errx(1, "%c:%c: %s", c, mec, getstr(1));
+ found_others = true;
+ fo_index = i;
+ }
+ } else {
+ if (found_others)
+ errx(1, "%c:%c: %s", c, mutually_exclusive_flags[fo_index], getstr(1));
+ mef_flags[i] = true;
+ found_this = true;
+ }
+ }
+}
+
+/*
+ * Initialise sort opts data.
+ */
+static void
+set_sort_opts(void)
+{
+
+ memset(&default_sort_mods_object, 0,
+ sizeof(default_sort_mods_object));
+ memset(&sort_opts_vals, 0, sizeof(sort_opts_vals));
+ default_sort_mods_object.func =
+ get_sort_func(&default_sort_mods_object);
+}
+
+/*
+ * Set a sort modifier on a sort modifiers object.
+ */
+static bool
+set_sort_modifier(struct sort_mods *sm, int c)
+{
+
+ if (sm) {
+ switch (c){
+ case 'b':
+ sm->bflag = true;
+ break;
+ case 'd':
+ sm->dflag = true;
+ break;
+ case 'f':
+ sm->fflag = true;
+ break;
+ case 'g':
+ sm->gflag = true;
+ need_hint = true;
+ break;
+ case 'i':
+ sm->iflag = true;
+ break;
+ case 'R':
+ sm->Rflag = true;
+ need_random = true;
+ break;
+ case 'M':
+ initialise_months();
+ sm->Mflag = true;
+ need_hint = true;
+ break;
+ case 'n':
+ sm->nflag = true;
+ need_hint = true;
+ print_symbols_on_debug = true;
+ break;
+ case 'r':
+ sm->rflag = true;
+ break;
+ case 'V':
+ sm->Vflag = true;
+ break;
+ case 'h':
+ sm->hflag = true;
+ need_hint = true;
+ print_symbols_on_debug = true;
+ break;
+ default:
+ return false;
+ }
+ sort_opts_vals.complex_sort = true;
+ sm->func = get_sort_func(sm);
+ }
+ return (true);
+}
+
+/*
+ * Parse POS in -k option.
+ */
+static int
+parse_pos(const char *s, struct key_specs *ks, bool *mef_flags, bool second)
+{
+ regmatch_t pmatch[4];
+ regex_t re;
+ char *c, *f;
+ const char *sregexp = "^([0-9]+)(\\.[0-9]+)?([bdfirMngRhV]+)?$";
+ size_t len, nmatch;
+ int ret;
+
+ ret = -1;
+ nmatch = 4;
+ c = f = NULL;
+
+ if (regcomp(&re, sregexp, REG_EXTENDED) != 0)
+ return (-1);
+
+ if (regexec(&re, s, nmatch, pmatch, 0) != 0)
+ goto end;
+
+ if (pmatch[0].rm_eo <= pmatch[0].rm_so)
+ goto end;
+
+ if (pmatch[1].rm_eo <= pmatch[1].rm_so)
+ goto end;
+
+ len = pmatch[1].rm_eo - pmatch[1].rm_so;
+ f = sort_malloc((len + 1) * sizeof(char));
+
+ strncpy(f, s + pmatch[1].rm_so, len);
+ f[len] = '\0';
+
+ if (second) {
+ errno = 0;
+ ks->f2 = (size_t) strtoul(f, NULL, 10);
+ if (errno != 0)
+ errx(2, "%s: -k", strerror(errno));
+ if (ks->f2 == 0) {
+ warn("%s",getstr(5));
+ goto end;
+ }
+ } else {
+ errno = 0;
+ ks->f1 = (size_t) strtoul(f, NULL, 10);
+ if (errno != 0)
+ errx(2, "%s: -k", strerror(errno));
+ if (ks->f1 == 0) {
+ warn("%s",getstr(5));
+ goto end;
+ }
+ }
+
+ if (pmatch[2].rm_eo > pmatch[2].rm_so) {
+ len = pmatch[2].rm_eo - pmatch[2].rm_so - 1;
+ c = sort_malloc((len + 1) * sizeof(char));
+
+ strncpy(c, s + pmatch[2].rm_so + 1, len);
+ c[len] = '\0';
+
+ if (second) {
+ errno = 0;
+ ks->c2 = (size_t) strtoul(c, NULL, 10);
+ if (errno != 0)
+ errx(2, "%s: -k", strerror(errno));
+ } else {
+ errno = 0;
+ ks->c1 = (size_t) strtoul(c, NULL, 10);
+ if (errno != 0)
+ errx(2, "%s: -k", strerror(errno));
+ if (ks->c1 == 0) {
+ warn("%s",getstr(6));
+ goto end;
+ }
+ }
+ } else {
+ if (second)
+ ks->c2 = 0;
+ else
+ ks->c1 = 1;
+ }
+
+ if (pmatch[3].rm_eo > pmatch[3].rm_so) {
+ regoff_t i = 0;
+
+ for (i = pmatch[3].rm_so; i < pmatch[3].rm_eo; i++) {
+ check_mutually_exclusive_flags(s[i], mef_flags);
+ if (s[i] == 'b') {
+ if (second)
+ ks->pos2b = true;
+ else
+ ks->pos1b = true;
+ } else if (!set_sort_modifier(&(ks->sm), s[i]))
+ goto end;
+ }
+ }
+
+ ret = 0;
+
+end:
+
+ if (c)
+ sort_free(c);
+ if (f)
+ sort_free(f);
+ regfree(&re);
+
+ return (ret);
+}
+
+/*
+ * Parse -k option value.
+ */
+static int
+parse_k(const char *s, struct key_specs *ks)
+{
+ int ret = -1;
+ bool mef_flags[NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS] =
+ { false, false, false, false, false, false };
+
+ if (s && *s) {
+ char *sptr;
+
+ sptr = strchr(s, ',');
+ if (sptr) {
+ size_t size1;
+ char *pos1, *pos2;
+
+ size1 = sptr - s;
+
+ if (size1 < 1)
+ return (-1);
+ pos1 = sort_malloc((size1 + 1) * sizeof(char));
+
+ strncpy(pos1, s, size1);
+ pos1[size1] = '\0';
+
+ ret = parse_pos(pos1, ks, mef_flags, false);
+
+ sort_free(pos1);
+ if (ret < 0)
+ return (ret);
+
+ pos2 = sort_strdup(sptr + 1);
+ ret = parse_pos(pos2, ks, mef_flags, true);
+ sort_free(pos2);
+ } else
+ ret = parse_pos(s, ks, mef_flags, false);
+ }
+
+ return (ret);
+}
+
+/*
+ * Parse POS in +POS -POS option.
+ */
+static int
+parse_pos_obs(const char *s, int *nf, int *nc, char* sopts)
+{
+ regex_t re;
+ regmatch_t pmatch[4];
+ char *c, *f;
+ const char *sregexp = "^([0-9]+)(\\.[0-9]+)?([A-Za-z]+)?$";
+ int ret;
+ size_t len, nmatch;
+
+ ret = -1;
+ nmatch = 4;
+ c = f = NULL;
+ *nc = *nf = 0;
+
+ if (regcomp(&re, sregexp, REG_EXTENDED) != 0)
+ return (-1);
+
+ if (regexec(&re, s, nmatch, pmatch, 0) != 0)
+ goto end;
+
+ if (pmatch[0].rm_eo <= pmatch[0].rm_so)
+ goto end;
+
+ if (pmatch[1].rm_eo <= pmatch[1].rm_so)
+ goto end;
+
+ len = pmatch[1].rm_eo - pmatch[1].rm_so;
+ f = sort_malloc((len + 1) * sizeof(char));
+
+ strncpy(f, s + pmatch[1].rm_so, len);
+ f[len] = '\0';
+
+ errno = 0;
+ *nf = (size_t) strtoul(f, NULL, 10);
+ if (errno != 0)
+ errx(2, "%s", getstr(11));
+
+ if (pmatch[2].rm_eo > pmatch[2].rm_so) {
+ len = pmatch[2].rm_eo - pmatch[2].rm_so - 1;
+ c = sort_malloc((len + 1) * sizeof(char));
+
+ strncpy(c, s + pmatch[2].rm_so + 1, len);
+ c[len] = '\0';
+
+ errno = 0;
+ *nc = (size_t) strtoul(c, NULL, 10);
+ if (errno != 0)
+ errx(2, "%s", getstr(11));
+ }
+
+ if (pmatch[3].rm_eo > pmatch[3].rm_so) {
+
+ len = pmatch[3].rm_eo - pmatch[3].rm_so;
+
+ strncpy(sopts, s + pmatch[3].rm_so, len);
+ sopts[len] = '\0';
+ }
+
+ ret = 0;
+
+end:
+ if (c)
+ sort_free(c);
+ if (f)
+ sort_free(f);
+ regfree(&re);
+
+ return (ret);
+}
+
+/*
+ * "Translate" obsolete +POS1 -POS2 syntax into new -kPOS1,POS2 syntax
+ */
+void
+fix_obsolete_keys(int *argc, char **argv)
+{
+ char sopt[129];
+
+ for (int i = 1; i < *argc; i++) {
+ char *arg1;
+
+ arg1 = argv[i];
+
+ if (strlen(arg1) > 1 && arg1[0] == '+') {
+ int c1, f1;
+ char sopts1[128];
+
+ sopts1[0] = 0;
+ c1 = f1 = 0;
+
+ if (parse_pos_obs(arg1 + 1, &f1, &c1, sopts1) < 0)
+ continue;
+ else {
+ f1 += 1;
+ c1 += 1;
+ if (i + 1 < *argc) {
+ char *arg2 = argv[i + 1];
+
+ if (strlen(arg2) > 1 &&
+ arg2[0] == '-') {
+ int c2, f2;
+ char sopts2[128];
+
+ sopts2[0] = 0;
+ c2 = f2 = 0;
+
+ if (parse_pos_obs(arg2 + 1,
+ &f2, &c2, sopts2) >= 0) {
+ if (c2 > 0)
+ f2 += 1;
+ sprintf(sopt, "-k%d.%d%s,%d.%d%s",
+ f1, c1, sopts1, f2, c2, sopts2);
+ argv[i] = sort_strdup(sopt);
+ for (int j = i + 1; j + 1 < *argc; j++)
+ argv[j] = argv[j + 1];
+ *argc -= 1;
+ continue;
+ }
+ }
+ }
+ sprintf(sopt, "-k%d.%d", f1, c1);
+ argv[i] = sort_strdup(sopt);
+ }
+ }
+ }
+}
+
+/*
+ * Set random seed
+ */
+static void
+set_random_seed(void)
+{
+ if (need_random) {
+
+ if (strcmp(random_source, DEFAULT_RANDOM_SORT_SEED_FILE) == 0) {
+ FILE* fseed;
+ MD5_CTX ctx;
+ char rsd[MAX_DEFAULT_RANDOM_SEED_DATA_SIZE];
+ size_t sz = 0;
+
+ fseed = openfile(random_source, "r");
+ while (!feof(fseed)) {
+ int cr;
+
+ cr = fgetc(fseed);
+ if (cr == EOF)
+ break;
+
+ rsd[sz++] = (char) cr;
+
+ if (sz >= MAX_DEFAULT_RANDOM_SEED_DATA_SIZE)
+ break;
+ }
+
+ closefile(fseed, random_source);
+
+ MD5Init(&ctx);
+ MD5Update(&ctx, rsd, sz);
+
+ random_seed = MD5End(&ctx, NULL);
+ random_seed_size = strlen(random_seed);
+
+ } else {
+ MD5_CTX ctx;
+ char *b;
+
+ MD5Init(&ctx);
+ b = MD5File(random_source, NULL);
+ if (b == NULL)
+ err(2, NULL);
+
+ random_seed = b;
+ random_seed_size = strlen(b);
+ }
+
+ MD5Init(&md5_ctx);
+ if(random_seed_size>0) {
+ MD5Update(&md5_ctx, random_seed, random_seed_size);
+ }
+ }
+}
+
+/*
+ * Main function.
+ */
+int
+main(int argc, char **argv)
+{
+ char *outfile, *real_outfile;
+ int c, result;
+ bool mef_flags[NUMBER_OF_MUTUALLY_EXCLUSIVE_FLAGS] =
+ { false, false, false, false, false, false };
+
+ result = 0;
+ outfile = sort_strdup("-");
+ real_outfile = NULL;
+
+ struct sort_mods *sm = &default_sort_mods_object;
+
+ init_tmp_files();
+
+ set_signal_handler();
+
+ set_hw_params();
+ set_locale();
+ set_tmpdir();
+ set_sort_opts();
+
+#if 0
+ {
+ static int counter = 0;
+ char fn[128];
+ sprintf(fn, "/var/tmp/debug.sort.%d", counter++);
+ FILE* f = fopen(fn, "w");
+ fprintf(f, ">>sort>>");
+ for (int i = 0; i < argc; i++) {
+ fprintf(f, "<%s>", argv[i]);
+ }
+ fprintf(f, "<<sort<<\n");
+ fclose(f);
+ }
+#endif
+
+ fix_obsolete_keys(&argc, argv);
+
+ while (((c = getopt_long(argc, argv, OPTIONS, long_options, NULL))
+ != -1)) {
+
+ check_mutually_exclusive_flags(c, mef_flags);
+
+ if (!set_sort_modifier(sm, c)) {
+
+ switch (c) {
+ case 'c':
+ sort_opts_vals.cflag = true;
+ if (optarg) {
+ if (!strcmp(optarg, "diagnose-first"))
+ ;
+ else if (!strcmp(optarg, "silent") ||
+ !strcmp(optarg, "quiet"))
+ sort_opts_vals.csilentflag = true;
+ else if (*optarg)
+ unknown(optarg);
+ }
+ break;
+ case 'C':
+ sort_opts_vals.cflag = true;
+ sort_opts_vals.csilentflag = true;
+ break;
+ case 'k':
+ {
+ sort_opts_vals.complex_sort = true;
+ sort_opts_vals.kflag = true;
+
+ keys_num++;
+ keys = sort_realloc(keys, keys_num *
+ sizeof(struct key_specs));
+ memset(&(keys[keys_num - 1]), 0,
+ sizeof(struct key_specs));
+
+ if (parse_k(optarg, &(keys[keys_num - 1]))
+ < 0) {
+ errx(2, "%s: -k %s\n",
+ strerror(EINVAL), optarg);
+ }
+
+ break;
+ }
+ case 'm':
+ sort_opts_vals.mflag = true;
+ break;
+ case 'o':
+ outfile = sort_realloc(outfile, (strlen(optarg) + 1));
+ strcpy(outfile, optarg);
+ break;
+ case 's':
+ sort_opts_vals.sflag = true;
+ break;
+ case 'S':
+ available_free_memory =
+ parse_memory_buffer_value(optarg);
+ break;
+ case 'T':
+ tmpdir = sort_strdup(optarg);
+ break;
+ case 't':
+ while (strlen(optarg) > 1) {
+ if (optarg[0] != '\\') {
+ errx(2, "%s: %s\n",
+ strerror(EINVAL), optarg);
+ }
+ optarg += 1;
+ if (*optarg == '0') {
+ *optarg = 0;
+ break;
+ }
+ }
+ sort_opts_vals.tflag = true;
+ sort_opts_vals.field_sep = btowc(optarg[0]);
+ if (sort_opts_vals.field_sep == WEOF) {
+ errno = EINVAL;
+ err(2, NULL);
+ }
+ if (!gnusort_numeric_compatibility) {
+ if (symbol_decimal_point == sort_opts_vals.field_sep)
+ symbol_decimal_point = WEOF;
+ if (symbol_thousands_sep == sort_opts_vals.field_sep)
+ symbol_thousands_sep = WEOF;
+ if (symbol_negative_sign == sort_opts_vals.field_sep)
+ symbol_negative_sign = WEOF;
+ if (symbol_positive_sign == sort_opts_vals.field_sep)
+ symbol_positive_sign = WEOF;
+ }
+ break;
+ case 'u':
+ sort_opts_vals.uflag = true;
+ /* stable sort for the correct unique val */
+ sort_opts_vals.sflag = true;
+ break;
+ case 'z':
+ sort_opts_vals.zflag = true;
+ break;
+ case SORT_OPT:
+ if (optarg) {
+ if (!strcmp(optarg, "general-numeric"))
+ set_sort_modifier(sm, 'g');
+ else if (!strcmp(optarg, "human-numeric"))
+ set_sort_modifier(sm, 'h');
+ else if (!strcmp(optarg, "numeric"))
+ set_sort_modifier(sm, 'n');
+ else if (!strcmp(optarg, "month"))
+ set_sort_modifier(sm, 'M');
+ else if (!strcmp(optarg, "random"))
+ set_sort_modifier(sm, 'R');
+ else
+ unknown(optarg);
+ }
+ break;
+#if defined(SORT_THREADS)
+ case PARALLEL_OPT:
+ nthreads = (size_t)(atoi(optarg));
+ if (nthreads < 1)
+ nthreads = 1;
+ if (nthreads > 1024)
+ nthreads = 1024;
+ break;
+#endif
+ case QSORT_OPT:
+ sort_opts_vals.sort_method = SORT_QSORT;
+ break;
+ case MERGESORT_OPT:
+ sort_opts_vals.sort_method = SORT_MERGESORT;
+ break;
+ case MMAP_OPT:
+ use_mmap = true;
+ break;
+ case HEAPSORT_OPT:
+ sort_opts_vals.sort_method = SORT_HEAPSORT;
+ break;
+ case RADIXSORT_OPT:
+ sort_opts_vals.sort_method = SORT_RADIXSORT;
+ break;
+ case RANDOMSOURCE_OPT:
+ random_source = strdup(optarg);
+ break;
+ case COMPRESSPROGRAM_OPT:
+ compress_program = strdup(optarg);
+ break;
+ case FF_OPT:
+ read_fns_from_file0(optarg);
+ break;
+ case BS_OPT:
+ {
+ errno = 0;
+ long mof = strtol(optarg, NULL, 10);
+ if (errno != 0)
+ errx(2, "--batch-size: %s",
+ strerror(errno));
+ if (mof >= 2)
+ max_open_files = (size_t) mof + 1;
+ }
+ break;
+ case VERSION_OPT:
+ printf("%s\n", VERSION);
+ exit(EXIT_SUCCESS);
+ /* NOTREACHED */
+ break;
+ case DEBUG_OPT:
+ debug_sort = true;
+ break;
+ case HELP_OPT:
+ usage(false);
+ /* NOTREACHED */
+ break;
+ default:
+ usage(true);
+ /* NOTREACHED */
+ }
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+#ifndef WITHOUT_NLS
+ catalog = catopen("sort", NL_CAT_LOCALE);
+#endif
+
+ if (sort_opts_vals.cflag && sort_opts_vals.mflag)
+ errx(1, "%c:%c: %s", 'm', 'c', getstr(1));
+
+#ifndef WITHOUT_NLS
+ catclose(catalog);
+#endif
+
+ if (keys_num == 0) {
+ keys_num = 1;
+ keys = sort_realloc(keys, sizeof(struct key_specs));
+ memset(&(keys[0]), 0, sizeof(struct key_specs));
+ keys[0].c1 = 1;
+ keys[0].pos1b = default_sort_mods->bflag;
+ keys[0].pos2b = default_sort_mods->bflag;
+ memcpy(&(keys[0].sm), default_sort_mods,
+ sizeof(struct sort_mods));
+ }
+
+ for (size_t i = 0; i < keys_num; i++) {
+ struct key_specs *ks;
+
+ ks = &(keys[i]);
+
+ if (sort_modifier_empty(&(ks->sm)) && !(ks->pos1b) &&
+ !(ks->pos2b)) {
+ ks->pos1b = sm->bflag;
+ ks->pos2b = sm->bflag;
+ memcpy(&(ks->sm), sm, sizeof(struct sort_mods));
+ }
+
+ ks->sm.func = get_sort_func(&(ks->sm));
+ }
+
+ if (argc_from_file0 >= 0) {
+ argc = argc_from_file0;
+ argv = argv_from_file0;
+ }
+
+ if (debug_sort) {
+#if defined(SORT_THREADS)
+ nthreads = 1;
+#endif
+ printf("Using collate rules of %s locale\n",
+ setlocale(LC_COLLATE, NULL));
+ if (byte_sort)
+ printf("Byte sort is used\n");
+ if (print_symbols_on_debug) {
+ printf("Decimal Point: <%lc>\n", symbol_decimal_point);
+ if (symbol_thousands_sep)
+ printf("Thousands separator: <%lc>\n",
+ symbol_thousands_sep);
+ printf("Positive sign: <%lc>\n", symbol_positive_sign);
+ printf("Negative sign: <%lc>\n", symbol_negative_sign);
+ }
+ }
+
+ set_random_seed();
+
+ /* Case when the outfile equals one of the input files: */
+ if (strcmp(outfile, "-")) {
+
+ for(int i = 0; i < argc; ++i) {
+ if (strcmp(argv[i], outfile) == 0) {
+ real_outfile = sort_strdup(outfile);
+ for(;;) {
+ char* tmp = sort_malloc(strlen(outfile) +
+ strlen(".tmp") + 1);
+
+ strcpy(tmp, outfile);
+ strcpy(tmp + strlen(tmp), ".tmp");
+ sort_free(outfile);
+ outfile = tmp;
+ if (access(outfile, F_OK) < 0)
+ break;
+ }
+ tmp_file_atexit(outfile);
+ }
+ }
+ }
+
+#if defined(SORT_THREADS)
+ if ((argc < 1) || (strcmp(outfile, "-") == 0) || (*outfile == 0))
+ nthreads = 1;
+#endif
+
+ if (!sort_opts_vals.cflag && !sort_opts_vals.mflag) {
+ struct file_list fl;
+ struct sort_list list;
+
+ sort_list_init(&list);
+ file_list_init(&fl, true);
+
+ if (argc < 1)
+ procfile("-", &list, &fl);
+ else {
+ while (argc > 0) {
+ procfile(*argv, &list, &fl);
+ --argc;
+ ++argv;
+ }
+ }
+
+ if (fl.count < 1)
+ sort_list_to_file(&list, outfile);
+ else {
+ if (list.count > 0) {
+ char *flast = new_tmp_file_name();
+
+ sort_list_to_file(&list, flast);
+ file_list_add(&fl, flast, false);
+ }
+ merge_files(&fl, outfile);
+ }
+
+ file_list_clean(&fl);
+
+ /*
+ * We are about to exit the program, so we can ignore
+ * the clean-up for speed
+ *
+ * sort_list_clean(&list);
+ */
+
+ } else if (sort_opts_vals.cflag) {
+ result = (argc == 0) ? (check("-")) : (check(*argv));
+ } else if (sort_opts_vals.mflag) {
+ struct file_list fl;
+
+ file_list_init(&fl, false);
+ file_list_populate(&fl, argc, argv, true);
+ merge_files(&fl, outfile);
+ file_list_clean(&fl);
+ }
+
+ if (real_outfile) {
+ unlink(real_outfile);
+ if (rename(outfile, real_outfile) < 0)
+ err(2, NULL);
+ sort_free(real_outfile);
+ }
+
+ sort_free(outfile);
+
+ return (result);
+}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/sort.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/sort.h Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,128 @@
+/* $FreeBSD: head/usr.bin/sort/sort.h 236764 2012-06-08 19:21:49Z gabor $ */
+
+/*-
+ * Copyright (C) 2009 Gabor Kovesdan <gabor at FreeBSD.org>
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__BSD_SORT_H__)
+#define __BSD_SORT_H__
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sysexits.h>
+#include <wchar.h>
+
+#include <sys/types.h>
+#include <md5.h>
+
+#define VERSION "2.3-FreeBSD"
+
+#ifdef WITHOUT_NLS
+#define getstr(n) nlsstr[n]
+#else
+#include <nl_types.h>
+
+extern nl_catd catalog;
+#define getstr(n) catgets(catalog, 1, n, nlsstr[n])
+#endif
+
+extern const char *nlsstr[];
+
+#if defined(SORT_THREADS)
+#define MT_SORT_THRESHOLD (10000)
+extern size_t ncpu;
+extern size_t nthreads;
+#endif
+
+/*
+ * If true, we output some debug information.
+ */
+extern bool debug_sort;
+
+/*
+ * MD5 context for random hash function
+ */
+extern MD5_CTX md5_ctx;
+
+/*
+ * sort.c
+ */
+
+/*
+ * This structure holds main sort options which are NOT affecting the sort ordering.
+ */
+struct sort_opts
+{
+ wchar_t field_sep;
+ int sort_method;
+ bool cflag;
+ bool csilentflag;
+ bool kflag;
+ bool mflag;
+ bool sflag;
+ bool uflag;
+ bool zflag;
+ bool tflag;
+ bool complex_sort;
+};
+
+/*
+ * Key value structure forward declaration
+ */
+struct key_value;
+
+/*
+ * Cmp function
+ */
+typedef int (*cmpcoll_t)(struct key_value *kv1, struct key_value *kv2, size_t offset);
+
+/*
+ * This structure holds "sort modifiers" - options which are affecting the sort ordering.
+ */
+struct sort_mods
+{
+ cmpcoll_t func;
+ bool bflag;
+ bool dflag;
+ bool fflag;
+ bool gflag;
+ bool iflag;
+ bool Mflag;
+ bool nflag;
+ bool rflag;
+ bool Rflag;
+ bool Vflag;
+ bool hflag;
+};
+
+extern bool need_hint;
+
+extern struct sort_opts sort_opts_vals;
+
+extern struct sort_mods * const default_sort_mods;
+
+#endif /* __BSD_SORT_H__ */
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/vsort.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/vsort.c Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,265 @@
+/*-
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * Copyright (C) 2012 Gabor Kovesdan <gabor at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/usr.bin/sort/vsort.c 235267 2012-05-11 12:37:16Z gabor $");
+
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "sort.h"
+#include "vsort.h"
+
+static inline bool
+isdigit_clocale(wchar_t c)
+{
+
+ return (c >= L'0' && c <= L'9');
+}
+
+static inline bool
+isalpha_clocale(wchar_t c)
+{
+
+ return ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'));
+}
+
+static inline bool
+isalnum_clocale(wchar_t c)
+{
+
+ return ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z') ||
+ (c >= L'0' && c <= L'9'));
+}
+
+/*
+ * Find string suffix of format: (\.[A-Za-z~][A-Za-z0-9~]*)*$
+ * Set length of string before suffix.
+ */
+static void
+find_suffix(bwstring_iterator si, bwstring_iterator se, size_t *len)
+{
+ wchar_t c;
+ size_t clen;
+ bool expect_alpha, sfx;
+
+ sfx = false;
+ expect_alpha = false;
+ *len = 0;
+ clen = 0;
+
+ while ((si < se) && (c = bws_get_iter_value(si))) {
+ if (expect_alpha) {
+ expect_alpha = false;
+ if (!isalpha_clocale(c) && (c != L'~'))
+ sfx = false;
+ } else if (c == L'.') {
+ expect_alpha = true;
+ if (!sfx) {
+ sfx = true;
+ *len = clen;
+ }
+ } else if (!isalnum_clocale(c) && (c != L'~'))
+ sfx = false;
+
+ si = bws_iterator_inc(si, 1);
+ ++clen;
+ }
+
+ /* This code must be here to make the implementation compatible
+ * with WORDING of GNU sort documentation.
+ * But the GNU sort implementation is not following its own
+ * documentation. GNU sort allows empty file extensions
+ * (just dot with nothing after); but the regular expression in
+ * their documentation does not allow empty file extensions.
+ * We chose to make our implementation compatible with GNU sort
+ * implementation. If they will ever fix their bug, this code
+ * must be uncommented. Or they may choose to fix the info page,
+ * then the code stays commented.
+ *
+ if (expect_alpha)
+ sfx = false;
+ */
+
+ if (!sfx)
+ *len = clen;
+}
+
+static inline int
+cmp_chars(wchar_t c1, wchar_t c2)
+{
+
+ if (c1 == c2)
+ return (0);
+
+ if (c1 == L'~')
+ return (-1);
+ if (c2 == L'~')
+ return (+1);
+
+ if (isdigit_clocale(c1) || !c1)
+ return ((isdigit_clocale(c2) || !c2) ? 0 : -1);
+
+ if (isdigit_clocale(c2) || !c2)
+ return (+1);
+
+ if (isalpha_clocale(c1))
+ return ((isalpha_clocale(c2)) ? ((int) c1 - (int) c2) : -1);
+
+ if (isalpha_clocale(c2))
+ return (+1);
+
+ return ((int) c1 - (int) c2);
+}
+
+static int
+cmpversions(bwstring_iterator si1, bwstring_iterator se1,
+ bwstring_iterator si2, bwstring_iterator se2)
+{
+ int cmp, diff;
+
+ while ((si1 < se1) || (si2 < se2)) {
+ diff = 0;
+
+ while (((si1 < se1) &&
+ !isdigit_clocale(bws_get_iter_value(si1))) ||
+ ((si2 < se2) && !isdigit_clocale(bws_get_iter_value(si2)))) {
+ wchar_t c1, c2;
+
+ c1 = (si1 < se1) ? bws_get_iter_value(si1) : 0;
+ c2 = (si2 < se2) ? bws_get_iter_value(si2) : 0;
+
+ cmp = cmp_chars(c1, c2);
+ if (cmp)
+ return (cmp);
+
+ if (si1 < se1)
+ si1 = bws_iterator_inc(si1, 1);
+ if (si2 < se2)
+ si2 = bws_iterator_inc(si2, 1);
+ }
+
+ while (bws_get_iter_value(si1) == L'0')
+ si1 = bws_iterator_inc(si1, 1);
+
+ while (bws_get_iter_value(si2) == L'0')
+ si2 = bws_iterator_inc(si2, 1);
+
+ while (isdigit_clocale(bws_get_iter_value(si1)) &&
+ isdigit_clocale(bws_get_iter_value(si2))) {
+ if (!diff)
+ diff = ((int)bws_get_iter_value(si1) -
+ (int)bws_get_iter_value(si2));
+ si1 = bws_iterator_inc(si1, 1);
+ si2 = bws_iterator_inc(si2, 1);
+ }
+
+ if (isdigit_clocale(bws_get_iter_value(si1)))
+ return (1);
+
+ if (isdigit_clocale(bws_get_iter_value(si2)))
+ return (-1);
+
+ if (diff)
+ return (diff);
+ }
+
+ return (0);
+}
+
+/*
+ * Compare two version strings
+ */
+int
+vcmp(struct bwstring *s1, struct bwstring *s2)
+{
+ bwstring_iterator si1, si2;
+ wchar_t c1, c2;
+ size_t len1, len2, slen1, slen2;
+ int cmp_bytes, cmp_res;
+
+ if (s1 == s2)
+ return (0);
+
+ cmp_bytes = bwscmp(s1, s2, 0);
+ if (cmp_bytes == 0)
+ return (0);
+
+ len1 = slen1 = BWSLEN(s1);
+ len2 = slen2 = BWSLEN(s2);
+
+ if (slen1 < 1)
+ return (-1);
+ if (slen2 < 1)
+ return (+1);
+
+ si1 = bws_begin(s1);
+ si2 = bws_begin(s2);
+
+ c1 = bws_get_iter_value(si1);
+ c2 = bws_get_iter_value(si2);
+
+ if (c1 == L'.' && (slen1 == 1))
+ return (-1);
+
+ if (c2 == L'.' && (slen2 == 1))
+ return (+1);
+
+ if (slen1 == 2 && c1 == L'.' &&
+ bws_get_iter_value(bws_iterator_inc(si1, 1)) == L'.')
+ return (-1);
+ if (slen2 == 2 && c2 == L'.' &&
+ bws_get_iter_value(bws_iterator_inc(si2, 1)) == L'.')
+ return (+1);
+
+ if (c1 == L'.' && c2 != L'.')
+ return (-1);
+ if (c1 != L'.' && c2 == L'.')
+ return (+1);
+
+ if (c1 == L'.' && c2 == L'.') {
+ si1 = bws_iterator_inc(si1, 1);
+ si2 = bws_iterator_inc(si2, 1);
+ }
+
+ find_suffix(si1, bws_end(s1), &len1);
+ find_suffix(si2, bws_end(s2), &len2);
+
+ if ((len1 == len2) && (bws_iterator_cmp(si1, si2, len1) == 0))
+ return (cmp_bytes);
+
+ cmp_res = cmpversions(si1, bws_iterator_inc(si1, len1), si2,
+ bws_iterator_inc(si2, len2));
+
+ if (cmp_res == 0)
+ cmp_res = cmp_bytes;
+
+ return (cmp_res);
+}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/sort/vsort.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/sort/vsort.h Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,37 @@
+/* $FreeBSD: head/usr.bin/sort/vsort.h 235267 2012-05-11 12:37:16Z gabor $ */
+
+/*-
+ * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko at citrix.com>
+ * Copyright (C) 2012 Gabor Kovesdan <gabor at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__VSORT_H__)
+#define _VSORT_H__
+
+#include "bwstring.h"
+
+int vcmp(struct bwstring *s1, struct bwstring *s2);
+
+#endif
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/stat/stat.1
--- a/head/usr.bin/stat/stat.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/stat/stat.1 Wed Jul 25 16:31:11 2012 +0300
@@ -27,9 +27,9 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/stat/stat.1 234577 2012-04-22 18:18:49Z brueffer $
.\"
-.Dd December 5, 2010
+.Dd April 22, 2012
.Dt STAT 1
.Os
.Sh NAME
@@ -140,10 +140,6 @@
fall back on
.Xr lstat 2
and report information about the link.
-.It Fl l
-Display output in
-.Ic ls Fl lT
-format.
.It Fl n
Do not force a newline to appear at the end of each piece of output.
.It Fl q
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/stdbuf/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/stdbuf/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,8 @@
+# $FreeBSD: head/usr.bin/stdbuf/Makefile 234772 2012-04-28 20:52:20Z jlh $
+
+PROG= stdbuf
+SRCS= stdbuf.c
+
+WARNS?= 6
+
+.include <bsd.prog.mk>
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/stdbuf/stdbuf.1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/stdbuf/stdbuf.1 Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,116 @@
+.\" Copyright (c) 2012 Jeremie Le Hen <jlh at FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code and documentation must retain the above
+.\" copyright notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: head/usr.bin/stdbuf/stdbuf.1 235355 2012-05-12 19:59:37Z joel $
+.\"
+.Dd April 28, 2012
+.Dt STDBUF 1
+.Os
+.Sh NAME
+.Nm stdbuf
+.Nd change standard streams initial buffering
+.Sh SYNOPSIS
+.Nm
+.Op Fl e Ar bufdef
+.Op Fl i Ar bufdef
+.Op Fl o Ar bufdef
+.Op Ar command Op ...
+.Sh DESCRIPTION
+.Nm
+is used to change the initial buffering of standard input,
+standard output and/or standard error streams for
+.Ar command .
+It relies on
+.Xr libstdbuf 3
+which is loaded and configured by
+.Nm
+through environment variables.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl e Ar bufdef
+Set initial buffering of the standard error stream for
+.Ar command
+as defined by
+.Ar bufdef
+.Pq see Sx BUFFER DEFINITION .
+.It Fl i Ar bufdef
+Set initial buffering of the standard input stream for
+.Ar command
+as defined by
+.Ar bufdef
+.Pq see Sx BUFFER DEFINITION .
+.It Fl o Ar bufdef
+Set initial buffering of the standard output stream for
+.Ar command
+as defined by
+.Ar bufdef
+.Pq see Sx BUFFER DEFINITION .
+.El
+.Sh BUFFER DEFINITION
+Buffer definition is the same as in
+.Xr libstdbuf 3 :
+.Bl -tag -width size -offset indent
+.It Qq 0
+unbuffered
+.It Qq L
+line buffered
+.It Qq B
+fully buffered with the default buffer size
+.It Ar size
+fully buffered with a buffer of
+.Ar size
+bytes (suffixes 'k', 'M' and 'G' are accepted)
+.El
+.Sh EXAMPLES
+In the following example, the stdout stream of the
+.Xr awk 1
+command
+will be fully buffered by default because it does not refer
+to a terminal.
+.Nm
+is used to force it to be line-buffered so
+.Xr vmstat 8 Ns 's
+output will not stall until the full buffer fills.
+.Bd -literal -offset indent
+# vmstat 1 | stdbuf -o L awk '$2 > 1 || $3 > 1' | cat -n
+.Ed
+.Sh SEE ALSO
+.Xr libstdbuf 3 ,
+.Xr setvbuf 3
+.Sh HISTORY
+The
+.Nm
+utility first appeared in
+.Fx 8.4 .
+.Sh AUTHORS
+.An -nosplit
+The original idea of the
+.Nm
+command comes from
+.An Padraig Brady
+who implemented it in the GNU coreutils.
+.An Jeremie Le Hen
+implemented it on
+.Fx .
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/stdbuf/stdbuf.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/head/usr.bin/stdbuf/stdbuf.c Wed Jul 25 16:31:11 2012 +0300
@@ -0,0 +1,110 @@
+/*-
+ * Copyright (c) 2012 Jeremie Le Hen <jlh at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: head/usr.bin/stdbuf/stdbuf.c 235142 2012-05-08 19:43:32Z jlh $
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define LIBSTDBUF "/usr/lib/libstdbuf.so"
+#define LIBSTDBUF32 "/usr/lib32/libstdbuf.so"
+
+extern char *__progname;
+
+static void
+usage(int s)
+{
+
+ fprintf(stderr, "Usage: %s [-e 0|L|<sz>] [-i 0|L|<sz>] [-o 0|L|<sz>] "
+ "<cmd> [args ...]\n", __progname);
+ exit(s);
+}
+
+int
+main(int argc, char *argv[])
+{
+ char *ibuf, *obuf, *ebuf;
+ char *preload0, *preload1;
+ int i;
+
+ ibuf = obuf = ebuf = NULL;
+ while ((i = getopt(argc, argv, "e:i:o:")) != -1) {
+ switch (i) {
+ case 'e':
+ ebuf = optarg;
+ break;
+ case 'i':
+ ibuf = optarg;
+ break;
+ case 'o':
+ obuf = optarg;
+ break;
+ case '?':
+ default:
+ usage(1);
+ break;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+ if (argc < 2)
+ usage(0);
+
+ if (ibuf != NULL && setenv("_STDBUF_I", ibuf, 1) == -1)
+ warn("Failed to set environment variable: %s=%s",
+ "_STDBUF_I", ibuf);
+ if (obuf != NULL && setenv("_STDBUF_O", obuf, 1) == -1)
+ warn("Failed to set environment variable: %s=%s",
+ "_STDBUF_O", obuf);
+ if (ebuf != NULL && setenv("_STDBUF_E", ebuf, 1) == -1)
+ warn("Failed to set environment variable: %s=%s",
+ "_STDBUF_E", ebuf);
+
+ preload0 = getenv("LD_PRELOAD");
+ if (preload0 == NULL)
+ i = asprintf(&preload1, "LD_PRELOAD=" LIBSTDBUF);
+ else
+ i = asprintf(&preload1, "LD_PRELOAD=%s:%s", preload0,
+ LIBSTDBUF);
+
+ if (i < 0 || putenv(preload1) == -1)
+ warn("Failed to set environment variable: LD_PRELOAD");
+
+ preload0 = getenv("LD_32_PRELOAD");
+ if (preload0 == NULL)
+ i = asprintf(&preload1, "LD_32_PRELOAD=" LIBSTDBUF32);
+ else
+ i = asprintf(&preload1, "LD_32_PRELOAD=%s:%s", preload0,
+ LIBSTDBUF32);
+
+ if (i < 0 || putenv(preload1) == -1)
+ warn("Failed to set environment variable: LD_32_PRELOAD");
+
+ execvp(argv[0], argv);
+ err(2, "%s", argv[0]);
+}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/tftp/tftp.1
--- a/head/usr.bin/tftp/tftp.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/tftp/tftp.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)tftp.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD: head/usr.bin/tftp/tftp.1 233648 2012-03-29 05:02:12Z eadler $
+.\" $FreeBSD: head/usr.bin/tftp/tftp.1 235211 2012-05-10 02:07:00Z gjb $
.\"
.Dd June 22, 2011
.Dt TFTP 1
@@ -112,9 +112,9 @@
Enable or disable debugging levels during verbose output. The value of
.Ar level
can be one of
-.Cm packet, simple, options,
+.Cm packet , simple , options ,
or
-.Cm access.
+.Cm access .
.Pp
.It Cm get Oo Ar host : Oc Ns Ar file Op Ar localname
.It Cm get Xo
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/top/machine.c
--- a/head/usr.bin/top/machine.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/top/machine.c Wed Jul 25 16:31:11 2012 +0300
@@ -20,7 +20,7 @@
* Wolfram Schneider <wosch at FreeBSD.org>
* Thomas Moestl <tmoestl at gmx.net>
*
- * $FreeBSD: head/usr.bin/top/machine.c 234416 2012-04-18 10:23:42Z kib $
+ * $FreeBSD: head/usr.bin/top/machine.c 238020 2012-07-02 20:08:11Z jhb $
*/
#include <sys/param.h>
@@ -176,6 +176,12 @@
"K Free", NULL
};
+int arc_stats[7];
+char *arcnames[] = {
+ "K Total, ", "K MRU, ", "K MFU, ", "K Anon, ", "K Header, ", "K Other",
+ NULL
+};
+
int swap_stats[7];
char *swapnames[] = {
"K Total, ", "K Used, ", "K Free, ", "% Inuse, ", "K In, ", "K Out",
@@ -194,6 +200,7 @@
static struct kinfo_proc **previous_pref;
static int previous_proc_count = 0;
static int previous_proc_count_max = 0;
+static int arc_enabled;
/* total number of io operations */
static long total_inblock;
@@ -239,6 +246,7 @@
static const char *format_nice(const struct kinfo_proc *pp);
static void getsysctl(const char *name, void *ptr, size_t len);
static int swapmode(int *retavail, int *retfree);
+static void update_layout(void);
void
toggle_pcpustats(void)
@@ -246,24 +254,32 @@
if (ncpus == 1)
return;
+ update_layout();
+}
- /* Adjust display based on ncpus */
+/* Adjust display based on ncpus and the ARC state. */
+static void
+update_layout(void)
+{
+
+ y_mem = 3;
+ y_arc = 4;
+ y_swap = 4 + arc_enabled;
+ y_idlecursor = 5 + arc_enabled;
+ y_message = 5 + arc_enabled;
+ y_header = 6 + arc_enabled;
+ y_procs = 7 + arc_enabled;
+ Header_lines = 7 + arc_enabled;
+
if (pcpu_stats) {
- y_mem += ncpus - 1; /* 3 */
- y_swap += ncpus - 1; /* 4 */
- y_idlecursor += ncpus - 1; /* 5 */
- y_message += ncpus - 1; /* 5 */
- y_header += ncpus - 1; /* 6 */
- y_procs += ncpus - 1; /* 7 */
- Header_lines += ncpus - 1; /* 7 */
- } else {
- y_mem = 3;
- y_swap = 4;
- y_idlecursor = 5;
- y_message = 5;
- y_header = 6;
- y_procs = 7;
- Header_lines = 7;
+ y_mem += ncpus - 1;
+ y_arc += ncpus - 1;
+ y_swap += ncpus - 1;
+ y_idlecursor += ncpus - 1;
+ y_message += ncpus - 1;
+ y_header += ncpus - 1;
+ y_procs += ncpus - 1;
+ Header_lines += ncpus - 1;
}
}
@@ -271,6 +287,7 @@
machine_init(struct statics *statics, char do_unames)
{
int i, j, empty, pagesize;
+ uint64_t arc_size;
size_t size;
struct passwd *pw;
@@ -282,6 +299,11 @@
size != sizeof(smpmode))
smpmode = 0;
+ size = sizeof(arc_size);
+ if (sysctlbyname("kstat.zfs.misc.arcstats.size", &arc_size, &size,
+ NULL, 0) == 0 && arc_size != 0)
+ arc_enabled = 1;
+
if (do_unames) {
while ((pw = getpwent()) != NULL) {
if (strlen(pw->pw_name) > namelength)
@@ -322,6 +344,10 @@
statics->procstate_names = procstatenames;
statics->cpustate_names = cpustatenames;
statics->memory_names = memorynames;
+ if (arc_enabled)
+ statics->arc_names = arcnames;
+ else
+ statics->arc_names = NULL;
statics->swap_names = swapnames;
#ifdef ORDER
statics->order_names = ordernames;
@@ -356,8 +382,7 @@
pcpu_cpu_states = calloc(1, size);
statics->ncpus = ncpus;
- if (pcpu_stats)
- toggle_pcpustats();
+ update_layout();
/* all done! */
return (0);
@@ -408,7 +433,7 @@
struct loadavg sysload;
int mib[2];
struct timeval boottime;
- size_t bt_size;
+ uint64_t arc_stat, arc_stat2;
int i, j;
size_t size;
@@ -487,6 +512,23 @@
swap_stats[6] = -1;
}
+ if (arc_enabled) {
+ GETSYSCTL("kstat.zfs.misc.arcstats.size", arc_stat);
+ arc_stats[0] = arc_stat >> 10;
+ GETSYSCTL("vfs.zfs.mfu_size", arc_stat);
+ arc_stats[1] = arc_stat >> 10;
+ GETSYSCTL("vfs.zfs.mru_size", arc_stat);
+ arc_stats[2] = arc_stat >> 10;
+ GETSYSCTL("vfs.zfs.anon_size", arc_stat);
+ arc_stats[3] = arc_stat >> 10;
+ GETSYSCTL("kstat.zfs.misc.arcstats.hdr_size", arc_stat);
+ GETSYSCTL("kstat.zfs.misc.arcstats.l2_hdr_size", arc_stat2);
+ arc_stats[4] = arc_stat + arc_stat2 >> 10;
+ GETSYSCTL("kstat.zfs.misc.arcstats.other_size", arc_stat);
+ arc_stats[5] = arc_stat >> 10;
+ si->arc = arc_stats;
+ }
+
/* set arrays and strings */
if (pcpu_stats) {
si->cpustates = pcpu_cpu_states;
@@ -511,8 +553,8 @@
*/
mib[0] = CTL_KERN;
mib[1] = KERN_BOOTTIME;
- bt_size = sizeof(boottime);
- if (sysctl(mib, 2, &boottime, &bt_size, NULL, 0) != -1 &&
+ size = sizeof(boottime);
+ if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 &&
boottime.tv_sec != 0) {
si->boottime = boottime;
} else {
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/top/top.local.1
--- a/head/usr.bin/top/top.local.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/top/top.local.1 Wed Jul 25 16:31:11 2012 +0300
@@ -1,8 +1,9 @@
-.\" $FreeBSD: head/usr.bin/top/top.local.1 233648 2012-03-29 05:02:12Z eadler $
+.\" $FreeBSD: head/usr.bin/top/top.local.1 237656 2012-06-27 18:08:48Z jhb $
.SH "FreeBSD NOTES"
.SH DESCRIPTION OF MEMORY
Mem: 9220K Active, 1M Inact, 3284K Wired, 1M Cache, 2M Buf, 1320K Free
+ARC: 2048K Total, 342K MRU, 760K MFU, 272K Anon, 232K Header, 442K Other
Swap: 91M Total, 79M Free, 13% Inuse, 80K In, 104K Out
.TP
.B K:
@@ -16,6 +17,7 @@
.TP
.B %:
1/100
+.SS Physical Memory Stats
.TP
.B Active:
number of bytes active
@@ -24,7 +26,7 @@
number of bytes inactive
.TP
.B Wired:
-number of bytes wired down, including cached file data pages
+number of bytes wired down, including BIO-level cached file data pages
.TP
.B Cache:
number of clean bytes caching data that are available for
@@ -35,6 +37,27 @@
.TP
.B Free:
number of bytes free
+.SS ZFS ARC Stats
+These stats are only displayed when the ARC is in use.
+.TP
+.B Total:
+number of wired bytes used for the ZFS ARC
+.TP
+.B MRU:
+number of ARC bytes holding most recently used data
+.TP
+.B MFU:
+number of ARC bytes holding most frequently used data
+.TP
+.B Anon:
+number of ARC bytes holding in flight data
+.TP
+.B Header:
+number of ARC bytes holding headers
+.TP
+.B Other
+miscellaneous ARC bytes
+.SS Swap Stats
.TP
.B Total:
total available swap usage
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/touch/touch.1
--- a/head/usr.bin/touch/touch.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/touch/touch.1 Wed Jul 25 16:31:11 2012 +0300
@@ -29,9 +29,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)touch.1 8.3 (Berkeley) 4/28/95
-.\" $FreeBSD: head/usr.bin/touch/touch.1 233648 2012-03-29 05:02:12Z eadler $
+.\" $FreeBSD: head/usr.bin/touch/touch.1 236852 2012-06-10 14:26:51Z jilles $
.\"
-.Dd February 4, 2012
+.Dd June 10, 2012
.Dt TOUCH 1
.Os
.Sh NAME
@@ -43,6 +43,7 @@
.Op Fl achm
.Op Fl r Ar file
.Op Fl t Ar [[CC]YY]MMDDhhmm[.SS]
+.Op Fl d Ar YYYY-MM-DDThh:mm:SS[.frac][tz]
.Ar
.Sh DESCRIPTION
The
@@ -61,8 +62,10 @@
Selecting both is equivalent to the default.
By default, the timestamps are set to the current time.
The
+.Fl d
+and
.Fl t
-flag explicitly specifies a different time, and the
+flags explicitly specify a different time, and the
.Fl r
flag specifies to set the times those of the specified file.
The
@@ -109,6 +112,41 @@
.Nm
utility does not treat this as an error.
No error messages are displayed and the exit value is not affected.
+.It Fl d
+Change the access and modification times to the specified time instead
+of the current time of day.
+The argument is of the form
+.Dq YYYY-MM-DDThh:mm:SS[.frac][tz]
+where the letters represent the following:
+.Bl -tag -width Ds -compact -offset indent
+.It Ar YYYY
+The year.
+.It Ar MM
+The month of the year, from 01 to 12.
+.It Ar DD
+The day of the month, from 01 to 31.
+.It Ar T
+The letter
+.Li T
+or a space.
+.It Ar hh
+The hour of the day, from 00 to 23.
+.It Ar mm
+The minute of the hour, from 00 to 59.
+.It Ar SS
+The second of the minute, from 00 to 61.
+.It Ar .frac
+An optional fraction,
+consisting of a period or a comma followed by one or more digits.
+The number of significant digits depends on the kernel configuration and
+the filesystem, and may be zero.
+.It Ar tz
+An optional letter
+.Li Z
+indicating the time is in
+.Tn UTC .
+Otherwise, the time is assumed to be in local time.
+.El
.It Fl h
If the file is a symbolic link, change the times of the link
itself rather than the file that the link points to.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/touch/touch.c
--- a/head/usr.bin/touch/touch.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/touch/touch.c Wed Jul 25 16:31:11 2012 +0300
@@ -29,7 +29,7 @@
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/touch/touch.c 230979 2012-02-04 13:37:31Z jh $");
+__FBSDID("$FreeBSD: head/usr.bin/touch/touch.c 236852 2012-06-10 14:26:51Z jilles $");
#ifndef lint
static const char copyright[] =
@@ -45,6 +45,7 @@
#include <sys/stat.h>
#include <sys/time.h>
+#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
@@ -57,6 +58,7 @@
void stime_arg1(char *, struct timeval *);
void stime_arg2(char *, int, struct timeval *);
+void stime_darg(char *, struct timeval *);
void stime_file(char *, struct timeval *);
int timeoffset(char *);
void usage(char *);
@@ -79,7 +81,7 @@
if (gettimeofday(&tv[0], NULL))
err(1, "gettimeofday");
- while ((ch = getopt(argc, argv, "A:acfhmr:t:")) != -1)
+ while ((ch = getopt(argc, argv, "A:acd:fhmr:t:")) != -1)
switch(ch) {
case 'A':
Aflag = timeoffset(optarg);
@@ -90,6 +92,10 @@
case 'c':
cflag = 1;
break;
+ case 'd':
+ timeset = 1;
+ stime_darg(optarg, tv);
+ break;
case 'f':
/* No-op for compatibility. */
break;
@@ -320,6 +326,50 @@
tvp[0].tv_usec = tvp[1].tv_usec = 0;
}
+void
+stime_darg(char *arg, struct timeval *tvp)
+{
+ struct tm t = { .tm_sec = 0 };
+ const char *fmt, *colon;
+ char *p;
+ int val, isutc = 0;
+
+ tvp[0].tv_usec = 0;
+ t.tm_isdst = -1;
+ colon = strchr(arg, ':');
+ if (colon == NULL || strchr(colon + 1, ':') == NULL)
+ goto bad;
+ fmt = strchr(arg, 'T') != NULL ? "%Y-%m-%dT%H:%M:%S" :
+ "%Y-%m-%d %H:%M:%S";
+ p = strptime(arg, fmt, &t);
+ if (p == NULL)
+ goto bad;
+ /* POSIX: must have at least one digit after dot */
+ if ((*p == '.' || *p == ',') && isdigit((unsigned char)p[1])) {
+ p++;
+ val = 100000;
+ while (isdigit((unsigned char)*p)) {
+ tvp[0].tv_usec += val * (*p - '0');
+ p++;
+ val /= 10;
+ }
+ }
+ if (*p == 'Z') {
+ isutc = 1;
+ p++;
+ }
+ if (*p != '\0')
+ goto bad;
+
+ tvp[0].tv_sec = isutc ? timegm(&t) : mktime(&t);
+
+ tvp[1] = tvp[0];
+ return;
+
+bad:
+ errx(1, "out of range or illegal time specification: YYYY-MM-DDThh:mm:SS[.frac][tz]");
+}
+
/* Calculate a time offset in seconds, given an arg of the format [-]HHMMSS. */
int
timeoffset(char *arg)
@@ -364,7 +414,9 @@
void
usage(char *myname)
{
- fprintf(stderr, "usage:\n" "%s [-A [-][[hh]mm]SS] [-achm] [-r file] "
- "[-t [[CC]YY]MMDDhhmm[.SS]] file ...\n", myname);
+ fprintf(stderr, "usage: %s [-A [-][[hh]mm]SS] [-achm] [-r file] "
+ "[-t [[CC]YY]MMDDhhmm[.SS]]\n"
+ " [-d YYYY-MM-DDThh:mm:SS[.frac][tz]] "
+ "file ...\n", myname);
exit(1);
}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/unzip/unzip.1
--- a/head/usr.bin/unzip/unzip.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/unzip/unzip.1 Wed Jul 25 16:31:11 2012 +0300
@@ -23,9 +23,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: head/usr.bin/unzip/unzip.1 234311 2012-04-15 13:39:39Z des $
+.\" $FreeBSD: head/usr.bin/unzip/unzip.1 235252 2012-05-11 00:19:06Z gjb $
.\"
-.Dd October 21, 2010
+.Dd May 10, 2012
.Dt UNZIP 1
.Os
.Sh NAME
@@ -102,6 +102,16 @@
.It Fl x Ar pattern
Exclude files matching the pattern
.Ar pattern .
+.It Fl Z Ar mode
+Emulate
+.Xr zipinfo 1L
+mode.
+Enabling
+.Xr zipinfo 1L
+mode changes the way in which additional arguments are parsed.
+Currently only
+.Xr zipinfo 1L
+mode 1 is supported, which lists the file names one per line.
.El
.Pp
Note that only one of
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/unzip/unzip.c
--- a/head/usr.bin/unzip/unzip.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/unzip/unzip.c Wed Jul 25 16:31:11 2012 +0300
@@ -25,7 +25,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/usr.bin/unzip/unzip.c 234311 2012-04-15 13:39:39Z des $
+ * $FreeBSD: head/usr.bin/unzip/unzip.c 236226 2012-05-29 09:11:19Z des $
*
* This file would be much shorter if we didn't care about command-line
* compatibility with Info-ZIP's UnZip, which requires us to duplicate
@@ -865,19 +865,14 @@
{
struct archive *a;
struct archive_entry *e;
- int fd, ret;
+ int ret;
uintmax_t total_size, file_count, error_count;
- if (strcmp(fn, "-") == 0)
- fd = STDIN_FILENO;
- else if ((fd = open(fn, O_RDONLY)) < 0)
- error("%s", fn);
-
if ((a = archive_read_new()) == NULL)
error("archive_read_new failed");
ac(archive_read_support_format_zip(a));
- ac(archive_read_open_fd(a, fd, 8192));
+ ac(archive_read_open_filename(a, fn, 8192));
if (!zipinfo_mode) {
if (!p_opt && !q_opt)
@@ -933,9 +928,6 @@
ac(archive_read_close(a));
(void)archive_read_finish(a);
- if (fd != STDIN_FILENO && close(fd) != 0)
- error("%s", fn);
-
if (t_opt) {
if (error_count > 0) {
errorx("%d checksum error(s) found.", error_count);
@@ -1061,6 +1053,9 @@
usage();
zipfile = argv[nopts++];
+ if (strcmp(zipfile, "-") == 0)
+ zipfile = NULL; /* STDIN */
+
while (nopts < argc && *argv[nopts] != '-')
add_pattern(&include, argv[nopts++]);
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/usbhidctl/usbhid.c
--- a/head/usr.bin/usbhidctl/usbhid.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/usbhidctl/usbhid.c Wed Jul 25 16:31:11 2012 +0300
@@ -1,5 +1,5 @@
/* $NetBSD: usbhid.c,v 1.14 2000/07/03 02:51:37 matt Exp $ */
-/* $FreeBSD: head/usr.bin/usbhidctl/usbhid.c 227196 2011-11-06 08:18:30Z ed $ */
+/* $FreeBSD: head/usr.bin/usbhidctl/usbhid.c 235519 2012-05-16 20:30:20Z mav $ */
/*
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -182,11 +182,11 @@
fprintf(stderr,
"usage: %s -f device "
- "[-l] [-n] [-r] [-t tablefile] [-v] [-x] name ...\n",
+ "[-l] [-n] [-r] [-t tablefile] [-v] [-x] [-z] name ...\n",
getprogname());
fprintf(stderr,
" %s -f device "
- "[-l] [-n] [-r] [-t tablefile] [-v] [-x] -a\n",
+ "[-l] [-n] [-r] [-t tablefile] [-v] [-x] [-z] -a\n",
getprogname());
fprintf(stderr,
" %s -f device "
@@ -304,7 +304,7 @@
u_char *dbuf;
enum hid_kind kind;
- kind = 0;
+ kind = zflag ? 3 : 0;
rid = -1;
use_rid = !!hid_get_report_id(f);
do {
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/usbhidctl/usbhidctl.1
--- a/head/usr.bin/usbhidctl/usbhidctl.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/usbhidctl/usbhidctl.1 Wed Jul 25 16:31:11 2012 +0300
@@ -1,5 +1,5 @@
.\" $NetBSD: usbhidctl.1,v 1.8 1999/05/11 21:03:58 augustss Exp $
-.\" $FreeBSD: head/usr.bin/usbhidctl/usbhidctl.1 225839 2011-09-28 14:52:25Z mav $
+.\" $FreeBSD: head/usr.bin/usbhidctl/usbhidctl.1 236596 2012-06-05 03:14:39Z eadler $
.\"
.\" Copyright (c) 1998 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -28,7 +28,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd August 01, 2011
+.Dd August 1, 2011
.Dt USBHIDCTL 1
.Os
.Sh NAME
@@ -47,6 +47,7 @@
.Op Fl l
.Op Fl v
.Op Fl x
+.Op Fl z
.Fl a
.Nm
.Fl f Ar device
@@ -55,6 +56,7 @@
.Op Fl n
.Op Fl v
.Op Fl x
+.Op Fl z
.Ar item ...
.Nm
.Fl f Ar device
@@ -99,9 +101,8 @@
.It Fl x
Dump data in hexadecimal as well as decimal.
.It Fl z
-Reset reports to zero before processing
-.Fl w
-arguments. If not specified, current values will be requested from device.
+Reset reports to zero before processing other arguments.
+If not specified, current values will be requested from device.
.El
.Sh SYNTAX
.Nm
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/who/who.1
--- a/head/usr.bin/who/who.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/who/who.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)who.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD: head/usr.bin/who/who.1 231536 2012-02-11 21:49:23Z ed $
+.\" $FreeBSD: head/usr.bin/who/who.1 235211 2012-05-10 02:07:00Z gjb $
.\"
.Dd February 11, 2012
.Dt WHO 1
@@ -82,7 +82,7 @@
Show idle time for each user in hours and minutes as
.Ar hh Ns : Ns Ar mm ,
.Ql \&.
-if the user has been idle less that a minute, and
+if the user has been idle less than a minute, and
.Dq Li old
if the user has been idle more than 24 hours.
.It Cm am I
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/whois/whois.1
--- a/head/usr.bin/whois/whois.1 Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/whois/whois.1 Wed Jul 25 16:31:11 2012 +0300
@@ -26,7 +26,7 @@
.\" SUCH DAMAGE.
.\"
.\" From: @(#)whois.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
+.\" $FreeBSD: head/usr.bin/whois/whois.1 235211 2012-05-10 02:07:00Z gjb $
.\"
.Dd October 2, 2009
.Dt WHOIS 1
@@ -203,12 +203,12 @@
option with an argument of
.Qq Li RU
instead.
+.El
.Pp
The operands specified to
.Nm
are treated independently and may be used
as queries on different whois servers.
-.El
.Sh EXIT STATUS
.Ex -std
.Sh EXAMPLES
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/xinstall/xinstall.c
--- a/head/usr.bin/xinstall/xinstall.c Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/xinstall/xinstall.c Wed Jul 25 16:31:11 2012 +0300
@@ -40,7 +40,7 @@
#endif
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/xinstall/xinstall.c 227202 2011-11-06 08:19:07Z ed $");
+__FBSDID("$FreeBSD: head/usr.bin/xinstall/xinstall.c 237988 2012-07-02 09:53:57Z kib $");
#include <sys/param.h>
#include <sys/mman.h>
@@ -55,6 +55,7 @@
#include <grp.h>
#include <paths.h>
#include <pwd.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -671,11 +672,18 @@
if (size <= 8 * 1048576 && trymmap(from_fd) &&
(p = mmap(NULL, (size_t)size, PROT_READ, MAP_SHARED,
from_fd, (off_t)0)) != (char *)MAP_FAILED) {
- if ((nw = write(to_fd, p, size)) != size) {
+ nw = write(to_fd, p, size);
+ if (nw != size) {
serrno = errno;
(void)unlink(to_name);
- errno = nw > 0 ? EIO : serrno;
- err(EX_OSERR, "%s", to_name);
+ if (nw >= 0) {
+ errx(EX_OSERR,
+ "short write to %s: %jd bytes written, %jd bytes asked to write",
+ to_name, (uintmax_t)nw, (uintmax_t)size);
+ } else {
+ errno = serrno;
+ err(EX_OSERR, "%s", to_name);
+ }
}
done_copy = 1;
}
@@ -684,8 +692,15 @@
if ((nw = write(to_fd, buf, nr)) != nr) {
serrno = errno;
(void)unlink(to_name);
- errno = nw > 0 ? EIO : serrno;
- err(EX_OSERR, "%s", to_name);
+ if (nw >= 0) {
+ errx(EX_OSERR,
+ "short write to %s: %jd bytes written, %jd bytes asked to write",
+ to_name, (uintmax_t)nw,
+ (uintmax_t)size);
+ } else {
+ errno = serrno;
+ err(EX_OSERR, "%s", to_name);
+ }
}
if (nr != 0) {
serrno = errno;
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/ACKNOWLEDGEMENTS
--- a/head/usr.bin/yacc/ACKNOWLEDGEMENTS Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
- Berkeley Yacc owes much to the unflagging efforts of Keith Bostic.
-His badgering kept me working on it long after I was ready to quit.
-
- Berkeley Yacc is based on the excellent algorithm for computing LALR(1)
-lookaheads developed by Tom Pennello and Frank DeRemer. The algorithm is
-described in their almost impenetrable article in TOPLAS 4,4.
-
- Finally, much of the credit for the latest version must go to those
-who pointed out deficiencies of my earlier releases. Among the most
-prolific contributors were
-
- Benson I. Margulies
- Dave Gentzel
- Antoine Verheijen
- Peter S. Housel
- Dale Smith
- Ozan Yigit
- John Campbell
- Bill Sommerfeld
- Paul Hilfinger
- Gary Bridgewater
- Dave Bakken
- Dan Lanciani
- Richard Sargent
- Parag Patel
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/Makefile
--- a/head/usr.bin/yacc/Makefile Wed Jul 25 16:29:58 2012 +0300
+++ b/head/usr.bin/yacc/Makefile Wed Jul 25 16:31:11 2012 +0300
@@ -1,11 +1,18 @@
# @(#)Makefile 5.3 (Berkeley) 5/12/90
-# $FreeBSD$
+# $FreeBSD: head/usr.bin/yacc/Makefile 235723 2012-05-21 13:31:26Z bapt $
+
+.PATH: ${.CURDIR}/../../contrib/byacc
PROG= yacc
-SRCS= closure.c error.c lalr.c lr0.c main.c mkpar.c output.c reader.c \
- skeleton.c symtab.c verbose.c warshall.c
-SCRIPTS=yyfix.sh
-MAN= yacc.1 yyfix.1
+SRCS= closure.c error.c graph.c lalr.c lr0.c main.c mkpar.c output.c \
+ reader.c skeleton.c symtab.c verbose.c warshall.c
+
+CFLAGS+= -DMIXEDCASE_FILENAMES=1 \
+ -DCC_HAS_PROTOS=1 \
+ -DHAVE_FCNTL_H=1 \
+ -DHAVE_ATEXIT=1 \
+ -DHAVE_MKSTEMP=1
+
LINKS= ${BINDIR}/yacc ${BINDIR}/byacc
MLINKS= yacc.1 byacc.1
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/NEW_FEATURES
--- a/head/usr.bin/yacc/NEW_FEATURES Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-$FreeBSD: head/usr.bin/yacc/NEW_FEATURES 228992 2011-12-30 11:02:40Z uqs $
-
- The -r option has been implemented. The -r option tells Yacc to
-put the read-only tables in y.tab.c and the code and variables in
-y.code.c. Keith Bostic asked for this option so that :yyfix could be
-eliminated.
-
- The -l and -t options have been implemented. The -l option tells
-Yacc not to include #line directives in the code it produces. The -t
-option causes debugging code to be included in the compiled parser.
-
- The code for error recovery has been changed to implement the same
-algorithm as AT&T Yacc. There will still be differences in the way
-error recovery works because AT&T Yacc uses more default reductions
-than Berkeley Yacc.
-
- The environment variable TMPDIR determines the directory where
-temporary files will be created. If TMPDIR is defined, temporary files
-will be created in the directory whose pathname is the value of TMPDIR.
-By default, temporary files are created in /tmp.
-
- The keywords are now case-insensitive. For example, %nonassoc,
-%NONASSOC, %NonAssoc, and %nOnAsSoC are all equivalent.
-
- Commas and semicolons that are not part of C code are treated as
-commentary.
-
- Line-end comments, as in BCPL, are permitted. Line-end comments
-begin with // and end at the next end-of-line. Line-end comments are
-permitted in C code; they are converted to C comments on output.
-
- The form of y.output files has been changed to look more like
-those produced by AT&T Yacc.
-
- A new kind of declaration has been added. The form of the declaration
-is
-
- %ident string
-
-where string is a sequence of characters beginning with a double quote
-and ending with either a double quote or the next end-of-line, whichever
-comes first. The declaration will cause a #ident directive to be written
-near the start of the output file.
-
- If a parser has been compiled with debugging code, that code can be
-enabled by setting an environment variable. If the environment variable
-YYDEBUG is set to 0, debugging output is suppressed. If it is set to 1,
-debugging output is written to standard output.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/NOTES
--- a/head/usr.bin/yacc/NOTES Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-Berkeley Yacc reflects its origins. The reason so many routines
-use exactly six register variables is that Berkeley Yacc was
-developed on a VAX using PCC. PCC placed at most six variables
-in registers. I went to considerable effort to find which six
-variables most belonged in registers. Changes in machines and
-compilers make that effort worthless, perhaps even harmful.
-
-The code contains many instances where address calculations are
-performed in particular ways to optimize the code for the VAX.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/README
--- a/head/usr.bin/yacc/README Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
- Berkeley Yacc is an LALR(1) parser generator. Berkeley Yacc has been made
-as compatible as possible with AT&T Yacc. Berkeley Yacc can accept any input
-specification that conforms to the AT&T Yacc documentation. Specifications
-that take advantage of undocumented features of AT&T Yacc will probably be
-rejected.
-
- Berkeley Yacc is distributed with no warranty whatever. The code is certain
-to contain errors. Neither the author nor any contributor takes responsibility
-for any consequences of its use.
-
- Berkeley Yacc is in the public domain. The data structures and algorithms
-used in Berkeley Yacc are all either taken from documents available to the
-general public or are inventions of the author. Anyone may freely distribute
-source or binary forms of Berkeley Yacc whether unchanged or modified.
-Distributers may charge whatever fees they can obtain for Berkeley Yacc.
-Programs generated by Berkeley Yacc may be distributed freely.
-
- Please report bugs to
-
- robert.corbett at eng.Sun.COM
-
-Include a small example if possible. Please include the banner string from
-skeleton.c with the bug report. Do not expect rapid responses.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/closure.c
--- a/head/usr.bin/yacc/closure.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,306 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)closure.c 5.3 (Berkeley) 5/24/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include "defs.h"
-
-short *itemset;
-short *itemsetend;
-unsigned *ruleset;
-
-static void set_EFF(void);
-#ifdef DEBUG
-static void print_closure(int);
-static void print_EFF();
-static void print_first_derives();
-#endif
-
-static unsigned *first_derives;
-static unsigned *EFF;
-
-
-static void
-set_EFF(void)
-{
- unsigned *row;
- int symbol;
- short *sp;
- int rowsize;
- int i;
- int rule;
-
- rowsize = WORDSIZE(nvars);
- EFF = NEW2(nvars * rowsize, unsigned);
-
- row = EFF;
- for (i = start_symbol; i < nsyms; i++)
- {
- sp = derives[i];
- for (rule = *sp; rule > 0; rule = *++sp)
- {
- symbol = ritem[rrhs[rule]];
- if (ISVAR(symbol))
- {
- symbol -= start_symbol;
- SETBIT(row, symbol);
- }
- }
- row += rowsize;
- }
-
- reflexive_transitive_closure(EFF, nvars);
-
-#ifdef DEBUG
- print_EFF();
-#endif
-}
-
-
-void
-set_first_derives(void)
-{
- unsigned *rrow;
- unsigned *vrow;
- int j;
- unsigned k;
- unsigned cword = 0;
- short *rp;
-
- int rule;
- int i;
- int rulesetsize;
- int varsetsize;
-
- rulesetsize = WORDSIZE(nrules);
- varsetsize = WORDSIZE(nvars);
- first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
-
- set_EFF();
-
- rrow = first_derives + ntokens * rulesetsize;
- for (i = start_symbol; i < nsyms; i++)
- {
- vrow = EFF + ((i - ntokens) * varsetsize);
- k = BITS_PER_WORD;
- for (j = start_symbol; j < nsyms; k++, j++)
- {
- if (k >= BITS_PER_WORD)
- {
- cword = *vrow++;
- k = 0;
- }
-
- if (cword & (1 << k))
- {
- rp = derives[j];
- while ((rule = *rp++) >= 0)
- {
- SETBIT(rrow, rule);
- }
- }
- }
-
- rrow += rulesetsize;
- }
-
-#ifdef DEBUG
- print_first_derives();
-#endif
-
- free(EFF);
-}
-
-
-void
-closure(short *nucleus, int n)
-{
- int ruleno;
- unsigned word;
- unsigned i;
- short *csp;
- unsigned *dsp;
- unsigned *rsp;
- int rulesetsize;
-
- short *csend;
- unsigned *rsend;
- int symbol;
- int itemno;
-
- rulesetsize = WORDSIZE(nrules);
- rsend = ruleset + rulesetsize;
- for (rsp = ruleset; rsp < rsend; rsp++)
- *rsp = 0;
-
- csend = nucleus + n;
- for (csp = nucleus; csp < csend; ++csp)
- {
- symbol = ritem[*csp];
- if (ISVAR(symbol))
- {
- dsp = first_derives + symbol * rulesetsize;
- rsp = ruleset;
- while (rsp < rsend)
- *rsp++ |= *dsp++;
- }
- }
-
- ruleno = 0;
- itemsetend = itemset;
- csp = nucleus;
- for (rsp = ruleset; rsp < rsend; ++rsp)
- {
- word = *rsp;
- if (word)
- {
- for (i = 0; i < BITS_PER_WORD; ++i)
- {
- if (word & (1 << i))
- {
- itemno = rrhs[ruleno+i];
- while (csp < csend && *csp < itemno)
- *itemsetend++ = *csp++;
- *itemsetend++ = itemno;
- while (csp < csend && *csp == itemno)
- ++csp;
- }
- }
- }
- ruleno += BITS_PER_WORD;
- }
-
- while (csp < csend)
- *itemsetend++ = *csp++;
-
-#ifdef DEBUG
- print_closure(n);
-#endif
-}
-
-
-
-void
-finalize_closure(void)
-{
- free(itemset);
- free(ruleset);
- free(first_derives + ntokens * WORDSIZE(nrules));
-}
-
-
-#ifdef DEBUG
-
-static void
-print_closure(int n)
-{
- short *isp;
-
- printf("\n\nn = %d\n\n", n);
- for (isp = itemset; isp < itemsetend; isp++)
- printf(" %d\n", *isp);
-}
-
-
-static void
-print_EFF(void)
-{
- int i, j;
- unsigned *rowp;
- unsigned word;
- unsigned k;
-
- printf("\n\nEpsilon Free Firsts\n");
-
- for (i = start_symbol; i < nsyms; i++)
- {
- printf("\n%s", symbol_name[i]);
- rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
- word = *rowp++;
-
- k = BITS_PER_WORD;
- for (j = 0; j < nvars; k++, j++)
- {
- if (k >= BITS_PER_WORD)
- {
- word = *rowp++;
- k = 0;
- }
-
- if (word & (1 << k))
- printf(" %s", symbol_name[start_symbol + j]);
- }
- }
-}
-
-
-static void
-print_first_derives(void)
-{
- int i;
- int j;
- unsigned *rp;
- unsigned cword;
- unsigned k;
-
- printf("\n\n\nFirst Derives\n");
-
- for (i = start_symbol; i < nsyms; i++)
- {
- printf("\n%s derives\n", symbol_name[i]);
- rp = first_derives + i * WORDSIZE(nrules);
- k = BITS_PER_WORD;
- for (j = 0; j <= nrules; k++, j++)
- {
- if (k >= BITS_PER_WORD)
- {
- cword = *rp++;
- k = 0;
- }
-
- if (cword & (1 << k))
- printf(" %d\n", j);
- }
- }
-
- fflush(stdout);
-}
-
-#endif
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/defs.h
--- a/head/usr.bin/yacc/defs.h Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,348 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)defs.h 5.6 (Berkeley) 5/24/93
- * $FreeBSD$
- */
-
-#include <assert.h>
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-
-
-/* machine-dependent definitions */
-/* the following definitions are for the Tahoe */
-/* they might have to be changed for other machines */
-
-/* MAXTABLE is the maximum table size */
-/* BITS_PER_WORD is the number of bits in a C unsigned */
-/* WORDSIZE computes the number of words needed to */
-/* store n bits */
-/* BIT returns the value of the n-th bit starting */
-/* from r (0-indexed) */
-/* SETBIT sets the n-th bit starting from r */
-
-#define MAXTABLE 32500
-#define BITS_PER_WORD 32
-#define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD)
-#define BIT(r, n) ((((r)[(n)>>5])>>((n)&31))&1)
-#define SETBIT(r, n) ((r)[(n)>>5]|=((unsigned)1<<((n)&31)))
-
-
-/* character names */
-
-#define NUL '\0' /* the null character */
-#define NEWLINE '\n' /* line feed */
-#define SP ' ' /* space */
-#define BS '\b' /* backspace */
-#define HT '\t' /* horizontal tab */
-#define VT '\013' /* vertical tab */
-#define CR '\r' /* carriage return */
-#define FF '\f' /* form feed */
-#define QUOTE '\'' /* single quote */
-#define DOUBLE_QUOTE '\"' /* double quote */
-#define BACKSLASH '\\' /* backslash */
-
-
-/* defines for constructing filenames */
-
-#define CODE_SUFFIX ".code.c"
-#define DEFINES_SUFFIX ".tab.h"
-#define OUTPUT_SUFFIX ".tab.c"
-#define VERBOSE_SUFFIX ".output"
-
-
-/* keyword codes */
-
-#define TOKEN 0
-#define LEFT 1
-#define RIGHT 2
-#define NONASSOC 3
-#define MARK 4
-#define TEXT 5
-#define TYPE 6
-#define START 7
-#define UNION 8
-#define IDENT 9
-#define EXPECT 10
-
-
-/* symbol classes */
-
-#define UNKNOWN 0
-#define TERM 1
-#define NONTERM 2
-
-
-/* the undefined value */
-
-#define UNDEFINED (-1)
-
-
-/* action codes */
-
-#define SHIFT 1
-#define REDUCE 2
-
-
-/* character macros */
-
-#define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$')
-#define IS_OCTAL(c) ((c) >= '0' && (c) <= '7')
-#define NUMERIC_VALUE(c) ((c) - '0')
-
-
-/* symbol macros */
-
-#define ISTOKEN(s) ((s) < start_symbol)
-#define ISVAR(s) ((s) >= start_symbol)
-
-
-/* storage allocation macros */
-
-#define NEW(t) ((t*)allocate(sizeof(t)))
-#define NEW2(n,t) ((t*)allocate((n)*sizeof(t)))
-
-
-/* the structure of a symbol table entry */
-
-typedef struct bucket bucket;
-struct bucket
-{
- struct bucket *link;
- struct bucket *next;
- char *name;
- char *tag;
- short value;
- short index;
- short prec;
- char class;
- char assoc;
-};
-
-
-/* the structure of the LR(0) state machine */
-
-typedef struct core core;
-struct core
-{
- struct core *next;
- struct core *link;
- short number;
- short accessing_symbol;
- short nitems;
- short items[1];
-};
-
-
-/* the structure used to record shifts */
-
-typedef struct shifts shifts;
-struct shifts
-{
- struct shifts *next;
- short number;
- short nshifts;
- short shift[1];
-};
-
-
-/* the structure used to store reductions */
-
-typedef struct reductions reductions;
-struct reductions
-{
- struct reductions *next;
- short number;
- short nreds;
- short rules[1];
-};
-
-
-/* the structure used to represent parser actions */
-
-typedef struct action action;
-struct action
-{
- struct action *next;
- short symbol;
- short number;
- short prec;
- char action_code;
- char assoc;
- char suppressed;
-};
-
-
-/* global variables */
-
-extern char dflag;
-extern char lflag;
-extern char rflag;
-extern char tflag;
-extern char vflag;
-extern const char *symbol_prefix;
-
-extern char *cptr;
-extern char *line;
-extern int lineno;
-extern int outline;
-
-extern const char *banner[];
-extern const char *tables[];
-extern const char *header[];
-extern const char *body[];
-extern const char *trailer[];
-
-extern char *action_file_name;
-extern char *code_file_name;
-extern char *defines_file_name;
-extern const char *input_file_name;
-extern char *output_file_name;
-extern char *text_file_name;
-extern char *union_file_name;
-extern char *verbose_file_name;
-
-extern FILE *action_file;
-extern FILE *code_file;
-extern FILE *defines_file;
-extern FILE *input_file;
-extern FILE *output_file;
-extern FILE *text_file;
-extern FILE *union_file;
-extern FILE *verbose_file;
-
-extern int nitems;
-extern int nrules;
-extern int nsyms;
-extern int ntokens;
-extern int nvars;
-extern int ntags;
-
-extern char unionized;
-
-extern int start_symbol;
-extern char **symbol_name;
-extern short *symbol_value;
-extern short *symbol_prec;
-extern char *symbol_assoc;
-
-extern short *ritem;
-extern short *rlhs;
-extern short *rrhs;
-extern short *rprec;
-extern char *rassoc;
-
-extern short **derives;
-extern char *nullable;
-
-extern bucket *first_symbol;
-extern bucket *last_symbol;
-
-extern int nstates;
-extern core *first_state;
-extern shifts *first_shift;
-extern reductions *first_reduction;
-extern short *accessing_symbol;
-extern core **state_table;
-extern shifts **shift_table;
-extern reductions **reduction_table;
-extern unsigned *LA;
-extern short *LAruleno;
-extern short *lookaheads;
-extern short *goto_map;
-extern short *from_state;
-extern short *to_state;
-
-extern action **parser;
-extern int SRexpect;
-extern int SRtotal;
-extern int RRtotal;
-extern short *SRconflicts;
-extern short *RRconflicts;
-extern short *defred;
-extern short *rules_used;
-extern short nunused;
-extern short final_state;
-
-/* global functions */
-
-void *allocate(size_t);
-void closure(short *, int);
-void create_symbol_table(void);
-void default_action_warning(void);
-void dollar_error(int, char *, char *) __dead2;
-void dollar_warning(int, int);
-void done(int) __dead2;
-void fatal(const char *msg) __dead2;
-void finalize_closure(void);
-void free_parser(void);
-void free_symbols(void);
-void free_symbol_table(void);
-void illegal_character(char *) __dead2;
-void illegal_tag(int, char *, char *) __dead2;
-void lalr(void);
-bucket *lookup(char *);
-void lr0(void);
-bucket *make_bucket(const char *);
-void make_parser(void);
-void no_grammar(void) __dead2;
-void no_space(void) __dead2;
-void open_error(const char *) __dead2;
-void output(void);
-void over_unionized(char *) __dead2;
-void prec_redeclared(void);
-void reader(void);
-void reflexive_transitive_closure(unsigned *, int);
-void reprec_warning(char *);
-void restarted_warning(void);
-void retyped_warning(char *);
-void revalued_warning(char *);
-void set_first_derives(void);
-void syntax_error(int, char *, char *) __dead2;
-void terminal_lhs(int) __dead2;
-void terminal_start(char *) __dead2;
-void tokenized_start(char *) __dead2;
-void undefined_goal(char *) __dead2;
-void undefined_symbol_warning(char *);
-void unexpected_EOF(void) __dead2;
-void unknown_rhs(int) __dead2;
-void unterminated_action(int, char *, char *) __dead2;
-void unterminated_comment(int, char *, char *) __dead2;
-void unterminated_string(int, char *, char *) __dead2;
-void unterminated_text(int, char *, char *) __dead2;
-void unterminated_union(int, char *, char *) __dead2;
-void untyped_lhs(void) __dead2;
-void untyped_rhs(int, char *) __dead2;
-void used_reserved(char *) __dead2;
-void verbose(void);
-void write_section(const char **);
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/error.c
--- a/head/usr.bin/yacc/error.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,341 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)error.c 5.3 (Berkeley) 6/1/90";
-#endif
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* routines for printing error messages */
-
-#include "defs.h"
-
-static void print_pos(char *, char *);
-
-void
-fatal(const char *msg)
-{
- warnx("f - %s", msg);
- done(2);
-}
-
-
-void
-no_space(void)
-{
- warnx("f - out of space");
- done(2);
-}
-
-
-void
-open_error(const char *filename)
-{
- warnx("f - cannot open \"%s\"", filename);
- done(2);
-}
-
-
-void
-unexpected_EOF(void)
-{
- warnx("e - line %d of \"%s\", unexpected end-of-file",
- lineno, input_file_name);
- done(1);
-}
-
-
-static void
-print_pos(char *st_line, char *st_cptr)
-{
- char *s;
-
- if (st_line == 0) return;
- for (s = st_line; *s != '\n'; ++s)
- {
- if (isprint(*s) || *s == '\t')
- putc(*s, stderr);
- else
- putc('?', stderr);
- }
- putc('\n', stderr);
- for (s = st_line; s < st_cptr; ++s)
- {
- if (*s == '\t')
- putc('\t', stderr);
- else
- putc(' ', stderr);
- }
- putc('^', stderr);
- putc('\n', stderr);
-}
-
-
-void
-syntax_error(int st_lineno, char *st_line, char *st_cptr)
-{
- warnx("e - line %d of \"%s\", syntax error",
- st_lineno, input_file_name);
- print_pos(st_line, st_cptr);
- done(1);
-}
-
-
-void
-unterminated_comment(int c_lineno, char *c_line, char *c_cptr)
-{
- warnx("e - line %d of \"%s\", unmatched /*",
- c_lineno, input_file_name);
- print_pos(c_line, c_cptr);
- done(1);
-}
-
-
-void
-unterminated_string(int s_lineno, char *s_line, char *s_cptr)
-{
- warnx("e - line %d of \"%s\", unterminated string",
- s_lineno, input_file_name);
- print_pos(s_line, s_cptr);
- done(1);
-}
-
-
-void
-unterminated_text(int t_lineno, char *t_line, char *t_cptr)
-{
- warnx("e - line %d of \"%s\", unmatched %%{",
- t_lineno, input_file_name);
- print_pos(t_line, t_cptr);
- done(1);
-}
-
-
-void
-unterminated_union(int u_lineno, char *u_line, char *u_cptr)
-{
- warnx("e - line %d of \"%s\", unterminated %%union declaration",
- u_lineno, input_file_name);
- print_pos(u_line, u_cptr);
- done(1);
-}
-
-
-void
-over_unionized(char *u_cptr)
-{
- warnx("e - line %d of \"%s\", too many %%union declarations",
- lineno, input_file_name);
- print_pos(line, u_cptr);
- done(1);
-}
-
-
-void
-illegal_tag(int t_lineno, char *t_line, char *t_cptr)
-{
- warnx("e - line %d of \"%s\", illegal tag", t_lineno, input_file_name);
- print_pos(t_line, t_cptr);
- done(1);
-}
-
-
-void
-illegal_character(char *c_cptr)
-{
- warnx("e - line %d of \"%s\", illegal character", lineno, input_file_name);
- print_pos(line, c_cptr);
- done(1);
-}
-
-
-void
-used_reserved(char *s)
-{
- warnx("e - line %d of \"%s\", illegal use of reserved symbol %s",
- lineno, input_file_name, s);
- done(1);
-}
-
-
-void
-tokenized_start(char *s)
-{
- warnx("e - line %d of \"%s\", the start symbol %s cannot be \
-declared to be a token", lineno, input_file_name, s);
- done(1);
-}
-
-
-void
-retyped_warning(char *s)
-{
- warnx("w - line %d of \"%s\", the type of %s has been redeclared",
- lineno, input_file_name, s);
-}
-
-
-void
-reprec_warning(char *s)
-{
- warnx("w - line %d of \"%s\", the precedence of %s has been redeclared",
- lineno, input_file_name, s);
-}
-
-
-void
-revalued_warning(char *s)
-{
- warnx("w - line %d of \"%s\", the value of %s has been redeclared",
- lineno, input_file_name, s);
-}
-
-
-void
-terminal_start(char *s)
-{
- warnx("e - line %d of \"%s\", the start symbol %s is a token",
- lineno, input_file_name, s);
- done(1);
-}
-
-
-void
-restarted_warning(void)
-{
- warnx("w - line %d of \"%s\", the start symbol has been redeclared",
- lineno, input_file_name);
-}
-
-
-void
-no_grammar(void)
-{
- warnx("e - line %d of \"%s\", no grammar has been specified",
- lineno, input_file_name);
- done(1);
-}
-
-
-void
-terminal_lhs(int s_lineno)
-{
- warnx("e - line %d of \"%s\", a token appears on the lhs of a production",
- s_lineno, input_file_name);
- done(1);
-}
-
-
-void
-prec_redeclared(void)
-{
- warnx("w - line %d of \"%s\", conflicting %%prec specifiers",
- lineno, input_file_name);
-}
-
-
-void
-unterminated_action(int a_lineno, char *a_line, char *a_cptr)
-{
- warnx("e - line %d of \"%s\", unterminated action",
- a_lineno, input_file_name);
- print_pos(a_line, a_cptr);
- done(1);
-}
-
-
-void
-dollar_warning(int a_lineno, int i)
-{
- warnx("w - line %d of \"%s\", $%d references beyond the \
-end of the current rule", a_lineno, input_file_name, i);
-}
-
-
-void
-dollar_error(int a_lineno, char *a_line, char *a_cptr)
-{
- warnx("e - line %d of \"%s\", illegal $-name", a_lineno, input_file_name);
- print_pos(a_line, a_cptr);
- done(1);
-}
-
-
-void
-untyped_lhs(void)
-{
- warnx("e - line %d of \"%s\", $$ is untyped", lineno, input_file_name);
- done(1);
-}
-
-
-void
-untyped_rhs(int i, char *s)
-{
- warnx("e - line %d of \"%s\", $%d (%s) is untyped",
- lineno, input_file_name, i, s);
- done(1);
-}
-
-
-void
-unknown_rhs(int i)
-{
- warnx("e - line %d of \"%s\", $%d is untyped", lineno, input_file_name, i);
- done(1);
-}
-
-
-void
-default_action_warning(void)
-{
- warnx("w - line %d of \"%s\", the default action assigns an \
-undefined value to $$", lineno, input_file_name);
-}
-
-
-void
-undefined_goal(char *s)
-{
- warnx("e - the start symbol %s is undefined", s);
- done(1);
-}
-
-
-void
-undefined_symbol_warning(char *s)
-{
- warnx("w - the symbol %s is undefined", s);
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/lalr.c
--- a/head/usr.bin/yacc/lalr.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,701 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lalr.c 5.3 (Berkeley) 6/1/90";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdlib.h>
-#include "defs.h"
-
-typedef
- struct shorts
- {
- struct shorts *next;
- short value;
- }
- shorts;
-
-int tokensetsize;
-short *lookaheads;
-short *LAruleno;
-unsigned *LA;
-short *accessing_symbol;
-core **state_table;
-shifts **shift_table;
-reductions **reduction_table;
-short *goto_map;
-short *from_state;
-short *to_state;
-
-static void add_lookback_edge(int, int, int);
-static void build_relations(void);
-static void compute_FOLLOWS(void);
-static void compute_lookaheads(void);
-static void digraph(short **);
-static void initialize_F(void);
-static void initialize_LA(void);
-static int map_goto(int, int);
-static void set_accessing_symbol(void);
-static void set_goto_map(void);
-static void set_maxrhs(void);
-static void set_reduction_table(void);
-static void set_shift_table(void);
-static void set_state_table(void);
-static short **transpose(short **, int);
-static void traverse(int, short **);
-
-static int infinity;
-static int maxrhs;
-static int ngotos;
-static unsigned *F;
-static short **includes;
-static shorts **lookback;
-static short *INDEX;
-static short *VERTICES;
-static int top;
-
-
-void
-lalr(void)
-{
- tokensetsize = WORDSIZE(ntokens);
-
- set_state_table();
- set_accessing_symbol();
- set_shift_table();
- set_reduction_table();
- set_maxrhs();
- initialize_LA();
- set_goto_map();
- initialize_F();
- build_relations();
- compute_FOLLOWS();
- compute_lookaheads();
-}
-
-
-
-static void
-set_state_table(void)
-{
- core *sp;
-
- state_table = NEW2(nstates, core *);
- for (sp = first_state; sp; sp = sp->next)
- state_table[sp->number] = sp;
-}
-
-
-
-static void
-set_accessing_symbol(void)
-{
- core *sp;
-
- accessing_symbol = NEW2(nstates, short);
- for (sp = first_state; sp; sp = sp->next)
- accessing_symbol[sp->number] = sp->accessing_symbol;
-}
-
-
-
-static void
-set_shift_table(void)
-{
- shifts *sp;
-
- shift_table = NEW2(nstates, shifts *);
- for (sp = first_shift; sp; sp = sp->next)
- shift_table[sp->number] = sp;
-}
-
-
-
-static void
-set_reduction_table(void)
-{
- reductions *rp;
-
- reduction_table = NEW2(nstates, reductions *);
- for (rp = first_reduction; rp; rp = rp->next)
- reduction_table[rp->number] = rp;
-}
-
-
-
-static void
-set_maxrhs(void)
-{
- short *itemp;
- short *item_end;
- int length;
- int max;
-
- length = 0;
- max = 0;
- item_end = ritem + nitems;
- for (itemp = ritem; itemp < item_end; itemp++)
- {
- if (*itemp >= 0)
- {
- length++;
- }
- else
- {
- if (length > max) max = length;
- length = 0;
- }
- }
-
- maxrhs = max;
-}
-
-
-
-static void
-initialize_LA(void)
-{
- int i, j, k;
- reductions *rp;
-
- lookaheads = NEW2(nstates + 1, short);
-
- k = 0;
- for (i = 0; i < nstates; i++)
- {
- lookaheads[i] = k;
- rp = reduction_table[i];
- if (rp)
- k += rp->nreds;
- }
- lookaheads[nstates] = k;
-
- LA = NEW2(k * tokensetsize, unsigned);
- LAruleno = NEW2(k, short);
- lookback = NEW2(k, shorts *);
-
- k = 0;
- for (i = 0; i < nstates; i++)
- {
- rp = reduction_table[i];
- if (rp)
- {
- for (j = 0; j < rp->nreds; j++)
- {
- LAruleno[k] = rp->rules[j];
- k++;
- }
- }
- }
-}
-
-
-static void
-set_goto_map(void)
-{
- shifts *sp;
- int i;
- int symbol;
- int k;
- short *temp_map;
- int state2;
- int state1;
-
- goto_map = NEW2(nvars + 1, short) - ntokens;
- temp_map = NEW2(nvars + 1, short) - ntokens;
-
- ngotos = 0;
- for (sp = first_shift; sp; sp = sp->next)
- {
- for (i = sp->nshifts - 1; i >= 0; i--)
- {
- symbol = accessing_symbol[sp->shift[i]];
-
- if (ISTOKEN(symbol)) break;
-
- if (ngotos == SHRT_MAX)
- fatal("too many gotos");
-
- ngotos++;
- goto_map[symbol]++;
- }
- }
-
- k = 0;
- for (i = ntokens; i < nsyms; i++)
- {
- temp_map[i] = k;
- k += goto_map[i];
- }
-
- for (i = ntokens; i < nsyms; i++)
- goto_map[i] = temp_map[i];
-
- goto_map[nsyms] = ngotos;
- temp_map[nsyms] = ngotos;
-
- from_state = NEW2(ngotos, short);
- to_state = NEW2(ngotos, short);
-
- for (sp = first_shift; sp; sp = sp->next)
- {
- state1 = sp->number;
- for (i = sp->nshifts - 1; i >= 0; i--)
- {
- state2 = sp->shift[i];
- symbol = accessing_symbol[state2];
-
- if (ISTOKEN(symbol)) break;
-
- k = temp_map[symbol]++;
- from_state[k] = state1;
- to_state[k] = state2;
- }
- }
-
- free(temp_map + ntokens);
-}
-
-
-
-/* Map_goto maps a state/symbol pair into its numeric representation. */
-
-static int
-map_goto(int state, int symbol)
-{
- int high;
- int low;
- int middle;
- int s;
-
- low = goto_map[symbol];
- high = goto_map[symbol + 1];
-
- for (;;)
- {
- assert(low <= high);
- middle = (low + high) >> 1;
- s = from_state[middle];
- if (s == state)
- return (middle);
- else if (s < state)
- low = middle + 1;
- else
- high = middle - 1;
- }
-}
-
-
-
-static void
-initialize_F(void)
-{
- int i;
- int j;
- int k;
- shifts *sp;
- short *edge;
- unsigned *rowp;
- short *rp;
- short **reads;
- int nedges;
- int stateno;
- int symbol;
- int nwords;
-
- nwords = ngotos * tokensetsize;
- F = NEW2(nwords, unsigned);
-
- reads = NEW2(ngotos, short *);
- edge = NEW2(ngotos + 1, short);
- nedges = 0;
-
- rowp = F;
- for (i = 0; i < ngotos; i++)
- {
- stateno = to_state[i];
- sp = shift_table[stateno];
-
- if (sp)
- {
- k = sp->nshifts;
-
- for (j = 0; j < k; j++)
- {
- symbol = accessing_symbol[sp->shift[j]];
- if (ISVAR(symbol))
- break;
- SETBIT(rowp, symbol);
- }
-
- for (; j < k; j++)
- {
- symbol = accessing_symbol[sp->shift[j]];
- if (nullable[symbol])
- edge[nedges++] = map_goto(stateno, symbol);
- }
-
- if (nedges)
- {
- reads[i] = rp = NEW2(nedges + 1, short);
-
- for (j = 0; j < nedges; j++)
- rp[j] = edge[j];
-
- rp[nedges] = -1;
- nedges = 0;
- }
- }
-
- rowp += tokensetsize;
- }
-
- SETBIT(F, 0);
- digraph(reads);
-
- for (i = 0; i < ngotos; i++)
- {
- if (reads[i])
- free(reads[i]);
- }
-
- free(reads);
- free(edge);
-}
-
-
-
-static void
-build_relations(void)
-{
- int i;
- int j;
- int k;
- short *rulep;
- short *rp;
- shifts *sp;
- int length;
- int nedges;
- int done1;
- int state1;
- int stateno;
- int symbol1;
- int symbol2;
- short *shortp;
- short *edge;
- short *states;
- short **new_includes;
-
- includes = NEW2(ngotos, short *);
- edge = NEW2(ngotos + 1, short);
- states = NEW2(maxrhs + 1, short);
-
- for (i = 0; i < ngotos; i++)
- {
- nedges = 0;
- state1 = from_state[i];
- symbol1 = accessing_symbol[to_state[i]];
-
- for (rulep = derives[symbol1]; *rulep >= 0; rulep++)
- {
- length = 1;
- states[0] = state1;
- stateno = state1;
-
- for (rp = ritem + rrhs[*rulep]; *rp >= 0; rp++)
- {
- symbol2 = *rp;
- sp = shift_table[stateno];
- k = sp->nshifts;
-
- for (j = 0; j < k; j++)
- {
- stateno = sp->shift[j];
- if (accessing_symbol[stateno] == symbol2) break;
- }
-
- states[length++] = stateno;
- }
-
- add_lookback_edge(stateno, *rulep, i);
-
- length--;
- done1 = 0;
- while (!done1)
- {
- done1 = 1;
- rp--;
- if (ISVAR(*rp))
- {
- stateno = states[--length];
- edge[nedges++] = map_goto(stateno, *rp);
- if (nullable[*rp] && length > 0) done1 = 0;
- }
- }
- }
-
- if (nedges)
- {
- includes[i] = shortp = NEW2(nedges + 1, short);
- for (j = 0; j < nedges; j++)
- shortp[j] = edge[j];
- shortp[nedges] = -1;
- }
- }
-
- new_includes = transpose(includes, ngotos);
-
- for (i = 0; i < ngotos; i++)
- if (includes[i])
- free(includes[i]);
-
- free(includes);
-
- includes = new_includes;
-
- free(edge);
- free(states);
-}
-
-
-static void
-add_lookback_edge(int stateno, int ruleno, int gotono)
-{
- int i, k;
- int found;
- shorts *sp;
-
- i = lookaheads[stateno];
- k = lookaheads[stateno + 1];
- found = 0;
- while (!found && i < k)
- {
- if (LAruleno[i] == ruleno)
- found = 1;
- else
- ++i;
- }
- assert(found);
-
- sp = NEW(shorts);
- sp->next = lookback[i];
- sp->value = gotono;
- lookback[i] = sp;
-}
-
-
-
-static short **
-transpose(short **R, int n)
-{
- short **new_R;
- short **temp_R;
- short *nedges;
- short *sp;
- int i;
- int k;
-
- nedges = NEW2(n, short);
-
- for (i = 0; i < n; i++)
- {
- sp = R[i];
- if (sp)
- {
- while (*sp >= 0)
- nedges[*sp++]++;
- }
- }
-
- new_R = NEW2(n, short *);
- temp_R = NEW2(n, short *);
-
- for (i = 0; i < n; i++)
- {
- k = nedges[i];
- if (k > 0)
- {
- sp = NEW2(k + 1, short);
- new_R[i] = sp;
- temp_R[i] = sp;
- sp[k] = -1;
- }
- }
-
- free(nedges);
-
- for (i = 0; i < n; i++)
- {
- sp = R[i];
- if (sp)
- {
- while (*sp >= 0)
- *temp_R[*sp++]++ = i;
- }
- }
-
- free(temp_R);
-
- return (new_R);
-}
-
-
-
-static void
-compute_FOLLOWS(void)
-{
- digraph(includes);
-}
-
-
-static void
-compute_lookaheads(void)
-{
- int i, n;
- unsigned *fp1, *fp2, *fp3;
- shorts *sp, *next;
- unsigned *rowp;
-
- rowp = LA;
- n = lookaheads[nstates];
- for (i = 0; i < n; i++)
- {
- fp3 = rowp + tokensetsize;
- for (sp = lookback[i]; sp; sp = sp->next)
- {
- fp1 = rowp;
- fp2 = F + tokensetsize * sp->value;
- while (fp1 < fp3)
- *fp1++ |= *fp2++;
- }
- rowp = fp3;
- }
-
- for (i = 0; i < n; i++)
- for (sp = lookback[i]; sp; sp = next)
- {
- next = sp->next;
- free(sp);
- }
-
- free(lookback);
- free(F);
-}
-
-
-static void
-digraph(short **relation)
-{
- int i;
-
- infinity = ngotos + 2;
- INDEX = NEW2(ngotos + 1, short);
- VERTICES = NEW2(ngotos + 1, short);
- top = 0;
-
- for (i = 0; i < ngotos; i++)
- INDEX[i] = 0;
-
- for (i = 0; i < ngotos; i++)
- {
- if (INDEX[i] == 0 && relation[i])
- traverse(i, relation);
- }
-
- free(INDEX);
- free(VERTICES);
-}
-
-
-
-static void
-traverse(int i, short **R)
-{
- unsigned *fp1;
- unsigned *fp2;
- unsigned *fp3;
- int j;
- short *rp;
-
- int height;
- unsigned *base;
-
- VERTICES[++top] = i;
- INDEX[i] = height = top;
-
- base = F + i * tokensetsize;
- fp3 = base + tokensetsize;
-
- rp = R[i];
- if (rp)
- {
- while ((j = *rp++) >= 0)
- {
- if (INDEX[j] == 0)
- traverse(j, R);
-
- if (INDEX[i] > INDEX[j])
- INDEX[i] = INDEX[j];
-
- fp1 = base;
- fp2 = F + j * tokensetsize;
-
- while (fp1 < fp3)
- *fp1++ |= *fp2++;
- }
- }
-
- if (INDEX[i] == height)
- {
- for (;;)
- {
- j = VERTICES[top--];
- INDEX[j] = infinity;
-
- if (i == j)
- break;
-
- fp1 = base;
- fp2 = F + j * tokensetsize;
-
- while (fp1 < fp3)
- *fp2++ = *fp1++;
- }
- }
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/lr0.c
--- a/head/usr.bin/yacc/lr0.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,671 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lr0.c 5.3 (Berkeley) 1/20/91";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdlib.h>
-#include "defs.h"
-
-extern short *itemset;
-extern short *itemsetend;
-extern unsigned *ruleset;
-
-int nstates;
-core *first_state;
-shifts *first_shift;
-reductions *first_reduction;
-
-static void allocate_itemsets(void);
-static void allocate_storage(void);
-static void append_states(void);
-static void free_storage(void);
-static void generate_states(void);
-static int get_state(int);
-static void initialize_states(void);
-static void new_itemsets(void);
-static core *new_state(int);
-#ifdef DEBUG
-static void print_derives(void);
-#endif
-static void save_reductions(void);
-static void save_shifts(void);
-static void set_derives(void);
-static void set_nullable(void);
-
-static core **state_set;
-static core *this_state;
-static core *last_state;
-static shifts *last_shift;
-static reductions *last_reduction;
-
-static int nshifts;
-static short *shift_symbol;
-
-static short *redset;
-static short *shiftset;
-
-static short **kernel_base;
-static short **kernel_end;
-static short *kernel_items;
-
-
-static void
-allocate_itemsets(void)
-{
- short *itemp;
- short *item_end;
- int symbol;
- int i;
- int count;
- int max;
- short *symbol_count;
-
- count = 0;
- symbol_count = NEW2(nsyms, short);
-
- item_end = ritem + nitems;
- for (itemp = ritem; itemp < item_end; itemp++)
- {
- symbol = *itemp;
- if (symbol >= 0)
- {
- count++;
- symbol_count[symbol]++;
- }
- }
-
- kernel_base = NEW2(nsyms, short *);
- kernel_items = NEW2(count, short);
-
- count = 0;
- max = 0;
- for (i = 0; i < nsyms; i++)
- {
- kernel_base[i] = kernel_items + count;
- count += symbol_count[i];
- if (max < symbol_count[i])
- max = symbol_count[i];
- }
-
- shift_symbol = symbol_count;
- kernel_end = NEW2(nsyms, short *);
-}
-
-
-static void
-allocate_storage(void)
-{
- allocate_itemsets();
- shiftset = NEW2(nsyms, short);
- redset = NEW2(nrules + 1, short);
- state_set = NEW2(nitems, core *);
-}
-
-
-static void
-append_states(void)
-{
- int i;
- int j;
- int symbol;
-
-#ifdef TRACE
- fprintf(stderr, "Entering append_states()\n");
-#endif
- for (i = 1; i < nshifts; i++)
- {
- symbol = shift_symbol[i];
- j = i;
- while (j > 0 && shift_symbol[j - 1] > symbol)
- {
- shift_symbol[j] = shift_symbol[j - 1];
- j--;
- }
- shift_symbol[j] = symbol;
- }
-
- for (i = 0; i < nshifts; i++)
- {
- symbol = shift_symbol[i];
- shiftset[i] = get_state(symbol);
- }
-}
-
-
-static void
-free_storage(void)
-{
- free(shift_symbol);
- free(redset);
- free(shiftset);
- free(kernel_base);
- free(kernel_end);
- free(kernel_items);
- free(state_set);
-}
-
-
-
-static void
-generate_states(void)
-{
- allocate_storage();
- itemset = NEW2(nitems, short);
- ruleset = NEW2(WORDSIZE(nrules), unsigned);
- set_first_derives();
- initialize_states();
-
- while (this_state)
- {
- closure(this_state->items, this_state->nitems);
- save_reductions();
- new_itemsets();
- append_states();
-
- if (nshifts > 0)
- save_shifts();
-
- this_state = this_state->next;
- }
-
- finalize_closure();
- free_storage();
-}
-
-
-
-static int
-get_state(int symbol)
-{
- int key;
- short *isp1;
- short *isp2;
- short *iend;
- core *sp;
- int found;
- int n;
-
-#ifdef TRACE
- fprintf(stderr, "Entering get_state(%d)\n", symbol);
-#endif
-
- isp1 = kernel_base[symbol];
- iend = kernel_end[symbol];
- n = iend - isp1;
-
- key = *isp1;
- assert(0 <= key && key < nitems);
- sp = state_set[key];
- if (sp)
- {
- found = 0;
- while (!found)
- {
- if (sp->nitems == n)
- {
- found = 1;
- isp1 = kernel_base[symbol];
- isp2 = sp->items;
-
- while (found && isp1 < iend)
- {
- if (*isp1++ != *isp2++)
- found = 0;
- }
- }
-
- if (!found)
- {
- if (sp->link)
- {
- sp = sp->link;
- }
- else
- {
- sp = sp->link = new_state(symbol);
- found = 1;
- }
- }
- }
- }
- else
- {
- state_set[key] = sp = new_state(symbol);
- }
-
- return (sp->number);
-}
-
-
-
-static void
-initialize_states(void)
-{
- int i;
- short *start_derives;
- core *p;
-
- start_derives = derives[start_symbol];
- for (i = 0; start_derives[i] >= 0; ++i)
- continue;
-
- p = malloc(sizeof(core) + i*sizeof(short));
- if (p == 0) no_space();
-
- p->next = 0;
- p->link = 0;
- p->number = 0;
- p->accessing_symbol = 0;
- p->nitems = i;
-
- for (i = 0; start_derives[i] >= 0; ++i)
- p->items[i] = rrhs[start_derives[i]];
-
- first_state = last_state = this_state = p;
- nstates = 1;
-}
-
-
-static void
-new_itemsets(void)
-{
- int i;
- int shiftcount;
- short *isp;
- short *ksp;
- int symbol;
-
- for (i = 0; i < nsyms; i++)
- kernel_end[i] = 0;
-
- shiftcount = 0;
- isp = itemset;
- while (isp < itemsetend)
- {
- i = *isp++;
- symbol = ritem[i];
- if (symbol > 0)
- {
- ksp = kernel_end[symbol];
- if (!ksp)
- {
- shift_symbol[shiftcount++] = symbol;
- ksp = kernel_base[symbol];
- }
-
- *ksp++ = i + 1;
- kernel_end[symbol] = ksp;
- }
- }
-
- nshifts = shiftcount;
-}
-
-
-
-static core *
-new_state(int symbol)
-{
- int n;
- core *p;
- short *isp1;
- short *isp2;
- short *iend;
-
-#ifdef TRACE
- fprintf(stderr, "Entering new_state(%d)\n", symbol);
-#endif
-
- if (nstates >= SHRT_MAX)
- fatal("too many states");
-
- isp1 = kernel_base[symbol];
- iend = kernel_end[symbol];
- n = iend - isp1;
-
- p = (core *) allocate((unsigned) (sizeof(core) + (n - 1) * sizeof(short)));
- p->accessing_symbol = symbol;
- p->number = nstates;
- p->nitems = n;
-
- isp2 = p->items;
- while (isp1 < iend)
- *isp2++ = *isp1++;
-
- last_state->next = p;
- last_state = p;
-
- nstates++;
-
- return (p);
-}
-
-
-#if 0
-/* show_cores is used for debugging */
-
-show_cores(void)
-{
- core *p;
- int i, j, k, n;
- int itemno;
-
- k = 0;
- for (p = first_state; p; ++k, p = p->next)
- {
- if (k) printf("\n");
- printf("state %d, number = %d, accessing symbol = %s\n",
- k, p->number, symbol_name[p->accessing_symbol]);
- n = p->nitems;
- for (i = 0; i < n; ++i)
- {
- itemno = p->items[i];
- printf("%4d ", itemno);
- j = itemno;
- while (ritem[j] >= 0) ++j;
- printf("%s :", symbol_name[rlhs[-ritem[j]]]);
- j = rrhs[-ritem[j]];
- while (j < itemno)
- printf(" %s", symbol_name[ritem[j++]]);
- printf(" .");
- while (ritem[j] >= 0)
- printf(" %s", symbol_name[ritem[j++]]);
- printf("\n");
- fflush(stdout);
- }
- }
-}
-
-
-/* show_ritems is used for debugging */
-
-show_ritems(void)
-{
- int i;
-
- for (i = 0; i < nitems; ++i)
- printf("ritem[%d] = %d\n", i, ritem[i]);
-}
-
-
-/* show_rrhs is used for debugging */
-show_rrhs(void)
-{
- int i;
-
- for (i = 0; i < nrules; ++i)
- printf("rrhs[%d] = %d\n", i, rrhs[i]);
-}
-
-
-/* show_shifts is used for debugging */
-
-show_shifts(void)
-{
- shifts *p;
- int i, j, k;
-
- k = 0;
- for (p = first_shift; p; ++k, p = p->next)
- {
- if (k) printf("\n");
- printf("shift %d, number = %d, nshifts = %d\n", k, p->number,
- p->nshifts);
- j = p->nshifts;
- for (i = 0; i < j; ++i)
- printf("\t%d\n", p->shift[i]);
- }
-}
-#endif
-
-
-static void
-save_shifts(void)
-{
- shifts *p;
- short *sp1;
- short *sp2;
- short *send;
-
- p = (shifts *) allocate((unsigned) (sizeof(shifts) +
- (nshifts - 1) * sizeof(short)));
-
- p->number = this_state->number;
- p->nshifts = nshifts;
-
- sp1 = shiftset;
- sp2 = p->shift;
- send = shiftset + nshifts;
-
- while (sp1 < send)
- *sp2++ = *sp1++;
-
- if (last_shift)
- {
- last_shift->next = p;
- last_shift = p;
- }
- else
- {
- first_shift = p;
- last_shift = p;
- }
-}
-
-
-
-static void
-save_reductions(void)
-{
- short *isp;
- short *rp1;
- short *rp2;
- int item;
- int count;
- reductions *p;
- short *rend;
-
- count = 0;
- for (isp = itemset; isp < itemsetend; isp++)
- {
- item = ritem[*isp];
- if (item < 0)
- {
- redset[count++] = -item;
- }
- }
-
- if (count)
- {
- p = (reductions *) allocate((unsigned) (sizeof(reductions) +
- (count - 1) * sizeof(short)));
-
- p->number = this_state->number;
- p->nreds = count;
-
- rp1 = redset;
- rp2 = p->rules;
- rend = rp1 + count;
-
- while (rp1 < rend)
- *rp2++ = *rp1++;
-
- if (last_reduction)
- {
- last_reduction->next = p;
- last_reduction = p;
- }
- else
- {
- first_reduction = p;
- last_reduction = p;
- }
- }
-}
-
-
-static void
-set_derives(void)
-{
- int i, k;
- int lhs;
- short *rules;
-
- derives = NEW2(nsyms, short *);
- rules = NEW2(nvars + nrules, short);
-
- k = 0;
- for (lhs = start_symbol; lhs < nsyms; lhs++)
- {
- derives[lhs] = rules + k;
- for (i = 0; i < nrules; i++)
- {
- if (rlhs[i] == lhs)
- {
- rules[k] = i;
- k++;
- }
- }
- rules[k] = -1;
- k++;
- }
-
-#ifdef DEBUG
- print_derives();
-#endif
-}
-
-#if 0
-free_derives()
-{
- free(derives[start_symbol]);
- free(derives);
-}
-#endif
-
-#ifdef DEBUG
-static void
-print_derives(void)
-{
- int i;
- short *sp;
-
- printf("\nDERIVES\n\n");
-
- for (i = start_symbol; i < nsyms; i++)
- {
- printf("%s derives ", symbol_name[i]);
- for (sp = derives[i]; *sp >= 0; sp++)
- {
- printf(" %d", *sp);
- }
- putchar('\n');
- }
-
- putchar('\n');
-}
-#endif
-
-
-static void
-set_nullable(void)
-{
- int i, j;
- int empty;
- int done1;
-
- nullable = malloc(nsyms);
- if (nullable == 0) no_space();
-
- for (i = 0; i < nsyms; ++i)
- nullable[i] = 0;
-
- done1 = 0;
- while (!done1)
- {
- done1 = 1;
- for (i = 1; i < nitems; i++)
- {
- empty = 1;
- while ((j = ritem[i]) >= 0)
- {
- if (!nullable[j])
- empty = 0;
- ++i;
- }
- if (empty)
- {
- j = rlhs[-j];
- if (!nullable[j])
- {
- nullable[j] = 1;
- done1 = 0;
- }
- }
- }
- }
-
-#ifdef DEBUG
- for (i = 0; i < nsyms; i++)
- {
- if (nullable[i])
- printf("%s is nullable\n", symbol_name[i]);
- else
- printf("%s is not nullable\n", symbol_name[i]);
- }
-#endif
-}
-
-
-#if 0
-free_nullable(void)
-{
- free(nullable);
-}
-#endif
-
-
-void
-lr0(void)
-{
- set_derives();
- set_nullable();
- generate_states();
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/main.c
--- a/head/usr.bin/yacc/main.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,438 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)main.c 5.5 (Berkeley) 5/24/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <paths.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "defs.h"
-
-char dflag;
-char lflag;
-char rflag;
-char tflag;
-char vflag;
-
-const char *symbol_prefix;
-const char *file_prefix = "y";
-char temp_form[] = "yacc.XXXXXXXXXXX";
-
-int lineno;
-int outline;
-
-char *action_file_name;
-char *code_file_name;
-char *defines_file_name;
-const char *input_file_name = "";
-char *output_file_name;
-char *text_file_name;
-char *union_file_name;
-char *verbose_file_name;
-
-FILE *action_file; /* a temp file, used to save actions associated */
- /* with rules until the parser is written */
-FILE *code_file; /* y.code.c (used when the -r option is specified) */
-FILE *defines_file; /* y.tab.h */
-FILE *input_file; /* the input file */
-FILE *output_file; /* y.tab.c */
-FILE *text_file; /* a temp file, used to save text until all */
- /* symbols have been defined */
-FILE *union_file; /* a temp file, used to save the union */
- /* definition until all symbol have been */
- /* defined */
-FILE *verbose_file; /* y.output */
-
-int nitems;
-int nrules;
-int nsyms;
-int ntokens;
-int nvars;
-
-int start_symbol;
-char **symbol_name;
-short *symbol_value;
-short *symbol_prec;
-char *symbol_assoc;
-
-short *ritem;
-short *rlhs;
-short *rrhs;
-short *rprec;
-char *rassoc;
-short **derives;
-char *nullable;
-
-static void create_file_names(void);
-static void getargs(int, char **);
-static void onintr(int);
-static void open_files(void);
-static void set_signals(void);
-static void usage(void);
-
-volatile sig_atomic_t sigdie;
-
-__dead2 void
-done(int k)
-{
- if (action_file) { fclose(action_file); unlink(action_file_name); }
- if (text_file) { fclose(text_file); unlink(text_file_name); }
- if (union_file) { fclose(union_file); unlink(union_file_name); }
- if (sigdie) { _exit(k); }
- exit(k);
-}
-
-
-static void
-onintr(int signo __unused)
-{
- sigdie = 1;
- done(1);
-}
-
-
-static void
-set_signals(void)
-{
-#ifdef SIGINT
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, onintr);
-#endif
-#ifdef SIGTERM
- if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
- signal(SIGTERM, onintr);
-#endif
-#ifdef SIGHUP
- if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
- signal(SIGHUP, onintr);
-#endif
-}
-
-
-static void
-usage(void)
-{
- fprintf(stderr, "%s\n%s\n",
- "usage: yacc [-dlrtv] [-b file_prefix] [-o output_filename]",
- " [-p symbol_prefix] filename");
- exit(1);
-}
-
-
-static void
-getargs(int argc, char *argv[])
-{
- int ch;
-
- while ((ch = getopt(argc, argv, "b:dlo:p:rtvy")) != -1)
- {
- switch (ch)
- {
- case 'b':
- file_prefix = optarg;
- break;
-
- case 'd':
- dflag = 1;
- break;
-
- case 'l':
- lflag = 1;
- break;
-
- case 'o':
- output_file_name = optarg;
- break;
-
- case 'p':
- symbol_prefix = optarg;
- break;
-
- case 'r':
- rflag = 1;
- break;
-
- case 't':
- tflag = 1;
- break;
-
- case 'v':
- vflag = 1;
- break;
-
- case 'y':
- /* for bison compatibility -- byacc is already POSIX compatible */
- break;
-
- default:
- usage();
- }
- }
-
- if (optind + 1 != argc)
- usage();
- if (strcmp(argv[optind], "-") == 0)
- input_file = stdin;
- else
- input_file_name = argv[optind];
-}
-
-
-void *
-allocate(size_t n)
-{
- void *p;
-
- p = NULL;
- if (n)
- {
- p = calloc(1, n);
- if (!p) no_space();
- }
- return (p);
-}
-
-
-static void
-create_file_names(void)
-{
- int i, len;
- const char *tmpdir;
-
- if (!(tmpdir = getenv("TMPDIR")))
- tmpdir = _PATH_TMP;
-
- len = strlen(tmpdir);
- i = len + strlen(temp_form) + 1;
- if (len && tmpdir[len-1] != '/')
- ++i;
-
- action_file_name = malloc(i);
- if (action_file_name == 0) no_space();
- text_file_name = malloc(i);
- if (text_file_name == 0) no_space();
- union_file_name = malloc(i);
- if (union_file_name == 0) no_space();
-
- strcpy(action_file_name, tmpdir);
- strcpy(text_file_name, tmpdir);
- strcpy(union_file_name, tmpdir);
-
- if (len && tmpdir[len - 1] != '/')
- {
- action_file_name[len] = '/';
- text_file_name[len] = '/';
- union_file_name[len] = '/';
- ++len;
- }
-
- strcpy(action_file_name + len, temp_form);
- strcpy(text_file_name + len, temp_form);
- strcpy(union_file_name + len, temp_form);
-
- action_file_name[len + 5] = 'a';
- text_file_name[len + 5] = 't';
- union_file_name[len + 5] = 'u';
-
- if (output_file_name != 0)
- {
- file_prefix = output_file_name;
- len = strlen(file_prefix);
- }
- else
- {
- len = strlen(file_prefix);
- output_file_name = malloc(len + 7);
- if (output_file_name == 0)
- no_space();
- strcpy(output_file_name, file_prefix);
- strcpy(output_file_name + len, OUTPUT_SUFFIX);
- }
-
- if (rflag)
- {
- code_file_name = malloc(len + 8);
- if (code_file_name == 0)
- no_space();
- strcpy(code_file_name, file_prefix);
- if (file_prefix == output_file_name)
- {
- /*
- * XXX ".tab.c" here is OUTPUT_SUFFIX, but since its length is
- * in various magic numbers, don't bother using the macro.
- */
- if (len >= 6 && strcmp(code_file_name + len - 6, ".tab.c") == 0)
- strcpy(code_file_name + len - 6, CODE_SUFFIX);
- else if (len >= 2 && strcmp(code_file_name + len - 2, ".c") == 0)
- strcpy(code_file_name + len - 2, CODE_SUFFIX);
- else
- strcpy(code_file_name + len, CODE_SUFFIX);
- }
- else
- strcpy(code_file_name + len, CODE_SUFFIX);
- }
- else
- code_file_name = output_file_name;
-
- if (dflag)
- {
- defines_file_name = malloc(len + 7);
- if (defines_file_name == 0)
- no_space();
- strcpy(defines_file_name, file_prefix);
- if (file_prefix == output_file_name)
- {
-#define BISON_DEFINES_SUFFIX ".h"
- if (len >= 2 && strcmp(defines_file_name + len - 2, ".c") == 0)
- strcpy(defines_file_name + len - 2, BISON_DEFINES_SUFFIX);
- else
- strcpy(defines_file_name + len, BISON_DEFINES_SUFFIX);
- }
- else
- strcpy(defines_file_name + len, DEFINES_SUFFIX);
- }
-
- if (vflag)
- {
- verbose_file_name = malloc(len + 8);
- if (verbose_file_name == 0)
- no_space();
- strcpy(verbose_file_name, file_prefix);
- if (file_prefix == output_file_name)
- {
- if (len >= 6 && strcmp(verbose_file_name + len - 6, ".tab.c") == 0)
- strcpy(verbose_file_name + len - 6, VERBOSE_SUFFIX);
- else if (len >= 2 && strcmp(verbose_file_name + len - 2, ".c") == 0)
- strcpy(verbose_file_name + len - 2, VERBOSE_SUFFIX);
- else
- strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
- }
- else
- strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
- }
-}
-
-
-static void
-open_files(void)
-{
- int fd;
-
- create_file_names();
-
- if (input_file == 0)
- {
- input_file = fopen(input_file_name, "r");
- if (input_file == 0)
- open_error(input_file_name);
- }
-
- fd = mkstemp(action_file_name);
- if (fd < 0 || (action_file = fdopen(fd, "w")) == NULL) {
- if (fd >= 0)
- close(fd);
- open_error(action_file_name);
- }
- fd = mkstemp(text_file_name);
- if (fd < 0 || (text_file = fdopen(fd, "w")) == NULL) {
- if (fd >= 0)
- close(fd);
- open_error(text_file_name);
- }
- fd = mkstemp(union_file_name);
- if (fd < 0 || (union_file = fdopen(fd, "w")) == NULL) {
- if (fd >= 0)
- close(fd);
- open_error(union_file_name);
- }
-
- text_file = fopen(text_file_name, "w");
- if (text_file == 0)
- open_error(text_file_name);
-
- if (vflag)
- {
- verbose_file = fopen(verbose_file_name, "w");
- if (verbose_file == 0)
- open_error(verbose_file_name);
- }
-
- if (dflag)
- {
- defines_file = fopen(defines_file_name, "w");
- if (defines_file == 0)
- open_error(defines_file_name);
- union_file = fopen(union_file_name, "w");
- if (union_file == 0)
- open_error(union_file_name);
- }
-
- output_file = fopen(output_file_name, "w");
- if (output_file == 0)
- open_error(output_file_name);
-
- if (rflag)
- {
- code_file = fopen(code_file_name, "w");
- if (code_file == 0)
- open_error(code_file_name);
- }
- else
- code_file = output_file;
-}
-
-
-int
-main(int argc, char *argv[])
-{
- set_signals();
- getargs(argc, argv);
- open_files();
- reader();
- lr0();
- lalr();
- make_parser();
- verbose();
- output();
- done(0);
- /*NOTREACHED*/
- return (0);
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/mkpar.c
--- a/head/usr.bin/yacc/mkpar.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,404 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)mkpar.c 5.3 (Berkeley) 1/20/91";
-#endif
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include "defs.h"
-
-action **parser;
-int SRexpect;
-int SRtotal;
-int RRtotal;
-short *SRconflicts;
-short *RRconflicts;
-short *defred;
-short *rules_used;
-short nunused;
-short final_state;
-
-static int SRcount;
-static int RRcount;
-
-static action *add_reduce(action *, int, int);
-static action *add_reductions(int, action *);
-static void defreds(void);
-static void find_final_state(void);
-static void free_action_row(action *);
-static action *get_shifts(int);
-static action *parse_actions(int);
-static void remove_conflicts(void);
-static int sole_reduction(int);
-static void total_conflicts(void);
-static void unused_rules(void);
-
-
-void
-make_parser(void)
-{
- int i;
-
- parser = NEW2(nstates, action *);
- for (i = 0; i < nstates; i++)
- parser[i] = parse_actions(i);
-
- find_final_state();
- remove_conflicts();
- unused_rules();
- if (SRtotal + RRtotal > 0) total_conflicts();
- defreds();
-}
-
-
-static action *
-parse_actions(int stateno)
-{
- action *actions;
-
- actions = get_shifts(stateno);
- actions = add_reductions(stateno, actions);
- return (actions);
-}
-
-
-static action *
-get_shifts(int stateno)
-{
- action *actions, *temp;
- shifts *sp;
- short *tostate;
- int i, k;
- int symbol;
-
- actions = 0;
- sp = shift_table[stateno];
- if (sp)
- {
- tostate = sp->shift;
- for (i = sp->nshifts - 1; i >= 0; i--)
- {
- k = tostate[i];
- symbol = accessing_symbol[k];
- if (ISTOKEN(symbol))
- {
- temp = NEW(action);
- temp->next = actions;
- temp->symbol = symbol;
- temp->number = k;
- temp->prec = symbol_prec[symbol];
- temp->action_code = SHIFT;
- temp->assoc = symbol_assoc[symbol];
- actions = temp;
- }
- }
- }
- return (actions);
-}
-
-static action *
-add_reductions(int stateno, action *actions)
-{
- int i, j, m, n;
- int ruleno, tokensetsize;
- unsigned *rowp;
-
- tokensetsize = WORDSIZE(ntokens);
- m = lookaheads[stateno];
- n = lookaheads[stateno + 1];
- for (i = m; i < n; i++)
- {
- ruleno = LAruleno[i];
- rowp = LA + i * tokensetsize;
- for (j = ntokens - 1; j >= 0; j--)
- {
- if (BIT(rowp, j))
- actions = add_reduce(actions, ruleno, j);
- }
- }
- return (actions);
-}
-
-
-static action *
-add_reduce(action *actions, int ruleno, int symbol)
-{
- action *temp, *prev, *next;
-
- prev = 0;
- for (next = actions; next && next->symbol < symbol; next = next->next)
- prev = next;
-
- while (next && next->symbol == symbol && next->action_code == SHIFT)
- {
- prev = next;
- next = next->next;
- }
-
- while (next && next->symbol == symbol &&
- next->action_code == REDUCE && next->number < ruleno)
- {
- prev = next;
- next = next->next;
- }
-
- temp = NEW(action);
- temp->next = next;
- temp->symbol = symbol;
- temp->number = ruleno;
- temp->prec = rprec[ruleno];
- temp->action_code = REDUCE;
- temp->assoc = rassoc[ruleno];
-
- if (prev)
- prev->next = temp;
- else
- actions = temp;
-
- return (actions);
-}
-
-
-static void
-find_final_state(void)
-{
- int goal, i;
- short *tostate;
- shifts *p;
-
- p = shift_table[0];
- tostate = p->shift;
- goal = ritem[1];
- for (i = p->nshifts - 1; i >= 0; --i)
- {
- final_state = tostate[i];
- if (accessing_symbol[final_state] == goal) break;
- }
-}
-
-
-static void
-unused_rules(void)
-{
- int i;
- action *p;
-
- rules_used = malloc(nrules*sizeof(short));
- if (rules_used == 0) no_space();
-
- for (i = 0; i < nrules; ++i)
- rules_used[i] = 0;
-
- for (i = 0; i < nstates; ++i)
- {
- for (p = parser[i]; p; p = p->next)
- {
- if (p->action_code == REDUCE && p->suppressed == 0)
- rules_used[p->number] = 1;
- }
- }
-
- nunused = 0;
- for (i = 3; i < nrules; ++i)
- if (!rules_used[i]) ++nunused;
-
- if (nunused) {
- if (nunused == 1)
- warnx("1 rule never reduced");
- else
- warnx("%d rules never reduced", nunused);
- }
-}
-
-
-static void
-remove_conflicts(void)
-{
- int i;
- int symbol;
- action *p, *pref;
-
- pref = NULL;
- SRtotal = 0;
- RRtotal = 0;
- SRconflicts = NEW2(nstates, short);
- RRconflicts = NEW2(nstates, short);
- for (i = 0; i < nstates; i++)
- {
- SRcount = 0;
- RRcount = 0;
- symbol = -1;
- for (p = parser[i]; p; p = p->next)
- {
- if (p->symbol != symbol)
- {
- pref = p;
- symbol = p->symbol;
- }
- else if (i == final_state && symbol == 0)
- {
- SRcount++;
- p->suppressed = 1;
- }
- else if (pref->action_code == SHIFT)
- {
- if (pref->prec > 0 && p->prec > 0)
- {
- if (pref->prec < p->prec)
- {
- pref->suppressed = 2;
- pref = p;
- }
- else if (pref->prec > p->prec)
- {
- p->suppressed = 2;
- }
- else if (pref->assoc == LEFT)
- {
- pref->suppressed = 2;
- pref = p;
- }
- else if (pref->assoc == RIGHT)
- {
- p->suppressed = 2;
- }
- else
- {
- pref->suppressed = 2;
- p->suppressed = 2;
- }
- }
- else
- {
- SRcount++;
- p->suppressed = 1;
- }
- }
- else
- {
- RRcount++;
- p->suppressed = 1;
- }
- }
- SRtotal += SRcount;
- RRtotal += RRcount;
- SRconflicts[i] = SRcount;
- RRconflicts[i] = RRcount;
- }
-}
-
-
-static void
-total_conflicts(void)
-{
- /* Warn if s/r != expect or if any r/r */
- if ((SRtotal != SRexpect) || RRtotal)
- {
- if (SRtotal == 1)
- warnx("1 shift/reduce conflict");
- else if (SRtotal > 1)
- warnx("%d shift/reduce conflicts", SRtotal);
- }
-
- if (RRtotal == 1)
- warnx("1 reduce/reduce conflict");
- else if (RRtotal > 1)
- warnx("%d reduce/reduce conflicts", RRtotal);
-}
-
-
-static int
-sole_reduction(int stateno)
-{
- int count, ruleno;
- action *p;
-
- count = 0;
- ruleno = 0;
- for (p = parser[stateno]; p; p = p->next)
- {
- if (p->action_code == SHIFT && p->suppressed == 0)
- return (0);
- else if (p->action_code == REDUCE && p->suppressed == 0)
- {
- if (ruleno > 0 && p->number != ruleno)
- return (0);
- if (p->symbol != 1)
- ++count;
- ruleno = p->number;
- }
- }
-
- if (count == 0)
- return (0);
- return (ruleno);
-}
-
-
-static void
-defreds(void)
-{
- int i;
-
- defred = NEW2(nstates, short);
- for (i = 0; i < nstates; i++)
- defred[i] = sole_reduction(i);
-}
-
-static void
-free_action_row(action *p)
-{
- action *q;
-
- while (p)
- {
- q = p->next;
- free(p);
- p = q;
- }
-}
-
-void
-free_parser(void)
-{
- int i;
-
- for (i = 0; i < nstates; i++)
- free_action_row(parser[i]);
-
- free(parser);
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/output.c
--- a/head/usr.bin/yacc/output.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1342 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)output.c 5.7 (Berkeley) 5/24/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include "defs.h"
-
-static int nvectors;
-static int nentries;
-static short **froms;
-static short **tos;
-static short *tally;
-static short *width;
-static short *state_count;
-static short *order;
-static short *base;
-static short *pos;
-static int maxtable;
-static short *table;
-static short *check;
-static int lowzero;
-static int high;
-
-static int default_goto(int);
-static void free_itemsets(void);
-static void free_reductions(void);
-static void free_shifts(void);
-static void goto_actions(void);
-static int is_C_identifier(char *);
-static int matching_vector(int);
-static void output_actions(void);
-static void output_base(void);
-static void output_check(void);
-static void output_debug(void);
-static void output_defines(void);
-static void output_prefix(void);
-static void output_rule_data(void);
-static void output_semantic_actions(void);
-static void output_stored_text(void);
-static void output_stype(void);
-static void output_table(void);
-static void output_trailing_text(void);
-static void output_yydefred(void);
-static void pack_table(void);
-static int pack_vector(int);
-static void save_column(int, int);
-static void sort_actions(void);
-static void token_actions(void);
-static int increase_maxtable(int);
-
-static const char line_format[] = "#line %d \"%s\"\n";
-
-
-void
-output(void)
-{
- free_itemsets();
- free_shifts();
- free_reductions();
- output_prefix();
- output_stored_text();
- output_defines();
- output_rule_data();
- output_yydefred();
- output_actions();
- free_parser();
- output_debug();
- output_stype();
- if (rflag) write_section(tables);
- write_section(header);
- output_trailing_text();
- write_section(body);
- output_semantic_actions();
- write_section(trailer);
-}
-
-
-static void
-output_prefix(void)
-{
- if (symbol_prefix == NULL)
- symbol_prefix = "yy";
- else
- {
- ++outline;
- fprintf(code_file, "#define yyparse %sparse\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yylex %slex\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyerror %serror\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yychar %schar\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyval %sval\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yylval %slval\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yydebug %sdebug\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yynerrs %snerrs\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyerrflag %serrflag\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyss %sss\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyssp %sssp\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyvs %svs\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyvsp %svsp\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yylhs %slhs\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yylen %slen\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yydefred %sdefred\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yydgoto %sdgoto\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yysindex %ssindex\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyrindex %srindex\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yygindex %sgindex\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yytable %stable\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yycheck %scheck\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyname %sname\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyrule %srule\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yysslim %ssslim\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yystacksize %sstacksize\n", symbol_prefix);
- }
- ++outline;
- fprintf(code_file, "#define YYPREFIX \"%s\"\n", symbol_prefix);
-}
-
-
-static void
-output_rule_data(void)
-{
- int i;
- int j;
-
-
- fprintf(output_file, "const short %slhs[] = {%42d,", symbol_prefix,
- symbol_value[start_symbol]);
-
- j = 10;
- for (i = 3; i < nrules; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", symbol_value[rlhs[i]]);
- }
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
-
- fprintf(output_file, "const short %slen[] = {%42d,", symbol_prefix, 2);
-
- j = 10;
- for (i = 3; i < nrules; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- j++;
-
- fprintf(output_file, "%5d,", rrhs[i + 1] - rrhs[i] - 1);
- }
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
-}
-
-
-static void
-output_yydefred(void)
-{
- int i, j;
-
- fprintf(output_file, "const short %sdefred[] = {%39d,", symbol_prefix,
- (defred[0] ? defred[0] - 2 : 0));
-
- j = 10;
- for (i = 1; i < nstates; i++)
- {
- if (j < 10)
- ++j;
- else
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
-
- fprintf(output_file, "%5d,", (defred[i] ? defred[i] - 2 : 0));
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
-}
-
-
-static void
-output_actions(void)
-{
- nvectors = 2*nstates + nvars;
-
- froms = NEW2(nvectors, short *);
- tos = NEW2(nvectors, short *);
- tally = NEW2(nvectors, short);
- width = NEW2(nvectors, short);
-
- token_actions();
- free(lookaheads);
- free(LA);
- free(LAruleno);
- free(accessing_symbol);
-
- goto_actions();
- free(goto_map + ntokens);
- free(from_state);
- free(to_state);
-
- sort_actions();
- pack_table();
- output_base();
- output_table();
- output_check();
-}
-
-
-static void
-token_actions(void)
-{
- int i, j;
- int shiftcount, reducecount;
- int max, min;
- short *actionrow, *r, *s;
- action *p;
-
- actionrow = NEW2(2*ntokens, short);
- for (i = 0; i < nstates; ++i)
- {
- if (parser[i])
- {
- for (j = 0; j < 2*ntokens; ++j)
- actionrow[j] = 0;
-
- shiftcount = 0;
- reducecount = 0;
- for (p = parser[i]; p; p = p->next)
- {
- if (p->suppressed == 0)
- {
- if (p->action_code == SHIFT)
- {
- ++shiftcount;
- actionrow[p->symbol] = p->number;
- }
- else if (p->action_code == REDUCE && p->number != defred[i])
- {
- ++reducecount;
- actionrow[p->symbol + ntokens] = p->number;
- }
- }
- }
-
- tally[i] = shiftcount;
- tally[nstates+i] = reducecount;
- width[i] = 0;
- width[nstates+i] = 0;
- if (shiftcount > 0)
- {
- froms[i] = r = NEW2(shiftcount, short);
- tos[i] = s = NEW2(shiftcount, short);
- min = SHRT_MAX;
- max = 0;
- for (j = 0; j < ntokens; ++j)
- {
- if (actionrow[j])
- {
- if (min > symbol_value[j])
- min = symbol_value[j];
- if (max < symbol_value[j])
- max = symbol_value[j];
- *r++ = symbol_value[j];
- *s++ = actionrow[j];
- }
- }
- width[i] = max - min + 1;
- }
- if (reducecount > 0)
- {
- froms[nstates+i] = r = NEW2(reducecount, short);
- tos[nstates+i] = s = NEW2(reducecount, short);
- min = SHRT_MAX;
- max = 0;
- for (j = 0; j < ntokens; ++j)
- {
- if (actionrow[ntokens+j])
- {
- if (min > symbol_value[j])
- min = symbol_value[j];
- if (max < symbol_value[j])
- max = symbol_value[j];
- *r++ = symbol_value[j];
- *s++ = actionrow[ntokens+j] - 2;
- }
- }
- width[nstates+i] = max - min + 1;
- }
- }
- }
- free(actionrow);
-}
-
-static void
-goto_actions(void)
-{
- int i, j, k;
-
- state_count = NEW2(nstates, short);
-
- k = default_goto(start_symbol + 1);
- fprintf(output_file, "const short %sdgoto[] = {%40d,", symbol_prefix, k);
- save_column(start_symbol + 1, k);
-
- j = 10;
- for (i = start_symbol + 2; i < nsyms; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- k = default_goto(i);
- fprintf(output_file, "%5d,", k);
- save_column(i, k);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- free(state_count);
-}
-
-static int
-default_goto(int symbol)
-{
- int i;
- int m;
- int n;
- int default_state;
- int max;
-
- m = goto_map[symbol];
- n = goto_map[symbol + 1];
-
- if (m == n) return (0);
-
- for (i = 0; i < nstates; i++)
- state_count[i] = 0;
-
- for (i = m; i < n; i++)
- state_count[to_state[i]]++;
-
- max = 0;
- default_state = 0;
- for (i = 0; i < nstates; i++)
- {
- if (state_count[i] > max)
- {
- max = state_count[i];
- default_state = i;
- }
- }
-
- return (default_state);
-}
-
-
-
-static void
-save_column(int symbol, int default_state)
-{
- int i;
- int m;
- int n;
- short *sp;
- short *sp1;
- short *sp2;
- int count;
- int symno;
-
- m = goto_map[symbol];
- n = goto_map[symbol + 1];
-
- count = 0;
- for (i = m; i < n; i++)
- {
- if (to_state[i] != default_state)
- ++count;
- }
- if (count == 0) return;
-
- symno = symbol_value[symbol] + 2*nstates;
-
- froms[symno] = sp1 = sp = NEW2(count, short);
- tos[symno] = sp2 = NEW2(count, short);
-
- for (i = m; i < n; i++)
- {
- if (to_state[i] != default_state)
- {
- *sp1++ = from_state[i];
- *sp2++ = to_state[i];
- }
- }
-
- tally[symno] = count;
- width[symno] = sp1[-1] - sp[0] + 1;
-}
-
-static void
-sort_actions(void)
-{
- int i;
- int j;
- int k;
- int t;
- int w;
-
- order = NEW2(nvectors, short);
- nentries = 0;
-
- for (i = 0; i < nvectors; i++)
- {
- if (tally[i] > 0)
- {
- t = tally[i];
- w = width[i];
- j = nentries - 1;
-
- while (j >= 0 && (width[order[j]] < w))
- j--;
-
- while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
- j--;
-
- for (k = nentries - 1; k > j; k--)
- order[k + 1] = order[k];
-
- order[j + 1] = i;
- nentries++;
- }
- }
-}
-
-
-static void
-pack_table(void)
-{
- int i;
- int place;
- int state;
-
- base = NEW2(nvectors, short);
- pos = NEW2(nentries, short);
-
- maxtable = 10000;
- table = NEW2(maxtable, short);
- check = NEW2(maxtable, short);
-
- lowzero = 0;
- high = 0;
-
- for (i = 0; i < maxtable; i++)
- check[i] = -1;
-
- for (i = 0; i < nentries; i++)
- {
- state = matching_vector(i);
-
- if (state < 0)
- place = pack_vector(i);
- else
- place = base[state];
-
- pos[i] = place;
- base[order[i]] = place;
- }
-
- for (i = 0; i < nvectors; i++)
- {
- if (froms[i])
- free(froms[i]);
- if (tos[i])
- free(tos[i]);
- }
-
- free(froms);
- free(tos);
- free(pos);
-}
-
-
-/* The function matching_vector determines if the vector specified by */
-/* the input parameter matches a previously considered vector. The */
-/* test at the start of the function checks if the vector represents */
-/* a row of shifts over terminal symbols or a row of reductions, or a */
-/* column of shifts over a nonterminal symbol. Berkeley Yacc does not */
-/* check if a column of shifts over a nonterminal symbols matches a */
-/* previously considered vector. Because of the nature of LR parsing */
-/* tables, no two columns can match. Therefore, the only possible */
-/* match would be between a row and a column. Such matches are */
-/* unlikely. Therefore, to save time, no attempt is made to see if a */
-/* column matches a previously considered vector. */
-/* */
-/* Matching_vector is poorly designed. The test could easily be made */
-/* faster. Also, it depends on the vectors being in a specific */
-/* order. */
-
-static int
-matching_vector(int vector)
-{
- int i;
- int j;
- int k;
- int t;
- int w;
- int match;
- int prev;
-
- i = order[vector];
- if (i >= 2*nstates)
- return (-1);
-
- t = tally[i];
- w = width[i];
-
- for (prev = vector - 1; prev >= 0; prev--)
- {
- j = order[prev];
- if (width[j] != w || tally[j] != t)
- return (-1);
-
- match = 1;
- for (k = 0; match && k < t; k++)
- {
- if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
- match = 0;
- }
-
- if (match)
- return (j);
- }
-
- return (-1);
-}
-
-
-
-static int
-pack_vector(int vector)
-{
- int i, j, k;
- int t;
- int loc;
- int ok;
- short *from;
- short *to;
-
- loc = 0;
- i = order[vector];
- t = tally[i];
- assert(t);
-
- from = froms[i];
- to = tos[i];
-
- j = lowzero - from[0];
- for (k = 1; k < t; ++k)
- if (lowzero - from[k] > j)
- j = lowzero - from[k];
- for (;; ++j)
- {
- if (j == 0)
- continue;
- ok = 1;
- for (k = 0; ok && k < t; k++)
- {
- loc = j + from[k];
- if (loc >= maxtable)
- {
- if (loc >= MAXTABLE)
- fatal("maximum table size exceeded");
- maxtable = increase_maxtable(loc);
- }
-
- if (check[loc] != -1)
- ok = 0;
- }
- for (k = 0; ok && k < vector; k++)
- {
- if (pos[k] == j)
- ok = 0;
- }
- if (ok)
- {
- for (k = 0; k < t; k++)
- {
- loc = j + from[k];
- table[loc] = to[k];
- check[loc] = from[k];
- if (loc > high) high = loc;
- }
-
- while (check[lowzero] != -1)
- {
- if (lowzero >= maxtable)
- {
- if (lowzero >= MAXTABLE)
- {
- fatal("maximum table size exceeded in check\n");
- }
-
- maxtable = increase_maxtable(loc);
- }
-
- ++lowzero;
- }
-
- return (j);
- }
- }
-}
-
-
-
-static void
-output_base(void)
-{
- int i, j;
-
- fprintf(output_file, "const short %ssindex[] = {%39d,", symbol_prefix,
- base[0]);
-
- j = 10;
- for (i = 1; i < nstates; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", base[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\nconst short %srindex[] = {%39d,", symbol_prefix,
- base[nstates]);
-
- j = 10;
- for (i = nstates + 1; i < 2*nstates; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", base[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\nconst short %sgindex[] = {%39d,", symbol_prefix,
- base[2*nstates]);
-
- j = 10;
- for (i = 2*nstates + 1; i < nvectors - 1; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", base[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- free(base);
-}
-
-
-
-static void
-output_table(void)
-{
- int i;
- int j;
-
- ++outline;
- fprintf(code_file, "#define YYTABLESIZE %d\n", high);
- fprintf(output_file, "const short %stable[] = {%40d,", symbol_prefix,
- table[0]);
-
- j = 10;
- for (i = 1; i <= high; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", table[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- free(table);
-}
-
-
-
-static void
-output_check(void)
-{
- int i;
- int j;
-
- fprintf(output_file, "const short %scheck[] = {%40d,", symbol_prefix,
- check[0]);
-
- j = 10;
- for (i = 1; i <= high; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", check[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- free(check);
-}
-
-
-static int
-is_C_identifier(char *name)
-{
- char *s;
- int c;
-
- s = name;
- c = *s;
- if (c == '"')
- {
- c = *++s;
- if (!isalpha(c) && c != '_' && c != '$')
- return (0);
- while ((c = *++s) != '"')
- {
- if (!isalnum(c) && c != '_' && c != '$')
- return (0);
- }
- return (1);
- }
-
- if (!isalpha(c) && c != '_' && c != '$')
- return (0);
- while ((c = *++s))
- {
- if (!isalnum(c) && c != '_' && c != '$')
- return (0);
- }
- return (1);
-}
-
-
-static void
-output_defines(void)
-{
- int c, i;
- char *s;
-
- ++outline;
- fprintf(code_file, "#define YYERRCODE %d\n", symbol_value[1]);
-
- if(dflag)
- {
- fprintf(defines_file, "#ifndef YYERRCODE\n");
- fprintf(defines_file, "#define YYERRCODE %d\n", symbol_value[1]);
- fprintf(defines_file, "#endif\n\n");
- }
- for (i = 2; i < ntokens; ++i)
- {
- s = symbol_name[i];
- if (is_C_identifier(s))
- {
- fprintf(code_file, "#define ");
- if (dflag) fprintf(defines_file, "#define ");
- c = *s;
- if (c == '"')
- {
- while ((c = *++s) != '"')
- {
- putc(c, code_file);
- if (dflag) putc(c, defines_file);
- }
- }
- else
- {
- do
- {
- putc(c, code_file);
- if (dflag) putc(c, defines_file);
- }
- while ((c = *++s));
- }
- ++outline;
- fprintf(code_file, " %d\n", symbol_value[i]);
- if (dflag) fprintf(defines_file, " %d\n", symbol_value[i]);
- }
- }
-
- if (dflag && unionized)
- {
- fclose(union_file);
- union_file = fopen(union_file_name, "r");
- if (union_file == NULL) open_error(union_file_name);
- while ((c = getc(union_file)) != EOF)
- putc(c, defines_file);
- fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE %slval;\n",
- symbol_prefix);
- }
-}
-
-
-static void
-output_stored_text(void)
-{
- int c;
- FILE *in, *out;
-
- fclose(text_file);
- text_file = fopen(text_file_name, "r");
- if (text_file == NULL)
- open_error(text_file_name);
- in = text_file;
- if ((c = getc(in)) == EOF)
- return;
- out = code_file;
- if (c == '\n')
- ++outline;
- putc(c, out);
- while ((c = getc(in)) != EOF)
- {
- if (c == '\n')
- ++outline;
- putc(c, out);
- }
- if (!lflag)
- fprintf(out, line_format, ++outline + 1, code_file_name);
-}
-
-
-static void
-output_debug(void)
-{
- int i, j, k, max;
- char **symnam, *s;
- static char eof[] = "end-of-file";
-
- ++outline;
- fprintf(code_file, "#define YYFINAL %d\n", final_state);
- outline += 3;
- fprintf(code_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n",
- tflag);
- if (rflag)
- fprintf(output_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n",
- tflag);
-
- max = 0;
- for (i = 2; i < ntokens; ++i)
- if (symbol_value[i] > max)
- max = symbol_value[i];
- ++outline;
- fprintf(code_file, "#define YYMAXTOKEN %d\n", max);
-
- symnam = malloc((max+1)*sizeof(char *));
- if (symnam == 0) no_space();
-
- /* Note that it is not necessary to initialize the element */
- /* symnam[max]. */
- for (i = 0; i < max; ++i)
- symnam[i] = 0;
- for (i = ntokens - 1; i >= 2; --i)
- symnam[symbol_value[i]] = symbol_name[i];
- symnam[0] = eof;
-
- if (!rflag) ++outline;
- fprintf(output_file, "#if YYDEBUG\n");
- fprintf(output_file, "const char * const %sname[] = {", symbol_prefix);
- j = 80;
- for (i = 0; i <= max; ++i)
- {
- if ((s = symnam[i]))
- {
- if (s[0] == '"')
- {
- k = 7;
- while (*++s != '"')
- {
- ++k;
- if (*s == '\\')
- {
- k += 2;
- if (*++s == '\\')
- ++k;
- }
- }
- j += k;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = k;
- }
- fprintf(output_file, "\"\\\"");
- s = symnam[i];
- while (*++s != '"')
- {
- if (*s == '\\')
- {
- fprintf(output_file, "\\\\");
- if (*++s == '\\')
- fprintf(output_file, "\\\\");
- else
- putc(*s, output_file);
- }
- else
- putc(*s, output_file);
- }
- fprintf(output_file, "\\\"\",");
- }
- else if (s[0] == '\'')
- {
- if (s[1] == '"')
- {
- j += 7;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 7;
- }
- fprintf(output_file, "\"'\\\"'\",");
- }
- else
- {
- k = 5;
- while (*++s != '\'')
- {
- ++k;
- if (*s == '\\')
- {
- k += 2;
- if (*++s == '\\')
- ++k;
- }
- }
- j += k;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = k;
- }
- fprintf(output_file, "\"'");
- s = symnam[i];
- while (*++s != '\'')
- {
- if (*s == '\\')
- {
- fprintf(output_file, "\\\\");
- if (*++s == '\\')
- fprintf(output_file, "\\\\");
- else
- putc(*s, output_file);
- }
- else
- putc(*s, output_file);
- }
- fprintf(output_file, "'\",");
- }
- }
- else
- {
- k = strlen(s) + 3;
- j += k;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = k;
- }
- putc('"', output_file);
- do { putc(*s, output_file); } while (*++s);
- fprintf(output_file, "\",");
- }
- }
- else
- {
- j += 2;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 2;
- }
- fprintf(output_file, "0,");
- }
- }
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- free(symnam);
-
- if (!rflag) ++outline;
- fprintf(output_file, "const char * const %srule[] = {\n", symbol_prefix);
- for (i = 2; i < nrules; ++i)
- {
- fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]);
- for (j = rrhs[i]; ritem[j] > 0; ++j)
- {
- s = symbol_name[ritem[j]];
- if (s[0] == '"')
- {
- fprintf(output_file, " \\\"");
- while (*++s != '"')
- {
- if (*s == '\\')
- {
- if (s[1] == '\\')
- fprintf(output_file, "\\\\\\\\");
- else
- fprintf(output_file, "\\\\%c", s[1]);
- ++s;
- }
- else
- putc(*s, output_file);
- }
- fprintf(output_file, "\\\"");
- }
- else if (s[0] == '\'')
- {
- if (s[1] == '"')
- fprintf(output_file, " '\\\"'");
- else if (s[1] == '\\')
- {
- if (s[2] == '\\')
- fprintf(output_file, " '\\\\\\\\");
- else
- fprintf(output_file, " '\\\\%c", s[2]);
- s += 2;
- while (*++s != '\'')
- putc(*s, output_file);
- putc('\'', output_file);
- }
- else
- fprintf(output_file, " '%c'", s[1]);
- }
- else
- fprintf(output_file, " %s", s);
- }
- if (!rflag) ++outline;
- fprintf(output_file, "\",\n");
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "};\n#endif\n");
-}
-
-
-static void
-output_stype(void)
-{
- if (!unionized && ntags == 0)
- {
- outline += 3;
- fprintf(code_file, "#ifndef YYSTYPE\ntypedef int YYSTYPE;\n#endif\n");
- }
-}
-
-
-static void
-output_trailing_text(void)
-{
- int c, last;
- FILE *in, *out;
-
- if (line == 0)
- return;
-
- in = input_file;
- out = code_file;
- c = *cptr;
- if (c == '\n')
- {
- ++lineno;
- if ((c = getc(in)) == EOF)
- return;
- if (!lflag)
- {
- ++outline;
- fprintf(out, line_format, lineno, input_file_name);
- }
- if (c == '\n')
- ++outline;
- putc(c, out);
- last = c;
- }
- else
- {
- if (!lflag)
- {
- ++outline;
- fprintf(out, line_format, lineno, input_file_name);
- }
- do { putc(c, out); } while ((c = *++cptr) != '\n');
- ++outline;
- putc('\n', out);
- last = '\n';
- }
-
- while ((c = getc(in)) != EOF)
- {
- if (c == '\n')
- ++outline;
- putc(c, out);
- last = c;
- }
-
- if (last != '\n')
- {
- ++outline;
- putc('\n', out);
- }
- if (!lflag)
- fprintf(out, line_format, ++outline + 1, code_file_name);
-}
-
-
-static void
-output_semantic_actions(void)
-{
- int c, last;
- FILE *out;
-
- fclose(action_file);
- action_file = fopen(action_file_name, "r");
- if (action_file == NULL)
- open_error(action_file_name);
-
- if ((c = getc(action_file)) == EOF)
- return;
-
- out = code_file;
- last = c;
- if (c == '\n')
- ++outline;
- putc(c, out);
- while ((c = getc(action_file)) != EOF)
- {
- if (c == '\n')
- ++outline;
- putc(c, out);
- last = c;
- }
-
- if (last != '\n')
- {
- ++outline;
- putc('\n', out);
- }
-
- if (!lflag)
- fprintf(out, line_format, ++outline + 1, code_file_name);
-}
-
-
-static void
-free_itemsets(void)
-{
- core *cp, *next;
-
- free(state_table);
- for (cp = first_state; cp; cp = next)
- {
- next = cp->next;
- free(cp);
- }
-}
-
-
-static void
-free_shifts(void)
-{
- shifts *sp, *next;
-
- free(shift_table);
- for (sp = first_shift; sp; sp = next)
- {
- next = sp->next;
- free(sp);
- }
-}
-
-
-
-static void
-free_reductions(void)
-{
- reductions *rp, *next;
-
- free(reduction_table);
- for (rp = first_reduction; rp; rp = next)
- {
- next = rp->next;
- free(rp);
- }
-}
-
-/*
- * increase_maxtable
- *
- * inputs - loc location in table
- * output - size increased to
- * side effects - table is increase by at least 200 short words
- */
-
-static int
-increase_maxtable(int loc)
-{
- int newmax;
- int l;
-
- newmax = maxtable;
-
- do { newmax += 200; } while (newmax <= loc);
- table = realloc(table, newmax*sizeof(short));
- if (table == 0) no_space();
- check = realloc(check, newmax*sizeof(short));
- if (check == 0) no_space();
- for (l = maxtable; l < newmax; ++l)
- {
- table[l] = 0;
- check[l] = -1;
- }
-
- return(newmax);
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/reader.c
--- a/head/usr.bin/yacc/reader.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1924 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)reader.c 5.7 (Berkeley) 1/20/91";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/usr.bin/yacc/reader.c 228992 2011-12-30 11:02:40Z uqs $");
-
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include "defs.h"
-
-/* The line size must be a positive integer. One hundred was chosen */
-/* because few lines in Yacc input grammars exceed 100 characters. */
-/* Note that if a line exceeds LINESIZE characters, the line buffer */
-/* will be expanded to accommodate it. */
-
-#define LINESIZE 100
-
-char *cache;
-int cinc, cache_size;
-
-int ntags, tagmax;
-char **tag_table;
-
-char saw_eof, unionized;
-char *cptr, *line;
-int linesize;
-
-bucket *goal;
-int prec;
-int gensym;
-char last_was_action;
-
-int maxitems;
-bucket **pitem;
-
-int maxrules;
-bucket **plhs;
-
-int name_pool_size;
-char *name_pool;
-
-static const char line_format[] = "#line %d \"%s\"\n";
-
-static void add_symbol(void);
-static void advance_to_start(void);
-static void cachec(int);
-static void check_symbols(void);
-static void copy_action(void);
-static void copy_ident(void);
-static void copy_text(void);
-static void copy_union(void);
-static void declare_expect(int);
-static void declare_start(void);
-static void declare_tokens(int);
-static void declare_types(void);
-static char *dup_line(void);
-static void end_rule(void);
-static void expand_items(void);
-static void expand_rules(void);
-static void free_tags(void);
-static void get_line(void);
-static bucket *get_literal(void);
-static bucket *get_name(void);
-static int get_number(void);
-static char *get_tag(void);
-static int hexval(int);
-static void initialize_grammar(void);
-static void insert_empty_rule(void);
-static int is_reserved(char *);
-static int keyword(void);
-static int mark_symbol(void);
-static int nextc(void);
-static void pack_grammar(void);
-static void pack_names(void);
-static void pack_symbols(void);
-static void print_grammar(void);
-static void read_declarations(void);
-static void read_grammar(void);
-static void skip_comment(void);
-static void start_rule(bucket *, int);
-
-static void
-cachec(int c)
-{
- assert(cinc >= 0);
- if (cinc >= cache_size)
- {
- cache_size += 256;
- cache = realloc(cache, cache_size);
- if (cache == 0) no_space();
- }
- cache[cinc] = c;
- ++cinc;
-}
-
-
-static void
-get_line(void)
-{
- FILE *f = input_file;
- int c;
- int i;
-
- if (saw_eof || (c = getc(f)) == EOF)
- {
- if (line) { free(line); line = 0; }
- cptr = 0;
- saw_eof = 1;
- return;
- }
-
- if (line == 0 || linesize != (LINESIZE + 1))
- {
- if (line) free(line);
- linesize = LINESIZE + 1;
- line = malloc(linesize);
- if (line == 0) no_space();
- }
-
- i = 0;
- ++lineno;
- for (;;)
- {
- line[i] = c;
- if (c == '\n') { cptr = line; return; }
- if (++i >= linesize)
- {
- linesize += LINESIZE;
- line = realloc(line, linesize);
- if (line == 0) no_space();
- }
- c = getc(f);
- if (c == EOF)
- {
- line[i] = '\n';
- saw_eof = 1;
- cptr = line;
- return;
- }
- }
-}
-
-
-static char *
-dup_line(void)
-{
- char *p, *s, *t;
-
- if (line == 0) return (0);
- s = line;
- while (*s != '\n') ++s;
- p = malloc(s - line + 1);
- if (p == 0) no_space();
-
- s = line;
- t = p;
- while ((*t++ = *s++) != '\n') continue;
- return (p);
-}
-
-
-static void
-skip_comment(void)
-{
- char *s;
-
- int st_lineno = lineno;
- char *st_line = dup_line();
- char *st_cptr = st_line + (cptr - line);
-
- s = cptr + 2;
- for (;;)
- {
- if (*s == '*' && s[1] == '/')
- {
- cptr = s + 2;
- free(st_line);
- return;
- }
- if (*s == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_comment(st_lineno, st_line, st_cptr);
- s = cptr;
- }
- else
- ++s;
- }
-}
-
-
-static int
-nextc(void)
-{
- char *s;
-
- if (line == 0)
- {
- get_line();
- if (line == 0)
- return (EOF);
- }
-
- s = cptr;
- for (;;)
- {
- switch (*s)
- {
- case '\n':
- get_line();
- if (line == 0) return (EOF);
- s = cptr;
- break;
-
- case ' ':
- case '\t':
- case '\f':
- case '\r':
- case '\v':
- case ',':
- case ';':
- ++s;
- break;
-
- case '\\':
- cptr = s;
- return ('%');
-
- case '/':
- if (s[1] == '*')
- {
- cptr = s;
- skip_comment();
- s = cptr;
- break;
- }
- else if (s[1] == '/')
- {
- get_line();
- if (line == 0) return (EOF);
- s = cptr;
- break;
- }
- /* FALLTHROUGH */
-
- default:
- cptr = s;
- return (*s);
- }
- }
-}
-
-
-static int
-keyword(void)
-{
- int c;
- char *t_cptr = cptr;
-
- c = *++cptr;
- if (isalpha(c))
- {
- cinc = 0;
- for (;;)
- {
- if (isalpha(c))
- {
- if (isupper(c)) c = tolower(c);
- cachec(c);
- }
- else if (isdigit(c) || c == '_' || c == '.' || c == '$')
- cachec(c);
- else
- break;
- c = *++cptr;
- }
- cachec(NUL);
-
- if (strcmp(cache, "token") == 0 || strcmp(cache, "term") == 0)
- return (TOKEN);
- if (strcmp(cache, "type") == 0)
- return (TYPE);
- if (strcmp(cache, "left") == 0)
- return (LEFT);
- if (strcmp(cache, "right") == 0)
- return (RIGHT);
- if (strcmp(cache, "nonassoc") == 0 || strcmp(cache, "binary") == 0)
- return (NONASSOC);
- if (strcmp(cache, "start") == 0)
- return (START);
- if (strcmp(cache, "union") == 0)
- return (UNION);
- if (strcmp(cache, "ident") == 0)
- return (IDENT);
- if (strcmp(cache, "expect") == 0)
- return (EXPECT);
- }
- else
- {
- ++cptr;
- if (c == '{')
- return (TEXT);
- if (c == '%' || c == '\\')
- return (MARK);
- if (c == '<')
- return (LEFT);
- if (c == '>')
- return (RIGHT);
- if (c == '0')
- return (TOKEN);
- if (c == '2')
- return (NONASSOC);
- }
- syntax_error(lineno, line, t_cptr);
- /*NOTREACHED*/
- return (0);
-}
-
-
-static void
-copy_ident(void)
-{
- int c;
- FILE *f = output_file;
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != '"') syntax_error(lineno, line, cptr);
- ++outline;
- fprintf(f, "#ident \"");
- for (;;)
- {
- c = *++cptr;
- if (c == '\n')
- {
- fprintf(f, "\"\n");
- return;
- }
- putc(c, f);
- if (c == '"')
- {
- putc('\n', f);
- ++cptr;
- return;
- }
- }
-}
-
-
-static void
-copy_text(void)
-{
- int c;
- int quote;
- FILE *f = text_file;
- int need_newline = 0;
- int t_lineno = lineno;
- char *t_line = dup_line();
- char *t_cptr = t_line + (cptr - line - 2);
-
- if (*cptr == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_text(t_lineno, t_line, t_cptr);
- }
- if (!lflag) fprintf(f, line_format, lineno, input_file_name);
-
-loop:
- c = *cptr++;
- switch (c)
- {
- case '\n':
- next_line:
- putc('\n', f);
- need_newline = 0;
- get_line();
- if (line) goto loop;
- unterminated_text(t_lineno, t_line, t_cptr);
-
- case '\'':
- case '"':
- {
- int s_lineno = lineno;
- char *s_line = dup_line();
- char *s_cptr = s_line + (cptr - line - 1);
-
- quote = c;
- putc(c, f);
- for (;;)
- {
- c = *cptr++;
- putc(c, f);
- if (c == quote)
- {
- need_newline = 1;
- free(s_line);
- goto loop;
- }
- if (c == '\n')
- unterminated_string(s_lineno, s_line, s_cptr);
- if (c == '\\')
- {
- c = *cptr++;
- putc(c, f);
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_string(s_lineno, s_line, s_cptr);
- }
- }
- }
- }
-
- case '/':
- putc(c, f);
- need_newline = 1;
- c = *cptr;
- if (c == '/')
- {
- putc('*', f);
- while ((c = *++cptr) != '\n')
- {
- if (c == '*' && cptr[1] == '/')
- fprintf(f, "* ");
- else
- putc(c, f);
- }
- fprintf(f, "*/");
- goto next_line;
- }
- if (c == '*')
- {
- int c_lineno = lineno;
- char *c_line = dup_line();
- char *c_cptr = c_line + (cptr - line - 1);
-
- putc('*', f);
- ++cptr;
- for (;;)
- {
- c = *cptr++;
- putc(c, f);
- if (c == '*' && *cptr == '/')
- {
- putc('/', f);
- ++cptr;
- free(c_line);
- goto loop;
- }
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_comment(c_lineno, c_line, c_cptr);
- }
- }
- }
- need_newline = 1;
- goto loop;
-
- case '%':
- case '\\':
- if (*cptr == '}')
- {
- if (need_newline) putc('\n', f);
- ++cptr;
- free(t_line);
- return;
- }
- /* FALLTHROUGH */
-
- default:
- putc(c, f);
- need_newline = 1;
- goto loop;
- }
-}
-
-
-static void
-copy_union(void)
-{
- int c;
- int quote;
- int depth;
- int u_lineno = lineno;
- char *u_line = dup_line();
- char *u_cptr = u_line + (cptr - line - 6);
-
- if (unionized) over_unionized(cptr - 6);
- unionized = 1;
-
- if (!lflag)
- fprintf(text_file, line_format, lineno, input_file_name);
-
- fprintf(text_file, "typedef union");
- if (dflag) fprintf(union_file, "typedef union");
-
- depth = 0;
-loop:
- c = *cptr++;
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- switch (c)
- {
- case '\n':
- next_line:
- get_line();
- if (line == 0) unterminated_union(u_lineno, u_line, u_cptr);
- goto loop;
-
- case '{':
- ++depth;
- goto loop;
-
- case '}':
- if (--depth == 0)
- {
- fprintf(text_file, " YYSTYPE;\n");
- free(u_line);
- return;
- }
- goto loop;
-
- case '\'':
- case '"':
- {
- int s_lineno = lineno;
- char *s_line = dup_line();
- char *s_cptr = s_line + (cptr - line - 1);
-
- quote = c;
- for (;;)
- {
- c = *cptr++;
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- if (c == quote)
- {
- free(s_line);
- goto loop;
- }
- if (c == '\n')
- unterminated_string(s_lineno, s_line, s_cptr);
- if (c == '\\')
- {
- c = *cptr++;
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_string(s_lineno, s_line, s_cptr);
- }
- }
- }
- }
-
- case '/':
- c = *cptr;
- if (c == '/')
- {
- putc('*', text_file);
- if (dflag) putc('*', union_file);
- while ((c = *++cptr) != '\n')
- {
- if (c == '*' && cptr[1] == '/')
- {
- fprintf(text_file, "* ");
- if (dflag) fprintf(union_file, "* ");
- }
- else
- {
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- }
- }
- fprintf(text_file, "*/\n");
- if (dflag) fprintf(union_file, "*/\n");
- goto next_line;
- }
- if (c == '*')
- {
- int c_lineno = lineno;
- char *c_line = dup_line();
- char *c_cptr = c_line + (cptr - line - 1);
-
- putc('*', text_file);
- if (dflag) putc('*', union_file);
- ++cptr;
- for (;;)
- {
- c = *cptr++;
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- if (c == '*' && *cptr == '/')
- {
- putc('/', text_file);
- if (dflag) putc('/', union_file);
- ++cptr;
- free(c_line);
- goto loop;
- }
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_comment(c_lineno, c_line, c_cptr);
- }
- }
- }
- goto loop;
-
- default:
- goto loop;
- }
-}
-
-
-static int
-hexval(int c)
-{
- if (c >= '0' && c <= '9')
- return (c - '0');
- if (c >= 'A' && c <= 'F')
- return (c - 'A' + 10);
- if (c >= 'a' && c <= 'f')
- return (c - 'a' + 10);
- return (-1);
-}
-
-
-static bucket *
-get_literal(void)
-{
- int c, quote;
- int i;
- int n;
- char *s;
- bucket *bp;
- int s_lineno = lineno;
- char *s_line = dup_line();
- char *s_cptr = s_line + (cptr - line);
-
- quote = *cptr++;
- cinc = 0;
- for (;;)
- {
- c = *cptr++;
- if (c == quote) break;
- if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr);
- if (c == '\\')
- {
- char *c_cptr = cptr - 1;
-
- c = *cptr++;
- switch (c)
- {
- case '\n':
- get_line();
- if (line == 0) unterminated_string(s_lineno, s_line, s_cptr);
- continue;
-
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- n = c - '0';
- c = *cptr;
- if (IS_OCTAL(c))
- {
- n = (n << 3) + (c - '0');
- c = *++cptr;
- if (IS_OCTAL(c))
- {
- n = (n << 3) + (c - '0');
- ++cptr;
- }
- }
- if (n > (int)UCHAR_MAX) illegal_character(c_cptr);
- c = n;
- break;
-
- case 'x':
- c = *cptr++;
- n = hexval(c);
- if (n < 0 || n >= 16)
- illegal_character(c_cptr);
- for (;;)
- {
- c = *cptr;
- i = hexval(c);
- if (i < 0 || i >= 16) break;
- ++cptr;
- n = (n << 4) + i;
- if (n > (int)UCHAR_MAX) illegal_character(c_cptr);
- }
- c = n;
- break;
-
- case 'a': c = 7; break;
- case 'b': c = '\b'; break;
- case 'f': c = '\f'; break;
- case 'n': c = '\n'; break;
- case 'r': c = '\r'; break;
- case 't': c = '\t'; break;
- case 'v': c = '\v'; break;
- }
- }
- cachec(c);
- }
- free(s_line);
-
- n = cinc;
- s = malloc(n);
- if (s == 0) no_space();
-
- for (i = 0; i < n; ++i)
- s[i] = cache[i];
-
- cinc = 0;
- if (n == 1)
- cachec('\'');
- else
- cachec('"');
-
- for (i = 0; i < n; ++i)
- {
- c = ((unsigned char *)s)[i];
- if (c == '\\' || c == cache[0])
- {
- cachec('\\');
- cachec(c);
- }
- else if (isprint(c))
- cachec(c);
- else
- {
- cachec('\\');
- switch (c)
- {
- case 7: cachec('a'); break;
- case '\b': cachec('b'); break;
- case '\f': cachec('f'); break;
- case '\n': cachec('n'); break;
- case '\r': cachec('r'); break;
- case '\t': cachec('t'); break;
- case '\v': cachec('v'); break;
- default:
- cachec(((c >> 6) & 7) + '0');
- cachec(((c >> 3) & 7) + '0');
- cachec((c & 7) + '0');
- break;
- }
- }
- }
-
- if (n == 1)
- cachec('\'');
- else
- cachec('"');
-
- cachec(NUL);
- bp = lookup(cache);
- bp->class = TERM;
- if (n == 1 && bp->value == UNDEFINED)
- bp->value = *(unsigned char *)s;
- free(s);
-
- return (bp);
-}
-
-
-static int
-is_reserved(char *name)
-{
- char *s;
-
- if (strcmp(name, ".") == 0 ||
- strcmp(name, "$accept") == 0 ||
- strcmp(name, "$end") == 0)
- return (1);
-
- if (name[0] == '$' && name[1] == '$' && isdigit(name[2]))
- {
- s = name + 3;
- while (isdigit(*s)) ++s;
- if (*s == NUL) return (1);
- }
-
- return (0);
-}
-
-
-static bucket *
-get_name(void)
-{
- int c;
-
- cinc = 0;
- for (c = *cptr; IS_IDENT(c); c = *++cptr)
- cachec(c);
- cachec(NUL);
-
- if (is_reserved(cache)) used_reserved(cache);
-
- return (lookup(cache));
-}
-
-
-static int
-get_number(void)
-{
- int c;
- int n;
-
- n = 0;
- for (c = *cptr; isdigit(c); c = *++cptr)
- n = 10*n + (c - '0');
-
- return (n);
-}
-
-
-static char *
-get_tag(void)
-{
- int c;
- int i;
- char *s;
- int t_lineno = lineno;
- char *t_line = dup_line();
- char *t_cptr = t_line + (cptr - line);
-
- ++cptr;
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (!isalpha(c) && c != '_' && c != '$')
- illegal_tag(t_lineno, t_line, t_cptr);
-
- cinc = 0;
- do { cachec(c); c = *++cptr; } while (IS_IDENT(c));
- cachec(NUL);
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != '>')
- illegal_tag(t_lineno, t_line, t_cptr);
- ++cptr;
-
- for (i = 0; i < ntags; ++i)
- {
- if (strcmp(cache, tag_table[i]) == 0)
- return (tag_table[i]);
- }
-
- if (ntags >= tagmax)
- {
- tagmax += 16;
- tag_table = (char **)
- (tag_table ? realloc(tag_table, tagmax*sizeof(char *))
- : malloc(tagmax*sizeof(char *)));
- if (tag_table == 0) no_space();
- }
-
- s = malloc(cinc);
- if (s == 0) no_space();
- strcpy(s, cache);
- tag_table[ntags] = s;
- ++ntags;
- free(t_line);
- return (s);
-}
-
-
-static void
-declare_tokens(int assoc)
-{
- int c;
- bucket *bp;
- int value;
- char *tag = 0;
-
- if (assoc != TOKEN) ++prec;
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c == '<')
- {
- tag = get_tag();
- c = nextc();
- if (c == EOF) unexpected_EOF();
- }
-
- for (;;)
- {
- if (isalpha(c) || c == '_' || c == '.' || c == '$')
- bp = get_name();
- else if (c == '\'' || c == '"')
- bp = get_literal();
- else
- return;
-
- if (bp == goal) tokenized_start(bp->name);
- bp->class = TERM;
-
- if (tag)
- {
- if (bp->tag && tag != bp->tag)
- retyped_warning(bp->name);
- bp->tag = tag;
- }
-
- if (assoc != TOKEN)
- {
- if (bp->prec && prec != bp->prec)
- reprec_warning(bp->name);
- bp->assoc = assoc;
- bp->prec = prec;
- }
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- value = UNDEFINED;
- if (isdigit(c))
- {
- value = get_number();
- if (bp->value != UNDEFINED && value != bp->value)
- revalued_warning(bp->name);
- bp->value = value;
- c = nextc();
- if (c == EOF) unexpected_EOF();
- }
- }
-}
-
-
-/*
- * %expect requires special handling
- * as it really isn't part of the yacc
- * grammar only a flag for yacc proper.
- */
-static void
-declare_expect(int assoc)
-{
- int c;
-
- if (assoc != EXPECT) ++prec;
-
- /*
- * Stay away from nextc - doesn't
- * detect EOL and will read to EOF.
- */
- c = *++cptr;
- if (c == EOF) unexpected_EOF();
-
- for(;;)
- {
- if (isdigit(c))
- {
- SRexpect = get_number();
- break;
- }
- /*
- * Looking for number before EOL.
- * Spaces, tabs, and numbers are ok,
- * words, punc., etc. are syntax errors.
- */
- else if (c == '\n' || isalpha(c) || !isspace(c))
- {
- syntax_error(lineno, line, cptr);
- }
- else
- {
- c = *++cptr;
- if (c == EOF) unexpected_EOF();
- }
- }
-}
-
-
-static void
-declare_types(void)
-{
- int c;
- bucket *bp;
- char *tag;
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != '<') syntax_error(lineno, line, cptr);
- tag = get_tag();
-
- for (;;)
- {
- c = nextc();
- if (isalpha(c) || c == '_' || c == '.' || c == '$')
- bp = get_name();
- else if (c == '\'' || c == '"')
- bp = get_literal();
- else
- return;
-
- if (bp->tag && tag != bp->tag)
- retyped_warning(bp->name);
- bp->tag = tag;
- }
-}
-
-
-static void
-declare_start(void)
-{
- int c;
- bucket *bp;
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (!isalpha(c) && c != '_' && c != '.' && c != '$')
- syntax_error(lineno, line, cptr);
- bp = get_name();
- if (bp->class == TERM)
- terminal_start(bp->name);
- if (goal && goal != bp)
- restarted_warning();
- goal = bp;
-}
-
-
-static void
-read_declarations(void)
-{
- int c, k;
-
- cache_size = 256;
- cache = malloc(cache_size);
- if (cache == 0) no_space();
-
- for (;;)
- {
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != '%') syntax_error(lineno, line, cptr);
- switch (k = keyword())
- {
- case MARK:
- return;
-
- case IDENT:
- copy_ident();
- break;
-
- case TEXT:
- copy_text();
- break;
-
- case UNION:
- copy_union();
- break;
-
- case TOKEN:
- case LEFT:
- case RIGHT:
- case NONASSOC:
- declare_tokens(k);
- break;
-
- case EXPECT:
- declare_expect(k);
- break;
-
- case TYPE:
- declare_types();
- break;
-
- case START:
- declare_start();
- break;
- }
- }
-}
-
-
-static void
-initialize_grammar(void)
-{
- nitems = 4;
- maxitems = 300;
- pitem = malloc(maxitems*sizeof(bucket *));
- if (pitem == 0) no_space();
- pitem[0] = 0;
- pitem[1] = 0;
- pitem[2] = 0;
- pitem[3] = 0;
-
- nrules = 3;
- maxrules = 100;
- plhs = malloc(maxrules*sizeof(bucket *));
- if (plhs == 0) no_space();
- plhs[0] = 0;
- plhs[1] = 0;
- plhs[2] = 0;
- rprec = malloc(maxrules*sizeof(short));
- if (rprec == 0) no_space();
- rprec[0] = 0;
- rprec[1] = 0;
- rprec[2] = 0;
- rassoc = malloc(maxrules*sizeof(char));
- if (rassoc == 0) no_space();
- rassoc[0] = TOKEN;
- rassoc[1] = TOKEN;
- rassoc[2] = TOKEN;
-}
-
-
-static void
-expand_items(void)
-{
- maxitems += 300;
- pitem = realloc(pitem, maxitems*sizeof(bucket *));
- if (pitem == 0) no_space();
-}
-
-
-static void
-expand_rules(void)
-{
- maxrules += 100;
- plhs = realloc(plhs, maxrules*sizeof(bucket *));
- if (plhs == 0) no_space();
- rprec = realloc(rprec, maxrules*sizeof(short));
- if (rprec == 0) no_space();
- rassoc = realloc(rassoc, maxrules*sizeof(char));
- if (rassoc == 0) no_space();
-}
-
-
-static void
-advance_to_start(void)
-{
- int c;
- bucket *bp;
- char *s_cptr;
- int s_lineno;
-
- for (;;)
- {
- c = nextc();
- if (c != '%') break;
- s_cptr = cptr;
- switch (keyword())
- {
- case MARK:
- no_grammar();
-
- case TEXT:
- copy_text();
- break;
-
- case START:
- declare_start();
- break;
-
- default:
- syntax_error(lineno, line, s_cptr);
- }
- }
-
- c = nextc();
- if (!isalpha(c) && c != '_' && c != '.' && c != '_')
- syntax_error(lineno, line, cptr);
- bp = get_name();
- if (goal == 0)
- {
- if (bp->class == TERM)
- terminal_start(bp->name);
- goal = bp;
- }
-
- s_lineno = lineno;
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != ':') syntax_error(lineno, line, cptr);
- start_rule(bp, s_lineno);
- ++cptr;
-}
-
-
-static void
-start_rule(bucket *bp, int s_lineno)
-{
- if (bp->class == TERM)
- terminal_lhs(s_lineno);
- bp->class = NONTERM;
- if (nrules >= maxrules)
- expand_rules();
- plhs[nrules] = bp;
- rprec[nrules] = UNDEFINED;
- rassoc[nrules] = TOKEN;
-}
-
-
-static void
-end_rule(void)
-{
- int i;
-
- if (!last_was_action && plhs[nrules]->tag)
- {
- for (i = nitems - 1; pitem[i]; --i) continue;
- if (pitem[i+1] == 0 || pitem[i+1]->tag != plhs[nrules]->tag)
- default_action_warning();
- }
-
- last_was_action = 0;
- if (nitems >= maxitems) expand_items();
- pitem[nitems] = 0;
- ++nitems;
- ++nrules;
-}
-
-
-static void
-insert_empty_rule(void)
-{
- bucket *bp, **bpp;
-
- assert(cache);
- sprintf(cache, "$$%d", ++gensym);
- bp = make_bucket(cache);
- last_symbol->next = bp;
- last_symbol = bp;
- bp->tag = plhs[nrules]->tag;
- bp->class = NONTERM;
-
- if ((nitems += 2) > maxitems)
- expand_items();
- bpp = pitem + nitems - 1;
- *bpp-- = bp;
- while ((bpp[0] = bpp[-1])) --bpp;
-
- if (++nrules >= maxrules)
- expand_rules();
- plhs[nrules] = plhs[nrules-1];
- plhs[nrules-1] = bp;
- rprec[nrules] = rprec[nrules-1];
- rprec[nrules-1] = 0;
- rassoc[nrules] = rassoc[nrules-1];
- rassoc[nrules-1] = TOKEN;
-}
-
-
-static void
-add_symbol(void)
-{
- int c;
- bucket *bp;
- int s_lineno = lineno;
-
- c = *cptr;
- if (c == '\'' || c == '"')
- bp = get_literal();
- else
- bp = get_name();
-
- c = nextc();
- if (c == ':')
- {
- end_rule();
- start_rule(bp, s_lineno);
- ++cptr;
- return;
- }
-
- if (last_was_action)
- insert_empty_rule();
- last_was_action = 0;
-
- if (++nitems > maxitems)
- expand_items();
- pitem[nitems-1] = bp;
-}
-
-
-static void
-copy_action(void)
-{
- int c;
- int i, n;
- int depth;
- int quote;
- char *tag;
- FILE *f = action_file;
- int a_lineno = lineno;
- char *a_line = dup_line();
- char *a_cptr = a_line + (cptr - line);
-
- if (last_was_action)
- insert_empty_rule();
- last_was_action = 1;
-
- fprintf(f, "case %d:\n", nrules - 2);
- if (!lflag)
- fprintf(f, line_format, lineno, input_file_name);
- if (*cptr == '=') ++cptr;
-
- n = 0;
- for (i = nitems - 1; pitem[i]; --i) ++n;
-
- depth = 0;
-loop:
- c = *cptr;
- if (c == '$')
- {
- if (cptr[1] == '<')
- {
- int d_lineno = lineno;
- char *d_line = dup_line();
- char *d_cptr = d_line + (cptr - line);
-
- ++cptr;
- tag = get_tag();
- c = *cptr;
- if (c == '$')
- {
- fprintf(f, "yyval.%s", tag);
- ++cptr;
- free(d_line);
- goto loop;
- }
- else if (isdigit(c))
- {
- i = get_number();
- if (i > n) dollar_warning(d_lineno, i);
- fprintf(f, "yyvsp[%d].%s", i - n, tag);
- free(d_line);
- goto loop;
- }
- else if (c == '-' && isdigit(cptr[1]))
- {
- ++cptr;
- i = -get_number() - n;
- fprintf(f, "yyvsp[%d].%s", i, tag);
- free(d_line);
- goto loop;
- }
- else
- dollar_error(d_lineno, d_line, d_cptr);
- }
- else if (cptr[1] == '$')
- {
- if (ntags)
- {
- tag = plhs[nrules]->tag;
- if (tag == 0) untyped_lhs();
- fprintf(f, "yyval.%s", tag);
- }
- else
- fprintf(f, "yyval");
- cptr += 2;
- goto loop;
- }
- else if (isdigit(cptr[1]))
- {
- ++cptr;
- i = get_number();
- if (ntags)
- {
- if (i <= 0 || i > n)
- unknown_rhs(i);
- tag = pitem[nitems + i - n - 1]->tag;
- if (tag == 0) untyped_rhs(i, pitem[nitems + i - n - 1]->name);
- fprintf(f, "yyvsp[%d].%s", i - n, tag);
- }
- else
- {
- if (i > n)
- dollar_warning(lineno, i);
- fprintf(f, "yyvsp[%d]", i - n);
- }
- goto loop;
- }
- else if (cptr[1] == '-')
- {
- cptr += 2;
- i = get_number();
- if (ntags)
- unknown_rhs(-i);
- fprintf(f, "yyvsp[%d]", -i - n);
- goto loop;
- }
- }
- if (isalpha(c) || c == '_' || c == '$')
- {
- do
- {
- putc(c, f);
- c = *++cptr;
- } while (isalnum(c) || c == '_' || c == '$');
- goto loop;
- }
- putc(c, f);
- ++cptr;
- switch (c)
- {
- case '\n':
- next_line:
- get_line();
- if (line) goto loop;
- unterminated_action(a_lineno, a_line, a_cptr);
-
- case ';':
- if (depth > 0) goto loop;
- fprintf(f, "\nbreak;\n");
- return;
-
- case '{':
- ++depth;
- goto loop;
-
- case '}':
- if (--depth > 0) goto loop;
- fprintf(f, "\nbreak;\n");
- return;
-
- case '\'':
- case '"':
- {
- int s_lineno = lineno;
- char *s_line = dup_line();
- char *s_cptr = s_line + (cptr - line - 1);
-
- quote = c;
- for (;;)
- {
- c = *cptr++;
- putc(c, f);
- if (c == quote)
- {
- free(s_line);
- goto loop;
- }
- if (c == '\n')
- unterminated_string(s_lineno, s_line, s_cptr);
- if (c == '\\')
- {
- c = *cptr++;
- putc(c, f);
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_string(s_lineno, s_line, s_cptr);
- }
- }
- }
- }
-
- case '/':
- c = *cptr;
- if (c == '/')
- {
- putc('*', f);
- while ((c = *++cptr) != '\n')
- {
- if (c == '*' && cptr[1] == '/')
- fprintf(f, "* ");
- else
- putc(c, f);
- }
- fprintf(f, "*/\n");
- goto next_line;
- }
- if (c == '*')
- {
- int c_lineno = lineno;
- char *c_line = dup_line();
- char *c_cptr = c_line + (cptr - line - 1);
-
- putc('*', f);
- ++cptr;
- for (;;)
- {
- c = *cptr++;
- putc(c, f);
- if (c == '*' && *cptr == '/')
- {
- putc('/', f);
- ++cptr;
- free(c_line);
- goto loop;
- }
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_comment(c_lineno, c_line, c_cptr);
- }
- }
- }
- goto loop;
-
- default:
- goto loop;
- }
-}
-
-
-static int
-mark_symbol(void)
-{
- int c;
- bucket *bp = NULL;
-
- c = cptr[1];
- if (c == '%' || c == '\\')
- {
- cptr += 2;
- return (1);
- }
-
- if (c == '=')
- cptr += 2;
- else if ((c == 'p' || c == 'P') &&
- ((c = cptr[2]) == 'r' || c == 'R') &&
- ((c = cptr[3]) == 'e' || c == 'E') &&
- ((c = cptr[4]) == 'c' || c == 'C') &&
- ((c = cptr[5], !IS_IDENT(c))))
- cptr += 5;
- else
- syntax_error(lineno, line, cptr);
-
- c = nextc();
- if (isalpha(c) || c == '_' || c == '.' || c == '$')
- bp = get_name();
- else if (c == '\'' || c == '"')
- bp = get_literal();
- else
- {
- syntax_error(lineno, line, cptr);
- /*NOTREACHED*/
- }
-
- if (rprec[nrules] != UNDEFINED && bp->prec != rprec[nrules])
- prec_redeclared();
-
- rprec[nrules] = bp->prec;
- rassoc[nrules] = bp->assoc;
- return (0);
-}
-
-
-static void
-read_grammar(void)
-{
- int c;
-
- initialize_grammar();
- advance_to_start();
-
- for (;;)
- {
- c = nextc();
- if (c == EOF) break;
- if (isalpha(c) || c == '_' || c == '.' || c == '$' || c == '\'' ||
- c == '"')
- add_symbol();
- else if (c == '{' || c == '=')
- copy_action();
- else if (c == '|')
- {
- end_rule();
- start_rule(plhs[nrules-1], 0);
- ++cptr;
- }
- else if (c == '%')
- {
- if (mark_symbol()) break;
- }
- else
- syntax_error(lineno, line, cptr);
- }
- end_rule();
-}
-
-
-static void
-free_tags(void)
-{
- int i;
-
- if (tag_table == 0) return;
-
- for (i = 0; i < ntags; ++i)
- {
- assert(tag_table[i]);
- free(tag_table[i]);
- }
- free(tag_table);
-}
-
-
-static void
-pack_names(void)
-{
- bucket *bp;
- char *p, *s, *t;
-
- name_pool_size = 13; /* 13 == sizeof("$end") + sizeof("$accept") */
- for (bp = first_symbol; bp; bp = bp->next)
- name_pool_size += strlen(bp->name) + 1;
- name_pool = malloc(name_pool_size);
- if (name_pool == 0) no_space();
-
- strcpy(name_pool, "$accept");
- strcpy(name_pool+8, "$end");
- t = name_pool + 13;
- for (bp = first_symbol; bp; bp = bp->next)
- {
- p = t;
- s = bp->name;
- while ((*t++ = *s++)) continue;
- free(bp->name);
- bp->name = p;
- }
-}
-
-
-static void
-check_symbols(void)
-{
- bucket *bp;
-
- if (goal->class == UNKNOWN)
- undefined_goal(goal->name);
-
- for (bp = first_symbol; bp; bp = bp->next)
- {
- if (bp->class == UNKNOWN)
- {
- undefined_symbol_warning(bp->name);
- bp->class = TERM;
- }
- }
-}
-
-
-static void
-pack_symbols(void)
-{
- bucket *bp;
- bucket **v;
- int i, j, k, n;
-
- nsyms = 2;
- ntokens = 1;
- for (bp = first_symbol; bp; bp = bp->next)
- {
- ++nsyms;
- if (bp->class == TERM) ++ntokens;
- }
- start_symbol = ntokens;
- nvars = nsyms - ntokens;
-
- symbol_name = malloc(nsyms*sizeof(char *));
- if (symbol_name == 0) no_space();
- symbol_value = malloc(nsyms*sizeof(short));
- if (symbol_value == 0) no_space();
- symbol_prec = malloc(nsyms*sizeof(short));
- if (symbol_prec == 0) no_space();
- symbol_assoc = malloc(nsyms);
- if (symbol_assoc == 0) no_space();
-
- v = malloc(nsyms*sizeof(bucket *));
- if (v == 0) no_space();
-
- v[0] = 0;
- v[start_symbol] = 0;
-
- i = 1;
- j = start_symbol + 1;
- for (bp = first_symbol; bp; bp = bp->next)
- {
- if (bp->class == TERM)
- v[i++] = bp;
- else
- v[j++] = bp;
- }
- assert(i == ntokens && j == nsyms);
-
- for (i = 1; i < ntokens; ++i)
- v[i]->index = i;
-
- goal->index = start_symbol + 1;
- k = start_symbol + 2;
- while (++i < nsyms)
- if (v[i] != goal)
- {
- v[i]->index = k;
- ++k;
- }
-
- goal->value = 0;
- k = 1;
- for (i = start_symbol + 1; i < nsyms; ++i)
- {
- if (v[i] != goal)
- {
- v[i]->value = k;
- ++k;
- }
- }
-
- k = 0;
- for (i = 1; i < ntokens; ++i)
- {
- n = v[i]->value;
- if (n > 256)
- {
- for (j = k++; j > 0 && symbol_value[j-1] > n; --j)
- symbol_value[j] = symbol_value[j-1];
- symbol_value[j] = n;
- }
- }
-
- if (v[1]->value == UNDEFINED)
- v[1]->value = 256;
-
- j = 0;
- n = 257;
- for (i = 2; i < ntokens; ++i)
- {
- if (v[i]->value == UNDEFINED)
- {
- while (j < k && n == symbol_value[j])
- {
- while (++j < k && n == symbol_value[j]) continue;
- ++n;
- }
- v[i]->value = n;
- ++n;
- }
- }
-
- symbol_name[0] = name_pool + 8;
- symbol_value[0] = 0;
- symbol_prec[0] = 0;
- symbol_assoc[0] = TOKEN;
- for (i = 1; i < ntokens; ++i)
- {
- symbol_name[i] = v[i]->name;
- symbol_value[i] = v[i]->value;
- symbol_prec[i] = v[i]->prec;
- symbol_assoc[i] = v[i]->assoc;
- }
- symbol_name[start_symbol] = name_pool;
- symbol_value[start_symbol] = -1;
- symbol_prec[start_symbol] = 0;
- symbol_assoc[start_symbol] = TOKEN;
- for (++i; i < nsyms; ++i)
- {
- k = v[i]->index;
- symbol_name[k] = v[i]->name;
- symbol_value[k] = v[i]->value;
- symbol_prec[k] = v[i]->prec;
- symbol_assoc[k] = v[i]->assoc;
- }
-
- free(v);
-}
-
-
-static void
-pack_grammar(void)
-{
- int i, j;
- int assoc, preced;
-
- ritem = malloc(nitems*sizeof(short));
- if (ritem == 0) no_space();
- rlhs = malloc(nrules*sizeof(short));
- if (rlhs == 0) no_space();
- rrhs = malloc((nrules+1)*sizeof(short));
- if (rrhs == 0) no_space();
- rprec = realloc(rprec, nrules*sizeof(short));
- if (rprec == 0) no_space();
- rassoc = realloc(rassoc, nrules);
- if (rassoc == 0) no_space();
-
- ritem[0] = -1;
- ritem[1] = goal->index;
- ritem[2] = 0;
- ritem[3] = -2;
- rlhs[0] = 0;
- rlhs[1] = 0;
- rlhs[2] = start_symbol;
- rrhs[0] = 0;
- rrhs[1] = 0;
- rrhs[2] = 1;
-
- j = 4;
- for (i = 3; i < nrules; ++i)
- {
- rlhs[i] = plhs[i]->index;
- rrhs[i] = j;
- assoc = TOKEN;
- preced = 0;
- while (pitem[j])
- {
- ritem[j] = pitem[j]->index;
- if (pitem[j]->class == TERM)
- {
- preced = pitem[j]->prec;
- assoc = pitem[j]->assoc;
- }
- ++j;
- }
- ritem[j] = -i;
- ++j;
- if (rprec[i] == UNDEFINED)
- {
- rprec[i] = preced;
- rassoc[i] = assoc;
- }
- }
- rrhs[i] = j;
-
- free(plhs);
- free(pitem);
-}
-
-
-static void
-print_grammar(void)
-{
- int i, j, k;
- int spacing;
- FILE *f = verbose_file;
-
- if (!vflag) return;
-
- k = 1;
- spacing = 0;
- for (i = 2; i < nrules; ++i)
- {
- if (rlhs[i] != rlhs[i-1])
- {
- if (i != 2) fprintf(f, "\n");
- fprintf(f, "%4d %s :", i - 2, symbol_name[rlhs[i]]);
- spacing = strlen(symbol_name[rlhs[i]]) + 1;
- }
- else
- {
- fprintf(f, "%4d ", i - 2);
- j = spacing;
- while (--j >= 0) putc(' ', f);
- putc('|', f);
- }
-
- while (ritem[k] >= 0)
- {
- fprintf(f, " %s", symbol_name[ritem[k]]);
- ++k;
- }
- ++k;
- putc('\n', f);
- }
-}
-
-
-void
-reader(void)
-{
- write_section(banner);
- create_symbol_table();
- read_declarations();
- read_grammar();
- free_symbol_table();
- free_tags();
- pack_names();
- check_symbols();
- pack_symbols();
- pack_grammar();
- free_symbols();
- print_grammar();
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/skeleton.c
--- a/head/usr.bin/yacc/skeleton.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,426 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)skeleton.c 5.8 (Berkeley) 4/29/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "defs.h"
-
-/* The definition of yysccsid in the banner should be replaced with */
-/* a #pragma ident directive if the target C compiler supports */
-/* #pragma ident directives. */
-/* */
-/* If the skeleton is changed, the banner should be changed so that */
-/* the altered version can be easily distinguished from the original. */
-/* */
-/* The #defines included with the banner are there because they are */
-/* useful in subsequent code. The macros #defined in the header or */
-/* the body either are not useful outside of semantic actions or */
-/* are conditional. */
-
-const char *banner[] =
-{
- "#include <stdlib.h>",
- "#include <string.h>",
- "#ifndef lint",
- "#ifdef __unused",
- "__unused",
- "#endif",
- "static char const ",
- "yyrcsid[] = \"$FreeBSD$\";",
- "#endif",
- "#define YYBYACC 1",
- "#define YYMAJOR 1",
- "#define YYMINOR 9",
- "#define YYLEX yylex()",
- "#define YYEMPTY -1",
- "#define yyclearin (yychar=(YYEMPTY))",
- "#define yyerrok (yyerrflag=0)",
- "#define YYRECOVERING() (yyerrflag!=0)",
- "#if defined(__cplusplus) || __STDC__",
- "static int yygrowstack(void);",
- "#else",
- "static int yygrowstack();",
- "#endif",
- 0
-};
-
-
-const char *tables[] =
-{
- "extern const short yylhs[];",
- "extern const short yylen[];",
- "extern const short yydefred[];",
- "extern const short yydgoto[];",
- "extern const short yysindex[];",
- "extern const short yyrindex[];",
- "extern const short yygindex[];",
- "extern const short yytable[];",
- "extern const short yycheck[];",
- "#if YYDEBUG",
- "extern char *yyname[];",
- "extern char *yyrule[];",
- "#endif",
- 0
-};
-
-
-const char *header[] =
-{
- "#if YYDEBUG",
- "#include <stdio.h>",
- "#endif",
- "#ifdef YYSTACKSIZE",
- "#undef YYMAXDEPTH",
- "#define YYMAXDEPTH YYSTACKSIZE",
- "#else",
- "#ifdef YYMAXDEPTH",
- "#define YYSTACKSIZE YYMAXDEPTH",
- "#else",
- "#define YYSTACKSIZE 10000",
- "#define YYMAXDEPTH 10000",
- "#endif",
- "#endif",
- "#define YYINITSTACKSIZE 200",
- "int yydebug;",
- "int yynerrs;",
- "int yyerrflag;",
- "int yychar;",
- "short *yyssp;",
- "YYSTYPE *yyvsp;",
- "YYSTYPE yyval;",
- "YYSTYPE yylval;",
- "short *yyss;",
- "short *yysslim;",
- "YYSTYPE *yyvs;",
- "int yystacksize;",
- 0
-};
-
-
-const char *body[] =
-{
- "/* allocate initial stack or double stack size, up to YYMAXDEPTH */",
- "#if defined(__cplusplus) || __STDC__",
- "static int yygrowstack(void)",
- "#else",
- "static int yygrowstack()",
- "#endif",
- "{",
- " int newsize, i;",
- " short *newss;",
- " YYSTYPE *newvs;",
- "",
- " if ((newsize = yystacksize) == 0)",
- " newsize = YYINITSTACKSIZE;",
- " else if (newsize >= YYMAXDEPTH)",
- " return -1;",
- " else if ((newsize *= 2) > YYMAXDEPTH)",
- " newsize = YYMAXDEPTH;",
- " i = yyssp - yyss;",
- " newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :",
- " (short *)malloc(newsize * sizeof *newss);",
- " if (newss == NULL)",
- " return -1;",
- " yyss = newss;",
- " yyssp = newss + i;",
- " newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :",
- " (YYSTYPE *)malloc(newsize * sizeof *newvs);",
- " if (newvs == NULL)",
- " return -1;",
- " yyvs = newvs;",
- " yyvsp = newvs + i;",
- " yystacksize = newsize;",
- " yysslim = yyss + newsize - 1;",
- " return 0;",
- "}",
- "",
- "#define YYABORT goto yyabort",
- "#define YYREJECT goto yyabort",
- "#define YYACCEPT goto yyaccept",
- "#define YYERROR goto yyerrlab",
- "",
- "#ifndef YYPARSE_PARAM",
- "#if defined(__cplusplus) || __STDC__",
- "#define YYPARSE_PARAM_ARG void",
- "#define YYPARSE_PARAM_DECL",
- "#else /* ! ANSI-C/C++ */",
- "#define YYPARSE_PARAM_ARG",
- "#define YYPARSE_PARAM_DECL",
- "#endif /* ANSI-C/C++ */",
- "#else /* YYPARSE_PARAM */",
- "#ifndef YYPARSE_PARAM_TYPE",
- "#define YYPARSE_PARAM_TYPE void *",
- "#endif",
- "#if defined(__cplusplus) || __STDC__",
- "#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM",
- "#define YYPARSE_PARAM_DECL",
- "#else /* ! ANSI-C/C++ */",
- "#define YYPARSE_PARAM_ARG YYPARSE_PARAM",
- "#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;",
- "#endif /* ANSI-C/C++ */",
- "#endif /* ! YYPARSE_PARAM */",
- "",
- "int",
- "yyparse (YYPARSE_PARAM_ARG)",
- " YYPARSE_PARAM_DECL",
- "{",
- " int yym, yyn, yystate;",
- "#if YYDEBUG",
- " const char *yys;",
- "",
- " if ((yys = getenv(\"YYDEBUG\")))",
- " {",
- " yyn = *yys;",
- " if (yyn >= '0' && yyn <= '9')",
- " yydebug = yyn - '0';",
- " }",
- "#endif",
- "",
- " yynerrs = 0;",
- " yyerrflag = 0;",
- " yychar = (-1);",
- "",
- " if (yyss == NULL && yygrowstack()) goto yyoverflow;",
- " yyssp = yyss;",
- " yyvsp = yyvs;",
- " *yyssp = yystate = 0;",
- "",
- "yyloop:",
- " if ((yyn = yydefred[yystate])) goto yyreduce;",
- " if (yychar < 0)",
- " {",
- " if ((yychar = yylex()) < 0) yychar = 0;",
- "#if YYDEBUG",
- " if (yydebug)",
- " {",
- " yys = 0;",
- " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
- " if (!yys) yys = \"illegal-symbol\";",
- " printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
- " YYPREFIX, yystate, yychar, yys);",
- " }",
- "#endif",
- " }",
- " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
- " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
- " {",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: state %d, shifting to state %d\\n\",",
- " YYPREFIX, yystate, yytable[yyn]);",
- "#endif",
- " if (yyssp >= yysslim && yygrowstack())",
- " {",
- " goto yyoverflow;",
- " }",
- " *++yyssp = yystate = yytable[yyn];",
- " *++yyvsp = yylval;",
- " yychar = (-1);",
- " if (yyerrflag > 0) --yyerrflag;",
- " goto yyloop;",
- " }",
- " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
- " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
- " {",
- " yyn = yytable[yyn];",
- " goto yyreduce;",
- " }",
- " if (yyerrflag) goto yyinrecovery;",
- "#if defined(lint) || defined(__GNUC__)",
- " goto yynewerror;",
- "#endif",
- "yynewerror:",
- " yyerror(\"syntax error\");",
- "#if defined(lint) || defined(__GNUC__)",
- " goto yyerrlab;",
- "#endif",
- "yyerrlab:",
- " ++yynerrs;",
- "yyinrecovery:",
- " if (yyerrflag < 3)",
- " {",
- " yyerrflag = 3;",
- " for (;;)",
- " {",
- " if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
- " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
- " {",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: state %d, error recovery shifting\\",
- " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);",
- "#endif",
- " if (yyssp >= yysslim && yygrowstack())",
- " {",
- " goto yyoverflow;",
- " }",
- " *++yyssp = yystate = yytable[yyn];",
- " *++yyvsp = yylval;",
- " goto yyloop;",
- " }",
- " else",
- " {",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: error recovery discarding state %d\
-\\n\",",
- " YYPREFIX, *yyssp);",
- "#endif",
- " if (yyssp <= yyss) goto yyabort;",
- " --yyssp;",
- " --yyvsp;",
- " }",
- " }",
- " }",
- " else",
- " {",
- " if (yychar == 0) goto yyabort;",
- "#if YYDEBUG",
- " if (yydebug)",
- " {",
- " yys = 0;",
- " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
- " if (!yys) yys = \"illegal-symbol\";",
- " printf(\"%sdebug: state %d, error recovery discards token %d\
- (%s)\\n\",",
- " YYPREFIX, yystate, yychar, yys);",
- " }",
- "#endif",
- " yychar = (-1);",
- " goto yyloop;",
- " }",
- "yyreduce:",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",",
- " YYPREFIX, yystate, yyn, yyrule[yyn]);",
- "#endif",
- " yym = yylen[yyn];",
- " if (yym)",
- " yyval = yyvsp[1-yym];",
- " else",
- " memset(&yyval, 0, sizeof yyval);",
- " switch (yyn)",
- " {",
- 0
-};
-
-
-const char *trailer[] =
-{
- " }",
- " yyssp -= yym;",
- " yystate = *yyssp;",
- " yyvsp -= yym;",
- " yym = yylhs[yyn];",
- " if (yystate == 0 && yym == 0)",
- " {",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: after reduction, shifting from state 0 to\\",
- " state %d\\n\", YYPREFIX, YYFINAL);",
- "#endif",
- " yystate = YYFINAL;",
- " *++yyssp = YYFINAL;",
- " *++yyvsp = yyval;",
- " if (yychar < 0)",
- " {",
- " if ((yychar = yylex()) < 0) yychar = 0;",
- "#if YYDEBUG",
- " if (yydebug)",
- " {",
- " yys = 0;",
- " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
- " if (!yys) yys = \"illegal-symbol\";",
- " printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
- " YYPREFIX, YYFINAL, yychar, yys);",
- " }",
- "#endif",
- " }",
- " if (yychar == 0) goto yyaccept;",
- " goto yyloop;",
- " }",
- " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
- " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
- " yystate = yytable[yyn];",
- " else",
- " yystate = yydgoto[yym];",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: after reduction, shifting from state %d \\",
- "to state %d\\n\", YYPREFIX, *yyssp, yystate);",
- "#endif",
- " if (yyssp >= yysslim && yygrowstack())",
- " {",
- " goto yyoverflow;",
- " }",
- " *++yyssp = yystate;",
- " *++yyvsp = yyval;",
- " goto yyloop;",
- "yyoverflow:",
- " yyerror(\"yacc stack overflow\");",
- "yyabort:",
- " return (1);",
- "yyaccept:",
- " return (0);",
- "}",
- 0
-};
-
-
-void
-write_section(const char *section[])
-{
- int c;
- int i;
- const char *s;
- FILE *f;
-
- f = code_file;
- for (i = 0; (s = section[i]); ++i)
- {
- ++outline;
- while ((c = *s))
- {
- putc(c, f);
- ++s;
- }
- putc('\n', f);
- }
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/symtab.c
--- a/head/usr.bin/yacc/symtab.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)symtab.c 5.3 (Berkeley) 6/1/90";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-#include "defs.h"
-
-/* TABLE_SIZE is the number of entries in the symbol table. */
-/* TABLE_SIZE must be a power of two. */
-
-#define TABLE_SIZE 1024
-
-static int hash(const char *);
-
-bucket **symbol_table;
-bucket *first_symbol;
-bucket *last_symbol;
-
-
-static int
-hash(const char *name)
-{
- const char *s;
- int c, k;
-
- assert(name && *name);
- s = name;
- k = *s;
- while ((c = *++s))
- k = (31*k + c) & (TABLE_SIZE - 1);
-
- return (k);
-}
-
-
-bucket *
-make_bucket(const char *name)
-{
- bucket *bp;
-
- assert(name);
- bp = malloc(sizeof(bucket));
- if (bp == 0) no_space();
- bp->link = 0;
- bp->next = 0;
- bp->name = malloc(strlen(name) + 1);
- if (bp->name == 0) no_space();
- bp->tag = 0;
- bp->value = UNDEFINED;
- bp->index = 0;
- bp->prec = 0;
- bp-> class = UNKNOWN;
- bp->assoc = TOKEN;
-
- if (bp->name == 0) no_space();
- strcpy(bp->name, name);
-
- return (bp);
-}
-
-
-bucket *
-lookup(char *name)
-{
- bucket *bp, **bpp;
-
- bpp = symbol_table + hash(name);
- bp = *bpp;
-
- while (bp)
- {
- if (strcmp(name, bp->name) == 0) return (bp);
- bpp = &bp->link;
- bp = *bpp;
- }
-
- *bpp = bp = make_bucket(name);
- last_symbol->next = bp;
- last_symbol = bp;
-
- return (bp);
-}
-
-
-void
-create_symbol_table(void)
-{
- int i;
- bucket *bp;
-
- symbol_table = malloc(TABLE_SIZE*sizeof(bucket *));
- if (symbol_table == 0) no_space();
- for (i = 0; i < TABLE_SIZE; i++)
- symbol_table[i] = 0;
-
- bp = make_bucket("error");
- bp->index = 1;
- bp->class = TERM;
-
- first_symbol = bp;
- last_symbol = bp;
- symbol_table[hash("error")] = bp;
-}
-
-
-void
-free_symbol_table(void)
-{
- free(symbol_table);
- symbol_table = 0;
-}
-
-
-void
-free_symbols(void)
-{
- bucket *p, *q;
-
- for (p = first_symbol; p; p = q)
- {
- q = p->next;
- free(p);
- }
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/test/error.output
--- a/head/usr.bin/yacc/test/error.output Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
- 0 $accept : S $end
-
- 1 S : error
-
-state 0
- $accept : . S $end (0)
-
- error shift 1
- . error
-
- S goto 2
-
-
-state 1
- S : error . (1)
-
- . reduce 1
-
-
-state 2
- $accept : S . $end (0)
-
- $end accept
-
-
-2 terminals, 2 nonterminals
-2 grammar rules, 3 states
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/test/error.tab.c
--- a/head/usr.bin/yacc/test/error.tab.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,317 +0,0 @@
-#ifndef lint
-static char const yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
-#endif
-#include <stdlib.h>
-#define YYBYACC 1
-#define YYMAJOR 1
-#define YYMINOR 9
-#define YYLEX yylex()
-#define YYEMPTY -1
-#define yyclearin (yychar=(YYEMPTY))
-#define yyerrok (yyerrflag=0)
-#define YYRECOVERING (yyerrflag!=0)
-#if defined(c_plusplus) || defined(__cplusplus)
-#include <stdlib.h>
-#else
-extern char *getenv();
-extern void *realloc();
-#endif
-static int yygrowstack();
-#define YYPREFIX "yy"
-#define YYERRCODE 256
-const short yylhs[] = { -1,
- 0,
-};
-const short yylen[] = { 2,
- 1,
-};
-const short yydefred[] = { 0,
- 1, 0,
-};
-const short yydgoto[] = { 2,
-};
-const short yysindex[] = { -256,
- 0, 0,
-};
-const short yyrindex[] = { 0,
- 0, 0,
-};
-const short yygindex[] = { 0,
-};
-#define YYTABLESIZE 0
-const short yytable[] = { 1,
-};
-const short yycheck[] = { 256,
-};
-#define YYFINAL 2
-#ifndef YYDEBUG
-#define YYDEBUG 0
-#elif YYDEBUG
-#include <stdio.h>
-#endif
-#define YYMAXTOKEN 0
-#if YYDEBUG
-const char * const yyname[] = {
-"end-of-file",
-};
-const char * const yyrule[] = {
-"$accept : S",
-"S : error",
-};
-#endif
-#ifndef YYSTYPE
-typedef int YYSTYPE;
-#endif
-#ifdef YYSTACKSIZE
-#undef YYMAXDEPTH
-#define YYMAXDEPTH YYSTACKSIZE
-#else
-#ifdef YYMAXDEPTH
-#define YYSTACKSIZE YYMAXDEPTH
-#else
-#define YYSTACKSIZE 10000
-#define YYMAXDEPTH 10000
-#endif
-#endif
-#define YYINITSTACKSIZE 200
-int yydebug;
-int yynerrs;
-int yyerrflag;
-int yychar;
-short *yyssp;
-YYSTYPE *yyvsp;
-YYSTYPE yyval;
-YYSTYPE yylval;
-short *yyss;
-short *yysslim;
-YYSTYPE *yyvs;
-int yystacksize;
-#line 4 "error.y"
-main(){printf("yyparse() = %d\n",yyparse());}
-yylex(){return-1;}
-yyerror(s)char*s;{printf("%s\n",s);}
-#line 92 "error.tab.c"
-/* allocate initial stack or double stack size, up to YYMAXDEPTH */
-static int yygrowstack()
-{
- int newsize, i;
- short *newss;
- YYSTYPE *newvs;
-
- if ((newsize = yystacksize) == 0)
- newsize = YYINITSTACKSIZE;
- else if (newsize >= YYMAXDEPTH)
- return -1;
- else if ((newsize *= 2) > YYMAXDEPTH)
- newsize = YYMAXDEPTH;
- i = yyssp - yyss;
- if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL)
- return -1;
- yyss = newss;
- yyssp = newss + i;
- if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL)
- return -1;
- yyvs = newvs;
- yyvsp = newvs + i;
- yystacksize = newsize;
- yysslim = yyss + newsize - 1;
- return 0;
-}
-
-#define YYABORT goto yyabort
-#define YYREJECT goto yyabort
-#define YYACCEPT goto yyaccept
-#define YYERROR goto yyerrlab
-
-int
-yyparse()
-{
- register int yym, yyn, yystate;
-#if YYDEBUG
- register const char *yys;
-
- if ((yys = getenv("YYDEBUG")))
- {
- yyn = *yys;
- if (yyn >= '0' && yyn <= '9')
- yydebug = yyn - '0';
- }
-#endif
-
- yynerrs = 0;
- yyerrflag = 0;
- yychar = (-1);
-
- if (yyss == NULL && yygrowstack()) goto yyoverflow;
- yyssp = yyss;
- yyvsp = yyvs;
- *yyssp = yystate = 0;
-
-yyloop:
- if ((yyn = yydefred[yystate])) goto yyreduce;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- }
- if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, shifting to state %d\n",
- YYPREFIX, yystate, yytable[yyn]);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- yychar = (-1);
- if (yyerrflag > 0) --yyerrflag;
- goto yyloop;
- }
- if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
- yyn = yytable[yyn];
- goto yyreduce;
- }
- if (yyerrflag) goto yyinrecovery;
-#if defined(lint) || defined(__GNUC__)
- goto yynewerror;
-#endif
-yynewerror:
- yyerror("syntax error");
-#if defined(lint) || defined(__GNUC__)
- goto yyerrlab;
-#endif
-yyerrlab:
- ++yynerrs;
-yyinrecovery:
- if (yyerrflag < 3)
- {
- yyerrflag = 3;
- for (;;)
- {
- if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, error recovery shifting\
- to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- goto yyloop;
- }
- else
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: error recovery discarding state %d\n",
- YYPREFIX, *yyssp);
-#endif
- if (yyssp <= yyss) goto yyabort;
- --yyssp;
- --yyvsp;
- }
- }
- }
- else
- {
- if (yychar == 0) goto yyabort;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- yychar = (-1);
- goto yyloop;
- }
-yyreduce:
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, reducing by rule %d (%s)\n",
- YYPREFIX, yystate, yyn, yyrule[yyn]);
-#endif
- yym = yylen[yyn];
- yyval = yyvsp[1-yym];
- switch (yyn)
- {
- }
- yyssp -= yym;
- yystate = *yyssp;
- yyvsp -= yym;
- yym = yylhs[yyn];
- if (yystate == 0 && yym == 0)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state 0 to\
- state %d\n", YYPREFIX, YYFINAL);
-#endif
- yystate = YYFINAL;
- *++yyssp = YYFINAL;
- *++yyvsp = yyval;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, YYFINAL, yychar, yys);
- }
-#endif
- }
- if (yychar == 0) goto yyaccept;
- goto yyloop;
- }
- if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
- yystate = yytable[yyn];
- else
- yystate = yydgoto[yym];
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state %d \
-to state %d\n", YYPREFIX, *yyssp, yystate);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate;
- *++yyvsp = yyval;
- goto yyloop;
-yyoverflow:
- yyerror("yacc stack overflow");
-yyabort:
- return (1);
-yyaccept:
- return (0);
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/test/error.y
--- a/head/usr.bin/yacc/test/error.y Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-%%
-S: error
-%%
-main(){printf("yyparse() = %d\n",yyparse());}
-yylex(){return-1;}
-yyerror(s)char*s;{printf("%s\n",s);}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/test/ftp.output
--- a/head/usr.bin/yacc/test/ftp.output Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1625 +0,0 @@
- 0 $accept : cmd_list $end
-
- 1 cmd_list :
- 2 | cmd_list cmd
- 3 | cmd_list rcmd
-
- 4 cmd : USER SP username CRLF
- 5 | PASS SP password CRLF
- 6 | PORT SP host_port CRLF
- 7 | PASV CRLF
- 8 | TYPE SP type_code CRLF
- 9 | STRU SP struct_code CRLF
- 10 | MODE SP mode_code CRLF
- 11 | ALLO SP NUMBER CRLF
- 12 | ALLO SP NUMBER SP R SP NUMBER CRLF
- 13 | RETR check_login SP pathname CRLF
- 14 | STOR check_login SP pathname CRLF
- 15 | APPE check_login SP pathname CRLF
- 16 | NLST check_login CRLF
- 17 | NLST check_login SP STRING CRLF
- 18 | LIST check_login CRLF
- 19 | LIST check_login SP pathname CRLF
- 20 | STAT check_login SP pathname CRLF
- 21 | STAT CRLF
- 22 | DELE check_login SP pathname CRLF
- 23 | RNTO SP pathname CRLF
- 24 | ABOR CRLF
- 25 | CWD check_login CRLF
- 26 | CWD check_login SP pathname CRLF
- 27 | HELP CRLF
- 28 | HELP SP STRING CRLF
- 29 | NOOP CRLF
- 30 | MKD check_login SP pathname CRLF
- 31 | RMD check_login SP pathname CRLF
- 32 | PWD check_login CRLF
- 33 | CDUP check_login CRLF
- 34 | SITE SP HELP CRLF
- 35 | SITE SP HELP SP STRING CRLF
- 36 | SITE SP UMASK check_login CRLF
- 37 | SITE SP UMASK check_login SP octal_number CRLF
- 38 | SITE SP CHMOD check_login SP octal_number SP pathname CRLF
- 39 | SITE SP IDLE CRLF
- 40 | SITE SP IDLE SP NUMBER CRLF
- 41 | STOU check_login SP pathname CRLF
- 42 | SYST CRLF
- 43 | SIZE check_login SP pathname CRLF
- 44 | MDTM check_login SP pathname CRLF
- 45 | QUIT CRLF
- 46 | error CRLF
-
- 47 rcmd : RNFR check_login SP pathname CRLF
-
- 48 username : STRING
-
- 49 password :
- 50 | STRING
-
- 51 byte_size : NUMBER
-
- 52 host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER
-
- 53 form_code : N
- 54 | T
- 55 | C
-
- 56 type_code : A
- 57 | A SP form_code
- 58 | E
- 59 | E SP form_code
- 60 | I
- 61 | L
- 62 | L SP byte_size
- 63 | L byte_size
-
- 64 struct_code : F
- 65 | R
- 66 | P
-
- 67 mode_code : S
- 68 | B
- 69 | C
-
- 70 pathname : pathstring
-
- 71 pathstring : STRING
-
- 72 octal_number : NUMBER
-
- 73 check_login :
-
-state 0
- $accept : . cmd_list $end (0)
- cmd_list : . (1)
-
- . reduce 1
-
- cmd_list goto 1
-
-
-state 1
- $accept : cmd_list . $end (0)
- cmd_list : cmd_list . cmd (2)
- cmd_list : cmd_list . rcmd (3)
-
- $end accept
- error shift 2
- USER shift 3
- PASS shift 4
- QUIT shift 5
- PORT shift 6
- PASV shift 7
- TYPE shift 8
- STRU shift 9
- MODE shift 10
- RETR shift 11
- STOR shift 12
- APPE shift 13
- ALLO shift 14
- RNFR shift 15
- RNTO shift 16
- ABOR shift 17
- DELE shift 18
- CWD shift 19
- LIST shift 20
- NLST shift 21
- SITE shift 22
- STAT shift 23
- HELP shift 24
- NOOP shift 25
- MKD shift 26
- RMD shift 27
- PWD shift 28
- CDUP shift 29
- STOU shift 30
- SYST shift 31
- SIZE shift 32
- MDTM shift 33
- . error
-
- cmd goto 34
- rcmd goto 35
-
-
-state 2
- cmd : error . CRLF (46)
-
- CRLF shift 36
- . error
-
-
-state 3
- cmd : USER . SP username CRLF (4)
-
- SP shift 37
- . error
-
-
-state 4
- cmd : PASS . SP password CRLF (5)
-
- SP shift 38
- . error
-
-
-state 5
- cmd : QUIT . CRLF (45)
-
- CRLF shift 39
- . error
-
-
-state 6
- cmd : PORT . SP host_port CRLF (6)
-
- SP shift 40
- . error
-
-
-state 7
- cmd : PASV . CRLF (7)
-
- CRLF shift 41
- . error
-
-
-state 8
- cmd : TYPE . SP type_code CRLF (8)
-
- SP shift 42
- . error
-
-
-state 9
- cmd : STRU . SP struct_code CRLF (9)
-
- SP shift 43
- . error
-
-
-state 10
- cmd : MODE . SP mode_code CRLF (10)
-
- SP shift 44
- . error
-
-
-state 11
- cmd : RETR . check_login SP pathname CRLF (13)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 45
-
-
-state 12
- cmd : STOR . check_login SP pathname CRLF (14)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 46
-
-
-state 13
- cmd : APPE . check_login SP pathname CRLF (15)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 47
-
-
-state 14
- cmd : ALLO . SP NUMBER CRLF (11)
- cmd : ALLO . SP NUMBER SP R SP NUMBER CRLF (12)
-
- SP shift 48
- . error
-
-
-state 15
- rcmd : RNFR . check_login SP pathname CRLF (47)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 49
-
-
-state 16
- cmd : RNTO . SP pathname CRLF (23)
-
- SP shift 50
- . error
-
-
-state 17
- cmd : ABOR . CRLF (24)
-
- CRLF shift 51
- . error
-
-
-state 18
- cmd : DELE . check_login SP pathname CRLF (22)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 52
-
-
-state 19
- cmd : CWD . check_login CRLF (25)
- cmd : CWD . check_login SP pathname CRLF (26)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 53
-
-
-state 20
- cmd : LIST . check_login CRLF (18)
- cmd : LIST . check_login SP pathname CRLF (19)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 54
-
-
-state 21
- cmd : NLST . check_login CRLF (16)
- cmd : NLST . check_login SP STRING CRLF (17)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 55
-
-
-state 22
- cmd : SITE . SP HELP CRLF (34)
- cmd : SITE . SP HELP SP STRING CRLF (35)
- cmd : SITE . SP UMASK check_login CRLF (36)
- cmd : SITE . SP UMASK check_login SP octal_number CRLF (37)
- cmd : SITE . SP CHMOD check_login SP octal_number SP pathname CRLF (38)
- cmd : SITE . SP IDLE CRLF (39)
- cmd : SITE . SP IDLE SP NUMBER CRLF (40)
-
- SP shift 56
- . error
-
-
-state 23
- cmd : STAT . check_login SP pathname CRLF (20)
- cmd : STAT . CRLF (21)
- check_login : . (73)
-
- CRLF shift 57
- SP reduce 73
-
- check_login goto 58
-
-
-state 24
- cmd : HELP . CRLF (27)
- cmd : HELP . SP STRING CRLF (28)
-
- SP shift 59
- CRLF shift 60
- . error
-
-
-state 25
- cmd : NOOP . CRLF (29)
-
- CRLF shift 61
- . error
-
-
-state 26
- cmd : MKD . check_login SP pathname CRLF (30)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 62
-
-
-state 27
- cmd : RMD . check_login SP pathname CRLF (31)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 63
-
-
-state 28
- cmd : PWD . check_login CRLF (32)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 64
-
-
-state 29
- cmd : CDUP . check_login CRLF (33)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 65
-
-
-state 30
- cmd : STOU . check_login SP pathname CRLF (41)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 66
-
-
-state 31
- cmd : SYST . CRLF (42)
-
- CRLF shift 67
- . error
-
-
-state 32
- cmd : SIZE . check_login SP pathname CRLF (43)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 68
-
-
-state 33
- cmd : MDTM . check_login SP pathname CRLF (44)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 69
-
-
-state 34
- cmd_list : cmd_list cmd . (2)
-
- . reduce 2
-
-
-state 35
- cmd_list : cmd_list rcmd . (3)
-
- . reduce 3
-
-
-state 36
- cmd : error CRLF . (46)
-
- . reduce 46
-
-
-state 37
- cmd : USER SP . username CRLF (4)
-
- STRING shift 70
- . error
-
- username goto 71
-
-
-state 38
- cmd : PASS SP . password CRLF (5)
- password : . (49)
-
- STRING shift 72
- CRLF reduce 49
-
- password goto 73
-
-
-state 39
- cmd : QUIT CRLF . (45)
-
- . reduce 45
-
-
-state 40
- cmd : PORT SP . host_port CRLF (6)
-
- NUMBER shift 74
- . error
-
- host_port goto 75
-
-
-state 41
- cmd : PASV CRLF . (7)
-
- . reduce 7
-
-
-state 42
- cmd : TYPE SP . type_code CRLF (8)
-
- A shift 76
- E shift 77
- I shift 78
- L shift 79
- . error
-
- type_code goto 80
-
-
-state 43
- cmd : STRU SP . struct_code CRLF (9)
-
- F shift 81
- P shift 82
- R shift 83
- . error
-
- struct_code goto 84
-
-
-state 44
- cmd : MODE SP . mode_code CRLF (10)
-
- B shift 85
- C shift 86
- S shift 87
- . error
-
- mode_code goto 88
-
-
-state 45
- cmd : RETR check_login . SP pathname CRLF (13)
-
- SP shift 89
- . error
-
-
-state 46
- cmd : STOR check_login . SP pathname CRLF (14)
-
- SP shift 90
- . error
-
-
-state 47
- cmd : APPE check_login . SP pathname CRLF (15)
-
- SP shift 91
- . error
-
-
-state 48
- cmd : ALLO SP . NUMBER CRLF (11)
- cmd : ALLO SP . NUMBER SP R SP NUMBER CRLF (12)
-
- NUMBER shift 92
- . error
-
-
-state 49
- rcmd : RNFR check_login . SP pathname CRLF (47)
-
- SP shift 93
- . error
-
-
-state 50
- cmd : RNTO SP . pathname CRLF (23)
-
- STRING shift 94
- . error
-
- pathname goto 95
- pathstring goto 96
-
-
-state 51
- cmd : ABOR CRLF . (24)
-
- . reduce 24
-
-
-state 52
- cmd : DELE check_login . SP pathname CRLF (22)
-
- SP shift 97
- . error
-
-
-state 53
- cmd : CWD check_login . CRLF (25)
- cmd : CWD check_login . SP pathname CRLF (26)
-
- SP shift 98
- CRLF shift 99
- . error
-
-
-state 54
- cmd : LIST check_login . CRLF (18)
- cmd : LIST check_login . SP pathname CRLF (19)
-
- SP shift 100
- CRLF shift 101
- . error
-
-
-state 55
- cmd : NLST check_login . CRLF (16)
- cmd : NLST check_login . SP STRING CRLF (17)
-
- SP shift 102
- CRLF shift 103
- . error
-
-
-state 56
- cmd : SITE SP . HELP CRLF (34)
- cmd : SITE SP . HELP SP STRING CRLF (35)
- cmd : SITE SP . UMASK check_login CRLF (36)
- cmd : SITE SP . UMASK check_login SP octal_number CRLF (37)
- cmd : SITE SP . CHMOD check_login SP octal_number SP pathname CRLF (38)
- cmd : SITE SP . IDLE CRLF (39)
- cmd : SITE SP . IDLE SP NUMBER CRLF (40)
-
- HELP shift 104
- UMASK shift 105
- IDLE shift 106
- CHMOD shift 107
- . error
-
-
-state 57
- cmd : STAT CRLF . (21)
-
- . reduce 21
-
-
-state 58
- cmd : STAT check_login . SP pathname CRLF (20)
-
- SP shift 108
- . error
-
-
-state 59
- cmd : HELP SP . STRING CRLF (28)
-
- STRING shift 109
- . error
-
-
-state 60
- cmd : HELP CRLF . (27)
-
- . reduce 27
-
-
-state 61
- cmd : NOOP CRLF . (29)
-
- . reduce 29
-
-
-state 62
- cmd : MKD check_login . SP pathname CRLF (30)
-
- SP shift 110
- . error
-
-
-state 63
- cmd : RMD check_login . SP pathname CRLF (31)
-
- SP shift 111
- . error
-
-
-state 64
- cmd : PWD check_login . CRLF (32)
-
- CRLF shift 112
- . error
-
-
-state 65
- cmd : CDUP check_login . CRLF (33)
-
- CRLF shift 113
- . error
-
-
-state 66
- cmd : STOU check_login . SP pathname CRLF (41)
-
- SP shift 114
- . error
-
-
-state 67
- cmd : SYST CRLF . (42)
-
- . reduce 42
-
-
-state 68
- cmd : SIZE check_login . SP pathname CRLF (43)
-
- SP shift 115
- . error
-
-
-state 69
- cmd : MDTM check_login . SP pathname CRLF (44)
-
- SP shift 116
- . error
-
-
-state 70
- username : STRING . (48)
-
- . reduce 48
-
-
-state 71
- cmd : USER SP username . CRLF (4)
-
- CRLF shift 117
- . error
-
-
-state 72
- password : STRING . (50)
-
- . reduce 50
-
-
-state 73
- cmd : PASS SP password . CRLF (5)
-
- CRLF shift 118
- . error
-
-
-state 74
- host_port : NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- COMMA shift 119
- . error
-
-
-state 75
- cmd : PORT SP host_port . CRLF (6)
-
- CRLF shift 120
- . error
-
-
-state 76
- type_code : A . (56)
- type_code : A . SP form_code (57)
-
- SP shift 121
- CRLF reduce 56
-
-
-state 77
- type_code : E . (58)
- type_code : E . SP form_code (59)
-
- SP shift 122
- CRLF reduce 58
-
-
-state 78
- type_code : I . (60)
-
- . reduce 60
-
-
-state 79
- type_code : L . (61)
- type_code : L . SP byte_size (62)
- type_code : L . byte_size (63)
-
- SP shift 123
- NUMBER shift 124
- CRLF reduce 61
-
- byte_size goto 125
-
-
-state 80
- cmd : TYPE SP type_code . CRLF (8)
-
- CRLF shift 126
- . error
-
-
-state 81
- struct_code : F . (64)
-
- . reduce 64
-
-
-state 82
- struct_code : P . (66)
-
- . reduce 66
-
-
-state 83
- struct_code : R . (65)
-
- . reduce 65
-
-
-state 84
- cmd : STRU SP struct_code . CRLF (9)
-
- CRLF shift 127
- . error
-
-
-state 85
- mode_code : B . (68)
-
- . reduce 68
-
-
-state 86
- mode_code : C . (69)
-
- . reduce 69
-
-
-state 87
- mode_code : S . (67)
-
- . reduce 67
-
-
-state 88
- cmd : MODE SP mode_code . CRLF (10)
-
- CRLF shift 128
- . error
-
-
-state 89
- cmd : RETR check_login SP . pathname CRLF (13)
-
- STRING shift 94
- . error
-
- pathname goto 129
- pathstring goto 96
-
-
-state 90
- cmd : STOR check_login SP . pathname CRLF (14)
-
- STRING shift 94
- . error
-
- pathname goto 130
- pathstring goto 96
-
-
-state 91
- cmd : APPE check_login SP . pathname CRLF (15)
-
- STRING shift 94
- . error
-
- pathname goto 131
- pathstring goto 96
-
-
-state 92
- cmd : ALLO SP NUMBER . CRLF (11)
- cmd : ALLO SP NUMBER . SP R SP NUMBER CRLF (12)
-
- SP shift 132
- CRLF shift 133
- . error
-
-
-state 93
- rcmd : RNFR check_login SP . pathname CRLF (47)
-
- STRING shift 94
- . error
-
- pathname goto 134
- pathstring goto 96
-
-
-state 94
- pathstring : STRING . (71)
-
- . reduce 71
-
-
-state 95
- cmd : RNTO SP pathname . CRLF (23)
-
- CRLF shift 135
- . error
-
-
-state 96
- pathname : pathstring . (70)
-
- . reduce 70
-
-
-state 97
- cmd : DELE check_login SP . pathname CRLF (22)
-
- STRING shift 94
- . error
-
- pathname goto 136
- pathstring goto 96
-
-
-state 98
- cmd : CWD check_login SP . pathname CRLF (26)
-
- STRING shift 94
- . error
-
- pathname goto 137
- pathstring goto 96
-
-
-state 99
- cmd : CWD check_login CRLF . (25)
-
- . reduce 25
-
-
-state 100
- cmd : LIST check_login SP . pathname CRLF (19)
-
- STRING shift 94
- . error
-
- pathname goto 138
- pathstring goto 96
-
-
-state 101
- cmd : LIST check_login CRLF . (18)
-
- . reduce 18
-
-
-state 102
- cmd : NLST check_login SP . STRING CRLF (17)
-
- STRING shift 139
- . error
-
-
-state 103
- cmd : NLST check_login CRLF . (16)
-
- . reduce 16
-
-
-state 104
- cmd : SITE SP HELP . CRLF (34)
- cmd : SITE SP HELP . SP STRING CRLF (35)
-
- SP shift 140
- CRLF shift 141
- . error
-
-
-state 105
- cmd : SITE SP UMASK . check_login CRLF (36)
- cmd : SITE SP UMASK . check_login SP octal_number CRLF (37)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 142
-
-
-state 106
- cmd : SITE SP IDLE . CRLF (39)
- cmd : SITE SP IDLE . SP NUMBER CRLF (40)
-
- SP shift 143
- CRLF shift 144
- . error
-
-
-state 107
- cmd : SITE SP CHMOD . check_login SP octal_number SP pathname CRLF (38)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 145
-
-
-state 108
- cmd : STAT check_login SP . pathname CRLF (20)
-
- STRING shift 94
- . error
-
- pathname goto 146
- pathstring goto 96
-
-
-state 109
- cmd : HELP SP STRING . CRLF (28)
-
- CRLF shift 147
- . error
-
-
-state 110
- cmd : MKD check_login SP . pathname CRLF (30)
-
- STRING shift 94
- . error
-
- pathname goto 148
- pathstring goto 96
-
-
-state 111
- cmd : RMD check_login SP . pathname CRLF (31)
-
- STRING shift 94
- . error
-
- pathname goto 149
- pathstring goto 96
-
-
-state 112
- cmd : PWD check_login CRLF . (32)
-
- . reduce 32
-
-
-state 113
- cmd : CDUP check_login CRLF . (33)
-
- . reduce 33
-
-
-state 114
- cmd : STOU check_login SP . pathname CRLF (41)
-
- STRING shift 94
- . error
-
- pathname goto 150
- pathstring goto 96
-
-
-state 115
- cmd : SIZE check_login SP . pathname CRLF (43)
-
- STRING shift 94
- . error
-
- pathname goto 151
- pathstring goto 96
-
-
-state 116
- cmd : MDTM check_login SP . pathname CRLF (44)
-
- STRING shift 94
- . error
-
- pathname goto 152
- pathstring goto 96
-
-
-state 117
- cmd : USER SP username CRLF . (4)
-
- . reduce 4
-
-
-state 118
- cmd : PASS SP password CRLF . (5)
-
- . reduce 5
-
-
-state 119
- host_port : NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- NUMBER shift 153
- . error
-
-
-state 120
- cmd : PORT SP host_port CRLF . (6)
-
- . reduce 6
-
-
-state 121
- type_code : A SP . form_code (57)
-
- C shift 154
- N shift 155
- T shift 156
- . error
-
- form_code goto 157
-
-
-state 122
- type_code : E SP . form_code (59)
-
- C shift 154
- N shift 155
- T shift 156
- . error
-
- form_code goto 158
-
-
-state 123
- type_code : L SP . byte_size (62)
-
- NUMBER shift 124
- . error
-
- byte_size goto 159
-
-
-state 124
- byte_size : NUMBER . (51)
-
- . reduce 51
-
-
-state 125
- type_code : L byte_size . (63)
-
- . reduce 63
-
-
-state 126
- cmd : TYPE SP type_code CRLF . (8)
-
- . reduce 8
-
-
-state 127
- cmd : STRU SP struct_code CRLF . (9)
-
- . reduce 9
-
-
-state 128
- cmd : MODE SP mode_code CRLF . (10)
-
- . reduce 10
-
-
-state 129
- cmd : RETR check_login SP pathname . CRLF (13)
-
- CRLF shift 160
- . error
-
-
-state 130
- cmd : STOR check_login SP pathname . CRLF (14)
-
- CRLF shift 161
- . error
-
-
-state 131
- cmd : APPE check_login SP pathname . CRLF (15)
-
- CRLF shift 162
- . error
-
-
-state 132
- cmd : ALLO SP NUMBER SP . R SP NUMBER CRLF (12)
-
- R shift 163
- . error
-
-
-state 133
- cmd : ALLO SP NUMBER CRLF . (11)
-
- . reduce 11
-
-
-state 134
- rcmd : RNFR check_login SP pathname . CRLF (47)
-
- CRLF shift 164
- . error
-
-
-state 135
- cmd : RNTO SP pathname CRLF . (23)
-
- . reduce 23
-
-
-state 136
- cmd : DELE check_login SP pathname . CRLF (22)
-
- CRLF shift 165
- . error
-
-
-state 137
- cmd : CWD check_login SP pathname . CRLF (26)
-
- CRLF shift 166
- . error
-
-
-state 138
- cmd : LIST check_login SP pathname . CRLF (19)
-
- CRLF shift 167
- . error
-
-
-state 139
- cmd : NLST check_login SP STRING . CRLF (17)
-
- CRLF shift 168
- . error
-
-
-state 140
- cmd : SITE SP HELP SP . STRING CRLF (35)
-
- STRING shift 169
- . error
-
-
-state 141
- cmd : SITE SP HELP CRLF . (34)
-
- . reduce 34
-
-
-state 142
- cmd : SITE SP UMASK check_login . CRLF (36)
- cmd : SITE SP UMASK check_login . SP octal_number CRLF (37)
-
- SP shift 170
- CRLF shift 171
- . error
-
-
-state 143
- cmd : SITE SP IDLE SP . NUMBER CRLF (40)
-
- NUMBER shift 172
- . error
-
-
-state 144
- cmd : SITE SP IDLE CRLF . (39)
-
- . reduce 39
-
-
-state 145
- cmd : SITE SP CHMOD check_login . SP octal_number SP pathname CRLF (38)
-
- SP shift 173
- . error
-
-
-state 146
- cmd : STAT check_login SP pathname . CRLF (20)
-
- CRLF shift 174
- . error
-
-
-state 147
- cmd : HELP SP STRING CRLF . (28)
-
- . reduce 28
-
-
-state 148
- cmd : MKD check_login SP pathname . CRLF (30)
-
- CRLF shift 175
- . error
-
-
-state 149
- cmd : RMD check_login SP pathname . CRLF (31)
-
- CRLF shift 176
- . error
-
-
-state 150
- cmd : STOU check_login SP pathname . CRLF (41)
-
- CRLF shift 177
- . error
-
-
-state 151
- cmd : SIZE check_login SP pathname . CRLF (43)
-
- CRLF shift 178
- . error
-
-
-state 152
- cmd : MDTM check_login SP pathname . CRLF (44)
-
- CRLF shift 179
- . error
-
-
-state 153
- host_port : NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- COMMA shift 180
- . error
-
-
-state 154
- form_code : C . (55)
-
- . reduce 55
-
-
-state 155
- form_code : N . (53)
-
- . reduce 53
-
-
-state 156
- form_code : T . (54)
-
- . reduce 54
-
-
-state 157
- type_code : A SP form_code . (57)
-
- . reduce 57
-
-
-state 158
- type_code : E SP form_code . (59)
-
- . reduce 59
-
-
-state 159
- type_code : L SP byte_size . (62)
-
- . reduce 62
-
-
-state 160
- cmd : RETR check_login SP pathname CRLF . (13)
-
- . reduce 13
-
-
-state 161
- cmd : STOR check_login SP pathname CRLF . (14)
-
- . reduce 14
-
-
-state 162
- cmd : APPE check_login SP pathname CRLF . (15)
-
- . reduce 15
-
-
-state 163
- cmd : ALLO SP NUMBER SP R . SP NUMBER CRLF (12)
-
- SP shift 181
- . error
-
-
-state 164
- rcmd : RNFR check_login SP pathname CRLF . (47)
-
- . reduce 47
-
-
-state 165
- cmd : DELE check_login SP pathname CRLF . (22)
-
- . reduce 22
-
-
-state 166
- cmd : CWD check_login SP pathname CRLF . (26)
-
- . reduce 26
-
-
-state 167
- cmd : LIST check_login SP pathname CRLF . (19)
-
- . reduce 19
-
-
-state 168
- cmd : NLST check_login SP STRING CRLF . (17)
-
- . reduce 17
-
-
-state 169
- cmd : SITE SP HELP SP STRING . CRLF (35)
-
- CRLF shift 182
- . error
-
-
-state 170
- cmd : SITE SP UMASK check_login SP . octal_number CRLF (37)
-
- NUMBER shift 183
- . error
-
- octal_number goto 184
-
-
-state 171
- cmd : SITE SP UMASK check_login CRLF . (36)
-
- . reduce 36
-
-
-state 172
- cmd : SITE SP IDLE SP NUMBER . CRLF (40)
-
- CRLF shift 185
- . error
-
-
-state 173
- cmd : SITE SP CHMOD check_login SP . octal_number SP pathname CRLF (38)
-
- NUMBER shift 183
- . error
-
- octal_number goto 186
-
-
-state 174
- cmd : STAT check_login SP pathname CRLF . (20)
-
- . reduce 20
-
-
-state 175
- cmd : MKD check_login SP pathname CRLF . (30)
-
- . reduce 30
-
-
-state 176
- cmd : RMD check_login SP pathname CRLF . (31)
-
- . reduce 31
-
-
-state 177
- cmd : STOU check_login SP pathname CRLF . (41)
-
- . reduce 41
-
-
-state 178
- cmd : SIZE check_login SP pathname CRLF . (43)
-
- . reduce 43
-
-
-state 179
- cmd : MDTM check_login SP pathname CRLF . (44)
-
- . reduce 44
-
-
-state 180
- host_port : NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- NUMBER shift 187
- . error
-
-
-state 181
- cmd : ALLO SP NUMBER SP R SP . NUMBER CRLF (12)
-
- NUMBER shift 188
- . error
-
-
-state 182
- cmd : SITE SP HELP SP STRING CRLF . (35)
-
- . reduce 35
-
-
-state 183
- octal_number : NUMBER . (72)
-
- . reduce 72
-
-
-state 184
- cmd : SITE SP UMASK check_login SP octal_number . CRLF (37)
-
- CRLF shift 189
- . error
-
-
-state 185
- cmd : SITE SP IDLE SP NUMBER CRLF . (40)
-
- . reduce 40
-
-
-state 186
- cmd : SITE SP CHMOD check_login SP octal_number . SP pathname CRLF (38)
-
- SP shift 190
- . error
-
-
-state 187
- host_port : NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- COMMA shift 191
- . error
-
-
-state 188
- cmd : ALLO SP NUMBER SP R SP NUMBER . CRLF (12)
-
- CRLF shift 192
- . error
-
-
-state 189
- cmd : SITE SP UMASK check_login SP octal_number CRLF . (37)
-
- . reduce 37
-
-
-state 190
- cmd : SITE SP CHMOD check_login SP octal_number SP . pathname CRLF (38)
-
- STRING shift 94
- . error
-
- pathname goto 193
- pathstring goto 96
-
-
-state 191
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- NUMBER shift 194
- . error
-
-
-state 192
- cmd : ALLO SP NUMBER SP R SP NUMBER CRLF . (12)
-
- . reduce 12
-
-
-state 193
- cmd : SITE SP CHMOD check_login SP octal_number SP pathname . CRLF (38)
-
- CRLF shift 195
- . error
-
-
-state 194
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER (52)
-
- COMMA shift 196
- . error
-
-
-state 195
- cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF . (38)
-
- . reduce 38
-
-
-state 196
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER (52)
-
- NUMBER shift 197
- . error
-
-
-state 197
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER (52)
-
- COMMA shift 198
- . error
-
-
-state 198
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER (52)
-
- NUMBER shift 199
- . error
-
-
-state 199
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER . (52)
-
- . reduce 52
-
-
-65 terminals, 16 nonterminals
-74 grammar rules, 200 states
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/test/ftp.tab.c
--- a/head/usr.bin/yacc/test/ftp.tab.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1785 +0,0 @@
-#ifndef lint
-static char const yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
-#endif
-#include <stdlib.h>
-#define YYBYACC 1
-#define YYMAJOR 1
-#define YYMINOR 9
-#define YYLEX yylex()
-#define YYEMPTY -1
-#define yyclearin (yychar=(YYEMPTY))
-#define yyerrok (yyerrflag=0)
-#define YYRECOVERING (yyerrflag!=0)
-#if defined(c_plusplus) || defined(__cplusplus)
-#include <stdlib.h>
-#else
-extern char *getenv();
-extern void *realloc();
-#endif
-static int yygrowstack();
-#define YYPREFIX "yy"
-#line 26 "ftp.y"
-
-#ifndef lint
-static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <arpa/ftp.h>
-
-#include <stdio.h>
-#include <signal.h>
-#include <ctype.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <syslog.h>
-#include <sys/stat.h>
-#include <time.h>
-
-extern struct sockaddr_in data_dest;
-extern int logged_in;
-extern struct passwd *pw;
-extern int guest;
-extern int logging;
-extern int type;
-extern int form;
-extern int debug;
-extern int timeout;
-extern int maxtimeout;
-extern int pdata;
-extern char hostname[], remotehost[];
-extern char proctitle[];
-extern char *globerr;
-extern int usedefault;
-extern int transflag;
-extern char tmpline[];
-char **glob();
-
-static int cmd_type;
-static int cmd_form;
-static int cmd_bytesz;
-char cbuf[512];
-char *fromname;
-
-char *index();
-#line 70 "ftp.tab.c"
-#define A 257
-#define B 258
-#define C 259
-#define E 260
-#define F 261
-#define I 262
-#define L 263
-#define N 264
-#define P 265
-#define R 266
-#define S 267
-#define T 268
-#define SP 269
-#define CRLF 270
-#define COMMA 271
-#define STRING 272
-#define NUMBER 273
-#define USER 274
-#define PASS 275
-#define ACCT 276
-#define REIN 277
-#define QUIT 278
-#define PORT 279
-#define PASV 280
-#define TYPE 281
-#define STRU 282
-#define MODE 283
-#define RETR 284
-#define STOR 285
-#define APPE 286
-#define MLFL 287
-#define MAIL 288
-#define MSND 289
-#define MSOM 290
-#define MSAM 291
-#define MRSQ 292
-#define MRCP 293
-#define ALLO 294
-#define REST 295
-#define RNFR 296
-#define RNTO 297
-#define ABOR 298
-#define DELE 299
-#define CWD 300
-#define LIST 301
-#define NLST 302
-#define SITE 303
-#define STAT 304
-#define HELP 305
-#define NOOP 306
-#define MKD 307
-#define RMD 308
-#define PWD 309
-#define CDUP 310
-#define STOU 311
-#define SMNT 312
-#define SYST 313
-#define SIZE 314
-#define MDTM 315
-#define UMASK 316
-#define IDLE 317
-#define CHMOD 318
-#define LEXERR 319
-#define YYERRCODE 256
-const short yylhs[] = { -1,
- 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 2, 3, 4, 4,
- 12, 5, 13, 13, 13, 6, 6, 6, 6, 6,
- 6, 6, 6, 7, 7, 7, 8, 8, 8, 10,
- 14, 11, 9,
-};
-const short yylen[] = { 2,
- 0, 2, 2, 4, 4, 4, 2, 4, 4, 4,
- 4, 8, 5, 5, 5, 3, 5, 3, 5, 5,
- 2, 5, 4, 2, 3, 5, 2, 4, 2, 5,
- 5, 3, 3, 4, 6, 5, 7, 9, 4, 6,
- 5, 2, 5, 5, 2, 2, 5, 1, 0, 1,
- 1, 11, 1, 1, 1, 1, 3, 1, 3, 1,
- 1, 3, 2, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 0,
-};
-const short yydefred[] = { 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 73, 73, 73, 0, 73, 0, 0, 73, 73, 73,
- 73, 0, 0, 0, 0, 73, 73, 73, 73, 73,
- 0, 73, 73, 2, 3, 46, 0, 0, 45, 0,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24, 0, 0, 0, 0, 0, 21, 0, 0, 27,
- 29, 0, 0, 0, 0, 0, 42, 0, 0, 48,
- 0, 50, 0, 0, 0, 0, 0, 60, 0, 0,
- 64, 66, 65, 0, 68, 69, 67, 0, 0, 0,
- 0, 0, 0, 71, 0, 70, 0, 0, 25, 0,
- 18, 0, 16, 0, 73, 0, 73, 0, 0, 0,
- 0, 32, 33, 0, 0, 0, 4, 5, 0, 6,
- 0, 0, 0, 51, 63, 8, 9, 10, 0, 0,
- 0, 0, 11, 0, 23, 0, 0, 0, 0, 0,
- 34, 0, 0, 39, 0, 0, 28, 0, 0, 0,
- 0, 0, 0, 55, 53, 54, 57, 59, 62, 13,
- 14, 15, 0, 47, 22, 26, 19, 17, 0, 0,
- 36, 0, 0, 20, 30, 31, 41, 43, 44, 0,
- 0, 35, 72, 0, 40, 0, 0, 0, 37, 0,
- 0, 12, 0, 0, 38, 0, 0, 0, 52,
-};
-const short yydgoto[] = { 1,
- 34, 35, 71, 73, 75, 80, 84, 88, 45, 95,
- 184, 125, 157, 96,
-};
-const short yysindex[] = { 0,
- -224, -247, -239, -236, -232, -222, -204, -200, -181, -177,
- 0, 0, 0, -166, 0, -161, -199, 0, 0, 0,
- 0, -160, -159, -264, -158, 0, 0, 0, 0, 0,
- -157, 0, 0, 0, 0, 0, -167, -162, 0, -156,
- 0, -250, -198, -165, -155, -154, -153, -151, -150, -152,
- 0, -145, -252, -229, -217, -302, 0, -144, -146, 0,
- 0, -142, -141, -140, -139, -137, 0, -136, -135, 0,
- -134, 0, -133, -132, -130, -131, -128, 0, -249, -127,
- 0, 0, 0, -126, 0, 0, 0, -125, -152, -152,
- -152, -205, -152, 0, -124, 0, -152, -152, 0, -152,
- 0, -143, 0, -173, 0, -171, 0, -152, -123, -152,
- -152, 0, 0, -152, -152, -152, 0, 0, -138, 0,
- -164, -164, -122, 0, 0, 0, 0, 0, -121, -120,
- -118, -148, 0, -117, 0, -116, -115, -114, -113, -112,
- 0, -163, -111, 0, -110, -109, 0, -107, -106, -105,
- -104, -103, -129, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, -101, 0, 0, 0, 0, 0, -100, -102,
- 0, -98, -102, 0, 0, 0, 0, 0, 0, -99,
- -97, 0, 0, -95, 0, -96, -94, -92, 0, -152,
- -93, 0, -91, -90, 0, -88, -87, -86, 0,
-};
-const short yyrindex[] = { 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, -83, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, -82, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, -81, -80, 0, -158, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-const short yygindex[] = { 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16, -89,
- -25, 35, 47, 0,
-};
-#define YYTABLESIZE 190
-const short yytable[] = { 129,
- 130, 131, 104, 134, 59, 60, 76, 136, 137, 77,
- 138, 78, 79, 105, 106, 107, 98, 99, 146, 123,
- 148, 149, 36, 124, 150, 151, 152, 46, 47, 37,
- 49, 2, 38, 52, 53, 54, 55, 39, 58, 100,
- 101, 62, 63, 64, 65, 66, 40, 68, 69, 3,
- 4, 102, 103, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 81, 132, 133, 41, 82, 83, 42, 14,
- 51, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 43, 31, 32,
- 33, 44, 85, 86, 154, 140, 141, 143, 144, 155,
- 193, 87, 48, 156, 70, 170, 171, 50, 56, 72,
- 57, 61, 67, 89, 90, 91, 74, 163, 93, 94,
- 142, 92, 145, 97, 108, 109, 110, 111, 139, 112,
- 113, 114, 115, 116, 153, 117, 118, 121, 119, 120,
- 122, 180, 126, 127, 128, 135, 147, 186, 160, 161,
- 124, 162, 164, 165, 166, 167, 168, 159, 173, 169,
- 174, 172, 175, 176, 177, 178, 179, 181, 158, 182,
- 183, 185, 190, 187, 189, 188, 191, 192, 195, 194,
- 196, 0, 0, 198, 197, 73, 199, 49, 56, 58,
-};
-const short yycheck[] = { 89,
- 90, 91, 305, 93, 269, 270, 257, 97, 98, 260,
- 100, 262, 263, 316, 317, 318, 269, 270, 108, 269,
- 110, 111, 270, 273, 114, 115, 116, 12, 13, 269,
- 15, 256, 269, 18, 19, 20, 21, 270, 23, 269,
- 270, 26, 27, 28, 29, 30, 269, 32, 33, 274,
- 275, 269, 270, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, 261, 269, 270, 270, 265, 266, 269, 294,
- 270, 296, 297, 298, 299, 300, 301, 302, 303, 304,
- 305, 306, 307, 308, 309, 310, 311, 269, 313, 314,
- 315, 269, 258, 259, 259, 269, 270, 269, 270, 264,
- 190, 267, 269, 268, 272, 269, 270, 269, 269, 272,
- 270, 270, 270, 269, 269, 269, 273, 266, 269, 272,
- 105, 273, 107, 269, 269, 272, 269, 269, 272, 270,
- 270, 269, 269, 269, 273, 270, 270, 269, 271, 270,
- 269, 271, 270, 270, 270, 270, 270, 173, 270, 270,
- 273, 270, 270, 270, 270, 270, 270, 123, 269, 272,
- 270, 273, 270, 270, 270, 270, 270, 269, 122, 270,
- 273, 270, 269, 273, 270, 273, 271, 270, 270, 273,
- 271, -1, -1, 271, 273, 269, 273, 270, 270, 270,
-};
-#define YYFINAL 1
-#ifndef YYDEBUG
-#define YYDEBUG 0
-#elif YYDEBUG
-#include <stdio.h>
-#endif
-#define YYMAXTOKEN 319
-#if YYDEBUG
-const char * const yyname[] = {
-"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A","B","C","E","F","I","L","N",
-"P","R","S","T","SP","CRLF","COMMA","STRING","NUMBER","USER","PASS","ACCT",
-"REIN","QUIT","PORT","PASV","TYPE","STRU","MODE","RETR","STOR","APPE","MLFL",
-"MAIL","MSND","MSOM","MSAM","MRSQ","MRCP","ALLO","REST","RNFR","RNTO","ABOR",
-"DELE","CWD","LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP",
-"STOU","SMNT","SYST","SIZE","MDTM","UMASK","IDLE","CHMOD","LEXERR",
-};
-const char * const yyrule[] = {
-"$accept : cmd_list",
-"cmd_list :",
-"cmd_list : cmd_list cmd",
-"cmd_list : cmd_list rcmd",
-"cmd : USER SP username CRLF",
-"cmd : PASS SP password CRLF",
-"cmd : PORT SP host_port CRLF",
-"cmd : PASV CRLF",
-"cmd : TYPE SP type_code CRLF",
-"cmd : STRU SP struct_code CRLF",
-"cmd : MODE SP mode_code CRLF",
-"cmd : ALLO SP NUMBER CRLF",
-"cmd : ALLO SP NUMBER SP R SP NUMBER CRLF",
-"cmd : RETR check_login SP pathname CRLF",
-"cmd : STOR check_login SP pathname CRLF",
-"cmd : APPE check_login SP pathname CRLF",
-"cmd : NLST check_login CRLF",
-"cmd : NLST check_login SP STRING CRLF",
-"cmd : LIST check_login CRLF",
-"cmd : LIST check_login SP pathname CRLF",
-"cmd : STAT check_login SP pathname CRLF",
-"cmd : STAT CRLF",
-"cmd : DELE check_login SP pathname CRLF",
-"cmd : RNTO SP pathname CRLF",
-"cmd : ABOR CRLF",
-"cmd : CWD check_login CRLF",
-"cmd : CWD check_login SP pathname CRLF",
-"cmd : HELP CRLF",
-"cmd : HELP SP STRING CRLF",
-"cmd : NOOP CRLF",
-"cmd : MKD check_login SP pathname CRLF",
-"cmd : RMD check_login SP pathname CRLF",
-"cmd : PWD check_login CRLF",
-"cmd : CDUP check_login CRLF",
-"cmd : SITE SP HELP CRLF",
-"cmd : SITE SP HELP SP STRING CRLF",
-"cmd : SITE SP UMASK check_login CRLF",
-"cmd : SITE SP UMASK check_login SP octal_number CRLF",
-"cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF",
-"cmd : SITE SP IDLE CRLF",
-"cmd : SITE SP IDLE SP NUMBER CRLF",
-"cmd : STOU check_login SP pathname CRLF",
-"cmd : SYST CRLF",
-"cmd : SIZE check_login SP pathname CRLF",
-"cmd : MDTM check_login SP pathname CRLF",
-"cmd : QUIT CRLF",
-"cmd : error CRLF",
-"rcmd : RNFR check_login SP pathname CRLF",
-"username : STRING",
-"password :",
-"password : STRING",
-"byte_size : NUMBER",
-"host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER",
-"form_code : N",
-"form_code : T",
-"form_code : C",
-"type_code : A",
-"type_code : A SP form_code",
-"type_code : E",
-"type_code : E SP form_code",
-"type_code : I",
-"type_code : L",
-"type_code : L SP byte_size",
-"type_code : L byte_size",
-"struct_code : F",
-"struct_code : R",
-"struct_code : P",
-"mode_code : S",
-"mode_code : B",
-"mode_code : C",
-"pathname : pathstring",
-"pathstring : STRING",
-"octal_number : NUMBER",
-"check_login :",
-};
-#endif
-#ifndef YYSTYPE
-typedef int YYSTYPE;
-#endif
-#ifdef YYSTACKSIZE
-#undef YYMAXDEPTH
-#define YYMAXDEPTH YYSTACKSIZE
-#else
-#ifdef YYMAXDEPTH
-#define YYSTACKSIZE YYMAXDEPTH
-#else
-#define YYSTACKSIZE 10000
-#define YYMAXDEPTH 10000
-#endif
-#endif
-#define YYINITSTACKSIZE 200
-int yydebug;
-int yynerrs;
-int yyerrflag;
-int yychar;
-short *yyssp;
-YYSTYPE *yyvsp;
-YYSTYPE yyval;
-YYSTYPE yylval;
-short *yyss;
-short *yysslim;
-YYSTYPE *yyvs;
-int yystacksize;
-#line 658 "ftp.y"
-
-extern jmp_buf errcatch;
-
-#define CMD 0 /* beginning of command */
-#define ARGS 1 /* expect miscellaneous arguments */
-#define STR1 2 /* expect SP followed by STRING */
-#define STR2 3 /* expect STRING */
-#define OSTR 4 /* optional SP then STRING */
-#define ZSTR1 5 /* SP then optional STRING */
-#define ZSTR2 6 /* optional STRING after SP */
-#define SITECMD 7 /* SITE command */
-#define NSTR 8 /* Number followed by a string */
-
-struct tab {
- char *name;
- short token;
- short state;
- short implemented; /* 1 if command is implemented */
- char *help;
-};
-
-struct tab cmdtab[] = { /* In order defined in RFC 765 */
- { "USER", USER, STR1, 1, "<sp> username" },
- { "PASS", PASS, ZSTR1, 1, "<sp> password" },
- { "ACCT", ACCT, STR1, 0, "(specify account)" },
- { "SMNT", SMNT, ARGS, 0, "(structure mount)" },
- { "REIN", REIN, ARGS, 0, "(reinitialize server state)" },
- { "QUIT", QUIT, ARGS, 1, "(terminate service)", },
- { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" },
- { "PASV", PASV, ARGS, 1, "(set server in passive mode)" },
- { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" },
- { "STRU", STRU, ARGS, 1, "(specify file structure)" },
- { "MODE", MODE, ARGS, 1, "(specify transfer mode)" },
- { "RETR", RETR, STR1, 1, "<sp> file-name" },
- { "STOR", STOR, STR1, 1, "<sp> file-name" },
- { "APPE", APPE, STR1, 1, "<sp> file-name" },
- { "MLFL", MLFL, OSTR, 0, "(mail file)" },
- { "MAIL", MAIL, OSTR, 0, "(mail to user)" },
- { "MSND", MSND, OSTR, 0, "(mail send to terminal)" },
- { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" },
- { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" },
- { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" },
- { "MRCP", MRCP, STR1, 0, "(mail recipient)" },
- { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" },
- { "REST", REST, ARGS, 0, "(restart command)" },
- { "RNFR", RNFR, STR1, 1, "<sp> file-name" },
- { "RNTO", RNTO, STR1, 1, "<sp> file-name" },
- { "ABOR", ABOR, ARGS, 1, "(abort operation)" },
- { "DELE", DELE, STR1, 1, "<sp> file-name" },
- { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
- { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
- { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" },
- { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" },
- { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" },
- { "SYST", SYST, ARGS, 1, "(get type of operating system)" },
- { "STAT", STAT, OSTR, 1, "[ <sp> path-name ]" },
- { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
- { "NOOP", NOOP, ARGS, 1, "" },
- { "MKD", MKD, STR1, 1, "<sp> path-name" },
- { "XMKD", MKD, STR1, 1, "<sp> path-name" },
- { "RMD", RMD, STR1, 1, "<sp> path-name" },
- { "XRMD", RMD, STR1, 1, "<sp> path-name" },
- { "PWD", PWD, ARGS, 1, "(return current directory)" },
- { "XPWD", PWD, ARGS, 1, "(return current directory)" },
- { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" },
- { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" },
- { "STOU", STOU, STR1, 1, "<sp> file-name" },
- { "SIZE", SIZE, OSTR, 1, "<sp> path-name" },
- { "MDTM", MDTM, OSTR, 1, "<sp> path-name" },
- { NULL, 0, 0, 0, 0 }
-};
-
-struct tab sitetab[] = {
- { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" },
- { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" },
- { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" },
- { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
- { NULL, 0, 0, 0, 0 }
-};
-
-struct tab *
-lookup(p, cmd)
- register struct tab *p;
- char *cmd;
-{
-
- for (; p->name != NULL; p++)
- if (strcmp(cmd, p->name) == 0)
- return (p);
- return (0);
-}
-
-#include <arpa/telnet.h>
-
-/*
- * getline - a hacked up version of fgets to ignore TELNET escape codes.
- */
-char *
-getline(s, n, iop)
- char *s;
- register FILE *iop;
-{
- register c;
- register char *cs;
-
- cs = s;
-/* tmpline may contain saved command from urgent mode interruption */
- for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
- *cs++ = tmpline[c];
- if (tmpline[c] == '\n') {
- *cs++ = '\0';
- if (debug)
- syslog(LOG_DEBUG, "command: %s", s);
- tmpline[0] = '\0';
- return(s);
- }
- if (c == 0)
- tmpline[0] = '\0';
- }
- while ((c = getc(iop)) != EOF) {
- c &= 0377;
- if (c == IAC) {
- if ((c = getc(iop)) != EOF) {
- c &= 0377;
- switch (c) {
- case WILL:
- case WONT:
- c = getc(iop);
- printf("%c%c%c", IAC, DONT, 0377&c);
- (void) fflush(stdout);
- continue;
- case DO:
- case DONT:
- c = getc(iop);
- printf("%c%c%c", IAC, WONT, 0377&c);
- (void) fflush(stdout);
- continue;
- case IAC:
- break;
- default:
- continue; /* ignore command */
- }
- }
- }
- *cs++ = c;
- if (--n <= 0 || c == '\n')
- break;
- }
- if (c == EOF && cs == s)
- return (NULL);
- *cs++ = '\0';
- if (debug)
- syslog(LOG_DEBUG, "command: %s", s);
- return (s);
-}
-
-static int
-toolong()
-{
- time_t now;
- extern char *ctime();
- extern time_t time();
-
- reply(421,
- "Timeout (%d seconds): closing control connection.", timeout);
- (void) time(&now);
- if (logging) {
- syslog(LOG_INFO,
- "User %s timed out after %d seconds at %s",
- (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
- }
- dologout(1);
-}
-
-yylex()
-{
- static int cpos, state;
- register char *cp, *cp2;
- register struct tab *p;
- int n;
- char c, *strpbrk();
- char *copy();
-
- for (;;) {
- switch (state) {
-
- case CMD:
- (void) signal(SIGALRM, toolong);
- (void) alarm((unsigned) timeout);
- if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
- reply(221, "You could at least say goodbye.");
- dologout(0);
- }
- (void) alarm(0);
-#ifdef SETPROCTITLE
- if (strncasecmp(cbuf, "PASS", 4) != NULL)
- setproctitle("%s: %s", proctitle, cbuf);
-#endif /* SETPROCTITLE */
- if ((cp = index(cbuf, '\r'))) {
- *cp++ = '\n';
- *cp = '\0';
- }
- if ((cp = strpbrk(cbuf, " \n")))
- cpos = cp - cbuf;
- if (cpos == 0)
- cpos = 4;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- upper(cbuf);
- p = lookup(cmdtab, cbuf);
- cbuf[cpos] = c;
- if (p != 0) {
- if (p->implemented == 0) {
- nack(p->name);
- longjmp(errcatch,0);
- /* NOTREACHED */
- }
- state = p->state;
- *(char **)&yylval = p->name;
- return (p->token);
- }
- break;
-
- case SITECMD:
- if (cbuf[cpos] == ' ') {
- cpos++;
- return (SP);
- }
- cp = &cbuf[cpos];
- if ((cp2 = strpbrk(cp, " \n")))
- cpos = cp2 - cbuf;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- upper(cp);
- p = lookup(sitetab, cp);
- cbuf[cpos] = c;
- if (p != 0) {
- if (p->implemented == 0) {
- state = CMD;
- nack(p->name);
- longjmp(errcatch,0);
- /* NOTREACHED */
- }
- state = p->state;
- *(char **)&yylval = p->name;
- return (p->token);
- }
- state = CMD;
- break;
-
- case OSTR:
- if (cbuf[cpos] == '\n') {
- state = CMD;
- return (CRLF);
- }
- /* FALLTHROUGH */
-
- case STR1:
- case ZSTR1:
- dostr1:
- if (cbuf[cpos] == ' ') {
- cpos++;
- state = state == OSTR ? STR2 : ++state;
- return (SP);
- }
- break;
-
- case ZSTR2:
- if (cbuf[cpos] == '\n') {
- state = CMD;
- return (CRLF);
- }
- /* FALLTHROUGH */
-
- case STR2:
- cp = &cbuf[cpos];
- n = strlen(cp);
- cpos += n - 1;
- /*
- * Make sure the string is nonempty and \n terminated.
- */
- if (n > 1 && cbuf[cpos] == '\n') {
- cbuf[cpos] = '\0';
- *(char **)&yylval = copy(cp);
- cbuf[cpos] = '\n';
- state = ARGS;
- return (STRING);
- }
- break;
-
- case NSTR:
- if (cbuf[cpos] == ' ') {
- cpos++;
- return (SP);
- }
- if (isdigit(cbuf[cpos])) {
- cp = &cbuf[cpos];
- while (isdigit(cbuf[++cpos]))
- ;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- yylval = atoi(cp);
- cbuf[cpos] = c;
- state = STR1;
- return (NUMBER);
- }
- state = STR1;
- goto dostr1;
-
- case ARGS:
- if (isdigit(cbuf[cpos])) {
- cp = &cbuf[cpos];
- while (isdigit(cbuf[++cpos]))
- ;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- yylval = atoi(cp);
- cbuf[cpos] = c;
- return (NUMBER);
- }
- switch (cbuf[cpos++]) {
-
- case '\n':
- state = CMD;
- return (CRLF);
-
- case ' ':
- return (SP);
-
- case ',':
- return (COMMA);
-
- case 'A':
- case 'a':
- return (A);
-
- case 'B':
- case 'b':
- return (B);
-
- case 'C':
- case 'c':
- return (C);
-
- case 'E':
- case 'e':
- return (E);
-
- case 'F':
- case 'f':
- return (F);
-
- case 'I':
- case 'i':
- return (I);
-
- case 'L':
- case 'l':
- return (L);
-
- case 'N':
- case 'n':
- return (N);
-
- case 'P':
- case 'p':
- return (P);
-
- case 'R':
- case 'r':
- return (R);
-
- case 'S':
- case 's':
- return (S);
-
- case 'T':
- case 't':
- return (T);
-
- }
- break;
-
- default:
- fatal("Unknown state in scanner.");
- }
- yyerror((char *) 0);
- state = CMD;
- longjmp(errcatch,0);
- }
-}
-
-upper(s)
- register char *s;
-{
- while (*s != '\0') {
- if (islower(*s))
- *s = toupper(*s);
- s++;
- }
-}
-
-char *
-copy(s)
- char *s;
-{
- char *p;
- extern char *malloc(), *strcpy();
-
- p = malloc((unsigned) strlen(s) + 1);
- if (p == NULL)
- fatal("Ran out of memory.");
- (void) strcpy(p, s);
- return (p);
-}
-
-help(ctab, s)
- struct tab *ctab;
- char *s;
-{
- register struct tab *c;
- register int width, NCMDS;
- char *type;
-
- if (ctab == sitetab)
- type = "SITE ";
- else
- type = "";
- width = 0, NCMDS = 0;
- for (c = ctab; c->name != NULL; c++) {
- int len = strlen(c->name);
-
- if (len > width)
- width = len;
- NCMDS++;
- }
- width = (width + 8) &~ 7;
- if (s == 0) {
- register int i, j, w;
- int columns, lines;
-
- lreply(214, "The following %scommands are recognized %s.",
- type, "(* =>'s unimplemented)");
- columns = 76 / width;
- if (columns == 0)
- columns = 1;
- lines = (NCMDS + columns - 1) / columns;
- for (i = 0; i < lines; i++) {
- printf(" ");
- for (j = 0; j < columns; j++) {
- c = ctab + j * lines + i;
- printf("%s%c", c->name,
- c->implemented ? ' ' : '*');
- if (c + lines >= &ctab[NCMDS])
- break;
- w = strlen(c->name) + 1;
- while (w < width) {
- putchar(' ');
- w++;
- }
- }
- printf("\r\n");
- }
- (void) fflush(stdout);
- reply(214, "Direct comments to ftp-bugs@%s.", hostname);
- return;
- }
- upper(s);
- c = lookup(ctab, s);
- if (c == (struct tab *)0) {
- reply(502, "Unknown command %s.", s);
- return;
- }
- if (c->implemented)
- reply(214, "Syntax: %s%s %s", type, c->name, c->help);
- else
- reply(214, "%s%-*s\t%s; unimplemented.", type, width,
- c->name, c->help);
-}
-
-sizecmd(filename)
-char *filename;
-{
- switch (type) {
- case TYPE_L:
- case TYPE_I: {
- struct stat stbuf;
- if (stat(filename, &stbuf) < 0 ||
- (stbuf.st_mode&S_IFMT) != S_IFREG)
- reply(550, "%s: not a plain file.", filename);
- else
- reply(213, "%lu", stbuf.st_size);
- break;}
- case TYPE_A: {
- FILE *fin;
- register int c, count;
- struct stat stbuf;
- fin = fopen(filename, "r");
- if (fin == NULL) {
- perror_reply(550, filename);
- return;
- }
- if (fstat(fileno(fin), &stbuf) < 0 ||
- (stbuf.st_mode&S_IFMT) != S_IFREG) {
- reply(550, "%s: not a plain file.", filename);
- (void) fclose(fin);
- return;
- }
-
- count = 0;
- while((c=getc(fin)) != EOF) {
- if (c == '\n') /* will get expanded to \r\n */
- count++;
- count++;
- }
- (void) fclose(fin);
-
- reply(213, "%ld", count);
- break;}
- default:
- reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
- }
-}
-#line 920 "ftp.tab.c"
-/* allocate initial stack or double stack size, up to YYMAXDEPTH */
-static int yygrowstack()
-{
- int newsize, i;
- short *newss;
- YYSTYPE *newvs;
-
- if ((newsize = yystacksize) == 0)
- newsize = YYINITSTACKSIZE;
- else if (newsize >= YYMAXDEPTH)
- return -1;
- else if ((newsize *= 2) > YYMAXDEPTH)
- newsize = YYMAXDEPTH;
- i = yyssp - yyss;
- if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL)
- return -1;
- yyss = newss;
- yyssp = newss + i;
- if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL)
- return -1;
- yyvs = newvs;
- yyvsp = newvs + i;
- yystacksize = newsize;
- yysslim = yyss + newsize - 1;
- return 0;
-}
-
-#define YYABORT goto yyabort
-#define YYREJECT goto yyabort
-#define YYACCEPT goto yyaccept
-#define YYERROR goto yyerrlab
-
-int
-yyparse()
-{
- register int yym, yyn, yystate;
-#if YYDEBUG
- register const char *yys;
-
- if ((yys = getenv("YYDEBUG")))
- {
- yyn = *yys;
- if (yyn >= '0' && yyn <= '9')
- yydebug = yyn - '0';
- }
-#endif
-
- yynerrs = 0;
- yyerrflag = 0;
- yychar = (-1);
-
- if (yyss == NULL && yygrowstack()) goto yyoverflow;
- yyssp = yyss;
- yyvsp = yyvs;
- *yyssp = yystate = 0;
-
-yyloop:
- if ((yyn = yydefred[yystate])) goto yyreduce;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- }
- if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, shifting to state %d\n",
- YYPREFIX, yystate, yytable[yyn]);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- yychar = (-1);
- if (yyerrflag > 0) --yyerrflag;
- goto yyloop;
- }
- if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
- yyn = yytable[yyn];
- goto yyreduce;
- }
- if (yyerrflag) goto yyinrecovery;
-#if defined(lint) || defined(__GNUC__)
- goto yynewerror;
-#endif
-yynewerror:
- yyerror("syntax error");
-#if defined(lint) || defined(__GNUC__)
- goto yyerrlab;
-#endif
-yyerrlab:
- ++yynerrs;
-yyinrecovery:
- if (yyerrflag < 3)
- {
- yyerrflag = 3;
- for (;;)
- {
- if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, error recovery shifting\
- to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- goto yyloop;
- }
- else
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: error recovery discarding state %d\n",
- YYPREFIX, *yyssp);
-#endif
- if (yyssp <= yyss) goto yyabort;
- --yyssp;
- --yyvsp;
- }
- }
- }
- else
- {
- if (yychar == 0) goto yyabort;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- yychar = (-1);
- goto yyloop;
- }
-yyreduce:
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, reducing by rule %d (%s)\n",
- YYPREFIX, yystate, yyn, yyrule[yyn]);
-#endif
- yym = yylen[yyn];
- yyval = yyvsp[1-yym];
- switch (yyn)
- {
-case 2:
-#line 99 "ftp.y"
- {
- fromname = (char *) 0;
- }
-break;
-case 4:
-#line 106 "ftp.y"
- {
- user((char *) yyvsp[-1]);
- free((char *) yyvsp[-1]);
- }
-break;
-case 5:
-#line 111 "ftp.y"
- {
- pass((char *) yyvsp[-1]);
- free((char *) yyvsp[-1]);
- }
-break;
-case 6:
-#line 116 "ftp.y"
- {
- usedefault = 0;
- if (pdata >= 0) {
- (void) close(pdata);
- pdata = -1;
- }
- reply(200, "PORT command successful.");
- }
-break;
-case 7:
-#line 125 "ftp.y"
- {
- passive();
- }
-break;
-case 8:
-#line 129 "ftp.y"
- {
- switch (cmd_type) {
-
- case TYPE_A:
- if (cmd_form == FORM_N) {
- reply(200, "Type set to A.");
- type = cmd_type;
- form = cmd_form;
- } else
- reply(504, "Form must be N.");
- break;
-
- case TYPE_E:
- reply(504, "Type E not implemented.");
- break;
-
- case TYPE_I:
- reply(200, "Type set to I.");
- type = cmd_type;
- break;
-
- case TYPE_L:
-#if NBBY == 8
- if (cmd_bytesz == 8) {
- reply(200,
- "Type set to L (byte size 8).");
- type = cmd_type;
- } else
- reply(504, "Byte size must be 8.");
-#else /* NBBY == 8 */
- UNIMPLEMENTED for NBBY != 8
-#endif /* NBBY == 8 */
- }
- }
-break;
-case 9:
-#line 164 "ftp.y"
- {
- switch (yyvsp[-1]) {
-
- case STRU_F:
- reply(200, "STRU F ok.");
- break;
-
- default:
- reply(504, "Unimplemented STRU type.");
- }
- }
-break;
-case 10:
-#line 176 "ftp.y"
- {
- switch (yyvsp[-1]) {
-
- case MODE_S:
- reply(200, "MODE S ok.");
- break;
-
- default:
- reply(502, "Unimplemented MODE type.");
- }
- }
-break;
-case 11:
-#line 188 "ftp.y"
- {
- reply(202, "ALLO command ignored.");
- }
-break;
-case 12:
-#line 192 "ftp.y"
- {
- reply(202, "ALLO command ignored.");
- }
-break;
-case 13:
-#line 196 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- retrieve((char *) 0, (char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 14:
-#line 203 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- store((char *) yyvsp[-1], "w", 0);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 15:
-#line 210 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- store((char *) yyvsp[-1], "a", 0);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 16:
-#line 217 "ftp.y"
- {
- if (yyvsp[-1])
- send_file_list(".");
- }
-break;
-case 17:
-#line 222 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- send_file_list((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 18:
-#line 229 "ftp.y"
- {
- if (yyvsp[-1])
- retrieve("/bin/ls -lgA", "");
- }
-break;
-case 19:
-#line 234 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- retrieve("/bin/ls -lgA %s", (char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 20:
-#line 241 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- statfilecmd((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 21:
-#line 248 "ftp.y"
- {
- statcmd();
- }
-break;
-case 22:
-#line 252 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- delete((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 23:
-#line 259 "ftp.y"
- {
- if (fromname) {
- renamecmd(fromname, (char *) yyvsp[-1]);
- free(fromname);
- fromname = (char *) 0;
- } else {
- reply(503, "Bad sequence of commands.");
- }
- free((char *) yyvsp[-1]);
- }
-break;
-case 24:
-#line 270 "ftp.y"
- {
- reply(225, "ABOR command successful.");
- }
-break;
-case 25:
-#line 274 "ftp.y"
- {
- if (yyvsp[-1])
- cwd(pw->pw_dir);
- }
-break;
-case 26:
-#line 279 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- cwd((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 27:
-#line 286 "ftp.y"
- {
- help(cmdtab, (char *) 0);
- }
-break;
-case 28:
-#line 290 "ftp.y"
- {
- register char *cp = (char *)yyvsp[-1];
-
- if (strncasecmp(cp, "SITE", 4) == 0) {
- cp = (char *)yyvsp[-1] + 4;
- if (*cp == ' ')
- cp++;
- if (*cp)
- help(sitetab, cp);
- else
- help(sitetab, (char *) 0);
- } else
- help(cmdtab, (char *) yyvsp[-1]);
- }
-break;
-case 29:
-#line 305 "ftp.y"
- {
- reply(200, "NOOP command successful.");
- }
-break;
-case 30:
-#line 309 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- makedir((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 31:
-#line 316 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- removedir((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 32:
-#line 323 "ftp.y"
- {
- if (yyvsp[-1])
- pwd();
- }
-break;
-case 33:
-#line 328 "ftp.y"
- {
- if (yyvsp[-1])
- cwd("..");
- }
-break;
-case 34:
-#line 333 "ftp.y"
- {
- help(sitetab, (char *) 0);
- }
-break;
-case 35:
-#line 337 "ftp.y"
- {
- help(sitetab, (char *) yyvsp[-1]);
- }
-break;
-case 36:
-#line 341 "ftp.y"
- {
- int oldmask;
-
- if (yyvsp[-1]) {
- oldmask = umask(0);
- (void) umask(oldmask);
- reply(200, "Current UMASK is %03o", oldmask);
- }
- }
-break;
-case 37:
-#line 351 "ftp.y"
- {
- int oldmask;
-
- if (yyvsp[-3]) {
- if ((yyvsp[-1] == -1) || (yyvsp[-1] > 0777)) {
- reply(501, "Bad UMASK value");
- } else {
- oldmask = umask(yyvsp[-1]);
- reply(200,
- "UMASK set to %03o (was %03o)",
- yyvsp[-1], oldmask);
- }
- }
- }
-break;
-case 38:
-#line 366 "ftp.y"
- {
- if (yyvsp[-5] && (yyvsp[-1] != NULL)) {
- if (yyvsp[-3] > 0777)
- reply(501,
- "CHMOD: Mode value must be between 0 and 0777");
- else if (chmod((char *) yyvsp[-1], yyvsp[-3]) < 0)
- perror_reply(550, (char *) yyvsp[-1]);
- else
- reply(200, "CHMOD command successful.");
- }
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 39:
-#line 380 "ftp.y"
- {
- reply(200,
- "Current IDLE time limit is %d seconds; max %d",
- timeout, maxtimeout);
- }
-break;
-case 40:
-#line 386 "ftp.y"
- {
- if (yyvsp[-1] < 30 || yyvsp[-1] > maxtimeout) {
- reply(501,
- "Maximum IDLE time must be between 30 and %d seconds",
- maxtimeout);
- } else {
- timeout = yyvsp[-1];
- (void) alarm((unsigned) timeout);
- reply(200,
- "Maximum IDLE time set to %d seconds",
- timeout);
- }
- }
-break;
-case 41:
-#line 400 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- store((char *) yyvsp[-1], "w", 1);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 42:
-#line 407 "ftp.y"
- {
-#ifdef unix
-#ifdef BSD
- reply(215, "UNIX Type: L%d Version: BSD-%d",
- NBBY, BSD);
-#else /* BSD */
- reply(215, "UNIX Type: L%d", NBBY);
-#endif /* BSD */
-#else /* unix */
- reply(215, "UNKNOWN Type: L%d", NBBY);
-#endif /* unix */
- }
-break;
-case 43:
-#line 428 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- sizecmd((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 44:
-#line 445 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL) {
- struct stat stbuf;
- if (stat((char *) yyvsp[-1], &stbuf) < 0)
- perror_reply(550, "%s", (char *) yyvsp[-1]);
- else if ((stbuf.st_mode&S_IFMT) != S_IFREG) {
- reply(550, "%s: not a plain file.",
- (char *) yyvsp[-1]);
- } else {
- register struct tm *t;
- struct tm *gmtime();
- t = gmtime(&stbuf.st_mtime);
- reply(213,
- "%d%02d%02d%02d%02d%02d",
- t->tm_year+1900, t->tm_mon+1, t->tm_mday,
- t->tm_hour, t->tm_min, t->tm_sec);
- }
- }
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 45:
-#line 467 "ftp.y"
- {
- reply(221, "Goodbye.");
- dologout(0);
- }
-break;
-case 46:
-#line 472 "ftp.y"
- {
- yyerrok;
- }
-break;
-case 47:
-#line 477 "ftp.y"
- {
- char *renamefrom();
-
- if (yyvsp[-3] && yyvsp[-1]) {
- fromname = renamefrom((char *) yyvsp[-1]);
- if (fromname == (char *) 0 && yyvsp[-1]) {
- free((char *) yyvsp[-1]);
- }
- }
- }
-break;
-case 49:
-#line 493 "ftp.y"
- {
- *(char **)&(yyval) = "";
- }
-break;
-case 52:
-#line 504 "ftp.y"
- {
- register char *a, *p;
-
- a = (char *)&data_dest.sin_addr;
- a[0] = yyvsp[-10]; a[1] = yyvsp[-8]; a[2] = yyvsp[-6]; a[3] = yyvsp[-4];
- p = (char *)&data_dest.sin_port;
- p[0] = yyvsp[-2]; p[1] = yyvsp[0];
- data_dest.sin_family = AF_INET;
- }
-break;
-case 53:
-#line 516 "ftp.y"
- {
- yyval = FORM_N;
- }
-break;
-case 54:
-#line 520 "ftp.y"
- {
- yyval = FORM_T;
- }
-break;
-case 55:
-#line 524 "ftp.y"
- {
- yyval = FORM_C;
- }
-break;
-case 56:
-#line 530 "ftp.y"
- {
- cmd_type = TYPE_A;
- cmd_form = FORM_N;
- }
-break;
-case 57:
-#line 535 "ftp.y"
- {
- cmd_type = TYPE_A;
- cmd_form = yyvsp[0];
- }
-break;
-case 58:
-#line 540 "ftp.y"
- {
- cmd_type = TYPE_E;
- cmd_form = FORM_N;
- }
-break;
-case 59:
-#line 545 "ftp.y"
- {
- cmd_type = TYPE_E;
- cmd_form = yyvsp[0];
- }
-break;
-case 60:
-#line 550 "ftp.y"
- {
- cmd_type = TYPE_I;
- }
-break;
-case 61:
-#line 554 "ftp.y"
- {
- cmd_type = TYPE_L;
- cmd_bytesz = NBBY;
- }
-break;
-case 62:
-#line 559 "ftp.y"
- {
- cmd_type = TYPE_L;
- cmd_bytesz = yyvsp[0];
- }
-break;
-case 63:
-#line 565 "ftp.y"
- {
- cmd_type = TYPE_L;
- cmd_bytesz = yyvsp[0];
- }
-break;
-case 64:
-#line 572 "ftp.y"
- {
- yyval = STRU_F;
- }
-break;
-case 65:
-#line 576 "ftp.y"
- {
- yyval = STRU_R;
- }
-break;
-case 66:
-#line 580 "ftp.y"
- {
- yyval = STRU_P;
- }
-break;
-case 67:
-#line 586 "ftp.y"
- {
- yyval = MODE_S;
- }
-break;
-case 68:
-#line 590 "ftp.y"
- {
- yyval = MODE_B;
- }
-break;
-case 69:
-#line 594 "ftp.y"
- {
- yyval = MODE_C;
- }
-break;
-case 70:
-#line 600 "ftp.y"
- {
- /*
- * Problem: this production is used for all pathname
- * processing, but only gives a 550 error reply.
- * This is a valid reply in some cases but not in others.
- */
- if (logged_in && yyvsp[0] && strncmp((char *) yyvsp[0], "~", 1) == 0) {
- *(char **)&(yyval) = *glob((char *) yyvsp[0]);
- if (globerr != NULL) {
- reply(550, globerr);
- yyval = NULL;
- }
- free((char *) yyvsp[0]);
- } else
- yyval = yyvsp[0];
- }
-break;
-case 72:
-#line 622 "ftp.y"
- {
- register int ret, dec, multby, digit;
-
- /*
- * Convert a number that was read as decimal number
- * to what it would be if it had been read as octal.
- */
- dec = yyvsp[0];
- multby = 1;
- ret = 0;
- while (dec) {
- digit = dec%10;
- if (digit > 7) {
- ret = -1;
- break;
- }
- ret += digit * multby;
- multby *= 8;
- dec /= 10;
- }
- yyval = ret;
- }
-break;
-case 73:
-#line 647 "ftp.y"
- {
- if (logged_in)
- yyval = 1;
- else {
- reply(530, "Please login with USER and PASS.");
- yyval = 0;
- }
- }
-break;
-#line 1728 "ftp.tab.c"
- }
- yyssp -= yym;
- yystate = *yyssp;
- yyvsp -= yym;
- yym = yylhs[yyn];
- if (yystate == 0 && yym == 0)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state 0 to\
- state %d\n", YYPREFIX, YYFINAL);
-#endif
- yystate = YYFINAL;
- *++yyssp = YYFINAL;
- *++yyvsp = yyval;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, YYFINAL, yychar, yys);
- }
-#endif
- }
- if (yychar == 0) goto yyaccept;
- goto yyloop;
- }
- if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
- yystate = yytable[yyn];
- else
- yystate = yydgoto[yym];
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state %d \
-to state %d\n", YYPREFIX, *yyssp, yystate);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate;
- *++yyvsp = yyval;
- goto yyloop;
-yyoverflow:
- yyerror("yacc stack overflow");
-yyabort:
- return (1);
-yyaccept:
- return (0);
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/test/ftp.tab.h
--- a/head/usr.bin/yacc/test/ftp.tab.h Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-#define A 257
-#define B 258
-#define C 259
-#define E 260
-#define F 261
-#define I 262
-#define L 263
-#define N 264
-#define P 265
-#define R 266
-#define S 267
-#define T 268
-#define SP 269
-#define CRLF 270
-#define COMMA 271
-#define STRING 272
-#define NUMBER 273
-#define USER 274
-#define PASS 275
-#define ACCT 276
-#define REIN 277
-#define QUIT 278
-#define PORT 279
-#define PASV 280
-#define TYPE 281
-#define STRU 282
-#define MODE 283
-#define RETR 284
-#define STOR 285
-#define APPE 286
-#define MLFL 287
-#define MAIL 288
-#define MSND 289
-#define MSOM 290
-#define MSAM 291
-#define MRSQ 292
-#define MRCP 293
-#define ALLO 294
-#define REST 295
-#define RNFR 296
-#define RNTO 297
-#define ABOR 298
-#define DELE 299
-#define CWD 300
-#define LIST 301
-#define NLST 302
-#define SITE 303
-#define STAT 304
-#define HELP 305
-#define NOOP 306
-#define MKD 307
-#define RMD 308
-#define PWD 309
-#define CDUP 310
-#define STOU 311
-#define SMNT 312
-#define SYST 313
-#define SIZE 314
-#define MDTM 315
-#define UMASK 316
-#define IDLE 317
-#define CHMOD 318
-#define LEXERR 319
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/test/ftp.y
--- a/head/usr.bin/yacc/test/ftp.y Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1180 +0,0 @@
-/*
- * Copyright (c) 1985, 1988 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * @(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89
- */
-
-/*
- * Grammar for FTP commands.
- * See RFC 959.
- */
-
-%{
-
-#ifndef lint
-static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <arpa/ftp.h>
-
-#include <stdio.h>
-#include <signal.h>
-#include <ctype.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <syslog.h>
-#include <sys/stat.h>
-#include <time.h>
-
-extern struct sockaddr_in data_dest;
-extern int logged_in;
-extern struct passwd *pw;
-extern int guest;
-extern int logging;
-extern int type;
-extern int form;
-extern int debug;
-extern int timeout;
-extern int maxtimeout;
-extern int pdata;
-extern char hostname[], remotehost[];
-extern char proctitle[];
-extern char *globerr;
-extern int usedefault;
-extern int transflag;
-extern char tmpline[];
-char **glob();
-
-static int cmd_type;
-static int cmd_form;
-static int cmd_bytesz;
-char cbuf[512];
-char *fromname;
-
-char *index();
-%}
-
-%token
- A B C E F I
- L N P R S T
-
- SP CRLF COMMA STRING NUMBER
-
- USER PASS ACCT REIN QUIT PORT
- PASV TYPE STRU MODE RETR STOR
- APPE MLFL MAIL MSND MSOM MSAM
- MRSQ MRCP ALLO REST RNFR RNTO
- ABOR DELE CWD LIST NLST SITE
- STAT HELP NOOP MKD RMD PWD
- CDUP STOU SMNT SYST SIZE MDTM
-
- UMASK IDLE CHMOD
-
- LEXERR
-
-%start cmd_list
-
-%%
-
-cmd_list: /* empty */
- | cmd_list cmd
- = {
- fromname = (char *) 0;
- }
- | cmd_list rcmd
- ;
-
-cmd: USER SP username CRLF
- = {
- user((char *) $3);
- free((char *) $3);
- }
- | PASS SP password CRLF
- = {
- pass((char *) $3);
- free((char *) $3);
- }
- | PORT SP host_port CRLF
- = {
- usedefault = 0;
- if (pdata >= 0) {
- (void) close(pdata);
- pdata = -1;
- }
- reply(200, "PORT command successful.");
- }
- | PASV CRLF
- = {
- passive();
- }
- | TYPE SP type_code CRLF
- = {
- switch (cmd_type) {
-
- case TYPE_A:
- if (cmd_form == FORM_N) {
- reply(200, "Type set to A.");
- type = cmd_type;
- form = cmd_form;
- } else
- reply(504, "Form must be N.");
- break;
-
- case TYPE_E:
- reply(504, "Type E not implemented.");
- break;
-
- case TYPE_I:
- reply(200, "Type set to I.");
- type = cmd_type;
- break;
-
- case TYPE_L:
-#if NBBY == 8
- if (cmd_bytesz == 8) {
- reply(200,
- "Type set to L (byte size 8).");
- type = cmd_type;
- } else
- reply(504, "Byte size must be 8.");
-#else /* NBBY == 8 */
- UNIMPLEMENTED for NBBY != 8
-#endif /* NBBY == 8 */
- }
- }
- | STRU SP struct_code CRLF
- = {
- switch ($3) {
-
- case STRU_F:
- reply(200, "STRU F ok.");
- break;
-
- default:
- reply(504, "Unimplemented STRU type.");
- }
- }
- | MODE SP mode_code CRLF
- = {
- switch ($3) {
-
- case MODE_S:
- reply(200, "MODE S ok.");
- break;
-
- default:
- reply(502, "Unimplemented MODE type.");
- }
- }
- | ALLO SP NUMBER CRLF
- = {
- reply(202, "ALLO command ignored.");
- }
- | ALLO SP NUMBER SP R SP NUMBER CRLF
- = {
- reply(202, "ALLO command ignored.");
- }
- | RETR check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- retrieve((char *) 0, (char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | STOR check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- store((char *) $4, "w", 0);
- if ($4 != NULL)
- free((char *) $4);
- }
- | APPE check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- store((char *) $4, "a", 0);
- if ($4 != NULL)
- free((char *) $4);
- }
- | NLST check_login CRLF
- = {
- if ($2)
- send_file_list(".");
- }
- | NLST check_login SP STRING CRLF
- = {
- if ($2 && $4 != NULL)
- send_file_list((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | LIST check_login CRLF
- = {
- if ($2)
- retrieve("/bin/ls -lgA", "");
- }
- | LIST check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- retrieve("/bin/ls -lgA %s", (char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | STAT check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- statfilecmd((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | STAT CRLF
- = {
- statcmd();
- }
- | DELE check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- delete((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | RNTO SP pathname CRLF
- = {
- if (fromname) {
- renamecmd(fromname, (char *) $3);
- free(fromname);
- fromname = (char *) 0;
- } else {
- reply(503, "Bad sequence of commands.");
- }
- free((char *) $3);
- }
- | ABOR CRLF
- = {
- reply(225, "ABOR command successful.");
- }
- | CWD check_login CRLF
- = {
- if ($2)
- cwd(pw->pw_dir);
- }
- | CWD check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- cwd((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | HELP CRLF
- = {
- help(cmdtab, (char *) 0);
- }
- | HELP SP STRING CRLF
- = {
- register char *cp = (char *)$3;
-
- if (strncasecmp(cp, "SITE", 4) == 0) {
- cp = (char *)$3 + 4;
- if (*cp == ' ')
- cp++;
- if (*cp)
- help(sitetab, cp);
- else
- help(sitetab, (char *) 0);
- } else
- help(cmdtab, (char *) $3);
- }
- | NOOP CRLF
- = {
- reply(200, "NOOP command successful.");
- }
- | MKD check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- makedir((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | RMD check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- removedir((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | PWD check_login CRLF
- = {
- if ($2)
- pwd();
- }
- | CDUP check_login CRLF
- = {
- if ($2)
- cwd("..");
- }
- | SITE SP HELP CRLF
- = {
- help(sitetab, (char *) 0);
- }
- | SITE SP HELP SP STRING CRLF
- = {
- help(sitetab, (char *) $5);
- }
- | SITE SP UMASK check_login CRLF
- = {
- int oldmask;
-
- if ($4) {
- oldmask = umask(0);
- (void) umask(oldmask);
- reply(200, "Current UMASK is %03o", oldmask);
- }
- }
- | SITE SP UMASK check_login SP octal_number CRLF
- = {
- int oldmask;
-
- if ($4) {
- if (($6 == -1) || ($6 > 0777)) {
- reply(501, "Bad UMASK value");
- } else {
- oldmask = umask($6);
- reply(200,
- "UMASK set to %03o (was %03o)",
- $6, oldmask);
- }
- }
- }
- | SITE SP CHMOD check_login SP octal_number SP pathname CRLF
- = {
- if ($4 && ($8 != NULL)) {
- if ($6 > 0777)
- reply(501,
- "CHMOD: Mode value must be between 0 and 0777");
- else if (chmod((char *) $8, $6) < 0)
- perror_reply(550, (char *) $8);
- else
- reply(200, "CHMOD command successful.");
- }
- if ($8 != NULL)
- free((char *) $8);
- }
- | SITE SP IDLE CRLF
- = {
- reply(200,
- "Current IDLE time limit is %d seconds; max %d",
- timeout, maxtimeout);
- }
- | SITE SP IDLE SP NUMBER CRLF
- = {
- if ($5 < 30 || $5 > maxtimeout) {
- reply(501,
- "Maximum IDLE time must be between 30 and %d seconds",
- maxtimeout);
- } else {
- timeout = $5;
- (void) alarm((unsigned) timeout);
- reply(200,
- "Maximum IDLE time set to %d seconds",
- timeout);
- }
- }
- | STOU check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- store((char *) $4, "w", 1);
- if ($4 != NULL)
- free((char *) $4);
- }
- | SYST CRLF
- = {
-#ifdef unix
-#ifdef BSD
- reply(215, "UNIX Type: L%d Version: BSD-%d",
- NBBY, BSD);
-#else /* BSD */
- reply(215, "UNIX Type: L%d", NBBY);
-#endif /* BSD */
-#else /* unix */
- reply(215, "UNKNOWN Type: L%d", NBBY);
-#endif /* unix */
- }
-
- /*
- * SIZE is not in RFC959, but Postel has blessed it and
- * it will be in the updated RFC.
- *
- * Return size of file in a format suitable for
- * using with RESTART (we just count bytes).
- */
- | SIZE check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- sizecmd((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
-
- /*
- * MDTM is not in RFC959, but Postel has blessed it and
- * it will be in the updated RFC.
- *
- * Return modification time of file as an ISO 3307
- * style time. E.g. YYYYMMDDHHMMSS or YYYYMMDDHHMMSS.xxx
- * where xxx is the fractional second (of any precision,
- * not necessarily 3 digits)
- */
- | MDTM check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL) {
- struct stat stbuf;
- if (stat((char *) $4, &stbuf) < 0)
- perror_reply(550, "%s", (char *) $4);
- else if ((stbuf.st_mode&S_IFMT) != S_IFREG) {
- reply(550, "%s: not a plain file.",
- (char *) $4);
- } else {
- register struct tm *t;
- struct tm *gmtime();
- t = gmtime(&stbuf.st_mtime);
- reply(213,
- "%d%02d%02d%02d%02d%02d",
- t->tm_year+1900, t->tm_mon+1, t->tm_mday,
- t->tm_hour, t->tm_min, t->tm_sec);
- }
- }
- if ($4 != NULL)
- free((char *) $4);
- }
- | QUIT CRLF
- = {
- reply(221, "Goodbye.");
- dologout(0);
- }
- | error CRLF
- = {
- yyerrok;
- }
- ;
-rcmd: RNFR check_login SP pathname CRLF
- = {
- char *renamefrom();
-
- if ($2 && $4) {
- fromname = renamefrom((char *) $4);
- if (fromname == (char *) 0 && $4) {
- free((char *) $4);
- }
- }
- }
- ;
-
-username: STRING
- ;
-
-password: /* empty */
- = {
- *(char **)&($$) = "";
- }
- | STRING
- ;
-
-byte_size: NUMBER
- ;
-
-host_port: NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA
- NUMBER COMMA NUMBER
- = {
- register char *a, *p;
-
- a = (char *)&data_dest.sin_addr;
- a[0] = $1; a[1] = $3; a[2] = $5; a[3] = $7;
- p = (char *)&data_dest.sin_port;
- p[0] = $9; p[1] = $11;
- data_dest.sin_family = AF_INET;
- }
- ;
-
-form_code: N
- = {
- $$ = FORM_N;
- }
- | T
- = {
- $$ = FORM_T;
- }
- | C
- = {
- $$ = FORM_C;
- }
- ;
-
-type_code: A
- = {
- cmd_type = TYPE_A;
- cmd_form = FORM_N;
- }
- | A SP form_code
- = {
- cmd_type = TYPE_A;
- cmd_form = $3;
- }
- | E
- = {
- cmd_type = TYPE_E;
- cmd_form = FORM_N;
- }
- | E SP form_code
- = {
- cmd_type = TYPE_E;
- cmd_form = $3;
- }
- | I
- = {
- cmd_type = TYPE_I;
- }
- | L
- = {
- cmd_type = TYPE_L;
- cmd_bytesz = NBBY;
- }
- | L SP byte_size
- = {
- cmd_type = TYPE_L;
- cmd_bytesz = $3;
- }
- /* this is for a bug in the BBN ftp */
- | L byte_size
- = {
- cmd_type = TYPE_L;
- cmd_bytesz = $2;
- }
- ;
-
-struct_code: F
- = {
- $$ = STRU_F;
- }
- | R
- = {
- $$ = STRU_R;
- }
- | P
- = {
- $$ = STRU_P;
- }
- ;
-
-mode_code: S
- = {
- $$ = MODE_S;
- }
- | B
- = {
- $$ = MODE_B;
- }
- | C
- = {
- $$ = MODE_C;
- }
- ;
-
-pathname: pathstring
- = {
- /*
- * Problem: this production is used for all pathname
- * processing, but only gives a 550 error reply.
- * This is a valid reply in some cases but not in others.
- */
- if (logged_in && $1 && strncmp((char *) $1, "~", 1) == 0) {
- *(char **)&($$) = *glob((char *) $1);
- if (globerr != NULL) {
- reply(550, globerr);
- $$ = NULL;
- }
- free((char *) $1);
- } else
- $$ = $1;
- }
- ;
-
-pathstring: STRING
- ;
-
-octal_number: NUMBER
- = {
- register int ret, dec, multby, digit;
-
- /*
- * Convert a number that was read as decimal number
- * to what it would be if it had been read as octal.
- */
- dec = $1;
- multby = 1;
- ret = 0;
- while (dec) {
- digit = dec%10;
- if (digit > 7) {
- ret = -1;
- break;
- }
- ret += digit * multby;
- multby *= 8;
- dec /= 10;
- }
- $$ = ret;
- }
- ;
-
-check_login: /* empty */
- = {
- if (logged_in)
- $$ = 1;
- else {
- reply(530, "Please login with USER and PASS.");
- $$ = 0;
- }
- }
- ;
-
-%%
-
-extern jmp_buf errcatch;
-
-#define CMD 0 /* beginning of command */
-#define ARGS 1 /* expect miscellaneous arguments */
-#define STR1 2 /* expect SP followed by STRING */
-#define STR2 3 /* expect STRING */
-#define OSTR 4 /* optional SP then STRING */
-#define ZSTR1 5 /* SP then optional STRING */
-#define ZSTR2 6 /* optional STRING after SP */
-#define SITECMD 7 /* SITE command */
-#define NSTR 8 /* Number followed by a string */
-
-struct tab {
- char *name;
- short token;
- short state;
- short implemented; /* 1 if command is implemented */
- char *help;
-};
-
-struct tab cmdtab[] = { /* In order defined in RFC 765 */
- { "USER", USER, STR1, 1, "<sp> username" },
- { "PASS", PASS, ZSTR1, 1, "<sp> password" },
- { "ACCT", ACCT, STR1, 0, "(specify account)" },
- { "SMNT", SMNT, ARGS, 0, "(structure mount)" },
- { "REIN", REIN, ARGS, 0, "(reinitialize server state)" },
- { "QUIT", QUIT, ARGS, 1, "(terminate service)", },
- { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" },
- { "PASV", PASV, ARGS, 1, "(set server in passive mode)" },
- { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" },
- { "STRU", STRU, ARGS, 1, "(specify file structure)" },
- { "MODE", MODE, ARGS, 1, "(specify transfer mode)" },
- { "RETR", RETR, STR1, 1, "<sp> file-name" },
- { "STOR", STOR, STR1, 1, "<sp> file-name" },
- { "APPE", APPE, STR1, 1, "<sp> file-name" },
- { "MLFL", MLFL, OSTR, 0, "(mail file)" },
- { "MAIL", MAIL, OSTR, 0, "(mail to user)" },
- { "MSND", MSND, OSTR, 0, "(mail send to terminal)" },
- { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" },
- { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" },
- { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" },
- { "MRCP", MRCP, STR1, 0, "(mail recipient)" },
- { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" },
- { "REST", REST, ARGS, 0, "(restart command)" },
- { "RNFR", RNFR, STR1, 1, "<sp> file-name" },
- { "RNTO", RNTO, STR1, 1, "<sp> file-name" },
- { "ABOR", ABOR, ARGS, 1, "(abort operation)" },
- { "DELE", DELE, STR1, 1, "<sp> file-name" },
- { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
- { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
- { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" },
- { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" },
- { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" },
- { "SYST", SYST, ARGS, 1, "(get type of operating system)" },
- { "STAT", STAT, OSTR, 1, "[ <sp> path-name ]" },
- { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
- { "NOOP", NOOP, ARGS, 1, "" },
- { "MKD", MKD, STR1, 1, "<sp> path-name" },
- { "XMKD", MKD, STR1, 1, "<sp> path-name" },
- { "RMD", RMD, STR1, 1, "<sp> path-name" },
- { "XRMD", RMD, STR1, 1, "<sp> path-name" },
- { "PWD", PWD, ARGS, 1, "(return current directory)" },
- { "XPWD", PWD, ARGS, 1, "(return current directory)" },
- { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" },
- { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" },
- { "STOU", STOU, STR1, 1, "<sp> file-name" },
- { "SIZE", SIZE, OSTR, 1, "<sp> path-name" },
- { "MDTM", MDTM, OSTR, 1, "<sp> path-name" },
- { NULL, 0, 0, 0, 0 }
-};
-
-struct tab sitetab[] = {
- { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" },
- { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" },
- { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" },
- { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
- { NULL, 0, 0, 0, 0 }
-};
-
-struct tab *
-lookup(p, cmd)
- register struct tab *p;
- char *cmd;
-{
-
- for (; p->name != NULL; p++)
- if (strcmp(cmd, p->name) == 0)
- return (p);
- return (0);
-}
-
-#include <arpa/telnet.h>
-
-/*
- * getline - a hacked up version of fgets to ignore TELNET escape codes.
- */
-char *
-getline(s, n, iop)
- char *s;
- register FILE *iop;
-{
- register c;
- register char *cs;
-
- cs = s;
-/* tmpline may contain saved command from urgent mode interruption */
- for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
- *cs++ = tmpline[c];
- if (tmpline[c] == '\n') {
- *cs++ = '\0';
- if (debug)
- syslog(LOG_DEBUG, "command: %s", s);
- tmpline[0] = '\0';
- return(s);
- }
- if (c == 0)
- tmpline[0] = '\0';
- }
- while ((c = getc(iop)) != EOF) {
- c &= 0377;
- if (c == IAC) {
- if ((c = getc(iop)) != EOF) {
- c &= 0377;
- switch (c) {
- case WILL:
- case WONT:
- c = getc(iop);
- printf("%c%c%c", IAC, DONT, 0377&c);
- (void) fflush(stdout);
- continue;
- case DO:
- case DONT:
- c = getc(iop);
- printf("%c%c%c", IAC, WONT, 0377&c);
- (void) fflush(stdout);
- continue;
- case IAC:
- break;
- default:
- continue; /* ignore command */
- }
- }
- }
- *cs++ = c;
- if (--n <= 0 || c == '\n')
- break;
- }
- if (c == EOF && cs == s)
- return (NULL);
- *cs++ = '\0';
- if (debug)
- syslog(LOG_DEBUG, "command: %s", s);
- return (s);
-}
-
-static int
-toolong()
-{
- time_t now;
- extern char *ctime();
- extern time_t time();
-
- reply(421,
- "Timeout (%d seconds): closing control connection.", timeout);
- (void) time(&now);
- if (logging) {
- syslog(LOG_INFO,
- "User %s timed out after %d seconds at %s",
- (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
- }
- dologout(1);
-}
-
-yylex()
-{
- static int cpos, state;
- register char *cp, *cp2;
- register struct tab *p;
- int n;
- char c, *strpbrk();
- char *copy();
-
- for (;;) {
- switch (state) {
-
- case CMD:
- (void) signal(SIGALRM, toolong);
- (void) alarm((unsigned) timeout);
- if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
- reply(221, "You could at least say goodbye.");
- dologout(0);
- }
- (void) alarm(0);
-#ifdef SETPROCTITLE
- if (strncasecmp(cbuf, "PASS", 4) != NULL)
- setproctitle("%s: %s", proctitle, cbuf);
-#endif /* SETPROCTITLE */
- if ((cp = index(cbuf, '\r'))) {
- *cp++ = '\n';
- *cp = '\0';
- }
- if ((cp = strpbrk(cbuf, " \n")))
- cpos = cp - cbuf;
- if (cpos == 0)
- cpos = 4;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- upper(cbuf);
- p = lookup(cmdtab, cbuf);
- cbuf[cpos] = c;
- if (p != 0) {
- if (p->implemented == 0) {
- nack(p->name);
- longjmp(errcatch,0);
- /* NOTREACHED */
- }
- state = p->state;
- *(char **)&yylval = p->name;
- return (p->token);
- }
- break;
-
- case SITECMD:
- if (cbuf[cpos] == ' ') {
- cpos++;
- return (SP);
- }
- cp = &cbuf[cpos];
- if ((cp2 = strpbrk(cp, " \n")))
- cpos = cp2 - cbuf;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- upper(cp);
- p = lookup(sitetab, cp);
- cbuf[cpos] = c;
- if (p != 0) {
- if (p->implemented == 0) {
- state = CMD;
- nack(p->name);
- longjmp(errcatch,0);
- /* NOTREACHED */
- }
- state = p->state;
- *(char **)&yylval = p->name;
- return (p->token);
- }
- state = CMD;
- break;
-
- case OSTR:
- if (cbuf[cpos] == '\n') {
- state = CMD;
- return (CRLF);
- }
- /* FALLTHROUGH */
-
- case STR1:
- case ZSTR1:
- dostr1:
- if (cbuf[cpos] == ' ') {
- cpos++;
- state = state == OSTR ? STR2 : ++state;
- return (SP);
- }
- break;
-
- case ZSTR2:
- if (cbuf[cpos] == '\n') {
- state = CMD;
- return (CRLF);
- }
- /* FALLTHROUGH */
-
- case STR2:
- cp = &cbuf[cpos];
- n = strlen(cp);
- cpos += n - 1;
- /*
- * Make sure the string is nonempty and \n terminated.
- */
- if (n > 1 && cbuf[cpos] == '\n') {
- cbuf[cpos] = '\0';
- *(char **)&yylval = copy(cp);
- cbuf[cpos] = '\n';
- state = ARGS;
- return (STRING);
- }
- break;
-
- case NSTR:
- if (cbuf[cpos] == ' ') {
- cpos++;
- return (SP);
- }
- if (isdigit(cbuf[cpos])) {
- cp = &cbuf[cpos];
- while (isdigit(cbuf[++cpos]))
- ;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- yylval = atoi(cp);
- cbuf[cpos] = c;
- state = STR1;
- return (NUMBER);
- }
- state = STR1;
- goto dostr1;
-
- case ARGS:
- if (isdigit(cbuf[cpos])) {
- cp = &cbuf[cpos];
- while (isdigit(cbuf[++cpos]))
- ;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- yylval = atoi(cp);
- cbuf[cpos] = c;
- return (NUMBER);
- }
- switch (cbuf[cpos++]) {
-
- case '\n':
- state = CMD;
- return (CRLF);
-
- case ' ':
- return (SP);
-
- case ',':
- return (COMMA);
-
- case 'A':
- case 'a':
- return (A);
-
- case 'B':
- case 'b':
- return (B);
-
- case 'C':
- case 'c':
- return (C);
-
- case 'E':
- case 'e':
- return (E);
-
- case 'F':
- case 'f':
- return (F);
-
- case 'I':
- case 'i':
- return (I);
-
- case 'L':
- case 'l':
- return (L);
-
- case 'N':
- case 'n':
- return (N);
-
- case 'P':
- case 'p':
- return (P);
-
- case 'R':
- case 'r':
- return (R);
-
- case 'S':
- case 's':
- return (S);
-
- case 'T':
- case 't':
- return (T);
-
- }
- break;
-
- default:
- fatal("Unknown state in scanner.");
- }
- yyerror((char *) 0);
- state = CMD;
- longjmp(errcatch,0);
- }
-}
-
-upper(s)
- register char *s;
-{
- while (*s != '\0') {
- if (islower(*s))
- *s = toupper(*s);
- s++;
- }
-}
-
-char *
-copy(s)
- char *s;
-{
- char *p;
- extern char *malloc(), *strcpy();
-
- p = malloc((unsigned) strlen(s) + 1);
- if (p == NULL)
- fatal("Ran out of memory.");
- (void) strcpy(p, s);
- return (p);
-}
-
-help(ctab, s)
- struct tab *ctab;
- char *s;
-{
- register struct tab *c;
- register int width, NCMDS;
- char *type;
-
- if (ctab == sitetab)
- type = "SITE ";
- else
- type = "";
- width = 0, NCMDS = 0;
- for (c = ctab; c->name != NULL; c++) {
- int len = strlen(c->name);
-
- if (len > width)
- width = len;
- NCMDS++;
- }
- width = (width + 8) &~ 7;
- if (s == 0) {
- register int i, j, w;
- int columns, lines;
-
- lreply(214, "The following %scommands are recognized %s.",
- type, "(* =>'s unimplemented)");
- columns = 76 / width;
- if (columns == 0)
- columns = 1;
- lines = (NCMDS + columns - 1) / columns;
- for (i = 0; i < lines; i++) {
- printf(" ");
- for (j = 0; j < columns; j++) {
- c = ctab + j * lines + i;
- printf("%s%c", c->name,
- c->implemented ? ' ' : '*');
- if (c + lines >= &ctab[NCMDS])
- break;
- w = strlen(c->name) + 1;
- while (w < width) {
- putchar(' ');
- w++;
- }
- }
- printf("\r\n");
- }
- (void) fflush(stdout);
- reply(214, "Direct comments to ftp-bugs@%s.", hostname);
- return;
- }
- upper(s);
- c = lookup(ctab, s);
- if (c == (struct tab *)0) {
- reply(502, "Unknown command %s.", s);
- return;
- }
- if (c->implemented)
- reply(214, "Syntax: %s%s %s", type, c->name, c->help);
- else
- reply(214, "%s%-*s\t%s; unimplemented.", type, width,
- c->name, c->help);
-}
-
-sizecmd(filename)
-char *filename;
-{
- switch (type) {
- case TYPE_L:
- case TYPE_I: {
- struct stat stbuf;
- if (stat(filename, &stbuf) < 0 ||
- (stbuf.st_mode&S_IFMT) != S_IFREG)
- reply(550, "%s: not a plain file.", filename);
- else
- reply(213, "%lu", stbuf.st_size);
- break;}
- case TYPE_A: {
- FILE *fin;
- register int c, count;
- struct stat stbuf;
- fin = fopen(filename, "r");
- if (fin == NULL) {
- perror_reply(550, filename);
- return;
- }
- if (fstat(fileno(fin), &stbuf) < 0 ||
- (stbuf.st_mode&S_IFMT) != S_IFREG) {
- reply(550, "%s: not a plain file.", filename);
- (void) fclose(fin);
- return;
- }
-
- count = 0;
- while((c=getc(fin)) != EOF) {
- if (c == '\n') /* will get expanded to \r\n */
- count++;
- count++;
- }
- (void) fclose(fin);
-
- reply(213, "%ld", count);
- break;}
- default:
- reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
- }
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/verbose.c
--- a/head/usr.bin/yacc/verbose.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,381 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)verbose.c 5.3 (Berkeley) 1/20/91";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include "defs.h"
-
-static short *null_rules;
-
-static void log_unused(void);
-static void log_conflicts(void);
-static void print_actions(int);
-static void print_conflicts(int);
-static void print_core(int);
-static void print_gotos(int);
-static void print_nulls(int);
-static void print_reductions(action *, register int);
-static void print_shifts(action *);
-static void print_state(int);
-
-void
-verbose(void)
-{
- int i;
-
- if (!vflag) return;
-
- null_rules = malloc(nrules*sizeof(short));
- if (null_rules == 0) no_space();
- fprintf(verbose_file, "\f\n");
- for (i = 0; i < nstates; i++)
- print_state(i);
- free(null_rules);
-
- if (nunused)
- log_unused();
- if (SRtotal || RRtotal)
- log_conflicts();
-
- fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens,
- nvars);
- fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates);
-}
-
-
-static void
-log_unused(void)
-{
- int i;
- short *p;
-
- fprintf(verbose_file, "\n\nRules never reduced:\n");
- for (i = 3; i < nrules; ++i)
- {
- if (!rules_used[i])
- {
- fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]);
- for (p = ritem + rrhs[i]; *p >= 0; ++p)
- fprintf(verbose_file, " %s", symbol_name[*p]);
- fprintf(verbose_file, " (%d)\n", i - 2);
- }
- }
-}
-
-
-static void
-log_conflicts(void)
-{
- int i;
-
- fprintf(verbose_file, "\n\n");
- for (i = 0; i < nstates; i++)
- {
- if (SRconflicts[i] || RRconflicts[i])
- {
- fprintf(verbose_file, "State %d contains ", i);
- if (SRconflicts[i] == 1)
- fprintf(verbose_file, "1 shift/reduce conflict");
- else if (SRconflicts[i] > 1)
- fprintf(verbose_file, "%d shift/reduce conflicts",
- SRconflicts[i]);
- if (SRconflicts[i] && RRconflicts[i])
- fprintf(verbose_file, ", ");
- if (RRconflicts[i] == 1)
- fprintf(verbose_file, "1 reduce/reduce conflict");
- else if (RRconflicts[i] > 1)
- fprintf(verbose_file, "%d reduce/reduce conflicts",
- RRconflicts[i]);
- fprintf(verbose_file, ".\n");
- }
- }
-}
-
-
-static void
-print_state(int state)
-{
- if (state)
- fprintf(verbose_file, "\n\n");
- if (SRconflicts[state] || RRconflicts[state])
- print_conflicts(state);
- fprintf(verbose_file, "state %d\n", state);
- print_core(state);
- print_nulls(state);
- print_actions(state);
-}
-
-
-static void
-print_conflicts(int state)
-{
- int symbol, act = 0, number = 0;
- action *p;
-
- symbol = -1;
- for (p = parser[state]; p; p = p->next)
- {
- if (p->suppressed == 2)
- continue;
-
- if (p->symbol != symbol)
- {
- symbol = p->symbol;
- number = p->number;
- if (p->action_code == SHIFT)
- act = SHIFT;
- else
- act = REDUCE;
- }
- else if (p->suppressed == 1)
- {
- if (state == final_state && symbol == 0)
- {
- fprintf(verbose_file, "%d: shift/reduce conflict \
-(accept, reduce %d) on $end\n", state, p->number - 2);
- }
- else
- {
- if (act == SHIFT)
- {
- fprintf(verbose_file, "%d: shift/reduce conflict \
-(shift %d, reduce %d) on %s\n", state, number, p->number - 2,
- symbol_name[symbol]);
- }
- else
- {
- fprintf(verbose_file, "%d: reduce/reduce conflict \
-(reduce %d, reduce %d) on %s\n", state, number - 2, p->number - 2,
- symbol_name[symbol]);
- }
- }
- }
- }
-}
-
-
-static void
-print_core(int state)
-{
- int i;
- int k;
- int rule;
- core *statep;
- short *sp;
- short *sp1;
-
- statep = state_table[state];
- k = statep->nitems;
-
- for (i = 0; i < k; i++)
- {
- sp1 = sp = ritem + statep->items[i];
-
- while (*sp >= 0) ++sp;
- rule = -(*sp);
- fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]);
-
- for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
- fprintf(verbose_file, "%s ", symbol_name[*sp]);
-
- putc('.', verbose_file);
-
- while (*sp >= 0)
- {
- fprintf(verbose_file, " %s", symbol_name[*sp]);
- sp++;
- }
- fprintf(verbose_file, " (%d)\n", -2 - *sp);
- }
-}
-
-
-static void
-print_nulls(int state)
-{
- action *p;
- int i, j, k, nnulls;
-
- nnulls = 0;
- for (p = parser[state]; p; p = p->next)
- {
- if (p->action_code == REDUCE &&
- (p->suppressed == 0 || p->suppressed == 1))
- {
- i = p->number;
- if (rrhs[i] + 1 == rrhs[i+1])
- {
- for (j = 0; j < nnulls && i > null_rules[j]; ++j)
- continue;
-
- if (j == nnulls)
- {
- ++nnulls;
- null_rules[j] = i;
- }
- else if (i != null_rules[j])
- {
- ++nnulls;
- for (k = nnulls - 1; k > j; --k)
- null_rules[k] = null_rules[k-1];
- null_rules[j] = i;
- }
- }
- }
- }
-
- for (i = 0; i < nnulls; ++i)
- {
- j = null_rules[i];
- fprintf(verbose_file, "\t%s : . (%d)\n", symbol_name[rlhs[j]],
- j - 2);
- }
- fprintf(verbose_file, "\n");
-}
-
-
-static void
-print_actions(int stateno)
-{
- action *p;
- shifts *sp;
- int as;
-
- if (stateno == final_state)
- fprintf(verbose_file, "\t$end accept\n");
-
- p = parser[stateno];
- if (p)
- {
- print_shifts(p);
- print_reductions(p, defred[stateno]);
- }
-
- sp = shift_table[stateno];
- if (sp && sp->nshifts > 0)
- {
- as = accessing_symbol[sp->shift[sp->nshifts - 1]];
- if (ISVAR(as))
- print_gotos(stateno);
- }
-}
-
-
-static void
-print_shifts(action *p)
-{
- int count;
- action *q;
-
- count = 0;
- for (q = p; q; q = q->next)
- {
- if (q->suppressed < 2 && q->action_code == SHIFT)
- ++count;
- }
-
- if (count > 0)
- {
- for (; p; p = p->next)
- {
- if (p->action_code == SHIFT && p->suppressed == 0)
- fprintf(verbose_file, "\t%s shift %d\n",
- symbol_name[p->symbol], p->number);
- }
- }
-}
-
-
-static void
-print_reductions(action *p, int defreduct)
-{
- int k, anyreds;
- action *q;
-
- anyreds = 0;
- for (q = p; q ; q = q->next)
- {
- if (q->action_code == REDUCE && q->suppressed < 2)
- {
- anyreds = 1;
- break;
- }
- }
-
- if (anyreds == 0)
- fprintf(verbose_file, "\t. error\n");
- else
- {
- for (; p; p = p->next)
- {
- if (p->action_code == REDUCE && p->number != defreduct)
- {
- k = p->number - 2;
- if (p->suppressed == 0)
- fprintf(verbose_file, "\t%s reduce %d\n",
- symbol_name[p->symbol], k);
- }
- }
-
- if (defreduct > 0)
- fprintf(verbose_file, "\t. reduce %d\n", defreduct - 2);
- }
-}
-
-
-static void
-print_gotos(int stateno)
-{
- int i, k;
- int as;
- short *tostate;
- shifts *sp;
-
- putc('\n', verbose_file);
- sp = shift_table[stateno];
- tostate = sp->shift;
- for (i = 0; i < sp->nshifts; ++i)
- {
- k = tostate[i];
- as = accessing_symbol[k];
- if (ISVAR(as))
- fprintf(verbose_file, "\t%s goto %d\n", symbol_name[as], k);
- }
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/warshall.c
--- a/head/usr.bin/yacc/warshall.c Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)warshall.c 5.4 (Berkeley) 5/24/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "defs.h"
-
-static void transitive_closure(unsigned *, int);
-
-static void
-transitive_closure(unsigned *R, int n)
-{
- int rowsize;
- unsigned i;
- unsigned *rowj;
- unsigned *rp;
- unsigned *rend;
- unsigned *ccol;
- unsigned *relend;
- unsigned *cword;
- unsigned *rowi;
-
- rowsize = WORDSIZE(n);
- relend = R + n*rowsize;
-
- cword = R;
- i = 0;
- rowi = R;
- while (rowi < relend)
- {
- ccol = cword;
- rowj = R;
-
- while (rowj < relend)
- {
- if (*ccol & (1 << i))
- {
- rp = rowi;
- rend = rowj + rowsize;
- while (rowj < rend)
- *rowj++ |= *rp++;
- }
- else
- {
- rowj += rowsize;
- }
-
- ccol += rowsize;
- }
-
- if (++i >= BITS_PER_WORD)
- {
- i = 0;
- cword++;
- }
-
- rowi += rowsize;
- }
-}
-
-void
-reflexive_transitive_closure(unsigned *R, int n)
-{
- int rowsize;
- unsigned i;
- unsigned *rp;
- unsigned *relend;
-
- transitive_closure(R, n);
-
- rowsize = WORDSIZE(n);
- relend = R + n*rowsize;
-
- i = 0;
- rp = R;
- while (rp < relend)
- {
- *rp |= (1 << i);
- if (++i >= BITS_PER_WORD)
- {
- i = 0;
- rp++;
- }
-
- rp += rowsize;
- }
-}
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/yacc.1
--- a/head/usr.bin/yacc/yacc.1 Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-.\" Copyright (c) 1989, 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Robert Paul Corbett.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)yacc.1 5.8 (Berkeley) 5/24/93
-.\" $FreeBSD$
-.\" $OpenBSD: yacc.1,v 1.14 2001/05/01 17:58:05 aaron Exp $
-.\"
-.Dd May 24, 1993
-.Dt YACC 1
-.Os
-.Sh NAME
-.Nm yacc
-.Nd an LALR(1) parser generator
-.Sh SYNOPSIS
-.Nm
-.Op Fl dlrtvy
-.Op Fl b Ar file_prefix
-.Op Fl o Ar output_filename
-.Op Fl p Ar symbol_prefix
-.Ar filename
-.Sh DESCRIPTION
-The
-.Nm
-utility reads the grammar specification in the file
-.Ar filename
-and generates an LR(1) parser for it.
-The parsers consist of a set of LALR(1) parsing tables and a driver routine
-written in the C programming language.
-The
-.Nm
-utility normally writes the parse tables and the driver routine to the file
-.Pa y.tab.c .
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl b Ar file_prefix
-Change the prefix prepended to the output file names to
-the string denoted by
-.Ar file_prefix .
-The default prefix is the character
-.Pa y .
-.It Fl d
-Cause the header file
-.Pa y.tab.h
-to be written.
-.It Fl l
-If the
-.Fl l
-option is not specified,
-.Nm
-will insert #line directives in the generated code.
-The #line directives let the C compiler relate errors in the
-generated code to the user's original code.
-If the
-.Fl l
-option is specified,
-.Nm
-will not insert the #line directives.
-Any #line directives specified by the user will be retained.
-.It Fl o Ar output_filename
-Cause
-.Nm
-to write the generated code to
-.Ar output_filename
-instead of the default file,
-.Pa y.tab.c .
-.It Fl p Ar symbol_prefix
-Change the prefix prepended to yacc-generated symbols to
-the string denoted by
-.Ar symbol_prefix .
-The default prefix is the string
-.Pa yy .
-.It Fl r
-Cause
-.Nm
-to produce separate files for code and tables.
-The code file
-is named
-.Pa y.code.c ,
-and the tables file is named
-.Pa y.tab.c .
-.It Fl t
-Change the preprocessor directives generated by
-.Nm
-so that debugging statements will be incorporated in the compiled code.
-.It Fl v
-Cause a human-readable description of the generated parser to
-be written to the file
-.Pa y.output .
-.It Fl y
-NOOP for bison compatibility.
-.Nm
-is already designed to be POSIX yacc compatible.
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width ".Ev TMPDIR"
-.It Ev TMPDIR
-Name of directory where temporary files are to be created.
-.El
-.Sh TABLES
-The names of the tables generated by this version of
-.Nm
-are
-.Va yylhs , yylen , yydefred , yydgoto , yysindex ,
-.Va yyrindex , yygindex , yytable ,
-and
-.Va yycheck .
-Two additional tables,
-.Va yyname
-and
-.Va yyrule ,
-are created if
-.Dv YYDEBUG
-is defined and non-zero.
-.Sh FILES
-.Bl -tag -width "Pa /tmp/yacc.aXXXXXXXXXX" -compact
-.It Pa y.code.c
-.It Pa y.tab.c
-.It Pa y.tab.h
-.It Pa y.output
-.It Pa /tmp/yacc.aXXXXXXXXXX
-.It Pa /tmp/yacc.tXXXXXXXXXX
-.It Pa /tmp/yacc.uXXXXXXXXXX
-.El
-.Sh DIAGNOSTICS
-If there are rules that are never reduced,
-the number of such rules is reported on standard error.
-If there are any
-.Tn LALR(1)
-conflicts,
-the number of conflicts is reported on standard error.
-.Sh SEE ALSO
-.Xr yyfix 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.2 .
-.Sh HISTORY
-A
-.Nm
-command appeared in PWB UNIX.
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/yyfix.1
--- a/head/usr.bin/yacc/yyfix.1 Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-.\" Copyright (c) 1990, 1991 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)yyfix.1 5.4 (Berkeley) 3/23/93
-.\" $FreeBSD$
-.\"
-.Dd March 23, 1993
-.Dt YYFIX 1
-.Os
-.Sh NAME
-.Nm yyfix
-.Nd extract tables from y.tab.c
-.Sh SYNOPSIS
-.Nm
-.Ar file
-.Op Ar tables
-.Sh DESCRIPTION
-Programs have historically used a script (often named
-.Dq :yyfix )
-to extract tables from the
-.Xr yacc 1
-generated file
-.Pa y.tab.c .
-As the names of the tables generated by the current version of
-.Xr yacc 1
-are different from those of historical versions of
-.Xr yacc 1 ,
-the shell script
-.Nm
-is provided to simplify the transition.
-.Pp
-The first (and required) argument to
-.Nm
-is the name of the file where the extracted tables should be stored.
-.Pp
-If further command line arguments are specified, they are taken as
-the list of tables to be extracted.
-Otherwise,
-.Nm
-attempts to determine if the
-.Pa y.tab.c
-file is from an old or new
-.Xr yacc 1 ,
-and extracts the appropriate tables.
-.Pp
-The tables
-.Dq yyexca ,
-.Dq yyact ,
-.Dq yypact ,
-.Dq yypgo ,
-.Dq yyr1 ,
-.Dq yyr2 ,
-.Dq yychk ,
-and
-.Dq yydef
-are extracted
-from historical versions of
-.Xr yacc 1 .
-.Pp
-The tables
-.Dq yylhs ,
-.Dq yylen ,
-.Dq yydefred ,
-.Dq yydgoto ,
-.Dq yysindex ,
-.Dq yyrindex ,
-.Dq yygindex ,
-.Dq yytable ,
-.Dq yyname ,
-.Dq yyrule ,
-and
-.Dq yycheck ,
-are extracted from the current version of
-.Xr yacc 1 .
-.Sh FILES
-.Bl -tag -width y.tab.c
-.It Pa y.tab.c
-File from which tables are extracted.
-.El
-.Sh SEE ALSO
-.Xr yacc 1
-.Sh HISTORY
-The
-.Nm
-command first appeared in
-.Bx 4.4 .
diff -r 91983250c121 -r 49f3e3227aef head/usr.bin/yacc/yyfix.sh
--- a/head/usr.bin/yacc/yyfix.sh Wed Jul 25 16:29:58 2012 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1990 The Regents of the University of California.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD$
-#
-# @(#)yyfix.sh 5.2 (Berkeley) 5/12/90
-#
-OLDYACC="yyexca yyact yypact yypgo yyr1 yyr2 yychk yydef"
-NEWYACC="yylhs yylen yydefred yydgoto yysindex yyrindex yygindex \
- yytable yycheck"
-
-if [ $# -eq 0 ]; then
- echo "usage: $0 file [tables]" >&2
- exit 1
-fi
-
-file=$1
->$file
-shift
-
-if [ $# -eq 0 ] ; then
- if grep yylhs y.tab.c > /dev/null ; then
- if grep yyname y.tab.c > /dev/null ; then
- NEWYACC="$NEWYACC yyname"
- fi
- if grep yyrule y.tab.c > /dev/null ; then
- NEWYACC="$NEWYACC yyrule"
- fi
- set $NEWYACC
- else
- set $OLDYACC
- fi
-fi
-
-for i
-do
-ed - y.tab.c << END
-/^\(.*\)$i[ ]*\[]/s//extern \1 $i[];\\
-\1 $i []/
-.ka
-/}/kb
-'br $file
-'a,.w $file
-'a,.d
-w
-q
-END
-done
More information about the Zrouter-src-freebsd
mailing list