/* * FILE: plot.c * BY: Christopher Lee Fraley (cf0v@spice.cs.cmu.edu) * DESC: graphs file of numbers on terminal * * 1.1 ( 1-JUN-88) - added lines from 0 to data points (cf0v) * 1.2 ( 3-JUN-88) - added skip parameter (cf0v) * 1.3 (23-JUN-88) - added -x and -y options (cf0v) * 1.4 (30-JUN-88) - clean-up. (cf0v) * 2.0 ( 5-JUL-88) - added binary sound file format option. Changed scaling * for "-n" option to only consider those values being * plotted, instead of whole file. */ char plotVERSION[] = "2.0 (5-JUL-88, 11:40am)"; /* * plot [ [-nxyab]] * Accepts input stream of numbers from (or stdin, if no * argument is present), drawing a graph to sdout. File is prescanned for * min and max values, and the graph is scaled accordingly. If making the * file's min non-zero delta equal to one char allows the entire graph to * fit on the screen, then this scalar is used. If the -n option is * used, then only every th number from the input stream is plotted. * The -x option enables printing the line number in the file on the screen * every 10 lines. The -y option enables printing the y value on the screen * every line. Note -x and -y are NOT mutually exclusive. The -a option * indicates the input file is in ascii format, while the -b option indicates * the input file is in the binary sound file format. When neither of these * is present, binary is assumed unless input is from stdin. */ #include #include "stdefs.h" #define MAXNUMINPUT 16*1024 #define BINARY 0 #define ASCII 1 fail(s, arg) char *s, *arg; { fprintf(stderr,"\nplot: "); fprintf(stderr, s, arg); fprintf(stderr,"\n\n"); exit(1); } FILE *fain; /* Pointer to input file for ascii format */ int fbin; /* Input file for binary format */ int ftype; /* Type of input file */ prescan(X, Num, Max, Min, Delta) HWORD X[]; int *Num, *Max, *Min, *Delta; { int last, i, len; *Min = *Delta = 32767; *Max = -32768; *Num = last = 0; if (ftype == ASCII) while (fscanf(fain,"%d",&i) != EOF) { *Min = MIN(i, *Min); *Max = MAX(i, *Max); if (i != last) *Delta = MIN(ABS(i-last), *Delta); *Num += 1; last = i; *X++ = i; } else { printf("| binary prescan, fbin:%d\n", fbin); len = read(fbin, (char *)X, MAXNUMINPUT*sizeof(HWORD)) / sizeof(HWORD); if (len >= MAXNUMINPUT) fprintf(stderr, "plot: input truncated to %d samples\n", MAXNUMINPUT); for (i=0; i] [-n/s] [-x/y/a/b]',\ \n where: to plot (stdin is default),\ \n -n plot every th value in file,\ \n -s start at the th sample,\ \n -x print line # in file every 10 lines,\ \n -y print y coordinate every line,\ \n -a indicates input file is in ascii format,\ \n -b indicates input is in binary sound file format.\ \n -x and -y are NOT mutually exclusive; -a and -b ARE.\ \n -b is assumed unless input is stdin.", *argv); file = *argv; printf("| file:%s\n", file); } else if ((*argv)[1]=='x' || (*argv)[1]=='X') *xPrint = TRUE; else if ((*argv)[1]=='y' || (*argv)[1]=='Y') *yPrint = TRUE; else if ((*argv)[1]=='a' || (*argv)[1]=='A') ftype = ASCII; else if ((*argv)[1]=='b' || (*argv)[1]=='B') ftype = BINARY; else if ((*argv)[1]=='n' || (*argv)[1]=='N') { if (1 != sscanf(*argv+2, "%d", skip)) fail("illegal -n parameter '%s'", *argv); } else if ((*argv)[1]=='s' || (*argv)[1]=='S') { if (1 != sscanf(*argv+2, "%d", start)) fail("illegal -s parameter '%s'", *argv); } } if (!file) ftype = ASCII; else if (ftype == ASCII) { if (NULL == (fain = fopen(file, "r"))) fail("could not open ascii input file '%s'\n", file); } else { if (NULL > (fbin = open(file, 0))) fail("could not open binary input file '%s'\n", file); } } main (argc,argv) int argc; char *argv[]; { int Num, Max, Min, Delta, i; HWORD X[MAXNUMINPUT]; double factor; int target, skip, start; int xCount, xPrint, yPrint; char *Star[41], *Space[41]; printf("\nData Plotting Program\n"); printf("by: Christopher Lee Fraley\n"); printf("Version: %s\n", plotVERSION); Star[40] = "****************************************"; Space[40] = " "; for (i=39; i>=0; i--) { Star[i] = Star[i+1] + 1; Space[i] = Space[i+1] + 1; } getargs(argc, argv, &skip, &xPrint, &yPrint, &start); prescan(X, &Num, &Max, &Min, &Delta); factor = 1.0/Delta; if (factor*Max>39) factor = 39.0/Max; if (factor*Min<-40) factor = 40.0/-Min; printf("\n Number of Data Points:%d \t [%d:%d]\n",Num,Min,Max); printf(" Scale: %g/char",1.0/factor); if (skip > 1) printf(" \t\t Plotting every %dth sample", skip); if (start) printf(" Starting plot at sample %d", start); printf("\n\n=========3=========2=========1=========0=========1=========2\ =========3=========\n"); if (xPrint) xCount = 11; else xCount = -1; for (i=start; i