summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKiyoshi Aman <kiyoshi.aman+adelie@gmail.com>2019-06-02 10:45:24 -0500
committerKiyoshi Aman <kiyoshi.aman+adelie@gmail.com>2019-06-02 10:45:38 -0500
commit245d006815241af4a2896b03985ecdab7869acbb (patch)
tree625cd4e255ef25983d395cec61c59bcd56e2d5e1
parentd2f4c4ce2165b5ec5a29773fa17aea116865b9dc (diff)
downloaduserland-245d006815241af4a2896b03985ecdab7869acbb.tar.gz
userland-245d006815241af4a2896b03985ecdab7869acbb.tar.bz2
userland-245d006815241af4a2896b03985ecdab7869acbb.tar.xz
userland-245d006815241af4a2896b03985ecdab7869acbb.zip
usr.bin/{m4,man,mesg}: remove, they are handled separately
-rw-r--r--usr.bin/m4/NOTES64
-rw-r--r--usr.bin/m4/PSD.doc/Makefile10
-rw-r--r--usr.bin/m4/TEST/ack.m441
-rw-r--r--usr.bin/m4/TEST/hanoi.m446
-rw-r--r--usr.bin/m4/TEST/hash.m456
-rw-r--r--usr.bin/m4/TEST/math.m4182
-rw-r--r--usr.bin/m4/TEST/sqroot.m446
-rw-r--r--usr.bin/m4/TEST/string.m446
-rw-r--r--usr.bin/m4/TEST/test.m4244
-rw-r--r--usr.bin/m4/eval.c1053
-rw-r--r--usr.bin/m4/expr.c50
-rw-r--r--usr.bin/m4/extern.h190
-rw-r--r--usr.bin/m4/gnum4.c817
-rw-r--r--usr.bin/m4/lib/ohash.h73
-rw-r--r--usr.bin/m4/lib/ohash_create_entry.c38
-rw-r--r--usr.bin/m4/lib/ohash_delete.c31
-rw-r--r--usr.bin/m4/lib/ohash_do.c111
-rw-r--r--usr.bin/m4/lib/ohash_entries.c26
-rw-r--r--usr.bin/m4/lib/ohash_enum.c36
-rw-r--r--usr.bin/m4/lib/ohash_init.3229
-rw-r--r--usr.bin/m4/lib/ohash_init.c41
-rw-r--r--usr.bin/m4/lib/ohash_int.h23
-rw-r--r--usr.bin/m4/lib/ohash_interval.390
-rw-r--r--usr.bin/m4/lib/ohash_interval.c36
-rw-r--r--usr.bin/m4/lib/ohash_lookup_interval.c68
-rw-r--r--usr.bin/m4/lib/ohash_lookup_memory.c64
-rw-r--r--usr.bin/m4/lib/ohash_qlookup.c27
-rw-r--r--usr.bin/m4/lib/ohash_qlookupi.c29
-rw-r--r--usr.bin/m4/lib/strtonum.c73
-rw-r--r--usr.bin/m4/look.c315
-rw-r--r--usr.bin/m4/m4.1522
-rw-r--r--usr.bin/m4/main.c811
-rw-r--r--usr.bin/m4/mdef.h237
-rw-r--r--usr.bin/m4/misc.c414
-rw-r--r--usr.bin/m4/parser.y86
-rw-r--r--usr.bin/m4/pathnames.h40
-rw-r--r--usr.bin/m4/stdd.h54
-rw-r--r--usr.bin/m4/tokenizer.l108
-rw-r--r--usr.bin/m4/trace.c203
-rw-r--r--usr.bin/man/man.1269
-rw-r--r--usr.bin/man/man.c1077
-rw-r--r--usr.bin/man/man.conf.5286
-rw-r--r--usr.bin/man/manconf.c272
-rw-r--r--usr.bin/man/manconf.h60
-rw-r--r--usr.bin/man/pathnames.h39
-rw-r--r--usr.bin/mesg/mesg.189
-rw-r--r--usr.bin/mesg/mesg.c108
47 files changed, 0 insertions, 8830 deletions
diff --git a/usr.bin/m4/NOTES b/usr.bin/m4/NOTES
deleted file mode 100644
index d60f80e..0000000
--- a/usr.bin/m4/NOTES
+++ /dev/null
@@ -1,64 +0,0 @@
-m4 - macro processor
-
-PD m4 is based on the macro tool distributed with the software
-tools (VOS) package, and described in the "SOFTWARE TOOLS" and
-"SOFTWARE TOOLS IN PASCAL" books. It has been expanded to include
-most of the command set of SysV m4, the standard UN*X macro processor.
-
-Since both PD m4 and UN*X m4 are based on SOFTWARE TOOLS macro,
-there may be certain implementation similarities between
-the two. The PD m4 was produced without ANY references to m4
-sources.
-
-written by: Ozan S. Yigit
-
-References:
-
- Software Tools distribution: macro
-
- Kernighan, Brian W. and P. J. Plauger, SOFTWARE
- TOOLS IN PASCAL, Addison-Wesley, Mass. 1981
-
- Kernighan, Brian W. and P. J. Plauger, SOFTWARE
- TOOLS, Addison-Wesley, Mass. 1976
-
- Kernighan, Brian W. and Dennis M. Ritchie,
- THE M4 MACRO PROCESSOR, Unix Programmer's Manual,
- Seventh Edition, Vol. 2, Bell Telephone Labs, 1979
-
- System V man page for M4
-
-
-Implementation Notes:
-
-[1] PD m4 uses a different (and simpler) stack mechanism than the one
- described in Software Tools and Software Tools in Pascal books.
- The triple stack thing is replaced with a single stack containing
- the call frames and the arguments. Each frame is back-linked to a
- previous stack frame, which enables us to rewind the stack after
- each nested call is completed. Each argument is a character pointer
- to the beginning of the argument string within the string space.
- The only exceptions to this are (*) arg 0 and arg 1, which are
- the macro definition and macro name strings, stored dynamically
- for the hash table.
-
- . .
- | . | <-- sp | . |
- +-------+ +-----+
- | arg 3 ------------------------------->| str |
- +-------+ | . |
- | arg 2 --------------+ .
- +-------+ |
- * | | |
- +-------+ | +-----+
- | plev | <-- fp +---------------->| str |
- +-------+ | . |
- | type | .
- +-------+
- | prcf -----------+ plev: paren level
- +-------+ | type: call type
- | . | | prcf: prev. call frame
- . |
- +-------+ |
- | <----------+
- +-------+
diff --git a/usr.bin/m4/PSD.doc/Makefile b/usr.bin/m4/PSD.doc/Makefile
deleted file mode 100644
index 9de1f83..0000000
--- a/usr.bin/m4/PSD.doc/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# $NetBSD: Makefile,v 1.4 2014/07/05 19:22:04 dholland Exp $
-#
-# @(#)Makefile 8.1 (Berkeley) 6/8/93
-
-SECTION=psd
-ARTICLE=m4
-SRCS= m4.ms
-MACROS= -msU
-
-.include <bsd.doc.mk>
diff --git a/usr.bin/m4/TEST/ack.m4 b/usr.bin/m4/TEST/ack.m4
deleted file mode 100644
index 2784c45..0000000
--- a/usr.bin/m4/TEST/ack.m4
+++ /dev/null
@@ -1,41 +0,0 @@
-# $NetBSD: ack.m4,v 1.4 1995/09/28 05:37:54 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# 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. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 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.
-#
-# @(#)ack.m4 8.1 (Berkeley) 6/6/93
-#
-
-define(ack, `ifelse($1,0,incr($2),$2,0,`ack(DECR($1),1)',
-`ack(DECR($1), ack($1,DECR($2)))')')
diff --git a/usr.bin/m4/TEST/hanoi.m4 b/usr.bin/m4/TEST/hanoi.m4
deleted file mode 100644
index 6f73431..0000000
--- a/usr.bin/m4/TEST/hanoi.m4
+++ /dev/null
@@ -1,46 +0,0 @@
-# $NetBSD: hanoi.m4,v 1.4 1995/09/28 05:37:56 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# 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. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 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.
-#
-# @(#)hanoi.m4 8.1 (Berkeley) 6/6/93
-#
-
-define(hanoi, `trans(A, B, C, $1)')
-
-define(moved,`move disk from $1 to $2
-')
-
-define(trans, `ifelse($4,1,`moved($1,$2)',
- `trans($1,$3,$2,DECR($4))moved($1,$2)trans($3,$2,$1,DECR($4))')')
diff --git a/usr.bin/m4/TEST/hash.m4 b/usr.bin/m4/TEST/hash.m4
deleted file mode 100644
index 5de2f79..0000000
--- a/usr.bin/m4/TEST/hash.m4
+++ /dev/null
@@ -1,56 +0,0 @@
-# $NetBSD: hash.m4,v 1.4 1995/09/28 05:37:58 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# 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. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 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.
-#
-# @(#)hash.m4 8.1 (Berkeley) 6/6/93
-#
-
-dnl This probably will not run on any m4 that cannot
-dnl handle char constants in eval.
-dnl
-changequote(<,>) define(HASHVAL,99) dnl
-define(hash,<eval(str(substr($1,1),0)%HASHVAL)>) dnl
-define(str,
- <ifelse($1,",$2,
- <str(substr(<$1>,1),<eval($2+'substr($1,0,1)')>)>)
- >) dnl
-define(KEYWORD,<$1,hash($1),>) dnl
-define(TSTART,
-<struct prehash {
- char *keyword;
- int hashval;
-} keytab[] = {>) dnl
-define(TEND,< "",0
-};>) dnl
diff --git a/usr.bin/m4/TEST/math.m4 b/usr.bin/m4/TEST/math.m4
deleted file mode 100644
index dff3937..0000000
--- a/usr.bin/m4/TEST/math.m4
+++ /dev/null
@@ -1,182 +0,0 @@
-dnl $NetBSD: math.m4,v 1.2 2005/10/06 17:38:09 drochner Exp $
-dnl FreeBSD: /repoman/r/ncvs/src/usr.bin/m4/TEST/math.m4,v 1.1 2004/05/01 03:27:05 smkelly Exp
-dnl A regression test for m4 C operators (ksb,petef)
-dnl If you think you have a short-circuiting m4, run us m4 -DSHORCIRCUIT=yes
-dnl
-dnl first level of precedence
-ifelse(eval(-7),-7,,`failed -
-')dnl
-ifelse(eval(- -2),2,,`failed -
-')dnl
-ifelse(eval(!0),1,,`failed !
-')dnl
-ifelse(eval(!7),0,,`failed !
-')dnl
-ifelse(eval(~-1),0,,`failed ~
-')dnl
-dnl next level of precedence
-ifelse(eval(3*5),15,,`failed *
-')dnl
-ifelse(eval(3*0),0,,`failed *
-')dnl
-ifelse(eval(11/2),5,,`failed /
-')dnl
-ifelse(eval(1/700),0,,`failed /
-')dnl
-ifelse(eval(10%5),0,,`failed %
-')dnl
-ifelse(eval(2%5),2,,`failed %
-')dnl
-ifelse(eval(2%-1),0,,`failed %
-')dnl
-dnl next level of precedence
-ifelse(eval(2+2),4,,`failed +
-')dnl
-ifelse(eval(2+-2),0,,`failed +
-')dnl
-ifelse(eval(2- -2),4,,`failed -
-')dnl
-ifelse(eval(2-2),0,,`failed -
-')dnl
-dnl next level of precedence
-ifelse(eval(1<<4),16,,`failed <<
-')dnl
-ifelse(eval(16>>4),1,,`failed >>
-')dnl
-dnl next level of precedence
-ifelse(eval(4<4),0,,`failed <
-')dnl
-ifelse(eval(4<5),1,,`failed <
-')dnl
-ifelse(eval(4<3),0,,`failed <
-')dnl
-ifelse(eval(4>4),0,,`failed >
-')dnl
-ifelse(eval(4>5),0,,`failed >
-')dnl
-ifelse(eval(4>3),1,,`failed >
-')dnl
-ifelse(eval(4<=4),1,,`failed <=
-')dnl
-ifelse(eval(4<=5),1,,`failed <=
-')dnl
-ifelse(eval(4<=3),0,,`failed <=
-')dnl
-ifelse(eval(4>=4),1,,`failed >=
-')dnl
-ifelse(eval(4>=5),0,,`failed >=
-')dnl
-ifelse(eval(4>=3),1,,`failed >=
-')dnl
-dnl next level of precedence
-ifelse(eval(1==1),1,,`failed ==
-')dnl
-ifelse(eval(1==-1),0,,`failed ==
-')dnl
-ifelse(eval(1!=1),0,,`failed !=
-')dnl
-ifelse(eval(1!=2),1,,`failed !=
-')dnl
-dnl next level of precedence
-ifelse(eval(3&5),1,,`failed &
-')dnl
-ifelse(eval(8&7),0,,`failed &
-')dnl
-dnl next level of precedence
-ifelse(eval(1^1),0,,`failed ^
-')dnl
-ifelse(eval(21^5),16,,`failed ^
-')dnl
-dnl next level of precedence
-ifelse(eval(1|1),1,,`failed |
-')dnl
-ifelse(eval(21|5),21,,`failed |
-')dnl
-ifelse(eval(100|1),101,,`failed |
-')dnl
-dnl next level of precedence
-ifelse(eval(1&&1),1,,`failed &&
-')dnl
-ifelse(eval(0&&1),0,,`failed &&
-')dnl
-ifelse(eval(1&&0),0,,`failed &&
-')dnl
-ifelse(SHORTCIRCUIT,`yes',`ifelse(eval(0&&10/0),0,,`failed && shortcircuit
-')')dnl
-dnl next level of precedence
-ifelse(eval(1||1),1,,`failed ||
-')dnl
-ifelse(eval(1||0),1,,`failed ||
-')dnl
-ifelse(eval(0||0),0,,`failed ||
-')dnl
-ifelse(SHORTCIRCUIT,`yes',`ifelse(eval(1||10/0),1,,`failed || shortcircuit
-')')dnl
-dnl next level of precedence
-ifelse(eval(0 ? 2 : 5),5,,`failed ?:
-')dnl
-ifelse(eval(1 ? 2 : 5),2,,`failed ?:
-')dnl
-ifelse(SHORTCIRCUIT,`yes',`ifelse(eval(0 ? 10/0 : 7),7,,`failed ?: shortcircuit
-')')dnl
-ifelse(SHORTCIRCUIT,`yes',`ifelse(eval(1 ? 7 : 10/0),7,,`failed ?: shortcircuit
-')')dnl
-dnl operator precedence
-ifelse(eval(!0*-2),-2,,`precedence wrong, ! *
-')dnl
-ifelse(eval(~8/~2),3,,`precedence wrong ~ /
-')dnl
-ifelse(eval(~-20%7),5,,`precedence wrong ~ %
-')dnl
-ifelse(eval(3*2+100),106,,`precedence wrong * +
-')dnl
-ifelse(eval(3+2*100),203,,`precedence wrong + *
-')dnl
-ifelse(eval(2%5-6/3),0,,`precedence wrong % -
-')dnl
-ifelse(eval(2/5-5%3),-2,,`precedence wrong / -
-')dnl
-ifelse(eval(2+5%5+1),3,,`precedence wrong % +
-')dnl
-ifelse(eval(7+9<<1),32,,`precedence wrong + <<
-')dnl
-ifelse(eval(35-3>>2),8,,`precedence wrong - >>
-')dnl
-ifelse(eval(9<10<<5),1,,`precedence wrong << <
-')dnl
-ifelse(eval(9>10<<5),0,,`precedence wrong << >
-')dnl
-ifelse(eval(32>>2<32),1,,`precedence wrong >> <
-')dnl
-ifelse(eval(9<=10<<5),1,,`precedence wrong << <
-')dnl
-ifelse(eval(5<<1<=20>>1),1,,`precedence wrong << <=
-')dnl
-ifelse(eval(5<<1>=20>>1),1,,`precedence wrong << >=
-')dnl
-ifelse(eval(0<7==5>=5),1,,`precedence wrong < ==
-')dnl
-ifelse(eval(0<7!=5>=5),0,,`precedence wrong < !=
-')dnl
-ifelse(eval(0>7==5>=5),0,,`precedence wrong > ==
-')dnl
-ifelse(eval(0>7!=5>=5),1,,`precedence wrong > !=
-')dnl
-ifelse(eval(1&7==7),1,,`precedence wrong & ==
-')dnl
-ifelse(eval(0&7!=6),0,,`precedence wrong & !=
-')dnl
-ifelse(eval(9&1|5),5,,`precedence wrong & |
-')dnl
-ifelse(eval(9&1^5),4,,`precedence wrong & ^
-')dnl
-ifelse(eval(9^1|5),13,,`precedence wrong ^ |
-')dnl
-ifelse(eval(5|0&&1),1,,`precedence wrong | &&
-')dnl
-ifelse(eval(5&&0||0&&5||5),1,,`precedence wrong && ||
-')dnl
-ifelse(eval(0 || 1 ? 0 : 1),0,,`precedence wrong || ?:
-')dnl
-ifelse(eval(5&&(0||0)&&(5||5)),0,,`precedence wrong || parens
-')dnl
diff --git a/usr.bin/m4/TEST/sqroot.m4 b/usr.bin/m4/TEST/sqroot.m4
deleted file mode 100644
index 6fc8d2c..0000000
--- a/usr.bin/m4/TEST/sqroot.m4
+++ /dev/null
@@ -1,46 +0,0 @@
-# $NetBSD: sqroot.m4,v 1.4 1995/09/28 05:38:01 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# 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. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 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.
-#
-# @(#)sqroot.m4 8.1 (Berkeley) 6/6/93
-#
-
-define(square_root,
- `ifelse(eval($1<0),1,negative-square-root,
- `square_root_aux($1, 1, eval(($1+1)/2))')')
-define(square_root_aux,
- `ifelse($3, $2, $3,
- $3, eval($1/$2), $3,
- `square_root_aux($1, $3, eval(($3+($1/$3))/2))')')
diff --git a/usr.bin/m4/TEST/string.m4 b/usr.bin/m4/TEST/string.m4
deleted file mode 100644
index a14f14a..0000000
--- a/usr.bin/m4/TEST/string.m4
+++ /dev/null
@@ -1,46 +0,0 @@
-# $NetBSD: string.m4,v 1.4 1995/09/28 05:38:03 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# 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. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 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.
-#
-# @(#)string.m4 8.1 (Berkeley) 6/6/93
-#
-
-define(string,`integer $1(len(substr($2,1)))
-str($1,substr($2,1),0)
-data $1(len(substr($2,1)))/EOS/
-')
-
-define(str,`ifelse($2,",,data $1(incr($3))/`LET'substr($2,0,1)/
-`str($1,substr($2,1),incr($3))')')
diff --git a/usr.bin/m4/TEST/test.m4 b/usr.bin/m4/TEST/test.m4
deleted file mode 100644
index 5b19807..0000000
--- a/usr.bin/m4/TEST/test.m4
+++ /dev/null
@@ -1,244 +0,0 @@
-# $NetBSD: test.m4,v 1.4 1995/09/28 05:38:05 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# 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. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 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.
-#
-# @(#)test.m4 8.1 (Berkeley) 6/6/93
-#
-
-# test file for mp (not comprehensive)
-#
-# v7 m4 does not have `decr'.
-#
-define(DECR,`eval($1-1)')
-#
-# include string macros
-#
-include(string.m4)
-#
-# create some fortrash strings for an even uglier language
-#
-string(TEXT, "text")
-string(DATA, "data")
-string(BEGIN, "begin")
-string(END, "end")
-string(IF, "if")
-string(THEN, "then")
-string(ELSE, "else")
-string(CASE, "case")
-string(REPEAT, "repeat")
-string(WHILE, "while")
-string(DEFAULT, "default")
-string(UNTIL, "until")
-string(FUNCTION, "function")
-string(PROCEDURE, "procedure")
-string(EXTERNAL, "external")
-string(FORWARD, "forward")
-string(TYPE, "type")
-string(VAR, "var")
-string(CONST, "const")
-string(PROGRAM, "program")
-string(INPUT, "input")
-string(OUTPUT, "output")
-#
-divert(2)
-diversion #1
-divert(3)
-diversion #2
-divert(4)
-diversion #3
-divert(5)
-diversion #4
-divert(0)
-define(abc,xxx)
-ifdef(`abc',defined,undefined)
-#
-# v7 m4 does this wrong. The right output is
-# this is A vEry lon sEntEnCE
-# see m4 documentation for translit.
-#
-translit(`this is a very long sentence', abcdefg, ABCDEF)
-#
-# include towers-of-hanoi
-#
-include(hanoi.m4)
-#
-# some reasonable set of disks
-#
-hanoi(6)
-#
-# include ackermann's function
-#
-include(ack.m4)
-#
-# something like (3,3) will blow away un*x m4.
-#
-ack(2,3)
-#
-# include a square_root function for fixed nums
-#
-include(sqroot.m4)
-#
-# some square roots.
-#
-square_root(15)
-square_root(100)
-square_root(-4)
-square_root(21372)
-#
-# some textual material for enjoyment.
-#
-[taken from the 'Clemson University Computer Newsletter',
- September 1981, pp. 6-7]
-
-I am a wizard in the magical Kingdom of Transformation and I
-slay dragons for a living. Actually, I am a systems programmer.
-One of the problems with systems programming is explaining to
-non-computer enthusiasts what that is. All of the terms I use to
-describe my job are totally meaningless to them. Usually my response
-to questions about my work is to say as little as possible. For
-instance, if someone asks what happened at work this week, I say
-"Nothing much" and then I change the subject.
-
-With the assistance of my brother, a mechanical engineer, I have devised
-an analogy that everyone can understand. The analogy describes the
-"Kingdom of Transformation" where travelers wander and are magically
-transformed. This kingdom is the computer and the travelers are information.
-The purpose of the computer is to change information to a more meaningful
-forma. The law of conservation applies here: The computer never creates
-and never intentionally destroys data. With no further ado, let us travel
-to the Kingdom of Transformation:
-
-In a land far, far away, there is a magical kingdom called the Kingdom of
-Transformation. A king rules over this land and employs a Council of
-Wizardry. The main purpose of this kingdom is to provide a way for
-neighboring kingdoms to transform citizens into more useful citizens. This
-is done by allowing the citizens to enter the kingdom at one of its ports
-and to travel any of the many routes in the kingdom. They are magically
-transformed along the way. The income of the Kingdom of Transformation
-comes from the many toll roads within its boundaries.
-
-The Kingdom of Transformation was created when several kingdoms got
-together and discovered a mutual need for new talents and abilities for
-citizens. They employed CTK, Inc. (Creators of Transformation, Inc.) to
-create this kingdom. CTK designed the country, its transportation routes,
-and its laws of transformation, and created the major highway system.
-
-Hazards
-=======
-
-Because magic is not truly controllable, CTK invariably, but unknowingly,
-creates dragons. Dragons are huge fire-breathing beasts which sometimes
-injure or kill travelers. Fortunately, they do not travel, but always
-remain near their den.
-
-Other hazards also exist which are potentially harmful. As the roads
-become older and more weatherbeaten, pot-holes will develop, trees will
-fall on travelers, etc. CTK maintenance men are called to fix these
-problems.
-
-Wizards
-=======
-
-The wizards play a major role in creating and maintaining the kingdom but
-get little credit for their work because it is performed secretly. The
-wizards do not wan the workers or travelers to learn their incantations
-because many laws would be broken and chaos would result.
-
-CTK's grand design is always general enough to be applicable in many
-different situations. As a result, it is often difficult to use. The
-first duty of the wizards is to tailor the transformation laws so as to be
-more beneficial and easier to use in their particular environment.
-
-After creation of the kingdom, a major duty of the wizards is to search for
-and kill dragons. If travelers do not return on time or if they return
-injured, the ruler of the country contacts the wizards. If the wizards
-determine that the injury or death occurred due to the traveler's
-negligence, they provide the traveler's country with additional warnings.
-If not, they must determine if the cause was a road hazard or a dragon. If
-the suspect a road hazard, they call in a CTK maintenance man to locate the
-hazard and to eliminate it, as in repairing the pothole in the road. If
-they think that cause was a dragon, then they must find and slay it.
-
-The most difficult part of eliminating a dragon is finding it. Sometimes
-the wizard magically knows where the dragon's lair it, but often the wizard
-must send another traveler along the same route and watch to see where he
-disappears. This sounds like a failsafe method for finding dragons (and a
-suicide mission for thr traveler) but the second traveler does not always
-disappear. Some dragons eat any traveler who comes too close; others are
-very picky.
-
-The wizards may call in CTK who designed the highway system and
-transformation laws to help devise a way to locate the dragon. CTK also
-helps provide the right spell or incantation to slay the dragon. (There is
-no general spell to slay dragons; each dragon must be eliminated with a
-different spell.)
-
-Because neither CTK nor wizards are perfect, spells to not always work
-correctly. At best, nothing happens when the wrong spell is uttered. At
-worst, the dragon becomes a much larger dragon or multiplies into several
-smaller ones. In either case, new spells must be found.
-
-If all existing dragons are quiet (i.e. have eaten sufficiently), wizards
-have time to do other things. They hide in castles and practice spells and
-incatations. They also devise shortcuts for travelers and new laws of
-transformation.
-
-Changes in the Kingdom
-======================
-
-As new transformation kingdoms are created and old ones are maintained,
-CTK, Inc. is constantly learning new things. It learns ways to avoid
-creating some of the dragons that they have previously created. It also
-discovers new and better laws of transformation. As a result, CTK will
-periodically create a new grand design which is far better than the old.
-The wizards determine when is a good time to implement this new design.
-This is when the tourist season is slow or when no important travelers
-(VIPs) are to arrive. The kingdom must be closed for the actual
-implementation and is leter reopened as a new and better place to go.
-
-A final question you might ask is what happens when the number of tourists
-becomes too great for the kingdom to handle in a reasonable period of time
-(i.e., the tourist lines at the ports are too long). The Kingdom of
-Transformation has three options: (1) shorten the paths that a tourist must
-travel, or (2) convince CTK to develop a faster breed of horses so that the
-travelers can finish sooner, or (3) annex more territories so that the
-kingdom can handle more travelers.
-
-Thus ends the story of the Kingdom of Transformation. I hope this has
-explained my job to you: I slay dragons for a living.
-
-#
-#should do an automatic undivert..
-#
diff --git a/usr.bin/m4/eval.c b/usr.bin/m4/eval.c
deleted file mode 100644
index 94150b1..0000000
--- a/usr.bin/m4/eval.c
+++ /dev/null
@@ -1,1053 +0,0 @@
-/* $OpenBSD: eval.c,v 1.66 2008/08/21 21:01:47 espie Exp $ */
-/* $NetBSD: eval.c,v 1.27 2018/07/30 22:58:09 kre Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * 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.
- */
-
-/*
- * eval.c
- * Facility: m4 macro processor
- * by: oz
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: eval.c,v 1.27 2018/07/30 22:58:09 kre Exp $");
-
-#include <sys/types.h>
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-#include <inttypes.h>
-#include <fcntl.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-#include "pathnames.h"
-
-static void dodefn(const char *);
-static void dopushdef(const char *, const char *);
-static void dodump(const char *[], int);
-static void dotrace(const char *[], int, int);
-static void doifelse(const char *[], int);
-static int doincl(const char *);
-static int dopaste(const char *);
-static void dochq(const char *[], int);
-static void dochc(const char *[], int);
-static void dom4wrap(const char *);
-static void dodiv(int);
-static void doundiv(const char *[], int);
-static void dosub(const char *[], int);
-static void map(char *, const char *, const char *, const char *);
-static const char *handledash(char *, char *, const char *);
-static void expand_builtin(const char *[], int, int);
-static void expand_macro(const char *[], int);
-static void dump_one_def(const char *, struct macro_definition *);
-
-unsigned long expansion_id;
-
-/*
- * eval - eval all macros and builtins calls
- * argc - number of elements in argv.
- * argv - element vector :
- * argv[0] = definition of a user
- * macro or NULL if built-in.
- * argv[1] = name of the macro or
- * built-in.
- * argv[2] = parameters to user-defined
- * . macro or built-in.
- * .
- *
- * A call in the form of macro-or-builtin() will result in:
- * argv[0] = nullstr
- * argv[1] = macro-or-builtin
- * argv[2] = nullstr
- *
- * argc is 3 for macro-or-builtin() and 2 for macro-or-builtin
- */
-void
-eval(const char *argv[], int argc, int td, int is_traced)
-{
- size_t mark = SIZE_MAX;
-
- expansion_id++;
- if (td & RECDEF)
- m4errx(1, "expanding recursive definition for %s.", argv[1]);
- if (is_traced)
- mark = trace(argv, argc, infile+ilevel);
- if (td == MACRTYPE)
- expand_macro(argv, argc);
- else
- expand_builtin(argv, argc, td);
- if (mark != SIZE_MAX)
- finish_trace(mark);
-}
-
-/*
- * expand_builtin - evaluate built-in macros.
- */
-void
-expand_builtin(const char *argv[], int argc, int td)
-{
- int c, n;
- int ac;
- static int sysval = 0;
-
-#ifdef DEBUG
- printf("argc = %d\n", argc);
- for (n = 0; n < argc; n++)
- printf("argv[%d] = %s\n", n, argv[n]);
- fflush(stdout);
-#endif
-
- /*
- * if argc == 3 and argv[2] is null, then we
- * have macro-or-builtin() type call. We adjust
- * argc to avoid further checking..
- */
- /* we keep the initial value for those built-ins that differentiate
- * between builtin() and builtin.
- */
- ac = argc;
-
- if (argc == 3 && !*(argv[2]) && !mimic_gnu)
- argc--;
-
- switch (td & TYPEMASK) {
-
- case DEFITYPE:
- if (argc > 2)
- dodefine(argv[2], (argc > 3) ? argv[3] : null);
- break;
-
- case PUSDTYPE:
- if (argc > 2)
- dopushdef(argv[2], (argc > 3) ? argv[3] : null);
- break;
-
- case DUMPTYPE:
- dodump(argv, argc);
- break;
-
- case TRACEONTYPE:
- dotrace(argv, argc, 1);
- break;
-
- case TRACEOFFTYPE:
- dotrace(argv, argc, 0);
- break;
-
- case EXPRTYPE:
- /*
- * doexpr - evaluate arithmetic
- * expression
- */
- {
- int base = 10;
- int maxdigits = 0;
- int e;
-
- if (argc > 3) {
- base = strtoi(argv[3], NULL, 0, 2, 36, &e);
- if (e) {
- m4errx(1, "expr: base %s invalid.", argv[3]);
- }
- }
- if (argc > 4) {
- maxdigits = strtoi(argv[4], NULL, 0, 0, INT_MAX, &e);
- if (e) {
- m4errx(1, "expr: maxdigits %s invalid.", argv[4]);
- }
- }
- if (argc > 2)
- pbnumbase(expr(argv[2]), base, maxdigits);
- break;
- }
-
- case IFELTYPE:
- if (argc > 4)
- doifelse(argv, argc);
- break;
-
- case IFDFTYPE:
- /*
- * doifdef - select one of two
- * alternatives based on the existence of
- * another definition
- */
- if (argc > 3) {
- if (lookup_macro_definition(argv[2]) != NULL)
- pbstr(argv[3]);
- else if (argc > 4)
- pbstr(argv[4]);
- }
- break;
-
- case LENGTYPE:
- /*
- * dolen - find the length of the
- * argument
- */
- pbnum((argc > 2) ? strlen(argv[2]) : 0);
- break;
-
- case INCRTYPE:
- /*
- * doincr - increment the value of the
- * argument
- */
- if (argc > 2)
- pbnum(atoi(argv[2]) + 1);
- break;
-
- case DECRTYPE:
- /*
- * dodecr - decrement the value of the
- * argument
- */
- if (argc > 2)
- pbnum(atoi(argv[2]) - 1);
- break;
-
- case SYSCTYPE:
- /*
- * dosys - execute system command
- */
- if (argc > 2) {
- fflush(stdout);
- sysval = system(argv[2]);
- }
- break;
-
- case SYSVTYPE:
- /*
- * dosysval - return value of the last
- * system call.
- *
- */
- pbnum(sysval);
- break;
-
- case ESYSCMDTYPE:
- if (argc > 2)
- doesyscmd(argv[2]);
- break;
- case INCLTYPE:
- if (argc > 2)
- if (!doincl(argv[2]))
- err(1, "%s at line %lu: include(%s)",
- CURRENT_NAME, CURRENT_LINE, argv[2]);
- break;
-
- case SINCTYPE:
- if (argc > 2)
- (void) doincl(argv[2]);
- break;
-#ifdef EXTENDED
- case PASTTYPE:
- if (argc > 2)
- if (!dopaste(argv[2]))
- err(1, "%s at line %lu: paste(%s)",
- CURRENT_NAME, CURRENT_LINE, argv[2]);
- break;
-
- case SPASTYPE:
- if (argc > 2)
- (void) dopaste(argv[2]);
- break;
- case FORMATTYPE:
- doformat(argv, argc);
- break;
-#endif
- case CHNQTYPE:
- dochq(argv, ac);
- break;
-
- case CHNCTYPE:
- dochc(argv, argc);
- break;
-
- case SUBSTYPE:
- /*
- * dosub - select substring
- *
- */
- if (argc > 3)
- dosub(argv, argc);
- break;
-
- case SHIFTYPE:
- /*
- * doshift - push back all arguments
- * except the first one (i.e. skip
- * argv[2])
- */
- if (argc > 3) {
- for (n = argc - 1; n > 3; n--) {
- pbstr(rquote);
- pbstr(argv[n]);
- pbstr(lquote);
- pushback(COMMA);
- }
- pbstr(rquote);
- pbstr(argv[3]);
- pbstr(lquote);
- }
- break;
-
- case DIVRTYPE:
- if (argc > 2 && (n = atoi(argv[2])) != 0)
- dodiv(n);
- else {
- active = stdout;
- oindex = 0;
- }
- break;
-
- case UNDVTYPE:
- doundiv(argv, argc);
- break;
-
- case DIVNTYPE:
- /*
- * dodivnum - return the number of
- * current output diversion
- */
- pbnum(oindex);
- break;
-
- case UNDFTYPE:
- /*
- * doundefine - undefine a previously
- * defined macro(s) or m4 keyword(s).
- */
- if (argc > 2)
- for (n = 2; n < argc; n++)
- macro_undefine(argv[n]);
- break;
-
- case POPDTYPE:
- /*
- * dopopdef - remove the topmost
- * definitions of macro(s) or m4
- * keyword(s).
- */
- if (argc > 2)
- for (n = 2; n < argc; n++)
- macro_popdef(argv[n]);
- break;
-
- case MKTMTYPE:
- /*
- * dotemp - create a temporary file
- */
- if (argc > 2) {
- int fd;
- char *temp;
-
- temp = xstrdup(argv[2]);
-
- fd = mkstemp(temp);
- if (fd == -1)
- err(1,
- "%s at line %lu: couldn't make temp file %s",
- CURRENT_NAME, CURRENT_LINE, argv[2]);
- close(fd);
- pbstr(temp);
- free(temp);
- }
- break;
-
- case TRNLTYPE:
- /*
- * dotranslit - replace all characters in
- * the source string that appears in the
- * "from" string with the corresponding
- * characters in the "to" string.
- */
- if (argc > 3) {
- char *temp;
-
- temp = xalloc(strlen(argv[2])+1, NULL);
- if (argc > 4)
- map(temp, argv[2], argv[3], argv[4]);
- else
- map(temp, argv[2], argv[3], null);
- pbstr(temp);
- free(temp);
- } else if (argc > 2)
- pbstr(argv[2]);
- break;
-
- case INDXTYPE:
- /*
- * doindex - find the index of the second
- * argument string in the first argument
- * string. -1 if not present.
- */
- pbnum((argc > 3) ? indx(argv[2], argv[3]) : -1);
- break;
-
- case ERRPTYPE:
- /*
- * doerrp - print the arguments to stderr
- * file
- */
- if (argc > 2) {
- for (n = 2; n < argc; n++)
- fprintf(stderr, "%s%s",
- mimic_gnu && n == 2 ? "" : " ",
- argv[n]);
- if (!mimic_gnu)
- fprintf(stderr, "\n");
- }
- break;
-
- case DNLNTYPE:
- /*
- * dodnl - eat-up-to and including
- * newline
- */
- while ((c = gpbc()) != '\n' && c != EOF)
- ;
- break;
-
- case M4WRTYPE:
- /*
- * dom4wrap - set up for
- * wrap-up/wind-down activity
- */
- if (argc > 2)
- dom4wrap(argv[2]);
- break;
-
- case EXITTYPE:
- /*
- * doexit - immediate exit from m4.
- */
- killdiv();
- exit((argc > 2) ? atoi(argv[2]) : 0);
- break;
-
- case DEFNTYPE:
- if (argc > 2)
- for (n = 2; n < argc; n++)
- dodefn(argv[n]);
- break;
-
- case INDIRTYPE: /* Indirect call */
- if (argc > 2)
- doindir(argv, argc);
- break;
-
- case BUILTINTYPE: /* Builtins only */
- if (argc > 2)
- dobuiltin(argv, argc);
- break;
-
- case PATSTYPE:
- if (argc > 2)
- dopatsubst(argv, argc);
- break;
- case REGEXPTYPE:
- if (argc > 2)
- doregexp(argv, argc);
- break;
- case LINETYPE:
- doprintlineno(infile+ilevel);
- break;
- case FILENAMETYPE:
- doprintfilename(infile+ilevel);
- break;
- case SELFTYPE:
- pbstr(rquote);
- pbstr(argv[1]);
- pbstr(lquote);
- break;
- default:
- m4errx(1, "eval: major botch.");
- break;
- }
-}
-
-/*
- * expand_macro - user-defined macro expansion
- */
-void
-expand_macro(const char *argv[], int argc)
-{
- const char *t;
- const char *p;
- int n;
- int argno;
-
- t = argv[0]; /* defn string as a whole */
- p = t;
- while (*p)
- p++;
- p--; /* last character of defn */
- while (p > t) {
- if (*(p - 1) != ARGFLAG)
- PUSHBACK(*p);
- else {
- switch (*p) {
-
- case '#':
- pbnum(argc - 2);
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- argno = *p - '0';
- if (mimic_gnu) {
- const unsigned char *q =
- (const unsigned char *)p;
- while (isdigit(*++q)) {
- bp--;
- argno = argno * 10 + *q - '0';
- }
- }
- if (argno < argc - 1)
- pbstr(argv[argno + 1]);
- break;
- case '*':
- if (argc > 2) {
- for (n = argc - 1; n > 2; n--) {
- pbstr(argv[n]);
- pushback(COMMA);
- }
- pbstr(argv[2]);
- }
- break;
- case '@':
- if (argc > 2) {
- for (n = argc - 1; n > 2; n--) {
- pbstr(rquote);
- pbstr(argv[n]);
- pbstr(lquote);
- pushback(COMMA);
- }
- pbstr(rquote);
- pbstr(argv[2]);
- pbstr(lquote);
- }
- break;
- default:
- PUSHBACK(*p);
- PUSHBACK('$');
- break;
- }
- p--;
- }
- p--;
- }
- if (p == t) /* do last character */
- PUSHBACK(*p);
-}
-
-
-/*
- * dodefine - install definition in the table
- */
-void
-dodefine(const char *name, const char *defn)
-{
- if (!*name && !mimic_gnu)
- m4errx(1, "null definition.");
- else
- macro_define(name, defn);
-}
-
-/*
- * dodefn - push back a quoted definition of
- * the given name.
- */
-static void
-dodefn(const char *name)
-{
- struct macro_definition *p;
-
- if ((p = lookup_macro_definition(name)) != NULL) {
- if ((p->type & TYPEMASK) == MACRTYPE) {
- pbstr(rquote);
- pbstr(p->defn);
- pbstr(lquote);
- } else {
- pbstr(p->defn);
- pbstr(BUILTIN_MARKER);
- }
- }
-}
-
-/*
- * dopushdef - install a definition in the hash table
- * without removing a previous definition. Since
- * each new entry is entered in *front* of the
- * hash bucket, it hides a previous definition from
- * lookup.
- */
-static void
-dopushdef(const char *name, const char *defn)
-{
- if (!*name && !mimic_gnu)
- m4errx(1, "null definition.");
- else
- macro_pushdef(name, defn);
-}
-
-/*
- * dump_one_def - dump the specified definition.
- */
-static void
-dump_one_def(const char *name, struct macro_definition *p)
-{
- if (!traceout)
- traceout = stderr;
- if (mimic_gnu) {
- if ((p->type & TYPEMASK) == MACRTYPE)
- fprintf(traceout, "%s:\t%s\n", name, p->defn);
- else {
- fprintf(traceout, "%s:\t<%s>\n", name, p->defn);
- }
- } else
- fprintf(traceout, "`%s'\t`%s'\n", name, p->defn);
-}
-
-/*
- * dodumpdef - dump the specified definitions in the hash
- * table to stderr. If nothing is specified, the entire
- * hash table is dumped.
- */
-static void
-dodump(const char *argv[], int argc)
-{
- int n;
- struct macro_definition *p;
-
- if (argc > 2) {
- for (n = 2; n < argc; n++)
- if ((p = lookup_macro_definition(argv[n])) != NULL)
- dump_one_def(argv[n], p);
- } else
- macro_for_all(dump_one_def);
-}
-
-/*
- * dotrace - mark some macros as traced/untraced depending upon on.
- */
-static void
-dotrace(const char *argv[], int argc, int on)
-{
- int n;
-
- if (argc > 2) {
- for (n = 2; n < argc; n++)
- mark_traced(argv[n], on);
- } else
- mark_traced(NULL, on);
-}
-
-/*
- * doifelse - select one of two alternatives - loop.
- */
-static void
-doifelse(const char *argv[], int argc)
-{
- cycle {
- if (argc < 5)
- m4errx(1, "wrong number of args for ifelse");
- if (STREQ(argv[2], argv[3]))
- pbstr(argv[4]);
- else if (argc == 6)
- pbstr(argv[5]);
- else if (argc > 6) {
- argv += 3;
- argc -= 3;
- continue;
- }
- break;
- }
-}
-
-/*
- * doinclude - include a given file.
- */
-static int
-doincl(const char *ifile)
-{
-#ifndef REAL_FREEZE
- if (thawing)
- return 1;
-#endif
- if (ilevel + 1 == MAXINP)
- m4errx(1, "too many include files.");
- if (fopen_trypath(infile+ilevel+1, ifile) != NULL) {
- ilevel++;
- bbase[ilevel] = bufbase = bp;
- return (1);
- } else
- return (0);
-}
-
-#ifdef EXTENDED
-/*
- * dopaste - include a given file without any
- * macro processing.
- */
-static int
-dopaste(const char *pfile)
-{
- FILE *pf;
- int c;
-
- if ((pf = fopen(pfile, "r")) != NULL) {
- if (synch_lines)
- fprintf(active, "#line 1 \"%s\"\n", pfile);
- while ((c = getc(pf)) != EOF)
- putc(c, active);
- (void) fclose(pf);
- emit_synchline();
- return (1);
- } else
- return (0);
-}
-#endif
-
-/*
- * dochq - change quote characters
- */
-static void
-dochq(const char *argv[], int ac)
-{
- if (ac == 2) {
- lquote[0] = LQUOTE; lquote[1] = EOS;
- rquote[0] = RQUOTE; rquote[1] = EOS;
- } else {
- strlcpy(lquote, argv[2], sizeof(lquote));
- if (ac > 3) {
- strlcpy(rquote, argv[3], sizeof(rquote));
- } else {
- rquote[0] = ECOMMT; rquote[1] = EOS;
- }
- }
-}
-
-/*
- * dochc - change comment characters
- */
-static void
-dochc(const char *argv[], int argc)
-{
-/* XXX Note that there is no difference between no argument and a single
- * empty argument.
- */
- if (argc == 2) {
- scommt[0] = EOS;
- ecommt[0] = EOS;
- } else {
- strlcpy(scommt, argv[2], sizeof(scommt));
- if (argc == 3) {
- ecommt[0] = ECOMMT; ecommt[1] = EOS;
- } else {
- strlcpy(ecommt, argv[3], sizeof(ecommt));
- }
- }
-}
-
-/*
- * dom4wrap - expand text at EOF
- */
-static void
-dom4wrap(const char *text)
-{
- if (wrapindex >= maxwraps) {
- if (maxwraps == 0)
- maxwraps = 16;
- else
- maxwraps *= 2;
- m4wraps = xrealloc(m4wraps, maxwraps * sizeof(*m4wraps),
- "too many m4wraps");
- }
- m4wraps[wrapindex++] = xstrdup(text);
-}
-
-/*
- * dodivert - divert the output to a temporary file
- */
-static void
-dodiv(int n)
-{
- int fd;
-
- oindex = n;
- if (n >= maxout) {
- if (mimic_gnu)
- resizedivs(n + 10);
- else
- n = 0; /* bitbucket */
- }
-
- if (n < 0)
- n = 0; /* bitbucket */
- if (outfile[n] == NULL) {
- char fname[] = _PATH_DIVNAME;
-
- if ((fd = mkstemp(fname)) < 0 ||
- (outfile[n] = fdopen(fd, "w+")) == NULL)
- err(1, "%s: cannot divert", fname);
- if (unlink(fname) == -1)
- err(1, "%s: cannot unlink", fname);
- }
- active = outfile[n];
-}
-
-/*
- * doundivert - undivert a specified output, or all
- * other outputs, in numerical order.
- */
-static void
-doundiv(const char *argv[], int argc)
-{
- int ind;
- int n;
-
- if (argc > 2) {
- for (ind = 2; ind < argc; ind++) {
- int e;
- n = strtoi(argv[ind], NULL, 0, 1, INT_MAX, &e);
- if (e) {
- if (errno == EINVAL && mimic_gnu)
- getdivfile(argv[ind]);
- } else {
- if (n < maxout && outfile[n] != NULL)
- getdiv(n);
- }
- }
- }
- else
- for (n = 1; n < maxout; n++)
- if (outfile[n] != NULL)
- getdiv(n);
-}
-
-/*
- * dosub - select substring
- */
-static void
-dosub(const char *argv[], int argc)
-{
- const char *ap, *fc, *k;
- int nc;
-
- ap = argv[2]; /* target string */
-#ifdef EXPR
- fc = ap + expr(argv[3]); /* first char */
-#else
- fc = ap + atoi(argv[3]); /* first char */
-#endif
- nc = strlen(fc);
- if (argc >= 5)
-#ifdef EXPR
- nc = min(nc, expr(argv[4]));
-#else
- nc = min(nc, atoi(argv[4]));
-#endif
- if (fc >= ap && fc < ap + strlen(ap))
- for (k = fc + nc - 1; k >= fc; k--)
- pushback(*k);
-}
-
-/*
- * map:
- * map every character of s1 that is specified in from
- * into s3 and replace in s. (source s1 remains untouched)
- *
- * This is a standard implementation of map(s,from,to) function of ICON
- * language. Within mapvec, we replace every character of "from" with
- * the corresponding character in "to". If "to" is shorter than "from",
- * than the corresponding entries are null, which means that those
- * characters dissapear altogether. Furthermore, imagine
- * map(dest, "sourcestring", "srtin", "rn..*") type call. In this case,
- * `s' maps to `r', `r' maps to `n' and `n' maps to `*'. Thus, `s'
- * ultimately maps to `*'. In order to achieve this effect in an efficient
- * manner (i.e. without multiple passes over the destination string), we
- * loop over mapvec, starting with the initial source character. if the
- * character value (dch) in this location is different than the source
- * character (sch), sch becomes dch, once again to index into mapvec, until
- * the character value stabilizes (i.e. sch = dch, in other words
- * mapvec[n] == n). Even if the entry in the mapvec is null for an ordinary
- * character, it will stabilize, since mapvec[0] == 0 at all times. At the
- * end, we restore mapvec* back to normal where mapvec[n] == n for
- * 0 <= n <= 127. This strategy, along with the restoration of mapvec, is
- * about 5 times faster than any algorithm that makes multiple passes over
- * destination string.
- */
-static void
-map(char *dest, const char *src, const char *from, const char *to)
-{
- const char *tmp;
- unsigned char sch, dch;
- unsigned char found[256];
- static char frombis[257];
- static char tobis[257];
- static unsigned char mapvec[256] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
- 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
- 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
- 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
- 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
- 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
- 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180,
- 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193,
- 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
- 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
- 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
- 246, 247, 248, 249, 250, 251, 252, 253, 254, 255
- };
-
- if (*src) {
- if (mimic_gnu) {
- /*
- * expand character ranges on the fly
- */
- from = handledash(frombis, frombis + 256, from);
- to = handledash(tobis, tobis + 256, to);
- }
- tmp = from;
- /*
- * create a mapping between "from" and
- * "to"
- */
- memset(found, 0, sizeof(found));
- for (; (sch = (unsigned char)*from) != '\0'; from++) {
- if (!mimic_gnu || !found[sch]) {
- found[sch] = 1;
- mapvec[sch] = *to;
- }
- if (*to)
- to++;
- }
-
- if (mimic_gnu) {
- for (; (sch = (unsigned char)*src) != '\0'; src++) {
- if (!found[sch])
- *dest++ = sch;
- else if ((dch = mapvec[sch]) != '\0')
- *dest++ = dch;
- }
- } else {
- while (*src) {
- sch = (unsigned char)(*src++);
- dch = mapvec[sch];
- while (dch != sch) {
- sch = dch;
- dch = mapvec[sch];
- }
- if ((*dest = (char)dch))
- dest++;
- }
- }
- /*
- * restore all the changed characters
- */
- while (*tmp) {
- mapvec[(unsigned char)(*tmp)] = (unsigned char)(*tmp);
- tmp++;
- }
- }
- *dest = '\0';
-}
-
-
-/*
- * handledash:
- * use buffer to copy the src string, expanding character ranges
- * on the way.
- */
-static const char *
-handledash(char *buffer, char *end, const char *src)
-{
- char *p;
-
- p = buffer;
- while(*src) {
- if (src[1] == '-' && src[2]) {
- unsigned char i;
- if ((unsigned char)src[0] <= (unsigned char)src[2]) {
- for (i = (unsigned char)src[0];
- i <= (unsigned char)src[2]; i++) {
- *p++ = i;
- if (p == end) {
- *p = '\0';
- return buffer;
- }
- }
- } else {
- for (i = (unsigned char)src[0];
- i >= (unsigned char)src[2]; i--) {
- *p++ = i;
- if (p == end) {
- *p = '\0';
- return buffer;
- }
- }
- }
- src += 3;
- } else
- *p++ = *src++;
- if (p == end)
- break;
- }
- *p = '\0';
- return buffer;
-}
diff --git a/usr.bin/m4/expr.c b/usr.bin/m4/expr.c
deleted file mode 100644
index a6c901f..0000000
--- a/usr.bin/m4/expr.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $NetBSD: expr.c,v 1.19 2009/10/26 21:11:28 christos Exp $ */
-/* $OpenBSD: expr.c,v 1.17 2006/01/20 23:10:19 espie Exp $ */
-/*
- * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: expr.c,v 1.19 2009/10/26 21:11:28 christos Exp $");
-#include <stdint.h>
-#include <stdio.h>
-#include <stddef.h>
-#include "mdef.h"
-#include "extern.h"
-
-int32_t end_result;
-const char *copy_toeval;
-
-extern void yy_scan_string(const char *);
-extern int yyparse(void);
-extern int yyerror(const char *);
-
-int
-yyerror(const char *msg)
-{
- fprintf(stderr, "m4: %s in expr %s\n", msg, copy_toeval);
- return(0);
-}
-
-int
-expr(const char *toeval)
-{
- copy_toeval = toeval;
- yy_scan_string(toeval);
- yyparse();
- return end_result;
-}
diff --git a/usr.bin/m4/extern.h b/usr.bin/m4/extern.h
deleted file mode 100644
index 1cb9de1..0000000
--- a/usr.bin/m4/extern.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/* $OpenBSD: extern.h,v 1.49 2009/10/14 17:19:47 sthen Exp $ */
-/* $NetBSD: extern.h,v 1.19 2016/01/16 18:30:57 christos Exp $ */
-
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * 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.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- */
-
-/* eval.c */
-extern void eval(const char *[], int, int, int);
-extern void dodefine(const char *, const char *);
-extern unsigned long expansion_id;
-
-/* expr.c */
-extern int expr(const char *);
-
-/* gnum4.c */
-extern void addtoincludepath(const char *);
-extern struct input_file *fopen_trypath(struct input_file *, const char *);
-extern void doindir(const char *[], int);
-extern void dobuiltin(const char *[], int);
-extern void dopatsubst(const char *[], int);
-extern void doregexp(const char *[], int);
-
-extern void doprintlineno(struct input_file *);
-extern void doprintfilename(struct input_file *);
-
-extern void doesyscmd(const char *);
-extern void getdivfile(const char *);
-extern void doformat(const char *[], int);
-#ifdef REAL_FREEZE
-extern void freeze_state(const char *);
-extern void thaw_state(const char *);
-#endif
-
-
-/* look.c */
-
-#define FLAG_UNTRACED 0
-#define FLAG_TRACED 1
-#define FLAG_NO_TRACE 2
-
-extern void init_macros(void);
-extern ndptr lookup(const char *);
-extern void mark_traced(const char *, int);
-extern struct ohash macros;
-
-extern struct macro_definition *lookup_macro_definition(const char *);
-extern void macro_define(const char *, const char *);
-extern void macro_pushdef(const char *, const char *);
-extern void macro_popdef(const char *);
-extern void macro_undefine(const char *);
-extern void setup_builtin(const char *, unsigned int);
-extern void macro_for_all(void (*)(const char *, struct macro_definition *));
-#define macro_getdef(p) ((p)->d)
-#define macro_name(p) ((p)->name)
-#define macro_builtin_type(p) ((p)->builtin_type)
-#define is_traced(p) ((p)->trace_flags == FLAG_NO_TRACE ? (trace_flags & TRACE_ALL) : (p)->trace_flags)
-
-extern ndptr macro_getbuiltin(const char *);
-#ifdef REAL_FREEZE
-extern void dump_state(FILE *);
-extern void restore_state(FILE *);
-#endif
-
-/* main.c */
-extern void outputstr(const char *);
-extern void do_emit_synchline(void);
-#define emit_synchline() do { if (synch_lines) do_emit_synchline(); } while(0)
-
-/* misc.c */
-extern void chrsave(int);
-extern char *compute_prevep(void);
-extern void getdiv(int);
-extern ptrdiff_t indx(const char *, const char *);
-extern void initspaces(void);
-extern void killdiv(void);
-extern void pbnum(int);
-extern void pbnumbase(int, int, int);
-extern void pbunsigned(unsigned long);
-extern void pbstr(const char *);
-extern void pushback(int);
-extern void *xalloc(size_t, const char *fmt, ...) __printflike(2, 3);
-extern void *xrealloc(void *, size_t, const char *fmt, ...)
- __printflike(3, 4);
-extern char *xstrdup(const char *);
-extern void resizedivs(int);
-extern size_t buffer_mark(void);
-extern void dump_buffer(FILE *, size_t);
-extern void __dead m4errx(int, const char *, ...) __printflike(2, 3);
-
-extern int obtain_char(struct input_file *);
-extern void set_input(struct input_file *, FILE *, const char *);
-extern void release_input(struct input_file *);
-
-/* speeded-up versions of chrsave/pushback */
-#define PUSHBACK(c) \
- do { \
- if (bp >= endpbb) \
- enlarge_bufspace(); \
- *bp++ = (c); \
- } while(0)
-
-#define CHRSAVE(c) \
- do { \
- if (ep >= endest) \
- enlarge_strspace(); \
- *ep++ = (c); \
- } while(0)
-
-/* and corresponding exposure for local symbols */
-extern void enlarge_bufspace(void);
-extern void enlarge_strspace(void);
-extern unsigned char *endpbb;
-extern char *endest;
-
-/* trace.c */
-extern unsigned int trace_flags;
-#define TRACE_ALL 512
-extern void trace_file(const char *);
-extern size_t trace(const char **, int, struct input_file *);
-extern void finish_trace(size_t);
-extern void set_trace_flags(const char *);
-extern FILE *traceout;
-
-extern ndptr hashtab[]; /* hash table for macros etc. */
-extern stae *mstack; /* stack of m4 machine */
-extern char *sstack; /* shadow stack, for string space extension */
-extern FILE *active; /* active output file pointer */
-extern struct input_file infile[];/* input file stack (0=stdin) */
-extern FILE **outfile; /* diversion array(0=bitbucket) */
-extern int maxout; /* maximum number of diversions */
-extern int fp; /* m4 call frame pointer */
-extern int ilevel; /* input file stack pointer */
-extern int oindex; /* diversion index. */
-extern int sp; /* current m4 stack pointer */
-extern unsigned char *bp; /* first available character */
-extern unsigned char *buf; /* push-back buffer */
-extern unsigned char *bufbase; /* buffer base for this ilevel */
-extern unsigned char *bbase[]; /* buffer base per ilevel */
-extern char ecommt[MAXCCHARS+1];/* end character for comment */
-extern char *ep; /* first free char in strspace */
-extern char lquote[MAXCCHARS+1];/* left quote character (`) */
-extern char **m4wraps; /* m4wrap string default. */
-extern int maxwraps; /* size of m4wraps array */
-extern int wrapindex; /* current index in m4wraps */
-extern int fatal_warnings; /* exit on warning */
-extern int quiet; /* no warnings */
-extern int nesting_limit; /* macro expansion nesting limit */
-#ifndef REAL_FREEZE
-extern FILE *freezef; /* copy of input */
-extern int thawing; /* don't process includes during thaw */
-#endif
-
-extern const char *null; /* as it says.. just a null. */
-extern char rquote[MAXCCHARS+1];/* right quote character (') */
-extern char scommt[MAXCCHARS+1];/* start character for comment */
-extern int synch_lines; /* line synchronisation directives */
-
-extern int mimic_gnu; /* behaves like gnu-m4 */
-extern int prefix_builtins; /* prefix builtin macros with m4_ */
diff --git a/usr.bin/m4/gnum4.c b/usr.bin/m4/gnum4.c
deleted file mode 100644
index a450a99..0000000
--- a/usr.bin/m4/gnum4.c
+++ /dev/null
@@ -1,817 +0,0 @@
-/* $NetBSD: gnum4.c,v 1.10 2016/01/16 16:59:18 christos Exp $ */
-/* $OpenBSD: gnum4.c,v 1.39 2008/08/21 21:01:04 espie Exp $ */
-
-/*
- * Copyright (c) 1999 Marc Espie
- *
- * 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 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.
- */
-
-/*
- * functions needed to support gnu-m4 extensions, including a fake freezing
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: gnum4.c,v 1.10 2016/01/16 16:59:18 christos Exp $");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <ctype.h>
-#include <err.h>
-#include <paths.h>
-#include <regex.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-
-
-int mimic_gnu = 0;
-#ifndef SIZE_T_MAX
-#define SIZE_T_MAX (size_t)~0ull
-#endif
-
-/*
- * Support for include path search
- * First search in the current directory.
- * If not found, and the path is not absolute, include path kicks in.
- * First, -I options, in the order found on the command line.
- * Then M4PATH env variable
- */
-
-struct path_entry {
- char *name;
- struct path_entry *next;
-} *first, *last;
-
-static struct path_entry *new_path_entry(const char *);
-static void ensure_m4path(void);
-static struct input_file *dopath(struct input_file *, const char *);
-
-static struct path_entry *
-new_path_entry(const char *dirname)
-{
- struct path_entry *n;
-
- n = malloc(sizeof(struct path_entry));
- if (!n)
- errx(1, "out of memory");
- n->name = strdup(dirname);
- if (!n->name)
- errx(1, "out of memory");
- n->next = 0;
- return n;
-}
-
-void
-addtoincludepath(const char *dirname)
-{
- struct path_entry *n;
-
- n = new_path_entry(dirname);
-
- if (last) {
- last->next = n;
- last = n;
- }
- else
- last = first = n;
-}
-
-static void
-ensure_m4path(void)
-{
- static int envpathdone = 0;
- char *envpath;
- char *sweep;
- char *path;
-
- if (envpathdone)
- return;
- envpathdone = TRUE;
- envpath = getenv("M4PATH");
- if (!envpath)
- return;
- /* for portability: getenv result is read-only */
- envpath = strdup(envpath);
- if (!envpath)
- errx(1, "out of memory");
- for (sweep = envpath;
- (path = strsep(&sweep, ":")) != NULL;)
- addtoincludepath(path);
- free(envpath);
-}
-
-static
-struct input_file *
-dopath(struct input_file *i, const char *filename)
-{
- char path[MAXPATHLEN];
- struct path_entry *pe;
- FILE *f;
-
- for (pe = first; pe; pe = pe->next) {
- snprintf(path, sizeof(path), "%s/%s", pe->name, filename);
- if ((f = fopen(path, "r")) != 0) {
- set_input(i, f, path);
- return i;
- }
- }
- return NULL;
-}
-
-struct input_file *
-fopen_trypath(struct input_file *i, const char *filename)
-{
- FILE *f;
-
- f = fopen(filename, "r");
- if (f != NULL) {
- set_input(i, f, filename);
- return i;
- }
- if (filename[0] == '/')
- return NULL;
-
- ensure_m4path();
-
- return dopath(i, filename);
-}
-
-void
-doindir(const char *argv[], int argc)
-{
- ndptr n;
- struct macro_definition *p;
-
- n = lookup(argv[2]);
- if (n == NULL || (p = macro_getdef(n)) == NULL)
- m4errx(1, "indir: undefined macro %s.", argv[2]);
- argv[1] = p->defn;
-
- eval(argv+1, argc-1, p->type, is_traced(n));
-}
-
-void
-dobuiltin(const char *argv[], int argc)
-{
- ndptr p;
-
- argv[1] = NULL;
- p = macro_getbuiltin(argv[2]);
- if (p != NULL)
- eval(argv+1, argc-1, macro_builtin_type(p), is_traced(p));
- else
- m4errx(1, "unknown builtin %s.", argv[2]);
-}
-
-
-/* We need some temporary buffer space, as pb pushes BACK and substitution
- * proceeds forward... */
-static char *buffer;
-static size_t bufsize = 0;
-static size_t current = 0;
-
-static void addchars(const char *, size_t);
-static void addchar(int);
-static char *twiddle(const char *);
-static char *getstring(void);
-static void exit_regerror(int, const char *, regex_t *) __dead;
-static void do_subst(const char *, const char *, regex_t *, const char *,
- regmatch_t *);
-static void do_regexpindex(const char *, const char *, regex_t *, regmatch_t *);
-static void do_regexp(const char *, const char *, regex_t *, const char *, regmatch_t *);
-static void add_sub(size_t, const char *, regex_t *, regmatch_t *);
-static void add_replace(const char *, regex_t *, const char *, regmatch_t *);
-#define addconstantstring(s) addchars((s), sizeof(s)-1)
-
-static void
-addchars(const char *c, size_t n)
-{
- if (n == 0)
- return;
- while (current + n > bufsize) {
- if (bufsize == 0)
- bufsize = 1024;
- else
- bufsize *= 2;
- buffer = xrealloc(buffer, bufsize, NULL);
- }
- memcpy(buffer+current, c, n);
- current += n;
-}
-
-static void
-addchar(int c)
-{
- if (current +1 > bufsize) {
- if (bufsize == 0)
- bufsize = 1024;
- else
- bufsize *= 2;
- buffer = xrealloc(buffer, bufsize, NULL);
- }
- buffer[current++] = c;
-}
-
-static char *
-getstring(void)
-{
- addchar('\0');
- current = 0;
- return buffer;
-}
-
-
-static void
-exit_regerror(int er, const char *pat, regex_t *re)
-{
- size_t errlen;
- char *errbuf;
-
- errlen = regerror(er, re, NULL, 0);
- errbuf = xalloc(errlen,
- "malloc in regerror: %lu", (unsigned long)errlen);
- regerror(er, re, errbuf, errlen);
- m4errx(1, "regular expression error: %s for: `%s'", errbuf, pat);
-}
-
-static void
-add_sub(size_t n, const char *string, regex_t *re, regmatch_t *pm)
-{
- if (n > re->re_nsub) {
- if (!quiet)
- warnx("No subexpression %zu", n);
- if (fatal_warnings)
- exit(EXIT_FAILURE);
- }
- /* Subexpressions that did not match are
- * not an error. */
- else if (pm[n].rm_so != -1 &&
- pm[n].rm_eo != -1) {
- addchars(string + pm[n].rm_so,
- pm[n].rm_eo - pm[n].rm_so);
- }
-}
-
-/* Add replacement string to the output buffer, recognizing special
- * constructs and replacing them with substrings of the original string.
- */
-static void
-add_replace(const char *string, regex_t *re, const char *replace, regmatch_t *pm)
-{
- const char *p;
-
- for (p = replace; *p != '\0'; p++) {
- if (*p == '&' && !mimic_gnu) {
- add_sub(0, string, re, pm);
- continue;
- }
- if (*p == '\\') {
- if (p[1] == '\\') {
- addchar(p[1]);
- p++;
- continue;
- }
- if (p[1] == '&') {
- if (mimic_gnu)
- add_sub(0, string, re, pm);
- else
- addchar(p[1]);
- p++;
- continue;
- }
- if (isdigit((unsigned char)p[1])) {
- add_sub(*(++p) - '0', string, re, pm);
- continue;
- }
- }
- addchar(*p);
- }
-}
-
-static void
-do_subst(const char *pat, const char *string, regex_t *re, const char *replace,
- regmatch_t *pm)
-{
- int error;
- int flags = 0;
- const char *last_match = NULL;
-
- while ((error = regexec(re, string, re->re_nsub+1, pm, flags)) == 0) {
- if (pm[0].rm_eo != 0) {
- if (string[pm[0].rm_eo-1] == '\n')
- flags = 0;
- else
- flags = REG_NOTBOL;
- }
-
- /* NULL length matches are special... We use the `vi-mode'
- * rule: don't allow a NULL-match at the last match
- * position.
- */
- if (pm[0].rm_so == pm[0].rm_eo &&
- string + pm[0].rm_so == last_match) {
- if (*string == '\0')
- return;
- addchar(*string);
- if (*string++ == '\n')
- flags = 0;
- else
- flags = REG_NOTBOL;
- continue;
- }
- last_match = string + pm[0].rm_so;
- addchars(string, pm[0].rm_so);
- add_replace(string, re, replace, pm);
- string += pm[0].rm_eo;
- buffer[current] = '\0';
- }
- while (*string)
- addchar(*string++);
- if (error != REG_NOMATCH)
- exit_regerror(error, pat, re);
- pbstr(string);
-}
-
-static void
-do_regexp(const char *pat, const char *string, regex_t *re, const char *replace,
- regmatch_t *pm)
-{
- int error;
-
- switch(error = regexec(re, string, re->re_nsub+1, pm, 0)) {
- case 0:
- add_replace(string, re, replace, pm);
- pbstr(getstring());
- break;
- case REG_NOMATCH:
- break;
- default:
- exit_regerror(error, pat, re);
- }
-}
-
-static void
-do_regexpindex(const char *pat, const char *string, regex_t *re, regmatch_t *pm)
-{
- int error;
-
- switch(error = regexec(re, string, re->re_nsub+1, pm, 0)) {
- case 0:
- pbunsigned(pm[0].rm_so);
- break;
- case REG_NOMATCH:
- pbnum(-1);
- break;
- default:
- exit_regerror(error, pat, re);
- }
-}
-
-/* In Gnu m4 mode, parentheses for backmatch don't work like POSIX 1003.2
- * says. So we twiddle with the regexp before passing it to regcomp.
- */
-static char *
-twiddle(const char *p)
-{
- /* + at start of regexp is a normal character for Gnu m4 */
- if (*p == '^') {
- addchar(*p);
- p++;
- }
- if (*p == '+') {
- addchar('\\');
- }
- /* This could use strcspn for speed... */
- while (*p != '\0') {
- if (*p == '\\') {
- switch(p[1]) {
- case '(':
- case ')':
- case '|':
- addchar(p[1]);
- break;
- case 'w':
- addconstantstring("[_a-zA-Z0-9]");
- break;
- case 'W':
- addconstantstring("[^_a-zA-Z0-9]");
- break;
- case '<':
- addconstantstring("[[:<:]]");
- break;
- case '>':
- addconstantstring("[[:>:]]");
- break;
- default:
- addchars(p, 2);
- break;
- }
- p+=2;
- continue;
- }
- if (*p == '(' || *p == ')' || *p == '|')
- addchar('\\');
-
- addchar(*p);
- p++;
- }
- return getstring();
-}
-
-static int
-checkempty(const char *argv[], int argc)
-{
- const char *s;
- size_t len;
-
- if (argc != 3 && argv[3][0] != '\0')
- return 0;
-
- if (argc == 3) {
- if (!quiet)
- warnx("Too few arguments to patsubst");
- if (fatal_warnings)
- exit(EXIT_FAILURE);
- }
-
- if (argv[4] && argc > 4)
- len = strlen(argv[4]);
- else
- len = 0;
- for (s = argv[2]; *s != '\0'; s++) {
- addchars(argv[4], len);
- addchar(*s);
- }
- return 1;
-}
-
-/* patsubst(string, regexp, opt replacement) */
-/* argv[2]: string
- * argv[3]: regexp
- * argv[4]: opt rep
- */
-void
-dopatsubst(const char *argv[], int argc)
-{
- if (argc < 3) {
- if (!quiet)
- warnx("Too few arguments to patsubst");
- if (fatal_warnings)
- exit(EXIT_FAILURE);
- return;
- }
- /* special case: empty regexp */
- if (!checkempty(argv, argc)) {
-
- const char *pat;
- int error;
- regex_t re;
- regmatch_t *pmatch;
- int mode = REG_EXTENDED;
- size_t l = strlen(argv[3]);
-
- if (!mimic_gnu ||
- (argv[3][0] == '^') ||
- (l > 0 && argv[3][l-1] == '$'))
- mode |= REG_NEWLINE;
-
- pat = mimic_gnu ? twiddle(argv[3]) : argv[3];
- error = regcomp(&re, pat, mode);
- if (error != 0)
- exit_regerror(error, pat, &re);
-
- pmatch = xalloc(sizeof(regmatch_t) * (re.re_nsub+1), NULL);
- do_subst(pat, argv[2], &re,
- argc > 4 && argv[4] != NULL ? argv[4] : "", pmatch);
- free(pmatch);
- regfree(&re);
- }
- pbstr(getstring());
-}
-
-void
-doregexp(const char *argv[], int argc)
-{
- int error;
- regex_t re;
- regmatch_t *pmatch;
- const char *pat;
-
- if (argc < 3) {
- if (!quiet)
- warnx("Too few arguments to regexp");
- if (fatal_warnings)
- exit(EXIT_FAILURE);
- return;
- }
- if (checkempty(argv, argc)) {
- return;
- }
-
- pat = mimic_gnu ? twiddle(argv[3]) : argv[3];
- error = regcomp(&re, pat, REG_EXTENDED);
- if (error != 0)
- exit_regerror(error, pat, &re);
-
- pmatch = xalloc(sizeof(regmatch_t) * (re.re_nsub+1), NULL);
- if (argv[4] == NULL || argc == 4)
- do_regexpindex(pat, argv[2], &re, pmatch);
- else
- do_regexp(pat, argv[2], &re, argv[4], pmatch);
- free(pmatch);
- regfree(&re);
-}
-
-void
-doformat(const char *argv[], int argc)
-{
- const char *format = argv[2];
- int pos = 3;
- int left_padded;
- long width;
- size_t l;
- const char *thisarg;
- char temp[2];
- size_t extra;
-
- while (*format != 0) {
- if (*format != '%') {
- addchar(*format++);
- continue;
- }
-
- format++;
- if (*format == '%') {
- addchar(*format++);
- continue;
- }
- if (*format == 0) {
- addchar('%');
- break;
- }
-
- if (*format == '*') {
- format++;
- if (pos >= argc)
- m4errx(1,
- "Format with too many format specifiers.");
- width = strtol(argv[pos++], NULL, 10);
- } else {
- char *eformat;
- width = strtol(format, &eformat, 10);
- format = eformat;
- }
- if (width < 0) {
- left_padded = 1;
- width = -width;
- } else {
- left_padded = 0;
- }
- if (*format == '.') {
- format++;
- if (*format == '*') {
- format++;
- if (pos >= argc)
- m4errx(1,
- "Format with too many format specifiers.");
- extra = strtol(argv[pos++], NULL, 10);
- } else {
- char *eformat;
- extra = strtol(format, &eformat, 10);
- format = eformat;
- }
- } else {
- extra = SIZE_T_MAX;
- }
- if (pos >= argc)
- m4errx(1, "Format with too many format specifiers.");
- switch(*format) {
- case 's':
- thisarg = argv[pos++];
- break;
- case 'c':
- temp[0] = strtoul(argv[pos++], NULL, 10);
- temp[1] = 0;
- thisarg = temp;
- break;
- default:
- m4errx(1, "Unsupported format specification: %s.",
- argv[2]);
- }
- format++;
- l = strlen(thisarg);
- if (l > extra)
- l = extra;
- if (!left_padded) {
- while (l < (size_t)width--)
- addchar(' ');
- }
- addchars(thisarg, l);
- if (left_padded) {
- while (l < (size_t)width--)
- addchar(' ');
- }
- }
- pbstr(getstring());
-}
-
-void
-doesyscmd(const char *cmd)
-{
- int p[2];
- pid_t pid, cpid;
- const char *argv[4];
- int cc;
- int status;
-
- /* Follow gnu m4 documentation: first flush buffers. */
- fflush(NULL);
-
- argv[0] = "sh";
- argv[1] = "-c";
- argv[2] = cmd;
- argv[3] = NULL;
-
- /* Just set up standard output, share stderr and stdin with m4 */
- if (pipe(p) == -1)
- err(1, "bad pipe");
- switch(cpid = fork()) {
- case -1:
- err(1, "bad fork");
- /* NOTREACHED */
- case 0:
- (void) close(p[0]);
- (void) dup2(p[1], 1);
- (void) close(p[1]);
- execv(_PATH_BSHELL, __UNCONST(argv));
- exit(1);
- default:
- /* Read result in two stages, since m4's buffer is
- * pushback-only. */
- (void) close(p[1]);
- do {
- char result[BUFSIZE];
- cc = read(p[0], result, sizeof result);
- if (cc > 0)
- addchars(result, cc);
- } while (cc > 0 || (cc == -1 && errno == EINTR));
-
- (void) close(p[0]);
- while ((pid = wait(&status)) != cpid && pid >= 0)
- continue;
- pbstr(getstring());
- }
-}
-
-void
-getdivfile(const char *name)
-{
- FILE *f;
- int c;
-
- f = fopen(name, "r");
- if (!f)
- return;
-
- while ((c = getc(f))!= EOF)
- putc(c, active);
- (void) fclose(f);
-}
-
-#ifdef REAL_FREEZE
-void
-freeze_state(const char *fname)
-{
- FILE *f;
-
- if ((f = fopen(fname, "wb")) == NULL)
- m4errx(EXIT_FAILURE, "Can't open output freeze file `%s' (%s)",
- fname, strerror(errno));
- fprintf(f, "# This is a frozen state file generated by %s\nV1\n",
- getprogname());
- fprintf(f, "Q%zu,%zu\n%s%s\n", strlen(lquote), strlen(rquote),
- lquote, rquote);
- fprintf(f, "C%zu,%zu\n%s%s\n", strlen(scommt), strlen(ecommt),
- scommt, ecommt);
- dump_state(f);
- /* XXX: diversions? */
- fprintf(f, "D-1,0\n");
- fprintf(f, "# End of frozen state file\n");
- fclose(f);
-}
-
-void
-thaw_state(const char *fname)
-{
- char *name = NULL;
- size_t nl, namelen = 0;
- char *defn = NULL;
- size_t dl, defnlen = 0;
- size_t lineno = 0;
- char line[1024], *ptr, type;
- FILE *f;
-
- if ((f = fopen(fname, "rb")) == NULL)
- m4errx(EXIT_FAILURE, "Can't open frozen file `%s' (%s)",
- fname, strerror(errno));
-
-#define GET() if (fgets(line, (int)sizeof(line), f) == NULL) goto out
-#define GETSTR(s, l) if (fread(s, 1, l, f) != l) goto out; else s[l] = '\0'
-
- GET(); /* comment */
- GET(); /* version */
- if ((ptr = strrchr(line, '\n')) != NULL)
- *ptr = '\0';
- if (strcmp(line, "V1") != 0)
- m4errx(EXIT_FAILURE, "Bad frozen version `%s'", line);
-
- for (;;) {
- GET();
- lineno++;
- switch (*line) {
- case '\n':
- continue;
- case '#':
- free(name);
- free(defn);
- fclose(f);
- return;
- default:
- if (sscanf(line, "%c%zu,%zu\n", &type, &nl, &dl) != 3)
- m4errx(EXIT_FAILURE, "%s, %zu: Bad line `%s'",
- fname, lineno, line);
- break;
- }
-
- switch (type) {
- case 'Q':
- if (nl >= sizeof(lquote) || dl >= sizeof(rquote))
- m4errx(EXIT_FAILURE, "%s, %zu: Quote too long",
- fname, lineno);
- GETSTR(lquote, nl);
- GETSTR(rquote, dl);
- break;
-
- case 'C':
- if (nl >= sizeof(scommt) || dl >= sizeof(ecommt))
- m4errx(EXIT_FAILURE, "%s, %zu: Comment too long",
- fname, lineno);
- GETSTR(scommt, nl);
- GETSTR(ecommt, dl);
- break;
-
- case 'T':
- case 'F':
- if (nl >= namelen)
- name = xrealloc(name, namelen = nl + 1,
- "name grow");
- if (dl >= defnlen)
- defn = xrealloc(defn, defnlen = dl + 1,
- "defn grow");
- GETSTR(name, nl);
- GETSTR(defn, dl);
- macro_pushdef(name, defn);
- break;
-
- case 'D':
- /* XXX: Not implemented */
- break;
-
- default:
- m4errx(EXIT_FAILURE, "%s, %zu: Unknown type %c",
- fname, lineno,type);
- }
- }
-out:
- m4errx(EXIT_FAILURE, "Unexprected end of file in `%s'", fname);
-}
-#endif
diff --git a/usr.bin/m4/lib/ohash.h b/usr.bin/m4/lib/ohash.h
deleted file mode 100644
index 8ccdaf9..0000000
--- a/usr.bin/m4/lib/ohash.h
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef OHASH_H
-#define OHASH_H
-/* $OpenBSD: ohash.h,v 1.8 2005/12/29 18:54:47 jaredy Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* Open hashing support.
- * Open hashing was chosen because it is much lighter than other hash
- * techniques, and more efficient in most cases.
- */
-
-struct ohash_info {
- ptrdiff_t key_offset;
- void *data; /* user data */
- void *(*halloc)(size_t, void *);
- void (*hfree)(void *, size_t, void *);
- void *(*alloc)(size_t, void *);
-};
-
-struct _ohash_record;
-
-struct ohash {
- struct _ohash_record *t;
- struct ohash_info info;
- unsigned int size;
- unsigned int total;
- unsigned int deleted;
-};
-
-/* For this to be tweakable, we use small primitives, and leave part of the
- * logic to the client application. e.g., hashing is left to the client
- * application. We also provide a simple table entry lookup that yields
- * a hashing table index (opaque) to be used in find/insert/remove.
- * The keys are stored at a known position in the client data.
- */
-__BEGIN_DECLS
-void ohash_init(struct ohash *, unsigned, struct ohash_info *);
-void ohash_delete(struct ohash *);
-
-unsigned int ohash_lookup_interval(struct ohash *, const char *,
- const char *, u_int32_t);
-unsigned int ohash_lookup_memory(struct ohash *, const char *,
- size_t, u_int32_t);
-void *ohash_find(struct ohash *, unsigned int);
-void *ohash_remove(struct ohash *, unsigned int);
-void *ohash_insert(struct ohash *, unsigned int, void *);
-void *ohash_first(struct ohash *, unsigned int *);
-void *ohash_next(struct ohash *, unsigned int *);
-unsigned int ohash_entries(struct ohash *);
-
-void *ohash_create_entry(struct ohash_info *, const char *, const char **);
-u_int32_t ohash_interval(const char *, const char **);
-
-unsigned int ohash_qlookupi(struct ohash *, const char *, const char **);
-unsigned int ohash_qlookup(struct ohash *, const char *);
-__END_DECLS
-#endif
-
diff --git a/usr.bin/m4/lib/ohash_create_entry.c b/usr.bin/m4/lib/ohash_create_entry.c
deleted file mode 100644
index 3bdc9ab..0000000
--- a/usr.bin/m4/lib/ohash_create_entry.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $OpenBSD: ohash_create_entry.c,v 1.2 2004/06/22 20:00:16 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-/* This handles the common case of variable length keys, where the
- * key is stored at the end of the record.
- */
-void *
-ohash_create_entry(struct ohash_info *i, const char *start, const char **end)
-{
- char *p;
-
- if (!*end)
- *end = start + strlen(start);
- p = (i->alloc)(i->key_offset + (*end - start) + 1, i->data);
- if (p) {
- memcpy(p+i->key_offset, start, *end-start);
- p[i->key_offset + (*end - start)] = '\0';
- }
- return (void *)p;
-}
diff --git a/usr.bin/m4/lib/ohash_delete.c b/usr.bin/m4/lib/ohash_delete.c
deleted file mode 100644
index 12a9c0c..0000000
--- a/usr.bin/m4/lib/ohash_delete.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* $OpenBSD: ohash_delete.c,v 1.2 2004/06/22 20:00:16 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-/* hash_delete only frees the hash structure. Use hash_first/hash_next
- * to free entries as well. */
-void
-ohash_delete(struct ohash *h)
-{
- (h->info.hfree)(h->t, sizeof(struct _ohash_record) * h->size,
- h->info.data);
-#ifndef NDEBUG
- h->t = NULL;
-#endif
-}
diff --git a/usr.bin/m4/lib/ohash_do.c b/usr.bin/m4/lib/ohash_do.c
deleted file mode 100644
index 2b8467d..0000000
--- a/usr.bin/m4/lib/ohash_do.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/* $OpenBSD: ohash_do.c,v 1.4 2004/06/22 20:00:16 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-static void ohash_resize(struct ohash *);
-
-static void
-ohash_resize(struct ohash *h)
-{
- struct _ohash_record *n;
- unsigned int ns, j;
- unsigned int i, incr;
-
- if (4 * h->deleted < h->total)
- ns = h->size << 1;
- else if (3 * h->deleted > 2 * h->total)
- ns = h->size >> 1;
- else
- ns = h->size;
- if (ns < MINSIZE)
- ns = MINSIZE;
-#ifdef STATS_HASH
- STAT_HASH_EXPAND++;
- STAT_HASH_SIZE += ns - h->size;
-#endif
- n = (h->info.halloc)(sizeof(struct _ohash_record) * ns, h->info.data);
- if (!n)
- return;
-
- for (j = 0; j < h->size; j++) {
- if (h->t[j].p != NULL && h->t[j].p != DELETED) {
- i = h->t[j].hv % ns;
- incr = ((h->t[j].hv % (ns - 2)) & ~1) + 1;
- while (n[i].p != NULL) {
- i += incr;
- if (i >= ns)
- i -= ns;
- }
- n[i].hv = h->t[j].hv;
- n[i].p = h->t[j].p;
- }
- }
- (h->info.hfree)(h->t, sizeof(struct _ohash_record) * h->size,
- h->info.data);
- h->t = n;
- h->size = ns;
- h->total -= h->deleted;
- h->deleted = 0;
-}
-
-void *
-ohash_remove(struct ohash *h, unsigned int i)
-{
- void *result = __UNCONST(h->t[i].p);
-
- if (result == NULL || result == DELETED)
- return NULL;
-
-#ifdef STATS_HASH
- STAT_HASH_ENTRIES--;
-#endif
- h->t[i].p = DELETED;
- h->deleted++;
- if (h->deleted >= MINDELETED && 4 * h->deleted > h->total)
- ohash_resize(h);
- return result;
-}
-
-void *
-ohash_find(struct ohash *h, unsigned int i)
-{
- if (h->t[i].p == DELETED)
- return NULL;
- else
- return __UNCONST(h->t[i].p);
-}
-
-void *
-ohash_insert(struct ohash *h, unsigned int i, void *p)
-{
-#ifdef STATS_HASH
- STAT_HASH_ENTRIES++;
-#endif
- if (h->t[i].p == DELETED) {
- h->deleted--;
- h->t[i].p = p;
- } else {
- h->t[i].p = p;
- /* Arbitrary resize boundary. Tweak if not efficient enough. */
- if (++h->total * 4 > h->size * 3)
- ohash_resize(h);
- }
- return p;
-}
diff --git a/usr.bin/m4/lib/ohash_entries.c b/usr.bin/m4/lib/ohash_entries.c
deleted file mode 100644
index 683e204..0000000
--- a/usr.bin/m4/lib/ohash_entries.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $OpenBSD: ohash_entries.c,v 1.2 2004/06/22 20:00:16 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-unsigned int
-ohash_entries(struct ohash *h)
-{
- return h->total - h->deleted;
-}
diff --git a/usr.bin/m4/lib/ohash_enum.c b/usr.bin/m4/lib/ohash_enum.c
deleted file mode 100644
index 966daa1..0000000
--- a/usr.bin/m4/lib/ohash_enum.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $OpenBSD: ohash_enum.c,v 1.3 2004/06/22 20:00:16 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-void *
-ohash_first(struct ohash *h, unsigned int *pos)
-{
- *pos = 0;
- return ohash_next(h, pos);
-}
-
-void *
-ohash_next(struct ohash *h, unsigned int *pos)
-{
- for (; *pos < h->size; (*pos)++)
- if (h->t[*pos].p != DELETED && h->t[*pos].p != NULL)
- return __UNCONST(h->t[(*pos)++].p);
- return NULL;
-}
diff --git a/usr.bin/m4/lib/ohash_init.3 b/usr.bin/m4/lib/ohash_init.3
deleted file mode 100644
index a0939a8..0000000
--- a/usr.bin/m4/lib/ohash_init.3
+++ /dev/null
@@ -1,229 +0,0 @@
-.\" $OpenBSD: ohash_init.3,v 1.14 2007/05/31 19:19:30 jmc Exp $
-.\" Copyright (c) 1999 Marc Espie <espie@openbsd.org>
-.\"
-.\" Permission to use, copy, modify, and distribute this software for any
-.\" purpose with or without fee is hereby granted, provided that the above
-.\" copyright notice and this permission notice appear in all copies.
-.\"
-.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-.\"
-.Dd $Mdocdate: May 31 2007 $
-.Dt OPEN_HASH 3
-.Os
-.Sh NAME
-.Nm ohash_init ,
-.Nm ohash_delete ,
-.Nm ohash_lookup_interval ,
-.Nm ohash_lookup_memory ,
-.Nm ohash_find ,
-.Nm ohash_remove ,
-.Nm ohash_insert ,
-.Nm ohash_first ,
-.Nm ohash_next ,
-.Nm ohash_entries
-.Nd light-weight open hashing
-.Sh SYNOPSIS
-.Fd #include <stdint.h>
-.Fd #include <stddef.h>
-.Fd #include <ohash.h>
-.Ft void
-.Fn ohash_init "struct ohash *h" "unsigned int size" "struct ohash_info *info"
-.Ft void
-.Fn ohash_delete "struct ohash *h"
-.Ft "unsigned int"
-.Fn ohash_lookup_interval "struct ohash *h" "const char *start" "const char *end" "uint32_t hv"
-.Ft "unsigned int"
-.Fn ohash_lookup_memory "struct ohash *h" "const char *k" "size_t s" "uint32_t hv"
-.Ft void *
-.Fn ohash_find "struct ohash *h" "unsigned int i"
-.Ft void *
-.Fn ohash_remove "struct ohash *h" "unsigned int i"
-.Ft void *
-.Fn ohash_insert "struct ohash *h" "unsigned int i" "void *p"
-.Ft void *
-.Fn ohash_first "struct ohash *h" "unsigned int *i"
-.Ft void *
-.Fn ohash_next "struct ohash *h" "unsigned int *i"
-.Ft "unsigned int"
-.Fn ohash_entries "struct ohash *h"
-.Sh DESCRIPTION
-These functions have been designed as a fast, extensible alternative to
-the usual hash table functions.
-They provide storage and retrieval of records indexed by keys,
-where a key is a contiguous sequence of bytes at a fixed position in
-each record.
-Keys can either be NUL-terminated strings or fixed-size memory areas.
-All functions take a pointer to an ohash structure as the
-.Fa h
-function argument.
-Storage for this structure should be provided by user code.
-.Pp
-.Fn ohash_init
-initializes the table to store roughly 2 to the power
-.Fa size
-elements.
-.Fa info
-holds the position of the key in each record, and two pointers to
-.Xr calloc 3
-and
-.Xr free 3 Ns -like
-functions, to use for managing the table internal storage.
-.Pp
-.Fn ohash_delete
-frees storage internal to
-.Fa h .
-Elements themselves should be freed by the user first, using for instance
-.Fn ohash_first
-and
-.Fn ohash_next .
-.Pp
-.Fn ohash_lookup_interval
-and
-.Fn ohash_lookup_memory
-are the basic look-up element functions.
-The hashing function result is provided by the user as
-.Fa hv .
-These return a
-.Qq slot
-in the ohash table
-.Fa h ,
-to be used with
-.Fn ohash_find ,
-.Fn ohash_insert ,
-or
-.Fn ohash_remove .
-This slot is only valid up to the next call to
-.Fn ohash_insert
-or
-.Fn ohash_remove .
-.Pp
-.Fn ohash_lookup_interval
-handles string-like keys.
-.Fn ohash_lookup_interval
-assumes the key is the interval between
-.Fa start
-and
-.Fa end ,
-exclusive,
-though the actual elements stored in the table should only contain
-NUL-terminated keys.
-.Pp
-.Fn ohash_lookup_memory
-assumes the key is the memory area starting at
-.Fa k
-of size
-.Fa s .
-All bytes are significant in key comparison.
-.Pp
-.Fn ohash_find
-retrieves an element from a slot
-.Fa i
-returned by the
-.Fn ohash_lookup*
-functions.
-It returns
-.Dv NULL
-if the slot is empty.
-.Pp
-.Fn ohash_insert
-inserts a new element
-.Fa p
-at slot
-.Fa i .
-Slot
-.Fa i
-must be empty and element
-.Fa p
-must have a key corresponding to the
-.Fn ohash_lookup*
-call.
-.Pp
-.Fn ohash_remove
-removes the element at slot
-.Fa i .
-It returns the removed element, for user code to dispose of, or
-.Dv NULL
-if the slot was empty.
-.Pp
-.Fn ohash_first
-and
-.Fn ohash_next
-can be used to access all elements in an ohash table, like this:
-.Bd -literal -offset indent
-for (n = ohash_first(h, &i); n != NULL; n = ohash_next(h, &i))
- do_something_with(n);
-.Ed
-.Pp
-.Fa i
-points to an auxiliary unsigned integer used to record the current position
-in the ohash table.
-Those functions are safe to use even while entries are added to/removed
-from the table, but in such a case they don't guarantee that new entries
-will be returned.
-As a special case, they can safely be used to free elements in the table.
-.Pp
-.Fn ohash_entries
-returns the number of elements in the hash table.
-.Sh STORAGE HANDLING
-Only
-.Fn ohash_init ,
-.Fn ohash_insert ,
-.Fn ohash_remove
-and
-.Fn ohash_delete
-may call the user-supplied memory functions.
-It is the responsibility of the user memory allocation code to verify
-that those calls did not fail.
-.Pp
-If memory allocation fails,
-.Fn ohash_init
-returns a useless hash table.
-.Fn ohash_insert
-and
-.Fn ohash_remove
-still perform the requested operation, but the returned table should be
-considered read-only.
-It can still be accessed by
-.Fn ohash_lookup* ,
-.Fn ohash_find ,
-.Fn ohash_first
-and
-.Fn ohash_next
-to dump relevant information to disk before aborting.
-.Sh THREAD SAFETY
-The open hashing functions are not thread-safe by design.
-In particular, in a threaded environment, there is no guarantee that a
-.Qq slot
-will not move between a
-.Fn ohash_lookup*
-and a
-.Fn ohash_find ,
-.Fn ohash_insert
-or
-.Fn ohash_remove
-call.
-.Pp
-Multi-threaded applications should explicitly protect ohash table access.
-.Sh SEE ALSO
-.Xr ohash_interval 3
-.Rs
-.%A Donald E. Knuth
-.%B The Art of Computer Programming
-.%V Vol. 3
-.%P pp 506-550
-.%D 1973
-.Re
-.Sh STANDARDS
-Those functions are completely non-standard and should be avoided in
-portable programs.
-.Sh HISTORY
-Those functions were designed and written for
-.Ox
-.Xr make 1
-by Marc Espie in 1999.
diff --git a/usr.bin/m4/lib/ohash_init.c b/usr.bin/m4/lib/ohash_init.c
deleted file mode 100644
index 4d24fa4..0000000
--- a/usr.bin/m4/lib/ohash_init.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $OpenBSD: ohash_init.c,v 1.2 2004/06/22 20:00:16 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-void
-ohash_init(struct ohash *h, unsigned int size, struct ohash_info *info)
-{
- h->size = 1UL << size;
- if (h->size < MINSIZE)
- h->size = MINSIZE;
-#ifdef STATS_HASH
- STAT_HASH_CREATION++;
- STAT_HASH_SIZE += h->size;
-#endif
- /* Copy info so that caller may free it. */
- h->info.key_offset = info->key_offset;
- h->info.halloc = info->halloc;
- h->info.hfree = info->hfree;
- h->info.alloc = info->alloc;
- h->info.data = info->data;
- h->t = (h->info.halloc)(sizeof(struct _ohash_record) * h->size,
- h->info.data);
- h->total = h->deleted = 0;
-}
diff --git a/usr.bin/m4/lib/ohash_int.h b/usr.bin/m4/lib/ohash_int.h
deleted file mode 100644
index 88c818b..0000000
--- a/usr.bin/m4/lib/ohash_int.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* $OpenBSD: ohash_int.h,v 1.3 2006/01/16 15:52:25 espie Exp $ */
-
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include "ohash.h"
-
-struct _ohash_record {
- u_int32_t hv;
- const char *p;
-};
-
-#define DELETED ((const char *)h)
-#define NONE (h->size)
-
-/* Don't bother changing the hash table if the change is small enough. */
-#define MINSIZE (1UL << 4)
-#define MINDELETED 4
diff --git a/usr.bin/m4/lib/ohash_interval.3 b/usr.bin/m4/lib/ohash_interval.3
deleted file mode 100644
index 2e56ca5..0000000
--- a/usr.bin/m4/lib/ohash_interval.3
+++ /dev/null
@@ -1,90 +0,0 @@
-.\" $OpenBSD: ohash_interval.3,v 1.11 2007/05/31 19:19:30 jmc Exp $
-.\" Copyright (c) 2001 Marc Espie <espie@openbsd.org>
-.\"
-.\" Permission to use, copy, modify, and distribute this software for any
-.\" purpose with or without fee is hereby granted, provided that the above
-.\" copyright notice and this permission notice appear in all copies.
-.\"
-.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-.\"
-.Dd $Mdocdate: May 31 2007 $
-.Dt OPEN_HASH_HELPER 3
-.Os
-.Sh NAME
-.Nm ohash_interval ,
-.Nm ohash_create_entry ,
-.Nm ohash_qlookup ,
-.Nm ohash_qlookupi
-.Nd helper functions for open hashing
-.Sh SYNOPSIS
-.Fd #include <stdint.h>
-.Fd #include <stddef.h>
-.Fd #include <ohash.h>
-.Ft u_int32_t
-.Fn ohash_interval "const char *start" "const char **pend"
-.Ft "void *"
-.Fn ohash_create_entry "struct ohash_info *info" "const char *start" "const char **pend"
-.Ft "unsigned int"
-.Fn ohash_qlookupi "struct ohash *h" "const char *start" "const char **pend"
-.Ft "unsigned int"
-.Fn ohash_qlookup "struct ohash *h" "const char *start"
-.Sh DESCRIPTION
-These functions are commonly used to simplify open hashing usage, and use
-similar conventions.
-They operate indifferently on NUL-terminated strings
-.Po
-by setting
-.Fa *pend
-=
-.Dv NULL
-.Pc
-or memory ranges
-.Po
-delimited by
-.Fa start
-and
-.Fa *pend
-.Pc .
-For NUL-terminated strings, as a side effect, those functions
-set
-.Fa *pend
-to the terminating NUL byte.
-.Pp
-.Fn ohash_interval
-is a simple hashing function that yields good results on common data sets.
-.Pp
-.Fn ohash_create_entry
-can be used to create a new record with a given key.
-In that case,
-the alloc field of
-.Fa info
-should point to a
-.Xr malloc 3 Ns -like
-function to allocate the storage.
-.Pp
-.Fn ohash_qlookupi
-is a wrapper function that simply calls
-.Fn ohash_interval
-and
-.Fn ohash_lookup_interval .
-.Pp
-.Fn ohash_qlookup
-is a variation on
-.Fn ohash_qlookupi
-designed for NUL-terminated strings.
-.Sh SEE ALSO
-.Xr ohash_init 3
-.Sh STANDARDS
-Those functions are completely non-standard and should be avoided in
-portable programs.
-.Sh HISTORY
-Those functions were designed and written for
-.Ox
-.Xr make 1
-by Marc Espie in 1999.
diff --git a/usr.bin/m4/lib/ohash_interval.c b/usr.bin/m4/lib/ohash_interval.c
deleted file mode 100644
index 2434d3b..0000000
--- a/usr.bin/m4/lib/ohash_interval.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* $OpenBSD: ohash_interval.c,v 1.3 2006/01/16 15:52:25 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-uint32_t
-ohash_interval(const char *s, const char **e)
-{
- uint32_t k;
-
- if (!*e)
- *e = s + strlen(s);
- if (s == *e)
- k = 0;
- else
- k = *s++;
- while (s != *e)
- k = ((k << 2) | (k >> 30)) ^ *s++;
- return k;
-}
diff --git a/usr.bin/m4/lib/ohash_lookup_interval.c b/usr.bin/m4/lib/ohash_lookup_interval.c
deleted file mode 100644
index e497801..0000000
--- a/usr.bin/m4/lib/ohash_lookup_interval.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $OpenBSD: ohash_lookup_interval.c,v 1.3 2006/01/16 15:52:25 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-unsigned int
-ohash_lookup_interval(struct ohash *h, const char *start, const char *end,
- uint32_t hv)
-{
- unsigned int i, incr;
- unsigned int empty;
-
-#ifdef STATS_HASH
- STAT_HASH_LOOKUP++;
-#endif
- empty = NONE;
- i = hv % h->size;
- incr = ((hv % (h->size-2)) & ~1) + 1;
- while (h->t[i].p != NULL) {
-#ifdef STATS_HASH
- STAT_HASH_LENGTH++;
-#endif
- if (h->t[i].p == DELETED) {
- if (empty == NONE)
- empty = i;
- } else if (h->t[i].hv == hv &&
- strncmp(h->t[i].p+h->info.key_offset, start,
- end - start) == 0 &&
- (h->t[i].p+h->info.key_offset)[end-start] == '\0') {
- if (empty != NONE) {
- h->t[empty].hv = hv;
- h->t[empty].p = h->t[i].p;
- h->t[i].p = DELETED;
- return empty;
- } else {
-#ifdef STATS_HASH
- STAT_HASH_POSITIVE++;
-#endif
- return i;
- }
- }
- i += incr;
- if (i >= h->size)
- i -= h->size;
- }
-
- /* Found an empty position. */
- if (empty != NONE)
- i = empty;
- h->t[i].hv = hv;
- return i;
-}
diff --git a/usr.bin/m4/lib/ohash_lookup_memory.c b/usr.bin/m4/lib/ohash_lookup_memory.c
deleted file mode 100644
index 93ded5a..0000000
--- a/usr.bin/m4/lib/ohash_lookup_memory.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* $OpenBSD: ohash_lookup_memory.c,v 1.3 2006/01/16 15:52:25 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-unsigned int
-ohash_lookup_memory(struct ohash *h, const char *k, size_t size, uint32_t hv)
-{
- unsigned int i, incr;
- unsigned int empty;
-
-#ifdef STATS_HASH
- STAT_HASH_LOOKUP++;
-#endif
- empty = NONE;
- i = hv % h->size;
- incr = ((hv % (h->size-2)) & ~1) + 1;
- while (h->t[i].p != NULL) {
-#ifdef STATS_HASH
- STAT_HASH_LENGTH++;
-#endif
- if (h->t[i].p == DELETED) {
- if (empty == NONE)
- empty = i;
- } else if (h->t[i].hv == hv &&
- memcmp(h->t[i].p+h->info.key_offset, k, size) == 0) {
- if (empty != NONE) {
- h->t[empty].hv = hv;
- h->t[empty].p = h->t[i].p;
- h->t[i].p = DELETED;
- return empty;
- } else {
-#ifdef STATS_HASH
- STAT_HASH_POSITIVE++;
-#endif
- } return i;
- }
- i += incr;
- if (i >= h->size)
- i -= h->size;
- }
-
- /* Found an empty position. */
- if (empty != NONE)
- i = empty;
- h->t[i].hv = hv;
- return i;
-}
diff --git a/usr.bin/m4/lib/ohash_qlookup.c b/usr.bin/m4/lib/ohash_qlookup.c
deleted file mode 100644
index 58b3454..0000000
--- a/usr.bin/m4/lib/ohash_qlookup.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* $OpenBSD: ohash_qlookup.c,v 1.2 2004/06/22 20:00:17 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-unsigned int
-ohash_qlookup(struct ohash *h, const char *s)
-{
- const char *e = NULL;
- return ohash_qlookupi(h, s, &e);
-}
diff --git a/usr.bin/m4/lib/ohash_qlookupi.c b/usr.bin/m4/lib/ohash_qlookupi.c
deleted file mode 100644
index 2acec4e..0000000
--- a/usr.bin/m4/lib/ohash_qlookupi.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $OpenBSD: ohash_qlookupi.c,v 1.2 2004/06/22 20:00:17 espie Exp $ */
-/* ex:ts=8 sw=4:
- */
-
-/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "ohash_int.h"
-
-unsigned int
-ohash_qlookupi(struct ohash *h, const char *s, const char **e)
-{
- u_int32_t hv;
-
- hv = ohash_interval(s, e);
- return ohash_lookup_interval(h, s, *e, hv);
-}
diff --git a/usr.bin/m4/lib/strtonum.c b/usr.bin/m4/lib/strtonum.c
deleted file mode 100644
index 8d11712..0000000
--- a/usr.bin/m4/lib/strtonum.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* $OpenBSD: strtonum.c,v 1.6 2004/08/03 19:38:01 millert Exp $ */
-
-/*
- * Copyright (c) 2004 Ted Unangst and Todd Miller
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: strtonum.c,v 1.2 2009/10/26 21:14:18 christos Exp $");
-#include <errno.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#define INVALID 1
-#define TOOSMALL 2
-#define TOOLARGE 3
-
-long long
-strtonum(const char *numstr, long long minval, long long maxval,
- const char **errstrp);
-long long
-strtonum(const char *numstr, long long minval, long long maxval,
- const char **errstrp)
-{
- long long ll = 0;
- char *ep;
- int error = 0;
- struct errval {
- const char *errstr;
- int err;
- } ev[4] = {
- { NULL, 0 },
- { "invalid", EINVAL },
- { "too small", ERANGE },
- { "too large", ERANGE },
- };
-
- ev[0].err = errno;
- errno = 0;
- if (minval > maxval)
- error = INVALID;
- else {
- ll = strtoll(numstr, &ep, 10);
- if (numstr == ep || *ep != '\0')
- error = INVALID;
- else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
- error = TOOSMALL;
- else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
- error = TOOLARGE;
- }
- if (errstrp != NULL)
- *errstrp = ev[error].errstr;
- errno = ev[error].err;
- if (error)
- ll = 0;
-
- return (ll);
-}
-
diff --git a/usr.bin/m4/look.c b/usr.bin/m4/look.c
deleted file mode 100644
index de2c282..0000000
--- a/usr.bin/m4/look.c
+++ /dev/null
@@ -1,315 +0,0 @@
-/* $NetBSD: look.c,v 1.13 2016/01/16 17:00:07 christos Exp $ */
-/* $OpenBSD: look.c,v 1.21 2009/10/14 17:23:17 sthen Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * 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.
- */
-
-/*
- * look.c
- * Facility: m4 macro processor
- * by: oz
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: look.c,v 1.13 2016/01/16 17:00:07 christos Exp $");
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <string.h>
-#include <ohash.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-
-static void *hash_alloc(size_t, void *);
-static void hash_free(void *, size_t, void *);
-static void *element_alloc(size_t, void *);
-static void setup_definition(struct macro_definition *, const char *,
- const char *);
-
-static struct ohash_info macro_info = {
- offsetof(struct ndblock, name),
- NULL, hash_alloc, hash_free, element_alloc };
-
-struct ohash macros;
-
-/* Support routines for hash tables. */
-void *
-hash_alloc(size_t s, void *u UNUSED)
-{
- void *storage = xalloc(s, "hash alloc");
- if (storage)
- memset(storage, 0, s);
- return storage;
-}
-
-void
-hash_free(void *p, size_t s UNUSED, void *u UNUSED)
-{
- free(p);
-}
-
-void *
-element_alloc(size_t s, void *u UNUSED)
-{
- return xalloc(s, "element alloc");
-}
-
-void
-init_macros(void)
-{
- ohash_init(&macros, 10, &macro_info);
-}
-
-/*
- * find name in the hash table
- */
-ndptr
-lookup(const char *name)
-{
- return ohash_find(&macros, ohash_qlookup(&macros, name));
-}
-
-struct macro_definition *
-lookup_macro_definition(const char *name)
-{
- ndptr p;
-
- p = ohash_find(&macros, ohash_qlookup(&macros, name));
- if (p)
- return p->d;
- else
- return NULL;
-}
-
-static void
-setup_definition(struct macro_definition *d, const char *defn, const char *name)
-{
- ndptr p;
-
- if (strncmp(defn, BUILTIN_MARKER, sizeof(BUILTIN_MARKER)-1) == 0 &&
- (p = macro_getbuiltin(defn+sizeof(BUILTIN_MARKER)-1)) != NULL) {
- d->type = macro_builtin_type(p);
- d->defn = xstrdup(defn+sizeof(BUILTIN_MARKER)-1);
- } else {
- if (!*defn)
- d->defn = xstrdup(null);
- else
- d->defn = xstrdup(defn);
- d->type = MACRTYPE;
- }
- if (STREQ(name, defn))
- d->type |= RECDEF;
-}
-
-static ndptr
-create_entry(const char *name)
-{
- const char *end = NULL;
- unsigned int i;
- ndptr n;
-
- i = ohash_qlookupi(&macros, name, &end);
- n = ohash_find(&macros, i);
- if (n == NULL) {
- n = ohash_create_entry(&macro_info, name, &end);
- ohash_insert(&macros, i, n);
- n->trace_flags = FLAG_NO_TRACE;
- n->builtin_type = MACRTYPE;
- n->d = NULL;
- }
- return n;
-}
-
-void
-macro_define(const char *name, const char *defn)
-{
- ndptr n = create_entry(name);
- if (n->d != NULL) {
- if (n->d->defn != null)
- free(n->d->defn);
- } else {
- n->d = xalloc(sizeof(struct macro_definition), NULL);
- n->d->next = NULL;
- }
- setup_definition(n->d, defn, name);
-}
-
-void
-macro_pushdef(const char *name, const char *defn)
-{
- ndptr n;
- struct macro_definition *d;
-
- n = create_entry(name);
- d = xalloc(sizeof(struct macro_definition), NULL);
- d->next = n->d;
- n->d = d;
- setup_definition(n->d, defn, name);
-}
-
-void
-macro_undefine(const char *name)
-{
- ndptr n = lookup(name);
- if (n != NULL) {
- struct macro_definition *r, *r2;
-
- for (r = n->d; r != NULL; r = r2) {
- r2 = r->next;
- if (r->defn != null)
- free(r->defn);
- free(r);
- }
- n->d = NULL;
- }
-}
-
-void
-macro_popdef(const char *name)
-{
- ndptr n = lookup(name);
-
- if (n != NULL) {
- struct macro_definition *r = n->d;
- if (r != NULL) {
- n->d = r->next;
- if (r->defn != null)
- free(r->defn);
- free(r);
- }
- }
-}
-
-void
-macro_for_all(void (*f)(const char *, struct macro_definition *))
-{
- ndptr n;
- unsigned int i;
-
- for (n = ohash_first(&macros, &i); n != NULL;
- n = ohash_next(&macros, &i))
- if (n->d != NULL)
- f(n->name, n->d);
-}
-
-void
-setup_builtin(const char *name, unsigned int type)
-{
- ndptr n;
- char *name2;
-
- if (prefix_builtins) {
- name2 = xalloc(strlen(name)+3+1, NULL);
- memcpy(name2, "m4_", 3);
- memcpy(name2 + 3, name, strlen(name)+1);
- } else
- name2 = xstrdup(name);
-
- n = create_entry(name2);
- n->builtin_type = type;
- n->d = xalloc(sizeof(struct macro_definition), NULL);
- n->d->defn = name2;
- n->d->type = type;
- n->d->next = NULL;
-}
-
-void
-mark_traced(const char *name, int on)
-{
- ndptr p;
- unsigned int i;
-
- if (name == NULL) {
- if (on)
- trace_flags |= TRACE_ALL;
- else
- trace_flags &= ~TRACE_ALL;
- for (p = ohash_first(&macros, &i); p != NULL;
- p = ohash_next(&macros, &i))
- p->trace_flags = FLAG_NO_TRACE;
- } else {
- p = create_entry(name);
- p->trace_flags = on;
- }
-}
-
-ndptr
-macro_getbuiltin(const char *name)
-{
- ndptr p;
-
- p = lookup(name);
- if (p == NULL || p->builtin_type == MACRTYPE)
- return NULL;
- else
- return p;
-}
-
-#ifdef REAL_FREEZE
-static void
-recurse(FILE *f, ndptr n, struct macro_definition *d)
-{
- if (d->next != NULL)
- recurse(f, n, d->next);
-
- // skip built-ins, because it is cheaper to do so
- // and initialize them manually
- if (d->type & (NOARGS|NEEDARGS))
- return;
- fprintf(f, "%c%zu,%zu\n%s%s\n",
- (d->type & (NOARGS|NEEDARGS)) ? 'F' : 'T',
- strlen(n->name), strlen(d->defn),
- n->name, d->defn);
-}
-
-static void
-dump_entry(FILE *f, ndptr n)
-{
- if (n->d == NULL)
- return;
- recurse(f, n, n->d);
-}
-
-void
-dump_state(FILE *f)
-{
- ndptr n;
- unsigned int i;
- for (n = ohash_first(&macros, &i); n != NULL;
- n = ohash_next(&macros, &i))
- dump_entry(f, n);
-}
-#endif
diff --git a/usr.bin/m4/m4.1 b/usr.bin/m4/m4.1
deleted file mode 100644
index f033cee..0000000
--- a/usr.bin/m4/m4.1
+++ /dev/null
@@ -1,522 +0,0 @@
-.\" $NetBSD: m4.1,v 1.27 2016/01/17 11:24:28 wiz Exp $
-.\" @(#) $OpenBSD: m4.1,v 1.56 2009/10/14 17:19:47 sthen Exp $
-.\"
-.\" Copyright (c) 1989, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Ozan Yigit at York University.
-.\"
-.\" 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.
-.\"
-.Dd January 16, 2015
-.Dt M4 1
-.Os
-.Sh NAME
-.Nm m4
-.Nd macro language processor
-.Sh SYNOPSIS
-.Nm m4
-.Op Fl EGgiPQsv
-.Oo
-.Sm off
-.Fl D Ar name Op No = Ar value
-.Sm on
-.Oc
-.Op Fl d Ar flags
-.Op Fl e Ar filename
-.Op Fl F Ar filename
-.Op Fl I Ar dirname
-.Op Fl L Ar number
-.Op Fl o Ar filename
-.Op Fl R Ar filename
-.Op Fl t Ar macro
-.Op Fl U Ns Ar name
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm m4
-utility is a macro processor that can be used as a front end to any
-language (e.g., C, ratfor, fortran, lex, and yacc).
-If no input files are given,
-.Nm m4
-reads from the standard input,
-otherwise files specified on the command line are
-processed in the given order.
-Input files can be regular files, files in the m4 include paths, or a
-single dash
-.Pq Sq - ,
-denoting standard input.
-.Nm m4
-writes
-the processed text to the standard output, unless told otherwise.
-.Pp
-Macro calls have the form name(argument1[, argument2, ..., argumentN]).
-.Pp
-There cannot be any space following the macro name and the open
-parenthesis
-.Sq \&( .
-If the macro name is not followed by an open
-parenthesis it is processed with no arguments.
-.Pp
-Macro names consist of a leading alphabetic or underscore
-possibly followed by alphanumeric or underscore characters, e.g.,
-valid macro names match the pattern
-.Dq [a-zA-Z_][a-zA-Z0-9_]* .
-.Pp
-In arguments to macros, leading unquoted space, tab, and newline
-.Pq Sq \en
-characters are ignored.
-To quote strings, use left and right single quotes
-.Po e.g.,\ \&
-.Sq "\ this is a string with a leading space"
-.Pc .
-You can change the quote characters with the
-.Ic changequote
-built-in macro.
-.Pp
-Most built-ins don't make any sense without arguments, and hence are not
-recognized as special when not followed by an open parenthesis.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl D , Fl Fl define Ar name Ns Op Pf = Ns Ar value
-Define the symbol
-.Ar name
-to have some value (or
-.Dv NULL ) .
-.It Fl d , Fl Fl debug Ar "flags"
-Set trace flags.
-.Ar flags
-may hold the following:
-.Bl -tag -width Ds
-.It Ar a
-print macro arguments.
-.It Ar c
-print macro expansion over several lines.
-.It Ar e
-print result of macro expansion.
-.It Ar f
-print filename location.
-.It Ar l
-print line number.
-.It Ar q
-quote arguments and expansion with the current quotes.
-.It Ar t
-start with all macros traced.
-.It Ar x
-number macro expansions.
-.It Ar V
-turn on all options.
-.El
-.Pp
-By default, trace is set to
-.Qq eq .
-.It Fl E , Fl Fl fatal-warnings
-Warnings make
-.Nm
-exit.
-.It Fl e , Fl Fl error-output Ar filename
-Redirect error output to filename.
-.It Fl F , Fl Fl freeze-state Ar filename
-Save the input state to
-.Ar filename .
-.It Fl G , Fl Fl traditional
-Disable GNU-m4 extensions.
-.It Fl g , Fl Fl gnu
-Activate GNU-m4 compatibility mode.
-In this mode, translit handles simple character
-ranges (e.g., a-z), regular expressions mimic emacs behavior,
-multiple m4wrap calls are handled as a stack,
-the number of diversions is unlimited,
-empty names for macro definitions are allowed,
-and eval understands
-.Sq 0rbase:value
-numbers.
-.It Fl Fl help
-Print help message and exit.
-.It Fl I , Fl Fl include Ar "dirname"
-Add directory
-.Ar dirname
-to the include path.
-.It Fl i , Fl Fl interactive
-Set unbuffered output, disable tty signals.
-.It Fl L , Fl Fl nesting-limit
-Set the nesting limit in macro expansions.
-This is unimplemented and unlimited.
-.It Fl o Ar filename
-Send trace output to
-.Ar filename .
-.It Fl P , Fl Fl prefix-builtins
-Prefix all built-in macros with
-.Sq m4_ .
-For example, instead of writing
-.Ic define ,
-use
-.Ic m4_define .
-.It Fl Q , Fl Fl quiet , Fl Fl silent
-Don't print warnings.
-.It Fl R , Fl Fl reload-state Ar filename
-Reload a previously saved state from
-.Ar filename .
-.It Fl s , Fl Fl synclines
-Output line synchronization directives, suitable for
-.Xr cpp 1 .
-.It Fl t , Fl Fl trace Ar macro
-Turn tracing on for
-.Ar macro .
-.It Fl U , Fl Fl undefine Ar "name"
-Undefine the symbol
-.Ar name .
-.It Fl v , Fl Fl version
-Print the version and exit.
-.El
-.Sh SYNTAX
-.Nm m4
-provides the following built-in macros.
-They may be redefined, losing their original meaning.
-Return values are null unless otherwise stated.
-.Bl -tag -width changequote
-.It Fn builtin name
-Calls a built-in by its
-.Fa name ,
-overriding possible redefinitions.
-.It Fn changecom startcomment endcomment
-Changes the start comment and end comment sequences.
-Comment sequences may be up to five characters long.
-The default values are the hash sign
-and the newline character.
-.Bd -literal -offset indent
-# This is a comment
-.Ed
-.Pp
-With no arguments, comments are turned off.
-With one single argument, the end comment sequence is set
-to the newline character.
-.It Fn changequote beginquote endquote
-Defines the open quote and close quote sequences.
-Quote sequences may be up to five characters long.
-The default values are the backquote character and the quote
-character.
-.Bd -literal -offset indent
-`Here is a quoted string'
-.Ed
-.Pp
-With no arguments, the default quotes are restored.
-With one single argument, the close quote sequence is set
-to the newline character.
-.It Fn decr arg
-Decrements the argument
-.Fa arg
-by 1.
-The argument
-.Fa arg
-must be a valid numeric string.
-.It Fn define name value
-Define a new macro named by the first argument
-.Fa name
-to have the
-value of the second argument
-.Fa value .
-Each occurrence of
-.Sq $n
-(where
-.Ar n
-is 0 through 9) is replaced by the
-.Ar n Ns 'th
-argument.
-.Sq $0
-is the name of the calling macro.
-Undefined arguments are replaced by a null string.
-.Sq $#
-is replaced by the number of arguments;
-.Sq $*
-is replaced by all arguments comma separated;
-.Sq $@
-is the same as
-.Sq $*
-but all arguments are quoted against further expansion.
-.It Fn defn name ...
-Returns the quoted definition for each argument.
-This can be used to rename
-macro definitions (even for built-in macros).
-.It Fn divert num
-There are 10 output queues (numbered 0-9).
-At the end of processing
-.Nm m4
-concatenates all the queues in numerical order to produce the
-final output.
-Initially the output queue is 0.
-The divert
-macro allows you to select a new output queue (an invalid argument
-passed to divert causes output to be discarded).
-.It Ic divnum
-Returns the current output queue number.
-.It Ic dnl
-Discard input characters up to and including the next newline.
-.It Fn dumpdef name ...
-Prints the names and definitions for the named items, or for everything
-if no arguments are passed.
-.It Fn errprint msg
-Prints the first argument on the standard error output stream.
-.It Fn esyscmd cmd
-Passes its first argument to a shell and returns the shell's standard output.
-Note that the shell shares its standard input and standard error with
-.Nm m4 .
-.It Fn eval expr[,radix[,minimum]]
-Computes the first argument as an arithmetic expression using 32-bit
-arithmetic.
-Operators are the standard C ternary, arithmetic, logical,
-shift, relational, bitwise, and parentheses operators.
-You can specify
-octal, decimal, and hexadecimal numbers as in C.
-The optional second argument
-.Fa radix
-specifies the radix for the result and the optional third argument
-.Fa minimum
-specifies the minimum number of digits in the result.
-.It Fn expr expr
-This is an alias for
-.Ic eval .
-.It Fn format formatstring arg1 ...
-Returns
-.Fa formatstring
-with escape sequences substituted with
-.Fa arg1
-and following arguments, in a way similar to
-.Xr printf 3 .
-This built-in is only available in GNU-m4 compatibility mode, and the only
-parameters implemented are there for autoconf compatibility:
-left-padding flag, an optional field width, a maximum field width,
-*-specified field widths, and the %s and %c data type.
-.It Fn ifdef name yes no
-If the macro named by the first argument is defined then return the second
-argument, otherwise the third.
-If there is no third argument, the value is
-.Dv NULL .
-The word
-.Qq unix
-is predefined.
-.It Fn ifelse a b yes ...
-If the first argument
-.Fa a
-matches the second argument
-.Fa b
-then
-.Fn ifelse
-returns
-the third argument
-.Fa yes .
-If the match fails the three arguments are
-discarded and the next three arguments are used until there is
-zero or one arguments left, either this last argument or
-.Dv NULL
-is returned if no other matches were found.
-.It Fn include name
-Returns the contents of the file specified in the first argument.
-If the file is not found as is, look through the include path:
-first the directories specified with
-.Fl I
-on the command line, then the environment variable
-.Ev M4PATH ,
-as a colon-separated list of directories.
-Include aborts with an error message if the file cannot be included.
-.It Fn incr arg
-Increments the argument by 1.
-The argument must be a valid numeric string.
-.It Fn index string substring
-Returns the index of the second argument in the first argument (e.g.,
-.Ic index(the quick brown fox jumped, fox)
-returns 16).
-If the second
-argument is not found index returns \-1.
-.It Fn indir macro arg1 ...
-Indirectly calls the macro whose name is passed as the first argument,
-with the remaining arguments passed as first, ... arguments.
-.It Fn len arg
-Returns the number of characters in the first argument.
-Extra arguments
-are ignored.
-.It Fn m4exit code
-Immediately exits with the return value specified by the first argument,
-0 if none.
-.It Fn m4wrap todo
-Allows you to define what happens at the final
-.Dv EOF ,
-usually for cleanup purposes (e.g.,
-.Ic m4wrap("cleanup(tempfile)")
-causes the macro cleanup to be
-invoked after all other processing is done).
-.Pp
-Multiple calls to
-.Fn m4wrap
-get inserted in sequence at the final
-.Dv EOF .
-.It Fn maketemp template
-Invokes
-.Xr mkstemp 3
-on the first argument, and returns the modified string.
-This can be used to create unique
-temporary file names.
-.It Fn paste file
-Includes the contents of the file specified by the first argument without
-any macro processing.
-Aborts with an error message if the file cannot be
-included.
-.It Fn patsubst string regexp replacement
-Substitutes a regular expression in a string with a replacement string.
-Usual substitution patterns apply: an ampersand
-.Pq Sq \&&
-is replaced by the string matching the regular expression.
-The string
-.Sq \e# ,
-where
-.Sq #
-is a digit, is replaced by the corresponding back-reference.
-.It Fn popdef arg ...
-Restores the
-.Ic pushdef Ns ed
-definition for each argument.
-.It Fn pushdef macro def
-Takes the same arguments as
-.Ic define ,
-but it saves the definition on a
-stack for later retrieval by
-.Fn popdef .
-.It Fn regexp string regexp replacement
-Finds a regular expression in a string.
-If no further arguments are given,
-it returns the first match position or \-1 if no match.
-If a third argument
-is provided, it returns the replacement string, with sub-patterns replaced.
-.It Fn shift arg1 ...
-Returns all but the first argument, the remaining arguments are
-quoted and pushed back with commas in between.
-The quoting
-nullifies the effect of the extra scan that will subsequently be
-performed.
-.It Fn sinclude file
-Similar to
-.Ic include ,
-except it ignores any errors.
-.It Fn spaste file
-Similar to
-.Fn paste ,
-except it ignores any errors.
-.It Fn substr string offset length
-Returns a substring of the first argument starting at the offset specified
-by the second argument and the length specified by the third argument.
-If no third argument is present it returns the rest of the string.
-.It Fn syscmd cmd
-Passes the first argument to the shell.
-Nothing is returned.
-.It Ic sysval
-Returns the return value from the last
-.Ic syscmd .
-.It Fn traceon arg ...
-Enables tracing of macro expansions for the given arguments, or for all
-macros if no argument is given.
-.It Fn traceoff arg ...
-Disables tracing of macro expansions for the given arguments, or for all
-macros if no argument is given.
-.It Fn translit string mapfrom mapto
-Transliterate the characters in the first argument from the set
-given by the second argument to the set given by the third.
-You cannot use
-.Xr tr 1
-style abbreviations.
-.It Fn undefine name1 ...
-Removes the definition for the macros specified by its arguments.
-.It Fn undivert arg ...
-Flushes the named output queues (or all queues if no arguments).
-.It Ic unix
-A pre-defined macro for testing the OS platform.
-.It Ic __line__
-Returns the current file's line number.
-.It Ic __file__
-Returns the current file's name.
-.El
-.Sh STANDARDS
-The
-.Nm
-utility is compliant with the
-.St -p1003.1-2008
-specification.
-.Pp
-The flags
-.Op Fl dgIot
-and the macros
-.Ic builtin ,
-.Ic esyscmd ,
-.Ic expr ,
-.Ic format ,
-.Ic indir ,
-.Ic paste ,
-.Ic patsubst ,
-.Ic regexp ,
-.Ic spaste ,
-.Ic unix ,
-.Ic __line__ ,
-and
-.Ic __file__
-are extensions to that specification.
-.Pp
-The output format of tracing and of
-.Ic dumpdef
-are not specified in any standard,
-are likely to change and should not be relied upon.
-The current format of tracing is closely modelled on
-.Nm gnu-m4 ,
-to allow
-.Nm autoconf
-to work.
-.Pp
-The built-ins
-.Ic pushdef
-and
-.Ic popdef
-handle macro definitions as a stack.
-However,
-.Ic define
-interacts with the stack in an undefined way.
-In this implementation,
-.Ic define
-replaces the top-most definition only.
-Other implementations may erase all definitions on the stack instead.
-.Pp
-All built-ins do expand without arguments in many other
-.Nm m4 .
-.Pp
-Many other
-.Nm
-have dire size limitations with respect to buffer sizes.
-.Sh AUTHORS
-.An -nosplit
-.An Ozan Yigit Aq Mt oz@sis.yorku.ca
-and
-.An Richard A. O'Keefe Aq Mt ok@goanna.cs.rmit.OZ.AU .
-.Pp
-GNU-m4 compatibility extensions by
-.An Marc Espie Aq Mt espie@cvs.openbsd.org .
diff --git a/usr.bin/m4/main.c b/usr.bin/m4/main.c
deleted file mode 100644
index cba65ad..0000000
--- a/usr.bin/m4/main.c
+++ /dev/null
@@ -1,811 +0,0 @@
-/* $OpenBSD: main.c,v 1.77 2009/10/14 17:19:47 sthen Exp $ */
-/* $NetBSD: main.c,v 1.46 2016/01/23 14:24:43 christos Exp $ */
-
-/*-
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * 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.
- */
-
-/*
- * main.c
- * Facility: m4 macro processor
- * by: oz
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: main.c,v 1.46 2016/01/23 14:24:43 christos Exp $");
-#include <assert.h>
-#include <signal.h>
-#include <getopt.h>
-#include <err.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <ohash.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-#include "pathnames.h"
-
-ndptr hashtab[HASHSIZE]; /* hash table for macros etc. */
-stae *mstack; /* stack of m4 machine */
-char *sstack; /* shadow stack, for string space extension */
-static size_t STACKMAX; /* current maximum size of stack */
-int sp; /* current m4 stack pointer */
-int fp; /* m4 call frame pointer */
-struct input_file infile[MAXINP];/* input file stack (0=stdin) */
-FILE **outfile; /* diversion array(0=bitbucket)*/
-int maxout;
-FILE *active; /* active output file pointer */
-int ilevel = 0; /* input file stack pointer */
-int oindex = 0; /* diversion index.. */
-const char *null = ""; /* as it says.. just a null.. */
-char **m4wraps = NULL; /* m4wraps array. */
-int maxwraps = 0; /* size of m4wraps array */
-int wrapindex = 0; /* current offset in m4wraps */
-char lquote[MAXCCHARS+1] = {LQUOTE}; /* left quote character (`) */
-char rquote[MAXCCHARS+1] = {RQUOTE}; /* right quote character (') */
-char scommt[MAXCCHARS+1] = {SCOMMT}; /* start character for comment */
-char ecommt[MAXCCHARS+1] = {ECOMMT}; /* end character for comment */
-int synch_lines = 0; /* line synchronisation for C preprocessor */
-int prefix_builtins = 0; /* -P option to prefix builtin keywords */
-int fatal_warnings = 0; /* -E option to exit on warnings */
-int quiet = 0; /* -Q option to silence warnings */
-int nesting_limit = -1; /* -L for nesting limit */
-const char *freeze = NULL; /* -F to freeze state */
-const char *reload = NULL; /* -R to reload state */
-#ifndef REAL_FREEZE
-FILE *freezef = NULL;
-int thawing = 0;
-#endif
-
-struct keyblk {
- const char *knam; /* keyword name */
- int ktyp; /* keyword type */
-};
-
-struct keyblk keywrds[] = { /* m4 keywords to be installed */
- { "include", INCLTYPE },
- { "sinclude", SINCTYPE },
- { "define", DEFITYPE },
- { "defn", DEFNTYPE },
- { "divert", DIVRTYPE | NOARGS },
- { "expr", EXPRTYPE },
- { "eval", EXPRTYPE },
- { "substr", SUBSTYPE },
- { "ifelse", IFELTYPE },
- { "ifdef", IFDFTYPE },
- { "len", LENGTYPE },
- { "incr", INCRTYPE },
- { "decr", DECRTYPE },
- { "dnl", DNLNTYPE | NOARGS },
- { "changequote", CHNQTYPE | NOARGS },
- { "changecom", CHNCTYPE | NOARGS },
- { "index", INDXTYPE },
-#ifdef EXTENDED
- { "paste", PASTTYPE },
- { "spaste", SPASTYPE },
- /* Newer extensions, needed to handle gnu-m4 scripts */
- { "indir", INDIRTYPE},
- { "builtin", BUILTINTYPE},
- { "patsubst", PATSTYPE},
- { "regexp", REGEXPTYPE},
- { "esyscmd", ESYSCMDTYPE},
- { "__file__", FILENAMETYPE | NOARGS},
- { "__line__", LINETYPE | NOARGS},
-#endif
- { "popdef", POPDTYPE },
- { "pushdef", PUSDTYPE },
- { "dumpdef", DUMPTYPE | NOARGS },
- { "shift", SHIFTYPE | NOARGS },
- { "translit", TRNLTYPE },
- { "undefine", UNDFTYPE },
- { "undivert", UNDVTYPE | NOARGS },
- { "divnum", DIVNTYPE | NOARGS },
- { "maketemp", MKTMTYPE },
- { "errprint", ERRPTYPE | NOARGS },
- { "m4wrap", M4WRTYPE | NOARGS },
- { "m4exit", EXITTYPE | NOARGS },
- { "syscmd", SYSCTYPE },
- { "sysval", SYSVTYPE | NOARGS },
- { "traceon", TRACEONTYPE | NOARGS },
- { "traceoff", TRACEOFFTYPE | NOARGS },
-
-#if defined(unix) || defined(__unix__)
- { "unix", SELFTYPE | NOARGS },
-#else
-#ifdef vms
- { "vms", SELFTYPE | NOARGS },
-#endif
-#endif
-};
-
-#define MAXKEYS (sizeof(keywrds)/sizeof(struct keyblk))
-
-#define MAXRECORD 50
-static struct position {
- char *name;
- unsigned long line;
-} quotes[MAXRECORD], paren[MAXRECORD];
-
-static void record(struct position *, int);
-static void dump_stack(struct position *, int);
-
-static void macro(void);
-static void initkwds(void);
-static ndptr inspect(int, char *);
-static int do_look_ahead(int, const char *);
-static void reallyoutputstr(const char *);
-static void reallyputchar(int);
-
-static void enlarge_stack(void);
-static void help(void);
-
-static void
-usage(FILE *f)
-{
- fprintf(f, "Usage: %s [-EGgiPQsv] [-Dname[=value]] [-d flags] "
- "[-I dirname] [-o filename] [-L limit]\n"
- "\t[-t macro] [-Uname] [file ...]\n", getprogname());
-}
-
-__dead static void
-onintr(int signo)
-{
- char intrmessage[] = "m4: interrupted.\n";
- write(STDERR_FILENO, intrmessage, sizeof(intrmessage)-1);
- _exit(1);
-}
-
-#define OPT_HELP 1
-
-struct option longopts[] = {
- { "debug", optional_argument, 0, 'd' },
- { "define", required_argument, 0, 'D' },
- { "error-output", required_argument, 0, 'e' },
- { "fatal-warnings", no_argument, 0, 'E' },
- { "freeze-state", required_argument, 0, 'F' },
- { "gnu", no_argument, 0, 'g' },
- { "help", no_argument, 0, OPT_HELP },
- { "include", required_argument, 0, 'I' },
- { "interactive", no_argument, 0, 'i' },
- { "nesting-limit", required_argument, 0, 'L' },
- { "prefix-builtins", no_argument, 0, 'P' },
- { "quiet", no_argument, 0, 'Q' },
- { "reload-state", required_argument, 0, 'R' },
- { "silent", no_argument, 0, 'Q' },
- { "synclines", no_argument, 0, 's' },
- { "trace", required_argument, 0, 't' },
- { "traditional", no_argument, 0, 'G' },
- { "undefine", required_argument, 0, 'U' },
- { "version", no_argument, 0, 'v' },
-#ifdef notyet
- { "arglength", required_argument, 0, 'l' },
- { "debugfile", optional_argument, 0, OPT_DEBUGFILE },
- { "hashsize", required_argument, 0, 'H' },
- { "warn-macro-sequence",optional_argument, 0, OPT_WARN_SEQUENCE },
-#endif
- { 0, 0, 0, 0 },
-};
-
-int
-main(int argc, char *argv[])
-{
- int c;
- int n;
- char *p;
-
- setprogname(argv[0]);
-
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, onintr);
-
- init_macros();
- initspaces();
- STACKMAX = INITSTACKMAX;
-
- mstack = (stae *)xalloc(sizeof(stae) * STACKMAX, NULL);
- sstack = (char *)xalloc(STACKMAX, NULL);
-
- maxout = 0;
- outfile = NULL;
- resizedivs(MAXOUT);
-
- while ((c = getopt_long(argc, argv, "D:d:e:EF:GgI:iL:o:PR:Qst:U:v",
- longopts, NULL)) != -1)
- switch(c) {
- case 'D': /* define something..*/
- for (p = optarg; *p; p++)
- if (*p == '=')
- break;
- if (*p)
- *p++ = EOS;
- dodefine(optarg, p);
- break;
- case 'd':
- set_trace_flags(optarg);
- break;
- case 'E':
- fatal_warnings++;
- break;
- case 'e':
- if (freopen(optarg, "w+", stderr) == NULL)
- err(EXIT_FAILURE, "Can't redirect errors to `%s'",
- optarg);
- break;
- case 'F':
- freeze = optarg;
-#ifndef REAL_FREEZE
- if ((freezef = fopen(freeze, "w")) == NULL)
- err(EXIT_FAILURE, "Can't open `%s'", freeze);
-#endif
- break;
- case 'I':
- addtoincludepath(optarg);
- break;
- case 'i':
- setvbuf(stdout, NULL, _IONBF, 0);
- signal(SIGINT, SIG_IGN);
- break;
- case 'G':
- mimic_gnu = 0;
- break;
- case 'g':
- mimic_gnu = 1;
- break;
- case 'L':
- nesting_limit = atoi(optarg);
- break;
- case 'o':
- trace_file(optarg);
- break;
- case 'P':
- prefix_builtins = 1;
- break;
- case 'Q':
- quiet++;
- break;
- case 'R':
- reload = optarg;
- break;
- case 's':
- synch_lines = 1;
- break;
- case 't':
- mark_traced(optarg, 1);
- break;
- case 'U': /* undefine... */
- macro_popdef(optarg);
- break;
- case 'v':
- fprintf(stderr, "%s version %d\n", getprogname(),
- VERSION);
- return EXIT_SUCCESS;
- case OPT_HELP:
- help();
- return EXIT_SUCCESS;
- case '?':
- default:
- usage(stderr);
- return EXIT_FAILURE;
- }
-
-#ifdef REDIRECT
- /*
- * This is meant only for debugging; it makes all output
- * go to a known file, even if the command line options
- * send it elsewhere. It should not be turned of in production code.
- */
- if (freopen("/tmp/m4", "w+", stderr) == NULL)
- err(EXIT_FAILURE, "Can't redirect errors to `%s'",
- "/tmp/m4");
-#endif
- argc -= optind;
- argv += optind;
-
-
- initkwds();
- if (mimic_gnu)
- setup_builtin("format", FORMATTYPE);
-
- active = stdout; /* default active output */
- bbase[0] = bufbase;
-
- if (reload) {
-#ifdef REAL_FREEZE
- thaw_state(reload);
-#else
- if (fopen_trypath(infile, reload) == NULL)
- err(1, "Can't open `%s'", reload);
- sp = -1;
- fp = 0;
- thawing = 1;
- macro();
- thawing = 0;
- release_input(infile);
-#endif
- }
-
- if (!argc) {
- sp = -1; /* stack pointer initialized */
- fp = 0; /* frame pointer initialized */
- set_input(infile+0, stdin, "stdin");
- /* default input (naturally) */
- macro();
- } else
- for (; argc--; ++argv) {
- p = *argv;
- if (p[0] == '-' && p[1] == EOS)
- set_input(infile, stdin, "stdin");
- else if (fopen_trypath(infile, p) == NULL)
- err(1, "%s", p);
- sp = -1;
- fp = 0;
- macro();
- release_input(infile);
- }
-
- if (wrapindex) {
- int i;
-
- ilevel = 0; /* in case m4wrap includes.. */
- bufbase = bp = buf; /* use the entire buffer */
- if (mimic_gnu) {
- while (wrapindex != 0) {
- for (i = 0; i < wrapindex; i++)
- pbstr(m4wraps[i]);
- wrapindex =0;
- macro();
- }
- } else {
- for (i = 0; i < wrapindex; i++) {
- pbstr(m4wraps[i]);
- macro();
- }
- }
- }
-
- if (active != stdout)
- active = stdout; /* reset output just in case */
- for (n = 1; n < maxout; n++) /* default wrap-up: undivert */
- if (outfile[n] != NULL)
- getdiv(n);
- /* remove bitbucket if used */
- if (outfile[0] != NULL) {
- (void) fclose(outfile[0]);
- }
-
-#ifdef REAL_FREEZE
- if (freeze)
- freeze_state(freeze);
-#else
- if (freezef)
- fclose(freezef);
-#endif
-
- return 0;
-}
-
-/*
- * Look ahead for `token'.
- * (on input `t == token[0]')
- * Used for comment and quoting delimiters.
- * Returns 1 if `token' present; copied to output.
- * 0 if `token' not found; all characters pushed back
- */
-static int
-do_look_ahead(int t, const char *token)
-{
- int i;
-
- assert((unsigned char)t == (unsigned char)token[0]);
-
- for (i = 1; *++token; i++) {
- t = gpbc();
- if (t == EOF || (unsigned char)t != (unsigned char)*token) {
- pushback(t);
- while (--i)
- pushback(*--token);
- return 0;
- }
- }
- return 1;
-}
-
-#define LOOK_AHEAD(t, token) (t != EOF && \
- (unsigned char)(t)==(unsigned char)(token)[0] && \
- do_look_ahead(t,token))
-
-/*
- * macro - the work horse..
- */
-static void
-macro(void)
-{
- char token[MAXTOK+1];
- int t, l;
- ndptr p;
- int nlpar;
-
- cycle {
- t = gpbc();
-
- if (LOOK_AHEAD(t,lquote)) { /* strip quotes */
- nlpar = 0;
- record(quotes, nlpar++);
- /*
- * Opening quote: scan forward until matching
- * closing quote has been found.
- */
- do {
-
- l = gpbc();
- if (LOOK_AHEAD(l,rquote)) {
- if (--nlpar > 0)
- outputstr(rquote);
- } else if (LOOK_AHEAD(l,lquote)) {
- record(quotes, nlpar++);
- outputstr(lquote);
- } else if (l == EOF) {
- if (!quiet) {
- if (nlpar == 1)
- warnx("unclosed quote:");
- else
- warnx(
- "%d unclosed quotes:",
- nlpar);
- dump_stack(quotes, nlpar);
- }
- exit(EXIT_FAILURE);
- } else {
- if (nlpar > 0) {
- if (sp < 0)
- reallyputchar(l);
- else
- CHRSAVE(l);
- }
- }
- }
- while (nlpar != 0);
- } else if (sp < 0 && LOOK_AHEAD(t, scommt)) {
- reallyoutputstr(scommt);
-
- for(;;) {
- t = gpbc();
- if (LOOK_AHEAD(t, ecommt)) {
- reallyoutputstr(ecommt);
- break;
- }
- if (t == EOF)
- break;
- reallyputchar(t);
- }
- } else if (t == '_' || isalpha(t)) {
- p = inspect(t, token);
- if (p != NULL)
- pushback(l = gpbc());
- if (p == NULL || (l != LPAREN &&
- (macro_getdef(p)->type & NEEDARGS) != 0))
- outputstr(token);
- else {
- /*
- * real thing.. First build a call frame:
- */
- pushf(fp); /* previous call frm */
- pushf(macro_getdef(p)->type); /* type of the call */
- pushf(is_traced(p));
- pushf(0); /* parenthesis level */
- fp = sp; /* new frame pointer */
- /*
- * now push the string arguments:
- */
- pushs1(macro_getdef(p)->defn); /* defn string */
- pushs1((char *)macro_name(p)); /* macro name */
- pushs(ep); /* start next..*/
-
- if (l != LPAREN && PARLEV == 0) {
- /* no bracks */
- chrsave(EOS);
-
- if ((size_t)sp == STACKMAX)
- errx(1, "internal stack overflow");
- eval((const char **) mstack+fp+1, 2,
- CALTYP, TRACESTATUS);
-
- ep = PREVEP; /* flush strspace */
- sp = PREVSP; /* previous sp.. */
- fp = PREVFP; /* rewind stack...*/
- }
- }
- } else if (t == EOF) {
- if (sp > -1 && ilevel <= 0) {
- if (!quiet) {
- warnx("unexpected end of input, "
- "unclosed parenthesis:");
- dump_stack(paren, PARLEV);
- }
- exit(EXIT_FAILURE);
- }
- if (ilevel <= 0)
- break; /* all done thanks.. */
- release_input(infile+ilevel--);
- emit_synchline();
- bufbase = bbase[ilevel];
- continue;
- } else if (sp < 0) { /* not in a macro at all */
- reallyputchar(t); /* output directly.. */
- }
-
- else switch(t) {
-
- case LPAREN:
- if (PARLEV > 0)
- chrsave(t);
- while (isspace(l = gpbc())) /* skip blank, tab, nl.. */
- if (PARLEV > 0)
- chrsave(l);
- pushback(l);
- record(paren, PARLEV++);
- break;
-
- case RPAREN:
- if (--PARLEV > 0)
- chrsave(t);
- else { /* end of argument list */
- chrsave(EOS);
-
- if ((size_t)sp == STACKMAX)
- errx(1, "internal stack overflow");
-
- eval((const char **) mstack+fp+1, sp-fp,
- CALTYP, TRACESTATUS);
-
- ep = PREVEP; /* flush strspace */
- sp = PREVSP; /* previous sp.. */
- fp = PREVFP; /* rewind stack...*/
- }
- break;
-
- case COMMA:
- if (PARLEV == 1) {
- chrsave(EOS); /* new argument */
- while (isspace(l = gpbc()))
- ;
- pushback(l);
- pushs(ep);
- } else
- chrsave(t);
- break;
-
- default:
- if (LOOK_AHEAD(t, scommt)) {
- char *q;
- for (q = scommt; *q; q++)
- chrsave(*q);
- for(;;) {
- t = gpbc();
- if (LOOK_AHEAD(t, ecommt)) {
- for (q = ecommt; *q; q++)
- chrsave(*q);
- break;
- }
- if (t == EOF)
- break;
- CHRSAVE(t);
- }
- } else
- CHRSAVE(t); /* stack the char */
- break;
- }
- }
-}
-
-/*
- * output string directly, without pushing it for reparses.
- */
-void
-outputstr(const char *s)
-{
- if (sp < 0)
- reallyoutputstr(s);
- else
- while (*s)
- CHRSAVE(*s++);
-}
-
-void
-reallyoutputstr(const char *s)
-{
- if (synch_lines) {
- while (*s) {
- fputc(*s, active);
- if (*s++ == '\n') {
- infile[ilevel].synch_lineno++;
- if (infile[ilevel].synch_lineno !=
- infile[ilevel].lineno)
- do_emit_synchline();
- }
- }
- } else
- fputs(s, active);
-}
-
-void
-reallyputchar(int c)
-{
- putc(c, active);
- if (synch_lines && c == '\n') {
- infile[ilevel].synch_lineno++;
- if (infile[ilevel].synch_lineno != infile[ilevel].lineno)
- do_emit_synchline();
- }
-}
-
-/*
- * build an input token..
- * consider only those starting with _ or A-Za-z.
- */
-static ndptr
-inspect(int c, char *tp)
-{
- char *name = tp;
- char *etp = tp+MAXTOK;
- ndptr p;
-
- *tp++ = c;
-
- while ((isalnum(c = gpbc()) || c == '_') && tp < etp)
- *tp++ = c;
- if (c != EOF)
- PUSHBACK(c);
- *tp = EOS;
- /* token is too long, it won't match anything, but it can still
- * be output. */
- if (tp == ep) {
- outputstr(name);
- while (isalnum(c = gpbc()) || c == '_') {
- if (sp < 0)
- reallyputchar(c);
- else
- CHRSAVE(c);
- }
- *name = EOS;
- return NULL;
- }
-
- p = ohash_find(&macros, ohash_qlookupi(&macros, name, (void *)&tp));
- if (p == NULL)
- return NULL;
- if (macro_getdef(p) == NULL)
- return NULL;
- return p;
-}
-
-/*
- * initkwds - initialise m4 keywords as fast as possible.
- * This very similar to install, but without certain overheads,
- * such as calling lookup. Malloc is not used for storing the
- * keyword strings, since we simply use the static pointers
- * within keywrds block.
- */
-static void
-initkwds(void)
-{
- unsigned int type;
- size_t i;
-
- for (i = 0; i < MAXKEYS; i++) {
- type = keywrds[i].ktyp;
- if ((keywrds[i].ktyp & NOARGS) == 0)
- type |= NEEDARGS;
- setup_builtin(keywrds[i].knam, type);
- }
-}
-
-static void
-record(struct position *t, int lev)
-{
- if (lev < MAXRECORD) {
- t[lev].name = CURRENT_NAME;
- t[lev].line = CURRENT_LINE;
- }
-}
-
-static void
-dump_stack(struct position *t, int lev)
-{
- int i;
-
- for (i = 0; i < lev; i++) {
- if (i == MAXRECORD) {
- fprintf(stderr, " ...\n");
- break;
- }
- fprintf(stderr, " %s at line %lu\n",
- t[i].name, t[i].line);
- }
-}
-
-
-static void
-enlarge_stack(void)
-{
- STACKMAX += STACKMAX/2;
- mstack = xrealloc(mstack, sizeof(stae) * STACKMAX,
- "Evaluation stack overflow (%lu)",
- (unsigned long)STACKMAX);
- sstack = xrealloc(sstack, STACKMAX,
- "Evaluation stack overflow (%lu)",
- (unsigned long)STACKMAX);
-}
-
-static const struct {
- const char *n;
- const char *d;
-} nd [] = {
-{ "-d, --debug[=flags]", "set debug flags" },
-{ "-D, --define=name[=value]", "define macro" },
-{ "-e, --error-output=file", "send error output to file" },
-{ "-E, --fatal-warnings", "exit on warnings" },
-{ "-F, --freeze-state=file", "save state to file" },
-{ "-g, --gnu", "enable gnu extensions" },
-{ " --help", "print this message and exit" },
-{ "-I, --include=file", "include file" },
-{ "-i, --interactive", "unbuffer output, ignore tty signals" },
-{ "-L, --nesting-limit=num", "macro expansion nesting limit (unimpl)" },
-{ "-P, --prefix-builtins", "prefix builtins with m4_" },
-{ "-Q, --quiet", "don't print warnings" },
-{ "-R, --reload-state=file", "restore state from file" },
-{ "-Q, --silent", "don't print warnings" },
-{ "-s, --synclines", "output line directives for cpp(1)" },
-{ "-t, --trace=macro", "trace the named macro" },
-{ "-G, --traditional", "disable gnu extensions" },
-{ "-U, --undefine=name", "undefine the named macro" },
-{ "-v, --version", "print the version number and exit" },
-};
-
-static void
-help(void)
-{
- size_t i;
- fprintf(stdout, "%s version %d\n\n", getprogname(), VERSION);
- usage(stdout);
-
- fprintf(stdout, "\nThe long options are:\n");
- for (i = 0; i < __arraycount(nd); i++)
- fprintf(stdout, "\t%-25.25s\t%s\n", nd[i].n, nd[i].d);
-}
diff --git a/usr.bin/m4/mdef.h b/usr.bin/m4/mdef.h
deleted file mode 100644
index f80c208..0000000
--- a/usr.bin/m4/mdef.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/* $OpenBSD: mdef.h,v 1.29 2006/03/20 20:27:45 espie Exp $ */
-/* $NetBSD: mdef.h,v 1.17 2016/01/16 18:31:29 christos Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * 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.
- *
- * @(#)mdef.h 8.1 (Berkeley) 6/6/93
- */
-
-#ifdef __GNUC__
-# define UNUSED __attribute__((__unused__))
-#else
-# define UNUSED
-#endif
-
-#define MACRTYPE 1
-#define DEFITYPE 2
-#define EXPRTYPE 3
-#define SUBSTYPE 4
-#define IFELTYPE 5
-#define LENGTYPE 6
-#define CHNQTYPE 7
-#define SYSCTYPE 8
-#define UNDFTYPE 9
-#define INCLTYPE 10
-#define SINCTYPE 11
-#define PASTTYPE 12
-#define SPASTYPE 13
-#define INCRTYPE 14
-#define IFDFTYPE 15
-#define PUSDTYPE 16
-#define POPDTYPE 17
-#define SHIFTYPE 18
-#define DECRTYPE 19
-#define DIVRTYPE 20
-#define UNDVTYPE 21
-#define DIVNTYPE 22
-#define MKTMTYPE 23
-#define ERRPTYPE 24
-#define M4WRTYPE 25
-#define TRNLTYPE 26
-#define DNLNTYPE 27
-#define DUMPTYPE 28
-#define CHNCTYPE 29
-#define INDXTYPE 30
-#define SYSVTYPE 31
-#define EXITTYPE 32
-#define DEFNTYPE 33
-#define SELFTYPE 34
-#define INDIRTYPE 35
-#define BUILTINTYPE 36
-#define PATSTYPE 37
-#define FILENAMETYPE 38
-#define LINETYPE 39
-#define REGEXPTYPE 40
-#define ESYSCMDTYPE 41
-#define TRACEONTYPE 42
-#define TRACEOFFTYPE 43
-#define FORMATTYPE 44
-
-#define BUILTIN_MARKER "__builtin_"
-
-#define TYPEMASK 0xff /* Keep bits really corresponding to a type. */
-#define RECDEF 0x100 /* Pure recursive def, don't expand it */
-#define NOARGS 0x200 /* builtin needs no args */
-#define NEEDARGS 0x400 /* mark builtin that need args with this */
-
-/*
- * m4 special characters
- */
-
-#define ARGFLAG '$'
-#define LPAREN '('
-#define RPAREN ')'
-#define LQUOTE '`'
-#define RQUOTE '\''
-#define COMMA ','
-#define SCOMMT '#'
-#define ECOMMT '\n'
-
-#ifdef msdos
-#define system(str) (-1)
-#endif
-
-/*
- * other important constants
- */
-
-#define EOS '\0'
-#define MAXINP 10 /* maximum include files */
-#define MAXOUT 10 /* maximum # of diversions */
-#define BUFSIZE 4096 /* starting size of pushback buffer */
-#define INITSTACKMAX 4096 /* starting size of call stack */
-#define STRSPMAX 4096 /* starting size of string space */
-#define MAXTOK 512 /* maximum chars in a tokn */
-#define HASHSIZE 199 /* maximum size of hashtab */
-#define MAXCCHARS 5 /* max size of comment/quote delim */
-
-#define ALL 1
-#define TOP 0
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-#define cycle for(;;)
-
-/*
- * m4 data structures
- */
-
-typedef struct ndblock *ndptr;
-
-struct macro_definition {
- struct macro_definition *next;
- char *defn; /* definition.. */
- unsigned int type; /* type of the entry.. */
-};
-
-
-struct ndblock { /* hashtable structure */
- unsigned int builtin_type;
- unsigned int trace_flags;
- struct macro_definition *d;
- char name[1]; /* entry name.. */
-};
-
-typedef union { /* stack structure */
- int sfra; /* frame entry */
- char *sstr; /* string entry */
-} stae;
-
-struct input_file {
- FILE *file;
- char *name;
- unsigned long lineno;
- unsigned long synch_lineno; /* used for -s */
- int c;
-};
-
-#define CURRENT_NAME (infile[ilevel].name)
-#define CURRENT_LINE (infile[ilevel].lineno)
-#define TOKEN_LINE(f) (f->lineno - (f->c == '\n' ? 1 : 0))
-
-/*
- * macros for readibility and/or speed
- *
- * gpbc() - get a possibly pushed-back character
- * pushf() - push a call frame entry onto stack
- * pushs() - push a string pointer onto stack
- */
-#define gpbc() (bp > bufbase) ? *--bp : obtain_char(infile+ilevel)
-#define pushf(x) \
- do { \
- if ((size_t)++sp == STACKMAX) \
- enlarge_stack();\
- mstack[sp].sfra = (x); \
- sstack[sp] = 0; \
- } while (0)
-
-#define pushs(x) \
- do { \
- if ((size_t)++sp == STACKMAX) \
- enlarge_stack();\
- mstack[sp].sstr = (x); \
- sstack[sp] = 1; \
- } while (0)
-
-#define pushs1(x) \
- do { \
- if ((size_t)++sp == STACKMAX) \
- enlarge_stack();\
- mstack[sp].sstr = (x); \
- sstack[sp] = 0; \
- } while (0)
-
-/*
- * . .
- * | . | <-- sp | . |
- * +-------+ +-----+
- * | arg 3 ----------------------->| str |
- * +-------+ | . |
- * | arg 2 ---PREVEP-----+ .
- * +-------+ |
- * . | | |
- * +-------+ | +-----+
- * | plev | PARLEV +-------->| str |
- * +-------+ | . |
- * | type | CALTYP .
- * +-------+
- * | prcf ---PREVFP--+
- * +-------+ |
- * | . | PREVSP |
- * . |
- * +-------+ |
- * | <----------+
- * +-------+
- *
- */
-#define PARLEV (mstack[fp].sfra)
-#define CALTYP (mstack[fp-2].sfra)
-#define TRACESTATUS (mstack[fp-1].sfra)
-#define PREVEP (mstack[fp+3].sstr)
-#define PREVSP (fp-4)
-#define PREVFP (mstack[fp-3].sfra)
-
-#define VERSION 20150116
diff --git a/usr.bin/m4/misc.c b/usr.bin/m4/misc.c
deleted file mode 100644
index d7bc8cf..0000000
--- a/usr.bin/m4/misc.c
+++ /dev/null
@@ -1,414 +0,0 @@
-/* $OpenBSD: misc.c,v 1.41 2009/10/14 17:19:47 sthen Exp $ */
-/* $NetBSD: misc.c,v 1.24 2016/01/16 17:01:22 christos Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * 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.
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: misc.c,v 1.24 2016/01/16 17:01:22 christos Exp $");
-#include <sys/types.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <err.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-#include "pathnames.h"
-
-
-char *ep; /* first free char in strspace */
-static char *strspace; /* string space for evaluation */
-char *endest; /* end of string space */
-static size_t strsize = STRSPMAX;
-static size_t bufsize = BUFSIZE;
-
-unsigned char *buf; /* push-back buffer */
-unsigned char *bufbase; /* the base for current ilevel */
-unsigned char *bbase[MAXINP]; /* the base for each ilevel */
-unsigned char *bp; /* first available character */
-unsigned char *endpbb; /* end of push-back buffer */
-
-
-/*
- * find the index of second str in the first str.
- */
-ptrdiff_t
-indx(const char *s1, const char *s2)
-{
- char *t;
-
- t = strstr(s1, s2);
- if (t == NULL)
- return (-1);
- else
- return (t - s1);
-}
-/*
- * pushback - push character back onto input
- */
-void
-pushback(int c)
-{
- if (c == EOF)
- return;
- if (bp >= endpbb)
- enlarge_bufspace();
- *bp++ = c;
-}
-
-/*
- * pbstr - push string back onto input
- * pushback is replicated to improve
- * performance.
- */
-void
-pbstr(const char *s)
-{
- size_t n;
-
- n = strlen(s);
- while ((size_t)(endpbb - bp) <= n)
- enlarge_bufspace();
- while (n > 0)
- *bp++ = s[--n];
-}
-
-/*
- * pbnum - convert number to string, push back on input.
- */
-void
-pbnum(int n)
-{
- pbnumbase(n, 10, 0);
-}
-
-void
-pbnumbase(int n, int base, int d)
-{
- static char digits[36] = "0123456789abcdefghijklmnopqrstuvwxyz";
- int num;
- int printed = 0;
-
- if (base > 36)
- m4errx(1, "base %d > 36: not supported.", base);
-
- if (base < 2)
- m4errx(1, "bad base %d for conversion.", base);
-
- num = (n < 0) ? -n : n;
- do {
- pushback(digits[num % base]);
- printed++;
- }
- while ((num /= base) > 0);
-
- if (n < 0)
- printed++;
- while (printed++ < d)
- pushback('0');
-
- if (n < 0)
- pushback('-');
-}
-
-/*
- * pbunsigned - convert unsigned long to string, push back on input.
- */
-void
-pbunsigned(unsigned long n)
-{
- do {
- pushback(n % 10 + '0');
- }
- while ((n /= 10) > 0);
-}
-
-void
-initspaces(void)
-{
- int i;
-
- strspace = xalloc(strsize+1, NULL);
- ep = strspace;
- endest = strspace+strsize;
- buf = (unsigned char *)xalloc(bufsize, NULL);
- bufbase = buf;
- bp = buf;
- endpbb = buf + bufsize;
- for (i = 0; i < MAXINP; i++)
- bbase[i] = buf;
-}
-
-void
-enlarge_strspace(void)
-{
- char *newstrspace;
- int i;
-
- strsize *= 2;
- newstrspace = malloc(strsize + 1);
- if (!newstrspace)
- errx(1, "string space overflow");
- memcpy(newstrspace, strspace, strsize/2);
- for (i = 0; i <= sp; i++)
- if (sstack[i])
- mstack[i].sstr = (mstack[i].sstr - strspace)
- + newstrspace;
- ep = (ep-strspace) + newstrspace;
- free(strspace);
- strspace = newstrspace;
- endest = strspace + strsize;
-}
-
-void
-enlarge_bufspace(void)
-{
- unsigned char *newbuf;
- int i;
-
- bufsize += bufsize/2;
- newbuf = xrealloc(buf, bufsize, "too many characters pushed back");
- for (i = 0; i < MAXINP; i++)
- bbase[i] = (bbase[i]-buf)+newbuf;
- bp = (bp-buf)+newbuf;
- bufbase = (bufbase-buf)+newbuf;
- buf = newbuf;
- endpbb = buf+bufsize;
-}
-
-/*
- * chrsave - put single char on string space
- */
-void
-chrsave(int c)
-{
- if (ep >= endest)
- enlarge_strspace();
- *ep++ = c;
-}
-
-/*
- * read in a diversion file, and dispose it.
- */
-void
-getdiv(int n)
-{
- int c;
-
- if (active == outfile[n])
- m4errx(1, "undivert: diversion still active.");
- rewind(outfile[n]);
- while ((c = getc(outfile[n])) != EOF)
- putc(c, active);
- (void) fclose(outfile[n]);
- outfile[n] = NULL;
-}
-
-/*
- * killdiv - get rid of the diversion files
- */
-void
-killdiv(void)
-{
- int n;
-
- for (n = 0; n < maxout; n++)
- if (outfile[n] != NULL) {
- (void) fclose(outfile[n]);
- }
-}
-
-void
-m4errx(int exval, const char *fmt, ...)
-{
- fprintf(stderr, "%s: ", getprogname());
- fprintf(stderr, "%s at line %lu: ", CURRENT_NAME, CURRENT_LINE);
- if (fmt != NULL) {
- va_list ap;
-
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- }
- fprintf(stderr, "\n");
- exit(exval);
-}
-
-/*
- * resizedivs: allocate more diversion files */
-void
-resizedivs(int n)
-{
- int i;
-
- outfile = (FILE **)xrealloc(outfile, sizeof(FILE *) * n,
- "too many diverts %d", n);
- for (i = maxout; i < n; i++)
- outfile[i] = NULL;
- maxout = n;
-}
-
-void *
-xalloc(size_t n, const char *fmt, ...)
-{
- void *p = malloc(n);
-
- if (p == NULL) {
- if (fmt == NULL)
- err(1, "malloc");
- else {
- va_list va;
-
- va_start(va, fmt);
- verr(1, fmt, va);
- va_end(va);
- }
- }
- return p;
-}
-
-void *
-xrealloc(void *old, size_t n, const char *fmt, ...)
-{
- char *p = realloc(old, n);
-
- if (p == NULL) {
- free(old);
- if (fmt == NULL)
- err(1, "realloc");
- else {
- va_list va;
-
- va_start(va, fmt);
- verr(1, fmt, va);
- va_end(va);
- }
- }
- return p;
-}
-
-char *
-xstrdup(const char *s)
-{
- char *p = strdup(s);
- if (p == NULL)
- err(1, "strdup");
- return p;
-}
-
-int
-obtain_char(struct input_file *f)
-{
- if (f->c == EOF)
- return EOF;
-
- f->c = fgetc(f->file);
-#ifndef REAL_FREEZE
- if (freezef)
- fputc(f->c, freezef);
-#endif
- if (f->c == '\n')
- f->lineno++;
-
- return f->c;
-}
-
-void
-set_input(struct input_file *f, FILE *real, const char *name)
-{
- f->file = real;
- f->lineno = 1;
- f->c = 0;
- f->name = xstrdup(name);
- emit_synchline();
-}
-
-void
-do_emit_synchline(void)
-{
- fprintf(active, "#line %lu \"%s\"\n",
- infile[ilevel].lineno, infile[ilevel].name);
- infile[ilevel].synch_lineno = infile[ilevel].lineno;
-}
-
-void
-release_input(struct input_file *f)
-{
- if (f->file != stdin)
- fclose(f->file);
- f->c = EOF;
- /*
- * XXX can't free filename, as there might still be
- * error information pointing to it.
- */
-}
-
-void
-doprintlineno(struct input_file *f)
-{
- pbunsigned(TOKEN_LINE(f));
-}
-
-void
-doprintfilename(struct input_file *f)
-{
- pbstr(rquote);
- pbstr(f->name);
- pbstr(lquote);
-}
-
-/*
- * buffer_mark/dump_buffer: allows one to save a mark in a buffer,
- * and later dump everything that was added since then to a file.
- */
-size_t
-buffer_mark(void)
-{
- return bp - buf;
-}
-
-
-void
-dump_buffer(FILE *f, size_t m)
-{
- unsigned char *s;
-
- for (s = bp; (size_t)(s - buf) > m;)
- fputc(*--s, f);
-}
diff --git a/usr.bin/m4/parser.y b/usr.bin/m4/parser.y
deleted file mode 100644
index f8256ef..0000000
--- a/usr.bin/m4/parser.y
+++ /dev/null
@@ -1,86 +0,0 @@
-%{
-/* $NetBSD: parser.y,v 1.3 2015/01/04 18:31:09 joerg Exp $ */
-/* $OpenBSD: parser.y,v 1.6 2008/08/21 21:00:14 espie Exp $ */
-/*
- * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: parser.y,v 1.3 2015/01/04 18:31:09 joerg Exp $");
-#include <stdint.h>
-#define YYSTYPE int32_t
-extern int32_t end_result;
-extern int yylex(void);
-extern int yyerror(const char *);
-%}
-%token NUMBER
-%token ERROR
-%left LOR
-%left LAND
-%left '|'
-%left '^'
-%left '&'
-%left EQ NE
-%left '<' LE '>' GE
-%left LSHIFT RSHIFT
-%left '+' '-'
-%left '*' '/' '%'
-%right UMINUS UPLUS '!' '~'
-
-%%
-
-top : expr { end_result = $1; }
- ;
-expr : expr '+' expr { $$ = $1 + $3; }
- | expr '-' expr { $$ = $1 - $3; }
- | expr '*' expr { $$ = $1 * $3; }
- | expr '/' expr {
- if ($3 == 0) {
- yyerror("division by zero");
- exit(1);
- }
- $$ = $1 / $3;
- }
- | expr '%' expr {
- if ($3 == 0) {
- yyerror("modulo zero");
- exit(1);
- }
- $$ = $1 % $3;
- }
- | expr LSHIFT expr { $$ = $1 << $3; }
- | expr RSHIFT expr { $$ = $1 >> $3; }
- | expr '<' expr { $$ = $1 < $3; }
- | expr '>' expr { $$ = $1 > $3; }
- | expr LE expr { $$ = $1 <= $3; }
- | expr GE expr { $$ = $1 >= $3; }
- | expr EQ expr { $$ = $1 == $3; }
- | expr NE expr { $$ = $1 != $3; }
- | expr '&' expr { $$ = $1 & $3; }
- | expr '^' expr { $$ = $1 ^ $3; }
- | expr '|' expr { $$ = $1 | $3; }
- | expr LAND expr { $$ = $1 && $3; }
- | expr LOR expr { $$ = $1 || $3; }
- | '(' expr ')' { $$ = $2; }
- | '-' expr %prec UMINUS { $$ = -$2; }
- | '+' expr %prec UPLUS { $$ = $2; }
- | '!' expr { $$ = !$2; }
- | '~' expr { $$ = ~$2; }
- | NUMBER
- ;
-%%
-
diff --git a/usr.bin/m4/pathnames.h b/usr.bin/m4/pathnames.h
deleted file mode 100644
index ef788e0..0000000
--- a/usr.bin/m4/pathnames.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* $NetBSD: pathnames.h,v 1.15 2011/03/08 23:55:19 riz Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * 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.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- */
-
-/*
- * Definitions of diversion files.
- */
-#define _PATH_DIVNAME "/tmp/m4.0XXXXXXXXXX" /* unix diversion files */
diff --git a/usr.bin/m4/stdd.h b/usr.bin/m4/stdd.h
deleted file mode 100644
index 0cbd681..0000000
--- a/usr.bin/m4/stdd.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $NetBSD: stdd.h,v 1.4 2003/08/07 11:14:34 agc Exp $ */
-
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * 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.
- *
- * @(#)stdd.h 8.1 (Berkeley) 6/6/93
- */
-
-/*
- * standard defines
- */
-
-#define max(a,b) ((a) > (b)? (a): (b))
-#define min(a,b) ((a) < (b)? (a): (b))
-
-#define iswhite(c) ((c) == ' ' || (c) == '\t')
-
-/*
- * STREQ is an optimised strcmp(a,b)==0
- * STREQN is an optimised strncmp(a,b,n)==0; assumes n > 0
- */
-#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0)
-#define STREQN(a, b, n) ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)
-
-#define YES 1
-#define NO 0
diff --git a/usr.bin/m4/tokenizer.l b/usr.bin/m4/tokenizer.l
deleted file mode 100644
index fc4ebf1..0000000
--- a/usr.bin/m4/tokenizer.l
+++ /dev/null
@@ -1,108 +0,0 @@
-%{
-/* $NetBSD: tokenizer.l,v 1.6 2012/03/20 20:34:58 matt Exp $ */
-/* $OpenBSD: tokenizer.l,v 1.6 2008/08/21 21:00:14 espie Exp $ */
-/*
- * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include "parser.h"
-__RCSID("$NetBSD: tokenizer.l,v 1.6 2012/03/20 20:34:58 matt Exp $");
-#include <stdlib.h>
-#include <errno.h>
-#include <stdint.h>
-#include <limits.h>
-
-extern int mimic_gnu;
-extern int32_t yylval;
-extern int yylex(void);
-extern int yywrap(void);
-
-int32_t number(void);
-int32_t parse_radix(void);
-
-%}
-
-%option nounput
-%option noinput
-
-delim [ \t\n]
-ws {delim}+
-hex 0[xX][0-9a-fA-F]+
-oct 0[0-7]*
-dec [1-9][0-9]*
-radix 0[rR][0-9]+:[0-9a-zA-Z]+
-
-%%
-{ws} {/* just skip it */}
-{hex}|{oct}|{dec} { yylval = number(); return(NUMBER); }
-{radix} { if (mimic_gnu) {
- yylval = parse_radix(); return(NUMBER);
- } else {
- return(ERROR);
- }
- }
-"<=" { return(LE); }
-">=" { return(GE); }
-"<<" { return(LSHIFT); }
-">>" { return(RSHIFT); }
-"==" { return(EQ); }
-"!=" { return(NE); }
-"&&" { return(LAND); }
-"||" { return(LOR); }
-. { return yytext[0]; }
-%%
-
-int32_t
-number(void)
-{
- long l;
-
- errno = 0;
- l = strtol(yytext, NULL, 0);
- if (((l == LONG_MAX || l == LONG_MIN) && errno == ERANGE) ||
- l > INT32_MAX || l < INT32_MIN) {
- fprintf(stderr, "m4: numeric overflow in expr: %s\n", yytext);
- }
- return l;
-}
-
-int32_t
-parse_radix(void)
-{
- long base;
- char *next;
- long l;
-
- l = 0;
- base = strtol(yytext+2, &next, 0);
- if (base > 36 || next == NULL) {
- fprintf(stderr, "m4: error in number %s\n", yytext);
- } else {
- next++;
- while (*next != 0) {
- if (*next >= '0' && *next <= '9')
- l = base * l + *next - '0';
- else if (*next >= 'a' && *next <= 'z')
- l = base * l + *next - 'a' + 10;
- else if (*next >= 'A' && *next <= 'Z')
- l = base * l + *next - 'A' + 10;
- next++;
- }
- }
- return l;
-}
-
diff --git a/usr.bin/m4/trace.c b/usr.bin/m4/trace.c
deleted file mode 100644
index bb9397f..0000000
--- a/usr.bin/m4/trace.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/* $NetBSD: trace.c,v 1.8 2012/03/20 20:34:58 matt Exp $ */
-/* $OpenBSD: trace.c,v 1.15 2006/03/24 08:03:44 espie Exp $ */
-/*
- * Copyright (c) 2001 Marc Espie.
- *
- * 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 OPENBSD PROJECT 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 OPENBSD
- * PROJECT 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 HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: trace.c,v 1.8 2012/03/20 20:34:58 matt Exp $");
-
-#include <sys/types.h>
-#include <err.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-
-FILE *traceout;
-
-#define TRACE_ARGS 1
-#define TRACE_EXPANSION 2
-#define TRACE_QUOTE 4
-#define TRACE_FILENAME 8
-#define TRACE_LINENO 16
-#define TRACE_CONT 32
-#define TRACE_ID 64
-#define TRACE_NEWFILE 128 /* not implemented yet */
-#define TRACE_INPUT 256 /* not implemented yet */
-
-static unsigned int letter_to_flag(int);
-static void print_header(struct input_file *);
-static int frame_level(void);
-
-
-unsigned int trace_flags = TRACE_QUOTE | TRACE_EXPANSION;
-
-void
-trace_file(const char *name)
-{
-
- if (traceout && traceout != stderr)
- fclose(traceout);
- traceout = fopen(name, "w");
- if (!traceout)
- err(1, "can't open %s", name);
-}
-
-static unsigned int
-letter_to_flag(int c)
-{
- switch(c) {
- case 'a':
- return TRACE_ARGS;
- case 'e':
- return TRACE_EXPANSION;
- case 'q':
- return TRACE_QUOTE;
- case 'c':
- return TRACE_CONT;
- case 'x':
- return TRACE_ID;
- case 'f':
- return TRACE_FILENAME;
- case 'l':
- return TRACE_LINENO;
- case 'p':
- return TRACE_NEWFILE;
- case 'i':
- return TRACE_INPUT;
- case 't':
- return TRACE_ALL;
- case 'V':
- return ~0;
- default:
- return 0;
- }
-}
-
-void
-set_trace_flags(const char *s)
-{
- char mode = 0;
- unsigned int f = 0;
-
- if (*s == '+' || *s == '-')
- mode = *s++;
- while (*s)
- f |= letter_to_flag(*s++);
- switch(mode) {
- case 0:
- trace_flags = f;
- break;
- case '+':
- trace_flags |= f;
- break;
- case '-':
- trace_flags &= ~f;
- break;
- }
-}
-
-static int
-frame_level(void)
-{
- int level;
- int framep;
-
- for (framep = fp, level = 0; framep != 0;
- level++,framep = mstack[framep-3].sfra)
- ;
- return level;
-}
-
-static void
-print_header(struct input_file *inp)
-{
- fprintf(traceout, "m4trace:");
- if (trace_flags & TRACE_FILENAME)
- fprintf(traceout, "%s:", inp->name);
- if (trace_flags & TRACE_LINENO)
- fprintf(traceout, "%lu:", TOKEN_LINE(inp));
- fprintf(traceout, " -%d- ", frame_level());
- if (trace_flags & TRACE_ID)
- fprintf(traceout, "id %lu: ", expansion_id);
-}
-
-size_t
-trace(const char *argv[], int argc, struct input_file *inp)
-{
- if (!traceout)
- traceout = stderr;
- print_header(inp);
- if (trace_flags & TRACE_CONT) {
- fprintf(traceout, "%s ...\n", argv[1]);
- print_header(inp);
- }
- fprintf(traceout, "%s", argv[1]);
- if ((trace_flags & TRACE_ARGS) && argc > 2) {
- char delim[3];
- int i;
-
- delim[0] = LPAREN;
- delim[1] = EOS;
- for (i = 2; i < argc; i++) {
- fprintf(traceout, "%s%s%s%s", delim,
- (trace_flags & TRACE_QUOTE) ? lquote : "",
- argv[i],
- (trace_flags & TRACE_QUOTE) ? rquote : "");
- delim[0] = COMMA;
- delim[1] = ' ';
- delim[2] = EOS;
- }
- fprintf(traceout, "%c", RPAREN);
- }
- if (trace_flags & TRACE_CONT) {
- fprintf(traceout, " -> ???\n");
- print_header(inp);
- fprintf(traceout, argc > 2 ? "%s(...)" : "%s", argv[1]);
- }
- if (trace_flags & TRACE_EXPANSION)
- return buffer_mark();
- else {
- fprintf(traceout, "\n");
- return SIZE_MAX;
- }
-}
-
-void
-finish_trace(size_t mark)
-{
- fprintf(traceout, " -> ");
- if (trace_flags & TRACE_QUOTE)
- fprintf(traceout, "%s", lquote);
- dump_buffer(traceout, mark);
- if (trace_flags & TRACE_QUOTE)
- fprintf(traceout, "%s", rquote);
- fprintf(traceout, "\n");
-}
diff --git a/usr.bin/man/man.1 b/usr.bin/man/man.1
deleted file mode 100644
index 49b3bf3..0000000
--- a/usr.bin/man/man.1
+++ /dev/null
@@ -1,269 +0,0 @@
-.\" $NetBSD: man.1,v 1.29 2016/06/16 15:10:58 abhinav Exp $
-.\"
-.\" Copyright (c) 1989, 1990, 1993
-.\" 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.
-.\" 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.
-.\"
-.\" @(#)man.1 8.2 (Berkeley) 1/2/94
-.\"
-.Dd June 16, 2016
-.Dt MAN 1
-.Os
-.Sh NAME
-.Nm man
-.Nd display the on-line manual pages
-.Pq aka Dq Em man pages
-.Sh SYNOPSIS
-.Nm
-.Oo Fl acw Ns \&| Ns Fl h Oc
-.Op Fl C Ar file
-.Op Fl M Ar path
-.Op Fl m Ar path
-.Op Fl S Ar srch
-.Oo
-.Op Fl s
-.Ar section
-.Oc
-.Ar name Ar ...
-.Nm
-.Op Fl C Ar file
-.Fl f
-.Ar command Ar ...
-.Nm
-.Op Fl C Ar file
-.Fl k
-.Ar keyword Ar ...
-.Nm
-.Fl p
-.Sh DESCRIPTION
-The
-.Nm
-utility displays the manual pages named on the command line.
-Its options are as follows:
-.Bl -tag -width indent
-.It Fl a
-Display all of the man pages for a specified
-.Ar section
-and
-.Ar name
-combination.
-(Normally, only the first man page found is displayed.)
-.It Fl C
-Use the specified
-.Ar file
-instead of the default configuration file.
-This permits users to configure their own man environment.
-See
-.Xr man.conf 5
-for a description of the contents of this file.
-.It Fl c
-Copy the man page to the standard output instead of using
-.Xr more 1
-to paginate it.
-This is done by default if the standard output is not a terminal device.
-.It Fl f
-Synonym for
-.Xr whatis 1 .
-It searches man pages for
-.Ar command
-in their names and displays header lines from all matching pages.
-.It Fl h
-Display only the
-.Dq Tn SYNOPSIS
-lines of the requested man pages.
-For commands, this is typically the command line usage information.
-For library functions, this usually contains the required include
-files and function prototypes.
-.It Fl k
-Search man pages for
-.Ar keyword Ns Pq s ,
-in the same manner as
-.Xr apropos 1 .
-.It Fl M
-Override the list of standard directories which
-.Nm
-searches for man pages.
-The supplied
-.Ar path
-must be a colon
-.Pq Dq \&:
-separated list of directories.
-This search path may also be set using the environment variable
-.Ev MANPATH .
-The subdirectories to be searched, and their search order,
-is specified by the
-.Dq _subdir
-line in the
-.Nm
-configuration file.
-.It Fl m
-Augment the list of standard directories which
-.Nm
-searches for man pages.
-The supplied
-.Ar path
-must be a colon
-.Pq Dq \&:
-separated list of directories.
-These directories will be searched before the standard directories or
-the directories specified using the
-.Fl M
-option or the
-.Ev MANPATH
-environment variable.
-The subdirectories to be searched, and their search order,
-is specified by the
-.Dq _subdir
-line in the
-.Nm
-configuration file.
-.It Fl p
-Print the search path for the manual pages.
-.It Fl s
-Restrict the directories that
-.Nm
-will search to the specified section.
-The
-.Nm
-configuration file (see
-.Xr man.conf 5 )
-specifies the possible
-.Ar section
-values that are currently available.
-.It Fl S
-Display only man pages that have the specified string in the directory
-part of their filenames.
-This allows the man page search process criteria to be
-narrowed without having to change the MANPATH or
-.Dq _default
-variables.
-.It Fl w
-List the pathnames of the man pages which
-.Nm
-would display for the specified
-.Ar section
-and
-.Ar name
-combination.
-.El
-.Pp
-If the
-.Ql Fl s
-option is not specified,
-there is more than one argument,
-the
-.Ql Fl k
-option is not used, and the first argument is a valid section, then that
-argument will be used as if specified by the
-.Ql Fl s
-option.
-.Pp
-If
-.Ar name
-is given with a full path (beginning with
-.Ql Pa \&/ )
-or a relative path that begins with
-.Ql Pa .\&/
-or
-.Ql Pa .\&./ ,
-then
-.Nm
-interprets it as a file specification, so that you can do
-.Nm
-.Cm ./foo.5
-or even
-.Nm
-.Cm /cd/foo/bar.1.gz .
-If
-.Ar name
-contains
-.Ql Pa /
-but does not match one of the above cases, then the
-search path is used; this allows you to request
-machine-specific man pages, such as
-.Nm Cm vax/boot .
-.Sh ENVIRONMENT
-.Bl -tag -width MANPATHX
-.It Ev MACHINE
-As some man pages are intended only for specific architectures,
-.Nm
-searches any subdirectories,
-with the same name as the current architecture,
-in every directory which it searches.
-Machine specific areas are checked before general areas.
-The current machine type may be overridden by setting the environment
-variable
-.Ev MACHINE
-to the name of a specific architecture.
-Machine-specific man pages may also be requested by
-prepending the relevant subdirectory name to the page name,
-separated by
-.Ql Pa \&/ .
-.It Ev MANPATH
-The standard search path used by
-.Nm
-may be overridden by specifying a path in the
-.Ev MANPATH
-environment variable.
-The format of the path is a colon
-.Pq Dq \&:
-separated list of directories.
-The subdirectories to be searched as well as their search order
-is specified by the
-.Dq _subdir
-line in the
-.Nm
-configuration file.
-.It Ev PAGER
-The pagination command used for writing the output.
-If the
-.Ev PAGER
-environment variable is null or not set, the standard pagination program
-.Xr more 1
-will be used.
-.El
-.Sh FILES
-.Bl -hang -width /etc/man.conf -compact
-.It Pa /etc/man.conf
-default man configuration file.
-.El
-.Sh SEE ALSO
-.Xr apropos 1 ,
-.Xr whatis 1 ,
-.Xr whereis 1 ,
-.Xr man.conf 5 ,
-.Xr mdoc 7 ,
-.Xr mdoc.samples 7
-.Sh STANDARDS
-.Nm
-conforms to
-.St -xcu5 .
-.\"and is expected to conform to
-.\".St -p1003.2-?? .
-.Sh BUGS
-The on-line man pages are, by necessity, forgiving toward stupid
-display devices, causing a few man pages to be not as nicely formatted
-as their typeset counterparts.
diff --git a/usr.bin/man/man.c b/usr.bin/man/man.c
deleted file mode 100644
index cba36bc..0000000
--- a/usr.bin/man/man.c
+++ /dev/null
@@ -1,1077 +0,0 @@
-/* $NetBSD: man.c,v 1.67 2018/06/15 20:16:35 mrg Exp $ */
-
-/*
- * Copyright (c) 1987, 1993, 1994, 1995
- * 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.
- * 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.
- */
-
-#include <sys/cdefs.h>
-
-#ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1987, 1993, 1994, 1995\
- The Regents of the University of California. All rights reserved.");
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)man.c 8.17 (Berkeley) 1/31/95";
-#else
-__RCSID("$NetBSD: man.c,v 1.67 2018/06/15 20:16:35 mrg Exp $");
-#endif
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/stat.h>
-#include <sys/utsname.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <fcntl.h>
-#include <fnmatch.h>
-#include <glob.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <util.h>
-#include <locale.h>
-
-#include "manconf.h"
-#include "pathnames.h"
-
-#ifndef MAN_DEBUG
-#define MAN_DEBUG 0 /* debug path output */
-#endif
-
-/*
- * manstate: structure collecting the current global state so we can
- * easily identify it and pass it to helper functions in one arg.
- */
-struct manstate {
- /* command line flags */
- int all; /* -a: show all matches rather than first */
- int cat; /* -c: do not use a pager */
- char *conffile; /* -C: use alternate config file */
- int how; /* -h: show SYNOPSIS only */
- char *manpath; /* -M: alternate MANPATH */
- char *addpath; /* -m: add these dirs to front of manpath */
- char *pathsearch; /* -S: path of man must contain this string */
- char *sectionname; /* -s: limit search to a given man section */
- int where; /* -w: just show paths of all matching files */
- int getpath; /* -p: print the path of directories containing man pages */
-
- /* important tags from the config file */
- TAG *defaultpath; /* _default: default MANPATH */
- TAG *subdirs; /* _subdir: default subdir search list */
- TAG *suffixlist; /* _suffix: for files that can be cat()'d */
- TAG *buildlist; /* _build: for files that must be built */
-
- /* tags for internal use */
- TAG *intmp; /* _intmp: tmp files we must cleanup */
- TAG *missinglist; /* _missing: pages we couldn't find */
- TAG *mymanpath; /* _new_path: final version of MANPATH */
- TAG *section; /* <sec>: tag for m.sectionname */
-
- /* other misc stuff */
- const char *pager; /* pager to use */
- size_t pagerlen; /* length of the above */
- const char *machine; /* machine */
- const char *machclass; /* machine class */
-};
-
-/*
- * prototypes
- */
-static void build_page(const char *, char **, struct manstate *);
-static void cat(const char *);
-static const char *check_pager(const char *);
-static int cleanup(void);
-static void how(const char *);
-static void jump(char **, const char *, const char *) __dead;
-static int manual(char *, struct manstate *, glob_t *);
-static void onsig(int) __dead;
-static void usage(void) __dead;
-static void addpath(struct manstate *, const char *, size_t, const char *);
-static const char *getclass(const char *);
-static void printmanpath(struct manstate *);
-
-/*
- * main function
- */
-int
-main(int argc, char **argv)
-{
- static struct manstate m;
- struct utsname utsname;
- int ch, abs_section, found;
- ENTRY *esubd, *epath;
- char *p, **ap, *cmd;
- size_t len;
- glob_t pg;
-
- setprogname(argv[0]);
- setlocale(LC_ALL, "");
- /*
- * parse command line...
- */
- while ((ch = getopt(argc, argv, "-aC:cfhkM:m:P:ps:S:w")) != -1)
- switch (ch) {
- case 'a':
- m.all = 1;
- break;
- case 'C':
- m.conffile = optarg;
- break;
- case 'c':
- case '-': /* XXX: '-' is a deprecated version of '-c' */
- m.cat = 1;
- break;
- case 'h':
- m.how = 1;
- break;
- case 'm':
- m.addpath = optarg;
- break;
- case 'M':
- case 'P': /* -P for backward compatibility */
- if ((m.manpath = strdup(optarg)) == NULL)
- err(EXIT_FAILURE, "malloc failed");
- break;
- case 'p':
- m.getpath = 1;
- break;
- /*
- * The -f and -k options are backward compatible,
- * undocumented ways of calling whatis(1) and apropos(1).
- */
- case 'f':
- jump(argv, "-f", "whatis");
- /* NOTREACHED */
- case 'k':
- jump(argv, "-k", "apropos");
- /* NOTREACHED */
- case 's':
- if (m.sectionname != NULL)
- usage();
- m.sectionname = optarg;
- break;
- case 'S':
- m.pathsearch = optarg;
- break;
- case 'w':
- m.all = m.where = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (!m.getpath && !argc)
- usage();
-
- /*
- * read the configuration file and collect any other information
- * we will need (machine type, pager, section [if specified
- * without '-s'], and MANPATH through the environment).
- */
- config(m.conffile); /* exits on error ... */
-
- if ((m.machine = getenv("MACHINE")) == NULL) {
- if (uname(&utsname) == -1)
- err(EXIT_FAILURE, "uname");
- m.machine = utsname.machine;
- }
-
- m.machclass = getclass(m.machine);
-
- if (!m.cat && !m.how && !m.where) { /* if we need a pager ... */
- if (!isatty(STDOUT_FILENO)) {
- m.cat = 1;
- } else {
- if ((m.pager = getenv("PAGER")) != NULL &&
- m.pager[0] != '\0')
- m.pager = check_pager(m.pager);
- else
- m.pager = _PATH_PAGER;
- m.pagerlen = strlen(m.pager);
- }
- }
-
- /* do we need to set m.section to a non-null value? */
- if (m.sectionname) {
-
- m.section = gettag(m.sectionname, 0); /* -s must be a section */
- if (m.section == NULL)
- errx(EXIT_FAILURE, "unknown section: %s", m.sectionname);
-
- } else if (argc > 1) {
-
- m.section = gettag(*argv, 0); /* might be a section? */
- if (m.section) {
- argv++;
- argc--;
- }
-
- }
-
- if (m.manpath == NULL)
- m.manpath = getenv("MANPATH"); /* note: -M overrides getenv */
-
-
- /*
- * get default values from config file, plus create the tags we
- * use for keeping internal state. make sure all our mallocs
- * go through.
- */
- /* from cfg file */
- m.defaultpath = gettag("_default", 1);
- m.subdirs = gettag("_subdir", 1);
- m.suffixlist = gettag("_suffix", 1);
- m.buildlist = gettag("_build", 1);
- /* internal use */
- m.mymanpath = gettag("_new_path", 1);
- m.missinglist = gettag("_missing", 1);
- m.intmp = gettag("_intmp", 1);
- if (!m.defaultpath || !m.subdirs || !m.suffixlist || !m.buildlist ||
- !m.mymanpath || !m.missinglist || !m.intmp)
- errx(EXIT_FAILURE, "malloc failed");
-
- /*
- * are we using a section whose elements are all absolute paths?
- * (we only need to look at the first entry on the section list,
- * as config() will ensure that any additional entries will match
- * the first one.)
- */
- abs_section = (m.section != NULL &&
- !TAILQ_EMPTY(&m.section->entrylist) &&
- *(TAILQ_FIRST(&m.section->entrylist)->s) == '/');
-
- /*
- * now that we have all the data we need, we must determine the
- * manpath we are going to use to find the requested entries using
- * the following steps...
- *
- * [1] if the user specified a section and that section's elements
- * from the config file are all absolute paths, then we override
- * defaultpath and -M/MANPATH with the section's absolute paths.
- */
- if (abs_section) {
- m.manpath = NULL; /* ignore -M/MANPATH */
- m.defaultpath = m.section; /* overwrite _default path */
- m.section = NULL; /* promoted to defaultpath */
- }
-
- /*
- * [2] section can now only be non-null if the user asked for
- * a section and that section's elements did not have
- * absolute paths. in this case we use the section's
- * elements to override _subdir from the config file.
- *
- * after this step, we are done processing "m.section"...
- */
- if (m.section)
- m.subdirs = m.section;
-
- /*
- * [3] we need to setup the path we want to use (m.mymanpath).
- * if the user gave us a path (m.manpath) use it, otherwise
- * go with the default. in either case we need to append
- * the subdir and machine spec to each element of the path.
- *
- * for absolute section paths that come from the config file,
- * we only append the subdir spec if the path ends in
- * a '/' --- elements that do not end in '/' are assumed to
- * not have subdirectories. this is mainly for backward compat,
- * but it allows non-subdir configs like:
- * sect3 /usr/share/man/{old/,}cat3
- * doc /usr/{pkg,share}/doc/{sendmail/op,sendmail/intro}
- *
- * note that we try and be careful to not put double slashes
- * in the path (e.g. we want /usr/share/man/man1, not
- * /usr/share/man//man1) because "more" will put the filename
- * we generate in its prompt and the double slashes look ugly.
- */
- if (m.manpath) {
-
- /* note: strtok is going to destroy m.manpath */
- for (p = strtok(m.manpath, ":") ; p ; p = strtok(NULL, ":")) {
- len = strlen(p);
- if (len < 1)
- continue;
- TAILQ_FOREACH(esubd, &m.subdirs->entrylist, q)
- addpath(&m, p, len, esubd->s);
- }
-
- } else {
-
- TAILQ_FOREACH(epath, &m.defaultpath->entrylist, q) {
- /* handle trailing "/" magic here ... */
- if (abs_section && epath->s[epath->len - 1] != '/') {
- addpath(&m, "", 1, epath->s);
- continue;
- }
-
- TAILQ_FOREACH(esubd, &m.subdirs->entrylist, q)
- addpath(&m, epath->s, epath->len, esubd->s);
- }
-
- }
-
- /*
- * [4] finally, prepend the "-m" m.addpath to mymanpath if it
- * was specified. subdirs and machine are always applied to
- * m.addpath.
- */
- if (m.addpath) {
-
- /* note: strtok is going to destroy m.addpath */
- for (p = strtok(m.addpath, ":") ; p ; p = strtok(NULL, ":")) {
- len = strlen(p);
- if (len < 1)
- continue;
- TAILQ_FOREACH(esubd, &m.subdirs->entrylist, q)
- addpath(&m, p, len, esubd->s);
- }
-
- }
-
- if (m.getpath)
- printmanpath(&m);
-
- /*
- * now m.mymanpath is complete!
- */
-#if MAN_DEBUG
- printf("mymanpath:\n");
- TAILQ_FOREACH(epath, &m.mymanpath->entrylist, q) {
- printf("\t%s\n", epath->s);
- }
-#endif
-
- /*
- * start searching for matching files and format them if necessary.
- * setup an interrupt handler so that we can ensure that temporary
- * files go away.
- */
- (void)signal(SIGINT, onsig);
- (void)signal(SIGHUP, onsig);
- (void)signal(SIGPIPE, onsig);
-
- memset(&pg, 0, sizeof(pg));
- for (found = 0; *argv; ++argv)
- if (manual(*argv, &m, &pg)) {
- found = 1;
- }
-
- /* if nothing found, we're done. */
- if (!found) {
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
-
- /*
- * handle the simple display cases first (m.cat, m.how, m.where)
- */
- if (m.cat) {
- for (ap = pg.gl_pathv; *ap != NULL; ++ap) {
- if (**ap == '\0')
- continue;
- cat(*ap);
- }
- exit(cleanup());
- }
- if (m.how) {
- for (ap = pg.gl_pathv; *ap != NULL; ++ap) {
- if (**ap == '\0')
- continue;
- how(*ap);
- }
- exit(cleanup());
- }
- if (m.where) {
- for (ap = pg.gl_pathv; *ap != NULL; ++ap) {
- if (**ap == '\0')
- continue;
- (void)printf("%s\n", *ap);
- }
- exit(cleanup());
- }
-
- /*
- * normal case - we display things in a single command, so
- * build a list of things to display. first compute total
- * length of buffer we will need so we can malloc it.
- */
- for (ap = pg.gl_pathv, len = m.pagerlen + 1; *ap != NULL; ++ap) {
- if (**ap == '\0')
- continue;
- len += strlen(*ap) + 1;
- }
- if ((cmd = malloc(len)) == NULL) {
- warn("malloc");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
-
- /* now build the command string... */
- p = cmd;
- len = m.pagerlen;
- memcpy(p, m.pager, len);
- p += len;
- *p++ = ' ';
- for (ap = pg.gl_pathv; *ap != NULL; ++ap) {
- if (**ap == '\0')
- continue;
- len = strlen(*ap);
- memcpy(p, *ap, len);
- p += len;
- *p++ = ' ';
- }
- *--p = '\0';
-
- /* Use system(3) in case someone's pager is "pager arg1 arg2". */
- (void)system(cmd);
-
- exit(cleanup());
-}
-
-static int
-manual_find_literalfile(struct manstate *mp, char **pv)
-{
- ENTRY *suffix;
- int found;
- char buf[MAXPATHLEN];
- const char *p;
- int suflen;
-
- found = 0;
-
- /*
- * Expand both '*' and suffix to force an actual
- * match via fnmatch(3). Since the only match in pg
- * is the literal file, the match is genuine.
- */
-
- TAILQ_FOREACH(suffix, &mp->buildlist->entrylist, q) {
- for (p = suffix->s, suflen = 0;
- *p != '\0' && !isspace((unsigned char)*p);
- ++p)
- ++suflen;
- if (*p == '\0')
- continue;
-
- (void)snprintf(buf, sizeof(buf), "*%.*s", suflen, suffix->s);
-
- if (!fnmatch(buf, *pv, 0)) {
- if (!mp->where)
- build_page(p + 1, pv, mp);
- found = 1;
- break;
- }
- }
-
- return found;
-}
-
-static int
-manual_find_buildkeyword(const char *prefix, const char *escpage,
- struct manstate *mp, char **pv)
-{
- ENTRY *suffix;
- int found;
- char buf[MAXPATHLEN];
- const char *p;
- int suflen;
-
- found = 0;
- /* Try the _build keywords next. */
- TAILQ_FOREACH(suffix, &mp->buildlist->entrylist, q) {
- for (p = suffix->s, suflen = 0;
- *p != '\0' && !isspace((unsigned char)*p);
- ++p)
- ++suflen;
- if (*p == '\0')
- continue;
-
- (void)snprintf(buf, sizeof(buf), "%s%s%.*s",
- prefix, escpage, suflen, suffix->s);
- if (!fnmatch(buf, *pv, 0)) {
- if (!mp->where)
- build_page(p + 1, pv, mp);
- found = 1;
- break;
- }
- }
-
- return found;
-}
-
-/*
- * manual --
- * Search the manuals for the pages.
- */
-static int
-manual(char *page, struct manstate *mp, glob_t *pg)
-{
- ENTRY *suffix, *mdir;
- int anyfound, error, found;
- size_t cnt;
- char *p, buf[MAXPATHLEN], *escpage, *eptr;
- static const char escglob[] = "\\~?*{}[]";
-
- anyfound = 0;
-
- /*
- * Fixup page which may contain glob(3) special characters, e.g.
- * the famous "No man page for [" FAQ.
- */
- if ((escpage = malloc((2 * strlen(page)) + 1)) == NULL) {
- warn("malloc");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
-
- p = page;
- eptr = escpage;
-
- while (*p) {
- if (strchr(escglob, *p) != NULL) {
- *eptr++ = '\\';
- *eptr++ = *p++;
- } else
- *eptr++ = *p++;
- }
-
- *eptr = '\0';
-
- /*
- * If 'page' is given with an absolute path,
- * or a relative path explicitly beginning with "./"
- * or "../", then interpret it as a file specification.
- */
- if ((page[0] == '/')
- || (page[0] == '.' && page[1] == '/')
- || (page[0] == '.' && page[1] == '.' && page[2] == '/')
- ) {
- /* check if file actually exists */
- (void)strlcpy(buf, escpage, sizeof(buf));
- error = glob(buf, GLOB_APPEND | GLOB_BRACE | GLOB_NOSORT, NULL, pg);
- if (error != 0) {
- if (error == GLOB_NOMATCH) {
- goto notfound;
- } else {
- errx(EXIT_FAILURE, "glob failed");
- }
- }
-
- if (pg->gl_matchc == 0)
- goto notfound;
-
- /* literal file only yields one match */
- cnt = pg->gl_pathc - pg->gl_matchc;
-
- if (manual_find_literalfile(mp, &pg->gl_pathv[cnt])) {
- anyfound = 1;
- } else {
- /* It's not a man page, forget about it. */
- *pg->gl_pathv[cnt] = '\0';
- }
-
- notfound:
- if (!anyfound) {
- if (addentry(mp->missinglist, page, 0) < 0) {
- warn("malloc");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
- }
- free(escpage);
- return anyfound;
- }
-
- /* For each man directory in mymanpath ... */
- TAILQ_FOREACH(mdir, &mp->mymanpath->entrylist, q) {
-
- /*
- * use glob(3) to look in the filesystem for matching files.
- * match any suffix here, as we will check that later.
- */
- (void)snprintf(buf, sizeof(buf), "%s/%s.*", mdir->s, escpage);
- if ((error = glob(buf,
- GLOB_APPEND | GLOB_BRACE | GLOB_NOSORT, NULL, pg)) != 0) {
- if (error == GLOB_NOMATCH)
- continue;
- else {
- warn("globbing");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
- }
- if (pg->gl_matchc == 0)
- continue;
-
- /*
- * start going through the matches glob(3) just found and
- * use m.pathsearch (if present) to filter out pages we
- * don't want. then verify the suffix is valid, and build
- * the page if we have a _build suffix.
- */
- for (cnt = pg->gl_pathc - pg->gl_matchc;
- cnt < pg->gl_pathc; ++cnt) {
-
- /* filter on directory path name */
- if (mp->pathsearch) {
- p = strstr(pg->gl_pathv[cnt], mp->pathsearch);
- if (!p || strchr(p, '/') == NULL) {
- *pg->gl_pathv[cnt] = '\0'; /* zap! */
- continue;
- }
- }
-
- /*
- * Try the _suffix keywords first.
- *
- * XXX
- * Older versions of man.conf didn't have the _suffix
- * keywords, it was assumed that everything was a .0.
- * We just test for .0 first, it's fast and probably
- * going to hit.
- */
- (void)snprintf(buf, sizeof(buf), "*/%s.0", escpage);
- if (!fnmatch(buf, pg->gl_pathv[cnt], 0))
- goto next;
-
- found = 0;
- TAILQ_FOREACH(suffix, &mp->suffixlist->entrylist, q) {
- (void)snprintf(buf,
- sizeof(buf), "*/%s%s", escpage,
- suffix->s);
- if (!fnmatch(buf, pg->gl_pathv[cnt], 0)) {
- found = 1;
- break;
- }
- }
- if (found)
- goto next;
-
- /* Try the _build keywords next. */
- found = manual_find_buildkeyword("*/", escpage,
- mp, &pg->gl_pathv[cnt]);
- if (found) {
-next: anyfound = 1;
- if (!mp->all) {
- /* Delete any other matches. */
- while (++cnt< pg->gl_pathc)
- *pg->gl_pathv[cnt] = '\0';
- break;
- }
- continue;
- }
-
- /* It's not a man page, forget about it. */
- *pg->gl_pathv[cnt] = '\0';
- }
-
- if (anyfound && !mp->all)
- break;
- }
-
- /* If not found, enter onto the missing list. */
- if (!anyfound) {
- if (addentry(mp->missinglist, page, 0) < 0) {
- warn("malloc");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
- }
-
- free(escpage);
- return anyfound;
-}
-
-/*
- * A do-nothing counterpart to fmtcheck(3) that only supplies the
- * __format_arg marker. Actual fmtcheck(3) call is done once in
- * config().
- */
-__always_inline __format_arg(2)
-static inline const char *
-fmtcheck_ok(const char *userfmt, const char *template)
-{
- return userfmt;
-}
-
-/*
- * build_page --
- * Build a man page for display.
- */
-static void
-build_page(const char *fmt, char **pathp, struct manstate *mp)
-{
- static int warned;
- int olddir, fd, n;
- size_t tmpdirlen;
- char *p, *b;
- char buf[MAXPATHLEN], cmd[MAXPATHLEN], tpath[MAXPATHLEN];
- const char *tmpdir;
-
- /* Let the user know this may take awhile. */
- if (!warned) {
- warned = 1;
- warnx("Formatting manual page...");
- }
-
- /*
- * Historically man chdir'd to the root of the man tree.
- * This was used in man pages that contained relative ".so"
- * directives (including other man pages for command aliases etc.)
- * It even went one step farther, by examining the first line
- * of the man page and parsing the .so filename so it would
- * make hard(?) links to the cat'ted man pages for space savings.
- * (We don't do that here, but we could).
- */
-
- /* copy and find the end */
- for (b = buf, p = *pathp; (*b++ = *p++) != '\0';)
- continue;
-
- /*
- * skip the last two path components, page name and man[n] ...
- * (e.g. buf will be "/usr/share/man" and p will be "man1/man.1")
- * we also save a pointer to our current directory so that we
- * can fchdir() back to it. this allows relative MANDIR paths
- * to work with multiple man pages... e.g. consider:
- * cd /usr/share && man -M ./man cat ls
- * when no "cat1" subdir files are present.
- */
- olddir = -1;
- for (--b, --p, n = 2; b != buf; b--, p--)
- if (*b == '/')
- if (--n == 0) {
- *b = '\0';
- olddir = open(".", O_RDONLY);
- (void) chdir(buf);
- p++;
- break;
- }
-
-
- /* advance fmt past the suffix spec to the printf format string */
- for (; *fmt && isspace((unsigned char)*fmt); ++fmt)
- continue;
-
- /*
- * Get a temporary file and build a version of the file
- * to display. Replace the old file name with the new one.
- */
- if ((tmpdir = getenv("TMPDIR")) == NULL)
- tmpdir = _PATH_TMP;
- tmpdirlen = strlen(tmpdir);
- (void)snprintf(tpath, sizeof (tpath), "%s%s%s", tmpdir,
- (tmpdirlen > 0 && tmpdir[tmpdirlen-1] == '/') ? "" : "/", TMPFILE);
- if ((fd = mkstemp(tpath)) == -1) {
- warn("%s", tpath);
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
- (void)snprintf(buf, sizeof(buf), "%s > %s", fmt, tpath);
- (void)snprintf(cmd, sizeof(cmd), fmtcheck_ok(buf, "%s"), p);
- (void)system(cmd);
- (void)close(fd);
- if ((*pathp = strdup(tpath)) == NULL) {
- warn("malloc");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
-
- /* Link the built file into the remove-when-done list. */
- if (addentry(mp->intmp, *pathp, 0) < 0) {
- warn("malloc");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
-
- /* restore old directory so relative manpaths still work */
- if (olddir != -1) {
- fchdir(olddir);
- close(olddir);
- }
-}
-
-/*
- * how --
- * display how information
- */
-static void
-how(const char *fname)
-{
- FILE *fp;
-
- int lcnt, print;
- char buf[256];
- const char *p;
-
- if (!(fp = fopen(fname, "r"))) {
- warn("%s", fname);
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
-#define S1 "SYNOPSIS"
-#define S2 "S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS"
-#define D1 "DESCRIPTION"
-#define D2 "D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN"
- for (lcnt = print = 0; fgets(buf, sizeof(buf), fp);) {
- if (!strncmp(buf, S1, sizeof(S1) - 1) ||
- !strncmp(buf, S2, sizeof(S2) - 1)) {
- print = 1;
- continue;
- } else if (!strncmp(buf, D1, sizeof(D1) - 1) ||
- !strncmp(buf, D2, sizeof(D2) - 1)) {
- if (fp)
- (void)fclose(fp);
- return;
- }
- if (!print)
- continue;
- if (*buf == '\n')
- ++lcnt;
- else {
- for(; lcnt; --lcnt)
- (void)putchar('\n');
- for (p = buf; isspace((unsigned char)*p); ++p)
- continue;
- (void)fputs(p, stdout);
- }
- }
- (void)fclose(fp);
-}
-
-/*
- * cat --
- * cat out the file
- */
-static void
-cat(const char *fname)
-{
- int fd;
- ssize_t n;
- char buf[2048];
-
- if ((fd = open(fname, O_RDONLY, 0)) < 0) {
- warn("%s", fname);
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
- while ((n = read(fd, buf, sizeof(buf))) > 0)
- if (write(STDOUT_FILENO, buf, (size_t)n) != n) {
- warn("write");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
- if (n == -1) {
- warn("read");
- (void)cleanup();
- exit(EXIT_FAILURE);
- }
- (void)close(fd);
-}
-
-/*
- * check_pager --
- * check the user supplied page information
- */
-static const char *
-check_pager(const char *name)
-{
- const char *p;
-
- /*
- * if the user uses "more", we make it "more -s"; watch out for
- * PAGER = "mypager /usr/ucb/more"
- */
- for (p = name; *p && !isspace((unsigned char)*p); ++p)
- continue;
- for (; p > name && *p != '/'; --p);
- if (p != name)
- ++p;
-
- /* make sure it's "more", not "morex" */
- if (!strncmp(p, "more", 4) && (!p[4] || isspace((unsigned char)p[4]))){
- char *newname;
- (void)asprintf(&newname, "%s %s", p, "-s");
- name = newname;
- }
-
- return name;
-}
-
-/*
- * jump --
- * strip out flag argument and jump
- */
-static void
-jump(char **argv, const char *flag, const char *name)
-{
- char **arg;
-
- argv[0] = __UNCONST(name);
- for (arg = argv + 1; *arg; ++arg)
- if (!strcmp(*arg, flag))
- break;
- for (; *arg; ++arg)
- arg[0] = arg[1];
- execvp(name, argv);
- err(EXIT_FAILURE, "Cannot execute `%s'", name);
-}
-
-/*
- * onsig --
- * If signaled, delete the temporary files.
- */
-static void
-onsig(int signo)
-{
-
- (void)cleanup();
-
- (void)raise_default_signal(signo);
-
- /* NOTREACHED */
- exit(EXIT_FAILURE);
-}
-
-/*
- * cleanup --
- * Clean up temporary files, show any error messages.
- */
-static int
-cleanup(void)
-{
- TAG *intmpp, *missp;
- ENTRY *ep;
- int rval;
-
- rval = EXIT_SUCCESS;
- /*
- * note that _missing and _intmp were created by main(), so
- * gettag() cannot return NULL here.
- */
- missp = gettag("_missing", 0); /* missing man pages */
- intmpp = gettag("_intmp", 0); /* tmp files we need to unlink */
-
- TAILQ_FOREACH(ep, &missp->entrylist, q) {
- warnx("no entry for %s in the manual.", ep->s);
- rval = EXIT_FAILURE;
- }
-
- TAILQ_FOREACH(ep, &intmpp->entrylist, q)
- (void)unlink(ep->s);
-
- return rval;
-}
-
-static const char *
-getclass(const char *machine)
-{
- char buf[BUFSIZ];
- TAG *t;
- snprintf(buf, sizeof(buf), "_%s", machine);
- t = gettag(buf, 0);
- return t != NULL && !TAILQ_EMPTY(&t->entrylist) ?
- TAILQ_FIRST(&t->entrylist)->s : NULL;
-}
-
-static void
-addpath(struct manstate *m, const char *dir, size_t len, const char *sub)
-{
- char buf[2 * MAXPATHLEN + 1];
- (void)snprintf(buf, sizeof(buf), "%s%s%s{/%s,%s%s%s}",
- dir, (dir[len - 1] == '/') ? "" : "/", sub, m->machine,
- m->machclass ? "/" : "", m->machclass ? m->machclass : "",
- m->machclass ? "," : "");
- if (addentry(m->mymanpath, buf, 0) < 0)
- errx(EXIT_FAILURE, "malloc failed");
-}
-
-/*
- * usage --
- * print usage message and die
- */
-static void
-usage(void)
-{
- (void)fprintf(stderr, "Usage: %s [-acw|-h] [-C cfg] [-M path] "
- "[-m path] [-S srch] [[-s] sect] name ...\n", getprogname());
- (void)fprintf(stderr, "Usage: %s [-C file] -f command ...\n", getprogname());
- (void)fprintf(stderr,
- "Usage: %s [-C file] -k keyword ...\n",
- getprogname());
- (void)fprintf(stderr, "Usage: %s -p\n", getprogname());
- exit(EXIT_FAILURE);
-}
-
-/*
- * printmanpath --
- * Prints a list of directories containing man pages.
- */
-static void
-printmanpath(struct manstate *m)
-{
- ENTRY *epath;
- char **ap;
- glob_t pg;
- struct stat sb;
- TAG *path = m->mymanpath;
-
- /* the tail queue is empty if no _default tag is defined in * man.conf */
- if (TAILQ_EMPTY(&path->entrylist))
- errx(EXIT_FAILURE, "Empty manpath");
-
- TAILQ_FOREACH(epath, &path->entrylist, q) {
- if (glob(epath->s, GLOB_BRACE | GLOB_NOSORT, NULL, &pg) != 0)
- err(EXIT_FAILURE, "glob failed");
-
- if (pg.gl_matchc == 0) {
- globfree(&pg);
- continue;
- }
-
- for (ap = pg.gl_pathv; *ap != NULL; ++ap) {
- /* Skip cat page directories */
- if (strstr(*ap, "/cat") != NULL)
- continue;
- /* Skip non-directories. */
- if (stat(*ap, &sb) == 0 && S_ISDIR(sb.st_mode))
- printf("%s\n", *ap);
- }
- globfree(&pg);
- }
-}
diff --git a/usr.bin/man/man.conf.5 b/usr.bin/man/man.conf.5
deleted file mode 100644
index b89c74b..0000000
--- a/usr.bin/man/man.conf.5
+++ /dev/null
@@ -1,286 +0,0 @@
-.\" $NetBSD: man.conf.5,v 1.27 2016/06/16 15:11:43 abhinav Exp $
-.\"
-.\" Copyright (c) 1989, 1991, 1993
-.\" 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.
-.\" 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.
-.\"
-.\" @(#)man.conf.5 8.5 (Berkeley) 1/2/94
-.\"
-.Dd June 16, 2016
-.Dt MAN.CONF 5
-.Os
-.Sh NAME
-.Nm man.conf
-.Nd configuration file for manual pages
-.Sh DESCRIPTION
-The
-.Nm
-file contains the default configuration used by
-.Xr man 1 ,
-.Xr apropos 1 ,
-.Xr whatis 1 ,
-.Xr catman 8 ,
-and
-.Xr makemandb 8
-to find manual pages and information about manual pages (e.g. the
-whatis database).
-.Pp
-Manual pages are located by searching an ordered set of directories
-called the
-.Dq man path
-for a file that matches the name of the requested page.
-Each directory in the search path usually has a set of subdirectories
-in it (though this is not required).
-When subdirectories are used, there are normally two subdirectories
-for each section of the manual.
-One subdirectory contains formatted copies of that section's manual
-pages that can be directly displayed to a terminal, while the other
-section subdirectory contains unformatted copies of the pages (see
-.Xr nroff 1
-and
-.Xr mdoc 7 ) .
-Formatted manual pages are normally named with a trailing
-.Dq \.0
-suffix.
-.Pp
-The
-.Nm
-file contains comment and configuration lines.
-Comment lines start with the
-.Dq #
-character.
-Blank lines are also treated as comment lines.
-Configuration lines consist of a configuration keyword followed by a
-configuration string.
-There are two types of configuration keywords: control keywords and
-section keywords.
-Control keywords must start with the
-.Dq _
-character.
-The following control keywords are currently defined:
-.Bl -tag -width XXmachineX
-.It _build
-Identifies the set of suffixes used for manual pages that must be
-formatted for display and the command that should be used to format
-them.
-Manual file names, regardless of their format, are expected to end in a
-.Dq \.*
-pattern, i.e. a
-.Dq \&\.
-followed by some suffix.
-The first field of a _build line contains a man page suffix specification.
-The suffix specification may contain the normal shell globbing characters
-(NOT including curly braces
-.Pq Dq {} ) .
-The rest of the _build line is a shell command line whose standard
-output is a formatted manual page that can be directly displayed to
-the user.
-There should be exactly one occurrence of the string
-.Dq %s
-in the shell command line, and it will
-be replaced by the name of the file which is being formatted.
-.It _crunch
-Used by
-.Xr catman 8
-to determine how to crunch formatted pages
-which originally were compressed man pages: The first field lists a suffix
-which indicates what kind of compression were used to compress the man page.
-The rest of the line must be a shell command line, used to compress the
-formatted pages.
-There should be exactly one occurrence of the string
-.Dq %s
-in the shell command line, and it will
-be replaced by the name of the output file.
-.It _default
-Contains the system-wide default man path used to search for man pages.
-.It _mandb
-Defines the full pathname (not just a directory path) for a database to
-be used
-by the
-.Xr apropos 1
-and
-.Xr whatis 1
-commands.
-The pathname may contain the normal shell globbing characters,
-including curly braces
-.Pq Dq {} ;
-to escape a shell globbing character,
-precede it with a backslash
-.Pq Dq \e .
-.It _subdir
-Contains the list (in search order) of section subdirectories which will
-be searched in any man path directory named with a trailing slash
-.Pq Dq /
-character.
-This list is also used, even if there is no trailing slash character,
-when a path is specified to the
-.Xr man 1
-utility by the user, by the
-.Ev MANPATH
-environment variable, or by the
-.Fl M
-and
-.Fl m
-options.
-.It _suffix
-identifies the set of suffixes used for formatted man pages
-(the
-.Dq \.0
-suffix is normally used here).
-Formatted man pages can be directly displayed to the user.
-Each suffix may contain the normal shell globbing characters (NOT
-including curly braces
-.Pq Dq {} ) .
-.It _version
-Contains the version of the configuration file.
-.It _ Ns Aq machine
-Defines additional paths to be searched for the particular
-.Dv machine
-whose literal value is taken from
-.Xr uname 1
-.Fl m .
-For example on an
-.Dv amd64 ,
-.Dv _amd64
-is used.
-.El
-.Pp
-Section configuration lines in
-.Nm
-consist of a section keyword naming the section and a configuration
-string that defines the directory or subdirectory path that the section's
-manual pages are located in.
-The path may contain the normal shell globbing characters,
-including curly braces
-.Pq Dq {} ;
-to escape a shell globbing character,
-precede it with a backslash
-.Pq Dq \e .
-Section keywords must not start with the
-.Dq _
-character.
-.Pp
-A section path may contain either a list of absolute directories or
-a list of or relative directories (but not both).
-Relative directory paths are treated as a list of subdirectories that
-are appended to the current man path directory being searched.
-Section configuration lines with absolute directory paths (starting with
-.Dq / )
-completely replace the current man search path directory with their
-content.
-.Pp
-Section configuration lines with absolute directory paths ending
-with a trailing slash character are expected to contain subdirectories
-of manual pages, (see the keyword
-.Dq _subdir
-above).
-The
-.Dq _subdir
-subdirectory list is not applied to absolute section directories
-if there is no trailing slash.
-.Pp
-In addition to the above rules, the
-.Xr man 1
-command also always checks in each directory that it searches for
-a subdirectory with the same name as the current machine type.
-If the machine-specific directory is found, it is also searched.
-This allows the manual to contain machine-specific man pages.
-Note that the machine subdirectory does not need to be specified
-in the
-.Nm
-file.
-.Pp
-Multiple specifications for all types of
-.Nm
-configuration lines are
-cumulative and the entries are used in the order listed in the file;
-multiple entries may be listed per line, as well.
-.Sh FILES
-.Bl -tag -width /etc/man.conf -compact
-.It Pa /etc/man.conf
-Standard manual configuration file.
-.El
-.Sh EXAMPLES
-Given the following
-.Nm
-file:
-.Bd -literal -offset indent
-_version BSD.2
-_subdir cat[123]
-_suffix .0
-_build .[1-9] nroff -man %s
-_build .tbl tbl %s | nroff -man
-_i386 x86
-_default /usr/share/man/
-sect3 /usr/share/man/{old/,}cat3
-.Ed
-.Pp
-By default, the command
-.Dq Li man mktemp
-will search for
-.Dq mktemp. Ns Aq any_digit
-and
-.Dq mktemp.tbl
-in the directories
-.Dq Pa /usr/share/man/cat1 ,
-.Dq Pa /usr/share/man/cat2 ,
-and
-.Dq Pa /usr/share/man/cat3 .
-If on a machine of type
-.Dq vax ,
-the subdirectory
-.Dq vax
-in each
-directory would be searched as well, before the directory was
-searched.
-.Pp
-If
-.Dq mktemp.tbl
-was found first, the command
-.Dq Li tbl Ao manual page Ac | nroff -man
-would be run to build a man page for display to the user.
-.Pp
-The command
-.Dq Li man sect3 mktemp
-would search the directories
-.Dq Pa /usr/share/man/old/cat3
-and
-.Dq Pa /usr/share/man/cat3 ,
-in that order, for
-the mktemp manual page.
-If a subdirectory with the same name as the current machine type
-existed in any of them, it would be searched as well, before each
-of them were searched.
-.Sh SEE ALSO
-.Xr apropos 1 ,
-.Xr machine 1 ,
-.Xr man 1 ,
-.Xr whatis 1 ,
-.Xr whereis 1 ,
-.Xr fnmatch 3 ,
-.Xr glob 3 ,
-.Xr catman 8 ,
-.Xr makemandb 8
diff --git a/usr.bin/man/manconf.c b/usr.bin/man/manconf.c
deleted file mode 100644
index f12d031..0000000
--- a/usr.bin/man/manconf.c
+++ /dev/null
@@ -1,272 +0,0 @@
-/* $NetBSD: manconf.c,v 1.8 2014/02/17 02:53:48 uwe Exp $ */
-
-/*
- * Copyright (c) 1989, 1993, 1995
- * 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.
- * 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.
- */
-
-/*
- * manconf.c: provides interface for reading man.conf files
- *
- * note that this code is shared across all programs that read man.conf.
- * (currently: apropos, catman, makewhatis, man, and whatis...)
- */
-
-#if HAVE_NBTOOL_CONFIG_H
-#include "nbtool_config.h"
-#endif
-
-#include <sys/cdefs.h>
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)config.c 8.8 (Berkeley) 1/31/95";
-#else
-__RCSID("$NetBSD: manconf.c,v 1.8 2014/02/17 02:53:48 uwe Exp $");
-#endif
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/queue.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "manconf.h"
-#include "pathnames.h"
-
-TAILQ_HEAD(_head, _tag);
-static struct _head head; /* 'head' -- top level data structure */
-
-/*
- * xstrdup: like strdup, but also returns length of string in lenp
- */
-static char *
-xstrdup(const char *str, size_t *lenp)
-{
- size_t len;
- char *copy;
-
- len = strlen(str) + 1;
- copy = malloc(len);
- if (!copy)
- return NULL;
- (void)memcpy(copy, str, len);
- if (lenp)
- *lenp = len - 1; /* subtract out the null */
- return copy;
-}
-
-/*
- * config --
- *
- * Read the configuration file and build a doubly linked
- * list off of "head" that looks like:
- *
- * tag1 <-> entry <-> entry <-> entry
- * |
- * tag2 <-> entry <-> entry <-> entry
- *
- * note: will err/errx out on error (fopen or malloc failure)
- */
-void
-config(const char *fname)
-{
- TAG *tp;
- FILE *cfp;
- size_t len;
- int lcnt;
- char *p, *t, type;
-
- if (fname == NULL)
- fname = _PATH_MANCONF;
- if ((cfp = fopen(fname, "r")) == NULL)
- err(EXIT_FAILURE, "%s", fname);
- TAILQ_INIT(&head);
- for (lcnt = 1; (p = fgetln(cfp, &len)) != NULL; ++lcnt) {
- if (len == 1) /* Skip empty lines. */
- continue;
- if (p[len - 1] != '\n') { /* Skip corrupted lines. */
- warnx("%s: line %d corrupted", fname, lcnt);
- continue;
- }
- p[len - 1] = '\0'; /* Terminate the line. */
-
- /* Skip leading space. */
- for (/*EMPTY*/; *p != '\0' && isspace((unsigned char)*p); ++p)
- continue;
- /* Skip empty/comment lines. */
- if (*p == '\0' || *p == '#')
- continue;
- /* Find first token. */
- for (t = p; *t && !isspace((unsigned char)*t); ++t)
- continue;
- if (*t == '\0') /* Need more than one token.*/
- continue;
- *t = '\0';
-
- tp = gettag(p, 1);
- if (!tp)
- errx(EXIT_FAILURE, "gettag: malloc failed");
-
- /*
- * Attach new records. Check to see if it is a
- * section record or not.
- */
-
- if (*p == '_') { /* not a section record */
- /*
- * Special cases: _build and _crunch take the
- * rest of the line as a single entry.
- */
- if (!strcmp(p, "_build") || !strcmp(p, "_crunch")) {
- const char *u;
-
- /*
- * The reason we're not just using
- * strtok(3) for all of the parsing is
- * so we don't get caught if a line
- * has only a single token on it.
- */
- while (*++t && isspace((unsigned char)*t));
-#ifndef HAVE_NBTOOL_CONFIG_H
- /* pre-verify user-supplied command format */
- u = t;
- while (*u && !isspace((unsigned char)*u))
- ++u;
- while (*u && isspace((unsigned char)*u))
- ++u;
- if (fmtcheck(u, "%s") != u) {
- warnx("%s:%d: invalid %s command ignored",
- fname, lcnt, p);
- continue;
- }
-#endif /* !HAVE_NBTOOL_CONFIG_H */
- if (addentry(tp, t, 0) == -1)
- errx(EXIT_FAILURE,
- "addentry: malloc failed");
- } else {
- for (++t; (p = strtok(t, " \t\n")) != NULL;
- t = NULL) {
- if (addentry(tp, p, 0) == -1)
- errx(EXIT_FAILURE,
- "addentry: malloc failed");
- }
- }
-
- } else { /* section record */
-
- /*
- * section entries can either be all absolute
- * paths or all relative paths, but not both.
- */
- type = (char)((TAILQ_FIRST(&tp->entrylist) != NULL) ?
- *(TAILQ_FIRST(&tp->entrylist)->s) : '\0');
-
- for (++t; (p = strtok(t, " \t\n")) != NULL; t = NULL) {
-
- /* ensure an assigned type */
- if (type == 0)
- type = *p;
-
- /* check for illegal mix */
- if (*p != type) {
- warnx("section %s: %s: invalid entry, does not match previous types",
- tp->s, p);
- warnx("man.conf cannot mix absolute and relative paths in an entry");
- continue;
- }
- if (addentry(tp, p, 0) == -1)
- errx(EXIT_FAILURE,
- "addentry: malloc failed");
- }
- }
- }
- (void)fclose(cfp);
-}
-
-/*
- * gettag --
- * if (!create) return tag for given name if it exists, or NULL otherwise
- *
- * if (create) return tag for given name if it exists, try and create
- * a new tag if it does not exist. return NULL if unable to create new
- * tag.
- */
-TAG *
-gettag(const char *name, int create)
-{
- TAG *tp;
-
- TAILQ_FOREACH(tp, &head, q)
- if (!strcmp(name, tp->s))
- return tp;
- if (!create)
- return NULL;
-
- /* try and add it in */
- tp = malloc(sizeof(*tp));
- if (tp)
- tp->s = xstrdup(name, &tp->len);
- if (!tp || !tp->s) {
- if (tp)
- free(tp);
- return NULL;
- }
- TAILQ_INIT(&tp->entrylist);
- TAILQ_INSERT_TAIL(&head, tp, q);
- return tp;
-}
-
-/*
- * addentry --
- * add an entry to a list.
- * returns -1 if malloc failed, otherwise 0.
- */
-int
-addentry(TAG *tp, const char *newent, int ishead)
-{
- ENTRY *ep;
-
- ep = malloc(sizeof(*ep));
- if (ep)
- ep->s = xstrdup(newent, &ep->len);
- if (!ep || !ep->s) {
- if (ep)
- free(ep);
- return -1;
- }
- if (ishead)
- TAILQ_INSERT_HEAD(&tp->entrylist, ep, q);
- else
- TAILQ_INSERT_TAIL(&tp->entrylist, ep, q);
-
- return 0;
-}
diff --git a/usr.bin/man/manconf.h b/usr.bin/man/manconf.h
deleted file mode 100644
index ab87728..0000000
--- a/usr.bin/man/manconf.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* $NetBSD: manconf.h,v 1.3 2006/04/10 14:39:06 chuck Exp $ */
-
-/*-
- * Copyright (c) 1993
- * 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.
- * 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.
- *
- * @(#)config.h 8.4 (Berkeley) 12/18/93
- */
-
-/*
- * manconf.h: common data structures and APIs shared across all programs
- * that access man.conf (currently: apropos, catman, makewhatis, man, and
- * whatis).
- */
-
-/* TAG: top-level structure (one per section/reserved word) */
-typedef struct _tag {
- TAILQ_ENTRY(_tag) q; /* Queue of tags */
-
- TAILQ_HEAD(tqh, _entry) entrylist; /* Queue of entries */
- char *s; /* Associated string */
- size_t len; /* Length of 's' */
-} TAG;
-
-/* ENTRY: each TAG has one or more ENTRY strings linked off of it */
-typedef struct _entry {
- TAILQ_ENTRY(_entry) q; /* Queue of entries */
-
- char *s; /* Associated string */
- size_t len; /* Length of 's' */
-} ENTRY;
-
-int addentry(TAG *, const char *, int);
-void config(const char *);
-TAG *gettag(const char *, int);
diff --git a/usr.bin/man/pathnames.h b/usr.bin/man/pathnames.h
deleted file mode 100644
index 15aa211..0000000
--- a/usr.bin/man/pathnames.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $NetBSD: pathnames.h,v 1.7 2016/05/21 20:54:34 christos Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * 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.
- * 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.
- *
- * @(#)pathnames.h 8.3 (Berkeley) 1/2/94
- */
-
-#include <paths.h>
-
-#define _PATH_MANCONF "/etc/man.conf"
-#define _PATH_PAGER "/usr/bin/more -s"
-#define _PATH_WHATIS "whatis.db"
-#define TMPFILE "man.XXXXXX"
diff --git a/usr.bin/mesg/mesg.1 b/usr.bin/mesg/mesg.1
deleted file mode 100644
index e5d9100..0000000
--- a/usr.bin/mesg/mesg.1
+++ /dev/null
@@ -1,89 +0,0 @@
-.\" $NetBSD: mesg.1,v 1.10 2017/07/03 21:34:20 wiz Exp $
-.\"
-.\" Copyright (c) 1987, 1990, 1993
-.\" 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.
-.\" 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.
-.\"
-.\" @(#)mesg.1 8.1 (Berkeley) 6/6/93
-.\"
-.Dd June 6, 1993
-.Dt MESG 1
-.Os
-.Sh NAME
-.Nm mesg
-.Nd display (do not display) messages from other users
-.Sh SYNOPSIS
-.Nm
-.Op Cm n | Cm y
-.Sh DESCRIPTION
-The
-.Nm
-utility is invoked by a user to control write access others
-have to the terminal device associated with the standard error
-output.
-Write access is allowed by default, and programs such as
-.Xr talk 1
-and
-.Xr write 1
-may display messages on the terminal.
-.Pp
-Options available:
-.Bl -tag -width flag
-.It Cm n
-Disallows messages.
-.It Cm y
-Permits messages to be displayed.
-.El
-.Pp
-If no arguments are given,
-.Nm
-displays the present message status to the standard error output.
-.Pp
-The
-.Nm
-utility exits with one of the following values:
-.Pp
-.Bl -tag -width flag -compact -offset indent
-.It Li "\ 0"
-Messages are allowed.
-.It Li "\ 1"
-Messages are not allowed.
-.It Li ">1"
-An error has occurred.
-.El
-.Sh FILES
-.Bl -tag -width /dev/[pt]ty[pq]? -compact
-.It Pa /dev/[pt]ty[pq]?
-.El
-.Sh SEE ALSO
-.Xr biff 1 ,
-.Xr talk 1 ,
-.Xr write 1
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v6 .
diff --git a/usr.bin/mesg/mesg.c b/usr.bin/mesg/mesg.c
deleted file mode 100644
index cc54a75..0000000
--- a/usr.bin/mesg/mesg.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* $NetBSD: mesg.c,v 1.8 2008/07/21 14:19:24 lukem Exp $ */
-
-/*
- * Copyright (c) 1987, 1993
- * The Regents of the University of California. All rights reserved.
- * (c) UNIX System Laboratories, Inc.
- * All or some portions of this file are derived from material licensed
- * to the University of California by American Telephone and Telegraph
- * Co. or Unix System Laboratories, Inc. and are reproduced herein with
- * the permission of UNIX System Laboratories, 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.
- */
-
-#include <sys/cdefs.h>
-
-#ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1987, 1993\
- The Regents of the University of California. All rights reserved.");
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)mesg.c 8.2 (Berkeley) 1/21/94";
-#endif
-__RCSID("$NetBSD: mesg.c,v 1.8 2008/07/21 14:19:24 lukem Exp $");
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- char *tty;
- int ch;
-
- setprogname(*argv);
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch (ch) {
- case '?':
- default:
- goto usage;
- }
- argc -= optind;
- argv += optind;
-
- if ((tty = ttyname(STDIN_FILENO)) == NULL &&
- (tty = ttyname(STDOUT_FILENO)) == NULL &&
- (tty = ttyname(STDERR_FILENO)) == NULL)
- err(2, "ttyname");
- if (stat(tty, &sb) == -1)
- err(2, "%s", tty);
-
- if (*argv == NULL) {
- if (sb.st_mode & S_IWGRP) {
- (void)fprintf(stderr, "is y\n");
- return 0;
- }
- (void)fprintf(stderr, "is n\n");
- return 1;
- }
-
- switch (*argv[0]) {
- case 'y':
- if (chmod(tty, sb.st_mode | S_IWGRP) == -1)
- err(2, "%s", tty);
- return 0;
- case 'n':
- if (chmod(tty, sb.st_mode & ~S_IWGRP) == -1)
- err(2, "%s", tty);
- return 1;
- }
-
-usage: (void)fprintf(stderr, "Usage: %s [y | n]\n", getprogname());
- return 2;
-}