head	1.14;
access;
symbols
	RELEASE_8_3_0:1.13
	RELEASE_9_0_0:1.13
	RELEASE_7_4_0:1.13
	RELEASE_8_2_0:1.13
	RELEASE_6_EOL:1.13
	RELEASE_8_1_0:1.13
	RELEASE_7_3_0:1.13
	RELEASE_8_0_0:1.13
	RELEASE_7_2_0:1.13
	RELEASE_7_1_0:1.13
	RELEASE_6_4_0:1.13
	RELEASE_5_EOL:1.13
	RELEASE_7_0_0:1.13
	RELEASE_6_3_0:1.13
	PRE_XORG_7:1.13
	RELEASE_4_EOL:1.13
	RELEASE_6_2_0:1.13
	RELEASE_6_1_0:1.12
	RELEASE_5_5_0:1.12
	RELEASE_6_0_0:1.12
	RELEASE_5_4_0:1.12
	RELEASE_4_11_0:1.12
	RELEASE_5_3_0:1.12
	RELEASE_4_10_0:1.12
	RELEASE_5_2_1:1.11
	RELEASE_5_2_0:1.11
	RELEASE_4_9_0:1.11
	RELEASE_5_1_0:1.11
	RELEASE_4_8_0:1.11
	RELEASE_5_0_0:1.11
	RELEASE_4_7_0:1.11
	RELEASE_4_6_2:1.11
	RELEASE_4_6_1:1.11
	RELEASE_4_6_0:1.11
	RELEASE_5_0_DP1:1.11
	RELEASE_4_5_0:1.11
	RELEASE_4_4_0:1.11
	RELEASE_4_3_0:1.10
	RELEASE_4_2_0:1.10
	RELEASE_4_1_1:1.10
	RELEASE_4_1_0:1.10
	RELEASE_3_5_0:1.10
	RELEASE_4_0_0:1.9
	RELEASE_3_4_0:1.9
	RELEASE_3_3_0:1.9
	RELEASE_3_2_0:1.9
	RELEASE_3_1_0:1.8
	RELEASE_2_2_8:1.8
	RELEASE_3_0_0:1.8
	RELEASE_2_2_7:1.7
	RELEASE_2_2_6:1.7
	RELEASE_2_2_5:1.4
	RELEASE_2_2_1:1.3
	RELEASE_2_2_2:1.4
	tkdesk_1_0b2:1.1.1.1
	KOHOUT:1.1.1;
locks; strict;
comment	@# @;


1.14
date	2013.02.19.14.58.34;	author svnexp;	state dead;
branches;
next	1.13;

1.13
date	2006.05.17.20.35.55;	author mi;	state Exp;
branches;
next	1.12;

1.12
date	2004.04.18.17.01.12;	author krion;	state Exp;
branches;
next	1.11;

1.11
date	2001.09.03.18.17.47;	author knu;	state Exp;
branches;
next	1.10;

1.10
date	2000.05.01.17.58.35;	author jseger;	state Exp;
branches;
next	1.9;

1.9
date	99.04.19.22.07.43;	author jseger;	state Exp;
branches;
next	1.8;

1.8
date	98.10.10.03.22.42;	author steve;	state Exp;
branches;
next	1.7;

1.7
date	98.02.27.23.15.06;	author steve;	state Exp;
branches;
next	1.6;

1.6
date	98.02.21.23.17.12;	author steve;	state Exp;
branches;
next	1.5;

1.5
date	97.10.28.06.11.59;	author asami;	state Exp;
branches;
next	1.4;

1.4
date	97.04.21.06.27.52;	author asami;	state Exp;
branches;
next	1.3;

1.3
date	96.11.12.04.54.09;	author max;	state Exp;
branches;
next	1.2;

1.2
date	96.10.16.08.34.35;	author asami;	state Exp;
branches;
next	1.1;

1.1
date	96.08.02.19.57.32;	author chuckr;	state Exp;
branches
	1.1.1.1;
next	;

1.1.1.1
date	96.08.02.19.57.32;	author chuckr;	state Exp;
branches;
next	;


desc
@@


1.14
log
@## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/312561
## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated
@
text
@--- configure	Tue Apr 13 23:39:47 2004
+++ configure	Tue May 16 16:57:39 2006
@@@@ -1568,12 +1568,12 @@@@
 echo "${ECHO_T}./blt" >&6
 else
-   BLT_LIB_SPEC="-L$BLT_LIB_PATH -lBLT"
-   BLT_LIB_STATIC=$BLT_LIB_PATH/libBLT.a
+   BLT_LIB_SPEC="-L$BLT_LIB_PATH -lBLT24"
+   BLT_LIB_STATIC=$BLT_LIB_PATH/libBLT24.a
    NEED_BLT_LIB=
    if test   ! -f $BLT_LIB_PATH/libBLT.a \
           -a ! -f $BLT_LIB_PATH/libBLT.so
    then
-      if test   ! -f $BLT_LIB_PATH/lib/libBLT.a \
-	     -a ! -f $BLT_LIB_PATH/lib/libBLT.so
+      if test   ! -f $BLT_LIB_PATH/lib/libBLT24.a \
+	     -a ! -f $BLT_LIB_PATH/lib/libBLT24.so
       then
 	 echo
@@@@ -1593,6 +1593,7 @@@@
 #
 
-TCL_INCLUDE_PATH=$TCL_EXEC_PREFIX/include
-TK_INCLUDE_PATH=$TCL_INCLUDE_PATH
+TCL_INCLUDE_PATH=$TCL_EXEC_PREFIX/include/tcl${TCL_VERSION}
+TK_INCLUDE_PATH=$TK_EXEC_PREFIX/include/tk${TK_VERSION}
+
 
 #
@@@@ -4509,5 +4510,5 @@@@
 echo "${ECHO_T}$blt_cv_struct_wait_works" >&6
 
-                                                  ac_config_files="$ac_config_files Makefile libdesk/Makefile blt/Makefile netscape-remote/Makefile tkdeskclient/Makefile"
+                                                  ac_config_files="$ac_config_files Makefile libdesk/Makefile netscape-remote/Makefile tkdeskclient/Makefile"
 
 
@


1.13
log
@Update the itcl/itk from 3.2 to 3.3 (released in April 2005). The
installed libraries are now named libitcl.so.3 & libitk.so.3 instead
of having the version be part of the libname (libitcl33.so.1). The
itclConfig.sh and itkConfig.sh are now also installed, which is required
by some software (such as the insight -- a gdb frontend).

Fix-up the (unchanged) iwidgets port to reflect the above and improve it
to not require its own copy of the itcl tree at install time.

Approved by:	maintainer

Fix-up the tkdesk port to reflect the itcl/itk changes, which required
updating it to the 2.0p2 (from 2.0). (This lovely piece of software
badly needs a caring maintainer, BTW.) While here, teach tkdesk to use
installed blt instead of building its own.

The only iwidget/itk/itcl consumer that remains broken is net/smm++ (a
MUD client). This should change as soon as the maintainer get back to
me.
@
text
@@


1.12
log
@- Update to version 2.0

PR:		ports/65720
Submitted by:	Ports Fury
@
text
@d1 20
a20 4
--- configure.orig	Wed Apr 14 12:39:47 2004
+++ configure	Sat Apr 17 21:05:56 2004
@@@@ -1592,8 +1592,9 @@@@
 # Determine include directories
d30 7
a36 1
 # Perform substitutions
@


1.11
log
@Update to use Tcl/Tk 8.2, itcl3.2 and the latest version of BLT.

Bump PORTREVISION.

PR:		30279
Submitted by:	Andy Sparrow <spadger@@best.com> (MAINTAINER)
@
text
@d1 4
a4 36
--- configure.orig      Sun Nov 14 16:07:45 1999
+++ configure   Sun Sep  2 22:02:05 2001
@@@@ -653,7 +653,7 @@@@
 echo $ac_n "checking version of Tcl/Tk""... $ac_c" 1>&6
 echo "configure:655: checking version of Tcl/Tk" >&5
 echo "$ac_t""$TCL_VERSION/$TK_VERSION" 1>&6
-TCL_VERSIONS_ALLOWED="7.5 7.6 8.0 8.1 8.2"
+TCL_VERSIONS_ALLOWED="7.5 7.6 8.0 8.1 8.2 8.3"
 if test -z "`echo $TCL_VERSIONS_ALLOWED | grep $TCL_VERSION`"; then
   echo
   echo TkDesk requires Tcl/Tk versions 7.5/4.1, 7.6/4.2., or 8.0.
@@@@ -661,7 +661,7 @@@@
   echo yet supported \(but hopefully will be soon\).
   exit 1
 fi
