diff --git a/lib/include/simulate.pre.pike b/lib/include/simulate.pre.pike index 7eddd6a32db03eb8b62d88299c83d4ae6880a71c..f49d5e5436ee8c4611ea582691a5a7d3d02352ab 100644 --- a/lib/include/simulate.pre.pike +++ b/lib/include/simulate.pre.pike @@ -1,49 +1,12 @@ #include <process.h> #include <array.h> +#include <stdio.h> +#include <string.h> #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) ) -inherit "/precompiled/file"; inherit "/precompiled/regexp"; -string read_bytes(string filename,void|int start,void|int len) -{ - string ret; - if(!open(filename,"r")) - error("Couldn't open file "+filename+".\n"); - - switch(query_num_arg()) - { - case 1: - case 2: - len=0x7fffffff; - case 3: - seek(start); - } - ret=read(len); - close(); - return ret; -} - -int write_file(string filename,string what) -{ - int ret; - if(!open(filename,"awc")) - error("Couldn't open file "+filename+".\n"); - - ret=write(what); - close(); - return ret; -} - -int file_size(string s) -{ - int *stat; - stat=file_stat(s); - if(!stat) return -1; - return stat[1]; -} - varargs int member_array(mixed needle,mixed *haystack,int start) { return search(haystack,needle,start); @@ -96,7 +59,6 @@ void create() add_constant("PI",3.1415926535897932384626433832795080); add_constant("capitalize",capitalize); add_constant("explode",`/); - add_constant("file_size",file_size); add_constant("all_efuns",all_constants); add_constant("filter_array",filter); @@ -109,12 +71,10 @@ void create() add_constant("m_values",values); add_constant("member_array",member_array); add_constant("previous_object",previous_object); - add_constant("read_bytes",read_bytes); add_constant("regexp",regexp); add_constant("strstr",search); add_constant("sum",`+); add_constant("this_function",this_function); - add_constant("write_file",write_file); add_constant("add_efun",add_constant); add_constant("l_sizeof",sizeof); diff --git a/lib/include/stdio.pre.pike b/lib/include/stdio.pre.pike index 3e3abbaea0563c23688149937f11cb3dbe531065..21e7bef072d5b0f99f49628f019b8097978b2825 100644 --- a/lib/include/stdio.pre.pike +++ b/lib/include/stdio.pre.pike @@ -1,22 +1,7 @@ -inherit "/precompiled/file"; +#include <string.h> +object stderr=clone((program)"/precompiled/file","stderr"); #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) ) - -void perror(string s) -{ -#if efun(strerror) - write(s+": "+strerror(errno())+"\n"); -#else - write(s+": errno: "+errno()+"\n"); -#endif -} - -void create() -{ - file::create("stderr"); - add_constant("perror",perror); - - - master()->add_precompiled_program("/precompiled/FILE", class { +program FILE = class { #define BUFSIZE 16384 inherit "/precompiled/file"; @@ -138,5 +123,100 @@ void create() return b[bpos++]; } - }); + }; + +inherit "/precompiled/file"; + +string read_file(string filename,void|int start,void|int len) +{ + object buf,f; + string ret,tmp; + f=clone(FILE); + if(!f->open(filename,"r")) return 0; + + switch(query_num_arg()) + { + case 1: + ret=f->read(0x7fffffff); + break; + + case 2: + len=0x7fffffff; + case 3: + while(start-- && f->gets()); + buf=clone(String_buffer); + while(len-- && (tmp=f->gets())) + { + buf->append(tmp); + buf->append("\n"); + } + ret=buf->get_buffer(); + destruct(buf); + } + destruct(f); + + return ret; +} + +string read_bytes(string filename,void|int start,void|int len) +{ + string ret; + if(!open(filename,"r")) + return 0; + + switch(query_num_arg()) + { + case 1: + case 2: + len=0x7fffffff; + case 3: + seek(start); + } + ret=read(len); + close(); + return ret; +} + +int write_file(string filename,string what) +{ + int ret; + if(!open(filename,"awc")) + error("Couldn't open file "+filename+".\n"); + + ret=write(what); + close(); + return ret; +} + +int file_size(string s) +{ + int *stat; + stat=file_stat(s); + if(!stat) return -1; + return stat[1]; +} + +void perror(string s) +{ +#if efun(strerror) + stderr->write(s+": "+strerror(errno())+"\n"); +#else + stderr->write(s+": errno: "+errno()+"\n"); +#endif +} + +void create() +{ + add_constant("file_size",file_size); + add_constant("write_file",write_file); + add_constant("read_bytes",read_bytes); + add_constant("read_file",read_file); + add_constant("perror",perror); + + + master()->add_precompiled_program("/precompiled/FILE", FILE); + + add_constant("stdin",clone((program)"/precompiled/FILE","stdin")); + add_constant("stdout",clone(File,"stdout")); + add_constant("stderr",stderr); } diff --git a/src/modules/files/testsuite.in b/src/modules/files/testsuite.in index b40f90f69ca987ece6c880df554bc6a366e68520..168cdeead3617b84b14717ef0f220dee82310cd5 100644 --- a/src/modules/files/testsuite.in +++ b/src/modules/files/testsuite.in @@ -1,13 +1,12 @@ // tests for file module test_true(programp((program)"/precompiled/file")) -test_do(add_efun("FILE",(program)"/precompiled/file")) -test_true(programp(FILE)) +test_true(programp(File)) test_true(programp((program)"/precompiled/port")) -test_any(object o; o=clone(FILE); destruct(o); return 1,1) +test_any(object o; o=clone(File); destruct(o); return 1,1) // - file->open // - file->close -test_any(object o=clone(FILE); return o->open("conftest","wct") && o->close(),1) +test_any(object o=clone(File); return o->open("conftest","wct") && o->close(),1) // - file_stat test_eq(file_stat("conftest")[1],0) @@ -17,57 +16,57 @@ test_true(rm("conftest")) test_eq(file_stat("conftest"),0) // - file->write -test_any(int e; object o=clone(FILE); if(!o->open("conftest","wct")) return -1; e=o->write("sune"); if(!o->close()) return -1; return e,4) +test_any(int e; object o=clone(File); if(!o->open("conftest","wct")) return -1; e=o->write("sune"); if(!o->close()) return -1; return e,4) // - file->read -test_any(string s; object o=clone(FILE); if(!o->open("conftest","r")) return -1; s=o->read(4); if(!o->close()) return -1; return s,"sune") +test_any(string s; object o=clone(File); if(!o->open("conftest","r")) return -1; s=o->read(4); if(!o->close()) return -1; return s,"sune") -test_any(string s; object o=clone(FILE); if(!o->open("conftest","r")) return -1; s=o->read(999999); if(!o->close()) return -1; return s,"sune") +test_any(string s; object o=clone(File); if(!o->open("conftest","r")) return -1; s=o->read(999999); if(!o->close()) return -1; return s,"sune") -test_any(int e; object o=clone(FILE); if(!o->open("conftest","wct")) return -1; e=o->write(sprintf("%'+-*'100000s","")); if(!o->close()) return -1; return e,100000) +test_any(int e; object o=clone(File); if(!o->open("conftest","wct")) return -1; e=o->write(sprintf("%'+-*'100000s","")); if(!o->close()) return -1; return e,100000) -test_any(string s; object o=clone(FILE); if(!o->open("conftest","r")) return -1; s=o->read(9999999); if(!o->close()) return -1; return s,sprintf("%'+-*'100000s","")) +test_any(string s; object o=clone(File); if(!o->open("conftest","r")) return -1; s=o->read(9999999); if(!o->close()) return -1; return s,sprintf("%'+-*'100000s","")) // - file->seek // - file->tell -test_any(object o=clone(FILE); return o->open("conftest","r") && o->read(4711) && o->tell() == 4711 && o->close(),1) +test_any(object o=clone(File); return o->open("conftest","r") && o->read(4711) && o->tell() == 4711 && o->close(),1) // - file->stat -test_any(object o=clone(FILE); return equal(o->open("conftest","r") && o->stat(), file_stat("conftest")),1) +test_any(object o=clone(File); return equal(o->open("conftest","r") && o->stat(), file_stat("conftest")),1) // - file->errno -test_do(clone(FILE,"stdin")->errno()) +test_do(clone(File,"stdin")->errno()) // - file->set_nonblocking // - file->set_blocking // - file->set_id // - file->query_id -test_false(clone(FILE,"stdin")->query_id()) +test_false(clone(File,"stdin")->query_id()) -// - file->query_read_callback -test_do(clone(FILE,"stdin")->query_read_callback()) +// - File->query_read_callback +test_do(clone(File,"stdin")->query_read_callback()) // - file->query_write_callback -test_do(clone(FILE,"stdin")->query_write_callback()) +test_do(clone(File,"stdin")->query_write_callback()) // - file->query_close_callback -test_do(clone(FILE,"stdin")->query_close_callback()) +test_do(clone(File,"stdin")->query_close_callback()) // - file->open_socket // - file->connect // - file->query_address // - file->pipe -test_any([[object o=clone(FILE),o2=o->pipe();o->write("1"); return o2->read(1)]],"1") -test_any([[object o=clone(FILE),o2=o->pipe();o2->write("1"); return o->read(1)]],"1") +test_any([[object o=clone(File),o2=o->pipe();o->write("1"); return o2->read(1)]],"1") +test_any([[object o=clone(File),o2=o->pipe();o2->write("1"); return o->read(1)]],"1") // - file->dup -test_any([[object o=clone(FILE); o->open("conftest","r"); o=o->dup(); return o->read(100)]] ,sprintf("%'+-*'100s","")) +test_any([[object o=clone(File); o->open("conftest","r"); o=o->dup(); return o->read(100)]] ,sprintf("%'+-*'100s","")) // - file->assign -est_any([[object o=clone(FILE),o2=clone(FILE); o->open("conftest","r"); o2->assign(o); return o2->read(100)]] ,sprintf("%'+-*'100s","")) +est_any([[object o=clone(File),o2=clone(File); o->open("conftest","r"); o2->assign(o); return o2->read(100)]] ,sprintf("%'+-*'100s","")) // - file->dup2 -test_any([[object o=clone(FILE),o2=clone(FILE); o2->pipe(); o->open("conftest","r"); o->dup2(o2); return o2->read(100)]] ,sprintf("%'+-*'100s","")) +test_any([[object o=clone(File),o2=clone(File); o2->pipe(); o->open("conftest","r"); o->dup2(o2); return o2->read(100)]] ,sprintf("%'+-*'100s","")) test_eq(popen("echo foo"),"foo\n") @@ -100,3 +99,22 @@ test_true(stringp(strerror(2)||"")) ]]) +test_do(object o=clone(File); if(!o->open("conftest","wct")) return -1; o->write(strmult("foo\n",100)); o->close();) + +test_any([[ +#include <stdio.h> +return 0]],0) + +// /precompiled/FILE +test_any([[object o=clone(FILE); o->open("conftest","r"); return o->gets()]],"foo") +test_any(object o=clone(FILE); o->open("conftest","r"); return o->gets()+o->gets()+o->gets(),"foofoofoo") +test_any(int e; object o=clone(FILE); o->open("conftest","r"); for(e=0;e<100;e++) if(o->gets() != "foo") return e; return -1,-1) + +test_true(stdin) +test_true(stdout) +test_true(stderr) + +test_eq(read_file("conftest",0,5),strmult("foo\n",5)) +test_eq(read_file("conftest",1,5),strmult("foo\n",5)) +test_eq(read_file("conftest",100,5),"") +test_do(rm("conftest")) \ No newline at end of file