V9/cmd/emacs/see_it.c
/*
** Concatenate files.
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
/* character type table */
#define PLAIN 0
#define CONTRL 1
#define TAB 2
#define BACKSP 3
char ctype[128] = {
CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL,
CONTRL, TAB, PLAIN, CONTRL, TAB, CONTRL, CONTRL, CONTRL,
CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL,
CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN,
PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, PLAIN, CONTRL,
};
char stdbuf[BUFSIZ];
main(argc, argv)
char **argv;
{
register FILE *fi;
register c;
int fflg = 0;
int silent = 0;
int status = 0;
int tabs = 0;
int dev, ino = -1;
struct stat statb;
setbuf(stdout, stdbuf);
for( ; argc>1 && argv[1][0]=='-'; argc--,argv++) {
switch(argv[1][1]) {
case 0:
break;
case 'u':
setbuf(stdout, (char *)NULL);
continue;
case 's':
silent++;
continue;
case 't':
tabs++;
continue;
}
break;
}
if(fstat(fileno(stdout), &statb) < 0) {
if(!silent)
fprintf(stderr, "cat: Cannot stat stdout\n");
exit(2);
}
statb.st_mode &= S_IFMT;
if (statb.st_mode!=S_IFCHR && statb.st_mode!=S_IFBLK) {
dev = statb.st_dev;
ino = statb.st_ino;
}
if (argc < 2) {
argc = 2;
fflg++;
}
while (--argc > 0) {
if ((*++argv)[0]=='-' && (*argv)[1]=='\0' || fflg)
fi = stdin;
else {
if ((fi = fopen(*argv, "r")) == NULL) {
if (!silent)
fprintf(stderr, "cat: cannot open %s\n", *argv);
status = 2;
continue;
}
}
if(fstat(fileno(fi), &statb) < 0) {
if(!silent)
fprintf(stderr, "cat: cannot stat %s\n", *argv);
status = 2;
continue;
}
if (statb.st_dev==dev && statb.st_ino==ino) {
if(!silent)
fprintf(stderr, "cat: input %s is output\n",
fflg?"-": *argv);
fclose(fi);
status = 2;
continue;
}
while ((c = getc(fi)) != EOF) {
if (c & 0200) {
putchar('M');
putchar('-');
c-= 0200;
}
switch(ctype[c]) {
case PLAIN:
putchar(c);
break;
case TAB:
if (tabs) {
putchar(c);
} else {
putchar('^');
putchar (c^0100);
}
break;
case CONTRL:
putchar('^');
putchar(c^0100);
break;
}
}
if (fi!=stdin)
fclose(fi);
}
exit(status);
}