-TK_VERSIONS_ALLOWED="4.1 4.2 8.0 8.1 8.2"
+TK_VERSIONS_ALLOWED="4.1 4.2 8.0 8.1 8.2 8.3"
 if test -z "`echo $TK_VERSIONS_ALLOWED | grep $TK_VERSION`"; then
   echo
   echo TkDesk requires Tcl/Tk versions 7.5/4.1, 7.6/4.2, or 8.0.
@@@@ -678,11 +678,9 @@@@
 if test "$TCL_MAJOR_VERSION" -ge 8; then
   echo $ac_n "checking for itcl 3.x""... $ac_c" 1>&6
 echo "configure:681: checking for itcl 3.x" >&5
-  if test -z "$ITCLCONF_PATH" ; then
-    ITCLCONF_PATH=$TCLCONF_PATH
-  fi
-  if test -r $ITCLCONF_PATH/itclConfig.sh ; then
-    . $ITCLCONF_PATH/itclConfig.sh
+  if test -r $ITCLCONF_PATH/itcl.tcl ; then
+    ITCL_VERSION="32"
+    ITCL_MAJOR_VERSION=3
   else
     ITCL_VERSION="no"
     ITCL_MAJOR_VERSION=0
@@@@ -739,14 +737,15 @@@@
d6 9
a14 21
 # -----------------------------------------------------------------------
 if test "$ITCL_VERSION" != "no" ; then
-  TCL_INCLUDE_PATH=$TCL_EXEC_PREFIX/include
-  TK_INCLUDE_PATH=$TCL_INCLUDE_PATH
-  NEED_ITCL_LIB=
+  TCL_INCLUDE_PATH=$TCL_EXEC_PREFIX/include/tcl${TCL_VERSION}
+  TK_INCLUDE_PATH=$TK_EXEC_PREFIX/include/tk${TK_VERSION}
+  NEED_ITCL_LIB=lib_itcl
   # ITCL_LIB_SPEC already set in itclConfig.sh
-  ITCL_LIB_STATIC=${TCLCONF_PATH}/libitcl${ITCL_VERSION}.a
+  ITCL_LIB_SPEC="-L${PREFIX}/lib -litcl${ITCL_VERSION}"
+  ITCL_LIB_STATIC=${PREFIX}/libitcl${ITCL_VERSION}.a
 else
-  TCL_INCLUDE_PATH=$TCL_EXEC_PREFIX/include
-  TK_INCLUDE_PATH=$TK_EXEC_PREFIX/include
+  TCL_INCLUDE_PATH=$TCL_EXEC_PREFIX/include/tcl${TCL_VERSION}
+  TK_INCLUDE_PATH=$TK_EXEC_PREFIX/include/tk${TK_VERSION}
   NEED_ITCL_LIB=lib_itcl
   ITCL_LIB_SPEC=itcl/libitcl.a
   ITCL_LIB_STATIC=itcl/libitcl.a

@


1.10
log
@Upgrade to tkdesk-1.2

This supports tcl/tk 8.2
@
text
@d1 36
a36 3
--- configure.orig	Sun Nov 14 17:07:45 1999
+++ configure	Mon May  1 13:40:36 2000
@@@@ -739,14 +739,14 @@@@
d42 1
d45 1
a45 1
   NEED_ITCL_LIB=
d47 3
a49 1
   ITCL_LIB_STATIC=${TCLCONF_PATH}/libitcl${ITCL_VERSION}.a
d58 1
@


1.9
log
@Fix patch-aa so that it patches the correct part of configure.

PR:		ports/9142
Submitted by:	Duncan Barclay <dmlb@@ragnet.demon.co.uk>
@
text
@d1 11
a11 3
--- configure~	Sun Sep 20 20:41:40 1998
+++ configure	Sun Dec 20 10:57:19 1998
@@@@ -647,8 +647,8 @@@@
@


1.8
log
@Update to version 1.1.

PR:		8014
Submited by:	maintainer
@
text
@d1 13
a13 21
*** configure~  Sun Sep 20 20:41:40 1998
--- configure   Mon Sep 21 20:00:18 1998
***************
*** 2109,2116 ****
  s%@@TCL_LD_SEARCH_FLAGS@@%$TCL_LD_SEARCH_FLAGS%g
  s%@@TCL_EXEC_PREFIX@@%$TCL_EXEC_PREFIX%g
  s%@@TK_EXEC_PREFIX@@%$TK_EXEC_PREFIX%g
! s%@@TCL_INCLUDE_PATH@@%$TCL_INCLUDE_PATH%g
! s%@@TK_INCLUDE_PATH@@%$TK_INCLUDE_PATH%g
  s%@@TK_XINCLUDES@@%$TK_XINCLUDES%g
  s%@@TCL_LIB_SPEC@@%$TCL_LIB_SPEC%g
  s%@@TK_LIB_SPEC@@%$TK_LIB_SPEC%g
--- 2109,2116 ----
  s%@@TCL_LD_SEARCH_FLAGS@@%$TCL_LD_SEARCH_FLAGS%g
  s%@@TCL_EXEC_PREFIX@@%$TCL_EXEC_PREFIX%g
  s%@@TK_EXEC_PREFIX@@%$TK_EXEC_PREFIX%g
! s%@@TCL_INCLUDE_PATH@@%$TCL_INCLUDE_PATH/tcl7.6%g
! s%@@TK_INCLUDE_PATH@@%$TK_INCLUDE_PATH/tk4.2%g
  s%@@TK_XINCLUDES@@%$TK_XINCLUDES%g
  s%@@TCL_LIB_SPEC@@%$TCL_LIB_SPEC%g
  s%@@TK_LIB_SPEC@@%$TK_LIB_SPEC%g
@


1.7
log
@Update to the new released version and revert to using tcl7.6/tk4.2
because this port will not work with anything newer at present.

PR:		5282
Reviewed by:	maintainer
@
text
@d1 21
a21 13
--- configure.orig	Fri Feb 27 11:33:27 1998
+++ configure	Fri Feb 27 11:33:54 1998
@@@@ -2109,8 +2109,8 @@@@
 s%@@TCL_LD_SEARCH_FLAGS@@%$TCL_LD_SEARCH_FLAGS%g
 s%@@TCL_EXEC_PREFIX@@%$TCL_EXEC_PREFIX%g
 s%@@TK_EXEC_PREFIX@@%$TK_EXEC_PREFIX%g
-s%@@TCL_INCLUDE_PATH@@%$TCL_INCLUDE_PATH%g
-s%@@TK_INCLUDE_PATH@@%$TK_INCLUDE_PATH%g
+s%@@TCL_INCLUDE_PATH@@%$TCL_INCLUDE_PATH/tcl7.6%g
+s%@@TK_INCLUDE_PATH@@%$TK_INCLUDE_PATH/tk4.2%g
 s%@@TK_XINCLUDES@@%$TK_XINCLUDES%g
 s%@@TCL_LIB_SPEC@@%$TCL_LIB_SPEC%g
 s%@@TK_LIB_SPEC@@%$TK_LIB_SPEC%g
@


1.6
log
@Update to version 1.0b5.

PR:		5282
Submitted by:	Duncan Barclay <dmlb@@ragnet.demon.co.uk> and myself
@
text
@d1 13
a13 95
*** Makefile.in.orig	Fri Dec  5 10:44:55 1997
--- Makefile.in	Wed Dec 10 21:52:59 1997
***************
*** 107,113 ****
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I. -I${TCLTK_INCLUDE_DIR} ${X_INCLUDE_FLAG}
  LDFLAGS =	${LD_OPTS}
  
  PKGNAME =	tkdesk
--- 107,113 ----
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I. -I${TCLTK_INCLUDE_DIR}/tcl8.0 -I${TCLTK_INCLUDE_DIR}/tk8.0 ${X_INCLUDE_FLAG}
  LDFLAGS =	${LD_OPTS}
  
  PKGNAME =	tkdesk
*** blt/Makefile.in.orig	Wed Dec 10 21:55:46 1997
--- blt/Makefile.in	Wed Dec 10 21:54:34 1997
***************
*** 29,35 ****
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I.. -I. -I${TCLTK_INCLUDE_DIR} ${X_INCLUDE_FLAG}
  BLT_LIBRARY =	$(LIB_DIR)
  
  libname	=	libBLT.a
--- 29,35 ----
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I.. -I. -I${TCLTK_INCLUDE_DIR}/tcl8.0 -I${TCLTK_INCLUDE_DIR}/tk8.0 ${X_INCLUDE_FLAG}
  BLT_LIBRARY =	$(LIB_DIR)
  
  libname	=	libBLT.a
*** itcl/Makefile.in.orig	Fri Dec  5 10:44:56 1997
--- itcl/Makefile.in	Wed Dec 10 21:57:21 1997
***************
*** 26,32 ****
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I.. -I${TCLTK_INCLUDE_DIR}
  
  libname	=	libitcl.a
  
