Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Nov 2002 14:28:50 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Alfred Perlstein <bright@mu.org>
Cc:        Nate Lawson <nate@root.org>, hackers@FreeBSD.ORG
Subject:   Patch set #1 libminic, bin and sbin support (Re: cvs commit: src/bin/sleep sleep.c)
Message-ID:  <200211152228.gAFMSouP073804@apollo.backplane.com>
References:  <Pine.BSF.4.21.0211151103440.46823-100000@root.org> <200211151925.gAFJPsgh037805@apollo.backplane.com> <20021115194347.GG50692@elvis.mu.org> <200211152017.gAFKHbFS044142@apollo.backplane.com> <20021115202751.GJ50692@elvis.mu.org>

next in thread | previous in thread | raw e-mail | index | archive | help
    This is not finished yet, but it's good enough to start shipping patches.
    Note that libminic currently installed in /usr/lib, not in /lib.  I
    haven't gotten to that part yet.  I also did not spend a huge amount
    of time trying to cut the size down.  I dealt with locale, malloc, and
    *printf().  This patchset includes all the infrastructure necessary
    to be able to do that, however, and I expect that once we agree on
    the basic infrastructure and I commit the thing that others will be able
    to do further work trimming down the overhead, including removing parts
    of libc from libminic that aren't needed (right now most of libc is
    in libminic).

test2# du -s -k /bin		(before, statically linked)
7320    /bin
test2# du -s -k /bin		(after, statically linked)
6799    /bin
test2# ls -la /bin/sleep
-r-xr-xr-x  1 root  wheel  19632 Nov 15 14:18 /bin/sleep

    The make.conf variables are:

    USE_MINIC		- use mini-c library for bin and sbin

    USE_SHARED_BIN	- use shared libc or shared libminic for bin and sbin
			  (NOT FINISHED!  SHARED LIBRARY IS STILL IN /USR/LIB)



    *** REVIEW AND DISCUSSION WELCOME ***
    
						-Matt


Index: bin/Makefile.inc
===================================================================
RCS file: /home/ncvs/src/bin/Makefile.inc,v
retrieving revision 1.15
diff -u -r1.15 Makefile.inc
--- bin/Makefile.inc	10 May 2002 01:48:15 -0000	1.15
+++ bin/Makefile.inc	15 Nov 2002 21:22:39 -0000
@@ -5,3 +5,4 @@
 NOSHARED?=	YES
 WARNS?=		2
 WFORMAT?=	1
+CAN_USE_MINIC?=	YES
Index: lib/Makefile
===================================================================
RCS file: /home/ncvs/src/lib/Makefile,v
retrieving revision 1.145
diff -u -r1.145 Makefile
--- lib/Makefile	4 Oct 2002 13:40:39 -0000	1.145
+++ lib/Makefile	15 Nov 2002 21:15:26 -0000
@@ -24,6 +24,7 @@
 SUBDIR=	${_csu} libcom_err libcrypt libkvm msun libmd \
 	libncurses libradius librpcsvc libsbuf libtacplus libutil libypclnt \
 	${_compat} libalias libatm ${_libbind} libbz2 libc ${_libc_r} \
+	libminic \
 	libcalendar libcam libcompat libdevinfo libdevstat libdisk \
 	libedit libexpat libfetch libform libftpio ${_libio} libipsec \
 	libipx libisc libmenu ${_libmilter} ${_libmp} ${_libncp} \
Index: lib/libc/rpc/Makefile.inc
===================================================================
RCS file: /home/ncvs/src/lib/libc/rpc/Makefile.inc,v
retrieving revision 1.23
diff -u -r1.23 Makefile.inc
--- lib/libc/rpc/Makefile.inc	19 Aug 2002 23:06:00 -0000	1.23
+++ lib/libc/rpc/Makefile.inc	15 Nov 2002 21:21:30 -0000
@@ -44,6 +44,9 @@
 
 crypt.h: ${RPCDIR}/crypt.x
 	${RPCGEN} -h -o ${.TARGET} ${RPCDIR}/crypt.x
+
+.if ${LIB} == "c"
+
 MAN+=	bindresvport.3 des_crypt.3 getnetconfig.3 getnetpath.3 getrpcent.3 \
 	getrpcport.3 rpc.3 rpc_soc.3 rpc_clnt_auth.3 rpc_clnt_calls.3 \
 	rpc_clnt_create.3 rpc_svc_calls.3 rpc_svc_create.3 rpc_svc_err.3 \
@@ -160,3 +163,5 @@
 		rpc_soc.3 svcunix_create.3 \
 		rpc_soc.3 xdr_pmap.3 \
 		rpc_soc.3 xdr_pmaplist.3
