Select Git revision
-
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
Fredrik Hübinette (Hubbe) authoredRev: 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];
}
}