verzia 1.1, 2003/05/19 22:24:46 |
verzia 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) /* {{{ */ |
Riadok 50 void free_directories_or_files(char **ar |
|
Riadok 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: |