home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / mtools / part02 / mtype.c < prev    next >
C/C++ Source or Header  |  1987-08-27  |  3KB  |  153 lines

  1. /*
  2.  * Display contents of a MSDOS file
  3.  *
  4.  * Emmet P. Gray            US Army, HQ III Corps & Fort Hood
  5.  * ...!ihnp4!uiucuxc!fthood!egray    Attn: AFZF-DE-ENV
  6.  *                     Directorate of Engineering & Housing
  7.  *                     Environmental Management Office
  8.  *                     Fort Hood, TX 76544-5057
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include "msdos.h"
  13.  
  14. int fd;                /* the file descriptor for the floppy */
  15. int dir_start;            /* starting sector for directory */
  16. int dir_len;            /* length of directory (in sectors) */
  17. int dir_entries;        /* number of directory entries */
  18. int dir_chain[25];        /* chain of sectors in directory */
  19. int clus_size;            /* cluster size (in sectors) */
  20. int fat_len;            /* length of FAT table (in sectors) */
  21. int num_clus;            /* number of available clusters */
  22. unsigned char *fatbuf;        /* the File Allocation Table */
  23. char *mcwd;            /* the Current Working Directory */
  24.  
  25. long size;
  26. long current;
  27. stripmode = 0;
  28. textmode = 0;
  29.  
  30. main(argc, argv)
  31. int argc;
  32. char *argv[];
  33. {
  34.     extern int optind;
  35.     extern char *optarg;
  36.     int fat, i, ismatch, entry, subdir(), c, oops;
  37.     char *filename, *newfile, text[4], tname[9], *getname(), *unixname();
  38.     char *strncpy(), *pathname, *getpath();
  39.     void exit();
  40.     struct directory *dir, *search();
  41.  
  42.     if (init(0)) {
  43.         fprintf(stderr, "mtype: Cannot initialize diskette\n");
  44.         exit(1);
  45.     }
  46.                     /* get command line options */
  47.     oops = 0;
  48.     while ((c = getopt(argc, argv, "st")) != EOF) {
  49.         switch(c) {
  50.             case 's':
  51.                 stripmode = 1;
  52.                 break;
  53.             case 't':
  54.                 textmode = 1;
  55.                 break;
  56.             default:
  57.                 oops = 1;
  58.                 break;
  59.         }
  60.     }
  61.  
  62.     if (oops || (argc - optind) < 1) {
  63.         fprintf(stderr, "Usage: mtype [-s|-t] <MSDOS file> [<MSDOS files...>]\n");
  64.         exit(1);
  65.     }
  66.  
  67.     for (i=optind; i<argc; i++) {
  68.         filename = getname(argv[i]);
  69.         pathname = getpath(argv[i]);
  70.         if (subdir(pathname))
  71.             continue;
  72.         ismatch = 0;
  73.         for (entry=0; entry<dir_entries; entry++) {
  74.             dir = search(entry);
  75.                     /* if empty */
  76.             if (dir->name[0] == NULL)
  77.                 break;
  78.                     /* if erased */
  79.             if (dir->name[0] == 0xe5)
  80.                 continue;
  81.                     /* if dir or volume lable */
  82.             if ((dir->attr & 0x10) || (dir->attr & 0x08))
  83.                 continue;
  84.             strncpy(tname, dir->name, 8);
  85.             strncpy(text, dir->ext, 3);
  86.             newfile = unixname(tname, text);
  87.                     /* see it if matches the pattern */
  88.             if (match(newfile, filename)) {
  89.                 fat = dir->start[1]*0x100 + dir->start[0];
  90.                 size = dir->size[2]*0x10000 + dir->size[1]*0x100 + dir->size[0];
  91.                 readit(fat);
  92.                 ismatch = 1;
  93.             }
  94.         }
  95.         if (!ismatch) {
  96.             fprintf(stderr, "mtype: File '%s' not found\n", filename);
  97.             continue;
  98.         }
  99.     }
  100.     close(fd);
  101.     exit(0);
  102. }
  103.  
  104. readit(fat)
  105. int fat;
  106. {
  107.     current = 0L;
  108.  
  109.     while (1) {
  110.         getcluster(fat);
  111.                     /* get next cluster number */
  112.         fat = getfat(fat);
  113.         if (fat == -1) {
  114.             fprintf(stderr, "mtype: FAT problem\n");
  115.             exit(1);
  116.         }
  117.                     /* end of cluster chain */
  118.         if (fat >= 0xff8)
  119.             break;
  120.     }
  121.     return;
  122. }
  123.  
  124. getcluster(num)                /* read a cluster */
  125. int num;
  126. {
  127.     int i, buflen, start;
  128.     void exit(), perror();
  129.     char buf[1024];
  130.  
  131.     start = (num - 2)*clus_size + dir_start + dir_len;
  132.     move(start);
  133.  
  134.     buflen = clus_size * MSECSIZ;
  135.     if (read(fd, buf, buflen) != buflen) {
  136.         perror("getcluster: read");
  137.         exit(1);
  138.     }
  139.                     /* stop at size not EOF marker */
  140.     for (i=0; i<buflen; i++) {
  141.         current++;
  142.         if (current > size) 
  143.             break;
  144.         if (textmode & buf[i] == '\r')
  145.             continue;
  146.         if (stripmode)
  147.             putchar(buf[i] & 0x7f);
  148.         else
  149.             putchar(buf[i]);
  150.     }
  151.     return;
  152. }
  153.