Files
TempleOS-Rijn/LT/APPS/TIMECLK.CPZ
T
2018-09-08 21:45:17 +02:00

165 lines
3.5 KiB
Plaintext

#define TIME_FILENAME "HOME/TIMEFILE.DTZ"
#define TET_EOF 0
#define TET_PUNCH_IN 1
#define TET_PUNCH_OUT 2
class TimeEntry
{
TimeEntry *next,*last;
LTDate d;
U1 type;
I1 *desc;
};
void ReadTimeFile(TimeEntry *header)
{
U1 *buf,*ptr,type;
TimeEntry *tempt;
LTDate *d;
buf=ReadFile(TIME_FILENAME);
if (!buf)
buf=MAllocZ(1);
header->next=header;
header->last=header;
ptr=buf;
while (type=*ptr++) {
tempt=MAllocZ(sizeof(TimeEntry));
tempt->type=type;
d=ptr;
ptr+=sizeof(LTDate);
tempt->d=*d;
tempt->desc=NewString(ptr);
ptr+=StrLen(ptr)+1;
InsQue(tempt,header->last);
}
Free(buf);
}
void WriteTimeFile(TimeEntry *header)
{
U1 *buf,*ptr;
TimeEntry *tempt;
LTDate *d;
U8 size=1; //for eof
tempt=header->next;
while (tempt!=header) {
size+=sizeof(U1)+sizeof(LTDate)+StrLen(tempt->desc)+1;
tempt=tempt->next;
}
buf=MAlloc(size);
ptr=buf;
tempt=header->next;
while (tempt!=header) {
*ptr++=tempt->type;
d=ptr;
*d=tempt->d;
ptr+=sizeof(LTDate);
StrCpy(ptr,tempt->desc);
ptr+=StrLen(tempt->desc)+1;
tempt=tempt->next;
}
*ptr=TET_EOF;
WriteFile(TIME_FILENAME,buf,size);
Free(buf);
}
void DelTimeEntries(TimeEntry *header)
{
TimeEntry *tempt=header->next,*tempt1;
while (tempt!=header) {
tempt1=tempt->next;
Free(tempt->desc);
Free(tempt);
tempt=tempt1;
}
Free(header);
}
public BoolU4 TimeRep(TimeEntry **header=NULL)
{
BoolU4 is_in=FALSE;
TimeEntry *tempt;
U8 week,cur_week,week_total=0;
TimeEntry *my_header=MAlloc(sizeof(TimeEntry));
if (header)
*header=my_header;
ReadTimeFile(my_header);
tempt=my_header->next;
while (tempt!=my_header) {
week=DivU8(tempt->d.date,7); //TODO
if (week!=cur_week) {
if (is_in)
week_total=week_total+GetCurTimeLTDate;
PrintF("Week Total:%h2T\r\n",week_total);
cur_week=week;
week_total=0;
}
if (tempt->type==TET_PUNCH_IN) {
PutS("$$FG RED$$IN ");
if (!is_in)
week_total=week_total-tempt->d;
is_in=TRUE;
} else {
PutS("$$FG RED$$OUT");
if (is_in)
week_total=week_total+tempt->d;
is_in=FALSE;
}
PrintF(" %h2D %T:$$FG$$\r\n%s\r\n",
tempt->d.date,tempt->d.time,tempt->desc);
tempt=tempt->next;
}
if (is_in)
week_total=week_total+GetCurTimeLTDate;
PrintF("$$FG RED$$Week Total:%h2T$$FG$$\r\n",week_total);
if (!header)
DelTimeEntries(my_header);
return is_in;
}
public void PunchOut()
{
BoolU4 is_in;
TimeEntry *tempt,*header;
is_in=TimeRep(&header);
if (!is_in) {
PutS("$$BK 1$$Already Punched-Out$$BK 0$$\r\n");
View;
} else {
tempt=MAlloc(sizeof(TimeEntry));
tempt->type=TET_PUNCH_OUT;
tempt->d=GetCurTimeLTDate;
PrintF("\r\nEnter Description:\r\n");
if (!(tempt->desc=SysGetS))
tempt->desc=MAllocZ(1);
InsQue(tempt,header->last);
WriteTimeFile(header);
}
DelTimeEntries(header);
}
public void PunchIn()
{
U4 is_in;
TimeEntry *tempt,*header;
is_in=TimeRep(&header);
if (is_in) {
PutS("$$BK 1$$Already Punched-In$$BK 0$$\r\n");
View;
} else {
tempt=MAlloc(sizeof(TimeEntry));
tempt->type=TET_PUNCH_IN;
tempt->d=GetCurTimeLTDate;
PrintF("\r\nEnter Description:\r\n");
if (!(tempt->desc=SysGetS))
tempt->desc=MAllocZ(1);
InsQue(tempt,header->last);
WriteTimeFile(header);
}
DelTimeEntries(header);
}