+
+.endif
Index: lib/libminic/Makefile
===================================================================
RCS file: lib/libminic/Makefile
diff -N lib/libminic/Makefile
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/Makefile	15 Nov 2002 21:43:17 -0000
@@ -0,0 +1,49 @@
+# $FreeBSD: src/lib/libstand/Makefile,v 1.14.2.10 2002/07/22 14:21:50 ru Exp $
+#
+# Originally from	$NetBSD: Makefile,v 1.21 1997/10/26 22:08:38 lukem Exp $
+#
+# Notes:
+# - We don't use the libc strerror/sys_errlist because the string table is
+#   quite large.
+#
+
+LIB=		minic
+NOPROFILE=	YES
+SHLIB_MAJOR= 2
+SHLIB_MINOR= 0
+CFLAGS+= -D__LIB_MINIC__
+CFLAGS+=-I${.CURDIR}/../libc/include
+AINC=	-I${.CURDIR}/../libc/${MACHINE_ARCH}
+CLEANFILES+=tags
+INSTALL_PIC_ARCHIVE=	yes
+PRECIOUSLIB=	yes
+
+SRCS += pfmt.c zalloc.c malloc.c panic.c
+
+#
+# Don't bother hiding any syscalls (like libc_r does).
+#
+HIDDEN_SYSCALLS=
+
+#
+# Include make rules that are shared with libc_r.
+#
+.include "${.CURDIR}/../libc/Makefile.inc"
+
+KQSRCS=	adddi3.c anddi3.c ashldi3.c ashrdi3.c cmpdi2.c divdi3.c iordi3.c \
+	lshldi3.c lshrdi3.c moddi3.c muldi3.c negdi2.c notdi2.c qdivrem.c \
+	subdi3.c ucmpdi2.c udivdi3.c umoddi3.c xordi3.c
+KSRCS=	bcmp.c ffs.c index.c mcount.c rindex.c strcat.c strcmp.c strcpy.c \
+	strlen.c strncpy.c
+
+libkern: libkern.gen libkern.${MACHINE_ARCH}
+
+libkern.gen: ${KQSRCS} ${KSRCS}
+	cp -p ${.CURDIR}/../libc/quad/quad.h ${.ALLSRC} ${DESTDIR}/sys/libkern
+
+libkern.${MACHINE_ARCH}:: ${KMSRCS}
+.if defined(KMSRCS) && !empty(KMSRCS)
+	cp -p ${.ALLSRC} ${DESTDIR}/sys/libkern/${MACHINE_ARCH}
+.endif
+
+.include <bsd.lib.mk>
Index: lib/libminic/__error.c
===================================================================
RCS file: lib/libminic/__error.c
diff -N lib/libminic/__error.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/__error.c	15 Nov 2002 21:43:29 -0000
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1997 John Birrell <jb@cimlogic.com.au>.
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by John Birrell.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL 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>
+__FBSDID("$FreeBSD: src/lib/libc/sys/__error.c,v 1.4 2002/03/22 21:53:24 obrien Exp $");
+
+extern int errno;
+
+/*
+ * Declare a weak reference in case the application is not linked
+ * with libpthread.
+ */
+__weak_reference(__error_unthreaded, __error);
+
+int *
+__error_unthreaded()
+{
+	return(&errno);
+}
Index: lib/libminic/asprintf.c
===================================================================
RCS file: lib/libminic/asprintf.c
diff -N lib/libminic/asprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/asprintf.c	15 Nov 2002 20:27:11 -0000
@@ -0,0 +1,23 @@
+/*
+ * ASPRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include "minic.h"
+
+int
+asprintf(char **bufp, const char *ctl, ...)
+{
+    va_list va;
+    int n;
+
+    va_start(va, ctl);
+    n = vasprintf(bufp, ctl, va);
+    va_end(va);
+    return(n);
+}
+
Index: lib/libminic/calloc.c
===================================================================
RCS file: lib/libminic/calloc.c
diff -N lib/libminic/calloc.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/calloc.c	15 Nov 2002 20:51:59 -0000
@@ -0,0 +1,3 @@
+/*
+ * CALLOC.C - Dummy file to override libc calloc.c
+ */
Index: lib/libminic/fprintf.c
===================================================================
RCS file: lib/libminic/fprintf.c
diff -N lib/libminic/fprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/fprintf.c	15 Nov 2002 21:06:48 -0000
@@ -0,0 +1,22 @@
+/*
+ * FPRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include "minic.h"
+
+int
+fprintf(FILE *fp, const char *ctl, ...)
+{
+    va_list va;
+
+    va_start(va, ctl);
+    __pfmt(ctl, va, (void *)fwrite, fp);
+    va_end(va);
+    return(0);
+}
+
Index: lib/libminic/isatty.c
===================================================================
RCS file: lib/libminic/isatty.c
diff -N lib/libminic/isatty.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/isatty.c	15 Nov 2002 21:06:53 -0000
@@ -0,0 +1,18 @@
+/*
+ * ISATTY.C -	Override libc/gen/isatty.c to avoid termios
+ *
+ */
+
+#include <unistd.h>
+#include <termios.h>
+
+int
+isatty(int fd)
+{
+    struct termios t;
+
+    if (ioctl(fd, TIOCGETA, &t) < 0)
+	return(0);
+    return(1);
+}
+
Index: lib/libminic/isctype.c
===================================================================
RCS file: lib/libminic/isctype.c
diff -N lib/libminic/isctype.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/isctype.c	15 Nov 2002 22:17:25 -0000
@@ -0,0 +1,165 @@
+/*
+ * CTYPE.C - degenerate ctype support
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#define _DONT_USE_CTYPE_INLINE_
+#include <stdio.h>
+#include <ctype.h>
+
+#define CTYPE_MASK	(_CTYPE_A|_CTYPE_C|_CTYPE_D|_CTYPE_L|\
+			_CTYPE_U|_CTYPE_S|_CTYPE_X|_CTYPE_R)
+
+#define QF_A	0x01
+#define QF_C	0x02
+#define QF_D	0x04
+#define QF_L	0x08
+#define QF_U	0x10
+#define QF_S	0x20
+#define QF_X	0x40
+#define QF_R	0x80
+
+#define QF_CS	(QF_C|QF_S)
+#define QF_DX	(QF_D|QF_X|QF_R)
+#define QF_UAX	(QF_U|QF_A|QF_X|QF_R)
+#define QF_UA	(QF_U|QF_A|QF_R)
+#define QF_LAX	(QF_L|QF_A|QF_X|QF_R)
+#define QF_LA	(QF_L|QF_A|QF_R)
+#define QF_SR	(QF_S|QF_R)
+
+unsigned char QCharAry[] = {
+/*00*/	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,
+/*08*/	QF_C,	QF_CS,	QF_CS,	QF_CS,	QF_CS,	QF_CS,	QF_C,	QF_C,
+/*10*/	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,
+/*18*/	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,	QF_C,
+/*20*/	QF_SR,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,
+/*28*/	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,
+/*30*/	QF_DX,	QF_DX,	QF_DX,	QF_DX,	QF_DX,	QF_DX,	QF_DX,	QF_DX,
+/*38*/	QF_DX,	QF_DX,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,
+/*40*/	QF_R,	QF_UAX,	QF_UAX,	QF_UAX,	QF_UAX,	QF_UAX,	QF_UA,	QF_UA,
+/*48*/	QF_UA,	QF_UA,	QF_UA,	QF_UA,	QF_UA,	QF_UA,	QF_UA,	QF_UA,
+/*50*/	QF_UA,	QF_UA,	QF_UA,	QF_UA,	QF_UA,	QF_UA,	QF_UA,	QF_UA,
+/*58*/	QF_UA,	QF_UA,	QF_UA,	QF_R,	QF_R,	QF_R,	QF_R,	QF_R,
+/*60*/	QF_R,	QF_LAX,	QF_LAX,	QF_LAX,	QF_LAX,	QF_LAX,	QF_LA,	QF_LA,
+/*68*/	QF_LA,	QF_LA,	QF_LA,	QF_LA,	QF_LA,	QF_LA,	QF_LA,	QF_LA,
+/*70*/	QF_LA,	QF_LA,	QF_LA,	QF_LA,	QF_LA,	QF_LA,	QF_LA,	QF_LA,
+/*78*/	QF_LA,	QF_LA,	QF_LA,	QF_R,	QF_R,	QF_R,	QF_R,	QF_C
+};
+
+int
+__maskrune(__ct_rune_t c, unsigned long f)
+{
+    unsigned char m = 0;
+
+    if (c < -128 || c > 128)
+	return(0);
+    if (f & _CTYPE_A)
+	m |= QF_A;
+    if (f & _CTYPE_C)
+	m |= QF_C;
+    if (f & _CTYPE_D)
+	m |= QF_D;
+    if (f & _CTYPE_L)
+	m |= QF_L;
+    if (f & _CTYPE_U)
+	m |= QF_U;
+    if (f & _CTYPE_S)
+	m |= QF_S;
+    if (f & _CTYPE_X)
+	m |= QF_X;
+    if (f & _CTYPE_R)
+	m |= QF_R;
+    if (f & ~CTYPE_MASK)
+	panic("libminic does not support CTYPE mask %08x\n", f & ~CTYPE_MASK);
+    return(QCharAry[(unsigned char)c] & m);
+}
+
+int
+__isctype(__ct_rune_t c, unsigned long f)
+{
+    return(!!__maskrune(c, f));
+}
+
+int
+__istype(__ct_rune_t c, unsigned long f)
+{
+    return(!!__maskrune(c, f));
+}
+
+#undef isspace
+#undef isalpha
+#undef isdigit
+#undef islower
+#undef isupper
+#undef tolower
+#undef toupper
+#undef isprint
+
+int
+isspace(int c)
+{
+    return(__isctype(c, _CTYPE_S));
+}
+
+int
+isalpha(int c)
+{
+    return(__isctype(c, _CTYPE_A));
+}
+
+int
+isdigit(int c)
+{
+    return(__isctype(c, _CTYPE_D));
+}
+
+int
+islower(int c)
+{
+    return(__isctype(c, _CTYPE_L));
+}
+
+int
+isupper(int c)
+{
+    return(__isctype(c, _CTYPE_U));
+}
+
+int
+isprint(int c)
+{
+    return(__isctype(c, _CTYPE_R));
+}
+
+int
+__tolower(int c)
+{
+    if (isupper(c))
+	c += 0x20;
+    return(c);
+}
+
+int
+__toupper(int c)
+{
+    if (islower(c))
+	c -= 0x20;
+    return(c);
+}
+
+int
+tolower(int c)
+{
+    if (isupper(c))
+	c += 0x20;
+    return(c);
+}
+
+int
+toupper(int c)
+{
+    if (islower(c))
+	c -= 0x20;
+    return(c);
+}
Index: lib/libminic/malloc.c
===================================================================
RCS file: lib/libminic/malloc.c
diff -N lib/libminic/malloc.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/malloc.c	15 Nov 2002 21:38:47 -0000
@@ -0,0 +1,194 @@
+/*
+ * This module derived from code donated to the FreeBSD Project by 
+ * Matthew Dillon <dillon@backplane.com>
+ *
+ * Copyright (c) 1998 The FreeBSD Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/libstand/zalloc_malloc.c,v 1.5 1999/08/28 00:05:35 peter Exp $
+ */
+
+/*
+ * MALLOC.C - malloc equivalent, runs on top of zalloc and uses sbrk
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+typedef long iaddr_t;
+#define Library
+
+#include "../libstand/zalloc_mem.h"
+#include "../libstand/zalloc_protos.h"
+
+typedef struct Guard {
+    size_t      ga_Bytes;
+    size_t      ga_Magic;       /* must be at least 32 bits */
+} Guard;
+
+#define MATYPE          long double
+#define MALLOCALIGN     ((sizeof(MATYPE) > sizeof(Guard)) ? sizeof(MATYPE) : sizeof(Guard))
+#define BLKEXTEND	(32 * 1024)
+#define BLKEXTENDMASK	(BLKEXTEND - 1)
+#define GAMAGIC         0x55FF44FD
+#define GAFREE          0x5F54F4DF
+
+static MemPool	MallocPool;
+
+#undef malloc
+#undef realloc
+#undef reallocf
+#undef calloc
+#undef free
+
+void *
+malloc(size_t bytes)
+{
+    Guard *res;
+
+#ifdef USEENDGUARD
+    bytes += MALLOCALIGN + 1;
+#else
+    bytes += MALLOCALIGN;
+#endif
+
+    while ((res = znalloc(&MallocPool, bytes)) == NULL) {
+	int incr = (bytes + BLKEXTENDMASK) & ~BLKEXTENDMASK;
+	char *base;
+
+	/*
+	 * Make sure our block is properly aligned
+	 */
+	base = sbrk(0);
+	if ((int)base & MEMNODE_SIZE_MASK)
+	    sbrk(MEMNODE_SIZE_MASK + 1 - ((int)base & MEMNODE_SIZE_MASK));
+
+	if ((base = sbrk(incr)) == (char *)-1)
+	    return(NULL);
+	zextendPool(&MallocPool, base, incr);
+	zfree(&MallocPool, base, incr);
+    }
+#ifdef DMALLOCDEBUG
+    if (++MallocCount > MallocMax)
+	MallocMax = MallocCount;
+#endif
+#ifdef USEGUARD
+    res->ga_Magic = GAMAGIC;
+#endif
+    res->ga_Bytes = bytes;
+#ifdef USEENDGUARD
+    *((char *)res + bytes - 1) = -2;
+#endif
+    return((char *)res + MALLOCALIGN);
+}
+
+void
+free(void *ptr)
+{
+    size_t bytes;
+
+    if (ptr != NULL) {
+	Guard *res = (void *)((char *)ptr - MALLOCALIGN);
+
+#ifdef USEGUARD
+	if (res->ga_Magic != GAMAGIC)
+	    panic("free: guard1 fail @ %p", ptr);
+	res->ga_Magic = -1;
+#endif
+#ifdef USEENDGUARD
+	if (*((char *)res + res->ga_Bytes - 1) != -2)
+	    panic("free: guard2 fail @ %p + %d", ptr, res->ga_Bytes - MALLOCALIGN);
+	*((char *)res + res->ga_Bytes - 1) = -1;
+#endif
+
+	bytes = res->ga_Bytes;
+	zfree(&MallocPool, res, bytes);
+#ifdef DMALLOCDEBUG
+	--MallocCount;
+#endif
+    }
+}
+
+void *
+calloc(size_t n1, size_t n2)
+{
+    iaddr_t bytes = (iaddr_t)n1 * (iaddr_t)n2;
+    void *res;
+
+    if ((res = malloc(bytes)) != NULL) {
+	bzero(res, bytes);
+#ifdef DMALLOCDEBUG
+	if (++MallocCount > MallocMax)
+	    MallocMax = MallocCount;
+#endif
+    }
+    return(res);
+}
+
+/*
+ * realloc() - I could be fancier here and free the old buffer before
+ * 	       allocating the new one (saving potential fragmentation
+ *	       and potential buffer copies).  But I don't bother.
+ */
+
+void *
+realloc(void *ptr, size_t size)
+{
+    void *res;
+    size_t old;
+
+    if ((res = malloc(size)) != NULL) {
+	if (ptr) {
+	    old = *(size_t *)((char *)ptr - MALLOCALIGN) - MALLOCALIGN;
+	    if (old < size)
+		bcopy(ptr, res, old);
+	    else
+		bcopy(ptr, res, size);
+	    free(ptr);
+	} else {
+#ifdef DMALLOCDEBUG
+	    if (++MallocCount > MallocMax)
+		MallocMax = MallocCount;
+#ifdef EXITSTATS
+	    if (DidAtExit == 0) {
+		DidAtExit = 1;
+		atexit(mallocstats);
+	    }
+#endif
+#endif
+	}
+    }
+    return(res);
+}
+
+void *
+reallocf(void *ptr, size_t size)
+{
+    void *res;
+
+    if ((res = realloc(ptr, size)) == NULL)
+	free(ptr);
+    return(res);
+}
+
Index: lib/libminic/minic.h
===================================================================
RCS file: lib/libminic/minic.h
diff -N lib/libminic/minic.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/minic.h	15 Nov 2002 20:29:59 -0000
@@ -0,0 +1,19 @@
+/*
+ * MINIC.H
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * WInfo is used by the [v][a]s[n]printf() family
+ */
+typedef struct WInfo {
+    char *buf;
+    int  i;
+    int  n;
+} WInfo;
+
+typedef int (*pfmt_func_t)(const char *buf, int size, int nelm, void *info);
+
+extern int __pfmt(const char *ctl, va_list va, pfmt_func_t func, void *info);
+
Index: lib/libminic/nomacros.c
===================================================================
RCS file: lib/libminic/nomacros.c
diff -N lib/libminic/nomacros.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/nomacros.c	15 Nov 2002 20:35:50 -0000
@@ -0,0 +1,5 @@
+/*
+ * NOMACROS.C
+ *
+ *	Dummy file to prevent libc/locale/nomacros.c from being brought in
+ */
Index: lib/libminic/panic.c
===================================================================
RCS file: lib/libminic/panic.c
diff -N lib/libminic/panic.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/panic.c	15 Nov 2002 20:53:23 -0000
@@ -0,0 +1,33 @@
+/*
+ * PANIC.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "minic.h"
+
+static int ewrite(const char *buf, int size, int nelm, void *fd);
+
+void
+panic(const char *ctl, ...)
+{
+    va_list va;
+
+    va_start(va, ctl);
+    __pfmt(ctl, va, (void *)ewrite, NULL);
+    write(2, "\n", 1);
+    va_end(va);
+    abort();
+}
+
+static int
+ewrite(const char *buf, int size, int nelm, void *dummy)
+{
+    write(2, buf, size * nelm);
+    return(nelm);
+}
+
Index: lib/libminic/pfmt.c
===================================================================
RCS file: lib/libminic/pfmt.c
diff -N lib/libminic/pfmt.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/pfmt.c	15 Nov 2002 21:58:23 -0000
@@ -0,0 +1,394 @@
+/*
+ * PFMT.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <sys/types.h>
+#include <stdarg.h>
+#include "minic.h"
+
+#define F_SPAC	    0x0001
+#define F_PLUS	    0x0002
+#define F_MINUS     0x0004
+#define F_HASH	    0x0008
+#define F_ZERO	    0x0010
+#define F_SHORT     0x0020
+#define F_LONG	    0x0040
+#define F_LONGLONG  0x0080
+#define F_QUAD 	    0x0100
+
+static int pfmtone(char c, va_list *pva, pfmt_func_t func, void *info,
+	int flags, int i1, int i2, int baseBytes);
+
+int
+__pfmt(const char *ctl, va_list va, pfmt_func_t func, void *info)
+{
+    const char *base = ctl;
+    char c;
+    int error = 0;
+    int bytes = 0;
+    int flags;
+    int i1, i2;
+
+    for (;;) {
+	while (*ctl && *ctl != '%' && *ctl != '\\')
+	    ++ctl;
+	if (ctl != base) {
+	    error = (*func)(base, 1, ctl - base, info);
+	    if (error < 0)
+		break;
+	    bytes += error;
+	}
+	if (*ctl++ == 0)
+	    break;
+	c = *ctl;
+	if (c == '%') {
+	    base = ctl++;
+	    continue;
+	}
+
+	/*
+	 *  %[flags][val[.val]]c
+	 */
+
+	flags = 0;
+	for (;; c = *++ctl) {
+	    if (c == '-') {
+		flags |= F_MINUS;
+		continue;
+	    }
+	    if (c == '+') {
+		flags |= F_PLUS;
+		continue;
+	    }
+	    if (c == ' ') {
+		flags |= F_SPAC;
+		continue;
+	    }
+	    if (c == '#') {
+		flags |= F_HASH;
+		continue;
+	    }
+	    if (c == '0') {
+		flags |= F_ZERO;
+		continue;
+	    }
+	    break;
+	}
+	if (c == '*') {
+	    c = *++ctl;
+	    i1 = va_arg(va, int);
+	} else if (c >= '0' && c <= '9') {
+	    i1 = 0;
+	    while (c >= '0' && c <= '9') {
+		i1 = i1 * 10 + (c - '0');
+		c = *++ctl;
+	    }
+	} else {
+	    i1 = -1;
+	}
+	i2 = -1;
+	if (c == '.') {
+	    c = *++ctl;
+	    if (c == '*') {
+		c = *++ctl;
+		i2 = va_arg(va, int);
+	    } else {
+		i2 = 0;
+		while (c >= '0' && c <= '9') {
+		    i2 = i2 * 10 + (c - '0');
+		    c = *++ctl;
+		}
+	    }
+	}
+	if (i1 > 4096 || i2 > 4096)    /*  bad for business! */
+	    continue;
+	for (;;) {
+	    if (c == 'h') {
+		c = *++ctl;
+		flags |= F_SHORT;	/* XXX */
+		continue;
+	    }
+	    if (c == 'l') {
+		c = *++ctl;
+		if (flags & (F_LONG|F_LONGLONG))
+		    flags = (flags & ~F_LONG) | F_LONGLONG;
+		else
+		    flags |= F_LONG;
+		continue;
+	    }
+	    if (c == 'q') {
+		c = *++ctl;
+		flags |= F_QUAD;
+		continue;
+	    }
+	    break;
+	}
+	error = pfmtone(c, &va, func, info, flags, i1, i2, bytes);
+	if (error < 0)
+	    break;
+	bytes = error;
+	base = ++ctl;
+    }
+    if (error < 0)
+	return(error);
+    return(bytes);	/*  # bytes written */
+}
+
+/*
+ *  format one item (c) using output function (func), (flags),
+ *  field width (i1) and precision (i2).  The number of bytes written
+ *  so far (baseBytes) is passed and the new total should be returned
+ *
+ *  i1 and i2 are -1 for unspecified widths.
+ *
+ *  note: first 30 bytes of the buffer cannot hold a value
+ */
+
+static int
+pfmtone(char c, va_list *pva, pfmt_func_t func, void *info,
+	int flags, int i1, int i2, int baseBytes)
+{
+    va_list va = *pva;
+    const char *prefix1 = "";	/* output prefix */
+    char *value = "";		/* output value */
+    const char *postfix1 = "";	/* output postfix */
+    char buf[64];		/* temporary buffer */
+    int len = 0;		/* length of <value> */
+    int error = 0;
+    int trail_zero = 0;		/* trailing zeros from math */
+    int	i;			/* temporary */
+    long *pnum;			/* temporary */
+    u_quad_t uqval;
+    quad_t qval;
+
+    /*
+     * Deal with variable-length values
+     */
+    switch(c) {
+    case 'c':
+    case 'i':
+    case 'd':
+    case 'u':
+    case 'o':
+    case 'x':
+    case 'X':
+	if (flags & F_SHORT) {
+	    qval = (short)va_arg(va, int);
+	    uqval = (unsigned short)qval;
+	} else if (flags & F_LONG) {
+	    qval = va_arg(va, long);
+	    uqval = (unsigned long)qval;
+	} else if (flags & F_LONGLONG) {
+	    qval = va_arg(va, long long);
+	    uqval = (unsigned long long)qval;
+	} else if (flags & F_QUAD) {
+	    uqval = qval = va_arg(va, quad_t);
+	} else {
+	    qval = va_arg(va, int);
+	    uqval = (unsigned int)qval;
+	}
+	break;
+    default:
+	qval = uqval = 0;
+	break;
+    }
+
+    /*
+     * Process conversion
+     */
+    switch(c) {
+    case 'c':
+	buf[sizeof(buf)-1] = (char)uqval;
+	len = 1;
+	value = buf + sizeof(buf) - 1;
+	break;
+    case 'i':
+    case 'd':
+    case 'u':
+    case 'o':
+	{
+	    int base = (c == 'o') ? 8 : 10;
+
+	    if (c != 'u' && qval < 0) {
+		uqval = -qval;
+		prefix1 = "-";
+	    }
+	    if (i2 < 0)     /*	default precision   */
+		i2 = 1;
+	    for (len = 0; len < sizeof(buf) && (len < i2 || uqval); ++len) {
+		buf[sizeof(buf)-1-len] = uqval % base + '0';
+		uqval = uqval / base;
+	    }
+	    value = buf + sizeof(buf) - len;
+	}
+	break;
+    case 'n':
+	pnum = va_arg(va, long *);
+	*pnum = baseBytes;
+	break;
+    case 's':
+	value = va_arg(va, char *);
+	/*
+	 *  can't simply call strlen because buffer may be unterminated.
+	 */
+	{
+	    while ((i2 < 0 || len < i2) && value[len])
+		++len;
+
+	}
+	break;
+    case 'p':
+	flags |= F_ZERO;
+	if (i1 < 0)
+	    i1 = sizeof(void *) * 2;	/* 2 hex digits per byte */
+	uqval = (unsigned long)va_arg(va, char *);
+	/* fall through */
+    case 'x':
+    case 'X':
+	{
+	    static const char IToHCL[] = { "0123456789abcdef0x" };
+	    static const char IToHCU[] = { "0123456789ABCDEF0X" };
+	    const char *itohc = (c == 'X') ? IToHCU : IToHCL;
+
+	    if (flags & F_HASH)
+		prefix1 = itohc + 16;
+	    if (i2 < 0)     /*	default precision   */
+		i2 = 1;
+	    for (len = 0; len < sizeof(buf) && (len < i2 || uqval); ++len) {
+		buf[sizeof(buf)-1-len] = itohc[(int)uqval & 15];
+		uqval = uqval >> 4;
+	    }
+	    value = buf + sizeof(buf) - len;
+	}
+	break;
+    default:
+	return(-2); /*	unknown conversion specifier	*/
+    }
+
+    /*
+     *	Now handle actually outputing the object using
+     *	F_SPAC, F_PLUS, F_MINUS, F_HASH, F_ZERO
+     *
+     *	i1 is the field width or -1 for unlimited
+     *	i2 is the precision or -1 if undefined (already handled above)
+     */
+
+    /*
+     *	Handle prefix, note that F_SPAC & F_PLUS are not relevant to %x/X
+     */
+    if (prefix1[0] == 0) {
+	if (flags & F_PLUS)
+	    prefix1 = "+";
+	else if (flags & F_SPAC)
+	    prefix1 = " ";
+    }
+
+    /*
+     *	prefix goes before zero padding, but after space padding
+     */
+    if (flags & F_ZERO) {
+	strcpy(buf, prefix1);
+	i = strlen(prefix1);
+    } else {
+	i = 0;
+    }
+
+    if (i1 > 0 && !(flags & F_MINUS)) {
+	int j = i1 - strlen(prefix1) - len - strlen(postfix1);
+	int cc = (flags & F_ZERO) ? '0' : ' ';
+
+	while (j > 20) {
+	    memset(buf + i, cc, 20);
+	    error = (*func)(buf, 1, 20 + i, info);
+	    if (error > 0)
+		baseBytes += error;
+	    i1 -= 20 + i;
+	    j -= 20;
+	    i = 0;
+	}
+	if (j > 0) {
+	    memset(buf + i, cc, j);
+	    i += j;
+	}
+    }
+
+    if ((flags & F_ZERO) == 0) {
+	strcpy(buf + i, prefix1);
+	i += strlen(prefix1);
+    }
+
+    if (i) {
+	error = (*func)(buf, 1, i, info);
+	if (error > 0)
+	    baseBytes += error;
+	i1 -= i;    /*	subtract from fieldwidth, ok if i1 goes negative */
+    }
+
+    /*
+     *	value
+     */
+    if (len > 0) {
+	error = (*func)(value, 1, len, info);
+	if (error > 0) {
+	    baseBytes += error;
+	    i1 -= error;    /*	subtract from field width, ok if goes neg */
+	}
+    }
+
+    /*
+     *	trailing zero's
+     */
+    if (trail_zero) {
+	int j;
+
+	while ((j = trail_zero) > 0) {
+	    if (j > 20)
+		j = 20;
+	    memset(buf, '0', j);
+	    error = (*func)(buf, 1, j, info);
+	    if (error > 0)
+		baseBytes += error;
+	    i1 -= j;
+	    trail_zero -= j;
+	}
+    }
+
+    /*
+     *	postfix
+     */
+    if (postfix1[0]) {
+	error = (*func)(postfix1, 1, strlen(postfix1), info);
+	if (error > 0) {
+	    baseBytes += error;
+	    i1 -= error;    /*	subtract from field width, ok if goes neg */
+	}
+    }
+
+    /*
+     *	post padding
+     */
+    if (i1 > 0 && (flags & F_MINUS)) {
+	int j = i1;
+
+	while (j > sizeof(buf)) {
+	    memset(buf, ' ', sizeof(buf));
+	    error = (*func)(buf, 1, sizeof(buf), info);
+	    if (error > 0)
+		baseBytes += error;
+	    j -= sizeof(buf);
+	}
+	if (j > 0) {
+	    memset(buf, ' ', j);
+	    error = (*func)(buf, 1, j, info);
+	    if (error > 0)
+		baseBytes += error;
+	}
+    }
+    *pva = va;
+    if (error < 0)
+	return(error);
+    return(baseBytes);
+}
+
Index: lib/libminic/printf.c
===================================================================
RCS file: lib/libminic/printf.c
diff -N lib/libminic/printf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/printf.c	15 Nov 2002 21:07:41 -0000
@@ -0,0 +1,22 @@
+/*
+ * PRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "minic.h"
+
+int
+printf(const char *ctl, ...)
+{
+    va_list va;
+    int n;
+
+    va_start(va, ctl);
+    n = vprintf(ctl, va);
+    va_end(va);
+    return(n);
+}
+
Index: lib/libminic/reallocf.c
===================================================================
RCS file: lib/libminic/reallocf.c
diff -N lib/libminic/reallocf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/reallocf.c	15 Nov 2002 20:52:15 -0000
@@ -0,0 +1,3 @@
+/*
+ * REALLOCF.C - Dummy file to override libc reallocf.c
+ */
Index: lib/libminic/setlocale.c
===================================================================
RCS file: lib/libminic/setlocale.c
diff -N lib/libminic/setlocale.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/setlocale.c	15 Nov 2002 21:55:55 -0000
@@ -0,0 +1,21 @@
+/*
+ * SETLOCALE.C
+ *
+ *	This file prevents the libc locale stuff from being brought in if
+ *	setlocale() is called.
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <locale.h>
+#include "minic.h"
+
+char *
+setlocale(int category, const char *locale)
+{
+    if (category == LC_CTYPE && (locale == NULL || locale[0] == 0))
+	return("");
+    return(NULL);
+}
+
Index: lib/libminic/snprintf.c
===================================================================
RCS file: lib/libminic/snprintf.c
diff -N lib/libminic/snprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/snprintf.c	15 Nov 2002 20:31:28 -0000
@@ -0,0 +1,22 @@
+/*
+ * SNPRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "minic.h"
+
+int
+snprintf(char *buf, size_t bytes, const char *ctl, ...)
+{
+    va_list va;
+    int n;
+
+    va_start(va, ctl);
+    n = vsnprintf(buf, bytes, ctl, va);
+    va_end(va);
+    return(n);
+}
+
Index: lib/libminic/sprintf.c
===================================================================
RCS file: lib/libminic/sprintf.c
diff -N lib/libminic/sprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/sprintf.c	15 Nov 2002 20:27:37 -0000
@@ -0,0 +1,22 @@
+/*
+ * SPRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "minic.h"
+
+int
+sprintf(char *buf, const char *ctl, ...)
+{
+    va_list va;
+    int n;
+
+    va_start(va, ctl);
+    n = vsprintf(buf, ctl, va);
+    va_end(va);
+    return(n);
+}
+
Index: lib/libminic/strtol.c
===================================================================
RCS file: lib/libminic/strtol.c
diff -N lib/libminic/strtol.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/strtol.c	15 Nov 2002 20:58:53 -0000
@@ -0,0 +1,6 @@
+/*
+ * STRTOL.C - borrow strtol from libstand (to avoid bringing in locale)
+ */
+
+#include "../libstand/strtol.c"
+
Index: lib/libminic/vasprintf.c
===================================================================
RCS file: lib/libminic/vasprintf.c
diff -N lib/libminic/vasprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/vasprintf.c	15 Nov 2002 20:29:02 -0000
@@ -0,0 +1,46 @@
+/*
+ * ASPRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include "minic.h"
+
+static int sawrite(const char *buf, int size, int nelm, void *info);
+
+int
+vasprintf(char **bufp, const char *ctl, va_list va)
+{
+    char *buf = malloc(32);
+    WInfo wi = { buf, 0, 32 };
+
+    __pfmt(ctl, va, sawrite, &wi);
+    if (wi.buf) {
+	*bufp = realloc(wi.buf, wi.i + 1);
+	(*bufp)[wi.i] = 0;
+	return(wi.i);
+    } else {
+	*bufp = NULL;
+	return(-1);
+    }
+}
+
+static int
+sawrite(const char *buf, int size, int nelm, void *info)
+{
+    WInfo *w = info;
+    int n = size * nelm;
+
+    while (w->n - w->i < 2 && w->buf) {
+	w->n *= 2;
+	w->buf = realloc(w->buf, w->n);
+    }
+    if (w->buf)
+	memcpy(w->buf + w->i, buf, n);
+    w->i += n;
+    return(nelm);
+}
+
Index: lib/libminic/vfprintf.c
===================================================================
RCS file: lib/libminic/vfprintf.c
diff -N lib/libminic/vfprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/vfprintf.c	15 Nov 2002 20:33:13 -0000
@@ -0,0 +1,16 @@
+/*
+ * FPRINTF.C
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include "minic.h"
+
+int
+vfprintf(FILE *fp, const char *ctl, va_list va)
+{
+    __pfmt(ctl, va, (void *)fwrite, fp);
+    return(0);
+}
+
Index: lib/libminic/vprintf.c
===================================================================
RCS file: lib/libminic/vprintf.c
diff -N lib/libminic/vprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/vprintf.c	15 Nov 2002 20:25:45 -0000
@@ -0,0 +1,17 @@
+/*
+ * VPRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "minic.h"
+
+int
+vprintf(const char *ctl, va_list va)
+{
+    __pfmt(ctl, va, (void *)fwrite, stdout);
+    return(0);
+}
+
Index: lib/libminic/vsnprintf.c
===================================================================
RCS file: lib/libminic/vsnprintf.c
diff -N lib/libminic/vsnprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/vsnprintf.c	15 Nov 2002 20:31:38 -0000
@@ -0,0 +1,40 @@
+/*
+ * SNPRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "minic.h"
+
+static int snwrite(const char *buf, int size, int nelm, void *info);
+
+int
+vsnprintf(char *buf, size_t bytes, const char *ctl, va_list va)
+{
+    WInfo wi = { buf, 0, bytes };
+
+    __pfmt(ctl, va, snwrite, &wi);
+    if (wi.i < wi.n)
+	buf[wi.i] = 0;
+    else if (wi.n)
+	buf[wi.n-1] = 0;
+    return(wi.i);
+}
+
+static int
+snwrite(const char *buf, int size, int nelm, void *info)
+{
+    WInfo *w = info;
+    int m = w->n - w->i;
+    int n = size * nelm;
+    if (n <= m) {
+	memcpy(w->buf + w->i, buf, n);
+    } else if (m > 0) {
+	memcpy(w->buf + w->i, buf, m);
+    }
+    w->i += n;
+    return(nelm);
+}
+
Index: lib/libminic/vsprintf.c
===================================================================
RCS file: lib/libminic/vsprintf.c
diff -N lib/libminic/vsprintf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/vsprintf.c	15 Nov 2002 20:28:38 -0000
@@ -0,0 +1,33 @@
+/*
+ * SPRINTF.C
+ *
+ * (c)copyright 1993-94, 2002 Matthew Dillon, All Rights Reserved
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "minic.h"
+
+static int swrite(const char *buf, int size, int nelm, void *info);
+
+int
+vsprintf(char *buf, const char *ctl, va_list va)
+{
+    WInfo wi = { buf, 0 };
+
+    __pfmt(ctl, va, swrite, &wi);
+    buf[wi.i] = 0;
+    return(wi.i);
+}
+
+static int
+swrite(const char *buf, int size, int nelm, void *info)
+{
+    WInfo *w = info;
+    int n = size * nelm;
+
+    memcpy(w->buf + w->i, buf, n);
+    w->i += n;
+    return(nelm);
+}
+
Index: lib/libminic/zalloc.c
===================================================================
RCS file: lib/libminic/zalloc.c
diff -N lib/libminic/zalloc.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libminic/zalloc.c	15 Nov 2002 20:55:50 -0000
@@ -0,0 +1,6 @@
+/*
+ * ZALLOC.C - borrow zalloc from libstand
+ */
+
+#include "../libstand/zalloc.c"
+
Index: sbin/Makefile.inc
===================================================================
RCS file: /home/ncvs/src/sbin/Makefile.inc,v
retrieving revision 1.8
diff -u -r1.8 Makefile.inc
--- sbin/Makefile.inc	4 Dec 2001 02:19:43 -0000	1.8
+++ sbin/Makefile.inc	15 Nov 2002 21:22:41 -0000
@@ -4,3 +4,4 @@
 BINDIR?=	/sbin
 NOSHARED?=	YES
 WARNS?=	2