--- 26,32 ----
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I.. -I${TCLTK_INCLUDE_DIR}/tcl8.0 -I${TCLTK_INCLUDE_DIR}/tk8.0
  
  libname	=	libitcl.a
  
*** libdesk/Makefile.in.orig	Fri Dec  5 10:44:56 1997
--- libdesk/Makefile.in	Wed Dec 10 21:58:10 1997
***************
*** 29,35 ****
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I.. -I${TCLTK_INCLUDE_DIR} ${X_INCLUDE_FLAG}
  
  libname	=	libdesk.a
  
--- 29,35 ----
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I.. -I${TCLTK_INCLUDE_DIR}/tcl8.0 -I${TCLTK_INCLUDE_DIR}/tk8.0 ${X_INCLUDE_FLAG}
  
  libname	=	libdesk.a
  
*** netscape-remote/Makefile.in.orig	Fri Dec  5 10:44:56 1997
--- netscape-remote/Makefile.in	Wed Dec 10 22:00:37 1997
***************
*** 29,35 ****
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I.. -I${TCLTK_INCLUDE_DIR} ${X_INCLUDE_FLAG}
  
  libname	=	libnetscape.a
  
--- 29,35 ----
  # either.
  #----------------------------------------------------------------
  
! CFLAGS =	${CC_OPTS} ${AC_FLAGS} -I.. -I${TCLTK_INCLUDE_DIR}/tcl8.0 -I${TCLTK_INCLUDE_DIR}/tk8.0 ${X_INCLUDE_FLAG}
  
  libname	=	libnetscape.a
  
@


1.5
log
@Make this port work again in the post-tcl world.
@
text
@d1 95
a95 1424
Index: Makefile
--- Makefile.orig	Thu Sep 26 10:37:58 1996
+++ Makefile	Sun Nov 10 20:40:01 1996
@@@@ -21,9 +21,14 @@@@
 # --------------------------------
 
 #
+# Installation prefix:
+
+PREFIX?=/usr/local
+
+#
 # Where the executables will be installed:
 
-BINDIR = /usr/local/bin
+BINDIR = ${PREFIX}/bin
 #BINDIR = $(HOME)/bin
 
 # Where TkDesk will look for the tkdesk script when started (this is
@@@@ -34,7 +39,7 @@@@
 #
 # TkDesk's library will be installed here:
 
-LIBDIR = /usr/local/lib/TkDesk
+LIBDIR = ${PREFIX}/lib/TkDesk
 #LIBDIR = $(HOME)/lib/TkDesk
 
 # Where TkDesk will look for its library files when started (this is
@@@@ -50,48 +55,50 @@@@
 #
 # Location of the Tcl include files:
 
-TCLINCDIR = /usr/include/tcl       # Linux with Slackware 3.0
 #TCLINCDIR = /usr/local/include
+#TCLINCDIR = /usr/include/tcl       # Linux with Slackware 3.0
-#TCLINCDIR = /usr/local/include/tcl7.5
+TCLINCDIR = /usr/local/include/tcl7.5
 #TCLINCDIR = $(HOME)/include
 
 # Location of the Tcl library:
 # (Ignore the "-L" bit - the linker needs it.)
 
-TCLLIBDIR =
-#TCLLIBDIR = -L/usr/local/lib
+#TCLLIBDIR =
+TCLLIBDIR = -L/usr/local/lib
 #TCLLIBDIR = -L$(HOME)/lib
 
 #
 # Flag for linking the Tcl library to TkDesk:
 
-TCLLIB = -ltcl
+#TCLLIB = -ltcl
 #TCLLIB = -ltcl7.4
 #TCLLIB = -ltcl7.5
 #TCLLIB = -ltcl7_4
+TCLLIB = -ltcl75
 
 #
 # Location of the Tk include files:
 
-TKINCDIR = /usr/include/tcl        # Linux with Slackware 3.0
-#TKINCDIR = /usr/local/include
+#TKINCDIR = /usr/include/tcl        # Linux with Slackware 3.0
+TKINCDIR = /usr/local/include/tk4.1
 #TKINCDIR = /usr/local/include/tcl7.5
 #TKINCDIR = $(HOME)/include
 
 # Location of the Tk library:
 # (Ignore the "-L" bit - the linker needs it.)
 
-TKLIBDIR =
-#TKLIBDIR = -L/usr/local/lib
+#TKLIBDIR =
+TKLIBDIR = -L/usr/local/lib
 #TKLIBDIR = -L$(HOME)/lib
 
 #
 # Flag for linking the Tk library to TkDesk:
 
-TKLIB = -ltk
+#TKLIB = -ltk
 #TKLIB = -ltk4.0
 #TKLIB = -ltk4.1
 #TKLIB = -ltk4_0
+TKLIB = -ltk41
 
 # --------------------------------
 # X11 Paths:
@@@@ -119,12 +126,12 @@@@
 # to add the appropriate library which allows for dynamic loading on
 # your system, such as -ldl for Linux and SGI or -ldld for HP-UX.)
 
-OTHERLIBS = -lieee           # e.g. Linux with Tcl 7.4
+#OTHERLIBS = -lieee           # e.g. Linux with Tcl 7.4
 #OTHERLIBS = -ldl -lieee      # e.g. Linux with Tcl 7.5 and dynamic loading
 #OTHERLIBS = -ldl -lnsl -lsocket   # e.g. for Solaris
 #OTHERLIBS = -ldl -lsocket    # e.g. for SGI with os5.3 and Tcl 7.5
 #OTHERLIBS = -ldld            # e.g. for HP-UX 9.05 and Tcl 7.5
-#OTHERLIBS =
+OTHERLIBS =
 
 # --------------------------------
 # Compiler and Linker Settings:
@@@@ -170,8 +177,8 @@@@
 	@@echo "out the fifth line in the file tkdesk and then executing:"
 	@@echo "./tkdesksh tkdesk -configdir ./tcldesk/configs"
 
-shell: makelibs tkAppInit.o
-	$(CC) $(LDFLAGS) tkAppInit.o -o tkdesksh libdesk/libdesk.a \
+shell: makelibs tkAppInit.o malloc.o
+	$(CC) $(LDFLAGS) tkAppInit.o malloc.o -o tkdesksh libdesk/libdesk.a \
 		netscape-remote/libnetscape.a \
 		blt/src/libBLT.a $(TKLIBDIRFLAG) $(TKLIB) \
 		$(XLIBDIRFLAG) -lX11 itcl/src/libitcl.a \
@@@@ -240,10 +247,11 @@@@
 	find $(LIBDIR) -type f -exec chmod a+r {} \;
 	find $(LIBDIR) -type d -exec chmod a+rx {} \;
 	@@echo "=== Installing the executables..."
-	@@rm -f $(BINDIR)/tkdesksh $(BINDIR)/tkdesk $(BINDIR)/pauseme $(BINDIR)/ed-tkdesk $(BINDIR)/cd-tkdesk $(BINDIR)/od-tkdesk
+	@@rm -f $(BINDIR)/tkdesksh $(BINDIR)/tkdesk $(BINDIR)/pauseme $(BINDIR)/ed-tkdesk $(BINDIR)/cd-tkdesk $(BINDIR)/od-tkdesk $(BINDIR)/gdbcore $(BINDIR)/dddcore
 	cp tkdesksh $(BINDIR)
-	cp tkdesk tools/pauseme tools/ed-tkdesk tools/cd-tkdesk tools/od-tkdesk $(BINDIR)
-	chmod 755 $(BINDIR)/*tkdesk* $(BINDIR)/pauseme
+	cp tkdesk tools/pauseme tools/gdbcore tools/ed-tkdesk tools/cd-tkdesk tools/od-tkdesk $(BINDIR)
+	chmod 755 $(BINDIR)/*tkdesk* $(BINDIR)/pauseme $(BINDIR)/gdbcore
+	ln -s gdbcore $(BINDIR)/dddcore
 	@@echo "=== Installation complete."
 
 uninstall:
Index: libdesk/dsk_ls.c
@@@@ -57,6 +57,7 @@@@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/types.h>
 #include <dirent.h>
 #include <time.h>		/* for ctime */
 #include <unistd.h>		/* for readlink */
@@@@ -382,7 +382,7 @@@@
 void write_element (fe)
     FILE_ENTRY *fe;
 {
-    char buf[256], *np;
+    char buf[2560], *np;
 
     np = (par_only_directories) ? fe->path : fe->name;
 
Index: libdesk/misc.c
@@@@ -68,7 +68,7 @@@@
 {
     int keep = 0, i;
     char tc;
-    char instr[TCL_RESULT_SIZE], outstr[TCL_RESULT_SIZE];
+    char instr[2560], outstr[2560];
     
     if (argc < 2 || argc > 3) {
 	sprintf (interp->result, "usage: dsk_striptc ?-keep? string");
@@@@ -87,7 +87,7 @@@@
     }
 
     if (instr[0] == 0) {
-	*interp->result = 0;
+	Tcl_ResetResult(interp);
 	return (TCL_OK);
     }
 
@@@@ -117,7 +117,7 @@@@
 	}
     }
 
