Files com075f/28.com and com075g/28.com are identical
Files com075f/alias.c and com075g/alias.c are identical
Files com075f/alias.h and com075g/alias.h are identical
Files com075f/alias.sys and com075g/alias.sys are identical
Files com075f/batch.c and com075g/batch.c are identical
Files com075f/batch.h and com075g/batch.h are identical
Files com075f/beep.c and com075g/beep.c are identical
Files com075f/break.c and com075g/break.c are identical
Files com075f/build.bat and com075g/build.bat are identical
Files com075f/call.c and com075g/call.c are identical
Files com075f/cb_catch.asm and com075g/cb_catch.asm are identical
Files com075f/clean.bat and com075g/clean.bat are identical
Files com075f/cls.c and com075g/cls.c are identical
Files com075f/cmdinput.c and com075g/cmdinput.c are identical
Files com075f/cmdtable.c and com075g/cmdtable.c are identical
Files com075f/command.c and com075g/command.c are identical
Binary files com075f/command.com and com075g/command.com differ
Binary files com075f/command.dsk and com075g/command.dsk differ
Files com075f/command.h and com075g/command.h are identical
Files com075f/command.mak and com075g/command.mak are identical
Binary files com075f/command.prj and com075g/command.prj differ
Files com075f/config.h and com075g/config.h are identical
Files com075f/copy.c and com075g/copy.c are identical
Files com075f/copy.h and com075g/copy.h are identical
Files com075f/ctty.c and com075g/ctty.c are identical
Files com075f/date.c and com075g/date.c are identical
Files com075f/datefunc.c and com075g/datefunc.c are identical
Files com075f/datefunc.h and com075g/datefunc.h are identical
Files com075f/del.c and com075g/del.c are identical
Files com075f/dir.c and com075g/dir.c are identical
Files com075f/dirold.c and com075g/dirold.c are identical
Files com075f/docs/bugs.txt and com075g/docs/bugs.txt are identical
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/docs/compile.txt com075g/docs/compile.txt
--- com075f/docs/compile.txt	Wed Dec 31 18:00:00 1969
+++ com075g/docs/compile.txt	Thu Dec  3 23:56:22 1998
@@ -0,0 +1,9 @@
+Compile notes:
+
+To compile this version of command.com, you have to add the suppl
+directory to your list of include directories so that the compiler
+can find the header files located there.
+
+The library suppl_s.lib was built with the suppl library version 2.6
+which had the dosalloc.c file modified to fix a problem with the
+FreeDOS kernel.
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/docs/copy.txt com075g/docs/copy.txt
--- com075f/docs/copy.txt	Mon Sep 14 00:21:56 1998
+++ com075g/docs/copy.txt	Wed Dec 31 18:00:00 1969
@@ -1,67 +0,0 @@
-COPY.TXT
-Rob Lake
-Aug-19-98
-
-Notes:
-o Crashes when returning from cmd_copy.  Works fine on its own
-(see mod_copy.zip).  I can't figure out why myself.  I think that
-there is a memory allocation problem somewhere.  Hopefully someone
-more experienced can track it down.
-
-o I named the module version of copy `cp' to resolve possible abiguity of
-naming it copy.
-
-o I don't remember exactly what time I started writing, so I figured around
-Aug 1.
-
-o Although the program accepts the /Y or /-Y switches, it does not do
-anything with them, yet.
-
-o The default mode for copying is BINARY
-
-o Specify /a before or after the destination file, if one is given,
-will append the destination with a ^Z character.  Place appropriate
-warning here.  Ex. These commands will add the ^Z character:
-        cp "/a cp.com cp.txt"
-        cp "cp.com + /a cp.obj cp.txt"
-        cp "cp.com /a cp.txt"
-        cp "cp.com cp.txt /a"
-
-o You can define the mode for all files in the command line.  Ex.
-        cp "/b cp.com + /a copy.c + /a copy.obj /b cp.txt"
-works (for whatever reason someone would want to do that:-).
-
-o The following commands where tested with the module copy:
-        cp c:\autoexec.bat
-        cp "c:\autoexec.bat test.bat"
-        cp "..\ temp"
-- Given that ..\ has files.  If temp is a directory, will copy all files
-to it.  If temp is a file or does not exist, all the files with be copied
-to .\temp.  NOTE: Appended to temp, not over written each time.
-        cp "cp.com test.com"
-        cp "/a cp.com cp.txt"
-        cp "file1+file2+file3 file4"
-- Will ask to overwrite file4 after file1 has been copied.  This will be
-fixed later.
-        cp "file5+file1+file2+file3"
-- This appends file1, file2 and file3 to file5.  Will ask to overwrite
-file5 when file2 has been copied, if file5 does not exist.  Will be fixed
-later.
-- MS-DOS copy doesn't create file5 if it does not exist.  It
-concatenates all to file1, it should print an error message.  This copy
-creates a file5 if one does not exist.  This can be changed later.
-
-o This command doesn't work yet:
-        cp "*.c+*.h *.txt"
-- If tried, will print "NOT IMPLEMENTED YET" message.  This command may be
-kind of confusing.  Take for example you have a directory with these files:
-file1.c file1.h
-file2.c file2.h
-The command above will copy file1.c and file1.h to file1.txt and file2.c
-and file2.h to file2.txt.  If, say, file1.h does not exist, copy will
-produce the messages:
-FILE1.C
-FILE1.H
-File not found - FILE1.H
-Invalid handle - FILE1.TXT
-        0 file(s) copied
Files com075f/docs/files.txt and com075g/docs/files.txt are identical
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/docs/history.txt com075g/docs/history.txt
--- com075f/docs/history.txt	Thu Dec  3 15:35:14 1998
+++ com075g/docs/history.txt	Thu Dec  3 23:51:18 1998
@@ -373,7 +373,7 @@ o add: tmpfn(): to create a temporary fi
 o command.c: changed line in is_delim function to include backslash
   and period.
 
-03-Dec-1998 0.75d (John P. Price <linux-guru@gcfl.net>)
+03-Dec-1998 0.75f (John P. Price <linux-guru@gcfl.net>)
 ~~~~~~~~~~~~~~~~~~~~~~
 o alias.c: changed to convert to lower case instead of upper
 o cls.c: cls now sets the text colors to lightgray on black before
@@ -393,3 +393,7 @@ o init.c: finished batch file trace mode
 o messages.c: Reduced the ammount of memory allocated by not reading
   in entire index, but only the index element needed.
 
+04-Dec-1998 0.75g Steffen Kaiser <skaise2a@smail.inf.fh-rhein-sieg.de>
+~~~~~~~~~~~~~~~~~~~~~~
+o changed dosalloc.c in the suppl library to fix the environment
+  problem.
Files com075f/docs/license.txt and com075g/docs/license.txt are identical
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/docs/notes.txt com075g/docs/notes.txt
--- com075f/docs/notes.txt	Mon Sep 14 00:21:58 1998
+++ com075g/docs/notes.txt	Thu Dec  3 23:42:26 1998
@@ -113,4 +113,72 @@ Hans <mailto:hansp@digiweb.com>
   them, however).
 
 -----------------------------------------------------------------------------
+COPY.TXT
+Rob Lake
+Aug-19-98
+
+Notes:
+o Crashes when returning from cmd_copy.  Works fine on its own
+(see mod_copy.zip).  I can't figure out why myself.  I think that
+there is a memory allocation problem somewhere.  Hopefully someone
+more experienced can track it down.
+
+o I named the module version of copy `cp' to resolve possible abiguity of
+naming it copy.
+
+o I don't remember exactly what time I started writing, so I figured around
+Aug 1.
+
+o Although the program accepts the /Y or /-Y switches, it does not do
+anything with them, yet.
+
+o The default mode for copying is BINARY
+
+o Specify /a before or after the destination file, if one is given,
+will append the destination with a ^Z character.  Place appropriate
+warning here.  Ex. These commands will add the ^Z character:
+        cp "/a cp.com cp.txt"
+        cp "cp.com + /a cp.obj cp.txt"
+        cp "cp.com /a cp.txt"
+        cp "cp.com cp.txt /a"
+
+o You can define the mode for all files in the command line.  Ex.
+        cp "/b cp.com + /a copy.c + /a copy.obj /b cp.txt"
+works (for whatever reason someone would want to do that:-).
+
+o The following commands where tested with the module copy:
+        cp c:\autoexec.bat
+        cp "c:\autoexec.bat test.bat"
+        cp "..\ temp"
+- Given that ..\ has files.  If temp is a directory, will copy all files
+to it.  If temp is a file or does not exist, all the files with be copied
+to .\temp.  NOTE: Appended to temp, not over written each time.
+        cp "cp.com test.com"
+        cp "/a cp.com cp.txt"
+        cp "file1+file2+file3 file4"
+- Will ask to overwrite file4 after file1 has been copied.  This will be
+fixed later.
+        cp "file5+file1+file2+file3"
+- This appends file1, file2 and file3 to file5.  Will ask to overwrite
+file5 when file2 has been copied, if file5 does not exist.  Will be fixed
+later.
+- MS-DOS copy doesn't create file5 if it does not exist.  It
+concatenates all to file1, it should print an error message.  This copy
+creates a file5 if one does not exist.  This can be changed later.
+
+o This command doesn't work yet:
+        cp "*.c+*.h *.txt"
+- If tried, will print "NOT IMPLEMENTED YET" message.  This command may be
+kind of confusing.  Take for example you have a directory with these files:
+file1.c file1.h
+file2.c file2.h
+The command above will copy file1.c and file1.h to file1.txt and file2.c
+and file2.h to file2.txt.  If, say, file1.h does not exist, copy will
+produce the messages:
+FILE1.C
+FILE1.H
+File not found - FILE1.H
+Invalid handle - FILE1.TXT
+        0 file(s) copied
+-----------------------------------------------------------------------------
 
