From f96da0ebe7637e6438d84e3d53794fa0d0818add Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Thu, 24 Oct 1996 19:16:05 -0700
Subject: [PATCH] some modifications done

Rev: lib/include/simulate.pre.pike:1.4
Rev: lib/include/stdio.pre.pike:1.3
Rev: src/modules/files/testsuite.in:1.3
---
 lib/include/simulate.pre.pike  |  44 +-----------
 lib/include/stdio.pre.pike     | 118 +++++++++++++++++++++++++++------
 src/modules/files/testsuite.in |  62 +++++++++++------
 3 files changed, 141 insertions(+), 83 deletions(-)

diff --git a/lib/include/simulate.pre.pike b/lib/include/simulate.pre.pike
index 7eddd6a32d..f49d5e5436 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 3e3abbaea0..21e7bef072 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 b40f90f69c..168cdeead3 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
-- 
GitLab