Skip to content
Snippets Groups Projects
Select Git revision
  • 2b828a8622e9fe54c292e3d156b2c6883123c141
  • master default protected
  • 9.0
  • 8.0
  • 7.8
  • 7.6
  • 7.4
  • 7.2
  • 7.0
  • 0.6
  • rosuav/latex-markdown-renderer
  • rxnpatch/rxnpatch
  • marcus/gobject-introspection
  • rxnpatch/8.0
  • rosuav/pre-listening-ports
  • nt-tools
  • rosuav/async-annotations
  • rosuav/pgsql-ssl
  • rxnpatch/rxnpatch-broken/2023-10-06T094250
  • grubba/fdlib
  • grubba/wip/sakura/8.0
  • v8.0.2004
  • v8.0.2002
  • v8.0.2000
  • v8.0.1998
  • v8.0.1996
  • v8.0.1994
  • v8.0.1992
  • v8.0.1990
  • v8.0.1988
  • v8.0.1986
  • rxnpatch/clusters/8.0/2025-04-29T124414
  • rxnpatch/2025-04-29T124414
  • v8.0.1984
  • v8.0.1982
  • v8.0.1980
  • v8.0.1978
  • v8.0.1976
  • v8.0.1974
  • v8.0.1972
  • v8.0.1970
41 results

NNTP.pmod

Blame
  • 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];
      }
    }