-    strcpy (interp->result, outstr);
+    Tcl_SetResult(interp, outstr, TCL_VOLATILE);
     return (TCL_OK);
 } /* dsk_striptc_Cmd */
 
Index: tcldesk/appbar.tcl
@@@@ -1002,7 +1002,7 @@@@
 		    _appbar_get_load]
 	    return
 	}
-	set li [lsearch $uptime "average:"]
+	set li [lsearch $uptime "averages:"]
 	set load1 [string trimright [lindex $uptime [incr li]] ,]
 	set load2 [string trimright [lindex $uptime [incr li]] ,]
 	set load3 [string trimright [lindex $uptime [incr li]] ,]
Index: tools/gdbcore
@@@@ -0,0 +1,28 @@@@
+#! /bin/sh
+# {gdb,ddd}core executable corefile - gdb/ddd a core file
+
+# Try to load shared symbols by `run'ning upto main first, then
+# loading the core-file (BSD's gdb sees only static symbols otherwise)
+case `basename $0` in
+ddd*)
+	x=ddd
+	;;
+*)
+	x=gdb
+	;;
+esac
+if [ -z "$1" ]; then
+	f=`basename $2|sed s/.core\$//`
+else
+	f=$1
+fi
+if [ ! -f "$f" ]; then
+	f=`dirname $2`/`basename $f`
+fi
+if nm -g "$f" |grep -q "^[0-9a-f]* T _main$"; then
+	(echo b main; echo r; echo del 1; echo core-file $2) >/tmp/gdbcore-x-$$
+	(rm /tmp/gdbcore-x-$$; exec $x -x /dev/fd/6 $f) 6</tmp/gdbcore-x-$$
+else
+	# no `main' symbol...
+	exec $x $f $2
+fi
Index: malloc.c
@@@@ -0,0 +1,1206 @@@@
+/*
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@@FreeBSD.ORG> wrote this file.  As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ *
+ * $Id: patch-aa,v 1.4 1997/04/21 06:27:52 asami Exp $
+ *
+ */
+
+/*
+ * Defining EXTRA_SANITY will enable some checks which are related
+ * to internal conditions and consistency in malloc.c
+ */
+#undef EXTRA_SANITY
+
+/*
+ * Defining MALLOC_STATS will enable you to call malloc_dump() and set
+ * the [dD] options in the MALLOC_OPTIONS environment variable.
+ * It has no run-time performance hit.
+ */
+#define MALLOC_STATS
+
+#if defined(EXTRA_SANITY) && !defined(MALLOC_STATS)
+# define MALLOC_STATS	/* required for EXTRA_SANITY */
+#endif
+
+/*
+ * What to use for Junk
+ */
+#define SOME_JUNK	0xd0		/* as in "Duh" :-) */
+
+/*
+ * If these weren't defined here, they would be calculated on the fly,
+ * at a considerable cost in performance.
+ */
+#if defined(__i386__) && defined(__FreeBSD__)
+#   define malloc_pagesize		4096U
+#   define malloc_pageshift		12U
+#   define malloc_minsize		16U
+#   define malloc_maxsize		((malloc_pagesize)>>1)
+#endif /* __i386__ && __FreeBSD__ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <memory.h>
+#include <errno.h>
+#include <err.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#ifdef _THREAD_SAFE
+#include <pthread.h>
+#include "pthread_private.h"
+#endif
+
+/*
+ * This structure describes a page worth of chunks.
+ */
+
+struct pginfo {
+    struct pginfo	*next;	/* next on the free list */
+    void		*page;	/* Pointer to the page */
+    u_short		size;	/* size of this page's chunks */
+    u_short		shift;	/* How far to shift for this size chunks */
+    u_short		free;	/* How many free chunks */
+    u_short		total;	/* How many chunk */
+    u_long		bits[1]; /* Which chunks are free */
+};
+
+/*
+ * This structure describes a number of free pages.
+ */
+
+struct pgfree {
+    struct pgfree	*next;	/* next run of free pages */
+    struct pgfree	*prev;	/* prev run of free pages */
+    void		*page;	/* pointer to free pages */
+    void		*end;	/* pointer to end of free pages */
+    u_long		size;	/* number of bytes free */
+};
+
+/*
+ * How many bits per u_long in the bitmap.
+ * Change only if not 8 bits/byte
+ */
+#define	MALLOC_BITS	(8*sizeof(u_long))
+
+/*
+ * Magic values to put in the page_directory
+ */
+#define MALLOC_NOT_MINE	((struct pginfo*) 0)
+#define MALLOC_FREE 	((struct pginfo*) 1)
+#define MALLOC_FIRST	((struct pginfo*) 2)
+#define MALLOC_FOLLOW	((struct pginfo*) 3)
+#define MALLOC_MAGIC	((struct pginfo*) 4)
+
+/*
+ * The i386 architecture has some very convenient instructions.
+ * We might as well use them.  There are C-language backups, but
+ * they are considerably slower.
+ */
+#ifdef __i386__
+#define ffs _ffs
+static __inline int
+_ffs(unsigned input)
+{
+	int result;
+	asm("bsfl %1,%0" : "=r" (result) : "r" (input));
+	return result+1;
+}
+
+#define fls _fls
+static __inline int
+_fls(unsigned input)
+{
+	int result;
+	asm("bsrl %1,%0" : "=r" (result) : "r" (input));
+	return result+1;
+}
+
+#define set_bit _set_bit
+static __inline void
+_set_bit(struct pginfo *pi, int bit)
+{
+	asm("btsl %0,(%1)" :
+	: "r" (bit & (MALLOC_BITS-1)), "r" (pi->bits+(bit/MALLOC_BITS)));
+}
+
+#define clr_bit _clr_bit
+static __inline void
+_clr_bit(struct pginfo *pi, int bit)
+{
+	asm("btcl %0,(%1)" :
+	: "r" (bit & (MALLOC_BITS-1)), "r" (pi->bits+(bit/MALLOC_BITS)));
+}
+
+#endif /* __i386__ */
+
+/*
+ * Set to one when malloc_init has been called
+ */
+static	unsigned	initialized;
+
+/*
+ * The size of a page.
+ * Must be a integral multiplum of the granularity of mmap(2).
+ * Your toes will curl if it isn't a power of two
+ */
+#ifndef malloc_pagesize
+static	unsigned        malloc_pagesize;
+#endif /* malloc_pagesize */
+
+/*
+ * A mask for the offset inside a page.
+ */
+#define malloc_pagemask	((malloc_pagesize)-1)
+
+#define pageround(foo) (((foo) + (malloc_pagemask))&(~(malloc_pagemask)))
+#define ptr2index(foo) (((u_long)(foo) >> malloc_pageshift)-malloc_origo)
+
+/*
+ * malloc_pagesize == 1 << malloc_pageshift
+ */
+#ifndef malloc_pageshift
+static	unsigned	malloc_pageshift;
+#endif /* malloc_pageshift */
+
+/*
+ * The smallest allocation we bother about.
+ * Must be power of two
+ */
+#ifndef malloc_minsize
+static	unsigned  malloc_minsize;
+#endif /* malloc_minsize */
+
+/*
+ * The largest chunk we care about.
+ * Must be smaller than pagesize
+ * Must be power of two
+ */
+#ifndef malloc_maxsize
+static	unsigned  malloc_maxsize;
+#endif /* malloc_maxsize */
+
+/*
+ * The minimum size (in bytes) of the free page cache.
+ */
+#ifndef malloc_cache
+static	unsigned  malloc_cache;
+#endif /* malloc_cache */
+
+/*
+ * The offset from pagenumber to index into the page directory
+ */
+static	u_long  malloc_origo;
+
+/*
+ * The last index in the page directory we care about
+ */
+static	u_long  last_index;
+
+/*
+ * Pointer to page directory.
+ * Allocated "as if with" malloc
+ */
+static	struct	pginfo **page_dir;
+
+/*
+ * How many slots in the page directory
+ */
+static	unsigned	malloc_ninfo;
+
+/*
+ * Free pages line up here
+ */
+static struct pgfree	free_list;
+
+/*
+ * Abort() if we fail to get VM ?
+ */
+static int malloc_abort;
+
+/*
+ * Are we trying to die ?
+ */
+static int suicide;
+
+#ifdef MALLOC_STATS
+/*
+ * dump statistics
+ */
+static int malloc_stats;
+#endif /* MALLOC_STATS */
+
+/*
+ * always realloc ?
+ */
+static int malloc_realloc;
+
+/*
+ * zero fill ?
+ */
+static int malloc_zero;
+
+/*
+ * junk fill ?
+ */
+static int malloc_junk;
+
+/*
+ * my last break.
+ */
+static void *malloc_brk;
+
+/*
+ * one location cache for free-list holders
+ */
+static struct pgfree *px;
+
+/*
+ * Necessary function declarations
+ */
+static int extend_pgdir(u_long index);
+
+#ifdef MALLOC_STATS
+void
+malloc_dump(FILE *fd)
+{
+    struct pginfo **pd;
+    struct pgfree *pf;
+    int j;
+
+    pd = page_dir;
+
+    /* print out all the pages */
+    for(j=0;j<=last_index;j++) {
+	fprintf(fd,"%08lx %5d ",(j+malloc_origo) << malloc_pageshift,j);
+	if (pd[j] == MALLOC_NOT_MINE) {
+	    for(j++;j<=last_index && pd[j] == MALLOC_NOT_MINE;j++)
+		;
+	    j--;
+	    fprintf(fd,".. %5d not mine\n",	j);
+	} else if (pd[j] == MALLOC_FREE) {
+	    for(j++;j<=last_index && pd[j] == MALLOC_FREE;j++)
+		;
+	    j--;
+	    fprintf(fd,".. %5d free\n", j);
+	} else if (pd[j] == MALLOC_FIRST) {
+	    for(j++;j<=last_index && pd[j] == MALLOC_FOLLOW;j++)
+		;
+	    j--;
+	    fprintf(fd,".. %5d in use\n", j);
+	} else if (pd[j] < MALLOC_MAGIC) {
+	    fprintf(fd,"(%p)\n", pd[j]);
+	} else {
+	    fprintf(fd,"%p %d (of %d) x %d @@ %p --> %p\n",
+		pd[j],pd[j]->free, pd[j]->total,
+		pd[j]->size, pd[j]->page, pd[j]->next);
+	}
+    }
+
+    for(pf=free_list.next; pf; pf=pf->next) {
+	fprintf(fd,"Free: @@%p [%p...%p[ %ld ->%p <-%p\n",
+		pf,pf->page,pf->end,pf->size,pf->prev,pf->next);
+	if (pf == pf->next) {
+		fprintf(fd,"Free_list loops.\n");
+		break;
+	}
+    }
+
+    /* print out various info */
+    fprintf(fd,"Minsize\t%d\n",malloc_minsize);
+    fprintf(fd,"Maxsize\t%d\n",malloc_maxsize);
+    fprintf(fd,"Pagesize\t%d\n",malloc_pagesize);
+    fprintf(fd,"Pageshift\t%d\n",malloc_pageshift);
+    fprintf(fd,"FirstPage\t%ld\n",malloc_origo);
+    fprintf(fd,"LastPage\t%ld %lx\n",last_index+malloc_pageshift,
+	(last_index + malloc_pageshift) << malloc_pageshift);
+    fprintf(fd,"Break\t%ld\n",(u_long)sbrk(0) >> malloc_pageshift);
+}
+#endif /* MALLOC_STATS */
+
+static void
+wrterror(char *p)
+{
+    char *q = "Malloc error: ";
+    suicide = 1;
+    write(2,q,strlen(q));
+    write(2,p,strlen(p));
+#ifdef MALLOC_STATS
+    if (malloc_stats)
+	malloc_dump(stderr);
+#endif /* MALLOC_STATS */
+    abort();
+}
+
+static void
+wrtwarning(char *p)
+{
+    char *q = "Malloc warning: ";
+    if (malloc_abort)
+	wrterror(p);
+    write(2,q,strlen(q));
+    write(2,p,strlen(p));
+}
+
+#ifdef EXTRA_SANITY
+static void
+malloc_exit()
+{
+    FILE *fd = fopen("malloc.out","a");
+    char *q = "malloc() warning: Couldn't dump stats.\n";
+    if (fd) {
+        malloc_dump(fd);
+	fclose(fd);
+    } else
+	write(2,q,strlen(q));
+}
+#endif /* EXTRA_SANITY */
+
+
+/*
+ * Allocate a number of pages from the OS
+ */
+static caddr_t
+map_pages(int pages)
+{
+    caddr_t result,tail;
+
+    result = (caddr_t)pageround((u_long)sbrk(0));
+    tail = result + (pages << malloc_pageshift);
+
+    if (brk(tail)) {
+#ifdef EXTRA_SANITY
+	wrterror("(internal): map_pages fails\n");
+#endif /* EXTRA_SANITY */
+	return 0;
+    }
+
+    last_index = ptr2index(tail) - 1;
+    malloc_brk = tail;
+
+    if ((last_index+1) >= malloc_ninfo && !extend_pgdir(last_index))
+	return 0;;
+
+    return result;
+}
+
+/*
+ * Set a bit in the bitmap
+ */
+#ifndef set_bit
+static __inline void
+set_bit(struct pginfo *pi, int bit)
+{
+    pi->bits[bit/MALLOC_BITS] |= 1<<(bit%MALLOC_BITS);
+}
+#endif /* set_bit */
+
+/*
+ * Clear a bit in the bitmap
+ */
+#ifndef clr_bit
+static __inline void
+clr_bit(struct pginfo *pi, int bit)
+{
+    pi->bits[bit/MALLOC_BITS] &= ~(1<<(bit%MALLOC_BITS));
+}
+#endif /* clr_bit */
+
+#ifndef tst_bit
+/*
+ * Test a bit in the bitmap
+ */
+static __inline int
+tst_bit(struct pginfo *pi, int bit)
+{
+    return pi->bits[bit/MALLOC_BITS] & (1<<(bit%MALLOC_BITS));
+}
+#endif /* tst_bit */
+
+/*
+ * Find last bit
+ */
+#ifndef fls
+static __inline int
+fls(int size)
+{
+    int i = 1;
+    while (size >>= 1)
+	i++;
+    return i;
+}
+#endif /* fls */
+
+/*
+ * Extend page directory
+ */
+static int
+extend_pgdir(u_long index)
+{
+    struct  pginfo **new,**old;
+    int i, oldlen;
+
+    /* Make it this many pages */
+    i = index * sizeof *page_dir;
+    i /= malloc_pagesize;
+    i += 2;
+
+    /* remember the old mapping size */
+    oldlen = malloc_ninfo * sizeof *page_dir;
+
+    /*
+     * NOTE: we allocate new pages and copy the directory rather than tempt
+     * fate by trying to "grow" the region.. There is nothing to prevent
+     * us from accidently re-mapping space that's been allocated by our caller
+     * via dlopen() or other mmap().
+     *
+     * The copy problem is not too bad, as there is 4K of page index per
+     * 4MB of malloc arena.
+     *
+     * We can totally avoid the copy if we open a file descriptor to associate
+     * the anon mappings with.  Then, when we remap the pages at the new
+     * address, the old pages will be "magically" remapped..  But this means
+     * keeping open a "secret" file descriptor.....
+     */
+
+    /* Get new pages */
+    new = (struct pginfo**) mmap(0, i * malloc_pagesize, PROT_READ|PROT_WRITE,
+				 MAP_ANON|MAP_PRIVATE, -1, 0);
+    if (new == (struct pginfo **)-1)
+	return 0;
+
+    /* Copy the old stuff */
+    memcpy(new, page_dir,
+	    malloc_ninfo * sizeof *page_dir);
+
+    /* register the new size */
+    malloc_ninfo = i * malloc_pagesize / sizeof *page_dir;
+
+    /* swap the pointers */
+    old = page_dir;
+    page_dir = new;
+
+    /* Now free the old stuff */
+    munmap((caddr_t)old, oldlen);
+    return 1;
+}
+
+/*
+ * Initialize the world
+ */
+static void
+malloc_init ()
+{
+    char *p;
+
+#ifdef EXTRA_SANITY
+    malloc_junk = 1;
+#endif /* EXTRA_SANITY */
+
+    for (p=getenv("MALLOC_OPTIONS"); p && *p; p++) {
+	switch (*p) {
+	    case 'a': malloc_abort   = 0; break;
+	    case 'A': malloc_abort   = 1; break;
+#ifdef MALLOC_STATS
+	    case 'd': malloc_stats   = 0; break;
+	    case 'D': malloc_stats   = 1; break;
+#endif /* MALLOC_STATS */
+	    case 'r': malloc_realloc = 0; break;
+	    case 'R': malloc_realloc = 1; break;
+	    case 'j': malloc_junk    = 0; break;
+	    case 'J': malloc_junk    = 1; break;
+	    case 'z': malloc_zero    = 0; break;
+	    case 'Z': malloc_zero    = 1; break;
+	    default:
+		wrtwarning("(Init): Unknown char in MALLOC_OPTIONS\n");
+		p = 0;
+		break;
+	}
+    }
+
+    /*
+     * We want junk in the entire allocation, and zero only in the part
+     * the user asked for.
+     */
+    if (malloc_zero)
+	malloc_junk=1;
+
+#ifdef EXTRA_SANITY
+    if (malloc_stats)
+	atexit(malloc_exit);
+#endif /* EXTRA_SANITY */
+
+#ifndef malloc_pagesize
+    /* determine our pagesize */
+    malloc_pagesize = getpagesize();
+#endif /* malloc_pagesize */
+
+#ifndef malloc_maxsize
+    malloc_maxsize = malloc_pagesize >> 1;
+#endif /* malloc_maxsize */
+
+#ifndef malloc_pageshift
+    {
+    int i;
+    /* determine how much we shift by to get there */
+    for (i = malloc_pagesize; i > 1; i >>= 1)
+	malloc_pageshift++;
+    }
+#endif /* malloc_pageshift */
+
+#ifndef malloc_cache
+    malloc_cache = 100 << malloc_pageshift;
+#endif /* malloc_cache */
+
+#ifndef malloc_minsize
+    {
+    int i;
+    /*
+     * find the smallest size allocation we will bother about.
+     * this is determined as the smallest allocation that can hold
+     * it's own pginfo;
+     */
+    i = 2;
+    for(;;) {
+	int j;
+
+	/* Figure out the size of the bits */
+	j = malloc_pagesize/i;
+	j /= 8;
+	if (j < sizeof(u_long))
+		j = sizeof (u_long);
+	if (sizeof(struct pginfo) + j - sizeof (u_long) <= i)
+		break;
+	i += i;
+    }
+    malloc_minsize = i;
+    }
+#endif /* malloc_minsize */
+
+    /* Allocate one page for the page directory */
+    page_dir = (struct pginfo **) mmap(0, malloc_pagesize, PROT_READ|PROT_WRITE,
+				       MAP_ANON|MAP_PRIVATE, -1, 0);
+    if (page_dir == (struct pginfo **) -1)
+	wrterror("(Init) my first mmap failed.  (check limits ?)\n");
+
+    /*
+     * We need a maximum of malloc_pageshift buckets, steal these from the
+     * front of the page_directory;
+     */
+    malloc_origo = ((u_long)pageround((u_long)sbrk(0))) >> malloc_pageshift;
+    malloc_origo -= malloc_pageshift;
+
+    malloc_ninfo = malloc_pagesize / sizeof *page_dir;
+
+    /* Been here, done that */
+    initialized++;
+
+    /*
+     * This is a nice hack from Kaleb Keithly (kaleb@@x.org).
+     * We can sbrk(2) further back when we keep this on a low address.
+     */
+    px = (struct pgfree *) malloc (sizeof *px);
+}
+
+/*
+ * Allocate a number of complete pages
+ */
+void *
+malloc_pages(size_t size)
+{
+    void *p,*delay_free = 0;
+    int i;
+    struct pgfree *pf;
+    u_long index;
+
+    size = pageround(size);
+
+    p = 0;
+    /* Look for free pages before asking for more */
+    for(pf = free_list.next; pf; pf = pf->next) {
+
+#ifdef EXTRA_SANITY
+	if (pf->size & malloc_pagemask)
+	    wrterror("(ES): junk length entry on free_list\n");
+	if (!pf->size)
+	    wrterror("(ES): zero length entry on free_list\n");
+	if (pf->page == pf->end)
+	    wrterror("(ES): zero entry on free_list\n");
+	if (pf->page > pf->end) 
+	    wrterror("(ES): sick entry on free_list\n");
+	if ((void*)pf->page >= (void*)sbrk(0))
+	    wrterror("(ES): entry on free_list past brk\n");
+	if (page_dir[ptr2index(pf->page)] != MALLOC_FREE) 
+	    wrterror("(ES): non-free first page on free-list\n");
+	if (page_dir[ptr2index(pf->end)-1] != MALLOC_FREE)
+	    wrterror("(ES): non-free last page on free-list\n");
+#endif /* EXTRA_SANITY */
+
+	if (pf->size < size)
+	    continue;
+
+	if (pf->size == size) {
+	    p = pf->page;
+	    if (pf->next)
+		    pf->next->prev = pf->prev;
+	    pf->prev->next = pf->next;
+	    delay_free = pf;
+	    break;
+	} 
+
+	p = pf->page;
+	pf->page += size;
+	pf->size -= size;
+	break;
+    }
+
+#ifdef EXTRA_SANITY
+    if (p && page_dir[ptr2index(p)] != MALLOC_FREE)
+	wrterror("(ES): allocated non-free page on free-list\n");
+#endif /* EXTRA_SANITY */
+
+    size >>= malloc_pageshift;
+
+    /* Map new pages */
+    if (!p)
+	p = map_pages(size);
+
+    if (p) {
+
+	index = ptr2index(p);
+	page_dir[index] = MALLOC_FIRST;
+	for (i=1;i<size;i++)
+	    page_dir[index+i] = MALLOC_FOLLOW;
+
+	if (malloc_junk)
+	    memset(p, SOME_JUNK,size << malloc_pageshift);
+    }
+
+    if (delay_free) {
+	if (!px)
+	    px = delay_free;
+	else
+	    free(delay_free);
+    }
+
+    return p;
+}
+
+/*
+ * Allocate a page of fragments
+ */
+
+static __inline int
+malloc_make_chunks(int bits)
+{
+    struct  pginfo *bp;
+    void *pp;
+    int i,k,l;
+
+    /* Allocate a new bucket */
+    pp = malloc_pages(malloc_pagesize);
+    if (!pp)
+	return 0;
+
+    /* Find length of admin structure */
+    l = sizeof *bp - sizeof(u_long);
+    l += sizeof(u_long) *
+	(((malloc_pagesize >> bits)+MALLOC_BITS-1) / MALLOC_BITS);
+
+    /* Don't waste more than two chunks on this */
+    if ((1<<(bits)) <= l+l) {
+	bp = (struct  pginfo *)pp;
+    } else {
+	bp = (struct  pginfo *)malloc(l);
+	if (!bp)
+	    return 0;
+    }
+
+    bp->size = (1<<bits);
+    bp->shift = bits;
+    bp->total = bp->free = malloc_pagesize >> bits;
+    bp->page = pp;
+
+    page_dir[ptr2index(pp)] = bp;
+
+    bp->next = page_dir[bits];
+    page_dir[bits] = bp;
+
+    /* set all valid bits in the bits */
+    k = bp->total;
+    i = 0;
+
+    /* Do a bunch at a time */
+    for(;k-i >= MALLOC_BITS; i += MALLOC_BITS)
+	bp->bits[i / MALLOC_BITS] = ~0;
+
+    for(; i < k; i++)
+	set_bit(bp,i);
+
+    if (bp == bp->page) {
+	/* Mark the ones we stole for ourselves */
+	for(i=0;l > 0;i++) {
+	    clr_bit(bp,i);
+	    bp->free--;
+	    bp->total--;
+	    l -= (1 << bits);
+	}
+    }
+
+    return 1;
+}
+
+/*
+ * Allocate a fragment
+ */
+static void *
+malloc_bytes(size_t size)
+{
+    int j;
+    struct  pginfo *bp;
+    int k;
+    u_long *lp;
+
+    /* Don't bother with anything less than this */
+    if (size < malloc_minsize)
+	size = malloc_minsize;
+
+    /* Find the right bucket */
+    j = fls((size)-1);
+
+    /* If it's empty, make a page more of that size chunks */
+    if (!page_dir[j] && !malloc_make_chunks(j))
+	return 0;
+
+    bp = page_dir[j];
+
+    /* Find first word of bitmap which isn't empty */
+    for (lp = bp->bits; !*lp; lp++)
+	;
+
+    /* Find that bit, and tweak it */
+    k = ffs(*lp) - 1;
+    *lp ^= 1<<k;
+
+    /* If there are no more free, remove from free-list */
+    if (!--bp->free) {
+	page_dir[j] = bp->next;
+	bp->next = 0;
+    }
+
+    /* Adjust to the real offset of that chunk */
+    k += (lp-bp->bits)*MALLOC_BITS;
+    k <<= bp->shift;
+
+    if (malloc_junk)
+	memset(bp->page + k, SOME_JUNK, bp->size);
+
+    return bp->page + k;
+}
+
+/*
+ * Allocate a piece of memory
+ */
+static __inline void *
+imalloc(size_t size)
+{
+    void *result;
+
+    if (!initialized)
+	malloc_init();
+
+    if (suicide)
+	abort();
+
+    if (size <= malloc_maxsize)
+	result =  malloc_bytes(size);
+    else
+	result =  malloc_pages(size);
+
+    if (malloc_abort && !result)
+	wrterror("malloc(): returns NULL\n");
+
+    if (malloc_zero)
+	memset(result,0,size);
+
+    return result;
+}
+
+/*
+ * Change the size of an allocation.
+ */
+static __inline void *
+irealloc(void *ptr, size_t size)
+{
+    void *p;
+    u_long osize,index;
+    struct pginfo **mp;
+    int i;
+
+    if (suicide)
+	return 0;
+
+    if (!ptr)				/* Bounce to malloc() */
+	return malloc(size);
+
+    if (!initialized) {
+	wrtwarning("realloc(): malloc() never got called.\n");
+	return 0;
+    }
+
+    if (ptr && !size) {			/* Bounce to free() */
+	free(ptr);
+	return 0;
+    }
+
+    index = ptr2index(ptr);
+
+    if (index < malloc_pageshift) {
+	wrtwarning("realloc(): junk pointer (too low)\n");
+	return 0;
+    }
+
+    if (index > last_index) {
+	wrtwarning("realloc(): junk pointer (too high)\n");
+	return 0;
+    }
+
+    mp = &page_dir[index];
+
+    if (*mp == MALLOC_FIRST) {			/* Page allocation */
+
+	/* Check the pointer */
+	if ((u_long)ptr & malloc_pagemask) {
+	    wrtwarning("realloc(): modified page pointer.\n");
+	    return 0;
+	}
+
+	/* Find the size in bytes */
+	for (osize = malloc_pagesize; *++mp == MALLOC_FOLLOW;)
+	    osize += malloc_pagesize;
+
+        if (!malloc_realloc && 			/* unless we have to, */
+	  size <= osize && 			/* .. or are too small, */
+	  size > (osize - malloc_pagesize)) {	/* .. or can free a page, */
+	    return ptr;				/* don't do anything. */
+	}
+
+    } else if (*mp >= MALLOC_MAGIC) {		/* Chunk allocation */
+
+	/* Check the pointer for sane values */
+	if (((u_long)ptr & ((*mp)->size-1))) {
+	    wrtwarning("realloc(): modified chunk pointer.\n");
+	    return 0;
+	}
+
+	/* Find the chunk index in the page */
+	i = ((u_long)ptr & malloc_pagemask) >> (*mp)->shift;
+
+	/* Verify that it isn't a free chunk already */
+	if (tst_bit(*mp,i)) {
+	    wrtwarning("realloc(): already free chunk.\n");
+	    return 0;
+	}
+
+	osize = (*mp)->size;
+
+	if (!malloc_realloc &&		/* Unless we have to, */
+	  size < osize && 		/* ..or are too small, */
+	  (size > osize/2 ||	 	/* ..or could use a smaller size, */
+	  osize == malloc_minsize)) {	/* ..(if there is one) */
+	    return ptr;			/* ..Don't do anything */
+	}
+
+    } else {
+	wrtwarning("realloc(): wrong page pointer.\n");
+	return 0;
+    }
+
+    p = malloc(size);
+
+    if (p) {
+	/* copy the lesser of the two sizes, and free the old one */
+	if (osize < size)
+	    memcpy(p,ptr,osize);
+	else
+	    memcpy(p,ptr,size);
+	free(ptr);
+    } 
+    return p;
+}
+
+/*
+ * Free a sequence of pages
+ */
+
+static __inline void
+free_pages(void *ptr, int index, struct pginfo *info)
+{
+    int i;
+    struct pgfree *pf,*pt=0;
+    u_long l;
+    void *tail;
+
+    if (info == MALLOC_FREE) {
+	wrtwarning("free(): already free page.\n");
+	return;
+    }
+
+    if (info != MALLOC_FIRST) {
+	wrtwarning("free(): freeing wrong page.\n");
+	return;
+    }
+
+    if ((u_long)ptr & malloc_pagemask) {
+	wrtwarning("free(): modified page pointer.\n");
+	return;
+    }
+
+    /* Count how many pages and mark them free at the same time */
+    page_dir[index] = MALLOC_FREE;
+    for (i = 1; page_dir[index+i] == MALLOC_FOLLOW; i++)
+	page_dir[index + i] = MALLOC_FREE;
+
+    l = i << malloc_pageshift;
+
+    tail = ptr+l;
+
+    /* add to free-list */
+    if (!px)
+	px = malloc(sizeof *pt);	/* This cannot fail... */
+    px->page = ptr;
+    px->end =  tail;
+    px->size = l;
+    if (!free_list.next) {
+
+	/* Nothing on free list, put this at head */
+	px->next = free_list.next;
+	px->prev = &free_list;
+	free_list.next = px;
+	pf = px;
+	px = 0;
+
+    } else {
+
+	/* Find the right spot, leave pf pointing to the modified entry. */
+	tail = ptr+l;
+
+	for(pf = free_list.next; pf->end < ptr && pf->next; pf = pf->next)
+	    ; /* Race ahead here */
+
+	if (pf->page > tail) {
+	    /* Insert before entry */
+	    px->next = pf;
+	    px->prev = pf->prev;
+	    pf->prev = px;
+	    px->prev->next = px;
+	    pf = px;
+	    px = 0;
+	} else if (pf->end == ptr ) {
+	    /* Append to the previous entry */
+	    pf->end += l;
+	    pf->size += l;
+	    if (pf->next && pf->end == pf->next->page ) {
+		/* And collapse the next too. */
+		pt = pf->next;
+		pf->end = pt->end;
+		pf->size += pt->size;
+		pf->next = pt->next;
+		if (pf->next)
+		    pf->next->prev = pf;
+	    }
+	} else if (pf->page == tail) {
+	    /* Prepend to entry */
+	    pf->size += l;
+	    pf->page = ptr;
+	} else if (!pf->next) {
+	    /* Append at tail of chain */
+	    px->next = 0;
+	    px->prev = pf;
+	    pf->next = px;
+	    pf = px;
+	    px = 0;
+	} else {
+	    wrterror("messed up free list");
+	}
+    }
+    
+    /* Return something to OS ? */
+    if (!pf->next &&				/* If we're the last one, */
+      pf->size > malloc_cache &&		/* ..and the cache is full, */
+      pf->end == malloc_brk &&			/* ..and none behind us, */
+      malloc_brk == sbrk(0)) {			/* ..and it's OK to do... */
+
+	/*
+	 * Keep the cache intact.  Notice that the '>' above guarantees that
+	 * the pf will always have at least one page afterwards.
+	 */
+	pf->end = pf->page + malloc_cache;
+	pf->size = malloc_cache;
+
+	brk(pf->end);
+	malloc_brk = pf->end;
+
+	index = ptr2index(pf->end);
+	last_index = index - 1;
+
+	for(i=index;i <= last_index;)
+	    page_dir[i++] = MALLOC_NOT_MINE;
+
+	/* XXX: We could realloc/shrink the pagedir here I guess. */
+    }
+    if (pt)
+	free(pt);
+}
+
+/*
+ * Free a chunk, and possibly the page it's on, if the page becomes empty.
+ */
+
+static __inline void
+free_bytes(void *ptr, int index, struct pginfo *info)
+{
+    int i;
+    struct pginfo **mp;
+    void *vp;
+
+    /* Find the chunk number on the page */
+    i = ((u_long)ptr & malloc_pagemask) >> info->shift;
+
+    if (((u_long)ptr & (info->size-1))) {
+	wrtwarning("free(): modified pointer.\n");
+	return;
+    }
+
+    if (tst_bit(info,i)) {
+	wrtwarning("free(): already free chunk.\n");
+	return;
+    }
+
+    set_bit(info,i);
+    info->free++;
+
+    mp = page_dir + info->shift;
+
+    if (info->free == 1) {
+
+	/* Page became non-full */
+
+	mp = page_dir + info->shift;
+	/* Insert in address order */
+	while (*mp && (*mp)->next && (*mp)->next->page < info->page)
+	    mp = &(*mp)->next;
+	info->next = *mp;
+	*mp = info;
+	return;
+    }
+
+    if (info->free != info->total)
+	return;
+
+    /* Find & remove this page in the queue */
+    while (*mp != info) {
+	mp = &((*mp)->next);
+#ifdef EXTRA_SANITY
+	if (!*mp)
+		wrterror("(ES): Not on queue\n");
+#endif /* EXTRA_SANITY */
+    }
+    *mp = info->next;
+
+    /* Free the page & the info structure if need be */
+    page_dir[ptr2index(info->page)] = MALLOC_FIRST;
+    vp = info->page;		/* Order is important ! */
+    if(vp != (void*)info) 
+	free(info);
+    free(vp);
+}
+
+static __inline void
+ifree(void *ptr)
+{
+    struct pginfo *info;
+    int index;
+
+    /* This is legal */
+    if (!ptr)
+	return;
+
+    if (!initialized) {
+	wrtwarning("free(): malloc() never got called.\n");
+	return;
+    }
+
+    /* If we're already sinking, don't make matters any worse. */
+    if (suicide)
+	return;
+
+    index = ptr2index(ptr);
+
+    if (index < malloc_pageshift) {
+	wrtwarning("free(): junk pointer (too low)\n");
+	return;
+    }
+
+    if (index > last_index) {
+	wrtwarning("free(): junk pointer (too high)\n");
+	return;
+    }
+
+    info = page_dir[index];
+
+    if (info < MALLOC_MAGIC)
+        free_pages(ptr,index,info);
+    else
+	free_bytes(ptr,index,info);
+    return;
+}
+
+void *
+malloc(size_t size)
+{
+#ifdef  _THREAD_SAFE
+    int     status;
+    register void *r;
+    _thread_kern_sig_block(&status);
+    r = imalloc(size);
+    _thread_kern_sig_unblock(status);
+    return r;
+#else 
+    return imalloc(size);
+#endif
+}
+
+void
+free(void *ptr)
+{
+#ifdef  _THREAD_SAFE
+    int     status;
+    _thread_kern_sig_block(&status);
+    ifree(ptr);
+    _thread_kern_sig_unblock(status);
+#else
+    ifree(ptr);
+#endif
+    return;
+}
+
+void *
+realloc(void *ptr, size_t size)
+{
+#ifdef  _THREAD_SAFE
+    int     status;
+    register void *r;
+    _thread_kern_sig_block(&status);
+    r = irealloc(ptr, size);
+    _thread_kern_sig_unblock(status);
+    return r;
+#else
+    return irealloc(ptr, size);
+#endif
+}
@


