Programs from Bourne (field) and K&P (pick and zap)
Bill Silvert
silvert at dalcs.UUCP
Thu Apr 25 03:46:16 AEST 1985
Here are several utilities from Bourne's "The Unix System" and from
Kernighan & Pike's "The Unix Programming Environment".
They are slightly modified but should be pretty close to the
originals. Run the following shell script:
---------------------cut here-------------------------------------
cat >field.c << xxFIELDxx
/* field utility, from Bourne pp.228-9 */
#include <stdio.h>
static char SCCSID[] = "@(#)field.c Ver. 1.9, 85/04/23 18:58:12";
#define MAXF 256
#define MAXL 4096
#define IFS ':' /* Field separator is colon on input, */
#define OFS ':' /* and on output. */
int fv[MAXF];
int nf;
int mf;
char *fp[MAXF];
char L[MAXL];
main(argc,argv)
int argc;
char *argv[];
{
register char *cp;
register char **ap;
register int c;
static char FIELD[] = "@(#)field.c 1.9 85/04/23: : in, \\t out"; /* SCCS identifier */
int f;
while (argc>1) {
if(sscanf(argv[1], "%d", &fv[nf++]) != 1) {
printf("usage: field [ n ] ...\n");
return(2);
}
argc--; argv++;
}
/* read and copy input */
nf--;
cp = L;
ap = fp;
*ap++ = cp;
while(1){
c = getc(stdin);
if(c=='\n' || c== EOF) {
int fc;
if(cp==L && c==EOF) break;
*cp++ = 0;
mf = ap-fp;
/* print this line */
for(fc = 0; fc <= nf; fc++){
putf(fv[fc]-1);
if(fc != nf) putchar(OFS);
}
if(c == EOF) break;
putchar('\n');
cp = L;
ap = fp;
*ap++ = cp;
}
else if(c == IFS) {
*cp++ = 0;
*ap++ = cp;
}
else *cp++ = c;
}
return(0);
}
/* output field n from current line */
putf(n)
{
register char *cp = fp[n];
register char c;
if(n<0 || n>=mf) return;
while (c = *cp++) putchar(c);
}
xxFIELDxx
cat >zap.c <<xxZAPxx
/* zap: interactive process killer
from Kernighan & Pike p. 191 */
static char SCCSID[] = "@(#)zap.c Ver. 1.1, 85/03/04 14:10:58";
#include <stdio.h>
#include <signal.h>
char *progname ; /* name of program (zap) */
char *ps ; /* form of the ps command */
main(argc,argv)
int argc;
char *argv[];
{
FILE *fin, *popen();
char buf[BUFSIZ];
int pid;
if(geteuid() == 0)
ps = "ps -ag" ; /* only root can kill others' programs */
else
ps = "ps -g" ; /* for all ordinary users */
progname=argv[0];
if((fin=popen(ps,"r")) == NULL) {
fprintf(stderr,"%s: can't run %s\n",progname,ps);
exit(1);
}
fgets(buf,sizeof buf,fin); /* get header line */
fprintf(stderr,"%s",buf);
while(fgets(buf,sizeof buf,fin) != NULL)
if(argc == 1 || strindex(buf,argv[1]) >= 0) {
buf[strlen(buf)-1] = '\0'; /* suppress \n */
fprintf(stderr,"%s\t? ",buf);
if(ttyin() == 'y') {
sscanf(buf,"%d",&pid);
kill(pid,SIGKILL);
}
}
exit(0);
}
xxZAPxx
cat >pick.c <<xxPICKxx
/* pick: Kernighan & Pike p. 187 */
static char SCCSID[] = "@(#)pick.c Ver. 1.1, 85/03/04 14:45:27";
#include <stdio.h>
char *progname;
main(argc,argv)
int argc;
char *argv[];
{ int i;
char buf[BUFSIZ];
progname = argv[0];
if(argc == 2 && strcmp(argv[1],"-") == 0)
while(fgets(buf,sizeof buf,stdin) != NULL) {
buf[strlen(buf)-1] = '\0';
pick(buf);
}
else
for(i=1;i<argc;i++)
pick(argv[i]);
exit(0);
}
pick(s)
char *s;
{ fprintf(stderr,"%s? ",s);
if(ttyin() == 'y') /* p. 185 */
printf("%s\n",s);
}
xxPICKxx
cat >ttyin.c <<xxTTYINxx
#include <stdio.h>
static char SCCSID[] = "@(#)ttyin.c Ver. 1.3, 85/03/04 16:04:32";
ttyin() /* process response from /dev/tty -- Kernighan & Pike p. 185 */
{
char buf[BUFSIZ];
FILE *fopen(); /* K&P use their own efopen, p. 182 */
static FILE *tty=NULL;
if(tty==NULL)
tty=fopen("/dev/tty","r");
for(;;) {
if(fgets(buf,BUFSIZ,tty)==NULL || buf[0]=='q')
exit(0);
else if(buf[0]=='!') {
system(buf+1); /* p. 224, available as system(3) */
printf("!\n");
}
else /* ordinary line */
return buf[0];
}
}
xxTTYINxx
cat >strindex.c <<xxSTRINDEXxx
static char SCCSID[] = "@(#)strindex.c Ver. 1.2, 85/03/04 15:54:30";
strindex(s,t) /* C equivalent of fortran INDEX
index(3) does characters, not strings
Kernighan & Pike p. 192 */
char *s, *t;
{
int i,n;
n=strlen(t);
for(i=0;s[i] != '\0'; i++)
if(strncmp(s+i,t,n) == 0)
return i;
return -1; /* INDEX returns 0, but C strings start at 0 */
}
xxSTRINDEXxx
--
Bill Silvert
Marine Ecology Lab.
Dartmouth, NS
dalcs!biomel!bill
More information about the Comp.sources.unix
mailing list