+CAN_USE_MINIC?=	YES
Index: share/mk/bsd.prog.mk
===================================================================
RCS file: /home/ncvs/src/share/mk/bsd.prog.mk,v
retrieving revision 1.129
diff -u -r1.129 bsd.prog.mk
--- share/mk/bsd.prog.mk	17 Oct 2002 13:48:13 -0000	1.129
+++ share/mk/bsd.prog.mk	15 Nov 2002 22:16:49 -0000
@@ -11,6 +11,18 @@
 STRIP?=	-s
 .endif
 
+.if defined(CAN_USE_MINIC)
+.if defined(USE_MINIC)
+CFLAGS += -D_DONT_USE_CTYPE_INLINE_
+LDPRE += ${LIBDIR}/crt1.o ${LIBDIR}/crti.o ${LIBDIR}/crtbegin.o
+LDTAIL += -nostdlib -lminic ${LIBDIR}/crtend.o ${LIBDIR}/crtn.o
+DPADD += ${LIBDIR}/libminic.a
+.endif
+.if defined(CAN_USE_SHARED_BIN) && defined(USE_SHARED_BIN)
+NOSHARED=       NO
+.endif
+.endif
+
 .if defined(NOSHARED) && ( ${NOSHARED} != "no" && ${NOSHARED} != "NO" )
 LDFLAGS+= -static
 .endif
@@ -32,9 +44,9 @@
 
 ${PROG}: ${OBJS}
 .if defined(PROG_CXX)
-	${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
+	${CXX} ${CXXFLAGS} ${LDPRE} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD} ${LDTAIL}
 .else
-	${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD}
+	${CC} ${CFLAGS} ${LDPRE} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD} ${LDTAIL}
 .endif
 
 .else !defined(SRCS)

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200211152228.gAFMSouP073804>