#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <time.h>
#include "kernel.h"
#include "swis.h"

#include "Wimpy.h" // some Wimp definitions

_kernel_swi_regs  SWIRegs;
#define SWI(swi)  SWIcall(swi,True,#swi,__FILE__,__LINE__)
#define SWIX(swi) SWIcall(swi,False,#swi,__FILE__,__LINE__)
#define SWIE(swi) SWIcall(-1,True,#swi,__FILE__,__LINE__)

// Call an SWI and abort in case of error...
// Call with SWI NULL to just abort
_kernel_oserror *SWIcall(int SWIName, int AbortOnError, char *AbortMessage, char *File, int Line) {
	_kernel_oserror *OSError;

	// Call the SWI (if I have one)
	if (SWIName != -1) {
		OSError = _kernel_swi(SWIName,&SWIRegs,&SWIRegs);
		if (OSError == NULL) { return(OSError); }
	}

	// In case of error write debug log and optionally abort
	if (AbortOnError) {
		SWIRegs.r[0] = (int)OSError;
		SWIRegs.r[1] = 1;
		SWIRegs.r[2] = (int)AbortMessage;
		_kernel_swi(Wimp_ReportError,&SWIRegs,&SWIRegs);
	}

	return(OSError);
}

void ShowDateTime(t_OSTimestamp *Timestamp) {

	t_DateTimeOrdinalBlock DateTime;
	int i;

	printf("\n");
	for (i=0;i<5;i++) { printf("%02X ",Timestamp->All[i]); }
	printf("\n");

	SWIRegs.r[0] = -1;
	SWIRegs.r[1] = (int)(Timestamp);
	SWIRegs.r[2] = (int)(&DateTime);
	SWIX(Territory_ConvertTimeToOrdinals);

	printf("TT.MM.YY HH:MM:SS %02d.%02d.%04d %02d:%02d:%02d\n",DateTime.Day,DateTime.Month,DateTime.Year,DateTime.Hour,DateTime.Minute,DateTime.Second);
}

t_Centiseconds Centiseconds(t_OSTimestamp *OSTimestamp) {
	t_Centiseconds c = 0;
	int i;
	
	for (i=4;i>=0;i--) {
		c = (c<<8) + (t_Centiseconds)(OSTimestamp->All[i]);
	}
	return(c);
}


int main (int argc, char *argv[]) {

	t_OSTimestamp Now;
	t_OSTimestamp Timestamp;
	char Path[] = "<obey$dir>.Some/zip";
	int load,exec,age;
	t_Centiseconds n,f,a;

	// Now
	printf("\nNow\n");
	SWIRegs.r[0] = 14;
	Now.All[0] = 3;
	SWIRegs.r[1] = (int)(&Now);
	SWIX(OS_Word);
	ShowDateTime(&Now);

	// A file
	// I do not check if the file has a datestamp; I assume it :-)
	printf("\nFile %s\n",Path);
	SWIRegs.r[0] = 17;
	SWIRegs.r[1] = (int)(&Path);
	SWIX(OS_File);
	load = SWIRegs.r[2];
	exec = SWIRegs.r[3];
	printf("Load/Exec %08X %08X\n",load,exec);
	Timestamp.Parts.High = (char)(load & 0xff);
	Timestamp.Parts.Low = exec;
	ShowDateTime(&Timestamp);

	printf("\n");
	n = Centiseconds(&Now);
	f = Centiseconds(&Timestamp);
	a = n-f;
	printf("Now:  %llu\n",n);
	printf("File: %llu\n",f);
	printf("Age:  %llu\n",a);
	age = (int)(a / (100 * 60 * 60 * 24));
	printf("Age:  %d days\n",age);

	// RISC OS or Unix/C functions
	printf("\nRISC OS vs. Unix/C functions\n");
	time_t nun;
	t_Centiseconds RiscUnisOffset = (t_Centiseconds)(220898880000);
	nun = (time_t)((Centiseconds(&Now)-RiscUnisOffset)/100);
	ShowDateTime(&Now);
	printf("%s\n", asctime(gmtime(&nun)));

	return 0;
}
