home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / convergent / ctctdir.c < prev    next >
C/C++ Source or Header  |  2020-01-01  |  5KB  |  166 lines

  1. char *ckdirv = "CTOS directory function-1.01, Summer 1987";
  2.  
  3. /* C K C T O S D I R . C -- Directory function for CTOS C-Kermit */
  4.  
  5. /* Joel Dunn, UNC-CH, February 1987 */
  6.  
  7. /* Includes */
  8.  
  9. #include "ctermi.h"
  10. #include "ctcmd.h"
  11. #include "ctuser.h"
  12. #include <ctype.h>
  13.  
  14. /* P R I N T D I R - Print sorted directory */
  15.  
  16. printdir()
  17. {
  18.  
  19.     struct direntry
  20.         {
  21.         char fname[51];        /* 50 bytes for name, null terminator */
  22.         long int fsize;
  23.         } *pcurdirel;        /* pointer to a file name/size */
  24.     struct ucbtype            /* CTOS user control block */
  25.         {
  26.         int reserved;
  27.         char sizevol;
  28.         char volname[12];
  29.         char sizedir;
  30.         char dirname[12];
  31.         char sizepw;
  32.         char password[12];
  33.         } ucb;
  34.     int x, y, z;            /* general purpose integers */
  35.     int isector;            /* count of sector processed */
  36.     int numdirentry;        /* number of directory entries found */
  37.     int maxnumdirentry;        /* max number of directory entries */
  38.     int fhnumber;            /* file header for fileheaders.sys */
  39.     int fhandle;            /* file handle for fileheaders.sys */
  40.     int erc;            /* CTOS error number */
  41.     int openerc;            /* CTOS error number for openfile*/
  42.     int *pfhnumber;            /* pointer to file header */
  43.     int strcmp();            /* string comparison function */
  44.     unsigned int sizedirarray;    /* size of directory array in bytes */
  45.     long int numdirsectors;        /* number of directory sectors */
  46.     long int lfa;            /* logical file address */
  47.     long int *pfsize;        /* pointer to file size */
  48.     long int totalsize;        /* total of file sizes */
  49.     long int tempdirsize;        /* temporary calculation field */
  50.     char *pdirpage;            /* pointer to a directory page */
  51.     char *psavedirpage;        /* save pointer to a directory page */
  52.     char *pfileheader;        /* pointer to a file header */
  53.     char *pdirarray;        /* pointer to file names/sizes */
  54.     char *fileheadername = "<sys>fileheaders.sys";
  55.                     /* name of fileheader for volume */
  56.     void qsort();            /* function returns a void type */
  57.  
  58.     /* get number of directory sectors */
  59.     if (getucb(&ucb, sizeof(ucb))) return(0);
  60.     if (getdirstatus(&ucb.dirname[0], ucb.sizedir, &ucb.password[0],
  61.              ucb.sizepw, 0, &numdirsectors, 4))
  62.       return(0);
  63.     numdirsectors /= 512;
  64.  
  65.     /* allocate storage for filenames & sizes
  66.        size = 25 files/sector x numdirsectors x # of bytes in structure */
  67.     maxnumdirentry = 25*numdirsectors;
  68.     tempdirsize = 55l;
  69.     tempdirsize *= maxnumdirentry;
  70.     if (tempdirsize > 0xffffl) 
  71.         {
  72.         printf("\nDirectory too large\n");
  73.         return(0);
  74.         }
  75.     else sizedirarray = tempdirsize;
  76.     if (allocmemorysl(sizedirarray, &pdirarray)) return(0);
  77.  
  78.     /* allocate storage for a directory page */
  79.     if (allocmemorysl(512, &psavedirpage)) return(0);
  80.  
  81.     /* allocate storage for a fileheader */
  82.     if (allocmemorysl(512, &pfileheader)) return(0);
  83.  
  84.     /* load directory array with name and file size
  85.        ...format per page is: 1 null byte
  86.                                   1 byte with length of name
  87.                                   n bytes, file name
  88.                                   2 bytes, file header number
  89. */
  90.     pcurdirel = pdirarray;
  91.     isector = 0;
  92.     numdirentry = 0;
  93.     openerc = openfile(&fhandle, fileheadername, strlen(fileheadername),
  94.                         fileheadername, 0, 0x6d72);
  95.     while (isector < numdirsectors)
  96.         {
  97.         pdirpage = psavedirpage; /* set up working pointer */
  98.         if (readdirsector(&ucb.dirname[0],
  99.                   ucb.sizedir, &ucb.password[0],
  100.                   ucb.sizepw, isector++, pdirpage))
  101.           return(0);
  102.         pdirpage++; /* burn null byte */
  103.         while (*pdirpage && *(pdirpage+1) && *(pdirpage+2))
  104.             {
  105.             x = *pdirpage++; /* get length of name */
  106.             for (y = 0; y < 51; y++)
  107.                 if (y < x)
  108.                     {
  109.                     z = *pdirpage++;
  110.                     if (islower(z)) z = _toupper(z);
  111.                     pcurdirel->fname[y] = z;
  112.                     }
  113.                 else pcurdirel->fname[y] = 0x00;
  114.             numdirentry++;
  115.  
  116.             /* get file size */
  117.             pfhnumber = pdirpage;
  118.             fhnumber = *pfhnumber;
  119.             pcurdirel->fsize = 0l;
  120.             if (!openerc)
  121.                 {
  122.                 lfa = fhnumber;
  123.                 lfa *= 512l;
  124.                 erc = read(fhandle, pfileheader, 512, lfa, &z);
  125.                 if (!erc)
  126.                     {
  127.                     pfsize = pfileheader+111;
  128.                     pcurdirel->fsize = *pfsize;
  129.                     }
  130.                 }
  131.             pdirpage += 2;    /* burn bytes for fileheader */
  132.             pcurdirel++;    /* forward by 1 structure-length */
  133.             }
  134.         }
  135.     if (close(fhandle)) return(0);
  136.  
  137.     /* sort directory array */
  138.     qsort(pdirarray, numdirentry, 55, strcmp);
  139.  
  140.     /* print out directory entries */
  141.     printf("\377PN");        /* video pause on */
  142.     totalsize = 0;
  143.     pcurdirel = pdirarray;
  144.     printf(
  145.     "\nFilename                                          Length\n\n");
  146.     for (x = 0; x < numdirentry; x++)
  147.         {
  148.         printf("%s", pcurdirel->fname);
  149.         y = strlen(pcurdirel->fname);
  150.         if (y > 50) y = 50;
  151.         y = 51 - y;
  152.         for (z = 0; z < y; z++) printf(" ");
  153.         printf("%ld\n", pcurdirel->fsize);
  154.         totalsize += pcurdirel->fsize;
  155.         pcurdirel++;
  156.         }
  157.     printf("\n%d files, totalling %ld bytes\n",numdirentry,totalsize);
  158.     printf("\377PF");        /* video pause off */
  159.  
  160.     /* deallocate storage used */
  161.     if (deallocmemorysl(pfileheader, 512)) return(0);
  162.     if (deallocmemorysl(psavedirpage, 512)) return(0);
  163.     if (deallocmemorysl(pdirarray, sizedirarray)) return(0);
  164.     return(0);
  165. }
  166.