=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/miscf.c,v retrieving revision 1.22 retrieving revision 1.27 diff -u -p -r1.22 -r1.27 --- OpenXM_contrib2/asir2000/builtin/miscf.c 2004/03/11 09:52:56 1.22 +++ OpenXM_contrib2/asir2000/builtin/miscf.c 2008/08/26 16:17:03 1.27 @@ -45,10 +45,11 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/builtin/miscf.c,v 1.21 2004/02/25 06:43:52 ohara Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/miscf.c,v 1.26 2006/02/08 02:11:19 noro Exp $ */ #include "ca.h" #include "parse.h" +#include #if !defined(VISUAL) && defined(DO_PLOT) #include #include @@ -57,8 +58,14 @@ #if defined(VISUAL) #include #include +#else +#include +#include #endif +void Pgetcwd(), Pchdir(); +void Pset_secure_mode(); +void Pset_secure_flag(); void Pquit(), Pdebug(), Pnmono(), Pnez(), Popt(), Pshell(), Pheap(); void Ptoplevel(); void Perror(), Perror3(), Pversion(), Pcopyright(), Pflist(), Pdelete_history(), Ppause(), Pxpause(); @@ -77,6 +84,12 @@ void Ptest(); void delete_history(int,int); struct ftab misc_tab[] = { +#if !defined(VISUAL) + {"pwd",Pgetcwd,0}, + {"chdir",Pchdir,1}, +#endif + {"set_secure_mode",Pset_secure_mode,-1}, + {"set_secure_flag",Pset_secure_flag,-2}, {"module_list",Pmodule_list,0}, {"remove_module",Premove_module,1}, {"module_definedp",Pmodule_definedp,1}, @@ -105,7 +118,6 @@ struct ftab misc_tab[] = { {"hex_dump",Phex_dump,2}, {"peek",Ppeek,1}, {"poke",Ppoke,2}, - {"test",Ptest,2}, #if !defined(VISUAL) && defined(DO_PLOT) {"xpause",Pxpause,0}, #endif @@ -115,6 +127,64 @@ struct ftab misc_tab[] = { {0,0,0}, }; +#if !defined(VISUAL) +void Pgetcwd(STRING *rp) +{ + char *r; + char buf[MAXPATHLEN]; + getcwd(buf, MAXPATHLEN); + r = (char *)MALLOC_ATOMIC(strlen(buf)+1); + strcpy(r,buf); + MKSTR(*rp,r); +} + +void Pchdir(NODE arg, Q *rp) +{ + char *dir = BDY((STRING)ARG0(arg)); + int status = chdir(dir); + STOQ(status,*rp); +} +#endif + +void Pset_secure_mode(NODE arg,Q *rp) +{ + int s; + if ( argc(arg) ) + setsecuremode(QTOS((Q)ARG0(arg))); + s = getsecuremode(); + STOQ(s,*rp); +} + +void Pset_secure_flag(NODE arg,Q *rp) +{ + int ac,s,status; + Obj f; + char *fname; + + ac = argc(arg); + if ( !ac ) + error("set_secure_flag : a function name must be specified"); + if ( ac == 2 ) + s = QTOS((Q)ARG1(arg)); + else + s = 1; + f = ARG0(arg); + if ( !f ) + error("set_secure_flag : invalid argument"); + switch ( OID(f) ) { + case O_STR: + fname = BDY((STRING)f); break; + case O_P: + fname = NAME(VR((P)f)); break; + default: + error("set_secure_flag : invalid argument"); break; + } + status = setsecureflag(fname,s); + if ( status < 0 ) + error("set_secure_flag : function not found"); + STOQ(s,*rp); +} + void Ptest(arg,rp) NODE arg; Q *rp; @@ -222,12 +292,11 @@ Q *rp; void Pquit(rp) pointer *rp; { - if ( !NEXT(asir_infile) ) - asir_terminate(2); + if ( asir_infile && NEXT(asir_infile) && asir_infile->ready_for_longjmp ) + LONGJMP(asir_infile->jmpbuf,1); else { closecurrentinput(); - if ( !asir_infile->fp && strcmp(asir_infile->name,"string") ) - asir_terminate(2); + asir_terminate(2); } *rp = 0; }