home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 020 / arcsourc.arc / ARCSVC.MAC < prev    next >
Encoding:
Text File  |  1985-11-10  |  6.0 KB  |  139 lines

  1. /*  ARC - Archive utility - ARCSVC
  2.  
  3. $define(tag,$$segment(@1,$$index(@1,=)+1))#
  4. $define(version,Version $tag(
  5. TED_VERSION DB =2.13), created on $tag(
  6. TED_DATE DB =11/10/85) at $tag(
  7. TED_TIME DB =10:34:53))#
  8. $undefine(tag)#
  9.     $version
  10.  
  11. (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
  12.  
  13.     By:  Thom Henderson
  14.  
  15.     Description:
  16.          This file contains service routines needed to maintain an archive.
  17.  
  18.     Language:
  19.          Computer Innovations Optimizing C86
  20. */
  21. #include <stdio.h>
  22. #include "arc.h"
  23.  
  24. openarc(chg)                           /* open archive */
  25. int chg;                               /* true to open for changes */
  26. {
  27.     FILE *fopen();                     /* file opener */
  28.  
  29.     if(!(arc=fopen(arcname,"rb")))
  30.     {    if(chg)
  31.               printf("Creating new archive: %s\n",arcname);
  32.          else abort("Cannot read archive: %s",arcname);
  33.     }
  34.  
  35.     if(chg)                            /* if opening for changes */
  36.          if(!(new=fopen(newname,"wb")))
  37.               abort("Cannot create archive copy: %s",newname);
  38. }
  39.  
  40. closearc(chg)                          /* close an archive */
  41. int chg;                               /* true if archive was changed */
  42. {
  43.     if(arc)                            /* if we had an initial archive */
  44.          fclose(arc);                  /* then close it */
  45.  
  46.     if(chg)                            /* if things have changed */
  47.     {    setstamp(new,arcdate,arctime);/* archive matches newest file */
  48.          fclose(new);                  /* close the new copy */
  49.  
  50.          if(arc)                       /* if we had an original archive */
  51.          {    if(keepbak)              /* if a backup is wanted */
  52.               {    unlink(bakname);    /* erase any old copies */
  53.                    if(rename(arcname,bakname))
  54.                         abort("Cannot rename %s to %s",arcname,bakname);
  55.                    printf("Keeping backup archive: %s\n",bakname);
  56.               }
  57.               else if(unlink(arcname))
  58.                    abort("Cannot delete old archive: %s",arcname);
  59.          }
  60.  
  61.          if(rename(newname,arcname))
  62.               abort("Cannot rename %s to %s",newname,arcname);
  63.     }
  64. }
  65.  
  66. int match(n,t)                         /* test name against template */
  67. char *n;                               /* name to test */
  68. char *t;                               /* template to test against */
  69. {
  70.     upper(n); upper(t);                /* avoid case problems */
  71.  
  72.     while(*n || *t)
  73.     {    if(*n!=*t && *t!='?')         /* match fail? */
  74.          {    if(*t!='*')              /* wildcard fail? */
  75.                    return 0;           /* then no match */
  76.               else                     /* else jump over wildcard */
  77.               {    while(*n && *n!='.')
  78.                         n++;
  79.                    while(*t && *t!='.')
  80.                         t++;
  81.               }
  82.          }
  83.          else                          /* match good for this char */
  84.          {    n++;                     /* advance to next char */
  85.               t++;
  86.          }
  87.     }
  88.     return 1;                          /* match worked */
  89. }
  90.  
  91. /* CRC computation logic
  92.  
  93.    The logic for this method of calculating the CRC 16 bit polynomial
  94.    is taken from an article by David Schwaderer in the April 1985
  95.    issue of PC Tech Journal.
  96. */
  97.  
  98. static int crctab[] =                  /* CRC lookup table */
  99. {   0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
  100.     0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
  101.     0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
  102.     0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
  103.     0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
  104.     0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
  105.     0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
  106.     0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
  107.     0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
  108.     0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
  109.     0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
  110.     0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
  111.     0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
  112.     0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
  113.     0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
  114.     0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
  115.     0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
  116.     0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
  117.     0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
  118.     0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
  119.     0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
  120.     0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
  121.     0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
  122.     0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
  123.     0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
  124.     0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
  125.     0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
  126.     0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
  127.     0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
  128.     0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
  129.     0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
  130.     0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
  131. };
  132.  
  133. int addcrc(crc,c)                      /* update a CRC check */
  134. int crc;                               /* running CRC value */
  135. unsigned char c;                       /* character to add */
  136. {
  137.     return ((crc>>8)&0x00ff) ^ crctab[(crc^c)&0x00ff];
  138. }
  139.