[comp.os.msdos.programmer] File globbing source for MS-DOS and OS/2

few@gupta.portal.com (Frank Whaley) (02/02/91)

The attached compress'ed and uuencode'd text contains the C source
to _setargv() and _setenvp(), code that replaces the standard
routines provided by TurboC 2.0 and MSC 5.1 as part of their runtime
startup.  The new versions provide file globbing for MS-DOS 3.x/4.x
and OS/2 1.2, along with support for several methods of passing long
command lines to MS-DOS programs (including MKS and 4DOS methods).

This code is Public Domain.  I'm posting only to this narrow newsgroup
first for two reasons:  I'd like to get any bug reports quickly
before it spreads very far, and I'd like to reduce clutter by only
putting this code in places where it will be useful.

I've attached the header from setargv.c in plain text, so you can
get an idea of what this code does before unpacking it.

Frank Whaley
Software Engineer
Gupta Technologies
few@gupta.com

/*
 *	setargv.c - parse arguments
 *
 *	This code evolved out of a requirement for expansion of wild-card
 *	arguments given on the command line.  None of the (currently)
 *	available wild-card matchers did the job for me.
 *
 *	This version both expands wild-card arguments by globbing and
 *	converts them to lower case (a cosmetic thing for me).  Arguments
 *	that are quoted (with either " or ') are left alone, but the quote
 *	characters are stripped.
 *	#ifdef UNIXBS
 *	 Any single character may be escaped with a backslash (\).
 *	#else
 *	 Quote characters may be escaped with a backslash (\).
 *	#endif
 *
 *	"@name" processing is also handled by this package.  In order to
 *	overcome the 126 byte command line limitation of MS-DOS, several
 *	tool makers have agreed to pass lengthy command lines either in
 *	an environment variable or a temporary file.  This mechanism comes
 *	to play only if the first non-blank character of a command line
 *	is '@'.  First the environment is searched for a tag matching
 *	"name", otherwise "name" is assumed to be the name of a temporary
 *	file containing the command line.
 *
 *	MKS-style extended arguments which are passed in the environment
 *	are also interpreted.  If MKS-style arguments are selected, this
 *	module also provides setenvp() which ensures that these arguments
 *	are stripped from the environment.
 *
 *	Finally (I think), 4DOS stores command lines in the environment
 *	variable CMDLINE.
 *
 *	Even though OS/2 allows lengthy command lines, the three methods
 *	of passing long command lines are included in the OS/2 version,
 *	for use in "compatibility mode" programs.
 *
 *	In all cases the "correct" command line is retrieved before any
 *	filename expansion is performed.  This allows all calling programs
 *	(shells, make, etc.) to pass a simple version of the command line.
 *
 *	Three versions are provided, based on four flags:
 *		__TURBOC__	Turbo-C 2.0
 *		__MSC__		Microsoft C 5.1
 *		__MSDOS__	MS-DOS 3.x/4.x
 *		__OS2__		OS/2 1.2
 *
 *	Seven additional conditional-compilation flags are provided:
 *		ATARGS:		Handle extended arguments passed by the
 *				"@name" protocol.
 *		CMDLINE:	Handle 4DOS-style arguments passed in the
 *				"CMDLINE" environment variable.
 *		FIXARG0:	Convert argv[0] to lower case and switch
 *				all backslashes to slashes (cosmetic).
 *		GLOB:		Use filename globbing instead of standard
 *				MS-DOS wild-card matching.
 *		MKSARGS:	Look for MKS-style extended arguments
 *				passed in the environment.
 *		SORTARGS:	Use qsort() to sort the expansions of
 *				each argument.
 *		UNIXBS		Treat backslashes in the Unix fashion (as
 *				a single-character escape) rather than as
 *				directory separator characters.
 *
 *	A test program is provided at the end of this file, and is built
 *	if 'TEST' is defined.  A few possibilities:
 *	tcc -DTEST -DFIXARG0 -DGLOB -DSORTARGS setargv.c
 *	cl -D__MSC__ -D__MSDOS__ -DTEST -DMKSARGS setargv.c -link /NOE/ST:8192
 *	cl -D__MSC__ -D__OS2__ -G2 -DTEST -DGLOB -DSORTARGS setargv.c \ 
 *							    -link /NOE/ST:8192
 *
 *	Note that this code requires just under 6K of stack space (along with
 *	a substantial amount of allocated memory), which exceeds the default
 *	of 4K built in to most runtime code.
 *
 *	Further enhancements greatly appreciated.
 *
 *	This code placed in the public domain on 01-Feb-91 by
 *	the original author, Frank Whaley (few@gupta.com).
 */

begin 644 setargv.c.Z
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
2_AEE *A6\$1$0+#8+H;@$!H?
 
end