Exemple #1
0
void ps_remove(pageset_t ps, int page) {
  if (ps->npages == 0)
    return;
  int l = ps_pop(ps);
  if (l == page)
    return;
  for (int i = 0; i < ps->npages; i++)
    if (ps->data[i] == page) {
      ps->data[i] = l;
      return;
    }
  ps_push(ps, l);
}
Exemple #2
0
void Interactive(HPSCRIPTVM v)
{

#define MAXINPUT 1024
    PSChar buffer[MAXINPUT];
    PSInteger blocks =0;
    PSInteger string=0;
    PSInteger retval=0;
    PSInteger done=0;
    PrintVersionInfos();

    ps_pushroottable(v);
    ps_pushstring(v,_SC("quit"),-1);
    ps_pushuserpointer(v,&done);
    ps_newclosure(v,quit,1);
    ps_setparamscheck(v,1,NULL);
    ps_newslot(v,-3,PSFalse);
    ps_pop(v,1);

    while (!done)
    {
        PSInteger i = 0;
        scprintf(_SC("\nps>"));
        for(;;) {
            int c;
            if(done)return;
            c = getchar();
            if (c == _SC('\n')) {
                if (i>0 && buffer[i-1] == _SC('\\'))
                {
                    buffer[i-1] = _SC('\n');
                }
                else if(blocks==0)break;
                buffer[i++] = _SC('\n');
            }
            else if (c==_SC('}')) {blocks--; buffer[i++] = (PSChar)c;}
            else if(c==_SC('{') && !string){
                    blocks++;
                    buffer[i++] = (PSChar)c;
            }
            else if(c==_SC('"') || c==_SC('\'')){
                    string=!string;
                    buffer[i++] = (PSChar)c;
            }
            else if (i >= MAXINPUT-1) {
                scfprintf(stderr, _SC("ps : input line too long\n"));
                break;
            }
            else{
                buffer[i++] = (PSChar)c;
            }
        }
        buffer[i] = _SC('\0');

        if(buffer[0]==_SC('=')){
            scsprintf(ps_getscratchpad(v,MAXINPUT),(size_t)MAXINPUT,_SC("return (%s)"),&buffer[1]);
            memcpy(buffer,ps_getscratchpad(v,-1),(scstrlen(ps_getscratchpad(v,-1))+1)*sizeof(PSChar));
            retval=1;
        }
        i=scstrlen(buffer);
        if(i>0){
            PSInteger oldtop=ps_gettop(v);
            if(PS_SUCCEEDED(ps_compilebuffer(v,buffer,i,_SC("interactive console"),PSTrue))){
                ps_pushroottable(v);
                if(PS_SUCCEEDED(ps_call(v,1,retval,PSTrue)) &&  retval){
                    scprintf(_SC("\n"));
                    ps_pushroottable(v);
                    ps_pushstring(v,_SC("print"),-1);
                    ps_get(v,-2);
                    ps_pushroottable(v);
                    ps_push(v,-4);
                    ps_call(v,2,PSFalse,PSTrue);
                    retval=0;
                    scprintf(_SC("\n"));
                }
            }

            ps_settop(v,oldtop);
        }
    }
}
Exemple #3
0
void psstd_printcallstack(HPSCRIPTVM v)
{
    PSPRINTFUNCTION pf = ps_geterrorfunc(v);
    if(pf) {
        PSStackInfos si;
        PSInteger i;
        PSFloat f;
        const PSChar *s;
        PSInteger level=1; //1 is to skip this function that is level 0
        const PSChar *name=0;
        PSInteger seq=0;
        pf(v,_SC("\nCALLSTACK\n"));
        while(PS_SUCCEEDED(ps_stackinfos(v,level,&si)))
        {
            const PSChar *fn=_SC("unknown");
            const PSChar *src=_SC("unknown");
            if(si.funcname)fn=si.funcname;
            if(si.source)src=si.source;
            pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);
            level++;
        }
        level=0;
        pf(v,_SC("\nLOCALS\n"));

        for(level=0;level<10;level++){
            seq=0;
            while((name = ps_getlocal(v,level,seq)))
            {
                seq++;
                switch(ps_gettype(v,-1))
                {
                case OT_NULL:
                    pf(v,_SC("[%s] NULL\n"),name);
                    break;
                case OT_INTEGER:
                    ps_getinteger(v,-1,&i);
                    pf(v,_SC("[%s] %d\n"),name,i);
                    break;
                case OT_FLOAT:
                    ps_getfloat(v,-1,&f);
                    pf(v,_SC("[%s] %.14g\n"),name,f);
                    break;
                case OT_USERPOINTER:
                    pf(v,_SC("[%s] USERPOINTER\n"),name);
                    break;
                case OT_STRING:
                    ps_getstring(v,-1,&s);
                    pf(v,_SC("[%s] \"%s\"\n"),name,s);
                    break;
                case OT_TABLE:
                    pf(v,_SC("[%s] TABLE\n"),name);
                    break;
                case OT_ARRAY:
                    pf(v,_SC("[%s] ARRAY\n"),name);
                    break;
                case OT_CLOSURE:
                    pf(v,_SC("[%s] CLOSURE\n"),name);
                    break;
                case OT_NATIVECLOSURE:
                    pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
                    break;
                case OT_GENERATOR:
                    pf(v,_SC("[%s] GENERATOR\n"),name);
                    break;
                case OT_USERDATA:
                    pf(v,_SC("[%s] USERDATA\n"),name);
                    break;
                case OT_THREAD:
                    pf(v,_SC("[%s] THREAD\n"),name);
                    break;
                case OT_CLASS:
                    pf(v,_SC("[%s] CLASS\n"),name);
                    break;
                case OT_INSTANCE:
                    pf(v,_SC("[%s] INSTANCE\n"),name);
                    break;
                case OT_WEAKREF:
                    pf(v,_SC("[%s] WEAKREF\n"),name);
                    break;
                case OT_BOOL:{
                    PSBool bval;
                    ps_getbool(v,-1,&bval);
                    pf(v,_SC("[%s] %s\n"),name,bval == PSTrue ? _SC("true"):_SC("false"));
                             }
                    break;
                default: assert(0); break;
                }
                ps_pop(v,1);
            }
        }
    }
}