home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 177.lha / DRes_v1.3 / src / timedate.c < prev   
Encoding:
C/C++ Source or Header  |  1988-04-28  |  3.7 KB  |  157 lines

  1.  
  2. /*
  3.  *  DATETOS.C
  4.  *
  5.  *  leap year:    every four years but 3 out of 4 century marks are not leap years
  6.  *        (2000 is) the year 0 was.  year&3==0 is
  7.  *  timestamp is since 1978
  8.  *
  9.  *  valid range:    Jan 1 1976    to  Dec 31 2099
  10.  */
  11.  
  12. #include <local/typedefs.h>
  13.  
  14. static char dim[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  15. static char *Month[12] = { "Jan","Feb","Mar","Apr","May","Jun","Jul",
  16.                "Aug","Sep","Oct","Nov","Dec" };
  17.  
  18. char *
  19. lDateToS(date, str, ctl)
  20. DATESTAMP *date;
  21. char *str;
  22. char *ctl;
  23. {
  24.     long days, years;
  25.     short leap, month;
  26.  
  27.     if (ctl == NULL)
  28.     ctl = "D M Y h:m:s";
  29.     days = date->ds_Days + 731;         /*    1976        */
  30.     years = days / (365*3+366);             /*  #quad yrs   */
  31.     days -= years * (365*3+366);
  32.     leap = (days < 366);                    /*  is a leap yr*/
  33.     years = 1976 + 4 * years;
  34.     if (!leap) {
  35.     days -= 366;
  36.     ++years;
  37.     }
  38.     years += days / 365;
  39.     days -= (days / 365) * 365;
  40.     for (month = 0; (month==1) ? (days >= 28 + leap) : (days >= dim[month]); ++month)
  41.     days -= (month==1) ? (28 + leap) : dim[month];
  42.     {
  43.     register short i = 0;
  44.     for (; *ctl; ++ctl) {
  45.         switch(*ctl) {
  46.         case 'h':
  47.         utos(str+i, 1, 2, date->ds_Minute / 60);
  48.         /*sprintf(str+i, "%02d", date->ds_Minute / 60);*/
  49.         break;
  50.         case 'm':
  51.         utos(str+i, 1, 2, date->ds_Minute % 60);
  52.         /*sprintf(str+i, "%02d", date->ds_Minute % 60);*/
  53.         break;
  54.         case 's':
  55.         utos(str+i, 1, 2, date->ds_Tick / 50 % 60);
  56.         /*sprintf(str+i, "%02d", date->ds_Tick / 50 % 60);*/
  57.         break;
  58.         case 'Y':
  59.         utos(str+i, 0, 4, years);
  60.         /*sprintf(str+i, "%ld", years);*/
  61.         break;
  62.         case 'M':
  63.         strcpy(str+i, Month[month]);
  64.         break;
  65.         case 'D':
  66.         utos(str+i, 0, 2, days+1);
  67.         /*sprintf(str+i,"%2ld", days+1);*/
  68.         break;
  69.         default:
  70.         str[i] = *ctl;
  71.         str[i+1] = 0;
  72.         break;
  73.         }
  74.         i += strlen(str+i);
  75.     }
  76.     }
  77.     return(str);
  78. }
  79.  
  80. utos(buf, zfill, flen, val)
  81. register char *buf;
  82. register short flen;
  83. {
  84.     buf[flen] = 0;
  85.     while (flen--) {
  86.     if (val)
  87.         buf[flen] = '0' + (val % 10);
  88.     else
  89.         buf[flen] = (zfill) ? '0' : ' ';
  90.     val /= 10;
  91.     }
  92. }
  93.  
  94. #define BTOC(bptr)    ((long)(bptr) << 2)
  95. #define CTOB(cptr)    ((long)(cptr) >> 2)
  96.  
  97. #ifndef ACTION_SET_DATE
  98. #define ACTION_SET_DATE 34
  99. #endif
  100.  
  101. typedef struct StandardPacket STDPKT;
  102. typedef struct MsgPort          MSGPORT;
  103.  
  104. extern void *AllocMem();
  105.  
  106. lSetFileDate(file, date)
  107. char *file;
  108. DATESTAMP *date;
  109. {
  110.     register STDPKT *packet;
  111.     register char   *buf;
  112.     register PROC   *proc;
  113.     long    result;
  114.     long    lock;
  115.  
  116.     {
  117.     register long flock = Lock(file, SHARED_LOCK);
  118.     register short i;
  119.     register char *ptr = file;
  120.  
  121.     if (flock == NULL)
  122.         return(NULL);
  123.     lock = ParentDir(flock);
  124.     UnLock(flock);
  125.     if (!lock)
  126.         return(NULL);
  127.     for (i = strlen(ptr) - 1; i >= 0; --i) {
  128.         if (ptr[i] == '/' || ptr[i] == ':')
  129.         break;
  130.     }
  131.     file += i + 1;
  132.     }
  133.     proc   = (PROC *)FindTask(NULL);
  134.     packet = (STDPKT   *)AllocMem(sizeof(STDPKT), MEMF_CLEAR|MEMF_PUBLIC);
  135.     buf = AllocMem(strlen(file)+2, MEMF_PUBLIC);
  136.     strcpy(buf+1,file);
  137.     buf[0] = strlen(file);
  138.  
  139.     packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
  140.     packet->sp_Pkt.dp_Link = &packet->sp_Msg;
  141.     packet->sp_Pkt.dp_Port = &proc->pr_MsgPort;
  142.     packet->sp_Pkt.dp_Type = ACTION_SET_DATE;
  143.     packet->sp_Pkt.dp_Arg1 = NULL;
  144.     packet->sp_Pkt.dp_Arg2 = (long)lock;        /*  lock on parent dir of file  */
  145.     packet->sp_Pkt.dp_Arg3 = (long)CTOB(buf);   /*  BPTR to BSTR of file name   */
  146.     packet->sp_Pkt.dp_Arg4 = (long)date;        /*  APTR to datestamp structure */
  147.     PutMsg(((LOCK *)BTOC(lock))->fl_Task, packet);
  148.     WaitPort(&proc->pr_MsgPort);
  149.     GetMsg(&proc->pr_MsgPort);
  150.     result = packet->sp_Pkt.dp_Res1;
  151.     FreeMem(packet, sizeof(STDPKT));
  152.     FreeMem(buf, strlen(file)+2);
  153.     UnLock(lock);
  154.     return(result);
  155. }
  156.  
  157.