/* Collection of code snippets by Arne Vajhøj */
/* (likely posted to comp.os.vms/INFO-VAX, INFO-TPU, MACRO32, eksperten.dk, newz.dk, LinkedIn or other place sometime between 1990 and now) */
#include <stdio.h>
#include <time.h>

#include <ssdef.h>
#include <descrip.h>
#include <starlet.h>
#include <lib$routines.h>

#define VMS2UNIX(t) ((t-0x007c95674beb4000)/10000000)
#define UNIX2VMS(t) (t*10000000LL+0x007c95674beb4000)
#define VMS2DAYS(t) (t/(24*60*60*10000000LL));
#define DAYS2VMS(t) (t*(24*60*60*10000000LL));

int main(int argc,char *argv[])
{
   long long int vmsnow;
   time_t unixnow;
   char buf[24];
   struct dsc$descriptor_s txtdesc;
   long int days;
   sys$gettim(&vmsnow);
   printf("%lld\n", vmsnow);
   txtdesc.dsc$w_length = sizeof(buf) - 1;
   txtdesc.dsc$b_dtype = DSC$K_DTYPE_T;
   txtdesc.dsc$b_class = DSC$K_CLASS_S;
   txtdesc.dsc$a_pointer = buf;
   sys$asctim(0, &txtdesc, &vmsnow, 0);
   buf[23] = '\0';
   printf("%s\n", buf);
   unixnow = VMS2UNIX(vmsnow);
   printf("%ld\n", unixnow);
   strftime(buf, sizeof(buf), "%d-%m-%Y %H:%M:%S",localtime(&unixnow));
   printf("%s\n", buf);
   vmsnow = UNIX2VMS(unixnow);
   printf("%lld\n", vmsnow);
   txtdesc.dsc$w_length = sizeof(buf) - 1;
   txtdesc.dsc$b_dtype = DSC$K_DTYPE_T;
   txtdesc.dsc$b_class = DSC$K_CLASS_S;
   txtdesc.dsc$a_pointer = buf;
   sys$asctim(0, &txtdesc, &vmsnow, 0);
   buf[23] = '\0';
   printf("%s\n", buf);
   lib$day(&days);
   printf("%ld\n", days);
   days = VMS2DAYS(vmsnow);
   printf("%ld\n", days);
   vmsnow = DAYS2VMS(days);
   printf("%lld\n", vmsnow);
   txtdesc.dsc$w_length = sizeof(buf) - 1;
   txtdesc.dsc$b_dtype = DSC$K_DTYPE_T;
   txtdesc.dsc$b_class = DSC$K_CLASS_S;
   txtdesc.dsc$a_pointer = buf;
   sys$asctim(0, &txtdesc, &vmsnow, 0);
   buf[23] = '\0';
   printf("%s\n", buf);
   unixnow = VMS2UNIX(vmsnow);
   strftime(buf, sizeof(buf), "%Y%m%d",localtime(&unixnow));
   printf("%s\n", buf);
   return SS$_NORMAL;
}
