diff --git a/wip/peek/Makefile b/wip/peek/Makefile new file mode 100644 index 0000000..740697b --- /dev/null +++ b/wip/peek/Makefile @@ -0,0 +1 @@ +peek: peek.c diff --git a/wip/peek/peek.c b/wip/peek/peek.c new file mode 100644 index 0000000..8a66127 --- /dev/null +++ b/wip/peek/peek.c @@ -0,0 +1,53 @@ +#include /* fprintf(3), getc(3), putc(3), EOF */ +#if !defined EX_OK || !defined EX_USAGE +# include +#endif +#include /* tcgetattr(3), tcsetattr(3), struct termios, ECHO */ +#include /* getopt(3), STDIN_FILENO */ + +static char *program_name = "peek"; + +int main(int argc, char *argv[]){ + int c; + int eof; + char include_eof; + char to_stderr; + char to_stdout; + struct termios t; + + /* disable terminal echo */ + tcgetattr(STDIN_FILENO, &t); + t.c_lflag &= ~(ECHO); + tcsetattr(STDIN_FILENO, TCSAFLUSH, &t); + + eof = EOF; + include_eof = 0; + to_stderr = 0; + to_stdout = 0; + while((c = getopt(argc, argv, "1enop:")) != -1) + switch(c){ + case '1': eof = '\n'; break; + case 'e': to_stderr = 1; break; + case 'n': include_eof = 1; break; + case 'o': to_stdout = 1; break; + default: + fprintf(stderr, "Usage: %s (-1eno) (-p [program])\n", + argv[0] == NULL ? program_name : argv[0]); + return EX_USAGE; + } + + while((c = getc(stdin)) != eof){ + if(to_stdout && putc(c, stdout) != c) + return EX_OK; /* broken pipe */ + if(to_stderr) + putc(c, stderr); + } + + if(include_eof && to_stdout) + putc(c, stdout); + + if(include_eof && to_stderr) + putc(c, stderr); + + return EX_OK; +}