Platon Technologies
not logged in Login Registration
EnglishSlovak
open source software development celebrating 10 years of open source development! Friday, October 16, 2026

Diff for games/3do-view/dir.c between version 1.6 and 1.7

version 1.6, 2003/06/27 02:18:30 version 1.7, 2003/07/15 15:45:34
Line 9 
Line 9 
  * 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>
Line 47 
Line 54 
                                         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;
 } /* }}} */  } /* }}} */
   

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

Platon Group <platon@platon.org> http://platon.org/
Copyright © 2002-2006 Platon Group
Site powered by Metafox CMS
Go to Top