| version 1.6, 2003/06/27 02:18:30 |
version 1.7, 2003/07/15 15:45:34 |
|
|
| * Changelog: |
* Changelog: |
| * 19/05/2003 - created |
* 19/05/2003 - created |
| * 27/06/2003 - added Win32 support |
* 27/06/2003 - added Win32 support |
| |
* 15/07/2003 - smart memory allocation for files and directories data |
| */ |
*/ |
| |
|
| /* $Platon: games/3do-view/dir.c,v 1.5 2003/06/22 18:40:33 nepto Exp $ */ |
/* $Platon: games/3do-view/dir.c,v 1.6 2003/06/27 02:18:30 nepto Exp $ */ |
| |
|
| #include <string.h> |
#include <string.h> |
| #include <stdlib.h> |
#include <stdlib.h> |
| #include <system.h> |
#include <system.h> |
| |
|
| |
#define DIR_SMART_ALLOCATION (1) /* 1 or 0 */ |
| |
#define DIR_REALLOC_IDX_STEP (15) |
| |
#if DIR_SMART_ALLOCATION |
| |
# define DIR_REALLOC_DATA_STEP (255) |
| |
#endif |
| |
|
| #if PLATON_SYSTEM_SVGALIB |
#if PLATON_SYSTEM_SVGALIB |
| # include <unistd.h> |
# include <unistd.h> |
| # include <dirent.h> |
# include <dirent.h> |
|
|
| FA_DIREC + FA_HIDDEN + FA_RDONLY + FA_SYSTEM))) |
FA_DIREC + FA_HIDDEN + FA_RDONLY + FA_SYSTEM))) |
| #endif |
#endif |
| |
|
| #define DIR_REALLOC_STEP (10) |
|
| |
|
| static int compare_function(const void *ptr1, const void *ptr2) /* {{{ */ |
static int compare_function(const void *ptr1, const void *ptr2) /* {{{ */ |
| { |
{ |
| #if 0 |
#if 0 |
| Line 60 static int compare_function(const void * |
|
| Line 65 static int compare_function(const void * |
|
| |
|
| void get_directories_and_files(char ***directories, char ***files) /* {{{ */ |
void get_directories_and_files(char ***directories, char ***files) /* {{{ */ |
| { |
{ |
| |
#if DIR_SMART_ALLOCATION |
| |
register int *alloc_bytes; |
| |
register int *free_bytes; |
| |
int directories_alloc_bytes = 0; |
| |
int directories_free_bytes = 0; |
| |
int files_alloc_bytes = 0; |
| |
int files_free_bytes = 0; |
| |
#endif |
| #if PLATON_SYSTEM_SVGALIB |
#if PLATON_SYSTEM_SVGALIB |
| DIR *dirp; |
DIR *dirp; |
| struct dirent *dp; |
struct dirent *dp; |
| Line 98 void get_directories_and_files(char ***d |
|
| Line 111 void get_directories_and_files(char ***d |
|
| continue; |
continue; |
| ptr = directories; |
ptr = directories; |
| size = &directories_size; |
size = &directories_size; |
| |
#if DIR_SMART_ALLOCATION |
| |
alloc_bytes = &directories_alloc_bytes; |
| |
free_bytes = &directories_free_bytes; |
| |
#endif |
| } else { |
} else { |
| if (files == NULL) |
if (files == NULL) |
| continue; |
continue; |
| ptr = files; |
ptr = files; |
| size = &files_size; |
size = &files_size; |
| |
#if DIR_SMART_ALLOCATION |
| |
alloc_bytes = &files_alloc_bytes; |
| |
free_bytes = &files_free_bytes; |
| |
#endif |
| } |
} |
| if (! *size || !((*size + 1) % DIR_REALLOC_STEP)) { |
if (! *size || !((*size + 1) % DIR_REALLOC_IDX_STEP)) { |
| register char **new_ptr; |
register char **new_ptr; |
| new_ptr = (char **) realloc((void *) *ptr, |
new_ptr = (char **) realloc((void *) *ptr, |
| sizeof(char *) * (*size + 1 + DIR_REALLOC_STEP)); |
sizeof(char *) * (*size + 1 + DIR_REALLOC_IDX_STEP)); |
| if (new_ptr == NULL) |
if (new_ptr == NULL) |
| break; |
break; /* take what we recentry have and go away |
| |
if memory allocation failed */ |
| *ptr = new_ptr; |
*ptr = new_ptr; |
| |
if (! *size) |
| |
(*ptr)[0] = NULL; |
| } |
} |
| |
#if DIR_SMART_ALLOCATION |
| |
while (strlen(DIR_FILENAME) + 1 > *free_bytes) { |
| |
register char *new_ptr; |
| |
register int i, diff; |
| |
new_ptr = (char *) realloc((void *) **ptr, |
| |
sizeof(char) * (*alloc_bytes + DIR_REALLOC_DATA_STEP)); |
| |
if (new_ptr == NULL) |
| |
break; /* skip this entry if memory allocation failed */ |
| |
diff = new_ptr - **ptr; |
| |
for (i = 0; i <= *size; i++) |
| |
(*ptr)[i] += diff; |
| |
*free_bytes += DIR_REALLOC_DATA_STEP; |
| |
*alloc_bytes += DIR_REALLOC_DATA_STEP; |
| |
} |
| |
if (strlen(DIR_FILENAME) + 1 <= *free_bytes) { |
| |
(*ptr)[*size] = **ptr + *alloc_bytes - *free_bytes; |
| |
strcpy((*ptr)[*size], DIR_FILENAME); |
| |
*free_bytes -= (strlen(DIR_FILENAME) + 1); |
| |
} |
| |
#else |
| if (((*ptr)[*size] = strdup(DIR_FILENAME)) == NULL) |
if (((*ptr)[*size] = strdup(DIR_FILENAME)) == NULL) |
| break; |
break; |
| |
#endif |
| (*size)++; |
(*size)++; |
| (*ptr)[*size] = NULL; |
(*ptr)[*size] = NULL; |
| #if PLATON_SYSTEM_SVGALIB |
#if PLATON_SYSTEM_SVGALIB |
| Line 124 void get_directories_and_files(char ***d |
|
| Line 169 void get_directories_and_files(char ***d |
|
| } while (DIR_NEXT_CONDITION); |
} while (DIR_NEXT_CONDITION); |
| #endif |
#endif |
| |
|
| |
#if DIR_SMART_ALLOCATION |
| |
/* Sorting currently does not work in smart allocation mode. */ |
| |
#else |
| if (*directories != NULL) |
if (*directories != NULL) |
| qsort(*directories, directories_size, sizeof(char *), compare_function); |
qsort(*directories, directories_size, sizeof(char *), compare_function); |
| if (*files != NULL) |
if (*files != NULL) |
| qsort(*files, files_size, sizeof(char *), compare_function); |
qsort(*files, files_size, sizeof(char *), compare_function); |
| |
#endif |
| } /* }}} */ |
} /* }}} */ |
| |
|
| void free_directories_or_files(char **ar) /* {{{ */ |
void free_directories_or_files(char **ar) /* {{{ */ |
| { |
{ |
| |
#if DIR_SMART_ALLOCATION |
| |
if (ar[0] != NULL) |
| |
free(ar[0]); |
| |
#else |
| register int i; |
register int i; |
| for (i = 0; ar[i] != NULL; i++) |
for (i = 0; ar[i] != NULL; i++) |
| free(ar[i]); |
free(ar[i]); |
| |
#endif |
| free(ar); |
free(ar); |
| } /* }}} */ |
} /* }}} */ |
| |
|
| Line 149 int main(int argc, char **argv) /* {{{ * |
|
| Line 203 int main(int argc, char **argv) /* {{{ * |
|
| |
|
| get_directories_and_files(&dirs, &files); |
get_directories_and_files(&dirs, &files); |
| |
|
| puts("Directories:"); |
printf("Directories: [%p]\n", dirs); |
| for (k = 0; dirs != NULL && dirs[k] != NULL; k++) |
for (k = 0; dirs != NULL && dirs[k] != NULL; k++) |
| printf("%03d: %s\n", k, dirs[k]); |
printf("%03d: %s\n", k, dirs[k]); |
| |
|
| puts("Files:"); |
printf("Files: [%p]\n", files); |
| for (k = 0; files != NULL && files[k] != NULL; k++) |
for (k = 0; files != NULL && files[k] != NULL; k++) |
| printf("%03d: %s\n", k, files[k]); |
printf("%03d: %s\n", k, files[k]); |
| |
|
| |
if (dirs != NULL) |
| |
free_directories_or_files(dirs); |
| |
if (files != NULL) |
| |
free_directories_or_files(files); |
| |
|
| return 0; |
return 0; |
| } /* }}} */ |
} /* }}} */ |
| |
|