source: trunk/src/opengl/glide/swlibs/fxmisc/fxglob.c

Last change on this file was 2887, checked in by sandervl, 26 years ago

Created swlibs dir

File size: 4.1 KB
Line 
1/*
2** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
3** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
4** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
5** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
6** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
7** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
8** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
9** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
10**
11** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
12** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
13** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
14** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
15** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
16** THE UNITED STATES.
17**
18** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
19**
20** $Revision: 1.1 $
21** $Date: 2000-02-25 00:33:51 $
22*/
23
24/*
25 xnglob.c
26
27 The globulate function below takes an NT command line and expands
28 wildcards according to POSIX.2 rules. It returns 0 on success, or -1
29 on failure. The reason that *argv is always globbed on is to convert
30 any backslashes in the program name to slashes. The deglobulate
31 function below it merely frees the memory associated with the
32 previously run globulate.
33*/
34
35#ifdef WIN32
36
37#include <windows.h>
38#include <stdlib.h>
39#include <string.h>
40#include <stdio.h>
41#include "glob.h"
42#include "fxglob.h"
43
44static signed int globulated_argi;
45signed int globulated_argc;
46char **globulated_argv;
47
48signed int globulate (signed int argi, signed int argc, char **argv)
49{
50 glob_t gl;
51 signed int ret, a;
52
53 if (argi <= 0 || argc < argi || argv == NULL || (ret = glob(*argv, GLOB_NOCHECK, NULL, &gl)) != 0)
54 ret = -1;
55 else
56 {
57 for (a = argi; a < argc; ++a)
58 {
59 if ((ret = glob(argv[a], GLOB_NOCHECK|GLOB_APPEND|GLOB_SHQUOTE, NULL, &gl)) != 0)
60 {
61 ret = -1;
62 goto globfree_gl;
63 }
64 }
65 if ((globulated_argv = malloc((argi + gl.gl_pathc + 1) * sizeof *globulated_argv)) == NULL)
66 {
67 ret = -1;
68 goto globfree_gl;
69 }
70 if ((*globulated_argv = malloc(strlen(*(gl.gl_pathv)) + 1)) == NULL)
71 {
72 ret = -1;
73 goto globfree_gl;
74 }
75 (void) strcpy(*globulated_argv, *(gl.gl_pathv));
76 for (a = 1; a < argi; ++a)
77 globulated_argv[a] = argv[a];
78 globulated_argc = gl.gl_pathc - 1;
79 for (a = 0; a < globulated_argc; ++a)
80 {
81 if ((globulated_argv[a + argi] = malloc(strlen(gl.gl_pathv[a + 1]) + 1)) == NULL)
82 {
83 while (a--)
84 free(globulated_argv[a + argi]);
85 free(*globulated_argv);
86 ret = -1;
87 goto globfree_gl;
88 }
89 (void) strcpy(globulated_argv[a + argi], gl.gl_pathv[a + 1]);
90 }
91 globulated_argv[a + argi] = NULL;
92 globulated_argc += argi;
93 globulated_argi = argi;
94 ret = 0;
95globfree_gl:
96 globfree(&gl);
97 }
98 return ret;
99}
100
101void deglobulate (void)
102{
103 for (globulated_argi = globulated_argc - globulated_argi; globulated_argi--; )
104 free(globulated_argv[--globulated_argc]);
105 free(*globulated_argv);
106 free(globulated_argv);
107}
108
109static WIN32_FIND_DATA fdata;
110static int valid;
111
112// GMT: POSIX emulation routines
113HANDLE opendir(char *path)
114{
115 HANDLE h;
116
117 h = FindFirstFile(path,&fdata);
118 if (h == INVALID_HANDLE_VALUE) {
119 printf("error: FindFirstFile failed - %d\n",GetLastError());
120 }
121 else valid = 1;
122 return h;
123}
124
125char *readdir(HANDLE h)
126{
127 if (!valid) { // if no valid filename
128 if (!FindNextFile(h,&fdata)) // find the next one
129 return 0; // if none, return 0
130 }
131 valid = 0;
132 // !!!TURBO HACKLAND
133 strlwr( fdata.cFileName );
134 return fdata.cFileName;
135}
136
137int closedir(HANDLE h)
138{
139 int rv = FindClose(h);
140 if (!rv)
141 printf("error: FindClose failed - %d\n",GetLastError());
142 return rv;
143}
144
145void fxGlobify( int *argc, char ***argv )
146{
147 // There's this upper/lower case pattern matching problem...
148 // !!!DANGER! FIRE-BREATHING ROBO-HACK
149 int index;
150 for( index = 1; index < *argc; index++ )
151 {
152 strlwr( (*argv)[index] );
153 }
154
155 if ( globulate( 1, *argc, *argv ) == 0 )
156 {
157 *argc = globulated_argc;
158 *argv = globulated_argv;
159 }
160}
161
162#endif
Note: See TracBrowser for help on using the repository browser.