home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / dnet / dnet2.3.2 / amiga / suplib / timedate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-29  |  3.6 KB  |  162 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. #ifdef LATTICE
  15. #include <string.h>
  16. #endif
  17.  
  18. static char dim[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  19. static char *Month[12] = { "Jan","Feb","Mar","Apr","May","Jun","Jul",
  20.                "Aug","Sep","Oct","Nov","Dec" };
  21.  
  22. char *
  23. DateToS(date, str, ctl)
  24. DATESTAMP *date;
  25. char *str;
  26. char *ctl;
  27. {
  28.     long days, years;
  29.     short leap, month;
  30.  
  31.     if (ctl == NULL)
  32.     ctl = "D M Y h:m:s";
  33.     days = date->ds_Days + 731;         /*    1976        */
  34.     years = days / (365*3+366);             /*  #quad yrs   */
  35.     days -= years * (365*3+366);
  36.     leap = (days <= 365);                    /*  is a leap yr*/
  37.     years = 1976 + 4 * years;
  38.     if (leap == 0) {
  39.     days -= 366;
  40.     ++years;
  41.     years += days / 365;
  42.     days  %= 365;
  43.     }
  44.     for (month = 0; (month==1) ? (days >= 28 + leap) : (days >= dim[month]); ++month)
  45.     days -= (month==1) ? (28 + leap) : dim[month];
  46.     {
  47.     short i = 0;
  48.     for (; *ctl; ++ctl) {
  49.         switch(*ctl) {
  50.         case 'h':
  51.         utos(str+i, 1, 2, date->ds_Minute / 60);
  52.         /*sprintf(str+i, "%02d", date->ds_Minute / 60);*/
  53.         break;
  54.         case 'm':
  55.         utos(str+i, 1, 2, date->ds_Minute % 60);
  56.         /*sprintf(str+i, "%02d", date->ds_Minute % 60);*/
  57.         break;
  58.         case 's':
  59.         utos(str+i, 1, 2, date->ds_Tick / 50 % 60);
  60.         /*sprintf(str+i, "%02d", date->ds_Tick / 50 % 60);*/
  61.         break;
  62.         case 'Y':
  63.         utos(str+i, 0, 4, years);
  64.         /*sprintf(str+i, "%ld", years);*/
  65.         break;
  66.         case 'M':
  67.         strcpy(str+i, Month[month]);
  68.         break;
  69.         case 'D':
  70.         utos(str+i, 0, 2, days+1);
  71.         /*sprintf(str+i,"%2ld", days+1);*/
  72.         break;
  73.         default:
  74.         str[i] = *ctl;
  75.         str[i+1] = 0;
  76.         break;
  77.         }
  78.         i += strlen(str+i);
  79.     }
  80.     }
  81.     return(str);
  82. }
  83.  
  84. void
  85. utos(buf, zfill, flen, val)
  86. char *buf;
  87. short flen;
  88. short zfill;
  89. long val;
  90. {
  91.     buf[flen] = 0;
  92.     while (flen--) {
  93.     if (val)
  94.         buf[flen] = '0' + (val % 10);
  95.     else
  96.         buf[flen] = (zfill) ? '0' : ' ';
  97.     val /= 10;
  98.     }
  99. }
  100.  
  101. #ifndef ACTION_SET_DATE
  102. #define ACTION_SET_DATE 34
  103. #endif
  104.  
  105. typedef struct StandardPacket STDPKT;
  106. typedef struct MsgPort          MSGPORT;
  107.  
  108. extern void *AllocMem();
  109.  
  110. int
  111. SetFileDate(file, date)
  112. char *file;
  113. DATESTAMP *date;
  114. {
  115.     STDPKT *packet;
  116.     char   *buf;
  117.     PROC   *proc;
  118.     long    result;
  119.     long    lock;
  120.  
  121.     {
  122.     long flock = Lock(file, SHARED_LOCK);
  123.     short i;
  124.     char *ptr = file;
  125.  
  126.     if (flock == NULL)
  127.         return(NULL);
  128.     lock = ParentDir(flock);
  129.     UnLock(flock);
  130.     if (!lock)
  131.         return(NULL);
  132.     for (i = strlen(ptr) - 1; i >= 0; --i) {
  133.         if (ptr[i] == '/' || ptr[i] == ':')
  134.         break;
  135.     }
  136.     file += i + 1;
  137.     }
  138.     proc   = (PROC *)FindTask(NULL);
  139.     packet = (STDPKT   *)AllocMem(sizeof(STDPKT), MEMF_CLEAR|MEMF_PUBLIC);
  140.     buf = AllocMem(strlen(file)+2, MEMF_PUBLIC);
  141.     strcpy(buf+1,file);
  142.     buf[0] = strlen(file);
  143.  
  144.     packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
  145.     packet->sp_Pkt.dp_Link = &packet->sp_Msg;
  146.     packet->sp_Pkt.dp_Port = &proc->pr_MsgPort;
  147.     packet->sp_Pkt.dp_Type = ACTION_SET_DATE;
  148.     packet->sp_Pkt.dp_Arg1 = NULL;
  149.     packet->sp_Pkt.dp_Arg2 = (long)lock;        /*  lock on parent dir of file  */
  150.     packet->sp_Pkt.dp_Arg3 = (long)CTOB(buf);   /*  BPTR to BSTR of file name   */
  151.     packet->sp_Pkt.dp_Arg4 = (long)date;        /*  APTR to datestamp structure */
  152.     PutMsg((PORT *)((LOCK *)BTOC(lock))->fl_Task, (MSG *)packet);
  153.     WaitPort(&proc->pr_MsgPort);
  154.     GetMsg(&proc->pr_MsgPort);
  155.     result = packet->sp_Pkt.dp_Res1;
  156.     FreeMem(packet, sizeof(STDPKT));
  157.     FreeMem(buf, strlen(file)+2);
  158.     UnLock(lock);
  159.     return(result);
  160. }
  161.  
  162.