home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 225_01 / cntfil.c < prev    next >
Text File  |  1987-06-10  |  7KB  |  185 lines

  1. /*-----------------------------------------------------------------*/
  2. /*
  3.          Programme:     CNTFIL.C
  4.          ---------
  5.          Purpose:       Counts all the active files in all the User
  6.          -------        areas and displays a table of the count.
  7.  
  8.          Compiler:      BDS C V 1.50
  9.          --------
  10.          Written:       12/12/85
  11.          -------
  12.          Amended:       15/11/86
  13.          -------
  14.          Version:       1.1
  15.          -------
  16.  
  17.          Copyright 1986 - Cogar Computer Services Pty. Ltd.        */
  18. /*-----------------------------------------------------------------*/
  19. #include <bdscio.h>
  20. #include <pec.h>
  21. /*-----------------------------------------------------------------*/
  22. #define    VERSION "1.1\0"
  23. #define NAME    "CNTFIL\0"
  24. /*-----------------------------------------------------------------*/
  25.  
  26. main(argc, argv)    /* For Command Line processing             */
  27. int argc;
  28. char *argv[];
  29. {
  30. /*-----------------------------------------------------------------*/
  31. /*  Space reserved for variables used in programme                 */
  32. /*-----------------------------------------------------------------*/
  33.     int i, j, FD;
  34.     char c;
  35.     int CPM;    /* To check the CP/M Version number        */
  36.     char DRIVE;    /* The active drive                        */
  37.     char OLD_DRIVE;    /* The drive at start of programme         */
  38.     char OLD_USER;    /* The User No. at start of programme      */
  39.     char USER;    /* The User No. for this programme         */
  40.     int ALL, HID;
  41.     int DIRECTORY, sector, DIR, SYS;
  42.     struct dpb *THIS;    /* The disk parameter block        */
  43.     char DMA_BUF[128];    /* For information flow            */
  44.     int RECORDS;        /* In the Directory                */
  45.     char USERS[32];        /* To store the counts             */
  46. /*-----------------------------------------------------------------*/
  47.     pec_clear();    /* Universal routine                       */
  48.     printf("%s - Version %s\n",NAME, VERSION);
  49.     printf("Copyright 1986 - Cogar Computer Services Pty.Ltd.\n\n");
  50. /*-----------------------------------------------------------------*/
  51.     printf("This programme will count ALL files in ALL user areas\n");
  52.     printf("and display a table of the count split up into user\n");
  53.     printf("areas and into visible (DIR) and hidden (SYS) files.\n");
  54.     line();
  55. /*-----------------------------------------------------------------*/
  56. /*  First check the CP/M Version in use.   If it is less than
  57.     Version 2.0 then inform the user and terminate programme.      */
  58. /*-----------------------------------------------------------------*/
  59.  
  60.     CPM = get_cpm();    /* Obtain the CP/M version and No. */
  61.  
  62.     i = (CPM & 0xff) - 0x20; /* Mask off the MP/M bit          */
  63.  
  64.     if(i < 0)        /* Must be less than V 2.0         */
  65.     {
  66.     printf("This programme requires at least V 2.x of CP/M.\n");
  67.         printf("Sorry but it won't run for you.\n");
  68.         exit();
  69.     }
  70. /*-----------------------------------------------------------------*/
  71. /*  The CP/M Version is OK, so save the starting User No. and the
  72.     starting Drive No. in case either is changed later.            */
  73. /*-----------------------------------------------------------------*/
  74.     OLD_USER = user_id(0xff);
  75.     OLD_DRIVE = get_default() + 0x41;
  76.  
  77. /*-----------------------------------------------------------------*/
  78. /*  Now check the Command Line to see if a Drive Code was entered.
  79.     Other checks can also be used, as required but then it will be
  80.     necessary to change this coding.                               */
  81. /*-----------------------------------------------------------------*/
  82.     if(argc != 2)
  83.     {
  84.         printf("Please enter the DRIVE to check...A, B, C...\n");
  85.         DRIVE = toupper(getchar());
  86.     }
  87.     else DRIVE = toupper(argv[1][0]);
  88.     lines(2);
  89. /*-----------------------------------------------------------------*/
  90. /*  Check that the selected drive is available/on-line.   If not
  91.     then terminate the programme.   You may need to add a message
  92.     about what is going on if your version of CP/M doesn't do
  93.     this automatically, as mine does.                              */
  94. /*-----------------------------------------------------------------*/
  95.     if(select_dsk(DRIVE) != 0)
  96.         exit();
  97. /*-----------------------------------------------------------------*/
  98.     for(i = 0; i < 32; i++)
  99.         USERS[i] = 0;    /* Initialise the counters         */
  100. /*-----------------------------------------------------------------*/
  101. /*  Get the values needed in the programme.                        */
  102. /*-----------------------------------------------------------------*/
  103.  
  104.     THIS = dpb_adr();
  105. /*    RECORDS = (THIS->DRM + 1) >> 2;                            */
  106.     RECORDS = THIS->SPT;
  107.     DIRECTORY = THIS->OFF;        /* First Directory track   */
  108.  
  109. /*-----------------------------------------------------------------*/
  110. /*  Now read the directory sectors into the DMA buffer.            */
  111. /*  And count the active entries.                                  */
  112. /*-----------------------------------------------------------------*/
  113.     pec_clear();
  114.     header();
  115.     printf("Summary of files in directory of Drive - %c.\n", DRIVE);
  116.  
  117.     set_trk(DIRECTORY);        /* Starting values         */
  118.     sector = ALL = HID = 0;
  119.     setdma(DMA_BUF);
  120.  
  121. for(i = 0; i < RECORDS; i++)
  122. {
  123.     if(i == THIS->SPT)
  124.     {
  125.         DIRECTORY++;
  126.         set_trk(DIRECTORY);
  127.         sector = 0;
  128.     }
  129.     set_sec(sector);
  130.     if(read_sec() == 1)
  131.     {
  132.         printf("Error reading directory");
  133.         exit();
  134.     }
  135.  
  136.     for(j = 0; j < 4; j++)
  137.     {
  138.         USER = DMA_BUF[j*32];
  139.  
  140.     if(USER != 0xe5 && DMA_BUF[j*32 + 12] == 0    && DMA_BUF[j*32 + 10] < 128)
  141.     {
  142.             USERS[USER*2]++;
  143.             ALL++;
  144.     }
  145.     else if(USER != 0xe5 && DMA_BUF[j*32 + 12] == 0
  146.         && DMA_BUF[j*32 + 10] > 128)
  147.     {
  148.                 USERS[USER*2 + 1]++;
  149.                 HID++;
  150.     }
  151.     }
  152.     sector++;
  153. }
  154.     printf("User No.\tDir. Files\tHidden Files\tTotals\n");
  155.     for(i = 0; i < 16; i++)
  156.     {
  157. printf("%2d\t\t%3d\t\t%3d\t\t%3d\n", i,USERS[i*2],USERS[i*2 + 1], USERS[i*2] + USERS[i*2 + 1]);
  158.     }
  159.     lines(2);
  160.     printf("TOTALS\t\t %d\t\t  %d\t\t %d\n", ALL, HID, ALL + HID);
  161. /*-----------------------------------------------------------------*/
  162. /*  Before finishing return to the original User Area and Drive No.*/
  163. /*-----------------------------------------------------------------*/
  164.     user_id(OLD_USER);
  165.     if(select_dsk(OLD_DRIVE) != 0)
  166.     {
  167.         printf("\nUnable to return to starting drive.");
  168.         exit();
  169.     }
  170.     printf("\nDo you want to run another utility - Y/N.");
  171. if((FD = open("UTIL.COM", 0)) != 0 && (c = toupper(getchar())) == 'Y')
  172. {
  173.     close(FD);
  174.     exec("UTIL");
  175. }
  176.  
  177. }
  178. /*-----------------------------------------------------------------*/
  179. header()
  180. {
  181.     printf("COUNTFILE - Version 2.0\n");
  182.     printf("Copyright 1986 - Cogar Computer Services Pty. Ltd.\n\n");
  183. }
  184. /*-----------------------------------------------------------------*/
  185. ---------