home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / COMPRESS / ARC520S.ZIP / ARCSVC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1986-10-24  |  4.8 KB  |  111 lines

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