/*->c.timex */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>

#include "h.os"
#include "h.bbc"
#include "h.wimp"
#include "h.swis"
#include "h.wimpt"

#include "h.fsx"

#include "h.timex"

/*****************************************************************************/

int monotonic(void)
{
 os_regset rx;
 os_swix(OS_ReadMonotonicTime,&rx);
 return(rx.r[0]);
}



/* get current time */

void getcurtime(arctime * time)
{
 os_error * errpoi;
 char       pblk[32];

 pblk[0]=3;
 errpoi=os_word(14,pblk);

 time->lo=*(unsigned int *)pblk;
 time->hi=pblk[4];
}



int filetime(fstat * f,arctime * t)
{
 if((f->load & 0xFFF00000)==0xFFF00000)   /* has time stamp */
 {
  t->lo=f->exec;
  t->hi=f->load & 0xFF;
  return(1);
 }
 else
  return(0);
}



/* return -1 f1<f2 1 if f1>f2 else 0 */

int cmptimes(fstat * f1,fstat * f2)
{
 arctime t1;
 arctime t2;
 int     t1true;
 int     t2true;

 t1true=filetime(f1,&t1);
 t2true=filetime(f2,&t2);

 if(!t1true && !t2true) return(0);
 else
 if(!t1true)            return(-1);
 else
 if(!t2true)            return(1);

 if(t1.hi==t2.hi)
 {
  if(t1.lo>t2.lo) return(1);
  else            return(-1);
 }
 else
 if(t1.hi>t2.hi) return(1);
 else            return(-1);
}



/* return -1 t1<t2 1 if t1>t2 else 0 */

int cmptimex(arctime * t1,arctime * t2)
{

 if(t1->hi==t2->hi)
 {
  if(t1->lo>t2->lo) return(1);
  else              return(-1);
 }
 else
 if(t1->hi>t2->hi) return(1);
 else              return(-1);
}


void addtimex(arctime * t,unsigned int delta,int inc)
{
 unsigned int oldlo;

 oldlo=t->lo;

 if(inc)
 {
  t->lo+=delta;
  if(t->lo<oldlo) t->hi++;
 }
 else
 {
  t->lo-=delta;
  if(t->lo>oldlo) t->hi--;
 }
}



void writets(char * string,char * format,arctime * timex)
{
 os_error * err;
 char       pblk[32];
 os_regset  rx;

 *(unsigned int *)pblk=timex->lo;
 pblk[4]=timex->hi;

 rx.r[0]=(int)pblk;
 rx.r[1]=(int)string;
 rx.r[2]=SYSDTLEN;
 rx.r[3]=(int)format;

 err=os_swix(OS_ConvertDateAndTime,&rx);
 if(err) strcpy(string,format);
}



void writedate(char * string,arctime * timex)
{
  /* Added %CE to include century in default date format */
 writets(string,"%ZDY %M3 %CE%YR%0",timex);
}


void writetime(char * string,arctime * timex)
{
 writets(string,"%Z12:%MI%AM%0",timex);
}



void writetimedate(char * string,arctime * timex)
{
  /* Added %CE to include century in default date format */
 writets(string,"%24:%MI:%SE %W3 %DY %M3 %CE%YR%0",timex);
}



char sysdstring[SYSDTLEN];
char syststring[SYSDTLEN];


void getsysdate(char * format,int d,int t)
{
 if(d && t) sprintf(format,"%s %s%%0",syststring,sysdstring);
 else
 if(t)      sprintf(format,"%s%%0",syststring);
 else       sprintf(format,"%s%%0",sysdstring);
}


void timexinitsys(char * d,char * t)
{
 char   progname[64];
 char * p;

 if(d) strcpy(sysdstring,d);
 else
 {
   /* Added %CE to include century in default date format */
  strcpy(sysdstring,"%ZDY %M3 %CE%YR");
  sprintf(progname,"%s$DateFormat",wimpt_programname());
  if((p=getenv(progname))!=NULL) strcpy(sysdstring,p);
 }

 if(t) strcpy(syststring,t);
 else
 {
  strcpy(syststring,"%Z12:%MI%AM");
  sprintf(progname,"%s$TimeFormat",wimpt_programname());
  if((p=getenv(progname))!=NULL) strcpy(syststring,p);
 }
}




void writesysst(char * string,int d,int t)
{
 arctime timex;
 char format[64];

 getcurtime(&timex);
 getsysdate(format,d,t);
 writets(string,format,&timex);
}



void writesystime(char * string)
{
 writesysst(string,0,1);
}



void writesysdate(char * string)
{
 writesysst(string,1,0);
}


void writesystimedate(char * string)
{
 writesysst(string,1,1);
}


void writefiletime(char * string,fstat * stat)
{
 arctime t;

 if(filetime(stat,&t))
   writetimedate(string,&t);
 else
   strcpy(string,"");
}


void writehms(char * str,int time)
{
 time=time/100;
 sprintf(str,"%02d:%02d:%02d",(time/3600) % 24,(time/60) % 60,time % 60);
}


