Skip to content
Snippets Groups Projects
Select Git revision
21 results Searching

Stdio.pmod

Blame
    • Fredrik Hübinette (Hubbe)'s avatar
      e42eafbc
      now works better with NT · e42eafbc
      Fredrik Hübinette (Hubbe) authored
      Rev: NT/tools/lib:1.3
      Rev: bin/test_pike.pike:1.5
      Rev: lib/modules/Stdio.pmod:1.7
      Rev: src/fdlib.c:1.2
      Rev: src/fdlib.h:1.2
      Rev: src/modules/Image/font.c:1.24
      Rev: src/modules/files/efuns.c:1.42
      Rev: src/modules/files/file.c:1.64
      Rev: src/modules/files/socket.c:1.21
      Rev: src/modules/files/testsuite.in:1.7
      Rev: src/port.c:1.14
      Rev: src/testsuite.in:1.63
      Rev: src/threads.c:1.50
      Rev: src/threads.h:1.24
      e42eafbc
      History
      now works better with NT
      Fredrik Hübinette (Hubbe) authored
      Rev: NT/tools/lib:1.3
      Rev: bin/test_pike.pike:1.5
      Rev: lib/modules/Stdio.pmod:1.7
      Rev: src/fdlib.c:1.2
      Rev: src/fdlib.h:1.2
      Rev: src/modules/Image/font.c:1.24
      Rev: src/modules/files/efuns.c:1.42
      Rev: src/modules/files/file.c:1.64
      Rev: src/modules/files/socket.c:1.21
      Rev: src/modules/files/testsuite.in:1.7
      Rev: src/port.c:1.14
      Rev: src/testsuite.in:1.63
      Rev: src/threads.c:1.50
      Rev: src/threads.h:1.24
    Stdio.pmod 3.88 KiB
    #include <string.h>
    import files;
    
    constant File=file;
    constant Port=port;
    
    object stderr=File("stderr");
    object stdout=File("stdout");
    
    #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) )
    class FILE {
    
    #define BUFSIZE 16384
        inherit File : file;
    
        /* Private functions / buffers etc. */
    
        private string b="";
        private int bpos=0;
    
        inline private static nomask int get_data()
        {
          string s;
          b = b[bpos .. ];
          bpos=0;
          s = file::read(BUFSIZE,1);
          if(!s || !strlen(s))
    	return 0;
          b += s;
          return 1;
        }
    
        inline private static nomask string extract(int bytes, int|void skip)
        {
          string s;
          s=b[bpos..bpos+bytes-1];
          bpos += bytes+skip;
          return s;
        }
    
    
        /* Public functions. */
        string gets()
        {
          int p,tmp=0;
          while((p=search(b, "\n", bpos+tmp)) == -1)
          {
    	tmp=strlen(b)-bpos;
    	if(!get_data()) return 0;
          }
          return extract(p-bpos, 1);
        }
    
        int seek(int pos)
        {
          bpos=0;
          b="";
          return file::seek(pos);
        }
    
        int tell()
        {
          return bpos;
        }
    
        int close(void|string mode)
        {
          bpos=0;
          b="";
          if(!mode) mode="rw";
          file::close(mode);
        }
    
        int open(string file, void|string mode)
        {
          bpos=0;
          b="";
          if(!mode) mode="rwc";
          return file::open(file,mode);
        }
    
        int open_socket()
        {
          bpos=0;
          b="";
          return file::open_socket();
        }
    
        object pipe()
        {
          bpos=0;
          b="";
          return file::pipe();
        }
    
        object dup()
        {
          object o;
          o=object_program(this_object())();
          o->assign(file::dup());
          return o;
        }
    
        int assign(object foo)
        {
          bpos=0;
          b="";
          return ::assign(foo);
        }
    
        void set_nonblocking()
        {
          error("Cannot use nonblocking IO with buffered files.\n");
        }
    
        int printf(string fmt, mixed ... data)
        {
          if(!sizeof(data))
    	return file::write(fmt);
          else
    	return file::write(sprintf(fmt,@data));
        }
        
        string read(int bytes)
        {
          while(strlen(b) - bpos < bytes)
    	if(!get_data())
    	  break;
    
          return extract(bytes);
        }
    
        string ungets(string s)
        {
          b=s+b[bpos..];
          bpos=0;
        }
    
        int getchar()
        {
          if(strlen(b) - bpos < 1)
    	if(!get_data())
    	  return -1;
    
          return b[bpos++];
        }
      };
    
    object(FILE) stdin=FILE("stdin");
    
    string read_file(string filename,void|int start,void|int len)
    {
      object(FILE) f;
      string ret, tmp;
      f=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());
        object(String_buffer) buf=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;
      object(File) f = File();
    
      if(!f->open(filename,"r"))
        return 0;
      
      switch(query_num_arg())
      {
      case 1:
      case 2:
        len=0x7fffffff;
      case 3:
        if(start)
          f->seek(start);
      }
      ret=f->read(len);
      f->close();
      return ret;
    }
    
    int write_file(string filename,string what)
    {
      int ret;
      object(File) f = File();
    
      if(!f->open(filename,"awc"))
        error("Couldn't open file "+filename+".\n");
      
      ret=f->write(what);
      f->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(predef::errno())+"\n");
    #else
      stderr->write(s+": errno: "+predef::errno()+"\n");
    #endif
    }
    
    mixed `[](string index)
    {
      mixed x=`->(this_object(),index);
      if(x) return x;
      switch(index)
      {
      case "readline": return master()->resolv("readline");
      default: return ([])[0];
      }
    }