home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / UTILS / DIRUTL / SETDRU13.LBR / UNSETDRU.CQ / UNSETDRU.C
Text File  |  2000-06-30  |  3KB  |  102 lines

  1. /* unsetdru -- remove installation of setdru2                               */
  2.  
  3. #define NULL    0
  4. #define TRUE    1
  5. #define FALSE   0
  6.  
  7. /* declaration of structure for fcb            */
  8. struct fcb_ {
  9.             struct {
  10.                    char drive;        /* drive number */
  11.                    char fname[8];     /* file name */
  12.                    char ftype[3];     /* file type */
  13.                    char fext;         /* file extent */
  14.                    char filler[3];
  15.                    } name1, name2;
  16.             char crec;                /* current record */
  17.             int rrec;                 /* random record */
  18.             char rovf;                /* random record overflow */
  19.             };
  20.  
  21. #define FCB struct fcb_
  22.  
  23. #define BUFSIZE         (16*1024)
  24.  
  25. struct sdr {            char        s_fil1[3];      /* jp instruction */
  26.                         int         s_len;          /* length of module */
  27.                         unsigned    s_plen;         /* length of pgm */
  28.                         struct {    char    s_drive, s_user;
  29.                                     char    s_fname[8];
  30.                                     char    s_ftype[3];
  31.                                }    s_file[9];
  32.                         char        s_id[13];
  33.            };
  34.  
  35. extern FCB              dfcb_;
  36. extern struct sdr       dbuff_;
  37.  
  38. main()
  39. {
  40.   char                  buffer[BUFSIZE];
  41.   FCB                   outfcb;
  42.   static int            i;
  43.   static int            n;
  44.   static char           holdtype[3];
  45.   static char           *p, *q;
  46.   static int            eof;
  47.  
  48.   if (dfcb_.name1.fname[0] == ' ')
  49.     error("Syntax: unsetdru <filename>");
  50.  
  51.   for (i = 0; i < 11; ++i)
  52.     if (dfcb_.name1.fname[i] == '?')
  53.       error("ERROR: ambiguous file name not allowed.");
  54.  
  55.   strncpy(&outfcb, &dfcb_, sizeof(FCB));
  56.   strncpy(outfcb.name1.ftype, "$$$", 3);
  57.   strncpy(holdtype, dfcb_.name1.ftype, 3);
  58.  
  59.   if (open(&dfcb_) == 0xff)
  60.     error("ERROR: cannot open input file.");
  61.   setdma(&dbuff_);
  62.   if (rdseq(&dfcb_) || strncmp(dbuff_.s_id, "***SETDRU2***", 13) != 0)
  63.     error("ERROR: setdru not applied to input file.");
  64.   n = dbuff_.s_len;
  65.   for (i = 128; i < n; i += 128)
  66.     if (rdseq(&dfcb_))
  67.       error("ERROR: unexpected EOF on input");
  68.  
  69.   delete(&outfcb);
  70.   if (make(&outfcb) == 0xff)
  71.     error("ERROR: cannot create output file.");
  72.  
  73.   do
  74.   {
  75.     for (p = buffer; p < buffer + BUFSIZE; p += 128)
  76.     {
  77.       setdma(p);
  78.       if (eof = rdseq(&dfcb_))
  79.         break;
  80.     }
  81.     for (q = buffer; q < p; q += 128)
  82.     {
  83.       setdma(q);
  84.       if (wrseq(&outfcb))
  85.         error("ERROR: output error.");
  86.     }
  87.   } while (!eof);
  88.  
  89.   close(&dfcb_);
  90.   close(&outfcb);
  91.   strncpy(outfcb.name2.fname, outfcb.name1.fname, 8);
  92.   strncpy(outfcb.name2.ftype, holdtype, 3);
  93.   for (i = 0; i < 11; ++i)
  94.   {
  95.     outfcb.name1.fname[i] &=0x7f;
  96.     outfcb.name2.fname[i] &=0x7f;
  97.   }
  98.   delete(&dfcb_);
  99.   if (rename(&outfcb) == 0xff)
  100.     error("ERROR: cannot rename output.");
  101. }
  102.