1.4
log
@#include <sys/types.h> for <dirent.h>.
@
text
@d34 1
a34 1
-#TCLINCDIR = /usr/local/include
d36 2
a37 2
+TCLINCDIR = /usr/local/include
 #TCLINCDIR = /usr/local/include/tcl7.5
d65 1
a65 1
+TKINCDIR = /usr/local/include
d227 1
a227 1
+ * $Id: patch-aa,v 1.3 1996/11/12 04:54:09 max Exp $
@


1.3
log
@Upgrade, 1.0b2 -> 1.0b3.

Submitted by:	Juergen Lock <nox@@jelal.hb.north.de>
(Note that the maintainer has been changed to:
Juergen Lock <nox@@jelal.hb.north.de>)
@
text
@d132 8
d227 1
a227 1
+ * $Id: malloc.c,v 1.12 1996/09/17 19:50:23 phk Exp $
@


1.2
log
@Make this compile with tcl75 in /usr/lib.  Remove the part that
says tcl is in /usr/local.
@
text
@d1 1416
a1416 112
*** Makefile.orig	Tue Jul 30 19:51:32 1996
--- Makefile	Tue Jul 30 20:08:46 1996
***************
*** 5,11 ****
  # ===========================================================================
  
  # Note: This Makefile has been set up to be used "as is" for stock
