--- links-2.1pre14/builtin.c.orig 2003-04-30 10:41:30.000000000 +0200 +++ links-2.1pre14/builtin.c 2003-11-15 18:05:59.987606816 +0100 @@ -15,6 +15,10 @@ #undef __USE_XOPEN #include +#ifdef HAVE_SYS_TIME_H +#include +#endif + #ifdef JS #define PREFIX 0x40 @@ -704,17 +708,36 @@ */ static struct tm * casek; +static unsigned short casek_msec; int vartoint(lns*pna,js_context*context); +/* sets casek and casek_msec acc. to localtime */ +void casek_localtime(void) +{ time_t*cas=js_mem_alloc(sizeof(time_t)); +#ifdef HAVE_GETTIMEOFDAY + struct timeval *tv=js_mem_alloc(sizeof(struct timeval)); + int res; + if(!(res = gettimeofday(tv, NULL))) { + *cas=tv->tv_sec; + casek_msec=tv->tv_usec/1000; + } + js_mem_free(tv); + if(res) /* gettimeofday() failed, fallback to time() */ +#endif + { + time(cas); + casek_msec=0; + } + casek=localtime(cas); + js_mem_free(cas); +} + void sezer_zizalu(char*argv,js_context*context) { char*naargy=js_mem_alloc(strlen(argv)+2); - time_t*cas=js_mem_alloc(sizeof(time_t)); + casek_localtime(); strcpy(naargy,argv); strcat(naargy,"~"); - time(cas); - casek=localtime(cas); - js_mem_free(cas); #ifdef HAVE_STRPTIME if(naargy[0]>57)/*Je to mon,day,year...*/ { if(!strptime(naargy,"%h %d, %Y, %R:%S~",casek)) @@ -756,7 +779,6 @@ long pomint, pomint1=0, pomint2; long*pompointer; int i=0,j=0; - time_t*cas; char pomchar; plns*pomns; @@ -1237,18 +1259,20 @@ { sezer_zizalu((char*)pomarg->argument,context); js_mem_free(pomarg); } - else{ pomint1=to32int(pomarg,context); + else{ float pomf=rint(tofloat(pomarg,context)); + /* can be >32 bits */ if(!(pomarg=getarg(&argy))) - {/* pomint=to32int(pomarg,context);*/ - time_t t = (time_t)pomint1; + { + /* milliseconds since Epoch */ + time_t t = (time_t)(pomf/1000); casek=localtime(&t); + casek_msec=((long long)pomf)%1000; /* Je to doba od usvitu dejin a aby toho nebylo malo tak v sekundach :-( */ } else - { cas=js_mem_alloc(sizeof(time_t)); - time(cas); - casek=localtime(cas); - js_mem_free(cas); + { + pomint1=(int)pomf; + casek_localtime(); casek->tm_year=pomint1; casek->tm_mon=to32int(pomarg,context); if((pomarg=getarg(&argy))) @@ -1263,10 +1287,8 @@ js_error("Missing day!",context); } } - } else{ cas=js_mem_alloc(sizeof(time_t)); - *cas=time(0); - casek=localtime(cas); - js_mem_free(cas); + } else{ + casek_localtime(); if(pomarg) delarg(pomarg,context); } /* Hopla mizero - a mame casek */ @@ -1297,10 +1319,17 @@ BUILDFCE("getSeconds",CgetSeconds); pomvar->handler=(long)pompointer; BUILDFCE("setTime",CsetTime); - pomvar->handler=casek->tm_sec; - pompointer=&pomvar->handler; + /* float because (long) int is too small on 32-bit machines */ + pomfloat=js_mem_alloc(sizeof(float)); + *pomfloat=((float)mktime(casek))*1000 + casek_msec; + /* embed it in variable to avoid memory leaks - is any better way? */ + pomvar1=buildin("settimetempval",context->namespace,context->lnamespace,context); + pomvar1->type=INTVAR; + pomvar1->value=pomvar->mid=0; + pomvar1->handler=(long)pomfloat; + pomvar->handler=(long)pomfloat; BUILDFCE("getTime",CgetTime); - pomvar->handler=(long)pomns; + pomvar->handler=(long)pomfloat; BUILDFCE("setYear",CsetYear); pomvar->handler=casek->tm_year; pompointer=&(pomvar->handler); @@ -2211,13 +2240,14 @@ idebug("CsetTime called "); if(!(pomarg=getarg(&argy))) js_error("setTime function requires argument!",context); - else variable->handler=to32int(pomarg,context); + else *(float*)(variable->handler)=tofloat(pomarg,context); idebug("and exited!\n"); break; case CgetTime: idebug("CgetTime called "); - rettype=INTEGER; - retval=*(long*)variable->handler; + rettype=FLOAT; + retval=(long)js_mem_alloc(sizeof(float)); + *(float*)retval=*(float*)variable->handler; idebug("and exited!\n"); break; case CsetYear: