AUSAM/source/plot/plot.h
#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();