! # Slackware 3.0 Linux systems, assuming the Slackware Tcl/Tk packages
  # have been installed and are to be used by TkDesk.
  # Else: Just change the options below.
  
--- 5,11 ----
  # ===========================================================================
  
  # Note: This Makefile has been set up to be used "as is" for stock
! # FreeBSD 2.1 and obove systems, assuming the Tcl/Tk 7.5/4.1 ports/packages
  # have been installed and are to be used by TkDesk.
  # Else: Just change the options below.
  
***************
*** 52,71 ****
  #TCLLIB = -ltcl7_4
  
  # Location of the Tk include files:
! TKINCDIR = /usr/include/tcl        # Linux with Slackware 3.0
! #TKINCDIR = /usr/local/include
  #TKINCDIR = /usr/local/include/tcl7.5
  #TKINCDIR = $(HOME)/include
  
  # Location of the Tk library:
! TKLIBDIR = /usr/lib
! #TKLIBDIR = /usr/local/lib
  #TKLIBDIR = $(HOME)/lib
  
  # Flag for linking the Tk library to TkDesk:
! TKLIB = -ltk
  #TKLIB = -ltk4.0
! #TKLIB = -ltk4.1
  #TKLIB = -ltk4_0
  
  # --------------------------------
--- 52,71 ----
  #TCLLIB = -ltcl7_4
  
  # Location of the Tk include files:
