| version 1.1, 2003/05/19 22:24:46 |
version 1.2, 2003/05/20 15:25:27 |
|
|
| * |
* |
| */ |
*/ |
| |
|
| /* $Platon$ */ |
/* $Platon: games/3do-view/dir.c,v 1.1 2003/05/19 22:24:46 nepto Exp $ */ |
| |
|
| #include <stdio.h> |
|
| #include <string.h> |
#include <string.h> |
| #include <stdlib.h> |
#include <stdlib.h> |
| |
#include <unistd.h> |
| |
#include <dirent.h> |
| |
#include <sys/types.h> |
| |
#include <sys/stat.h> |
| |
|
| |
#define DIR_REALLOC_STEP 10 |
| |
|
| void get_directories_and_files( /* ... ) {{{ */ |
void get_directories_and_files(char ***directories, char ***files) /* {{{ */ |
| const char *path, char ***directories, char ***files) |
|
| { |
{ |
| if (directories != NULL) { |
DIR *dirp; |
| *directories = (char **) malloc(5 * sizeof(char *)); |
struct dirent *dp; |
| if (*directories != NULL) { |
struct stat st; |
| (*directories)[0] = strdup("ATTEMPT0"); |
register char ***ptr; |
| (*directories)[1] = strdup("ATTEMPT1"); |
long int directories_size, files_size, *size; |
| (*directories)[2] = strdup("ATTEMPT2"); |
|
| (*directories)[3] = strdup("ATTEMPT3"); |
if (directories != NULL) *directories = NULL; |
| (*directories)[4] = NULL; |
if (files != NULL) *files = NULL; |
| |
|
| |
/* If current directory cannot be opened, fallback to root directory. */ |
| |
if ((dirp = opendir(".")) == NULL |
| |
&& !chdir("/") && (dirp = opendir(".")) == NULL) |
| |
return; |
| |
|
| |
directories_size = 0; |
| |
files_size = 0; |
| |
for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { |
| |
if (stat(dp->d_name, &st)) |
| |
continue; |
| |
|
| |
if (S_ISDIR(st.st_mode)) { |
| |
if (directories == NULL || ! strcmp(dp->d_name, ".")) |
| |
continue; |
| |
ptr = directories; |
| |
size = &directories_size; |
| |
} else { |
| |
if (files == NULL) |
| |
continue; |
| |
ptr = files; |
| |
size = &files_size; |
| } |
} |
| } |
if (! *size || !((*size + 1) % DIR_REALLOC_STEP)) { |
| if (files != NULL) { |
register char **new_ptr; |
| *files = (char **) malloc(5 * sizeof(char *)); |
new_ptr = (char **) realloc(*ptr, |
| if (*files != NULL) { |
sizeof(char *) * (*size + 1 + DIR_REALLOC_STEP)); |
| (*files)[0] = strdup("pokus0"); |
if (new_ptr == NULL) |
| (*files)[1] = strdup("pokus1"); |
break; |
| (*files)[2] = strdup("pokus2"); |
*ptr = new_ptr; |
| (*files)[3] = strdup("pokus3"); |
|
| (*files)[4] = NULL; |
|
| } |
} |
| |
if (((*ptr)[*size] = strdup(dp->d_name)) == NULL) |
| |
break; |
| |
(*size)++; |
| |
(*ptr)[*size] = NULL; |
| } |
} |
| |
|
| |
closedir(dirp); |
| } /* }}} */ |
} /* }}} */ |
| |
|
| void free_directories_or_files(char **ar) /* {{{ */ |
void free_directories_or_files(char **ar) /* {{{ */ |
| Line 50 void free_directories_or_files(char **ar |
|
| Line 80 void free_directories_or_files(char **ar |
|
| free(ar); |
free(ar); |
| } /* }}} */ |
} /* }}} */ |
| |
|
| |
#if defined(SELF) || defined(SELFTEST) || defined(SELF_DIR) |
| |
|
| |
#include <stdio.h> |
| |
|
| |
int main(int argc, char **argv) /* {{{ */ |
| |
{ |
| |
register int k; |
| |
char **dirs, **files; |
| |
|
| |
get_directories_and_files(&dirs, &files); |
| |
|
| |
puts("Directories:"); |
| |
for (k = 0; dirs != NULL && dirs[k] != NULL; k++) |
| |
printf("%03d: %s\n", k, dirs[k]); |
| |
|
| |
puts("Files:"); |
| |
for (k = 0; files != NULL && files[k] != NULL; k++) |
| |
printf("%03d: %s\n", k, files[k]); |
| |
|
| |
return 0; |
| |
} /* }}} */ |
| |
|
| |
#endif /* #if defined(SELF) || defined(SELFTEST) || defined(SELF_DIR) */ |
| |
|
| /* Modeline for ViM {{{ |
/* Modeline for ViM {{{ |
| * vim: set ts=4: |
* vim: set ts=4: |
| * vim600: fdm=marker fdl=0 fdc=0: |
* vim600: fdm=marker fdl=0 fdc=0: |