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

  1. /*-----------------------------------------------------------------*/
  2. /*  FILE NAME:      LISTFILE.C
  3.     ---------
  4.     VERSION:        1.4
  5.     -------
  6.     WRITTEN:        6th July, 1986
  7.     -------
  8.     MODIFIED:       13th July, 1986
  9.     --------        14th July, 1986
  10.                     1st August, 1986  -  Specify start page
  11.                     28/11/86  for UTIL programme                   */
  12.  
  13. /*  COPYRIGHT:      Cogar Computer Services Pty. Ltd.              */
  14. /*  ---------                                                      */
  15. /*                                                                 */
  16. /*  NOTE:           This programme is specifically written for     */
  17. /*  ----            BDS 'C' running under CP/M 2.2 and may need    */
  18. /*                  to be modified for other C's.                  */
  19. /*                                                                 */
  20. /*  PURPOSE:        Will list a text file on the line printer      */
  21. /*  -------         with page numbers and headings (the file name) */
  22. /*                  with a standard page length of 60 printed      */
  23. /*                  lines.   Note the equates may need to be       */
  24. /*                  changed if you are not using 66-line paper.    */
  25. /*                                                                 */
  26. /*  FUNCTIONS:      LISTC         Found in DEFF3                   */
  27. /*  ---------       ENTAB                                          */
  28. /*                                                                 */
  29. /*-----------------------------------------------------------------*/
  30. #include <bdscio.h>    /* See note, above                         */
  31. #include <pec.h>    /* Required for this file                  */
  32. /*-----------------------------------------------------------------*/
  33. #define VERSION "1.4"    /* The current Version No.                 */
  34. /*-----------------------------------------------------------------*/
  35. /*  SPECIFIC CONSTANTS                                             */
  36. /*-----------------------------------------------------------------*/
  37. #define SECTORS 64    /* Sectors in an 8K printer buffer         */
  38. #define PAGE_LENGTH 66    /* For US sized paper                      */
  39. #define PAGE_TOP 5    /* No. of lines to leave after header      */
  40. #define PAGE_BOTTOM 10    /* No. of lines to skip after last line    */
  41. #define    LINES PAGE_LENGTH-(PAGE_TOP+PAGE_BOTTOM) /* lines per page */
  42. #define EOF 26        /* CP/M end of file (?)  CONTROL-Z         */
  43. /*-----------------------------------------------------------------*/
  44. int start_page;        /* The page from which to print    */
  45. /*-----------------------------------------------------------------*/
  46. main(argc, argv)
  47. char *argv[];
  48. int argc;
  49. {
  50.     int i, j, k, n, page_no;    /* counters                */
  51.     int TAB_WIDTH;
  52.     TAB_WIDTH = 8;        /* Normal tab size                 */
  53.     int c;                /* for listing             */
  54.     char dma[128];    /* The DMA buffer for BDOS functions       */
  55.     char printer_buf[SECTORS*128]; /* The printer buffer       */
  56.     char *list_char;    /* Pointer to listing character    */
  57.     char file_name[15];
  58.     char type[4];        /* To see what is the file type.   */
  59.     int FD;     /* The file descriptor                     */
  60.     int CPM;    /* To check the CP/M Version number        */
  61.     char DRIVE;    /* The active drive                        */
  62.     char OLD_DRIVE;    /* The drive at start of programme         */
  63.     char OLD_USER;    /* The User No. at start of programme      */
  64.     char USER;    /* The User No. for this programme         */
  65. /*-----------------------------------------------------------------*/
  66. /*    The programme starts here                                  */
  67. /*-----------------------------------------------------------------*/
  68.     pec_clear();    /* clear the screen                        */
  69.     header();
  70. /*-----------------------------------------------------------------*/
  71. /*  First check the CP/M Version in use.   If it is less than
  72.     Version 2.0 then inform the user and terminate programme.      */
  73. /*-----------------------------------------------------------------*/
  74.  
  75.     CPM = get_cpm();    /* Obtain the CP/M version and No. */
  76.  
  77.     i = (CPM & 0xff) - 0x20; /* Mask off the MP/M bit          */
  78.  
  79.     if(i < 0)        /* Must be less than V 2.0         */
  80.     {
  81.     printf("This programme requires at least V 2.x of CP/M.\n");
  82.         printf("Sorry but it won't run for you.\n");
  83.         exit();
  84.     }
  85. /*-----------------------------------------------------------------*/
  86. /*  The CP/M Version is OK, so save the starting User No. and the
  87.     starting Drive No. in case either is changed later.            */
  88. /*-----------------------------------------------------------------*/
  89.     OLD_USER = user_id(0xff);
  90.     OLD_DRIVE = get_default() + 0x41;
  91. /*-----------------------------------------------------------------*/
  92. /*  Now check the command line to see if a file name was entered.  */
  93. /*-----------------------------------------------------------------*/
  94.     if(argc != 2) {
  95.     printf("We need to know the name of the file you want to\
  96.  list.\n");
  97.     printf("Give this in the form - \n\n");
  98.     printf("          [d:]filename\n\n");
  99.     printf("where 'd:' is an optional drive name and filename is\
  100.  specific.\n\n");
  101.     gets(file_name);
  102.     }
  103.  
  104.     else strcpy(file_name, argv[1]);
  105.     up_str(file_name);    /* Make sure is upper case         */
  106.  
  107.     if(file_name[1] == ':')    /* Drive name given             */
  108.         DRIVE = file_name[0];
  109.     else DRIVE = OLD_DRIVE;
  110. /*-----------------------------------------------------------------*/
  111. /*  Check that the selected drive is available/on-line.   If not
  112.     then terminate the programme.   You may need to add a message
  113.     about what is going on if your version of CP/M doesn't do
  114.     this automatically, as mine does.                              */
  115. /*-----------------------------------------------------------------*/
  116.     if(select_dsk(DRIVE) != 0)
  117.         exit();
  118. /*-----------------------------------------------------------------*/
  119. /*  A file name has been obtained but, as this programme is only   */
  120. /*  ASCII files, we should at least check for things like "COM"    */
  121. /*  and "CRL" and "HEX" files.   Terminate the programme if any    */
  122. /*  of these is found to have been specified.                      */
  123. /*-----------------------------------------------------------------*/
  124.     i = j = 0;
  125.     while((c = file_name[i]) != '.' && i < 15)
  126.         i++;
  127.     i++;        /* Skip over the period                    */
  128.     while(c != '\0' && i < 15)
  129.     {
  130.         type[j] = file_name[i];
  131.         i++;
  132.         j++;
  133.     }
  134.  
  135.     if(!strcmp("COM",type))
  136.         message4(type);
  137.     else if(!strcmp("CRL",type))
  138.         message4(type);
  139.     else if(!strcmp("HEX",type))
  140.         message4(type);
  141.     else if(!strcmp("INT", type))
  142.         message4(type);
  143.     else if(!strcmp("OBJ", type))
  144.         message4(type);
  145.     else printf("\nWhat page will I start from - \n");
  146. /*-----------------------------------------------------------------*/
  147. /*  Get the starting page No.                                      */
  148. /*-----------------------------------------------------------------*/
  149.     scanf("%d", &start_page);
  150.     line();
  151.     printf("Now listing -  %s", file_name);
  152. /*-----------------------------------------------------------------*/
  153. /*  Now open the nominated file                                    */
  154. /*-----------------------------------------------------------------*/
  155.     if((FD = open(file_name, 0)) == -1)
  156.     {
  157.         printf("\nUnable to open  %s  file.", file_name);
  158.         user_id(OLD_USER);
  159.         if(select_dsk(OLD_DRIVE) != 0)
  160.             printf("\nUnable to return to starting drive.");
  161.         exit();
  162.     }
  163.  
  164.     else list_char = printer_buf;    /* point to buffer */
  165. /*-----------------------------------------------------------------*/
  166. /*  File has been opened, so print the page top                    */
  167. /*-----------------------------------------------------------------*/
  168.     page_no = 1;        /* Starting value                  */
  169.     if(page_no >= start_page)
  170.         put_top(file_name,page_no);
  171.     n = 0;    /* Zero the line counter                           */
  172.     k = 0;    /* Zero line-character counter                     */
  173.     list_char = printer_buf;    /* Point to data to list   */
  174.  
  175.     while((i = read(FD,printer_buf,SECTORS)) != 0)
  176.     {
  177.         j = 0;