! #TKINCDIR = /usr/include/tcl        # Linux with Slackware 3.0
! TKINCDIR = /usr/local/include
  #TKINCDIR = /usr/local/include/tcl7.5
  #TKINCDIR = $(HOME)/include
  
  # Location of the Tk library:
! #TKLIBDIR = /usr/lib
! TKLIBDIR = /usr/local/lib
  #TKLIBDIR = $(HOME)/lib
  
  # Flag for linking the Tk library to TkDesk:
! #TKLIB = -ltk
  #TKLIB = -ltk4.0
! TKLIB = -ltk41
  #TKLIB = -ltk4_0
  
  # --------------------------------
***************
*** 88,99 ****
  # (If you're linking with Tcl 7.5 with dynamic loading enabled you need
  # to add the appropriate library which allows for dynamic loading on
  # your system, such as -ldl for Linux and SGI or -ldld for HP-UX.) 
! OTHERLIBS = -lieee           # e.g. Linux
  #OTHERLIBS = -ldl -lieee      # e.g. Linux with Tcl 7.5 and dynamic loading
  #OTHERLIBS = -lnsl -lsocket   # e.g. for Solaris
  #OTHERLIBS = -ldl -lsocket    # e.g. for SGI with os5.3 and Tcl 7.5
  #OTHERLIBS = -ldld            # e.g. for HP-UX 9.05 and Tcl 7.5 (am I right?)
