/* Do not remove the headers from this file! see /USAGE for more info. */
#include <more.h>
private nosave string stdoutstr = 0;
private nosave string buf ;
private nosave mixed next_cmd;
private nosave mixed next_implode_info;
private nosave int no_redirect = 0;
private nosave int output_flags = 0;
protected int set_output_flags(int x) {
output_flags = x;
}
protected void no_redirection()
{
no_redirect = 1;
}
protected int restrict_redirection()
{
return no_redirect;
}
mixed get_rest_of_args()
{
mixed tmp = ({next_cmd, next_implode_info});
next_cmd = 0;
next_implode_info = 0;
return tmp;
}
string get_output()
{
return buf;
}
protected int end_of_pipeline()
{
return !next_cmd;
}
private int determine_stdout(mixed args)
{
string op = args[0];
string stdoutfile;
int clobber = 0;
switch(op)
{
case ">":
clobber = 1;
case ">>":
stdoutfile = evaluate_path(implode(args[1..], " "));
if(!is_directory(base_path(stdoutfile)))
{
printf("%s is not a valid directory.\n", base_path(stdoutfile));
return 0;
}
if(clobber)
{
if(is_file(stdoutfile) && (!rm(stdoutfile)))
{
printf("%s: couldn't remove.\n", stdoutfile);
return 0;
}
}
stdoutstr = stdoutfile;
break;
case "|":
next_cmd = args[1..];
break;
default:
error("Should never get here...");
}
return 1;
}
protected void bare_init()
{
stdoutstr = 0;
buf = "";
next_cmd = 0;
output_flags = 0;
}
protected mixed hello_stdio(mixed ininfo, mixed argstohold, mixed implode_info)
{
string stdinfile;
string stdin;
int i;
stdoutstr = 0;
buf = "";
next_cmd = 0;
next_implode_info = implode_info;
/* First, if there's ininfo, read our std input */
if(ininfo)
{
if(stringp(ininfo))
{
// We got stdin from a pipe
stdin = ininfo;
}
else
{
stdinfile = evaluate_path(implode(ininfo," "));
if(!is_file(stdinfile))
{
printf("%s is not a file.\n", stdinfile);
return 0;
}
stdin = read_file(stdinfile);
}
}
if(argstohold)
{
i = 1;
while((i < sizeof(argstohold)) && (argstohold != "|")) i++;
next_cmd = argstohold[i..];
if(!sizeof(next_cmd))
next_cmd = 0;
i = determine_stdout(argstohold[0..(i-1)]);
if(i != 1)
return i;
}
return stdin || 1;
}
protected mixed done_outputing()
{
object stdoutobj;
string tmp;
if((!stdoutstr) && (!next_cmd))
{
if(buf == "" || !buf)
return 0;
more(explode(buf,"\n"), 0, 0, output_flags);
return 0;
}
if(stdoutstr)
{
if(!write_file(stdoutstr,buf))
{
printf("error: couldn't write to %s.\n", stdoutstr);
}
return 0;
}
tmp = buf;
buf = 0;
return ({ next_cmd, tmp, next_implode_info });
}
protected void out(string s)
{
if(!buf)
buf = "";
buf += s;
}
protected void outf(string format, mixed args ... )
{
buf += sprintf(format, args...);
}