view xt.c @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500
parents
children
line wrap: on
line source

/* Copyright 1990-2011, Jsoftware Inc.  All rights reserved. */
/* License in license.txt.                                   */
/*                                                                         */
/* Xenos: time and space                                                   */

#ifdef _WIN32
#include <windows.h>
#include <winbase.h>
#endif

#include "j.h"

#if !SY_WINCE && (SY_WIN32 || (SYS & SYS_LINUX))
#include <time.h>
#else
#if (SY_GETTOD && !(SYS&SYS_IBMRS6000))
#include <sys/time.h>
#endif
#endif

#if !SY_WIN32 && (SYS & SYS_DOS)
#include <dos.h>
#endif

#ifndef CLOCKS_PER_SEC
#if (SYS & SYS_UNIX)
#define CLOCKS_PER_SEC  1000000
#endif
#ifdef  CLK_TCK
#define CLOCKS_PER_SEC  CLK_TCK
#endif
#endif


F1(jtsp){ASSERTMTV(w); R sc(jt->bytes);}

F1(jtspit){A z;I k; 
 F1RANK(1,jtspit,0); 
 jt->bytesmax=k=jt->bytes;
 FDEPINC(1); z=exec1(w); FDEPDEC(1);
 RZ(z);
 R sc(jt->bytesmax-k);
}

F1(jtparsercalls){ASSERTMTV(w); R sc(jt->parsercalls);}


#if SY_WIN32
 /* defined in jdll.c */
#else
F1(jtts){A z;D*x;struct tm*t;struct timeval tv;
 ASSERTMTV(w);
 gettimeofday(&tv,NULL); t=localtime((time_t*)&tv.tv_sec);
 GA(z,FL,6,1,0); x=DAV(z);
 x[0]=t->tm_year+1900;
 x[1]=t->tm_mon+1;
 x[2]=t->tm_mday;
 x[3]=t->tm_hour;
 x[4]=t->tm_min;
 x[5]=t->tm_sec+(D)tv.tv_usec/1e6;
 R z;
}
#endif

F1(jtts0){A x,z;C s[9],*u,*v,*zv;D*xv;I n,q;
 RZ(w);
 ASSERT(1>=AR(w),EVRANK);
 RZ(x=ts(mtv));
 n=AN(w); xv=DAV(x);
 if(!n)R x;
 if(!(AT(w)&LIT))RZ(w=cvt(LIT,w));
 GA(z,LIT,n,AR(w),AS(w)); zv=CAV(z); memcpy(zv,CAV(w),n);
 q=0; v=zv; DO(n, if('Y'==*v++)++q;); u=2==q?s+2:s;
 sprintf(s,FMTI04,(I)xv[0]);             v=zv; DO(n, if(*v=='Y'){*v=*u++; if(!*u)break;} ++v;);
 sprintf(s,FMTI02,(I)xv[1]);        u=s; v=zv; DO(n, if(*v=='M'){*v=*u++; if(!*u)break;} ++v;);
 sprintf(s,FMTI02,(I)xv[2]);        u=s; v=zv; DO(n, if(*v=='D'){*v=*u++; if(!*u)break;} ++v;);
 sprintf(s,FMTI02,(I)xv[3]);        u=s; v=zv; DO(n, if(*v=='h'){*v=*u++; if(!*u)break;} ++v;);
 sprintf(s,FMTI02,(I)xv[4]);        u=s; v=zv; DO(n, if(*v=='m'){*v=*u++; if(!*u)break;} ++v;);
 sprintf(s,FMTI05,(I)(1000*xv[5])); u=s; v=zv; DO(n, if(*v=='s'){*v=*u++; if(!*u)break;} ++v;);
 R z;
}


#if SY_GETTOD
D tod(void){struct timeval t; gettimeofday(&t,NULL); R t.tv_sec+(D)t.tv_usec/1e6;}
#else
#if SY_WINCE
D tod(void){SYSTEMTIME t; GetLocalTime(&t); R t.wSecond+(D)t.wMilliseconds/1e3;}
#else
D tod(void){R(D)clock()/CLOCKS_PER_SEC;}
#endif
#endif


#if SY_WIN32

typedef LARGE_INTEGER LI;

static D qpm=4294967296.0;  /* 2^32 */

D qpf(void){LI n; QueryPerformanceFrequency(&n); R n.LowPart+qpm*n.HighPart;}

static D qpc(void){LI n; QueryPerformanceCounter(&n); R n.LowPart+qpm*n.HighPart;}

#else

D qpf(void){R (D)CLOCKS_PER_SEC;}

static D qpc(void){R tod()*CLOCKS_PER_SEC;}

#endif