! #OTHERLIBS =
  
  # --------------------------------
  # Compiler and Linker Settings:
--- 88,99 ----
  # (If you're linking with Tcl 7.5 with dynamic loading enabled you need
  # to add the appropriate library which allows for dynamic loading on
  # your system, such as -ldl for Linux and SGI or -ldld for HP-UX.) 
! #OTHERLIBS = -lieee           # e.g. Linux
  #OTHERLIBS = -ldl -lieee      # e.g. Linux with Tcl 7.5 and dynamic loading
  #OTHERLIBS = -lnsl -lsocket   # e.g. for Solaris
  #OTHERLIBS = -ldl -lsocket    # e.g. for SGI with os5.3 and Tcl 7.5
  #OTHERLIBS = -ldld            # e.g. for HP-UX 9.05 and Tcl 7.5 (am I right?)
! OTHERLIBS =
  
  # --------------------------------
  # Compiler and Linker Settings:
***************
*** 108,117 ****
  #CFLAGS = -Wall -g
  
  # And options for the linker:
! #LDFLAGS = -s
  # Linux Slackware 3.0 users: use the following to prevent static linking
  # if you're using the Slackware Tcl/Tk packages:
! LDFLAGS = -s -L/lib
  
  
  # ---------------------------------------------------------------------------
--- 108,117 ----
  #CFLAGS = -Wall -g
  
  # And options for the linker:
! LDFLAGS = -s
  # Linux Slackware 3.0 users: use the following to prevent static linking
  # if you're using the Slackware Tcl/Tk packages:
! #LDFLAGS = -s -L/lib
  
  
  # ---------------------------------------------------------------------------
@


1.1
log
@Initial revision
@
text
@d21 1
a21 18
*** 35,71 ****
  # --------------------------------
  
  # Location of the Tcl include files:
! TCLINCDIR = /usr/include/tcl       # Linux with Slackware 3.0
! #TCLINCDIR = /usr/local/include
  #TCLINCDIR = /usr/local/include/tcl7.5
  #TCLINCDIR = $(HOME)/include
  
  # Location of the Tcl library:
! TCLLIBDIR = /usr/lib
! #TCLLIBDIR = /usr/local/lib
  #TCLLIBDIR = $(HOME)/lib
  
  # Flag for linking the Tcl library to TkDesk:
! TCLLIB = -ltcl
  #TCLLIB = -ltcl7.4
! #TCLLIB = -ltcl7.5
d42 1
a42 18
--- 35,71 ----
  # --------------------------------
  
  # Location of the Tcl include files:
! #TCLINCDIR = /usr/include/tcl       # Linux with Slackware 3.0
! TCLINCDIR = /usr/local/include
  #TCLINCDIR = /usr/local/include/tcl7.5
  #TCLINCDIR = $(HOME)/include
  
  # Location of the Tcl library:
! #TCLLIBDIR = /usr/lib
! TCLLIBDIR = /usr/local/lib
  #TCLLIBDIR = $(HOME)/lib
  
  # Flag for linking the Tcl library to TkDesk:
! #TCLLIB = -ltcl
  #TCLLIB = -ltcl7.4
! TCLLIB = -ltcl75
@


1.1.1.1
log
@New port, tkdesk.  My only choice for a X11 desk (the only one
I've ever liked even a little bit).  Thanks, Andreas.

Submitted by:	Andreas Kohout
@
text
@@
