#include <cplot.h> /* ** ** THE FOLLOW ING HASH DEFINES MAY BE CHANGED IF YOU WISH ** ** THERE IS SEVERAL CHANGES SO THAT PLOT WILL WORK ** WHEN THE HARD COPY PLOTTER IS IN PARALLEL WITH THE ** TERMINAL IN USE. A CODE MUST BE TRANSMITTED TO ACTIVATE ** THE HARD COPY, AND ANOTHER TO TURN IT OFF, RATHER THAN ** HAVING A SEPARATE DEVICE TO OPEN AND CLOSE. ** ALSO, WHEN A HARD COPY IS BEING MADE THE MUST BE NO ** ECHOING OF ANY INFORMATION ON THE H-COPY, SO AN ADDITIONAL ** GTTY AND STTY IS DONE TO TURN ECHO OFF. ** NOTE THAT THE HARD COPY HAS A DEVICE CODE, AND THIS PROGRAM ** ASSUME THIS TO BE "A" ..... CONSULTATION OF THE 4662 MANUAL ** WILL EXPLAIN WHAT I MEAN. ** ** NOTE THAT BOTH <GTTY.H> AND LEX DEFINE "ECHO" DIFFERENTLY, ** SO THE MESSAGE IS BEWARE. (This is not a wine for drinking, it is a ** wine for laying down and avoiding). */ /*#define ELEC /**/ /* ** UNSW ELECTRICAL ENGINEERING RUN THEIR HARD COPY ** IN PARALLEL WITH A STANDARD TERMINAL, AND THE ** HARD COPY IS ACTIVATED BY CERTAIN CODE CHARACTERS. ** IF YOU HAVE THIS SETUP, DEFINE ELEC, OTHERWISE ** IF THE HARD-COPY IS A SEPARATE DEVICE THEN DON'T ** DEFINE ELEC. */ #ifdef ELEC #define ECHOMODE 010 #endif #define INCLUDE_DEPTH 6 /* THE LIMIT OF NESTING OF FILES HE IS ALLOWED */ /* ** A POINT IS AN X AND A Y VALUE (2 FLOATS) */ #define NUM_OF_POINTS 1500 #define STRING_SPACE 500 /* ** THE NUMBER OF TICKS IN BETWEEN EACH NUMBER */ #define TICKS_PER_NUM 2 /* ** THIS ALTERS THE SCALING SENSITIVITY OF ** PLOT'S AUTO SCALER. THE SCALING ALGORITM ** IS SO VOLATILE AND TOUCHY I SUGGEST YOU ** DON'T CHANGE IT AT ALL */ #define SENSITIVITY 2.0 #define TICK_SIZE 5 #define WARN_LIMIT 8 /* IF THERE ARE TOO MANY WARNINGS THEN EXIT */ /* ** THIS IS THE NUMBER OF ALLOWED MARKS (LINES) ** ON EACH AXIS [mark x=10.5 y= 67.554] */ #define NUM_MARKS 50 /*#define VERBOSE_ERRORS /**/ /* comment the above out if 'c' like terseness in error messages is ok */ #define AUTHOR "Richard Grevis" #define FAST /* You don't want high quality on the terminal with high */ /* baud rate (yuk) */ #define MAX_FLOAT 1.0e37 #define MAX_INT 32767 #define XCHRSZ 14 #define YCHRSZ 22 /* THE SIZE OF A CHARACTER IN PLOTTER UNITS */ #define PLOTTER "/dev/plotter" /* ** THESE DEFINE VARIOUS MODES THAT THE 2662 ** CAN ENTER */ #define CALL_LIGHT_ON "\033AK" #define CALL_LIGHT_OFF "\033AL" #define PLOTTER_ON "\033AE" #define PLOTTER_OFF "\n\033AF" /* The leading newline is so that the af is out of the way on the terminal */ /*define RUN_BUG /* A DEBUG MODE THAT WILL NOT SLOW PLOT DOWN AS MUCH AS THE DEBUG BELOW */ /*#define DEBUG /**/ /* ** THE DEFINES THAT ARE USED FOR THE GRAPHICS ** PART OF THE PROGRAM */ #define HOR_BOX_SIZE 14 /* THE TENTATIVE LIMIT ON THE LENGTH OF A LINE LABEL */ #define VER_BOX_SIZE 3 /* THE NUMBER OF LABELS THAT CAN FIT IN THE BOX */ /* FURTHER BELOW VARIABLES OF THE SAME NAME WILL ** BE FOUND FOR WHEN THE KEY BOX GROWS DYNAMICALLY ** TO CONTAIN THE STRING ENTRIES */ /* THAT IS, THE BOX SIZE IN CHARATERS */ #define CROSS_SIZE 5 #define STAR_SIZE 2 #define CIRCLE_SIZE 5 /* ** THIS FELLA IS THE LENGTH ** OF THE EXAMPLE LINE WHEN ** A KEY BOX IS WANTED. ** TRY IT AND SEE */ #define REG_LINE_LEN 50 /* ** THE INITIAL FORMAT OF THE NUMBERS PRINTED ON THE BORDER */ #define XFORM_INIT "%7.4g" #define YFORM_INIT "%7.4g" /* ** This defines the size of the screen window. ** During graphics, everything outside this window is ** RUTHLESSLY truncated. */ #define WXL 156 #define WXH 945 #define WYL 64 #define WYH 716 /* ** THIS IS THE END OF THE THINGS I DONT MIND YOU CHANGING */ #ifdef RUN_BUG #define DEBUG #endif /* DEBUG MUST BE ON WHEN RUN_BUG IS ON */ #ifdef RUN_BUG #define BUGFILE "/tmp/plot.bug" #else #define BUGFILE "plot.bug" #endif #define YES 1 #define NO 0 /* ABORT IS USED IN THE SYNTAX ANALISIS TO SAVE WRITING REPETITIVE CODE */ #define ABORT(y) { error(y); nextgroup(); break; } #define size(x) (x>0?(exp(floor(log(x)/2.302585)*2.302585)):(-(exp(floor(log(-(x))/2.302585)*2.302585)))) #define SUB_TOKEN 1 /* ANDING WITH THIS WILL PRODUCE TRUE IF NOT MAIN TOKEN */ #define LINES_HEADING 4 #define EOF (-1) #define UNRECOGNISED (-3) #define BAD_CHAR (-5) #define ERROR (-1) /* JUST A GENERAL, NOT SPECIFIC ERROR */ /* I WISH IT WAS NOT 1, BUT I HAVE PROBS OTHERWISE */ /* ** THE MAIN TOKENS ARE POWERS OF TWO */ #define LEGEND 2 #define XAXIS 4 #define YAXIS 010 #define DATE 020 #define PLOT 040 #define MARK 0100 #define DATA 0200 #define NEXT 0400 /* ** ALL OTHERS ARE ODD */ #define NUMBER 3 #define STRING 5 #define KEY_AT 7 #define END 9 #define FROM 11 #define TO 13 #define BY 15 #define AT 17 #define POINT_EQ 19 #define LINE_EQ 21 #define X_EQ 23 #define Y_EQ 25 #define TIMES 27 /* IT IS A "*" NOTHING ELSE */ /* ** THESE ARE THE LINE AND POINT TYPES AVAILABLE */ #define CROSS 29 #define DOT 31 #define CIRCLE 33 #define STAR 35 #define SOLID 37 #define SHORT 39 #define SHORT_LONG 41 #define LONG 43 #define NOTHING 45 /* ** AND SOME OTHER TOKENS I SHOULD HAVE PLACED HIGHER UP */ #define REGRESSION 47 #define FORMAT 49 #define OTHER 51 /* ** THE STATUSES FOR THE LINE TYPES AND ** SO ON. ** THESE STATI ARE FOR GSTATUS */ #define XMARK 02 #define YMARK 04 #define POINT_EXPLICIT 010 #define LINE_EXPLICIT 020 #define DID_LABEL 040 #define INITIALISED 0100 /* true if a graphics init has been done */ #define TO_HARD_COPY 0200 /* If the -p option is set */ #define PAUSE_ON 0400 #define HARD_COPY_ON 01000 /* ** THE OTHER DEFINED STATUSES ** */ #define XMAN_SCALE 1 #define YMAN_SCALE 2 #define KEY 4 #define REG 010 #define NO_PLOT 020 /* IF ERRORS ARE FOUND WE SUPPRESS PLOTTING */ #define NO_SPECS 040 /* IF THERE ARE NO PLOT SPECS */ #define NO_WARNINGS 0100 #define XINC 0200 #define YINC 0400 #define NO_BORDER 01000 #define MOVE_XAXIS 02000 #define MOVE_YAXIS 04000 #define WARNS_FLUSHED 010000 #define NO_NUMBERS 020000 /* DRAW IN THE AXES AND HEADINGS BUT NOT THE NUMBERS */ #define NO_DATA 040000 /* ** ** DECLARATIONS OF GLOBAL VARIABLES ** */ float buffer[NUM_OF_POINTS*2]; float *saved; /* pointer to the last point added to the buffer */ int status; /* KEEPS THE STATUS OF MANUAL SCALING ETC */ int gstatus; /* KEEP MORE STATUSES OF THE POINT AND LINE VARIETY */ int tokens_found; /* AS EACH ONCE ONLY FLAG IS FOUND IT IS TALLIED HERE */ int *got_some_data; /* THE PARSER READS ONE TOKEN TOO FAR WHEN DISCOVERING THAT DATA FOLLOWS. THIS VARIABLE KEEP A POINTER TO THE DATA SO THAT GETDATA MAY USE IT */ int warncount; /* KEEPS TRACK OF THE NUMBER OF WARNINGS */ char warn_buf[WARN_LIMIT+1][80]; int xerr_pos,yerr_pos; /* THE POSITION OF THE NEXT ERROR OR WARNING MESSAGE */ #define XERR_INIT 170 #define YERR_INIT 700 /* THE ERRORS GO DOWN THE PAGE FROM THIS POS */ char *head_str[LINES_HEADING]; char *sbuff_ptr; /* THE POINTER TO THE STRING BUFFER */ int head_count; /* THE STORAGE LIMIT FOR THE HEADINGS */ /* AND THE INDEX TO THE NEXT FREE SPACE */ char *date_str; char *x_str; char *y_str; char *label_str; int quadrant; int line_type, point_type; int x_column, y_column; int key_quadrant; int reg_quadrant; int mark_type; float inc_min, inc_max; float xscale, yscale; float xkey_pos, ykey_pos; /* POSITION OF THE KEY BOX */ int hor_box_size, ver_box_size; /* THE SIZE OF A GROWABLE BOX */ float xreg_pos, yreg_pos; float xmark[NUM_MARKS]; float ymark[NUM_MARKS]; int xmark_count; int ymark_count; float xtick_gap, ytick_gap; float xmin, xmax, ymin, ymax; float xpos, ypos; /* THE POS OF THE AXES ON THE GRAPH */ char xformat[30], yformat[30]; /* ** ** THESE ARE THE VARIABLE FOR THE LINE ** OF BEST FIT ETC WHEN DOING A REGRESSION ** */ float sumx,sumy; float sumx2,sumy2; float sumxy; int n; /* COUNTER OF THE NUMBER OF POINTS */ /* ** GLOBAL VARIABLES USED WITH THE LEXICAL ANALYSIS */ char *p_token; /* A POINTER TO THE TOKEN STRING */ float f_token; /* THE VALUE OF THE TOKEN */ /* EG IF THE TOKEN IS A NUMBER, */ /* f_token CONTAINS ITS VALUE */ int token; /* THE TYPE OF TOKEN */ struct plotfile { char pname[80]; char fname[16]; FILE *fptr; /* the STDIO file pointer */ int linenum; /* save the line number as well */ } infiles[INCLUDE_DEPTH]; struct plotfile *name; /* A GLOBAL POINTER TO THE CURRENT FILE STRUCTURE */ struct point { float x; float y; }; /* A CONDITIONAL DEBUG DECLARATION */ #ifdef DEBUG FILE *debug; #endif FILE *plotter; /* ROUTINE AND */ /* STDIO DECLARATIONS */ FILE *freopen(); char *fgets(); char *calloc(); FILE *fopen(); FILE *zopen(); float atof(); float fabs(); struct point *getxy(); char *add_str(); long time(); char *skip(); float exp(); float floor(); float ceil(); float log();