home *** CD-ROM | disk | FTP | other *** search
/ Superpower (Alt) / SUPERPOWER.iso / q / util / mbq319 / dirpack.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-01  |  2.1 KB  |  114 lines

  1. #include "cmdlib.h"
  2. #include <sys/types.h>
  3. #include <sys/dir.h>
  4.  
  5. typedef struct
  6. {
  7.     char    name[56];
  8.     int        filepos, filelen;
  9. } packfile_t;
  10.  
  11. typedef struct
  12. {
  13.     char    id[4];
  14.     int        dirofs;
  15.     int        dirlen;
  16. } packheader_t;
  17.  
  18. packfile_t    pfiles[4096];
  19. int        h, i, d;
  20. packheader_t    header;
  21. packfile_t    *pf;
  22.  
  23. int    dirnamelen;
  24.  
  25. void PackDirectory (char *dir)
  26. {
  27.     void        *buffer;
  28. #ifdef NeXT
  29.     struct direct **namelist, *ent;
  30. #else
  31.     struct dirent **namelist, *ent;
  32. #endif
  33.     int        count;
  34.     struct stat st;
  35.     int            i;
  36.     int            len;
  37.     char        newdir[32];
  38.     char        fullname[1024];
  39.     char        *name;
  40.     
  41.     count = scandir(dir, &namelist, NULL, NULL);
  42.     
  43.     for (i=0 ; i<count ; i++)
  44.     {
  45.         ent = namelist[i];    
  46.         name = ent->d_name;
  47.  
  48.         if (name[0] == '.')
  49.             continue;
  50.         strcpy (fullname, dir);
  51.         strcat (fullname, "/");
  52.         strcat (fullname, name);
  53.         strcpy (pf->name, fullname + dirnamelen);
  54.         
  55.         if (stat (fullname, &st) == -1)
  56.             Error ("fstating %s", pf->name);
  57.         if (st.st_mode & S_IFDIR)
  58.         {    // directory
  59.             strcpy (newdir, fullname);
  60.             PackDirectory (newdir);
  61.             continue;
  62.         }
  63.         
  64.         len = LoadFile (fullname, &buffer);
  65.         pf->filepos = LittleLong (lseek (h, 0, SEEK_CUR));
  66.         pf->filelen = LittleLong(len);
  67.         
  68.         SafeWrite (h, buffer, len);
  69.         free (buffer);
  70.         printf ("%64s : %6i\n", pf->name, len);
  71.         pf++;
  72.         
  73.     }
  74. }
  75.  
  76. void main (int argc, char **argv)
  77. {
  78.     int        dirlen;
  79.     char    outname[1024];
  80.     
  81.     if (argc != 2)
  82.         Error ("usage: dirpack <directory>\noutputs <directory>.pak");
  83.     
  84.     sprintf (outname, "%s.pak", argv[1]);
  85.     
  86.     h = SafeOpenWrite (outname);
  87.     SafeWrite (h, &header, sizeof(header));
  88.     
  89.     pf = pfiles;
  90.     
  91.     dirnamelen = strlen(argv[1]) + 1;
  92.     PackDirectory (argv[1]);
  93.     
  94.     header.id[0] = 'P';
  95.     header.id[1] = 'A';
  96.     header.id[2] = 'C';
  97.     header.id[3] = 'K';
  98.     dirlen = (byte *)pf - (byte *)pfiles;
  99.     header.dirofs = LittleLong(lseek (h, 0, SEEK_CUR));        // location of packfiles
  100.     header.dirlen = LittleLong(dirlen);
  101.     
  102.     SafeWrite (h, pfiles, dirlen);
  103.  
  104.     i = (int)lseek (h, 0, SEEK_CUR);
  105.  
  106.     lseek (h, 0, SEEK_SET);
  107.     SafeWrite (h, &header, sizeof(header));
  108.     close (h);    
  109.     
  110.     d = pf - pfiles;
  111.     printf ("%i files packed in %i bytes\n",d, i);
  112.     
  113. }
  114.