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); }
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); } } }
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); } } } }