Files com075f/docs/readme.txt and com075g/docs/readme.txt are identical
Files com075f/docs/todo.txt and com075g/docs/todo.txt are identical
Files com075f/echo.c and com075g/echo.c are identical
Files com075f/environ.c and com075g/environ.c are identical
Files com075f/err_hand.c and com075g/err_hand.c are identical
Files com075f/err_hand.h and com075g/err_hand.h are identical
Files com075f/errno.h and com075g/errno.h are identical
Files com075f/error.c and com075g/error.c are identical
Files com075f/exe2bin.com and com075g/exe2bin.com are identical
Files com075f/exec.c and com075g/exec.c are identical
Files com075f/fdcom.ico and com075g/fdcom.ico are identical
Files com075f/ffind.c and com075g/ffind.c are identical
Files com075f/file_id.diz and com075g/file_id.diz are identical
Files com075f/filecomp.c and com075g/filecomp.c are identical
Files com075f/fixstrs.bat and com075g/fixstrs.bat are identical
Files com075f/for.c and com075g/for.c are identical
Files com075f/goto.c and com075g/goto.c are identical
Files com075f/history.c and com075g/history.c are identical
Files com075f/if.c and com075g/if.c are identical
Files com075f/indent.pro and com075g/indent.pro are identical
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/init.c com075g/init.c
--- com075f/init.c	Thu Dec  3 15:01:52 1998
+++ com075g/init.c	Fri Dec  4 00:24:28 1998
@@ -306,10 +306,10 @@ int initialize(int argc, char *argv[])
   env_resizeCtrl |= ENV_USEUMB | ENV_ALLOWMOVE;
   if (!env_newsize(0, envSize))
     puts("Could not resize/create environment");
-//  else
-  //  {
-  //    printf("Environment size set to %d bytes.\n", envSize);
-  //  }
+  else
+  {
+    printf("Environment size set to %d bytes.\n", envSize);
+  }
 
   /* Then add the COMSPEC variable */
   if (comPath)
Files com075f/internal.c and com075g/internal.c are identical
Files com075f/lh.asm and com075g/lh.asm are identical
Files com075f/loadhigh.asm and com075g/loadhigh.asm are identical
Files com075f/loadhigh.c and com075g/loadhigh.c are identical
Files com075f/loadhigh.h and com075g/loadhigh.h are identical
Files com075f/lowexec.asm and com075g/lowexec.asm are identical
Files com075f/makecom.bat and com075g/makecom.bat are identical
Files com075f/makedist.bat and com075g/makedist.bat are identical
Files com075f/makefile.bcc and com075g/makefile.bcc are identical
Files com075f/makefile.tcc and com075g/makefile.tcc are identical
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/messages.c com075g/messages.c
--- com075f/messages.c	Thu Dec  3 15:02:30 1998
+++ com075g/messages.c	Fri Dec  4 00:33:08 1998
@@ -106,11 +106,11 @@ void display_string(unsigned id,...)
     segs--;
 
   offset = (long)segs *512 + offs;
-  printf("offset = %lu\n", offset);
+//  printf("offset = %lu\n", offset);
 
   fseek(f, offset, SEEK_SET);
 
-  printf("memory = %u\n", coreleft());
+//  printf("memory = %u\n", coreleft());
 
 #endif
 