/* 
// by Mark VanTassel from The Code Project

__int64 GetMachineCycleCount()
{      
   __int64 cycles;
   _asm rdtsc; // won't work on 486 or below - only pentium or above
   _asm lea ebx,cycles;
   _asm mov [ebx],eax;
   _asm mov [ebx+4],edx;
   return cycles;
}
*/


F1(jttss){ASSERTMTV(w); R scf(tod()-jt->tssbase);}

F2(jttsit2){A z;D t;I n,old;
 F2RANK(0,1,jttsit2,0);
 RE(n=i0(a));
 FDEPINC(1);
 t=qpc(); 
 old=jt->tbase+jt->ttop; DO(n, z=exec1(w); if(!z)break; tpop(old);); 
 t=qpc()-t;
 FDEPDEC(1);
 RZ(z);
 R scf(n?t/(n*pf):0);
}

F1(jttsit1){R tsit2(one,w);}

#ifdef _WIN32
#define sleepms(i) Sleep(i)
#else
#define sleepms(i) sleep((i+500)/1000)
#endif

F1(jtdl){D m,n,*v;UINT ms,s;
 RZ(w=cvt(FL,w));
 n=0; v=DAV(w); DO(AN(w), m=*v++; ASSERT(0<=m,EVDOMAIN); n+=m;);
 s=(UINT)jfloor(n); ms=(UINT)jfloor(0.5+1000*(n-s));
#if SYS & SYS_MACINTOSH
 {I t=TickCount()+(I)(60*n); while(t>TickCount())JBREAK0;}
#else
 DO(s, sleepms(1000); JBREAK0;);
 sleepms(ms);
#endif
 R w;
}


F1(jtqpfreq){ASSERTMTV(w); R scf(pf);}

F1(jtqpctr ){ASSERTMTV(w); R scf(qpc());}

F1(jtpmctr){D x;I q;
 RE(q=i0(w));
 ASSERT(jt->pma,EVDOMAIN);
 x=q+(D)jt->pmctr;
 ASSERT(IMIN<=x&&x<=IMAX,EVDOMAIN);
 jt->pmctr=q=(I)x; 
 R sc(q);
}    /* add w to pmctr */

static F1(jtpmfree){A x,y;C*c;I m;PM*v;PM0*u;
 if(w){
  c=CAV(w); u=(PM0*)c; v=(PM*)(c+sizeof(PM0)); 
  m=u->wrapped?u->n:u->i; 
  DO(m, x=v->name; if(x&&NAME==AT(x)&&AN(x)==*AS(x))fa(x); 
        y=v->loc;  if(y&&NAME==AT(y)&&AN(y)==*AS(y))fa(y); ++v;);
  fa(w);
 }
 R one;
}    /* free old data area */

F1(jtpmarea1){R pmarea2(vec(B01,2L,&zeroZ),w);}

F2(jtpmarea2){A x;B a0,a1,*av;C*v;I an,n=0,s=sizeof(PM),s0=sizeof(PM0),wn;PM0*u;
 RZ(a&&w);
 ASSERT(prokey, EVDOMAIN);
 RZ(a=cvt(B01,a)); 
 an=AN(a);
 ASSERT(1>=AR(a),EVRANK);
 ASSERT(2>=an,EVLENGTH);
 av=BAV(a); 
 a0=0<an?av[0]:0;
 a1=1<an?av[1]:0;
 RZ(w=vs(w));
 wn=AN(w);
 ASSERT(!wn||wn>=s+s0,EVLENGTH);
 x=jt->pma;
 jt->pmctr=0;
 jt->pma=wn?ra(w):0;
 RZ(pmfree(x));
 if(wn){
  v=CAV(w);
  jt->pmu=u=(PM0*)v; 
  jt->pmv=(PM*)(s0+v); 
  jt->pmrec=u->rec=a0;
  u->n=n=(wn-s0)/s; 
  u->i=0;
  u->s=jt->bytesmax=jt->bytes;
  u->trunc=a1; 
  u->wrapped=0;
 }
 R sc(n);
}

void jtpmrecord(J jt,A name,A loc,I lc,int val){A x,y;B b;PM*v;PM0*u;
 u=jt->pmu;
 v=jt->pmv+u->i;
 if(b=u->wrapped){x=v->name; y=v->loc;}
 ++u->i;
 if(u->i>u->n){u->wrapped=1; if(u->trunc){u->i=u->n; R;}else u->i=0;}
 v->name=name; if(name)++AC(name);
 v->loc =loc;  if(loc )++AC(loc ); if(b){fa(x); fa(y);}
 v->val =val;
 v->lc  =lc;
 v->s=jt->bytesmax-u->s;
 u->s=jt->bytesmax=jt->bytes;
#if SY_WIN32
 QueryPerformanceCounter((LI*)v->t);
#else
 {D d=tod(); MC(v->t,&d,sizeof(D));}
#endif
}

