|
|
1.1 root 1: /*
2: *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3: *% Copyright (C) 1989, by WATCOM Systems Inc. All rights %
4: *% reserved. No part of this software may be reproduced %
5: *% in any form or by any means - graphic, electronic or %
6: *% mechanical, including photocopying, recording, taping %
7: *% or information storage and retrieval systems - except %
8: *% with the written permission of WATCOM Systems Inc. %
9: *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10: WILDARGV - split DOS command line into individual arguments expanding
11: those that contain ? or *.
12: This module is a substitute for the "initargv" module contained in the
13: library.
14:
15: Modified: By: Reason:
16: --------- --- -------
17: 23-aug-89 John Dahms was ignoring files with Archive or
18: read only attributes turned on. (Bug fix)
19: 15-sep-91 F.W.Crigger Use _LpCmdLine, _LpPgmName, _argc, _argv,
20: ___Argc, ___Argv
21: 13-jul-92 John Dahms add (void near *) cast in _allocate
22: 02-nov-93 A.F.Scian fixed so that it compiles as C++
23: */
24: #include <stdio.h>
25: #include <stdlib.h>
26: #include <string.h>
27: #include <io.h>
28: #include <direct.h>
29: #include <malloc.h>
30:
31: #ifdef __cplusplus
32: extern "C" {
33: #endif
34:
35: extern void _Not_Enough_Memory();
36: extern char *_LpCmdLine;
37: extern char *_LpPgmName;
38: extern int _argc; /* argument count */
39: extern char **_argv; /* argument vector */
40: extern int ___Argc; /* argument count */
41: extern char **___Argv; /* argument vector */
42:
43: #ifdef __cplusplus
44: };
45: #endif
46:
47:
48: static void *_allocate( unsigned amount )
49: {
50: void *p;
51:
52: #if defined(__386__)
53: p = malloc( amount );
54: #else
55: p = _nmalloc( amount );
56: #if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
57: if( (void near *) p == NULL ) p = malloc( amount );
58: #endif
59: #endif
60: if( p == NULL ) _Not_Enough_Memory();
61: return( p );
62: }
63:
64:
65: static int _make_argv( char *p, char ***argv )
66: {
67: int argc;
68: char *start;
69: char *new_arg;
70: char wildcard;
71: char lastchar;
72: DIR * dir;
73: struct dirent * dirent;
74: char drive[_MAX_DRIVE];
75: char directory[_MAX_DIR];
76: char name[_MAX_FNAME];
77: char extin[_MAX_EXT];
78: char pathin[_MAX_PATH];
79:
80: argc = 1;
81: for(;;) {
82: while( *p == ' ' ) ++p; /* skip over blanks */
83: if( *p == '\0' ) break;
84: /* we are at the start of a parm */
85: wildcard = 0;
86: if( *p == '\"' ) {
87: p++;
88: new_arg = start = p;
89: for(;;) {
90: /* end of parm: NULLCHAR or quote */
91: if( *p == '\"' ) break;
92: if( *p == '\0' ) break;
93: if( *p == '\\' ) {
94: if( p[1] == '\"' || p[1] == '\\' ) ++p;
95: }
96: *new_arg++ = *p++;
97: }
98: } else {
99: new_arg = start = p;
100: for(;;) {
101: /* end of parm: NULLCHAR or blank */
102: if( *p == '\0' ) break;
103: if( *p == ' ' ) break;
104: if(( *p == '\\' )&&( p[1] == '\"' )) {
105: ++p;
106: } else if( *p == '?' || *p == '*' ) {
107: wildcard = 1;
108: }
109: *new_arg++ = *p++;
110: }
111: }
112: *argv = (char **) realloc( *argv, (argc+2) * sizeof( char * ) );
113: if( *argv == NULL ) _Not_Enough_Memory();
114: (*argv)[ argc ] = start;
115: ++argc;
116: lastchar = *p;
117: *new_arg = '\0';
118: ++p;
119: if( wildcard ) {
120: /* expand file names */
121: dir = opendir( start );
122: if( dir != NULL ) {
123: --argc;
124: _splitpath( start, drive, directory, name, extin );
125: for(;;) {
126: dirent = readdir( dir );
127: if( dirent == NULL ) break;
128: if( dirent->d_attr &
129: (_A_HIDDEN+_A_SYSTEM+_A_VOLID+_A_SUBDIR) ) continue;
130: _splitpath( dirent->d_name, NULL, NULL, name, extin );
131: _makepath( pathin, drive, directory, name, extin );
132: *argv = (char **) realloc( *argv, (argc+2) * sizeof( char * ) );
133: if( *argv == NULL ) _Not_Enough_Memory();
134: new_arg = (char *) _allocate( strlen( pathin ) + 1 );
135: strcpy( new_arg, pathin );
136: (*argv)[argc++] = new_arg;
137: }
138: closedir( dir );
139: }
140: }
141: if( lastchar == '\0' ) break;
142: }
143: return( argc );
144: }
145:
146:
147: #ifdef __cplusplus
148: extern "C"
149: #endif
150: void __Init_Argv()
151: {
152: _argv = (char **) _allocate( 2 * sizeof( char * ) );
153: _argv[0] = _LpPgmName; /* fill in program name */
154: _argc = _make_argv( _LpCmdLine, &_argv );
155: _argv[_argc] = NULL;
156: ___Argc = _argc;
157: ___Argv = _argv;
158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.