home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / cpm68k / arc68k.arc / ARCDOS.C < prev    next >
Text File  |  1987-11-27  |  5KB  |  153 lines

  1.  
  2. /*
  3.  *      arcdos.c        1.1
  4.  *
  5.  *      Author: Thom Henderson
  6.  *      Original System V port: Mike Stump
  7.  *      Enhancements, Bug fixes, and cleanup: Chris Seaman
  8.  *      Date: Fri Mar 20 09:57:02 1987
  9.  *      Last Mod.       3/21/87
  10.  *
  11.  */
  12.  
  13. /*
  14.  * ARC - Archive utility - ARCDOS
  15.  * 
  16.  * Version 1.43, created on 11/09/85 at 22:24:44
  17.  * 
  18.  * (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
  19.  * 
  20.  *     Description:
  21.  *          This file contains certain DOS level routines that assist
  22.  *          in doing fancy things with an archive, primarily reading and
  23.  *          setting the date and time last modified.
  24.  * 
  25.  *          These are, by nature, system dependant functions.  But they are
  26.  *          also, by nature, very expendable.
  27.  */
  28.  
  29. #include "arc.h"
  30.  
  31. #ifdef CPM68K
  32. #ifdef STRIDE400
  33. #include <time.h>
  34. #endif STRIDE400
  35. #else
  36. #include <time.h>
  37. #endif CPM68K
  38.  
  39. INT getstamp(f,date,xtime)              /* get a file's date/time stamp */
  40. FILE *f;                               /* file to get stamp from */
  41. unsigned INT *date, *xtime;             /* storage for the stamp */
  42. {
  43. #ifdef CPM68K
  44. #ifdef STRIDE400
  45.      static REALTIME tmbuf;
  46.  
  47.      uread(129,&tmbuf,0L,0L,4);
  48.      *date = ((tmbuf.year-88)<<9) + ((tmbuf.month)<<5) + tmbuf.date;
  49.      *xtime = (tmbuf.hours<<11) + (tmbuf.minutes<<5) + (tmbuf.seconds>>1);
  50.  
  51. #else /* not Stride 400 */
  52.     *date = 0; *xtime = 0;
  53. #endif STRIDE400
  54. #else /* not CP/M-68K */
  55.     struct tm *tmbuf;
  56.     long x, time();
  57.  
  58.     x = time(0L);
  59.     tmbuf = localtime(&x);
  60.     *date = ((tmbuf->tm_year-80)<<9) + ((tmbuf->tm_mon+1)<<5) + tmbuf->tm_mday;
  61.     *xtime = (tmbuf->tm_hour<<11) + (tmbuf->tm_min<<5) + (tmbuf->tm_sec>>1);
  62. #endif CPM68K
  63.  
  64. }
  65.  
  66.  
  67. struct utimbuf {
  68.     long      actime;
  69.     long      modtime;
  70. };
  71.  
  72. INT setstamp(file,date,time)           /* set a file's date/time stamp */
  73. char *file;                            /* file to set stamp on */
  74. unsigned INT date, time;               /* desired date, time */
  75. {
  76. #ifndef CPM68K
  77.     struct utimbuf times;
  78.     struct tm *tmbuf;
  79.     long m_time;
  80.     int yr, mo, dy, hh, mm, ss, leap, days;
  81.  
  82.     /*
  83.      * These date conversions look a little wierd, so I'll explain.
  84.      * UNIX bases all file modification times on the number of seconds
  85.      * elapsed since Jan 1, 1970, 00:00:00 GMT.  Therefore, to maintain
  86.      * compatibility with MS-DOS archives, which date from Jan 1, 1980,
  87.      * with NO relation to GMT, the following conversions must be made:
  88.      *          the Year (yr) must be incremented by 10;
  89.      *          the Date (dy) must be decremented by 1;
  90.      *          and the whole mess must be adjusted by TWO factors:
  91.      *                  relationship to GMT (ie.,Pacific Time adds 8 hrs.),
  92.      *                  and whether or not it is Daylight Savings Time.
  93.      * Also, the usual conversions must take place to account for leap years,
  94.      * etc.
  95.      *                                     C. Seaman
  96.      */
  97.  
  98.     days = 0;
  99.     yr = (((date >> 9) & 0x7f) + 10);  /* dissect the date */
  100.     mo = ((date >> 5) & 0x0f);
  101.     dy = ((date & 0x1f) - 1);
  102.  
  103.     hh = ((time >> 11) & 0x1f);        /* dissect the time */
  104.     mm = ((time >> 5) & 0x3f);
  105.     ss = ((time & 0x1f) * 2);
  106.  
  107.     leap = ((yr+1970)/4);              /* Leap year base factor */
  108.  
  109.     /* How many days from 1970 to this year? */
  110.     days = (yr * 365) + (leap - 492);
  111.  
  112.     switch(mo)                         /* calculate expired days this year */
  113.     {
  114.     case 12:
  115.         days += 30;
  116.     case 11:
  117.         days += 31;
  118.     case 10:
  119.         days += 30;
  120.     case 9:
  121.         days += 31;
  122.     case 8:
  123.         days += 31;
  124.     case 7:
  125.         days += 30;
  126.     case 6:
  127.         days += 31;
  128.     case 5:
  129.         days += 30;
  130.     case 4:
  131.         days += 31;
  132.     case 3:
  133.         days += 28;                    /* account for leap years */
  134.         if ((leap * 4) == (yr+1970) && (yr+1970) != 2000)
  135.             ++days;
  136.     case 2:
  137.         days += 31;
  138.     }
  139.  
  140.     /* convert date & time to seconds relative to 00:00:00, 01/01/1970 */
  141.     m_time = ((days + dy) * 86400) + (hh * 3600) + (mm * 60) + ss;
  142.  
  143.     tmbuf = localtime(&m_time);        /* check for Daylight Savings Time */
  144.     if (tmbuf->tm_isdst != 0)
  145.         m_time -= 3600;
  146.  
  147.     m_time += timezone;                /* account for timezone differences */
  148.     times.actime = m_time;             /* set the stamp on the file */
  149.     times.modtime = m_time;
  150.     utime(file,×);
  151. #endif CPM68K
  152. }
  153.