F1(jtpmunpack){A*au,*av,c,t,x,z,*zv;B*b;D*dv;I*iv,k,m,n,p,q,wn,*wv;PM*v,*v0,*vq;PM0*u;
 RZ(w);
 ASSERT(jt->pma,EVDOMAIN);
 if(!(INT&AT(w)))RZ(w=cvt(INT,w));
 wn=AN(w); wv=AV(w);
 u=(PM0*)AV(jt->pma); p=u->wrapped?u->n-u->i:0; q=u->i; n=p+q;
 GA(x,B01,n,1,0); b=BAV(x); memset(b,wn?C0:C1,n);
 if(wn){
  DO(wn, k=wv[i]; if(0>k)k+=n; ASSERT(0<=k&&k<n,EVINDEX); b[k]=1;);
  m=0; 
  DO(n, if(b[i])++m;);
 }else m=n;
 v0=jt->pmv; vq=q+v0;
 GA(z,BOX,1+PMCOL,1,0); zv=AAV(z);
 GA(t,BOX,2*m,1,0); av=AAV(t); au=m+av;
 v=vq; DO(p, if(b[  i]){RZ(*av++=v->name?sfn(0,v->name):mtv); RZ(*au++=v->loc?sfn(0,v->loc):mtv);} ++v;); 
 v=v0; DO(q, if(b[p+i]){RZ(*av++=v->name?sfn(0,v->name):mtv); RZ(*au++=v->loc?sfn(0,v->loc):mtv);} ++v;); 
 RZ(x=indexof(t,t));
 RZ(c=eq(x,IX(IC(x))));
 RZ(zv[6]=repeat(c,t));
 RZ(x=indexof(repeat(c,x),x)); iv=AV(x);
 RZ(zv[0]=vec(INT,m,  iv));
 RZ(zv[1]=vec(INT,m,m+iv));
 GA(t,INT,m,1,0); zv[2]=t; iv=AV(t); v=vq; DO(p, if(b[i])*iv++=(I)v->val;  ++v;); v=v0; DO(q, if(b[p+i])*iv++=(I)v->val; ++v;);
 GA(t,INT,m,1,0); zv[3]=t; iv=AV(t); v=vq; DO(p, if(b[i])*iv++=v->lc; ++v;); v=v0; DO(q, if(b[p+i])*iv++=v->lc; ++v;);
 GA(t,INT,m,1,0); zv[4]=t; iv=AV(t); v=vq; DO(p, if(b[i])*iv++=v->s;  ++v;); v=v0; DO(q, if(b[p+i])*iv++=v->s;  ++v;); 
 GA(t,FL, m,1,0); zv[5]=t; dv=DAV(t);
#if SY_WIN32
 v=vq; DO(p, if(b[i]  )*dv++=(((LI*)v->t)->LowPart+qpm*((LI*)v->t)->HighPart)/pf; ++v;);
 v=v0; DO(q, if(b[p+i])*dv++=(((LI*)v->t)->LowPart+qpm*((LI*)v->t)->HighPart)/pf; ++v;);
#else
 v=vq; DO(p, if(b[i]  ){MC(dv,v->t,sizeof(D)); ++dv;} ++v;); 
 v=v0; DO(q, if(b[p+i]){MC(dv,v->t,sizeof(D)); ++dv;} ++v;); 
#endif
 R z;
}

F1(jtpmstats){A x,z;I*zv;PM0*u;
 ASSERTMTV(w);
 GA(z,INT,6,1,0); zv=AV(z);
 if(x=jt->pma){
  u=(PM0*)AV(x);
  zv[0]=u->rec;
  zv[1]=u->trunc;
  zv[2]=u->n;
  zv[3]=u->wrapped?u->n:u->i;
  zv[4]=u->wrapped;
  zv[5]=jt->pmctr;
 }else zv[0]=zv[1]=zv[2]=zv[3]=zv[4]=zv[5]=0;
 R z;
}


F1(jttlimq){ASSERTMTV(w); R scf(0.001*jt->timelimit);}

F1(jttlims){D d;
 RZ(w);
 ASSERT(!AR(w),EVRANK);
 if(!(FL&AT(w)))RZ(w=cvt(FL,w));
 d=*DAV(w);
 ASSERT(0<=d,EVDOMAIN);
 ASSERT(IMAX>1000*d,EVLIMIT);
 jt->timelimit=(UI)(1000*d);
 R mtm;
}