diff options
Diffstat (limited to 'misc/plot.c')
-rw-r--r-- | misc/plot.c | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/misc/plot.c b/misc/plot.c new file mode 100644 index 0000000..e540592 --- /dev/null +++ b/misc/plot.c @@ -0,0 +1,249 @@ +/* + * 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 [<file> [-nxyab]] + * Accepts input stream of numbers from <file> (or stdin, if no <file> + * 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<num> option is + * used, then only every <num>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 <stdio.h> +#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<len; i++) + { + *Min = MIN(*X, *Min); + *Max = MAX(*X, *Max); + if (*X != last) + *Delta = MIN(ABS(*X-last), *Delta); + last = *X++; + } + *Num = len; + } +} + + + +getargs(argc, argv, skip, xPrint, yPrint, start) +int argc, *skip, *yPrint, *xPrint, *start; +char *argv[]; +{ + char *file; + + file = NULL; + fain = stdin; + ftype = BINARY; + *start = 0; + *skip = 1; + *xPrint = FALSE; + *yPrint = FALSE; + while (--argc) + { + ++argv; + if ((*argv)[0] != '-') + { + if (file || (*argv)[0]=='?') + fail("syntax error argument '%s'.\ + \n format: 'plot [<file>] [-n/s<num>] [-x/y/a/b]',\ + \n where: <file> to plot (stdin is default),\ + \n -n<num> plot every <num>th value in file,\ + \n -s<num> start at the <num>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<Num; i+=skip) + { + target = X[i]*factor+40; + --xCount; + if (target < 40) + { + printf(Space[target-1]); + printf(Star[41-target]); + if (!xCount) + printf("\t\t %6d",i); + else + printf("\t\t\t "); + if (yPrint) + printf(" %6d\n",X[i]); + else + printf("\n"); + } + else + { + if (yPrint) + printf(" %6d ",X[i]); + else + printf("\t "); + if (!xCount) + printf("%6d ",i); + else + printf(" "); + printf(Star[target-39]); + printf("\n"); + } + if (!xCount) + xCount = 10; + } + + if (ftype == BINARY) + (void) close(fbin); + else if (fain != stdin) + (void) fclose(fain); +} |