=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/file.c,v retrieving revision 1.7 retrieving revision 1.10 diff -u -p -r1.7 -r1.10 --- OpenXM_contrib2/asir2000/builtin/file.c 2000/11/08 06:21:17 1.7 +++ OpenXM_contrib2/asir2000/builtin/file.c 2000/11/13 01:48:12 1.10 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/builtin/file.c,v 1.6 2000/08/25 08:06:19 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/file.c,v 1.9 2000/11/10 08:28:52 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -57,6 +57,7 @@ #if defined(VISUAL) #include +#include /* #define ECGEN_KEYNAME "SoftWare\\Fujitsu\\WinECgen\\1.00.000" */ #define ECGEN_KEYNAME "SoftWare\\Fujitsu\\FSEcParamGen\\V1.0L10" #define ASIR_KEYNAME "SoftWare\\Fujitsu\\Asir\\1999.03.31" @@ -70,15 +71,18 @@ void Pload(), Pwhich(), Ploadfiles(), Poutput(); void Pbsave(), Pbload(), Pbload27(); void Pbsave_compat(), Pbload_compat(); void Pbsave_cmo(), Pbload_cmo(); -void Popen_file(), Pclose_file(), Pget_line(); +void Popen_file(), Pclose_file(), Pget_line(), Pget_byte(); +void Ppurge_stdin(); extern int des_encryption; extern char *asir_libdir; struct ftab file_tab[] = { + {"purge_stdin",Ppurge_stdin,0}, {"open_file",Popen_file,1}, {"close_file",Pclose_file,1}, - {"get_line",Pget_line,1}, + {"get_byte",Pget_byte,1}, + {"get_line",Pget_line,-1}, {"remove_file",Premove_file,1}, {"access",Paccess,1}, {"load",Pload,-1}, @@ -102,6 +106,13 @@ struct ftab file_tab[] = { static FILE *file_ptrs[BUFSIZ]; +void Ppurge_stdin(rp) +Q *rp; +{ + purge_stdin(stdin); + *rp = 0; +} + void Popen_file(arg,rp) NODE arg; Q *rp; @@ -131,7 +142,7 @@ Q *rp; { int i; - asir_assert(ARG0(arg),O_N,"open_file"); + asir_assert(ARG0(arg),O_N,"close_file"); i = QTOS((Q)ARG0(arg)); if ( file_ptrs[i] ) { fclose(file_ptrs[i]); @@ -149,8 +160,22 @@ STRING *rp; FILE *fp; fpos_t head; char *str; + char buf[BUFSIZ]; - asir_assert(ARG0(arg),O_N,"open_file"); + if ( !arg ) { +#if defined(VISUAL_LIB) + get_string(buf,sizeof(buf)); +#else + fgets(buf,sizeof(buf),stdin); +#endif + i = strlen(buf); + str = (char *)MALLOC_ATOMIC(i+1); + strcpy(str,buf); + MKSTR(*rp,str); + return; + } + + asir_assert(ARG0(arg),O_N,"get_line"); i = QTOS((Q)ARG0(arg)); if ( fp = file_ptrs[i] ) { if ( feof(fp) ) { @@ -180,6 +205,26 @@ STRING *rp; error("get_line : invalid argument"); } +void Pget_byte(arg,rp) +NODE arg; +Q *rp; +{ + int i,c; + FILE *fp; + + asir_assert(ARG0(arg),O_N,"get_byte"); + i = QTOS((Q)ARG0(arg)); + if ( fp = file_ptrs[i] ) { + if ( feof(fp) ) { + STOQ(-1,*rp); + return; + } + c = getc(fp); + STOQ(c,*rp); + } else + error("get_byte : invalid argument"); +} + void Pload(arg,rp) NODE arg; Q *rp; @@ -589,3 +634,17 @@ Q *rp; else *rp = 0; } + +#if defined(VISUAL) +int process_id() +{ + return GetCurrentProcessId(); +} + +void call_exe(name,av) +char *name; +char **av; +{ + _spawnv(_P_WAIT,name,av); +} +#endif