/* char-mode file viewer.  It's useful, honest.
   Polsy 4/1999 */

#define STDIN 0
#define STDOUT 1

#include <stdio.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

int fd;
struct termios termState;
char stuff[256];

void serr(char* errtxt) {
  char errmsg[256];

  strcpy(errmsg,"showfile: ");
  strcpy(errmsg+10,errtxt);
  perror(errmsg);
}  

int main(int argc, char* argv[]) {

  char *file;
  char buf[64]; 
  int state, got, retval, chrs;

  if(argc != 2 && argc != 3) {
    printf("Syntax: showfile filename [chars]\n");
    exit(1);
  }
  file = argv[1];
  chrs = 1;
  if(argc == 3) chrs = atoi(argv[2]);

  fd = open(file,O_RDONLY);
  if(fd < 0) {
    strcpy(stuff,"Couldn't open ");
    strcpy(stuff+14,file);
    serr(stuff);
    exit(1);
  }

  /* char mode */
  retval = tcgetattr(STDIN, &termState);
  if(retval < 0) { serr("tcgetattr"); exit(1); }
  termState.c_lflag &= ~(ICANON|ECHO);
  retval = tcsetattr(STDIN, TCSANOW, &termState);
  if(retval < 0) { serr("tcsetattr"); exit(1); }

  state = 0;
  
  while(!state) {
    /* yum, efficiency */
    got = read(fd, buf, chrs);
    if(!got) state = 1;
    if(got == -1) { serr("read"); exit(1); }
    got = write(STDOUT, buf, chrs);
    if(got == -1) { serr("write"); exit(1) ; }
    retval = getchar();
    if(retval >= 49 && retval <= 57) chrs = retval - 48;
    if(retval >= 65 && retval <= 115) chrs = (retval - 65) + 10;
  }
}

