1 /* $Id: file.c,v 1.11 2005-03-05 09:30:26 chris Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
16 static char rcsid[] = "$Id: file.c,v 1.11 2005-03-05 09:30:26 chris Exp $";
34 int file_sort_func(char **e0, char **e1)
36 return stricmp(*e0, *e1);
40 char **file_getdirlist(int *NumDirs, char *dir)
43 char **list = PHYSFS_enumerateFiles(dir);
53 strncat(path, "/", PATH_MAX - strlen(dir));
55 test_filename = path + strlen(path);
56 test_max = PATH_MAX - (test_filename - path);
58 for (i = list; *i; i++)
60 if (strlen(*i) >= test_max)
63 strcpy(test_filename, *i);
64 if (PHYSFS_isDirectory(path))
72 qsort(list, *NumDirs, sizeof(char *), (int (*)( const void *, const void * ))file_sort_func);
76 // Put the 'go to parent directory' sequence '..' first
78 list = realloc(list, sizeof(char *)*(*NumDirs + 1));
79 list[*NumDirs] = NULL; // terminate
80 for (i = list + *NumDirs - 1; i != list; i--)
82 list[0] = strdup("..");
88 char **file_getfilelist(int *NumFiles, char *filespec, char *dir)
90 char **list = PHYSFS_enumerateFiles(dir);
91 char **i, **j = list, *ext;
99 for (i = list; *i; i++)
101 ext = strrchr(*i, '.');
102 if (ext && (!stricmp(ext, filespec)))
110 *NumFiles = j - list;
111 qsort(list, *NumFiles, sizeof(char *), (int (*)( const void *, const void * ))file_sort_func);
116 int ui_get_filename( char * filename, char * Filespec, char * message )
118 char ViewDir[PATH_MAX];
119 char InputText[PATH_MAX];
121 PHYSFS_file *TempFile;
122 int NumFiles, NumDirs,i;
123 char **filename_list;
124 char **directory_list;
127 UI_GADGET_BUTTON *Button1, *Button2, *HelpButton;
128 UI_GADGET_LISTBOX *ListBox1;
129 UI_GADGET_LISTBOX *ListBox2;
130 UI_GADGET_INPUTBOX *UserFile;
133 if ((p = strrchr(filename, '/')))
136 strcpy(ViewDir, filename);
137 strcpy(InputText, p);
142 strcpy(InputText, filename);
145 filename_list = file_getfilelist(&NumFiles, Filespec, ViewDir);
146 directory_list = file_getdirlist(&NumDirs, ViewDir);
148 // Running out of memory may become likely in the future
149 if (!filename_list && !directory_list)
154 PHYSFS_freeList(directory_list);
160 PHYSFS_freeList(filename_list);
164 //MessageBox( -2,-2, 1,"DEBUG:0", "Ok" );
169 wnd = ui_open_window( 200, 100, 400, 370, WIN_DIALOG );
171 ui_wprintf_at( wnd, 10, 5, message );
173 ui_wprintf_at( wnd, 20, 32,"N&ame" );
174 UserFile = ui_add_gadget_inputbox( wnd, 60, 30, PATH_MAX, 40, InputText );
176 ui_wprintf_at( wnd, 20, 86,"&Files" );
177 ui_wprintf_at( wnd, 210, 86,"&Dirs" );
179 ListBox1 = ui_add_gadget_listbox(wnd, 20, 110, 125, 200, NumFiles, filename_list);
180 ListBox2 = ui_add_gadget_listbox(wnd, 210, 110, 100, 200, NumDirs, directory_list);
182 Button1 = ui_add_gadget_button( wnd, 20, 330, 60, 25, "Ok", NULL );
183 Button2 = ui_add_gadget_button( wnd, 100, 330, 60, 25, "Cancel", NULL );
184 HelpButton = ui_add_gadget_button( wnd, 180, 330, 60, 25, "Help", NULL );
186 wnd->keyboard_focus_gadget = (UI_GADGET *)UserFile;
188 Button1->hotkey = KEY_CTRLED + KEY_ENTER;
189 Button2->hotkey = KEY_ESC;
190 HelpButton->hotkey = KEY_F1;
191 ListBox1->hotkey = KEY_ALTED + KEY_F;
192 ListBox2->hotkey = KEY_ALTED + KEY_D;
193 UserFile->hotkey = KEY_ALTED + KEY_A;
195 ui_gadget_calc_keys(wnd);
197 ui_wprintf_at( wnd, 20, 60, "%s", Spaces );
198 ui_wprintf_at( wnd, 20, 60, "%s", ViewDir );
205 ui_window_do_gadgets(wnd);
207 if ( Button2->pressed )
209 PHYSFS_freeList(filename_list);
210 PHYSFS_freeList(directory_list);
211 ui_close_window(wnd);
215 if ( HelpButton->pressed )
216 MessageBox( -1, -1, 1, "Sorry, no help is available!", "Ok" );
218 if (ListBox1->moved || new_listboxes)
220 if (ListBox1->current_item >= 0 )
222 strcpy(UserFile->text, filename_list[ListBox1->current_item] );
223 UserFile->position = strlen(UserFile->text);
224 UserFile->oldposition = UserFile->position;
226 UserFile->first_time = 1;
230 if (ListBox2->moved || new_listboxes)
232 if (ListBox2->current_item >= 0 )
234 strcpy(UserFile->text, directory_list[ListBox2->current_item]);
235 UserFile->position = strlen(UserFile->text);
236 UserFile->oldposition = UserFile->position;
238 UserFile->first_time = 1;
243 if (Button1->pressed || UserFile->pressed || (ListBox1->selected_item > -1 ) || (ListBox2->selected_item > -1 ))
247 if (ListBox2->selected_item > -1 )
248 strcpy(UserFile->text, directory_list[ListBox2->selected_item]);
250 strncpy(filename, ViewDir, PATH_MAX);
253 while (!strncmp(p, "..", 2)) // shorten the path manually
255 char *sep = strrchr(filename, '/');
259 *filename = 0; // look directly in search paths
267 strncat(filename, "/", PATH_MAX - strlen(filename));
268 strncat(filename, p, PATH_MAX - strlen(filename));
270 if (!PHYSFS_isDirectory(filename))
272 TempFile = PHYSFS_openRead(filename);
275 // Looks like a valid filename that already exists!
276 PHYSFS_close(TempFile);
280 // File doesn't exist, but can we create it?
281 TempFile = PHYSFS_openWrite(filename);
284 // Looks like a valid filename!
285 PHYSFS_close(TempFile);
286 PHYSFS_delete(filename);
292 if (filename[strlen(filename) - 1] == '/') // user typed a separator on the end
293 filename[strlen(filename) - 1] = 0;
295 strcpy(ViewDir, filename);
297 //mprintf( 0, "----------------------------\n" );
298 //mprintf( 0, "Full dir: '%s'\n", ViewDir );
300 PHYSFS_freeList(filename_list);
301 filename_list = file_getfilelist(&NumFiles, Filespec, ViewDir);
304 PHYSFS_freeList(directory_list);
308 strcpy(UserFile->text, Filespec);
309 UserFile->position = strlen(UserFile->text);
310 UserFile->oldposition = UserFile->position;
312 UserFile->first_time = 1;
314 PHYSFS_freeList(directory_list);
315 directory_list = file_getdirlist(&NumDirs, ViewDir);
318 PHYSFS_freeList(filename_list);
322 ui_listbox_change(wnd, ListBox1, NumFiles, filename_list);
323 ui_listbox_change(wnd, ListBox2, NumDirs, directory_list);
326 ui_wprintf_at( wnd, 20, 60, "%s", Spaces );
327 ui_wprintf_at( wnd, 20, 60, "%s", ViewDir );
330 //while ( TICKER < i+2 );
343 ui_close_window(wnd);
345 PHYSFS_freeList(filename_list);
347 PHYSFS_freeList(directory_list);
354 int ui_get_file( char * filename, char * Filespec )
357 char **list = file_getfilelist(&NumFiles, Filespec, "");
361 x = MenuX(-1, -1, NumFiles, list);
364 strcpy(filename, list[x - 1]);
366 PHYSFS_freeList(list);