Files com075f/misc.c and com075g/misc.c are identical
Files com075f/model.def and com075g/model.def are identical
Files com075f/path.c and com075g/path.c are identical
Files com075f/pause.c and com075g/pause.c are identical
Files com075f/prompt.c and com075g/prompt.c are identical
Files com075f/redir.c and com075g/redir.c are identical
Files com075f/ren.c and com075g/ren.c are identical
Files com075f/set.c and com075g/set.c are identical
Files com075f/shift.c and com075g/shift.c are identical
Files com075f/strings/fixstrs.c and com075g/strings/fixstrs.c are identical
Files com075f/strings/fixstrs.exe and com075g/strings/fixstrs.exe are identical
Files com075f/strings/indent.pro and com075g/strings/indent.pro are identical
Files com075f/strings/strings.txt and com075g/strings/strings.txt are identical
Files com075f/strings.dat and com075g/strings.dat are identical
Files com075f/strings.h and com075g/strings.h are identical
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/suppl/dfn.h com075g/suppl/dfn.h
--- com075f/suppl/dfn.h	Wed Dec 31 18:00:00 1969
+++ com075g/suppl/dfn.h	Tue Aug 18 23:14:54 1998
@@ -0,0 +1,259 @@
+/*
+    SUPPL - a supplemental library for common useage
+    Copyright (C) 1995,1996  Steffen Kaiser
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    See: COPYING.LB
+*/
+/* $Id: DFN.H 1.4 1998/07/20 08:42:46 ska Exp $
+   $Locker:  $	$Name:  $	$State: Exp $
+
+	Declarations for the DOS filename functions.
+
+*/
+
+#ifndef __DFN_H
+#define __DFN_H
+
+#include <portable.h>
+
+#define DFN_FILENAME_BUFFER_LENGTH 512
+	/*!ska Yes, I know that DOS has a more limited length but remember
+		this is only twice as much as a Win95 filename can have. */
+
+
+/* To support UNC paths, all functions are macro'ed from
+	dfn*()   --->     dfnu*()
+*/
+#ifdef SUPPORT_UNC_PATH
+#define dfnmerge dfnumerge
+#define dfnsplit dfnusplit
+#define dfnexpand dfnuexpand
+#define dfnsqueeze dfnusqueeze
+#define dfnmatch udfnmatch
+#endif
+
+
+int toFUpper(int ch);
+/* Upcase character according the filename upcase table of the DOS NLS API.
+	The upcase table is retreive only once during the program's run!
+*/
+
+void rereadUpcaseTable(void);
+/* Mark the previously retreived upcase table as invalid, in order to cause
+	that the toUpper() and toFUpper() functions re-retreive the table's
+	addresses.
+*/
+
+int memcmpFI(const byte *buf1, const byte *buf2, unsigned len);
+/* Compare both memory area case-insensitvely.
+
+	To make the compare case-insensitve the toFUpper() function is used.
+
+	If (buf1==NULL) || (buf2==NULL), the behaviour is undefined.
+	If len == 0, memcmpFI() returns 0.
+
+	Return:	
+		 <0: buf1 is less then buf2
+		==0: buf1 is equal to buf2
+		 >0: buf1 is greater than buf2
+*/
+
+#ifdef _MICROC_
+int _fmemcmpFI(unsigned const dseg, unsigned dofs
+ , unsigned const sseg, unsigned sofs, unsigned length);
+#else
+int _fmemcmpFI(const byte far * dest, const byte * src, unsigned length);
+#endif
+/* Compare both far memory area case-insensitvely.
+
+	To make the compare case-insensitve the toFUpper() function is used.
+
+	If (buf1==NULL) || (buf2==NULL), the behaviour is undefined.
+	If len == 0, _fmemcmpFI() returns 0.
+
+	Return:	
+		 <0: buf1 is less then buf2
+		==0: buf1 is equal to buf2
+		 >0: buf1 is greater than buf2
+*/
+
+
+char *dfnexpand(const char fname[], char path[]);
+/* Expands a filename to it a fully-qualified DOS-style path relative to path.
+	The expanded filename is stored into a malloc'ed buffer.
+	fname[] is preprocessed by dfnsqueeze().
+
+	If path == NULL, the current working directory is used.
+
+   Return:
+   	NULL: malloc failed or fname == NULL
+	else: pointer to the malloc'ed buffer
+*/
+
+char *dfnmerge(char fname[], const char dr[], const char path[]
+ , const char name[], const char ext[]);
+/* Merge a file name.
+
+	dr, path, name, ext:
+		Pointers of the path components.
+		If one of these is NULL (thus, it is not present), it is not merged.
+		If (*path=='\0'), this means the root path!
+
+	fname := <dr>:<path>\<name>.<ext>
+		':' is added, if <dr> is present;
+		'\' is added, if <path>,& <name> or <ext> are present;
+		'.' is added, if <ext> is present.
+
+	fname:	Pointer to the memory to receive the result.
+			If NULL: the necessary memory is malloc'ed.
+
+   Return:
+   	NULL if malloc failed.
+   	otherwise: pointer to the beginning of the malloc()'ed result.
+*/
+
+int dfnsplit(char fname[], char **dr, char **path, char **name, char **ext);
+/* Split a file name.
+
+	fname is the file name to split.
+
+	dr, path, name, ext:	Pointers, which will receive the results.
+							If one pointer is NULL, the particular filename
+								portion is not saved.
+							If one pointer receives NULL, the particular
+								portion was not found in fname.
+							dr does not has the ':'.
+							The trailing '\\' is stripped from path.
+								==>  (**path=='\0') -> Root path!!
+									(This is not a bug but a feature ;-)
+							ext does not contain the leading '.'; ext itself
+								contains no dot at all.
+							Multiple backslashes are reduced to a single one.
+							name may start with any number of dots.
+
+	The returned pointers in dr, path, name,& ext are malloc()'ed;
+	thus, they must be free()'ed by the programmer!
+
+   Return:
+   	0: Transformation failed, e.g. malloc() returned NULL
+	1: dfnsplit() OK
+*/
+
+char *dfnsqueeze(const char fname[]);
+/* Preprocess a filename:
+		- Flip '/' -> '\\'
+		- Squeeze '\\\\' -> '\\'
+		- Squeeze '\\.\0' -> '\\'
+		- Squeeze '\\.\\' -> '\\'
+		- Upcase all characters (using DOS NLS API)
+
+	The preprocessed filename is copied into a malloc'ed buffer.
+
+   Return:
+   	NULL: malloc failed or fname == NULL
+	else: pointer to the malloc'ed buffer
+*/
+
+char *dfnpath(int drive);
+/* Retreive the fully-qualified path of: "<drive>:."
+	The path is malloc()'ed and has _no_ trailing backslash, except the
+	path is the root directory.
+
+	drive may be:
+		'A'-'Z', 'a'-'z', or 1..32 (note: 1 == 'A'; supports up to 32 drives)
+		0 == current drive
+
+	Return:
+		NULL: malloc() failed, non-existing drive, or drive invalid
+		else: pointer to the path
+*/
+
+char *dfntruename(const char fn[]);
+/* Return the truename of the file named fn.
+
+	The truename of a file is a fully-qualified filename according
+	the _physical_ access path. That means that the truename can be
+	used to exactly determine, if two file specifications match the
+	same physical file, e.g.:
+			SUBST Z: C:\FREEDOS
+		&& C:\FREEDOS\SUBST.EXE exists
+		&& the current working directory is C:\FREEDOS ==>
+			dfntruename("a:/subst.exe") --> "C:\\FREDOS\\SUBST.EXE"
+			dfntruename("subst.exe") --> "C:\\FREEDOS\\SUBST.EXE"
+	The filename fn[] need not exist.
+
+	Return:
+		NULL: malloc() failed, or DOS API call failed
+		else: pointer to the malloc()'ed string
+
+	But beware! The truename must not be used as a function to fully-qualify
+	a filename. There are at least two cases when that fails:
+		<<see source code "DFNTRUEN.C" for more details>>
+*/
+
+char *dfnsearch(char fname[], char *path, char *ext);
+/* Search for the file fname[] within the search path *path. If no extension
+	is supplied, all extensions in *ext are tried. *ext may contain wildcards.
+
+	If path==NULL, the environment variable "PATH" is retreived.
+	If *path==0, no search path is available (thus, scanning in current
+	working directory only).
+	If ext==NULL, the extensions ".COM.EXE.BAT" are used.
+	If *ext==0, the extension is not altered.
+	if *ext=='.', this dot is ignored at all.
+
+	If path contains an entry ".", the current working directory is not
+	tried first.
+	If the program is running in an Windows environment, the default Windows
+	pathes are not prepended automatically.
+
+	If fname[] already contains a drive or path specification, path is ignored.
+	If fname[] already contains an extension, ext is ignored.
+
+	The returned filename is not necessarily fully-qualified, nor it is
+	pre-processed by dfnsqueeze(). All what is asured is that the returned
+	filename can be found relative to the current working directory. The
+	function does neither try to open the file nor to asure that this file
+	is executable in any way. But Hidden or System files are not included
+	into the search.
+
+	Return:
+		NULL: fname[] == NULL, *fname == 0, no file found, malloc() failed
+		else: pointer to fully-qualified filename, it's malloc()'ed
+*/
+
+int dfnmatch(char *fnam, char *pattern);
+/*	Check if the filename matches the DOS-style pattern.
+
+	Components, like '.' and '..', and the drive are matched literally.
+	Further details see dfnmatch.c.
+*/
+
+int isUNCpath(const char fname[]);
+/* Return, if fname[] is an UNC path. It is preceeded by two backslashes.
+*/
+
+char *UNCpath(const char fname[]);
+/* Return a pointer to the first character of fname[], that is not a part
+	of the UNC drive specification. That is either '\\', the root direc
+	specificator, or '\0', if no path is following the UNC drive at all.
+
+	Return:
+		NULL: fname[] has no UNC drive spec
+		else: pointer to a) '\\' the root direc mark; or b) '\0' if no path
+*/
+
+#endif
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/suppl/dynstr.h com075g/suppl/dynstr.h
--- com075f/suppl/dynstr.h	Wed Dec 31 18:00:00 1969
+++ com075g/suppl/dynstr.h	Tue Aug 18 23:14:54 1998
@@ -0,0 +1,390 @@
+/*
+    SUPPL - a supplemental library for common useage
+    Copyright (C) 1995,1996  Steffen Kaiser
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    See: COPYING.LB
+*/
+/* $Id: DYNSTR.H 1.6 1998/08/17 07:19:21 ska Exp $
+   $Locker:  $	$Name:  $	$State: Exp $
+
+	Dynamic string functions.
+	Most of the functions take the first argument as the destination string
+	and will be transformed into pointer by a macro.
+	In this case, the pointer must be pre-initialized.
+
+*/
+
+#ifndef __DYNSTR_H
+#define __DYNSTR_H
+
+#include <portable.h>
+
+/* Defines for StrSaveTokens() */
+#define STR_RESTORE_TOKENS 1
+#define STR_SAVE_TOKENS 0
+
+struct STR_SAVED_TOKENS {
+	char *str_next_saved_tokens;
+	char str_ch_saved_tokens;
+};
+
+
+int toUpper(int ch);
+/* Upcase character using the DOS NLS API.
+	The upcase table is retreive only once during the program's run!
+*/
+
+int toFUpper(int ch);
+/* Upcase character using the DOS NLS API according the table for
+	filenames.
+	The upcase table is retreive only once during the program's run!
+*/
+
+void rereadUpcaseTable(void);
+/* Mark the previously retreived upcase table as invalid, in order to cause
+	that the toUpper() and toFUpper() functions re-retreive the table's
+	addresses.
+*/
+
+int MemiCmp(const byte *buf1, const byte *buf2, unsigned len);
+/* Compare both memory area case-insensitvely.
+
+	To make the compare case-insensitve the toUpper() function is used.
+
+	If (buf1==NULL) || (buf2==NULL), the behaviour is undefined.
+	If len == 0, MemiCmp() returns 0.
+
+	Return:	
+		 <0: buf1 is less then buf2
+		==0: buf1 is equal to buf2
+		 >0: buf1 is greater than buf2
+*/
+
+#ifdef _MICROC_
+int _fMemiCmp(unsigned const dseg, unsigned dofs
+ , unsigned const sseg, unsigned sofs, unsigned length);
+#else
+int _fMemiCmp(const byte far * dest, const byte far * src, unsigned length);
+#endif
+/* Compare both far memory area case-insensitvely.
+
+	To make the compare case-insensitve the toUpper() function is used.
+
+	If (buf1==NULL) || (buf2==NULL), the behaviour is undefined.
+	If len == 0, _fMemiCmp() returns 0.
+
+	Return:	
+		 <0: buf1 is less then buf2
+		==0: buf1 is equal to buf2
+		 >0: buf1 is greater than buf2
+*/
+
+int StriCmp(const char *s1, const char *s2);
+/* Compare two strings case-insensitively.
+
+	To make the compare case-insensitve the toUpper() function is used.
+
+	If (s1==NULL) || (s2==NULL), the behaviour is undefined.
+
+	Return:	
+		 <0: s1 is less then s2
+		==0: s1 is equal to s2
+		 >0: s1 is greater than s2
+*/
+
+
+char *StrDup(const char s[]);
+/* Duplicate a string into the local heap.
+
+	Return:
+		NULL: s == NULL || malloc() failed
+		else: pointer to the malloc'ed buffer
+*/
+
+#define StrFree(str) StrRepl_(&(str), NULL)
+/* Free the string s[0] and place a NULL there
+
+	Return: NULL
+*/
+
+#define StrRepl(dest,src) StrRepl_(&(dest), (src))
+char *StrRepl_(char *dest[], char src[]);
+/* Free dest[0] and place src there
+
+	Return: src
+*/
+
+#ifdef _MICROC_
+register char *StrConcat(int argcnt);
+#else
+char *StrConcat(int argcnt, ...);
+#endif
+/* Concat argcnt strings together and malloc() a buffer for the result.
+	With Micro-C, argcnt is limited to the number of arguments that
+	has been given in reality.
+
+	Return:
+		NULL: on failure (malloc() returned NULL)
+		else: the malloc'ed buffer
+*/
+
+char *StrTrim(char s[]);
+/* Reduces the malloc()'ed area of string s to the length (strlen(s) + 1).
+
+	Return:
+		NULL: if s == NULL || s cannot be shrinked (s is free()'ed!)
+		else: a pointer to the new location (don't rely on this is s!)
+*/
+
+char *StrChar(int ch);
+/* Create a new dynamic string containing the single character ch
+
+	Return:
+		NULL: malloc() returned NULL
+		else: pointer to the malloc()'ed string
+*/
+
+char *StrStrip(char s[], int ch);
+/* Remove any number of the character ch from the end of the string s.
+
+	s[] may be NULL.
+	ch may be 0.
+
+	Return:	always s[].
+*/
+
+char *StrUpr(char s[]);
+/* Upcase the string s[] using the toUpper() function.
+
+	s may be NULL.
+
+	Return:	always s
+*/
+
+char *MemUpr(char buf[], unsigned length);
+/* Upcase the memory area buf[] using the toUpper() function.
+
+	buf may be NULL.
+
+	Return:	always buf
+*/
+
+void _fStrUpr(const word dseg, word dofs);
+/* Upcases the string at dseg:dofs using toUpper().
+*/
+
+void _fMemUpr(const word dseg, word dofs, unsigned length);
+/* Upcases the memory area at dseg:dofs using toUpper().
+*/
+
+
+#define StrCpy(dest,src) StrCpy_(&(dest), (src))
+char *StrCpy_(char *dest[], const char src[]);
+/* Copy (duplicate) the string src[] into dest.
+	If src == NULL, this function is equal to StrFree(dest).
+
+	Return:
+		NULL: malloc() failed || src == NULL
+		else: *dest
+*/
+
+#define StrCat(dest,src) StrCat_(&(dest), (src))
+char *StrCat_(char *dest[], const char src[]);
+/* Append the string src[] at dest.
+	If src == NULL, this function performs no action.
+	If *dest == NULL, this functions performs StrCpy_(dest, src)
+
+	Return:
+		NULL: malloc() failed; *dest is unchanged
+		else: *dest
+*/
+
+#define StrAppend(dest,src,delim,quotes) \
+	StrAppend_(&(dest), (src), (delim), (quotes))
+char *StrAppend_(char *dest[], const char src[]
+ , const char delim[], const char quotes[]);
+/* Append the string src[] at dest delimited by *delim and quoted by a quote.
+
+	If src == NULL, this function performs no action.
+
+	If *dest == NULL, src[] is quoted if necessary.
+
+	If *dest does not end with one character out of delim[] and src[] does not
+	start with one character out of delim and **dest != '\0', *delim is
+	placed between *dest and src[].
+
+	delim[] consists of two fields:
+		"*\0#"
+	- All characters out of "*" are valid delimiting characters.
+		Its first character is used as the delimiter.
+	- All characters out of "#" are characters that are no delimiters, but
+		must be quoted.
+
+	quotes[] consists of three fields delimited by '\0':
+		"*\0#\0[]"
+	- All characters out of "*" delimit a string like '"' in C.
+	- All characters out of "#" delimit a character like '\\' in C.
+		These characters also quote every other quotation character.
+	- All character pairs out of "[]" delimit a string like this:
+		'[' mark the start of a quoted string;
+		']' mark its end.
+	If src[] need to be quoted, this is done in this order:
+		1) If there is a quote out of "*" is not used within *dest,
+			the whole src[] is quoted.
+		2) If there is a quote pair out of "[]" is not used within *dest,
+			the whole src[] is quoted with this pair.
+		3) If there is a quote in "#", each character to be quoted is quoted
+			with this quotation character
+		4) src[] is not quoted.
+
+	Return:
+		NULL: malloc() failed; *dest is unchanged
+		else: *dest
+*/
+
+#define StrAppChr(dest,chr) StrAppChr_(&(dest), (chr))
+char *StrAppChr_(char *dest[], char chr);
+/* Append a single character to the string *dest.
+
+	chr may be NUL.
+	*dest may be NULL.
+
+	Return:
+		NULL: malloc() failed
+		else: pointer to the malloc()'ed buffer; original *dest free()'ed
+*/
+
+char *StrTokenize(char *str, const char token[]);
+/* Tokenize str. str is unchanged, after StrTokenize() returned NULL.
+	If str==NULL, the previous string is searched for the next token.
+	If two tokens follow each other immediately, an empty string is returned.
+
+	Return:
+		NULL: no further token; the whole str is unchanged now
+		else: pointer to token; this string's '\0' is the only modified part
+				of the string.
+*/
+
+#define StrTokStop() (void)StrTokenize(NULL, NULL)
+/* Make sure StrTokenize() will return NULL in the next call. The
+	side effect is that the string is restored to its original
+	value.
+*/
+
+void StrTokSave(struct STR_SAVED_TOKENS *st);
+/* Save the current context of the StrTokenize() function into *st.
+
+	If st==NULL, no action is performed.
+*/
+
+void StrTokRestore(struct STR_SAVED_TOKENS *st);
+/* Restore the current context of the StrTokenize() function from *st.
+
+	If st==NULL, no action is performed.
+*/
+
+char *StrLeft(const char s[], unsigned length);
+/* Return the left length characters of s.
+
+	If strlen(s) < length, the string is duplicated.
+
+	s may be NULL.
+
+	Return:
+		NULL: s==NULL, malloc() failed
+		else: pointer to the malloc()'ed buffer
+*/
+
+char *StrRight(const char s[], unsigned length);
+/* Return the right length characters of s.
+
+	If strlen(s) < length, the string is duplicated.
+
+	s may be NULL.
+
+	Return:
+		NULL: s==NULL, malloc() failed
+		else: pointer to the malloc()'ed buffer
+*/
+
+char *StrMiddle(const char s[], unsigned pos, unsigned length);
+/* Return the length characters of a string beginning with the pos'th
+	character. The first character has the position 0 (zero).
+
+	If strlen(s) < pos, "" is returned.
+	If strlen(s) < pos + length, StrTail(pos) is returned.
+
+	s may be NULL.
+
+	Return:
+		NULL: s==NULL, malloc() failed
+		else: pointer to the malloc()'ed string
+*/
+
+char *StrTail(const char s[], unsigned pos);
+/* Return the substring beginning at position pos.
+
+	If strlen(s) < pos, "" is returned.
+
+	s may be NULL.
+
+	Return:
+		NULL: s==NULL, malloc() failed
+		else: pointer to the malloc()'ed string
+*/
+
+#ifdef _MICROC_
+#define StrBeg strbeg
+#else
+int StrBeg(const char s1[], const char s2[]);
+/* Return if s1[] begins with s2[].
+
+	Neither s1[] nor s2[] may be NULL.
+
+	Returns:  >0 second block is greater
+			 ==0 both are equal
+			  <0 first block is greater
+*/
+#endif		/* !defined(_MICROC_) */
+
+int StrCString(char *str);
+/* Interprete C-style character strings. Control characters are left
+	in the file except the string "\\\n" and a backslash at the end of
+	the string, which are cut out of the string.
+
+	Return:
+		0: str == NULL
+		else: number of bytes str[] now contains; the terminating NUL
+			character is counted; str[] is modified
+*/
+
+int isodigit(int ch);
+/* Test if ch is an octal digit.
+
+	Return:
+		0: ch is not '0'..'7'
+		else: ch is no octal digit
+*/
+
+int toxdigit(int ch);
+/* Transform a hexa-decimal digit into integer number.
+
+	Return:
+		0..15: hex-digit
+		undefined: if ch is no hex-digit
+*/
+
+#endif
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/suppl/environ.h com075g/suppl/environ.h
--- com075f/suppl/environ.h	Wed Dec 31 18:00:00 1969
+++ com075g/suppl/environ.h	Wed Aug 19 00:14:54 1998
@@ -0,0 +1,503 @@
+/*
+    SUPPL - a supplemental library for common useage
+    Copyright (C) 1995,1996  Steffen Kaiser
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    See: COPYING.LB
+*/
+/* $Id: ENVIRON.H 2.6 1998/07/20 08:42:46 ska Exp $
+ * $Locker:  $	$Name:  $	$State: Exp $
+ *
+ * header file for the environment handling functions
+ *
+ * All functions work over the process-local environment segment, thus,
+ * allowing external (spawned) processes to alter the environment and to
+ * use this environment as a template for the exec() system call.
+ * The functions leave the additional strings at the end of the environment
+ * segment intact.
+ * The functions detect a moved or deleted environment segment, if this
+ * acting is reflected by the PSP fields.
+ * NO function upper-case the variable name. That's different to
+ * common DOS implementations.
+ * 
+ * The environment segment must be a stand-alone segment allocated with
+ * the DOS API function "Allocate Memory", DOS-48. The standard environment
+ * is of that type.
+ *
+ * The low-level functions suppose, that no process accesses the
+ * environment segment asynchronously (TSR, or device driver).
+ *
+ *	Implemented functions:
+ 	file		name		short description
+
+ 	environ.h	chgenv		change current working environment
+ 	environ.h	env_setGlbSeg	set current environment segment
+ 	environ.h	env_glbSeg	return current environment segment
+ 	env_chg.c	env_change	change variables of an environment
+ 	env_chk.c	env_check	check an environment for syntax errors
+ 	env_cpy.c	cpyenv		retrieve the contents of a variable of current env
+ 	env_cpy.c	env_get		copy the contents of a variable into a buffer
+ 	env_del.c	env_delete	delete (free) an environment
+ 	env_dvar.c	dupvar		duplicate the value of an env var into the heap
+ 	env_dvar.c	env_dupvar	duplicate the value of an env var into the heap
+ 	env_fora.c	env_forAll	spawn a function for all variables
+ 	env_fany.c	env_findAnyVar	find the first case-(in)sensitive variable
+ 	env_mstr.c	env_master	return the environment segment of the master shell
+ 	env_mtch.c	env_matchVar	match a variable with an case-insensitive name
+ 	env_new.c	env_create	create & initialize a new & empty environment
+ 	env_nosp.c	env_noSpace	check if the segment can hold another variable
+ 	env_nust.c	env_nullStrings	set the string counter to zero
+ 	env_put.c	putenv		insert a environment string, calls chgenv()
+ 	env_repl.c	env_replace	replace/duplicate an environment
+ 	env_scnt.c	env_strcounter	modifies the counter how many strings are in env
+ 	env_scpy.c	env_strcpy	retreive a string from the environment
+ 	env_sdup.c	env_strdup	duplicate a string from the environment into heap
+ 	env_sget.c	env_glbSeg_	return current environment segment (Micro-C only)
+ 	env_shel.c	env_shell	return env seg of the most current launched shell
+ 	env_sins.c	env_strinsert	insert a new string
+ 	env_size.c	env_resize	Shrink/Grow an environment by a delta value
+ 	env_size.c	env_newsize	set the size of an environment to a value
+ 	env_sput.c	env_strput	replace/delete/append a string
+ 	env_sset.c	env_setGlbSeg_	set current environment segment (Micro-C only)
+ 	env_strg.c	env_string	return the offset of a string of an environment
+ 	env_strs.c	env_strings	return the number of strings of an environment
+
+	functions of mostly internal nature:
+
+ 	env_add.c	env_addVar	append a variable to an environment segment
+ 	env_find.c	env_findVar	locate a variable in an environment segment
+ 	env_free.c	env_endOfVars	return offset of terminator of var portion
+ 	env_free.c	env_firstFree	return offset 1st unused byte of env seg
+ 	env_free.c	env_freeCount	return the number of unused bytes of env seg
+ 	env_len.c	env_varlen	return the number of bytes used by the variable
+ 	env_sub.c	env_subVarOffset	remove the variable starting at the offset
+
+ * Steffen Kaiser
+ * 01/29/96
+ *
+*/
+
+#ifndef __ENVIRON_H
+#define __ENVIRON_H
+
+#include <portable.h>
+
+#ifdef _MICROC_
+#define ENV_WALKFUNC int *
+#else
+typedef int (*ENV_WALKFUNC)(void *, unsigned, unsigned);
+#endif
+
+#ifndef _MICROC_
+/* In order to use these macros, <dos.h> must be #include'd */
+#define env_glbSeg peekw(_psp, 0x2c)	/* return the current env seg addr */
+#define env_setGlbSeg(a) pokew(_psp, 0x2c, (a))	/* set the current env seg addr */
+#else
+#define env_glbSeg env_glbSeg_()
+#define env_setGlbSeg env_setGlbSeg_
+#endif
+
+extern unsigned env_resizeCtrl;
+/* Standard settings:
+	deny shrinking & moving, use UMBs, best fit */
+#define ENV_SHRINKBELOW 1		/* resize below last used byte (will destroy
+									environment, is necessary to delete env) */
+#define ENV_ALLOWMOVE	2		/* re-allocate environment segment if grow
+									fails */
+#define ENV_USEUMB		4		/* when env moves, search in UMBs first */
+#define ENV_FIRSTFIT	8		/* when env moves, use allocation stragegy First Fit */
+#define ENV_LASTFIT		16		/* when env moves, use allocation stragegy Last Fit */
+			/* If both ENV_FIRSTFIT & ENV_LASTFIT are set, behaviour is undefined */
+			/* If none of the above are set, Best Fit is used */
+
+/* Defines for the env_replace() function: */
+#define ENV_DELETE		1		/* free old environment segment */
+#define ENV_COPY		2		/* copy old environment into new
+									segment, may destroy the environment, if
+									new seg is smaller than old one. */
+#define ENV_CLEAR		4		/* initialize new environment, so it does not
+									contain neither variables nor strings */
+#define ENV_CREATE		8		/* create a new environment */
+#define ENV_FREECOUNT	16		/* minimum amount of unused bytes specified */
+#define ENV_LIMITED		32		/* create smallest possible enviroment */
+
+
+/*!!!!!!!!!
+	All these functions replace segm by the current used environment if
+	it is zero. The environment must be initialized with the environement
+	variable area and the string area (in the simpliest case, three byes 0).
+	!!!!!!!!!*/
+
+#ifdef _MICROC_
+unsigned env_glbSeg_(void);
+/* Return the segment of the global environment segment */
+
+void env_setGlbSeg_(const unsigned segm);
+/* Set segm to be the global environment segment now. */
+#endif
+
+word env_create(const unsigned length);
+/* Create a new environment of length bytes and initialize it as empty.
+
+	How to allocate the block is controlled by the env_resizeCtrl
+	variable (ENV_USEUMB, ENV_LASTFIT, ENV_FIRSTFIT).
+
+	Return:
+		0: allocation failed
+		!0: segment address
+*/
+
+void env_delete(const word segm);
+/*	Delete (free) environment. If it is the current used environment,
+	it is set to 0.
+
+*/
+
+int cpyenv(const char var[], char dst[], const unsigned length);
+int env_get(word segm, const char var[], char dst[], const unsigned length);
+/* Copy length bytes from the beginning of variable var into dst.
+
+	Return value:
+		0: found & copied.
+		1: found, but too long to copy completely. (length-1) bytes copied.
+		2: not found
+		-1: var == NULL || dst == NULL || length == 0
+*/
+
+char *dupvar(const char var[]);
+char *env_dupvar(word segm, const char var[]);
+/* Duplicate the contents of the environment variable var into the
+	local heap. The memory is allocated via the malloc() function.
+	dupvar() processes the environment segment 0 (zero).
+	The caller must free() the string himself.
+
+	If segm == 0, the current used environment is used.
+
+	Return:
+		NULL: var == NULL, variable not found, no memory
+		else: pointer to the malloc'ed string
+*/
+
+
+int putenv(const char *var);
+/* Insert/Replace/Delete a variable in the environment.
+
+	var must contain an '=' sign. The left portion becomes the name
+	of the variable, the right its value. This function calls chgenv()
+	to achieve its goal.
+
+	If the value is an empty string, the variable will be deleted,
+	otherwise the variable will be inserted or, if it is already
+	inserted, replaced.
+
+	Return value:
+		0: Cannot insert variable.
+		1: variable replaced or deleted.
+		2: variable not found.
+		3: variable newly inserted.
+		-1: No '=' sign in var or var == NULL.
+*/
+
+#define chgenv(name,value) env_change(0,name,value)
+int env_change(unsigned segm, const char var[], const char value[]);
+/* Insert/Replace/Delete the variable name with the value.
+
+	if value == NULL => delete variable
+	if value == ""   => create a variable with no value
+	if name  == NULL => Return -1 (error)
+	if name  == ""   => create a variable without name
+
+	Return value:
+		0: Cannot insert variable.
+		1: variable replaced or deleted.
+		2: variable not found.
+		3: variable newly inserted.
+		4: no environment at all
+		-1: var == NULL.
+*/
+
+#ifndef NO_ENV_REPLACE_PROTOTYPE
+#ifdef _MICROC_
+register word env_replace(word env /*, int mode, word segm/length*/);
+#else
+word env_replace(word env, int mode, ... /*word segm/length*/);
+#endif
+/* Replace/duplicate the environment env.
+ *	Replace the (old) environment env. How is controlled by mode:
+ *		ENV_DELETE: Delete segment env
+ *		ENV_COPY: Copy the contents of the old env into the new env
+ *			If the new env is smaller than the old one, the contents
+ *			could be destroyed.
+ *		ENV_CLEAR: Initialize the new env (no vars, no strings)
+ *			ENV_COPY superceeds this flag.
+ *		ENV_CREATE: Create a new environment, in this case, length is
+ *			provided as argument #3.
+ *		ENV_FREECOUNT: Only applicable with ENV_CREATE set, this means that
+ *			the length specifies the amount of unused bytes in the new env.
+ *			ENV_LIMITED superceeds this flag.
+ *		ENV_LIMITED: Only applicable with ENV_CREATE set, limit the length
+ *			of the created environment to the lowest possible one. This value
+ *			is 4, if ENV_COPY is not set; env_firstFree(env), otherwise.
+ *			The third argument need not to be specified.
+ 	Both env and segm must point to different,& existing environments.
+ 	A segment number of 0 (zero) is replaced by the current used environment.
+ 	If env is 0, the current used environment is updated with segm.
+
+ 	Return:	0 on failure
+ 			segm or the newly create environment, otherwise
+ */
+#endif
+
+int env_matchVar(word segm, char var[]);
+/* Try to match the variable var in the environment segm.
+
+	Normally all environment functions within this package are case-sensitive.
+	This is uncommon to DOS and may lead to improper functionality, but this
+	allows to process uncommon variables, such as "windir" and "winbootdir".
+
+	First, this function tries to locate var as it is given; second, this
+	function performs a case-insensitve match. The constents of the var[]
+	array is modified to the string of the first found match that it can
+	be used as the input to all the other functions.
+
+	If segm == NULL, the current used environment is processed.
+
+	Return:
+		1: var == NULL
+		2: no match found, var[] unaltered
+		3: no environment at all, var[] unaltered
+		Bit mask:
+		4: more than one case-sensitive match found, var[] unaltered
+		8: more than one case-insensitive match found, var[] updated
+		16: case-sensitve match found, var[] unaltered
+		32: case-insensitve match found, var[] updated
+
+	Note: If at least one of the bits 4 or 16 is set, the var[] is not
+		modified.
+*/
+
+int env_findAnyVar(word segm, char var[], word *ecase, word *icase);
+/* Try to match the variable var in the environment segm.
+
+	Normally all environment functions within this package are case-sensitive.
+	This is uncommon to DOS and may lead to improper functionality, but this
+	allows to process uncommon variables, such as "windir" and "winbootdir".
+
+	*ecase receives the first case-sensitive (exact-case) match.
+	*icase receive the first case-insentive match.
+
+	Neither ecase nor icase may be NULL.
+
+	If segm == NULL, the current used environment is processed.
+
+	Return:
+		0: sucess, *icase and *ecase altered
+		1: var == NULL || icase == NULL || ecase == NULL
+		2: no match found, var[] unaltered
+		3: no environment at all, var[] unaltered
+*/
+
+int env_noSpace(word segm, const char name[], const char value[], const word ign);
+/* Checks if the segment segm has enough free space to hold the
+	variable "name=value". The amount of ign bytes are assumed to
+	be additionally free.
+
+	If segm == 0, the current used environment is used.
+	name and value may be == NULL.
+
+	Return:
+		0: Enough space
+		1: No space
+		4: No environment at all
+*/
+
+word env_resize(word segm, int delta);
+/* Resize the environment memory block by delta bytes (grow/shrink).
+	Special features are controlled by the global variable
+	env_resizeCtrl. See env_size.c for more information.
+
+ 	Return value:
+ 		0: no environment at all or resize failed
+ 		else:	if delta == 0: size of the environment block
+ 				if delta != 0: the (possibly new) segment address
+ 
+*/
+
+word env_newsize(word segm, unsigned length);
+/* Resize the environment memory block to length bytes.
+	This functions behaves like the env_resize() function.
+*/
+
+int env_forAll(unsigned env, ENV_WALKFUNC fct, void *arg);
+/*
+	fct is a pointer to a function of the type:
+		int (*fct)(void *arg, unsigned env, unsigned ofs)
+	where arg is arg of env_forAll() and env:ofs is the address of the
+	current variable (start of its name).
+
+	fct() is called once for each variable. This loops terminates, if
+	there is no next variable or if fct() returns != 0.
+
+	Return:	 0: all variables done (function never hit).
+			-1: environment corrupted or no environment at all
+		  else: function cancelled walk process.
+
+*/
+
+unsigned env_master(void);
+/* Return the environment segment of the master shell (1st launched shell).
+*/
+
+unsigned env_shell(void);
+/* Return the environment segment of the most current launched shell.
+	This is the shell, which invoked the current application or the
+	shell, which invoked the application that invoked the current one.
+*/
+
+/*********
+	Environment String handling functions
+	*********/
+
+int env_nullStrings(word segm);
+/* Set the counter how many strings are in the string table to zero.
+
+	Return:
+		0: OK
+		1: no room to place the counter
+		4: no environment at all
+*/
+
+int env_strings(const word segm);
+/* Return the number of strings stored in the environment */
+
+int env_strcounter(word segm, int diff);
+/* Modifies the counter how many strings appended to the environment.
+
+	Return:	The resulting counter
+		or: 0, if there is no environment at all or no string is appended.
+*/
+
+word env_string(const word segm, int stringNr);
+/* Returns the offset of the stringNr'th string of the environment segm.
+
+	If stringNr == env_strings(), the offset of the first byte immediately
+	following the last string is returned.
+
+	Return:
+		0: stringNr too high
+		else: offset
+*/
+
+int env_strcpy(word segm, char buf[], const int len, const int stringNr);
+/*	Copies the stringNr'th string (1st string is 0) of the environment
+	segm into the buffer buf with the length len.
+
+	Return:
+		0:	OK
+		1:	stringNr too high
+		2:	buffer to small the hold the complete string, partially filled
+		3:	no environment at all
+*/
+
+char *env_strdup(word segm, const int stringNr);
+/*	Copies the stringNr'th string (1st string is 0) of the environment
+	segm into the buffer newly malloc()'ed.
+
+	If segm == 0, the current used environment is processed.
+
+	Return:
+		NULL: failure: stringNr too high, no environment, no memory
+		else: pointer to the buffer
+*/
+
+int env_strput(word segm, const char buf[], const int stringNr);
+/* Replaces the stringNr'th string (1st string is 0) of the environment
+	segm by the ASCIZ string buf.
+
+	If buf == NULL, the string is deleted, all following strings are
+	shifted up one position.
+
+	If stringNr == env_strings(segm), a new string is appended.
+
+	Return:
+		0:	OK
+		1:	stringNr too high
+		2:	environment too small
+		3:	no environment at all
+*/
+
+int env_strinsert(word segm, const char buf[], const int stringNr);
+/* Inserts a new string before the stringNr'th string of the environment
+	segm.
+
+	If stringNr == env_strings(segm), a new string is appended.
+
+	Return:
+		0:	OK
+		1:	stringNr too high
+		2:	environment too small
+		3:	no environment at all
+		4:	buf == NULL
+*/
+
+
+
+/*********
+	Internally used functions
+	*********/
+
+/*!!!!!!!
+	All of these functions requires that segm must not be zero.
+	!!!!!!!!*/
+
+unsigned env_findVar(const unsigned segm, const char var[]);
+/* Return the offset of the variable var in the environment. -1 means
+	not found. This function is case-sensitve. */
+
+void env_subVarOffset(const unsigned segm, const unsigned offset);
+/* Remove variable starting at offset */
+
+int env_addVar(const unsigned segm, const char name[], const char value[]);
+/* Append a new variable with the name and value
+	Return:	0: failed
+			1: OK
+*/
+
+int env_check(const unsigned segm);
+/*	Check the environemnt, the return value:
+ 		0:	environment OK
+ 		1:	no environment at all (envseg is NULL)
+ 		2:	PSP corrupt (envseg points to an invalid memory block)
+ 		3:	variable's space corrupted
+ 		4:	no string table
+ 		5:	string table corrupted or no string table at all
+*/
+
+unsigned env_firstFree(const unsigned segm);
+/* Return the offset of the first unused byte of the environment */
+
+unsigned env_endOfVars(const unsigned segm);
+/* Return the offset of the NUL terminator of the part of the environment
+	segment for the variables.
+*/
+
+unsigned env_freeCount(const unsigned segm);
+/* Return the number of bytes, which are unused in the environment segment.
+*/
+
+unsigned env_varlen(const unsigned segm, const unsigned offs);
+/* Return the number of bytes the variable at this position allocates. */
+
+#endif
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/suppl/mcb.h com075g/suppl/mcb.h
--- com075f/suppl/mcb.h	Wed Dec 31 18:00:00 1969
+++ com075g/suppl/mcb.h	Tue Aug 18 23:14:54 1998
@@ -0,0 +1,176 @@
+/*
+    SUPPL - a supplemental library for common useage
+    Copyright (C) 1995,1996  Steffen Kaiser
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    See: COPYING.LB
+*/
+/* $Id: MCB.H 2.1 1996/11/08 03:18:16 ska Exp $
+ * $Locker:  $	$Name:  $	$State: Exp $
+ *
+ * header file for the MCB handling functions
+ *
+ * All functions work over the paragraphe number of the MCB.
+ * Note: Some functions use the PSP instead of the real MCB number!
+ *
+ * Shells are a mess in DOS. They patch their parent field to point to
+ * theirselves, thus, making correct process trees impossible.
+ *
+ * implemented functions:
+	file		function	short desription
+
+	mcb.h		SEG2MCB		transform a memory handle into MCB number
+	mcb.h		MCB2SEG		transform a MCB number into a memory handle
+	mcb_apar.c	mcb_allParents	spawn function for all parents and current PSP
+	mcb_env.c	isEnv		check, if MCB is an environment segment
+	mcb_is.c	isMCB		check, if MCB is a valid MCB number
+	mcb_leng.c	mcb_length	return the length of the *memory handle* in bytes
+	mcb_mstr.c	mcb_primaryShell	return the MCB of the primary shell
+	mcb_nxt.c	nxtMCB		return the MCB number of the next MCB in the chain
+	mcb_owne.c	mcb_owner	return the MCB number of the owner process
+	mcb_pare.c	mcb_shell	return the MCB number of the shell of mcb
+	mcb_psp.c	isPSP		check, if MCB is a valid process (PSP)
+	mcb_shell.c	isShell		check, if MCB is a shell process
+	mcb_toen.c	mcb_toenv	transform the MCB number in the env seg, if PSP
+	mcb_walk.c	mcb_walk	spawn a function for each valid MCB
+
+*/
+
+#ifndef __MCB_H
+#define __MCB_H
+
+#include <portable.h>
+
+#define SEG2MCB(segm) ((segm) - 1)
+/* transforms a PSP number or a memory segment address (returned by DOS
+	API function 0x49) into its MCB number */
+
+#define MCB2SEG(mcb) ((mcb) + 1)
+/* opposite of SEG2MCB() */
+
+#define SEG_OFFSET 0x10
+/* Because of the segment/offset stuff of Intel chips, this is the
+	displacement MCB -> SEG useable in the offset of a far address */
+
+#ifdef _MICROC_
+unsigned mcb_toenv(unsigned mcb);
+/* Transform the MCB into the associated environment segment.
+	The mcb must be a valid PSP. */
+#else
+#define mcb_toenv(mcb) peekw(mcb, SEG_OFFSET + 0x2c)
+#endif
+
+struct MCB {
+	byte mcb_type;		/* type of MCB, 'Z': no following MCB, 'M': following */
+	word mcb_ownerPSP;	/* PSP number of owner of this block */
+	word mcb_size;		/* size of this MCB */
+	byte mcb_rsrvd[3];	/* unused */
+	byte mcb_name[8];	/* name of program file name if PSP created in exec() */
+};
+#define OFF_MCB_TYPE 0
+#define OFF_MCB_OWNER 1
+#define OFF_MCB_SIZE 3
+#define OFF_MCB_NAME 8
+
+#ifdef _MICROC_
+#define MCB_WALKFUNC int *
+#else
+typedef int (*MCB_WALKFUNC)(void *, unsigned);
+#endif
+
+unsigned mcb_length(const unsigned segm);
+/* Return the length of the memory block segm (PSP) in bytes */
+
+int mcb_walk(unsigned mcb, const MCB_WALKFUNC fct, void * const arg);
+/* General purpose MCB walker.
+
+	mcb: where to begin the walk process, if 0, begin with the 1st MCB avail
+	fct: function to be called with each MCB:	(*fct)(arg, mcb)
+		 The function must return 0, if the walker shall stop.
+	arg: general argument to be passed unchanged to the function
+
+	Return:	 0: end of chain reached (function never hit).
+			-1: chain is corrupted.
+		  else: function cancelled walk process.
+*/
+
+int isShell(const unsigned mcb);
+/* Returns 1, if the MCB number (*not* PSP) is a shell;
+		   0, otherwise.
+   Note: The function does not check, if mcb really is a valid MCB.
+*/
+
+int isPSP(const unsigned mcb);
+/* Returns 1, if the MCB number (*not* PSP) is a PSP;
+		   0, otherwise.
+   Note: The function does not check, if mcb really is a valid MCB.
+*/
+
+int isMCB(const unsigned mcb);
+/* Returns 1, if the MCB number (*not* PSP) is valid;
+		   0, otherwise.
+*/
+
+int isEnv(const unsigned mcb);
+/* Returns 1, if the MCB number (*not* memory handle!) is an environment;
+		   0, otherwise.
+*/
+
+unsigned nxtMCB(unsigned mcb);
+/* Returns	0, if mcb is the last in the chain;
+			!= 0, MCB behind this mcb.
+*/
+
+int mcb_allParents(unsigned mcb, MCB_WALKFUNC fct, void *arg);
+/* Launch "(*fct)(arg, mcb)" for all parents (excluding the process mcb
+	itself). The argument mcb is the MCB of the particular process.
+	(*fct) must return != 0, if the walk process shall be terminated.
+	The walk terminates, when a shell is reached.
+
+	If mcb is 0, _psp is used, otherwise it is checked via "isPSP(mcb)",
+	if this is (possibly) a PSP.
+
+	Return:	  -1: MCB chain or something else corrupted (e.g. mcb was
+					no PSP)
+			   0: shell reached, but function didn't terminate
+			else: function terminated walk process
+*/
+
+unsigned mcb_primaryShell(void);
+/* There is no known way, which will never fail.
+
+	There are three ways of locating the primary shell:
+		1) Check the program INT-2E points to;
+		2) Check the first shell in the MCB chain;
+		3) Check the last shell that has its environment behind its PSP.
+
+	With all the memory saving programs moving their data freely through
+	the memory, all three may or may not return the correct environment.
+
+	Therefore, all three checks are made and the result will be assumed
+	as true, which comes twice.
+
+	Return:	0:	nothing found. All free ways returned different addresses
+*/
+
+unsigned mcb_owner(unsigned mcb);
+/* Return the MCB of the PSP owning mcb.
+*/
+
+unsigned mcb_shell(unsigned mcb);
+/* Return the MCB of the most current launched shell of the process of mcb.
+*/
+
+#endif
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/suppl/p-bc.h com075g/suppl/p-bc.h
--- com075f/suppl/p-bc.h	Wed Dec 31 18:00:00 1969
+++ com075g/suppl/p-bc.h	Tue Aug 18 23:14:52 1998
@@ -0,0 +1,54 @@
+/*
+    SUPPL - a supplemental library for common useage
+    Copyright (C) 1995,1996  Steffen Kaiser
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    See: COPYING.LB
+*/
+/* Portable include file for Turbo/Borland C */
+#ifdef __TURBOC__
+
+
+/* Global argc/argv variables */
+#define G_ARGV _argv		/* global char **argv	variable */
+#define G_ARGC _argc		/* global int argc	variable */
+#define G_ARG_DEF			/* definition of global variables */
+#define G_ARG_INIT			/* initialization of global variables */
+
+/* byte/word/dword type */
+typedef unsigned char byte;
+typedef unsigned word;
+typedef int FLAG;	/* no special 8-bit handling */
+typedef unsigned FLAG8;	/* no special 8-bit handling */
+typedef unsigned long dword;
+
+/* peekb() && pokeb() exist */
+#define peekw peek
+#define pokew poke
+
+#define _osversion MK_OSVERS(_osmajor, _osminor)
+
+/* get/set interrupt vecotr */
+typedef void interrupt (far *isr)();
+#define set_isrfct(num,fct) setvect((num), (isr)(fct))
+#define get_isr(num,var) ((var) = getvect(num))
+#define set_isr(num,var) setvect((num), (var))
+
+/* calling interrupt */
+typedef struct REGPACK IREGS;
+#define intrpt intr
+
+
+#endif
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/suppl/portable.h com075g/suppl/portable.h
--- com075f/suppl/portable.h	Wed Dec 31 18:00:00 1969
+++ com075g/suppl/portable.h	Tue Aug 18 23:14:52 1998
@@ -0,0 +1,123 @@
+/*
+    SUPPL - a supplemental library for common useage
+    Copyright (C) 1995,1996  Steffen Kaiser
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    See: COPYING.LB
+*/
+/* $Id: PORTABLE.H 1.2 1998/08/19 07:27:05 ska Exp ska $
+   $Locker: ska $	$Name:  $	$State: Exp $
+
+
+*/
+
+#ifndef __PORTABLE_H
+#define __PORTABLE_H
+
+#include <regproto.h>
+#define NUL '\0'
+#define MK_OSVERS(major,minor) ((major << 8) | (minor))
+
+#ifdef FARDATA
+#undef FARDATA
+#endif
+#ifdef FARCODE
+#undef FARCODE
+#endif
+
+#ifdef _MICROC_
+
+#include <p-mc.h>
+
+#else	/* no _MICROC_ */
+
+#if defined(__HUGE__) || defined(__LARGE__) || defined(__COMPACT__)
+#define FARDATA
+#endif
+#if defined(__HUGE__) || defined(__LARGE__) || defined(__MEDIUM__)
+#define FARCODE
+#endif
+
+/*
+ *	Currently supported:
+ *		Borland C/C++ v2+
+ *		Pacific C v7.51
+ *		Watcom v10.6
+ */
+
+#define iM(q)			/* if Micro-C */
+#define nM(q)	q		/* not Mirco-C */
+#define inM(q,w)	w	/* if-not Micro-C */
+#define aF(fct) (fct)		/* address of function */
+#define aS(structure) &(structure)	/* address of structure */
+#define cS(strucType) (strucType)	/* casting of a structure */
+
+
+/* Handling of pointers to structures */
+#define sInc(poi) ++(poi)
+#define sDec(poi) --(poi)
+#define sIdx(array,index) ((array) + (index))
+#define sAdd(poi,displacement) ((poi) += (displacement))
+#define sSub(poi,displacement) ((poi) -= (displacement))
+
+/* far pointer variable handling */
+#define TO_FP(var) ((void far*) (var))	/* cast variable to far pointer */
+#define FARARG(var,type) type far* var
+#define COPYFARARG(var) var
+
+/* DWORD variables handling */
+#define setDW(var,seg,ofs) ((var) = (dword)MK_FP(seg,ofs))
+#define setDWP(varP,seg,ofs) (*(varP) = (dword)MK_FP(seg,ofs))
+#define DW_LO(var) ((word)(var))
+#define DW_HI(var) ((word)((var) >> 16))
+#define DWP_LO(var) ((word)(var))
+#define DWP_HI(var) ((word)((var) >> 16))
+#define DWARG dword
+
+/* Simulate long constants and long arguments */
+#define TO_LONG(num) (unsigned long)(num)
+#define MK_LONG(hi,lo) (((unsigned long)(hi) << 16) | (unsigned)(lo))
+
+
+#ifndef NULL
+#define NULL ((void*)0)
+#endif
+
+/* LONGMATH */
+#define longcpy(a,b) ((a) = (b))
+#define longset(a,b) ((a) = (b))
+#define longmul(a,b) ((a) *= (b))
+#define longdiv(a,b) ((a) /= (b))
+#define longadd(a,b) ((a) += (b))
+#define longsub(a,b) ((a) -= (b))
+#define longtst(a) (!!(a))
+#define longcmp1(a,b) ((signed long)(a) - (signed long)(b))
+
+/* Source In compiler specific settings */
+#ifdef __TURBOC__
+#include "p-bc.h"
+#endif
+
+#ifdef HI_TECH_C
+#include "p-pac.h"
+#endif
+
+#ifdef __WATCOMC__
+#include "p-watcom.h"
+#endif
+
+#endif	/* _MICROC_ */
+
+#endif
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/suppl/readme.txt com075g/suppl/readme.txt
--- com075f/suppl/readme.txt	Wed Dec 31 18:00:00 1969
+++ com075g/suppl/readme.txt	Thu Dec  3 22:09:32 1998
@@ -0,0 +1,8 @@
+These header files and the file suppl_s.lib are from
+The SUPPL package; a supplemental library written by
+Copyright (C) 1995-97 Steffen Kaiser, Release Version 2.6
+
+This library is available from the Steffen's site at
+ftp://www.inf.fh-rhein-sieg.de/pub/freedos/local/suppl26.zip
+
+It is also mirrored at http://www.gcfl.net/freedos/suppl/suppl26.zip
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/suppl/regproto.h com075g/suppl/regproto.h
--- com075f/suppl/regproto.h	Wed Dec 31 18:00:00 1969
+++ com075g/suppl/regproto.h	Tue Aug 18 23:14:52 1998
@@ -0,0 +1,119 @@
+/*
+    SUPPL - a supplemental library for common useage
+    Copyright (C) 1995,1996  Steffen Kaiser
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    See: COPYING.LB
+*/
+/* Enables the usage of the fast register pseudo vars for non-TURBO
+   compilers. That means the port Turbo -> non-Turbo is OK.
+   Back not, because the union holds the registers independed on
+   real registers.
+*/
+
+#ifndef __REGPROTO_H
+#define __REGPROTO_H
+
+#ifndef _MICROC_
+#include <dos.h>
+#endif
+
+#ifdef __TURBOC__
+#define USEREGS
+#define NOREGS	/* register variables active */
+#define _CFLAG (_FLAGS & 1)
+
+#else
+
+#ifdef _MICROC_
+#define USEREGS
+#define _AL (*(unsigned char *)&_AX_)
+#define _AH (((unsigned char *)&_AX_)[1])
+#define _BL (*(unsigned char *)&_BX_)
+#define _BH (((unsigned char *)&_BX_)[1])
+#define _CL (*(unsigned char *)&_CX_)
+#define _CH (((unsigned char *)&_CX_)[1])
+#define _DL (*(unsigned char *)&_DX_)
+#define _DH (((unsigned char *)&_DX_)[1])
+#define _AX _AX_
+#define _BX _BX_
+#define _CX _CX_
+#define _DX _DX_
+#define _SI _SI_
+#define _DI _DI_
+#define _DS get_ds()
+#define _SS get_ds()
+#define _ES get_es()
+#define _CS get_cs()
+#define _CFLAG (_FLAGS & 1)
+extern unsigned _FLAGS;
+#define geninterrupt(n)  (_FLAGS = int86(n))
+
+#else
+#define USEREGS  union REGS reg ; struct SREGS sreg ;
+#define _AH reg.h.ah
+#define _AL reg.h.al
+#define _BH reg.h.bh
+#define _BL reg.h.bl
+#define _CH reg.h.ch
+#define _CL reg.h.cl
+#define _DH reg.h.dh
+#define _DL reg.h.dl
+#define _AX reg.x.ax
+#define _BX reg.x.bx
+#define _CX reg.x.cx
+#define _DX reg.x.dx
+#define _SI reg.x.si
+#define _DI reg.x.di
+#define _DS sreg.ds
+#define _ES sreg.es
+#define _SS sreg.ss
+#define _CFLAG reg.x.cflag
+#define geninterrupt(n)  int86x(n,&reg,&reg,&sreg)
+
+#endif /* _MICROC_ */
+#endif /* __TURBOC__ */
+/*
+   int getkey()
+   {
+      USEREGS
+
+      _AH = 0x10 ;
+      geninterrupt(0x16) ;
+      return _AX ;
+   }
+*/
+
+#ifdef _MICROC_
+#define asmLabel(a) a:			/* label inside of asm {} */
+#define asmName(a,b) b[bp]		/* variable name not available, use offset */
+#define FP_SEG(a) get_ds()	/* only tiny/small available */
+#define FP_OFF(a) (a)
+#else
+#define asmLabel(a) } a: asm {
+#define asmName(a,b) a
+
+#if defined(__POWERC) || (defined(__TURBOC__) && !defined(__BORLANDC__))
+#define FAR far
+#else
+#define FAR _far
+#endif
+
+#ifndef MK_FP
+#define MK_FP(seg,off) ((void FAR *)(((long)(seg) << 16)|(unsigned)(off)))
+#endif
+#endif
+
+#endif
Binary files com075f/suppl_s.lib and com075g/suppl_s.lib differ
Files com075f/tempfile.c and com075g/tempfile.c are identical
Files com075f/tempfile.h and com075g/tempfile.h are identical
Files com075f/tests/bat1.bat and com075g/tests/bat1.bat are identical
Files com075f/tests/bat2.bat and com075g/tests/bat2.bat are identical
Files com075f/tests/bat3.bat and com075g/tests/bat3.bat are identical
Files com075f/tests/dir-test.txt and com075g/tests/dir-test.txt are identical
Files com075f/tests/fdos.out and com075g/tests/fdos.out are identical
Files com075f/tests/hbp001a.bat and com075g/tests/hbp001a.bat are identical
Files com075f/tests/hbp001b.bat and com075g/tests/hbp001b.bat are identical
Files com075f/tests/hbp002.txt and com075g/tests/hbp002.txt are identical
Files com075f/tests/hbp_001.txt and com075g/tests/hbp_001.txt are identical
Files com075f/tests/msdos.out and com075g/tests/msdos.out are identical
Files com075f/tests/refl.bat and com075g/tests/refl.bat are identical
Files com075f/tests/t.bat and com075g/tests/t.bat are identical
Files com075f/tests/test.bat and com075g/tests/test.bat are identical
Files com075f/tests/test1.bat and com075g/tests/test1.bat are identical
Files com075f/tests/test2.bat and com075g/tests/test2.bat are identical
Files com075f/tests/test3.bat and com075g/tests/test3.bat are identical
Files com075f/tests/test4.bat and com075g/tests/test4.bat are identical
Files com075f/tests/testenv.c and com075g/tests/testenv.c are identical
Files com075f/time.c and com075g/time.c are identical
Files com075f/timefunc.c and com075g/timefunc.c are identical
Files com075f/timefunc.h and com075g/timefunc.h are identical
Files com075f/tmpnam.c and com075g/tmpnam.c are identical
Files com075f/truename.c and com075g/truename.c are identical
Files com075f/type.c and com075g/type.c are identical
diff --recursive --ignore-space-change --unified --report-identical-files --minimal --new-file -p com075f/ver.c com075g/ver.c
--- com075f/ver.c	Tue Dec  1 12:52:54 1998
+++ com075g/ver.c	Thu Dec  3 23:37:42 1998
@@ -27,7 +27,7 @@
 #include "command.h"
 #include "strings.h"
 
-char *shellver = "version 0.75f\xE1 [" __DATE__ "]";
+char *shellver = "version 0.75g\xE1 [" __DATE__ "]";
 char *shellname = "FreeDOS Command Shell";
 
 void short_version(void)
Files com075f/verify.c and com075g/verify.c are identical
Files com075f/where.c and com075g/where.c are identical
