3
* Grace - GRaphing, Advanced Computation and Exploration of data
5
* Home page: http://plasma-gate.weizmann.ac.il/Grace/
7
* Copyright (c) 1991-1995 Paul J Turner, Portland, OR
8
* Copyright (c) 1996-2001 Grace Development Team
10
* Maintained by Evgeny Stambulchik <fnevgeny@plasma-gate.weizmann.ac.il>
15
* This program is free software; you can redistribute it and/or modify
16
* it under the terms of the GNU General Public License as published by
17
* the Free Software Foundation; either version 2 of the License, or
18
* (at your option) any later version.
20
* This program is distributed in the hope that it will be useful,
21
* but WITHOUT ANY WARRANTY; without even the implied warranty of
22
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
* GNU General Public License for more details.
25
* You should have received a copy of the GNU General Public License
26
* along with this program; if not, write to the Free Software
27
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
32
* evaluate expressions, commands, parameter files
44
#if defined(HAVE_SYS_PARAM_H)
45
# include <sys/param.h>
48
/* bison not always handles it well itself */
49
#if defined(HAVE_ALLOCA_H)
55
#include "cephes/cephes.h"
60
#include "graphutils.h"
67
#include "mathstuff.h"
69
#define MAX_PARS_STRING_LENGTH 4096
71
#define CAST_DBL_TO_BOOL(x) (fabs(x) < 0.5 ? 0:1)
73
typedef double (*ParserFnc)();
77
static double s_result; /* return value if a scalar expression is scanned*/
78
static grarr *v_result; /* return value if a vector expression is scanned*/
80
static int expr_parsed, vexpr_parsed;
84
static grarr freelist[100]; /* temporary vectors */
85
static int fcnt = 0; /* number of the temporary vectors allocated */
87
static target trgt_pool[100]; /* pool of temporary targets */
88
static int tgtn = 0; /* number of the temporary targets used */
90
int naxis = 0; /* current axis */
91
static int curline, curbox, curellipse, curstring;
92
/* these guys attempt to avoid reentrancy problems */
93
static int gotparams = FALSE, gotread = FALSE, gotnlfit = FALSE;
95
static int nlfit_gno, nlfit_setno, nlfit_nsteps;
96
static double *nlfit_warray = NULL;
98
char batchfile[GR_MAXPATHLEN] = "",
99
paramfile[GR_MAXPATHLEN] = "",
100
readfile[GR_MAXPATHLEN] = "";
102
static char f_string[MAX_PARS_STRING_LENGTH]; /* buffer for string to parse */
105
/* the graph, set, and its length of the parser's current state */
106
static int whichgraph;
109
/* the graph and set of the left part of a vector assignment */
110
static int vasgn_gno;
111
static int vasgn_setno;
113
static int alias_force = FALSE; /* controls whether aliases can override
116
extern char print_file[];
117
extern char *close_input;
119
static int filltype_obs;
121
static int index_shift = 0; /* 0 for C, 1 for F77 index notation */
123
static void free_tmpvrbl(grarr *vrbl);
124
static void copy_vrbl(grarr *dest, grarr *src);
125
static int find_set_bydata(double *data, target *tgt);
127
static int getcharstr(void);
128
static void ungetchstr(void);
129
static int follow(int expect, int ifyes, int ifno);
131
static int yylex(void);
132
static int yyparse(void);
133
static void yyerror(char *s);
135
static int findf(symtab_entry *keytable, char *s);
137
/* Total (intrinsic + user-defined) list of functions and keywords */
168
%token <dptr> VAR_D /* a (pointer to) double variable */
169
%token <vrbl> VEC_D /* a (pointer to) double array variable */
171
%token <ival> CONSTANT /* a (double) constant */
172
%token <ival> UCONSTANT /* a (double) unit constant */
173
%token <ival> FUNC_I /* a function of 1 int variable */
174
%token <ival> FUNC_D /* a function of 1 double variable */
175
%token <ival> FUNC_NN /* a function of 2 int parameters */
176
%token <ival> FUNC_ND /* a function of 1 int parameter and 1 double variable */
177
%token <ival> FUNC_DD /* a function of 2 double variables */
178
%token <ival> FUNC_NND /* a function of 2 int parameters and 1 double variable */
179
%token <ival> FUNC_PPD /* a function of 2 double parameters and 1 double variable */
180
%token <ival> FUNC_PPPD /* a function of 3 double parameters and 1 double variable */
183
%token <ival> ABSOLUTE
186
%token <ival> ALTXAXIS
187
%token <ival> ALTYAXIS
189
%token <ival> ANTIALIASING
191
%token <ival> ARRANGE
193
%token <ival> ASCENDING
194
%token <ival> ASPLINE
196
%token <ival> AUTOSCALE
197
%token <ival> AUTOTICKS
200
%token <ival> BACKGROUND
203
%token <ival> BARDYDY
204
%token <ival> BASELINE
208
%token <ival> BETWEEN
209
%token <ival> BLACKMAN
223
%token <ival> COEFFICIENTS
225
%token <ival> COMMENT
226
%token <ival> COMPLEX
227
%token <ival> CONSTRAINTS
230
%token <ival> DAYMONTH
231
%token <ival> DAYOFWEEKL
232
%token <ival> DAYOFWEEKS
233
%token <ival> DAYOFYEAR
235
%token <ival> DECIMAL
237
%token <ival> DEFAULT
239
%token <ival> DEGREESLAT
240
%token <ival> DEGREESLON
241
%token <ival> DEGREESMMLAT
242
%token <ival> DEGREESMMLON
243
%token <ival> DEGREESMMSSLAT
244
%token <ival> DEGREESMMSSLON
245
%token <ival> DESCENDING
246
%token <ival> DESCRIPTION
249
%token <ival> DIFFERENCE
254
%token <ival> DROPLINE
256
%token <ival> ELLIPSE
257
%token <ival> ENGINEERING
258
%token <ival> ERRORBAR
260
%token <ival> EXPONENTIAL
266
%token <ival> FIXEDPOINT
269
%token <ival> FOLLOWS
273
%token <ival> FORMULA
276
%token <ival> FREQUENCY
278
%token <ival> GENERAL
281
%token <ival> GRAPHNO
283
%token <ival> HAMMING
284
%token <ival> HANNING
285
%token <ival> HARDCOPY
290
%token <ival> HISTOGRAM
293
%token <ival> HORIZONTAL
296
%token <ival> IFILTER
298
%token <ival> INCREMENT
300
%token <ival> INTEGRATE
301
%token <ival> INTERPOLATE
308
%token <ival> LANDSCAPE
315
%token <ival> LINESTYLE
316
%token <ival> LINEWIDTH
319
%token <ival> LOCTYPE
321
%token <ival> LOGARITHMIC
327
%token <ival> MAGNITUDE
335
%token <ival> MMDDHMS
337
%token <ival> MMDDYYHMS
338
%token <ival> MMSSLAT
339
%token <ival> MMSSLON
341
%token <ival> MONTHDAY
344
%token <ival> MONTHSY
349
%token <ival> NONLFIT
354
%token <ival> OFFSETX
355
%token <ival> OFFSETY
356
%token <ival> OFILTER
360
%token <ival> OPPOSITE
364
%token <ival> PARAMETERS
366
%token <ival> PATTERN
378
%token <ival> PORTRAIT
381
%token <ival> PREPEND
389
%token <ival> RECIPROCAL
391
%token <ival> REFERENCE
393
%token <ival> REGRESS
395
%token <ival> RESTRICT
396
%token <ival> REVERSE
400
%token <ival> ROUNDED
407
%token <ival> SAVEALL
409
%token <ival> SCIENTIFIC
414
%token <ival> SFORMAT
426
%token <ival> STACKED
427
%token <ival> STACKEDBAR
428
%token <ival> STACKEDHBAR
429
%token <ival> STAGGER
434
%token <ival> SUBTITLE
438
%token <ival> TICKLABEL
442
%token <ival> TIMESTAMP
446
%token <ival> TRIANGULAR
451
%token <ival> VERSION
453
%token <ival> VERTICAL
482
%token <ival> XYBOXPLOT
483
%token <ival> XYCOLOR
484
%token <ival> XYCOLPAT
487
%token <ival> XYDXDXDYDY
494
%token <ival> XYSTRING
509
%token <ival> YYMMDDHMS
513
%token <ival> FITPARM
514
%token <ival> FITPMAX
515
%token <ival> FITPMIN
518
%token <sval> NEW_TOKEN
522
%type <ival> selectgraph
523
%type <trgt> selectset
525
%type <ival> pagelayout
526
%type <ival> pageorient
528
%type <ival> regiontype
530
%type <ival> color_select
531
%type <ival> pattern_select
532
%type <ival> font_select
534
%type <ival> lines_select
535
%type <dval> linew_select
537
%type <ival> graphtype
540
%type <ival> scaletype
541
%type <ival> signchoice
543
%type <ival> colpat_obs
544
%type <ival> direction
546
%type <ival> formatchoice
547
%type <ival> inoutchoice
548
%type <ival> justchoice
550
%type <ival> opchoice
551
%type <ival> opchoice_sel
552
%type <ival> opchoice_obs
553
%type <ival> opchoice_sel_obs
555
%type <ival> worldview
557
%type <ival> filtermethod
558
%type <ival> filtertype
560
%type <ival> tickspectype
562
%type <ival> sourcetype
564
%type <ival> interpmethod
565
%type <ival> stattype
567
%type <ival> datacolumn
572
%type <ival> fourierdata
573
%type <ival> fourierloadx
574
%type <ival> fourierloady
575
%type <ival> windowtype
577
%type <ival> nonlfitopts
582
%type <ival> proctype
588
%type <dval> jrawdate
592
%type <vrbl> lside_array
600
%nonassoc GT LT LE GE EQ NE
604
%nonassoc UMINUS NOT /* negation--unary minus */
605
%right '^' /* exponentiation */
624
| multi_list ';' list
652
$$ = nonl_parms[$1].value;
655
$$ = nonl_parms[$1].max;
658
$$ = nonl_parms[$1].min;
661
if ($2 >= $1->length) {
662
errmsg("Access beyond array bounds");
667
| stattype '(' vexpr ')' {
669
int length = $3->length;
670
if ($3->data == NULL) {
671
yyerror("NULL variable, check set type");
676
$$ = vmin($3->data, length);
679
$$ = vmax($3->data, length);
682
stasum($3->data, length, &$$, &dummy);
685
stasum($3->data, length, &dummy, &$$);
688
stasum($3->data, length, &$$, &dummy);
696
| selectset '.' LENGTH {
697
$$ = getsetlength($1->gno, $1->setno);
702
| selectgraph '.' ID {
707
$$ = ((ParserFnc) (key[$1].data)) ();
711
$$ = $1 * ((ParserFnc) (key[$2].data)) ();
717
| FUNC_I '(' iexpr ')'
719
$$ = ((ParserFnc) (key[$1].data)) ($3);
721
| FUNC_D '(' expr ')'
723
$$ = ((ParserFnc) (key[$1].data)) ($3);
725
| FUNC_ND '(' iexpr ',' expr ')'
727
$$ = ((ParserFnc) (key[$1].data)) ($3, $5);
729
| FUNC_NN '(' iexpr ',' iexpr ')'
731
$$ = ((ParserFnc) (key[$1].data)) ($3, $5);
733
| FUNC_DD '(' expr ',' expr ')'
735
$$ = ((ParserFnc) (key[$1].data)) ($3, $5);
737
| FUNC_NND '(' iexpr ',' iexpr ',' expr ')'
739
$$ = ((ParserFnc) (key[$1].data)) ($3, $5, $7);
741
| FUNC_PPD '(' expr ',' expr ',' expr ')'
743
$$ = ((ParserFnc) (key[$1].data)) ($3, $5, $7);
745
| FUNC_PPPD '(' expr ',' expr ',' expr ',' expr ')'
747
$$ = ((ParserFnc) (key[$1].data)) ($3, $5, $7, $9);
749
| selectgraph '.' VX1 {
752
| selectgraph '.' VX2 {
755
| selectgraph '.' VY1 {
758
| selectgraph '.' VY2 {
761
| selectgraph '.' WX1 {
764
| selectgraph '.' WX2 {
767
| selectgraph '.' WY1 {
770
| selectgraph '.' WY2 {
773
| DATE '(' jdate ')' {
776
| DATE '(' iexpr ',' nexpr ',' nexpr ')' { /* yr, mo, day */
777
$$ = cal_and_time_to_jul($3, $5, $7, 12, 0, 0.0);
779
| DATE '(' iexpr ',' nexpr ',' nexpr ',' nexpr ',' nexpr ',' expr ')'
780
{ /* yr, mo, day, hr, min, sec */
781
$$ = cal_and_time_to_jul($3, $5, $7, $9, $11, $13);
784
$$ = g[whichgraph].v.xv1;
787
$$ = g[whichgraph].v.xv2;
790
$$ = g[whichgraph].v.yv1;
793
$$ = g[whichgraph].v.yv2;
796
$$ = g[whichgraph].w.xg1;
799
$$ = g[whichgraph].w.xg2;
802
$$ = g[whichgraph].w.yg1;
805
$$ = g[whichgraph].w.yg2;
809
get_page_viewport(&vx, &vy);
814
get_page_viewport(&vx, &vy);
826
| '-' expr %prec UMINUS {
829
| '+' expr %prec UMINUS {
840
yyerror("Divide by zero");
848
yyerror("Divide by zero");
853
if ($1 < 0 && rint($3) != $3) {
854
yyerror("Negative value raised to non-integer power");
856
} else if ($1 == 0.0 && $3 <= 0.0) {
857
yyerror("Zero raised to non-positive power");
863
| expr '?' expr ':' expr {
901
if (parse_date($1, get_date_hint(), FALSE, &jul, &dummy)
907
yyerror("Invalid date");
919
if (parse_date($1, get_date_hint(), TRUE, &jul, &dummy)
925
yyerror("Invalid date");
933
if (fabs(itmp - $1) > 1.e-6) {
934
yyerror("Non-integer value supplied for integer");
943
yyerror("Negative value supplied for non-negative");
950
indx: '[' iexpr ']' {
951
int itmp = $2 - index_shift;
953
yyerror("Negative index");
967
double *ptr = getcol(vasgn_gno, vasgn_setno, $1);
968
$$ = &freelist[fcnt++];
969
$$->type = GRARR_SET;
972
errmsg("NULL variable - check set type");
975
$$->length = getsetlength(vasgn_gno, vasgn_setno);
978
| selectset '.' datacolumn
980
double *ptr = getcol($1->gno, $1->setno, $3);
981
$$ = &freelist[fcnt++];
982
$$->type = GRARR_SET;
985
errmsg("NULL variable - check set type");
988
$$->length = getsetlength($1->gno, $1->setno);
998
| array '[' iexpr ':' iexpr ']'
1000
int start = $3 - index_shift, stop = $5 - index_shift;
1001
if (start < 0 || stop < start || stop >= $1->length) {
1002
yyerror("Invalid index range");
1004
int len = stop - start + 1;
1005
double *ptr = xmalloc(len*SIZEOF_DOUBLE);
1006
if ($$->data == NULL) {
1007
yyerror("Not enough memory");
1010
$$ = &freelist[fcnt++];
1013
$$->type = GRARR_TMP;
1014
for (i = 0; i < len; i++) {
1015
$$->data[i] = $1->data[i + $3];
1020
| MESH '(' nexpr ')'
1024
yyerror("npoints must be > 0");
1026
double *ptr = allocate_index_data(len);
1028
errmsg("Malloc failed");
1031
$$ = &freelist[fcnt++];
1032
$$->type = GRARR_TMP;
1038
| MESH '(' expr ',' expr ',' nexpr ')'
1042
yyerror("npoints must be > 1");
1044
double *ptr = allocate_mesh($3, $5, len);
1046
errmsg("Malloc failed");
1049
$$ = &freelist[fcnt++];
1050
$$->type = GRARR_TMP;
1056
| RAND '(' nexpr ')'
1059
$$ = &freelist[fcnt++];
1060
$$->data = xmalloc($3*SIZEOF_DOUBLE);
1061
if ($$->data == NULL) {
1062
errmsg("Not enough memory");
1066
$$->type = GRARR_TMP;
1068
for (i = 0; i < $$->length; i++) {
1069
$$->data[i] = drand48();
1072
| REGNUM '(' selectset ')'
1077
rtype = RESTRICT_REG0 + $1;
1079
if (get_restriction_array($3->gno, $3->setno,
1080
rtype, FALSE, &rarray) != RETURN_SUCCESS) {
1081
errmsg("Error in region evaluation");
1085
len = getsetlength($3->gno, $3->setno);
1086
$$ = &freelist[fcnt++];
1087
$$->data = xmalloc(len*SIZEOF_DOUBLE);
1088
if ($$->data == NULL) {
1089
errmsg("Not enough memory");
1093
$$->type = GRARR_TMP;
1095
for (i = 0; i < $$->length; i++) {
1096
$$->data[i] = rarray[i];
1101
| FUNC_I '(' vexpr ')'
1104
$$ = &freelist[fcnt++];
1106
$$->type = GRARR_TMP;
1107
for (i = 0; i < $$->length; i++) {
1108
$$->data[i] = ((ParserFnc) (key[$1].data)) ((int) ($3->data[i]));
1111
| FUNC_D '(' vexpr ')'
1114
$$ = &freelist[fcnt++];
1116
$$->type = GRARR_TMP;
1117
for (i = 0; i < $$->length; i++) {
1118
$$->data[i] = ((ParserFnc) (key[$1].data)) (($3->data[i]));
1121
| FUNC_DD '(' vexpr ',' vexpr ')'
1124
if ($3->length != $5->length) {
1125
errmsg("Can't operate on vectors of different lengths");
1128
$$ = &freelist[fcnt++];
1130
$$->type = GRARR_TMP;
1132
for (i = 0; i < $$->length; i++) {
1133
$$->data[i] = ((ParserFnc) (key[$1].data)) ($3->data[i], $5->data[i]);
1136
| FUNC_DD '(' expr ',' vexpr ')'
1139
$$ = &freelist[fcnt++];
1141
$$->type = GRARR_TMP;
1143
for (i = 0; i < $$->length; i++) {
1144
$$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5->data[i]);
1147
| FUNC_DD '(' vexpr ',' expr ')'
1150
$$ = &freelist[fcnt++];
1152
$$->type = GRARR_TMP;
1154
for (i = 0; i < $$->length; i++) {
1155
$$->data[i] = ((ParserFnc) (key[$1].data)) ($3->data[i], $5);
1158
| FUNC_ND '(' iexpr ',' vexpr ')'
1161
$$ = &freelist[fcnt++];
1163
$$->type = GRARR_TMP;
1165
for (i = 0; i < $$->length; i++) {
1166
$$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5->data[i]);
1169
| FUNC_NND '(' iexpr ',' iexpr ',' vexpr ')'
1172
$$ = &freelist[fcnt++];
1174
$$->type = GRARR_TMP;
1176
for (i = 0; i < $$->length; i++) {
1177
$$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5, $7->data[i]);
1180
| FUNC_PPD '(' expr ',' expr ',' vexpr ')'
1183
$$ = &freelist[fcnt++];
1185
$$->type = GRARR_TMP;
1187
for (i = 0; i < $$->length; i++) {
1188
$$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5, $7->data[i]);
1191
| FUNC_PPPD '(' expr ',' expr ',' expr ',' vexpr ')'
1194
$$ = &freelist[fcnt++];
1196
$$->type = GRARR_TMP;
1198
for (i = 0; i < $$->length; i++) {
1199
$$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5, $7, $9->data[i]);
1205
if ($1->length != $3->length) {
1206
errmsg("Can't operate on vectors of different lengths");
1209
$$ = &freelist[fcnt++];
1211
$$->type = GRARR_TMP;
1213
for (i = 0; i < $$->length; i++) {
1214
$$->data[i] = $1->data[i] + $3->data[i];
1220
$$ = &freelist[fcnt++];
1222
$$->type = GRARR_TMP;
1224
for (i = 0; i < $$->length; i++) {
1225
$$->data[i] = $1->data[i] + $3;
1231
$$ = &freelist[fcnt++];
1233
$$->type = GRARR_TMP;
1235
for (i = 0; i < $$->length; i++) {
1236
$$->data[i] = $1 + $3->data[i];
1242
if ($1->length != $3->length) {
1243
errmsg("Can't operate on vectors of different lengths");
1246
$$ = &freelist[fcnt++];
1248
$$->type = GRARR_TMP;
1250
for (i = 0; i < $$->length; i++) {
1251
$$->data[i] = $1->data[i] - $3->data[i];
1257
$$ = &freelist[fcnt++];
1259
$$->type = GRARR_TMP;
1261
for (i = 0; i < $$->length; i++) {
1262
$$->data[i] = $1->data[i] - $3;
1268
$$ = &freelist[fcnt++];
1270
$$->type = GRARR_TMP;
1272
for (i = 0; i < $$->length; i++) {
1273
$$->data[i] = $1 - $3->data[i];
1279
if ($1->length != $3->length) {
1280
errmsg("Can't operate on vectors of different lengths");
1283
$$ = &freelist[fcnt++];
1285
$$->type = GRARR_TMP;
1287
for (i = 0; i < $$->length; i++) {
1288
$$->data[i] = $1->data[i] * $3->data[i];
1294
$$ = &freelist[fcnt++];
1296
$$->type = GRARR_TMP;
1298
for (i = 0; i < $$->length; i++) {
1299
$$->data[i] = $1->data[i] * $3;
1305
$$ = &freelist[fcnt++];
1307
$$->type = GRARR_TMP;
1309
for (i = 0; i < $$->length; i++) {
1310
$$->data[i] = $1 * $3->data[i];
1316
if ($1->length != $3->length) {
1317
errmsg("Can't operate on vectors of different lengths");
1320
$$ = &freelist[fcnt++];
1322
$$->type = GRARR_TMP;
1324
for (i = 0; i < $$->length; i++) {
1325
if ($3->data[i] == 0.0) {
1326
errmsg("Divide by zero");
1329
$$->data[i] = $1->data[i] / $3->data[i];
1336
errmsg("Divide by zero");
1339
$$ = &freelist[fcnt++];
1341
$$->type = GRARR_TMP;
1343
for (i = 0; i < $$->length; i++) {
1344
$$->data[i] = $1->data[i] / $3;
1350
$$ = &freelist[fcnt++];
1352
$$->type = GRARR_TMP;
1354
for (i = 0; i < $$->length; i++) {
1355
if ($3->data[i] == 0.0) {
1356
errmsg("Divide by zero");
1359
$$->data[i] = $1 / $3->data[i];
1365
if ($1->length != $3->length) {
1366
errmsg("Can't operate on vectors of different lengths");
1369
$$ = &freelist[fcnt++];
1371
$$->type = GRARR_TMP;
1373
for (i = 0; i < $$->length; i++) {
1374
if ($3->data[i] == 0.0) {
1375
errmsg("Divide by zero");
1378
$$->data[i] = fmod($1->data[i], $3->data[i]);
1386
errmsg("Divide by zero");
1389
$$ = &freelist[fcnt++];
1391
$$->type = GRARR_TMP;
1393
for (i = 0; i < $$->length; i++) {
1394
$$->data[i] = fmod($1->data[i], $3);
1400
$$ = &freelist[fcnt++];
1402
$$->type = GRARR_TMP;
1404
for (i = 0; i < $$->length; i++) {
1405
if ($3->data[i] == 0.0) {
1406
errmsg("Divide by zero");
1409
$$->data[i] = fmod($1, $3->data[i]);
1416
if ($1->length != $3->length) {
1417
errmsg("Can't operate on vectors of different lengths");
1420
$$ = &freelist[fcnt++];
1422
$$->type = GRARR_TMP;
1424
for (i = 0; i < $$->length; i++) {
1425
if ($1->data[i] < 0 && rint($3->data[i]) != $3->data[i]) {
1426
yyerror("Negative value raised to non-integer power");
1428
} else if ($1->data[i] == 0.0 && $3->data[i] <= 0.0) {
1429
yyerror("Zero raised to non-positive power");
1432
$$->data[i] = pow($1->data[i], $3->data[i]);
1439
$$ = &freelist[fcnt++];
1441
$$->type = GRARR_TMP;
1443
for (i = 0; i < $$->length; i++) {
1444
if ($1->data[i] < 0 && rint($3) != $3) {
1445
yyerror("Negative value raised to non-integer power");
1447
} else if ($1->data[i] == 0.0 && $3 <= 0.0) {
1448
yyerror("Zero raised to non-positive power");
1451
$$->data[i] = pow($1->data[i], $3);
1458
$$ = &freelist[fcnt++];
1460
$$->type = GRARR_TMP;
1462
for (i = 0; i < $$->length; i++) {
1463
if ($1 < 0 && rint($3->data[i]) != $3->data[i]) {
1464
yyerror("Negative value raised to non-integer power");
1466
} else if ($1 == 0.0 && $3->data[i] <= 0.0) {
1467
yyerror("Zero raised to non-positive power");
1470
$$->data[i] = pow($1, $3->data[i]);
1477
$$ = &freelist[fcnt++];
1479
$$->type = GRARR_TMP;
1480
for (i = 0; i < $$->length; i++) {
1481
$$->data[i] = $1->data[i] * ((ParserFnc) (key[$2].data)) ();
1484
| vexpr '?' expr ':' expr {
1486
$$ = &freelist[fcnt++];
1488
$$->type = GRARR_TMP;
1489
for (i = 0; i < $$->length; i++) {
1490
$$->data[i] = CAST_DBL_TO_BOOL($1->data[i]) ? $3 : $5;
1493
| vexpr '?' expr ':' vexpr {
1495
if ($1->length != $5->length) {
1496
errmsg("Can't operate on vectors of different lengths");
1499
$$ = &freelist[fcnt++];
1501
$$->type = GRARR_TMP;
1502
for (i = 0; i < $$->length; i++) {
1503
$$->data[i] = CAST_DBL_TO_BOOL($1->data[i]) ? $3 : $5->data[i];
1506
| vexpr '?' vexpr ':' expr {
1508
if ($1->length != $3->length) {
1509
errmsg("Can't operate on vectors of different lengths");
1512
$$ = &freelist[fcnt++];
1514
$$->type = GRARR_TMP;
1515
for (i = 0; i < $$->length; i++) {
1516
$$->data[i] = CAST_DBL_TO_BOOL($1->data[i]) ? $3->data[i] : $5;
1519
| vexpr '?' vexpr ':' vexpr {
1521
if ($1->length != $5->length || $1->length != $3->length) {
1522
errmsg("Can't operate on vectors of different lengths");
1525
$$ = &freelist[fcnt++];
1527
$$->type = GRARR_TMP;
1528
for (i = 0; i < $$->length; i++) {
1529
$$->data[i] = CAST_DBL_TO_BOOL($1->data[i]) ? $3->data[i] : $5->data[i];
1535
if ($1->length != $3->length) {
1536
errmsg("Can't operate on vectors of different lengths");
1539
$$ = &freelist[fcnt++];
1541
$$->type = GRARR_TMP;
1543
for (i = 0; i < $$->length; i++) {
1544
$$->data[i] = $1->data[i] || $3->data[i];
1550
$$ = &freelist[fcnt++];
1552
$$->type = GRARR_TMP;
1554
for (i = 0; i < $$->length; i++) {
1555
$$->data[i] = $1->data[i] || $3;
1561
$$ = &freelist[fcnt++];
1563
$$->type = GRARR_TMP;
1565
for (i = 0; i < $$->length; i++) {
1566
$$->data[i] = $1 || $3->data[i];
1572
if ($1->length != $3->length) {
1573
errmsg("Can't operate on vectors of different lengths");
1576
$$ = &freelist[fcnt++];
1578
$$->type = GRARR_TMP;
1580
for (i = 0; i < $$->length; i++) {
1581
$$->data[i] = $1->data[i] && $3->data[i];
1587
$$ = &freelist[fcnt++];
1589
$$->type = GRARR_TMP;
1591
for (i = 0; i < $$->length; i++) {
1592
$$->data[i] = $1->data[i] && $3;
1598
$$ = &freelist[fcnt++];
1600
$$->type = GRARR_TMP;
1602
for (i = 0; i < $$->length; i++) {
1603
$$->data[i] = $1 && $3->data[i];
1609
if ($1->length != $3->length) {
1610
errmsg("Can't operate on vectors of different lengths");
1613
$$ = &freelist[fcnt++];
1615
$$->type = GRARR_TMP;
1617
for (i = 0; i < $$->length; i++) {
1618
$$->data[i] = ($1->data[i] > $3->data[i]);
1624
$$ = &freelist[fcnt++];
1626
$$->type = GRARR_TMP;
1628
for (i = 0; i < $$->length; i++) {
1629
$$->data[i] = ($1->data[i] > $3);
1635
$$ = &freelist[fcnt++];
1637
$$->type = GRARR_TMP;
1639
for (i = 0; i < $$->length; i++) {
1640
$$->data[i] = ($1 > $3->data[i]);
1646
if ($1->length != $3->length) {
1647
errmsg("Can't operate on vectors of different lengths");
1650
$$ = &freelist[fcnt++];
1652
$$->type = GRARR_TMP;
1654
for (i = 0; i < $$->length; i++) {
1655
$$->data[i] = ($1->data[i] < $3->data[i]);
1661
$$ = &freelist[fcnt++];
1663
$$->type = GRARR_TMP;
1665
for (i = 0; i < $$->length; i++) {
1666
$$->data[i] = ($1->data[i] < $3);
1672
$$ = &freelist[fcnt++];
1674
$$->type = GRARR_TMP;
1676
for (i = 0; i < $$->length; i++) {
1677
$$->data[i] = ($1 < $3->data[i]);
1683
if ($1->length != $3->length) {
1684
errmsg("Can't operate on vectors of different lengths");
1687
$$ = &freelist[fcnt++];
1689
$$->type = GRARR_TMP;
1691
for (i = 0; i < $$->length; i++) {
1692
$$->data[i] = ($1->data[i] >= $3->data[i]);
1698
$$ = &freelist[fcnt++];
1700
$$->type = GRARR_TMP;
1702
for (i = 0; i < $$->length; i++) {
1703
$$->data[i] = ($1->data[i] >= $3);
1709
$$ = &freelist[fcnt++];
1711
$$->type = GRARR_TMP;
1713
for (i = 0; i < $$->length; i++) {
1714
$$->data[i] = ($1 >= $3->data[i]);
1720
if ($1->length != $3->length) {
1721
errmsg("Can't operate on vectors of different lengths");
1724
$$ = &freelist[fcnt++];
1726
$$->type = GRARR_TMP;
1728
for (i = 0; i < $$->length; i++) {
1729
$$->data[i] = ($1->data[i] <= $3->data[i]);
1735
$$ = &freelist[fcnt++];
1737
$$->type = GRARR_TMP;
1739
for (i = 0; i < $$->length; i++) {
1740
$$->data[i] = ($1->data[i] <= $3);
1746
$$ = &freelist[fcnt++];
1748
$$->type = GRARR_TMP;
1750
for (i = 0; i < $$->length; i++) {
1751
$$->data[i] = ($1 <= $3->data[i]);
1757
if ($1->length != $3->length) {
1758
errmsg("Can't operate on vectors of different lengths");
1761
$$ = &freelist[fcnt++];
1763
$$->type = GRARR_TMP;
1765
for (i = 0; i < $$->length; i++) {
1766
$$->data[i] = ($1->data[i] == $3->data[i]);
1772
$$ = &freelist[fcnt++];
1774
$$->type = GRARR_TMP;
1776
for (i = 0; i < $$->length; i++) {
1777
$$->data[i] = ($1->data[i] == $3);
1783
$$ = &freelist[fcnt++];
1785
$$->type = GRARR_TMP;
1787
for (i = 0; i < $$->length; i++) {
1788
$$->data[i] = ($1 == $3->data[i]);
1794
if ($1->length != $3->length) {
1795
errmsg("Can't operate on vectors of different lengths");
1798
$$ = &freelist[fcnt++];
1800
$$->type = GRARR_TMP;
1802
for (i = 0; i < $$->length; i++) {
1803
$$->data[i] = ($1->data[i] != $3->data[i]);
1809
$$ = &freelist[fcnt++];
1811
$$->type = GRARR_TMP;
1813
for (i = 0; i < $$->length; i++) {
1814
$$->data[i] = ($1->data[i] != $3);
1820
$$ = &freelist[fcnt++];
1822
$$->type = GRARR_TMP;
1824
for (i = 0; i < $$->length; i++) {
1825
$$->data[i] = ($1 != $3->data[i]);
1831
$$ = &freelist[fcnt++];
1833
$$->type = GRARR_TMP;
1834
for (i = 0; i < $$->length; i++) {
1835
$$->data[i] = !$2->data[i];
1841
$$ = &freelist[fcnt++];
1843
$$->type = GRARR_TMP;
1844
for (i = 0; i < $$->length; i++) {
1845
$$->data[i] = $2->data[i];
1848
| '-' vexpr %prec UMINUS {
1850
$$ = &freelist[fcnt++];
1852
$$->type = GRARR_TMP;
1853
for (i = 0; i < $$->length; i++) {
1854
$$->data[i] = - $2->data[i];
1867
nonl_parms[$1].value = $3;
1871
nonl_parms[$1].max = $3;
1875
nonl_parms[$1].min = $3;
1877
| array indx '=' expr
1879
if ($2 >= $1->length) {
1880
yyerror("Access beyond array bounds");
1893
if (find_set_bydata($1->data, &tgt) == RETURN_SUCCESS) {
1894
vasgn_gno = tgt.gno;
1895
vasgn_setno = tgt.setno;
1897
errmsg("Internal error");
1906
/* It can NOT be a tmp array on the left side! */
1907
errmsg("Internal error");
1915
lside_array '=' vexpr
1918
if ($1->length != $3->length) {
1919
errmsg("Left and right vectors are of different lengths");
1922
for (i = 0; i < $1->length; i++) {
1923
$1->data[i] = $3->data[i];
1926
| lside_array '=' expr
1929
for (i = 0; i < $1->length; i++) {
1938
symtab_entry tmpkey;
1941
var = xmalloc(SIZEOF_DOUBLE);
1945
tmpkey.type = KEY_VAR;
1946
tmpkey.data = (void *) var;
1947
if (addto_symtab(tmpkey) != RETURN_SUCCESS) {
1948
yyerror("Keyword already exists");
1953
| DEFINE NEW_TOKEN '[' ']'
1955
if (define_parser_arr($2) == NULL) {
1956
yyerror("Keyword already exists");
1961
| DEFINE NEW_TOKEN '[' nexpr ']'
1964
if ((var = define_parser_arr($2)) == NULL) {
1965
yyerror("Keyword already exists");
1967
realloc_vrbl(var, $4);
1974
undefine_parser_var((void *) $2);
1979
realloc_vrbl($2, 0);
1980
undefine_parser_var((void *) $2);
1983
| ALIAS CHRSTR CHRSTR {
1987
if ((position = findf(key, $3)) >= 0) {
1988
symtab_entry tmpkey;
1990
tmpkey.type = key[position].type;
1991
tmpkey.data = key[position].data;
1992
if (addto_symtab(tmpkey) != RETURN_SUCCESS) {
1993
yyerror("Keyword already exists");
1996
yyerror("Aliased keyword not found");
2001
| ALIAS FORCE onoff {
2004
| USE CHRSTR TYPE proctype FROM CHRSTR {
2005
if (load_module($6, $2, $2, $4) != 0) {
2006
yyerror("DL module load failed");
2011
| USE CHRSTR TYPE proctype FROM CHRSTR ALIAS CHRSTR {
2012
if (load_module($6, $2, $8, $4) != 0) {
2013
yyerror("DL module load failed");
2025
| REGNUM TYPE regiontype {
2028
| REGNUM color_select {
2031
| REGNUM lines_select {
2034
| REGNUM linew_select {
2037
| REGNUM LINE expr ',' expr ',' expr ',' expr
2044
| REGNUM XY expr ',' expr
2046
rg[$1].x = xrealloc(rg[$1].x, (rg[$1].n + 1) * SIZEOF_DOUBLE);
2047
rg[$1].y = xrealloc(rg[$1].y, (rg[$1].n + 1) * SIZEOF_DOUBLE);
2048
rg[$1].x[rg[$1].n] = $3;
2049
rg[$1].y[rg[$1].n] = $5;
2052
| LINK REGNUM TO selectgraph {
2060
if (set_project_version($2) != RETURN_SUCCESS) {
2061
errmsg("Project version is newer than software!");
2063
if (get_project_version() < 50001) {
2064
map_fonts(FONT_MAP_ACEGR);
2066
map_fonts(FONT_MAP_DEFAULT);
2069
| PAGE RESIZE nexpr ',' nexpr {
2070
set_page_dimensions($3, $5, TRUE);
2072
| PAGE SIZE nexpr ',' nexpr {
2073
set_page_dimensions($3, $5, FALSE);
2075
| DEVICE CHRSTR PAGE SIZE nexpr ',' nexpr {
2079
device_id = get_device_by_name($2);
2081
if (device_id < 0) {
2082
yyerror("Unknown device");
2084
dev = get_device_props(device_id);
2085
dev.pg.width = (long) ($5*dev.pg.dpi/72);
2086
dev.pg.height = (long) ($7*dev.pg.dpi/72);
2087
set_device_props(device_id, dev);
2090
| DEVICE CHRSTR DPI expr {
2094
device_id = get_device_by_name($2);
2095
if (device_id < 0) {
2096
yyerror("Unknown device");
2098
dev = get_device_props(device_id);
2100
set_device_props(device_id, dev);
2104
| DEVICE CHRSTR FONTP ANTIALIASING onoff {
2108
device_id = get_device_by_name($2);
2109
if (device_id < 0) {
2110
yyerror("Unknown device");
2112
dev = get_device_props(device_id);
2114
set_device_props(device_id, dev);
2118
| DEVICE CHRSTR FONTP onoff {
2122
device_id = get_device_by_name($2);
2123
if (device_id < 0) {
2124
yyerror("Unknown device");
2126
dev = get_device_props(device_id);
2128
set_device_props(device_id, dev);
2132
| DEVICE CHRSTR OP CHRSTR {
2135
device_id = get_device_by_name($2);
2136
if (device_id < 0) {
2137
yyerror("Unknown device");
2139
if (parse_device_options(device_id, $4) !=
2141
yyerror("Incorrect device option string");
2147
| HARDCOPY DEVICE CHRSTR {
2148
set_printer_by_name($3);
2151
| REFERENCE DATE jrawdate {
2155
allow_two_digits_years($3);
2157
| DATE WRAP YEAR iexpr {
2160
| BACKGROUND color_select {
2163
| PAGE BACKGROUND FILL onoff {
2166
| PAGE SCROLL expr '%' {
2167
scroll_proc((int) $3);
2169
| PAGE INOUT expr '%' {
2170
scrollinout_proc((int) $3);
2173
scrolling_islinked = $3;
2176
| STACK WORLD expr ',' expr ',' expr ',' expr
2178
add_world(whichgraph, $3, $5, $7, $9);
2185
| TARGET selectset {
2187
set_parser_setno(target_set.gno, target_set.setno);
2189
| WITH selectgraph {
2193
set_parser_setno($2->gno, $2->setno);
2197
| selectset LINK sourcetype CHRSTR {
2198
set_hotlink($1->gno, $1->setno, 1, $4, $3);
2201
| selectset LINK onoff {
2202
set_hotlink($1->gno, $1->setno, $3, NULL, 0);
2207
curbox = next_box();
2211
if (is_valid_box(no) ||
2212
realloc_boxes(no + 1) == RETURN_SUCCESS) {
2217
if (!is_valid_box(curbox)) {
2218
yyerror("Box not active");
2220
boxes[curbox].active = $2;
2224
if (!is_valid_box(curbox)) {
2225
yyerror("Box not active");
2227
boxes[curbox].gno = $2;
2230
| BOX expr ',' expr ',' expr ',' expr {
2231
if (!is_valid_box(curbox)) {
2232
yyerror("Box not active");
2234
boxes[curbox].x1 = $2;
2235
boxes[curbox].y1 = $4;
2236
boxes[curbox].x2 = $6;
2237
boxes[curbox].y2 = $8;
2240
| BOX LOCTYPE worldview {
2243
| BOX lines_select {
2246
| BOX linew_select {
2249
| BOX color_select {
2252
| BOX FILL color_select {
2255
| BOX FILL pattern_select {
2259
if (!is_valid_box(curbox)) {
2260
yyerror("Box not active");
2262
boxes[curbox].lines = box_lines;
2263
boxes[curbox].linew = box_linew;
2264
boxes[curbox].color = box_color;
2265
if (get_project_version() <= 40102) {
2266
switch (filltype_obs) {
2268
boxes[curbox].fillcolor = box_fillcolor;
2269
boxes[curbox].fillpattern = 1;
2272
boxes[curbox].fillcolor = 1;
2273
boxes[curbox].fillpattern = box_fillpat;
2276
boxes[curbox].fillcolor = box_fillcolor;
2277
boxes[curbox].fillpattern = 0;
2281
boxes[curbox].fillcolor = box_fillcolor;
2282
boxes[curbox].fillpattern = box_fillpat;
2284
boxes[curbox].loctype = box_loctype;
2290
curellipse = next_ellipse();
2292
| WITH ELLIPSE nexpr {
2294
if (is_valid_ellipse(no) ||
2295
realloc_ellipses(no + 1) == RETURN_SUCCESS) {
2300
if (!is_valid_ellipse(curellipse)) {
2301
yyerror("Ellipse not active");
2303
ellip[curellipse].active = $2;
2306
| ELLIPSE selectgraph {
2307
if (!is_valid_ellipse(curellipse)) {
2308
yyerror("Ellipse not active");
2310
ellip[curellipse].gno = $2;
2313
| ELLIPSE expr ',' expr ',' expr ',' expr {
2314
if (!is_valid_ellipse(curellipse)) {
2315
yyerror("Ellipse not active");
2317
ellip[curellipse].x1 = $2;
2318
ellip[curellipse].y1 = $4;
2319
ellip[curellipse].x2 = $6;
2320
ellip[curellipse].y2 = $8;
2323
| ELLIPSE LOCTYPE worldview {
2324
ellipse_loctype = $3;
2326
| ELLIPSE lines_select {
2329
| ELLIPSE linew_select {
2332
| ELLIPSE color_select {
2335
| ELLIPSE FILL color_select {
2336
ellipse_fillcolor = $3;
2338
| ELLIPSE FILL pattern_select {
2339
ellipse_fillpat = $3;
2342
if (!is_valid_ellipse(curellipse)) {
2343
yyerror("Ellipse not active");
2345
ellip[curellipse].lines = ellipse_lines;
2346
ellip[curellipse].linew = ellipse_linew;
2347
ellip[curellipse].color = ellipse_color;
2348
if (get_project_version() <= 40102) {
2349
switch (filltype_obs) {
2351
ellip[curellipse].fillcolor = ellipse_fillcolor;
2352
ellip[curellipse].fillpattern = 1;
2355
ellip[curellipse].fillcolor = 1;
2356
ellip[curellipse].fillpattern = ellipse_fillpat;
2359
ellip[curellipse].fillcolor = ellipse_fillcolor;
2360
ellip[curellipse].fillpattern = 0;
2364
ellip[curellipse].fillcolor = ellipse_fillcolor;
2365
ellip[curellipse].fillpattern = ellipse_fillpat;
2367
ellip[curellipse].loctype = ellipse_loctype;
2373
curline = next_line();
2377
if (is_valid_line(no) ||
2378
realloc_lines(no + 1) == RETURN_SUCCESS) {
2383
if (!is_valid_line(curline)) {
2384
yyerror("Line not active");
2386
lines[curline].active = $2;
2389
| LINE selectgraph {
2390
if (!is_valid_line(curline)) {
2391
yyerror("Line not active");
2393
lines[curline].gno = $2;
2396
| LINE expr ',' expr ',' expr ',' expr {
2397
if (!is_valid_line(curline)) {
2398
yyerror("Line not active");
2400
lines[curline].x1 = $2;
2401
lines[curline].y1 = $4;
2402
lines[curline].x2 = $6;
2403
lines[curline].y2 = $8;
2406
| LINE LOCTYPE worldview {
2409
| LINE linew_select {
2412
| LINE lines_select {
2415
| LINE color_select {
2418
| LINE ARROW nexpr {
2419
line_arrow_end = $3;
2421
| LINE ARROW LENGTH expr {
2424
| LINE ARROW TYPE nexpr {
2427
| LINE ARROW LAYOUT expr ',' expr {
2432
if (!is_valid_line(curline)) {
2433
yyerror("Line not active");
2435
lines[curline].lines = line_lines;
2436
lines[curline].linew = line_linew;
2437
lines[curline].color = line_color;
2438
lines[curline].arrow_end = line_arrow_end;
2439
lines[curline].arrow.length = line_asize;
2440
lines[curline].arrow.type = line_atype;
2441
lines[curline].arrow.dL_ff = line_a_dL_ff;
2442
lines[curline].arrow.lL_ff = line_a_lL_ff;
2443
lines[curline].loctype = line_loctype;
2449
curstring = next_string();
2451
| WITH STRING nexpr {
2453
if (is_valid_string(no) ||
2454
realloc_strings(no + 1) == RETURN_SUCCESS) {
2459
if (!is_valid_string(curstring)) {
2460
yyerror("String not active");
2462
pstr[curstring].active = $2;
2465
| STRING selectgraph {
2466
if (!is_valid_string(curstring)) {
2467
yyerror("String not active");
2469
pstr[curstring].gno = $2;
2472
| STRING expr ',' expr {
2473
if (!is_valid_string(curstring)) {
2474
yyerror("String not active");
2476
pstr[curstring].x = $2;
2477
pstr[curstring].y = $4;
2480
| STRING LOCTYPE worldview {
2481
string_loctype = $3;
2483
| STRING color_select {
2486
| STRING ROT nexpr {
2489
| STRING font_select {
2492
| STRING JUST nexpr {
2495
| STRING CHAR SIZE expr {
2498
| STRING DEF CHRSTR {
2499
if (!is_valid_string(curstring)) {
2500
yyerror("String not active");
2502
set_plotstr_string(&pstr[curstring], $3);
2503
pstr[curstring].color = string_color;
2504
pstr[curstring].font = string_font;
2505
pstr[curstring].just = string_just;
2506
pstr[curstring].loctype = string_loctype;
2507
pstr[curstring].rot = string_rot;
2508
pstr[curstring].charsize = string_size;
2515
timestamp.active = $2;
2517
| TIMESTAMP font_select {
2518
timestamp.font = $2;
2520
| TIMESTAMP CHAR SIZE expr {
2521
timestamp.charsize = $4;
2523
| TIMESTAMP ROT nexpr {
2526
| TIMESTAMP color_select {
2527
timestamp.color = $2;
2529
| TIMESTAMP expr ',' expr {
2533
| TIMESTAMP DEF CHRSTR {
2534
set_plotstr_string(×tamp, $3);
2539
| DEFAULT lines_select {
2540
grdefaults.lines = $2;
2542
| DEFAULT linew_select {
2543
grdefaults.linew = $2;
2545
| DEFAULT color_select {
2546
grdefaults.color = $2;
2548
| DEFAULT pattern_select {
2549
grdefaults.pattern = $2;
2551
| DEFAULT CHAR SIZE expr {
2552
grdefaults.charsize = $4;
2554
| DEFAULT font_select {
2555
grdefaults.font = $2;
2557
| DEFAULT SYMBOL SIZE expr {
2558
grdefaults.symsize = $4;
2560
| DEFAULT SFORMAT CHRSTR {
2561
strcpy(sformat, $3);
2564
| MAP FONTP nexpr TO CHRSTR ',' CHRSTR {
2565
if ((map_font_by_name($5, $3) != RETURN_SUCCESS) &&
2566
(map_font_by_name($7, $3) != RETURN_SUCCESS)) {
2567
errmsg("Failed mapping a font");
2572
| MAP COLOR nexpr TO '(' nexpr ',' nexpr ',' nexpr ')' ',' CHRSTR {
2575
cmap.rgb.green = $8;
2576
cmap.rgb.blue = $10;
2577
cmap.ctype = COLOR_MAIN;
2579
if (store_color($3, cmap) == RETURN_FAILURE) {
2580
errmsg("Failed mapping a color");
2585
| WORLD expr ',' expr ',' expr ',' expr {
2586
g[whichgraph].w.xg1 = $2;
2587
g[whichgraph].w.yg1 = $4;
2588
g[whichgraph].w.xg2 = $6;
2589
g[whichgraph].w.yg2 = $8;
2592
g[whichgraph].w.xg1 = $3;
2595
g[whichgraph].w.xg2 = $3;
2598
g[whichgraph].w.yg1 = $3;
2601
g[whichgraph].w.yg2 = $3;
2604
set_graph_znorm(whichgraph, $2);
2606
| VIEW expr ',' expr ',' expr ',' expr {
2607
g[whichgraph].v.xv1 = $2;
2608
g[whichgraph].v.yv1 = $4;
2609
g[whichgraph].v.xv2 = $6;
2610
g[whichgraph].v.yv2 = $8;
2613
g[whichgraph].v.xv1 = $3;
2616
g[whichgraph].v.xv2 = $3;
2619
g[whichgraph].v.yv1 = $3;
2622
g[whichgraph].v.yv2 = $3;
2625
set_plotstr_string(&g[whichgraph].labs.title, $2);
2628
| TITLE font_select {
2629
g[whichgraph].labs.title.font = $2;
2632
g[whichgraph].labs.title.charsize = $3;
2634
| TITLE color_select {
2635
g[whichgraph].labs.title.color = $2;
2638
set_plotstr_string(&g[whichgraph].labs.stitle, $2);
2641
| SUBTITLE font_select {
2642
g[whichgraph].labs.stitle.font = $2;
2644
| SUBTITLE SIZE expr {
2645
g[whichgraph].labs.stitle.charsize = $3;
2647
| SUBTITLE color_select {
2648
g[whichgraph].labs.stitle.color = $2;
2651
| XAXES SCALE scaletype {
2652
g[whichgraph].xscale = $3;
2654
| YAXES SCALE scaletype {
2655
g[whichgraph].yscale = $3;
2657
| XAXES INVERT onoff {
2658
g[whichgraph].xinvert = $3;
2660
| YAXES INVERT onoff {
2661
g[whichgraph].yinvert = $3;
2663
| AUTOSCALE ONREAD NONE {
2664
autoscale_onread = AUTOSCALE_NONE;
2666
| AUTOSCALE ONREAD XAXES {
2667
autoscale_onread = AUTOSCALE_X;
2669
| AUTOSCALE ONREAD YAXES {
2670
autoscale_onread = AUTOSCALE_Y;
2672
| AUTOSCALE ONREAD XYAXES {
2673
autoscale_onread = AUTOSCALE_XY;
2676
| DESCRIPTION CHRSTR {
2678
s = copy_string(NULL, get_project_description());
2679
s = concat_strings(s, $2);
2681
s = concat_strings(s, "\n");
2682
set_project_description(s);
2685
| CLEAR DESCRIPTION {
2686
set_project_description(NULL);
2690
g[whichgraph].l.active = $2;
2692
| LEGEND LOCTYPE worldview {
2693
g[whichgraph].l.loctype = $3;
2695
| LEGEND VGAP nexpr {
2696
g[whichgraph].l.vgap = $3;
2698
| LEGEND HGAP nexpr {
2699
g[whichgraph].l.hgap = $3;
2701
| LEGEND LENGTH nexpr {
2702
g[whichgraph].l.len = $3;
2704
| LEGEND INVERT onoff {
2705
g[whichgraph].l.invert = $3;
2707
| LEGEND BOX FILL color_select {
2708
g[whichgraph].l.boxfillpen.color = $4;
2710
| LEGEND BOX FILL pattern_select {
2711
g[whichgraph].l.boxfillpen.pattern = $4;
2713
| LEGEND BOX color_select {
2714
g[whichgraph].l.boxpen.color = $3;
2716
| LEGEND BOX pattern_select {
2717
g[whichgraph].l.boxpen.pattern = $3;
2719
| LEGEND BOX lines_select {
2720
g[whichgraph].l.boxlines = $3;
2722
| LEGEND BOX linew_select {
2723
g[whichgraph].l.boxlinew = $3;
2725
| LEGEND expr ',' expr {
2726
g[whichgraph].l.legx = $2;
2727
g[whichgraph].l.legy = $4;
2729
| LEGEND CHAR SIZE expr {
2730
g[whichgraph].l.charsize = $4;
2732
| LEGEND font_select {
2733
g[whichgraph].l.font = $2;
2735
| LEGEND color_select {
2736
g[whichgraph].l.color = $2;
2740
g[whichgraph].f.pen.pattern = $2;
2742
| FRAMEP TYPE nexpr {
2743
g[whichgraph].f.type = $3;
2745
| FRAMEP lines_select {
2746
g[whichgraph].f.lines = $2;
2748
| FRAMEP linew_select {
2749
g[whichgraph].f.linew = $2;
2751
| FRAMEP color_select {
2752
g[whichgraph].f.pen.color = $2;
2754
| FRAMEP pattern_select {
2755
g[whichgraph].f.pen.pattern = $2;
2757
| FRAMEP BACKGROUND color_select
2759
g[whichgraph].f.fillpen.color = $3;
2761
| FRAMEP BACKGROUND pattern_select
2763
g[whichgraph].f.fillpen.pattern = $3;
2766
| selectgraph onoff {
2767
set_graph_hidden($1, !$2);
2769
| selectgraph HIDDEN onoff {
2770
set_graph_hidden($1, $3);
2772
| selectgraph TYPE graphtype {
2773
set_graph_type($1, $3);
2775
| selectgraph STACKED onoff {
2776
set_graph_stacked($1, $3);
2779
| selectgraph BAR HGAP expr {
2780
set_graph_bargap($1, $4);
2783
| selectgraph FIXEDPOINT onoff {
2784
g[$1].locator.pointset = $3;
2786
| selectgraph FIXEDPOINT FORMAT formatchoice formatchoice {
2787
g[$1].locator.fx = $4;
2788
g[$1].locator.fy = $5;
2790
| selectgraph FIXEDPOINT PREC expr ',' expr {
2791
g[$1].locator.px = $4;
2792
g[$1].locator.py = $6;
2794
| selectgraph FIXEDPOINT XY expr ',' expr {
2795
g[$1].locator.dsx = $4;
2796
g[$1].locator.dsy = $6;
2798
| selectgraph FIXEDPOINT TYPE nexpr {
2799
g[$1].locator.pt_type = $4;
2807
| DEFINE filtertype CHRSTR filtermethod CHRSTR {
2808
if (add_io_filter($2, $4, $5, $3) != 0) {
2809
yyerror("Failed adding i/o filter");
2814
| CLEAR filtertype {
2815
clear_io_filters($2);
2818
| SOURCE sourcetype {
2821
| FORMAT formatchoice {
2824
| FIT nonlfitopts { }
2825
| FITPARM CONSTRAINTS onoff {
2826
nonl_parms[$1].constr = $3;
2844
sprintf(buf, "%g", $2);
2848
close_input = copy_string(close_input, "");
2851
close_input = copy_string(close_input, $2);
2856
| EXIT '(' iexpr ')' {
2867
strcpy(print_file, $3);
2873
graph_scroll(GSCROLL_UP);
2876
graph_scroll(GSCROLL_DOWN);
2879
graph_scroll(GSCROLL_RIGHT);
2882
graph_scroll(GSCROLL_LEFT);
2885
graph_zoom(GZOOM_SHRINK);
2888
graph_zoom(GZOOM_EXPAND);
2894
msleep_wrap((unsigned int) (1000 * $2));
2908
HelpCB("doc/UsersGuide.html");
2914
strcpy(paramfile, $2);
2918
FILE *pp = grace_openw($2);
2920
putparms(whichgraph, pp, 0);
2925
| selectset HIDDEN onoff {
2926
set_set_hidden($1->gno, $1->setno, $3);
2928
| selectset LENGTH nexpr {
2929
setlength($1->gno, $1->setno, $3);
2931
| VEC_D LENGTH nexpr {
2932
realloc_vrbl($1, $3);
2934
| selectset POINT expr ',' expr {
2935
add_point($1->gno, $1->setno, $3, $5);
2938
| selectset DROP nexpr ',' nexpr {
2939
int start = $3 - index_shift;
2940
int stop = $5 - index_shift;
2941
droppoints($1->gno, $1->setno, start, stop);
2943
| SORT selectset sorton sortdir {
2944
if (is_set_active($2->gno, $2->setno)) {
2945
sortset($2->gno, $2->setno, $3, $4 == ASCENDING ? 0 : 1);
2948
| COPY selectset TO selectset {
2949
do_copyset($2->gno, $2->setno, $4->gno, $4->setno);
2951
| APPEND selectset TO selectset {
2952
if ($2->gno != $4->gno) {
2953
errmsg("Can't append sets from different graphs");
2956
sets[0] = $4->setno;
2957
sets[1] = $2->setno;
2958
join_sets($2->gno, sets, 2);
2961
| REVERSE selectset {
2962
reverse_set($2->gno, $2->setno);
2964
| SPLIT selectset nexpr {
2965
do_splitsets($2->gno, $2->setno, $3);
2967
| MOVE selectset TO selectset {
2968
do_moveset($2->gno, $2->setno, $4->gno, $4->setno);
2970
| SWAP selectset AND selectset {
2971
do_swapset($2->gno, $2->setno, $4->gno, $4->setno);
2974
killset($2->gno, $2->setno);
2976
| KILL selectset SAVEALL {
2977
killsetdata($2->gno, $2->setno);
2979
| KILL selectgraph {
2988
| ARRANGE '(' nexpr ',' nexpr ',' expr ',' expr ',' expr ')' {
2989
arrange_graphs_simple($3, $5, 0, FALSE, $7, $9, $11);
2991
| ARRANGE '(' nexpr ',' nexpr ',' expr ',' expr ',' expr ',' onoff ',' onoff ',' onoff ')' {
2992
int order = ($13 * GA_ORDER_HV_INV) |
2993
($15 * GA_ORDER_H_INV ) |
2994
($17 * GA_ORDER_V_INV );
2995
arrange_graphs_simple($3, $5, order, FALSE, $7, $9, $11);
2997
| ARRANGE '(' nexpr ',' nexpr ',' expr ',' expr ',' expr ',' onoff ',' onoff ',' onoff ',' onoff ')' {
2998
int order = ($13 * GA_ORDER_HV_INV) |
2999
($15 * GA_ORDER_H_INV ) |
3000
($17 * GA_ORDER_V_INV );
3001
arrange_graphs_simple($3, $5, order, $19, $7, $9, $11);
3003
| NONLFIT '(' selectset ',' nexpr ')' {
3005
nlfit_gno = $3->gno;
3006
nlfit_setno = $3->setno;
3008
nlfit_warray = NULL;
3010
| NONLFIT '(' selectset ',' vexpr ',' nexpr ')' {
3011
if (getsetlength($3->gno, $3->setno) != $5->length) {
3012
errmsg("Data and weight arrays are of different lengths");
3016
nlfit_gno = $3->gno;
3017
nlfit_setno = $3->setno;
3019
nlfit_warray = copy_data_column($5->data, $5->length);
3022
| REGRESS '(' selectset ',' nexpr ')' {
3023
do_regress($3->gno, $3->setno, $5, 0, -1, 0, -1);
3025
| runtype '(' selectset ',' nexpr ')' {
3026
do_runavg($3->gno, $3->setno, $5, $1, -1, 0);
3028
| ffttype '(' selectset ',' nexpr ')' {
3029
do_fourier_command($3->gno, $3->setno, $1, $5);
3031
| ffttype '(' selectset ',' fourierdata ',' windowtype ','
3032
fourierloadx ',' fourierloady ')' {
3035
do_fourier($3->gno, $3->setno, 0, $11, $9, 0, $5, $7);
3038
do_fourier($3->gno, $3->setno, 0, $11, $9, 1, $5, $7);
3041
do_fourier($3->gno, $3->setno, 1, $11, $9, 0, $5, $7);
3044
do_fourier($3->gno, $3->setno, 1, $11, $9, 1, $5, $7);
3047
errmsg("Internal error");
3051
| INTERPOLATE '(' selectset ',' vexpr ',' interpmethod ',' onoff ')' {
3052
do_interp($3->gno, $3->setno, get_cg(), SET_SELECT_NEXT,
3053
$5->data, $5->length, $7, $9);
3055
| HISTOGRAM '(' selectset ',' vexpr ',' onoff ',' onoff ')' {
3056
do_histo($3->gno, $3->setno, get_cg(), SET_SELECT_NEXT,
3057
$5->data, $5->length - 1, $7, $9);
3059
| DIFFERENCE '(' selectset ',' nexpr ')' {
3060
do_differ($3->gno, $3->setno, $5);
3062
| INTEGRATE '(' selectset ')' {
3063
do_int($3->gno, $3->setno, 0);
3065
| XCOR '(' selectset ',' selectset ',' nexpr ',' onoff ')' {
3066
do_xcor($3->gno, $3->setno, $5->gno, $5->setno, $7, $9);
3068
| RESTRICT '(' selectset ',' vexpr ')' {
3069
int len = getsetlength($3->gno, $3->setno);
3070
if (len != $5->length) {
3071
errmsg("Filter expression is of a wrong length");
3074
rarray = xmalloc(len*SIZEOF_CHAR);
3077
for (i = 0; i < len; i++) {
3078
rarray[i] = CAST_DBL_TO_BOOL($5->data[i]);
3080
filter_set($3->gno, $3->setno, rarray);
3085
| RESTRICT '(' selectset ',' REGNUM ',' onoff ')' {
3089
rtype = RESTRICT_REG0 + $5;
3091
if (get_restriction_array($3->gno, $3->setno,
3092
rtype, $7, &rarray) != RETURN_SUCCESS) {
3093
errmsg("Error in region evaluation");
3096
filter_set($3->gno, $3->setno, rarray);
3101
if (autoscale_graph(whichgraph, AUTOSCALE_XY) != RETURN_SUCCESS) {
3102
errmsg("Can't autoscale (no active sets?)");
3106
if (autoscale_graph(whichgraph, AUTOSCALE_X) != RETURN_SUCCESS) {
3107
errmsg("Can't autoscale (no active sets?)");
3111
if (autoscale_graph(whichgraph, AUTOSCALE_Y) != RETURN_SUCCESS) {
3112
errmsg("Can't autoscale (no active sets?)");
3115
| AUTOSCALE selectset {
3116
autoscale_byset($2->gno, $2->setno, AUTOSCALE_XY);
3119
autotick_axis(whichgraph, ALL_AXES);
3121
| FOCUS selectgraph {
3123
if (is_graph_hidden(gno) == FALSE) {
3126
errmsg("Graph is not active");
3131
strcpy(readfile, $2);
3134
| READ BATCH CHRSTR {
3135
strcpy(batchfile, $3);
3138
| READ BLOCK CHRSTR {
3139
getdata(whichgraph, $3, SOURCE_DISK, LOAD_BLOCK);
3142
| READ BLOCK sourcetype CHRSTR {
3143
getdata(whichgraph, $4, $3, LOAD_BLOCK);
3146
| BLOCK xytype CHRSTR {
3147
int nc, *cols, scol;
3148
if (field_string_to_cols($3, &nc, &cols, &scol) != RETURN_SUCCESS) {
3149
errmsg("Erroneous field specifications");
3154
create_set_fromblock(whichgraph, NEW_SET,
3155
$2, nc, cols, scol, autoscale_onread);
3159
| READ xytype CHRSTR {
3162
strcpy(readfile, $3);
3165
| READ xytype sourcetype CHRSTR {
3167
strcpy(readfile, $4);
3173
getdata(whichgraph, $3, SOURCE_DISK, LOAD_NXY);
3176
| READ NXY sourcetype CHRSTR {
3177
getdata(whichgraph, $4, $3, LOAD_NXY);
3181
outputset($2->gno, $2->setno, "stdout", NULL);
3183
| WRITE selectset FORMAT CHRSTR {
3184
outputset($2->gno, $2->setno, "stdout", $4);
3187
| WRITE selectset FILEP CHRSTR {
3188
outputset($2->gno, $2->setno, $4, NULL);
3191
| WRITE selectset FILEP CHRSTR FORMAT CHRSTR {
3192
outputset($2->gno, $2->setno, $4, $6);
3218
cycle_world_stack();
3222
show_world_stack($2 - 1);
3225
clear_world_stack();
3231
do_clear_ellipses();
3243
PAGE LAYOUT pagelayout {
3248
| AUTO REDRAW onoff {
3252
draw_focus_flag = $2;
3255
focus_policy = FOCUS_SET;
3258
focus_policy = FOCUS_FOLLOWS;
3261
focus_policy = FOCUS_CLICK;
3273
set_set_hidden($1->gno, $1->setno, !$2);
3275
| selectset TYPE xytype {
3276
set_dataset_type($1->gno, $1->setno, $3);
3279
| selectset SYMBOL nexpr {
3280
g[$1->gno].p[$1->setno].sym = $3;
3282
| selectset SYMBOL color_select {
3283
g[$1->gno].p[$1->setno].sympen.color = $3;
3285
| selectset SYMBOL pattern_select {
3286
g[$1->gno].p[$1->setno].sympen.pattern = $3;
3288
| selectset SYMBOL linew_select {
3289
g[$1->gno].p[$1->setno].symlinew = $3;
3291
| selectset SYMBOL lines_select {
3292
g[$1->gno].p[$1->setno].symlines = $3;
3294
| selectset SYMBOL FILL color_select {
3295
g[$1->gno].p[$1->setno].symfillpen.color = $4;
3297
| selectset SYMBOL FILL pattern_select {
3298
g[$1->gno].p[$1->setno].symfillpen.pattern = $4;
3300
| selectset SYMBOL SIZE expr {
3301
g[$1->gno].p[$1->setno].symsize = $4;
3303
| selectset SYMBOL CHAR nexpr {
3304
g[$1->gno].p[$1->setno].symchar = $4;
3306
| selectset SYMBOL CHAR font_select {
3307
g[$1->gno].p[$1->setno].charfont = $4;
3309
| selectset SYMBOL SKIP nexpr {
3310
g[$1->gno].p[$1->setno].symskip = $4;
3313
| selectset LINE TYPE nexpr
3315
g[$1->gno].p[$1->setno].linet = $4;
3317
| selectset LINE lines_select
3319
g[$1->gno].p[$1->setno].lines = $3;
3321
| selectset LINE linew_select
3323
g[$1->gno].p[$1->setno].linew = $3;
3325
| selectset LINE color_select
3327
g[$1->gno].p[$1->setno].linepen.color = $3;
3329
| selectset LINE pattern_select
3331
g[$1->gno].p[$1->setno].linepen.pattern = $3;
3334
| selectset FILL TYPE nexpr
3336
g[$1->gno].p[$1->setno].filltype = $4;
3338
| selectset FILL RULE nexpr
3340
g[$1->gno].p[$1->setno].fillrule = $4;
3342
| selectset FILL color_select
3346
if (get_project_version() <= 40102 && get_project_version() >= 30000) {
3347
switch (filltype_obs) {
3358
g[$1->gno].p[$1->setno].setfillpen.color = prop;
3360
| selectset FILL pattern_select
3364
if (get_project_version() <= 40102) {
3365
switch (filltype_obs) {
3376
g[$1->gno].p[$1->setno].setfillpen.pattern = prop;
3380
| selectset BASELINE onoff
3382
g[$1->gno].p[$1->setno].baseline = $3;
3384
| selectset BASELINE TYPE nexpr
3386
g[$1->gno].p[$1->setno].baseline_type = $4;
3389
| selectset DROPLINE onoff
3391
g[$1->gno].p[$1->setno].dropline = $3;
3394
| selectset AVALUE onoff
3396
g[$1->gno].p[$1->setno].avalue.active = $3;
3398
| selectset AVALUE TYPE nexpr
3400
g[$1->gno].p[$1->setno].avalue.type = $4;
3402
| selectset AVALUE CHAR SIZE expr
3404
g[$1->gno].p[$1->setno].avalue.size = $5;
3406
| selectset AVALUE font_select
3408
g[$1->gno].p[$1->setno].avalue.font = $3;
3410
| selectset AVALUE color_select
3412
g[$1->gno].p[$1->setno].avalue.color = $3;
3414
| selectset AVALUE ROT nexpr
3416
g[$1->gno].p[$1->setno].avalue.angle = $4;
3418
| selectset AVALUE FORMAT formatchoice
3420
g[$1->gno].p[$1->setno].avalue.format = $4;
3422
| selectset AVALUE PREC nexpr
3424
g[$1->gno].p[$1->setno].avalue.prec = $4;
3426
| selectset AVALUE OFFSET expr ',' expr {
3427
g[$1->gno].p[$1->setno].avalue.offset.x = $4;
3428
g[$1->gno].p[$1->setno].avalue.offset.y = $6;
3430
| selectset AVALUE PREPEND CHRSTR
3432
strcpy(g[$1->gno].p[$1->setno].avalue.prestr, $4);
3435
| selectset AVALUE APPEND CHRSTR
3437
strcpy(g[$1->gno].p[$1->setno].avalue.appstr, $4);
3441
| selectset ERRORBAR onoff {
3442
g[$1->gno].p[$1->setno].errbar.active = $3;
3444
| selectset ERRORBAR opchoice_sel {
3445
g[$1->gno].p[$1->setno].errbar.ptype = $3;
3447
| selectset ERRORBAR color_select {
3448
g[$1->gno].p[$1->setno].errbar.pen.color = $3;
3450
| selectset ERRORBAR pattern_select {
3451
g[$1->gno].p[$1->setno].errbar.pen.pattern = $3;
3453
| selectset ERRORBAR SIZE expr {
3454
g[$1->gno].p[$1->setno].errbar.barsize = $4;
3456
| selectset ERRORBAR linew_select {
3457
g[$1->gno].p[$1->setno].errbar.linew = $3;
3459
| selectset ERRORBAR lines_select {
3460
g[$1->gno].p[$1->setno].errbar.lines = $3;
3462
| selectset ERRORBAR RISER linew_select {
3463
g[$1->gno].p[$1->setno].errbar.riser_linew = $4;
3465
| selectset ERRORBAR RISER lines_select {
3466
g[$1->gno].p[$1->setno].errbar.riser_lines = $4;
3468
| selectset ERRORBAR RISER CLIP onoff {
3469
g[$1->gno].p[$1->setno].errbar.arrow_clip = $5;
3471
| selectset ERRORBAR RISER CLIP LENGTH expr {
3472
g[$1->gno].p[$1->setno].errbar.cliplen = $6;
3475
| selectset COMMENT CHRSTR {
3476
strncpy(g[$1->gno].p[$1->setno].comments, $3, MAX_STRING_LENGTH - 1);
3480
| selectset LEGEND CHRSTR {
3481
strncpy(g[$1->gno].p[$1->setno].lstr, $3, MAX_STRING_LENGTH - 1);
3489
g[whichgraph].t[naxis]->active = $1;
3492
g[whichgraph].t[naxis]->zero = $3;
3495
| TICKP tickattr_obs {}
3496
| TICKLABEL ticklabelattr {}
3497
| TICKLABEL ticklabelattr_obs {}
3498
| LABEL axislabeldesc {}
3499
| LABEL axislabeldesc_obs {}
3500
| BAR axisbardesc {}
3501
| OFFSET expr ',' expr {
3502
g[whichgraph].t[naxis]->offsx = $2;
3503
g[whichgraph].t[naxis]->offsy = $4;
3509
g[whichgraph].t[naxis]->t_flag = $1;
3512
g[whichgraph].t[naxis]->tmajor = $2;
3514
| MINOR TICKSP nexpr {
3515
g[whichgraph].t[naxis]->nminor = $3;
3517
| PLACE ROUNDED onoff {
3518
g[whichgraph].t[naxis]->t_round = $3;
3522
g[whichgraph].t[naxis]->offsx = $2;
3525
g[whichgraph].t[naxis]->offsy = $2;
3528
g[whichgraph].t[naxis]->t_autonum = $2;
3531
g[whichgraph].t[naxis]->t_inout = $1;
3534
g[whichgraph].t[naxis]->props.size = $3;
3537
g[whichgraph].t[naxis]->mprops.size = $3;
3540
g[whichgraph].t[naxis]->props.color = g[whichgraph].t[naxis]->mprops.color = $1;
3542
| MAJOR color_select {
3543
g[whichgraph].t[naxis]->props.color = $2;
3545
| MINOR color_select {
3546
g[whichgraph].t[naxis]->mprops.color = $2;
3549
g[whichgraph].t[naxis]->props.linew = g[whichgraph].t[naxis]->mprops.linew = $1;
3551
| MAJOR linew_select {
3552
g[whichgraph].t[naxis]->props.linew = $2;
3554
| MINOR linew_select {
3555
g[whichgraph].t[naxis]->mprops.linew = $2;
3557
| MAJOR lines_select {
3558
g[whichgraph].t[naxis]->props.lines = $2;
3560
| MINOR lines_select {
3561
g[whichgraph].t[naxis]->mprops.lines = $2;
3563
| MAJOR GRID onoff {
3564
g[whichgraph].t[naxis]->props.gridflag = $3;
3566
| MINOR GRID onoff {
3567
g[whichgraph].t[naxis]->mprops.gridflag = $3;
3570
g[whichgraph].t[naxis]->t_op = $1;
3572
| SPEC TYPE tickspectype {
3573
g[whichgraph].t[naxis]->t_spec = $3;
3576
g[whichgraph].t[naxis]->nticks = $2;
3578
| MAJOR nexpr ',' expr {
3579
g[whichgraph].t[naxis]->tloc[$2].wtpos = $4;
3580
g[whichgraph].t[naxis]->tloc[$2].type = TICK_TYPE_MAJOR;
3582
| MINOR nexpr ',' expr {
3583
g[whichgraph].t[naxis]->tloc[$2].wtpos = $4;
3584
g[whichgraph].t[naxis]->tloc[$2].type = TICK_TYPE_MINOR;
3590
g[whichgraph].t[naxis]->tl_flag = $1;
3593
g[whichgraph].t[naxis]->tl_prec = $2;
3595
| FORMAT formatchoice {
3596
g[whichgraph].t[naxis]->tl_format = $2;
3599
g[whichgraph].t[naxis]->tl_format = $2;
3602
strcpy(g[whichgraph].t[naxis]->tl_appstr, $2);
3606
strcpy(g[whichgraph].t[naxis]->tl_prestr, $2);
3610
g[whichgraph].t[naxis]->tl_angle = $2;
3613
g[whichgraph].t[naxis]->tl_skip = $2;
3616
g[whichgraph].t[naxis]->tl_staggered = $2;
3619
g[whichgraph].t[naxis]->tl_op = $1;
3622
g[whichgraph].t[naxis]->tl_formula =
3623
copy_string(g[whichgraph].t[naxis]->tl_formula, $2);
3627
g[whichgraph].t[naxis]->tl_start = $2;
3630
g[whichgraph].t[naxis]->tl_stop = $2;
3633
g[whichgraph].t[naxis]->tl_starttype = TYPE_SPEC;
3636
g[whichgraph].t[naxis]->tl_starttype = TYPE_AUTO;
3639
g[whichgraph].t[naxis]->tl_stoptype = TYPE_SPEC;
3642
g[whichgraph].t[naxis]->tl_stoptype = TYPE_AUTO;
3645
g[whichgraph].t[naxis]->tl_charsize = $3;
3648
g[whichgraph].t[naxis]->tl_font = $1;
3651
g[whichgraph].t[naxis]->tl_color = $1;
3653
| nexpr ',' CHRSTR {
3654
g[whichgraph].t[naxis]->tloc[$1].label =
3655
copy_string(g[whichgraph].t[naxis]->tloc[$1].label, $3);
3659
g[whichgraph].t[naxis]->tl_gaptype = TYPE_AUTO;
3662
g[whichgraph].t[naxis]->tl_gaptype = TYPE_SPEC;
3664
| OFFSET expr ',' expr {
3665
g[whichgraph].t[naxis]->tl_gap.x = $2;
3666
g[whichgraph].t[naxis]->tl_gap.y = $4;
3672
set_plotstr_string(&g[whichgraph].t[naxis]->label, $1);
3676
g[whichgraph].t[naxis]->label_layout = LAYOUT_PERPENDICULAR;
3679
g[whichgraph].t[naxis]->label_layout = LAYOUT_PARALLEL;
3682
g[whichgraph].t[naxis]->label_place = TYPE_AUTO;
3685
g[whichgraph].t[naxis]->label_place = TYPE_SPEC;
3687
| PLACE expr ',' expr {
3688
g[whichgraph].t[naxis]->label.x = $2;
3689
g[whichgraph].t[naxis]->label.y = $4;
3692
g[whichgraph].t[naxis]->label.just = $2;
3695
g[whichgraph].t[naxis]->label.charsize = $3;
3698
g[whichgraph].t[naxis]->label.font = $1;
3701
g[whichgraph].t[naxis]->label.color = $1;
3704
g[whichgraph].t[naxis]->label_op = $1;
3710
g[whichgraph].t[naxis]->t_drawbar = $1;
3713
g[whichgraph].t[naxis]->t_drawbarcolor = $1;
3716
g[whichgraph].t[naxis]->t_drawbarlines = $1;
3719
g[whichgraph].t[naxis]->t_drawbarlinew = $1;
3725
nonl_opts.title = copy_string(nonl_opts.title, $2);
3729
nonl_opts.formula = copy_string(nonl_opts.formula, $2);
3732
| WITH nexpr PARAMETERS {
3733
nonl_opts.parnum = $2;
3736
nonl_opts.tolerance = $2;
3752
selectgraph '.' SETNUM
3754
int gno = $1, setno = $3;
3755
allocate_set(gno, setno);
3756
$$ = &trgt_pool[tgtn];
3761
| selectgraph '.' SET indx
3763
int gno = $1, setno = $4;
3764
allocate_set(gno, setno);
3765
$$ = &trgt_pool[tgtn];
3772
int gno = whichgraph, setno = $1;
3773
allocate_set(gno, setno);
3774
$$ = &trgt_pool[tgtn];
3781
int gno = whichgraph, setno = $2;
3782
allocate_set(gno, setno);
3783
$$ = &trgt_pool[tgtn];
3792
| selectgraph axis axisfeature {}
3796
XAXIS { naxis = X_AXIS; }
3797
| YAXIS { naxis = Y_AXIS; }
3798
| ALTXAXIS { naxis = ZX_AXIS; }
3799
| ALTYAXIS { naxis = ZY_AXIS; }
3803
KEY_CONST { $$ = CONSTANT; }
3804
| KEY_UNIT { $$ = UCONSTANT; }
3805
| KEY_FUNC_I { $$ = FUNC_I; }
3806
| KEY_FUNC_D { $$ = FUNC_D; }
3807
| KEY_FUNC_ND { $$ = FUNC_ND; }
3808
| KEY_FUNC_NN { $$ = FUNC_NN; }
3809
| KEY_FUNC_DD { $$ = FUNC_DD; }
3810
| KEY_FUNC_NND { $$ = FUNC_NND; }
3811
| KEY_FUNC_PPD { $$ = FUNC_PPD; }
3812
| KEY_FUNC_PPPD { $$ = FUNC_PPPD; }
3816
NONE { $$ = TICKS_SPEC_NONE; }
3817
| TICKSP { $$ = TICKS_SPEC_MARKS; }
3818
| BOTH { $$ = TICKS_SPEC_BOTH; }
3822
IFILTER { $$ = FILTER_INPUT; }
3823
| OFILTER { $$ = FILTER_OUTPUT; }
3827
MAGIC { $$ = FILTER_MAGIC; }
3828
| PATTERN { $$ = FILTER_PATTERN; }
3833
| BAR { $$ = SET_BAR; }
3834
| BARDY { $$ = SET_BARDY; }
3835
| BARDYDY { $$ = SET_BARDYDY; }
3836
| XYZ { $$ = SET_XYZ; }
3837
| XYDX { $$ = SET_XYDX; }
3838
| XYDY { $$ = SET_XYDY; }
3839
| XYDXDX { $$ = SET_XYDXDX; }
3840
| XYDYDY { $$ = SET_XYDYDY; }
3841
| XYDXDY { $$ = SET_XYDXDY; }
3842
| XYDXDXDYDY { $$ = SET_XYDXDXDYDY; }
3843
| XYHILO { $$ = SET_XYHILO; }
3844
| XYR { $$ = SET_XYR; }
3845
| XYSIZE { $$ = SET_XYSIZE; }
3846
| XYCOLOR { $$ = SET_XYCOLOR; }
3847
| XYCOLPAT { $$ = SET_XYCOLPAT; }
3848
| XYVMAP { $$ = SET_XYVMAP; }
3849
| XYBOXPLOT { $$ = SET_BOXPLOT; }
3850
| XYSTRING { $$ = SET_XY; }
3854
XY { $$ = GRAPH_XY; }
3855
| CHART { $$ = GRAPH_CHART; }
3856
| POLAR { $$ = GRAPH_POLAR; }
3857
| SMITH { $$ = GRAPH_SMITH; }
3858
| FIXED { $$ = GRAPH_FIXED; }
3859
| PIE { $$ = GRAPH_PIE; }
3863
FREE { $$ = PAGE_FREE; }
3864
| FIXED { $$ = PAGE_FIXED; }
3868
LANDSCAPE { $$ = PAGE_ORIENT_LANDSCAPE; }
3869
| PORTRAIT { $$ = PAGE_ORIENT_PORTRAIT; }
3873
ABOVE { $$ = REGION_ABOVE; }
3874
| BELOW { $$ = REGION_BELOW; }
3875
| LEFT { $$ = REGION_TOLEFT; }
3876
| RIGHT { $$ = REGION_TORIGHT; }
3877
| POLYI { $$ = REGION_POLYI; }
3878
| POLYO { $$ = REGION_POLYO; }
3879
| HORIZI { $$ = REGION_HORIZI; }
3880
| VERTI { $$ = REGION_VERTI; }
3881
| HORIZO { $$ = REGION_HORIZO; }
3882
| VERTO { $$ = REGION_VERTO; }
3885
scaletype: NORMAL { $$ = SCALE_NORMAL; }
3886
| LOGARITHMIC { $$ = SCALE_LOG; }
3887
| RECIPROCAL { $$ = SCALE_REC; }
3888
| LOGIT { $$ = SCALE_LOGIT; }
3891
onoff: ON { $$ = TRUE; }
3892
| OFF { $$ = FALSE; }
3895
runtype: RUNAVG { $$ = RUN_AVG; }
3896
| RUNSTD { $$ = RUN_STD; }
3897
| RUNMED { $$ = RUN_MED; }
3898
| RUNMAX { $$ = RUN_MAX; }
3899
| RUNMIN { $$ = RUN_MIN; }
3903
DISK { $$ = SOURCE_DISK; }
3904
| PIPE { $$ = SOURCE_PIPE; }
3907
justchoice: RIGHT { $$ = JUST_RIGHT; }
3908
| LEFT { $$ = JUST_LEFT; }
3909
| CENTER { $$ = JUST_CENTER; }
3912
inoutchoice: IN { $$ = TICKS_IN; }
3913
| OUT { $$ = TICKS_OUT; }
3914
| BOTH { $$ = TICKS_BOTH; }
3917
formatchoice: DECIMAL { $$ = FORMAT_DECIMAL; }
3918
| EXPONENTIAL { $$ = FORMAT_EXPONENTIAL; }
3919
| GENERAL { $$ = FORMAT_GENERAL; }
3920
| SCIENTIFIC { $$ = FORMAT_SCIENTIFIC; }
3921
| ENGINEERING { $$ = FORMAT_ENGINEERING; }
3922
| POWER { $$ = FORMAT_POWER; }
3923
| DDMMYY { $$ = FORMAT_DDMMYY; }
3924
| MMDDYY { $$ = FORMAT_MMDDYY; }
3925
| YYMMDD { $$ = FORMAT_YYMMDD; }
3926
| MMYY { $$ = FORMAT_MMYY; }
3927
| MMDD { $$ = FORMAT_MMDD; }
3928
| MONTHDAY { $$ = FORMAT_MONTHDAY; }
3929
| DAYMONTH { $$ = FORMAT_DAYMONTH; }
3930
| MONTHS { $$ = FORMAT_MONTHS; }
3931
| MONTHSY { $$ = FORMAT_MONTHSY; }
3932
| MONTHL { $$ = FORMAT_MONTHL; }
3933
| DAYOFWEEKS { $$ = FORMAT_DAYOFWEEKS; }
3934
| DAYOFWEEKL { $$ = FORMAT_DAYOFWEEKL; }
3935
| DAYOFYEAR { $$ = FORMAT_DAYOFYEAR; }
3936
| HMS { $$ = FORMAT_HMS; }
3937
| MMDDHMS { $$ = FORMAT_MMDDHMS; }
3938
| MMDDYYHMS { $$ = FORMAT_MMDDYYHMS; }
3939
| YYMMDDHMS { $$ = FORMAT_YYMMDDHMS; }
3940
| DEGREESLON { $$ = FORMAT_DEGREESLON; }
3941
| DEGREESMMLON { $$ = FORMAT_DEGREESMMLON; }
3942
| DEGREESMMSSLON { $$ = FORMAT_DEGREESMMSSLON; }
3943
| MMSSLON { $$ = FORMAT_MMSSLON; }
3944
| DEGREESLAT { $$ = FORMAT_DEGREESLAT; }
3945
| DEGREESMMLAT { $$ = FORMAT_DEGREESMMLAT; }
3946
| DEGREESMMSSLAT { $$ = FORMAT_DEGREESMMSSLAT; }
3947
| MMSSLAT { $$ = FORMAT_MMSSLAT; }
3950
signchoice: NORMAL { $$ = SIGN_NORMAL; }
3951
| ABSOLUTE { $$ = SIGN_ABSOLUTE; }
3952
| NEGATE { $$ = SIGN_NEGATE; }
3955
direction: UP { $$ = UP; }
3956
| DOWN { $$ = DOWN; }
3957
| RIGHT { $$ = RIGHT; }
3958
| LEFT { $$ = LEFT; }
3963
worldview: WORLD { $$ = COORD_WORLD; }
3964
| VIEW { $$ = COORD_VIEW; }
3967
datacolumn: X_TOK { $$ = DATA_X; }
3968
| Y_TOK { $$ = DATA_Y; }
3969
| X0 { $$ = DATA_X; }
3970
| Y0 { $$ = DATA_Y; }
3971
| Y1 { $$ = DATA_Y1; }
3972
| Y2 { $$ = DATA_Y2; }
3973
| Y3 { $$ = DATA_Y3; }
3974
| Y4 { $$ = DATA_Y4; }
3977
sortdir: ASCENDING { $$ = ASCENDING; }
3978
| DESCENDING { $$ = DESCENDING; }
3981
sorton: X_TOK { $$ = DATA_X; }
3982
| Y_TOK { $$ = DATA_Y; }
3985
ffttype: DFT { $$ = FFT_DFT; }
3986
| FFT { $$ = FFT_FFT; }
3987
| INVDFT { $$ = FFT_INVDFT; }
3988
| INVFFT { $$ = FFT_INVFFT; }
4005
| COEFFICIENTS {$$=2;}
4010
| TRIANGULAR {$$=1;}
4019
LINEAR { $$ = INTERP_LINEAR; }
4020
| SPLINE { $$ = INTERP_SPLINE; }
4021
| ASPLINE { $$ = INTERP_ASPLINE; }
4024
stattype: MINP { $$ = MINP; }
4025
| MAXP { $$ = MAXP; }
4034
$$ = get_mapped_font($2);
4038
$$ = get_font_by_name($2);
4047
if (lines >= 0 && lines < number_of_linestyles()) {
4050
errmsg("invalid linestyle");
4060
if (patno >= 0 && patno < number_of_patterns()) {
4063
errmsg("invalid pattern number");
4073
if (c >= 0 && c < number_of_colors()) {
4076
errmsg("Invalid color ID");
4082
int c = get_color_by_name($2);
4083
if (c == BAD_COLOR) {
4084
errmsg("Invalid color name");
4090
| COLOR '(' nexpr ',' nexpr ',' nexpr ')'
4095
cmap.rgb.green = $5;
4097
cmap.ctype = COLOR_MAIN;
4099
c = add_color(cmap);
4100
if (c == BAD_COLOR) {
4101
errmsg("Can't allocate requested color");
4114
yyerror("Negative linewidth");
4116
} else if (linew > MAX_LINEWIDTH) {
4117
yyerror("Linewidth too large");
4118
linew = MAX_LINEWIDTH;
4124
opchoice_sel: PLACE opchoice
4130
opchoice: NORMAL { $$ = PLACEMENT_NORMAL; }
4131
| OPPOSITE { $$ = PLACEMENT_OPPOSITE; }
4132
| BOTH { $$ = PLACEMENT_BOTH; }
4137
PAGE LAYOUT pageorient
4140
if ($3 == PAGE_ORIENT_LANDSCAPE) {
4147
set_page_dimensions(wpp, hpp, FALSE);
4149
| PAGE SIZE NUMBER NUMBER {
4150
set_page_dimensions((int) $3, (int) $4, FALSE);
4155
| PAGE INOUT nexpr {
4156
scrollinout_proc($3);
4159
| DEFAULT FONTP SOURCE expr {
4162
| STACK WORLD expr ',' expr ',' expr ',' expr TICKP expr ',' expr ',' expr ',' expr
4164
add_world(whichgraph, $3, $5, $7, $9);
4167
| BOX FILL colpat_obs {filltype_obs = $3;}
4169
| ELLIPSE FILL colpat_obs {filltype_obs = $3;}
4171
| STRING linew_select { }
4173
| TIMESTAMP linew_select { }
4175
| TITLE linew_select { }
4176
| SUBTITLE linew_select { }
4178
| LEGEND BOX onoff {
4179
if ($3 == FALSE && get_project_version() <= 40102) {
4180
g[whichgraph].l.boxpen.pattern = 0;
4184
g[whichgraph].l.legx = $3;
4187
g[whichgraph].l.legy = $3;
4189
| LEGEND STRING nexpr CHRSTR {
4190
if (is_valid_setno(whichgraph, $3)) {
4191
strncpy(g[whichgraph].p[$3].lstr, $4, MAX_STRING_LENGTH - 1);
4193
yyerror("Unallocated set");
4197
| LEGEND BOX FILL onoff { }
4198
| LEGEND BOX FILL WITH colpat_obs {filltype_obs = $5;}
4199
| LEGEND lines_select { }
4200
| LEGEND linew_select { }
4202
| selectgraph LABEL onoff { }
4204
| selectgraph TYPE LOGX {
4205
g[$1].type = GRAPH_XY;
4206
g[$1].xscale = SCALE_LOG;
4208
| selectgraph TYPE LOGY {
4209
g[$1].type = GRAPH_XY;
4210
g[$1].yscale = SCALE_LOG;
4212
| selectgraph TYPE LOGXY
4214
g[$1].type = GRAPH_XY;
4215
g[$1].xscale = SCALE_LOG;
4216
g[$1].yscale = SCALE_LOG;
4218
| selectgraph TYPE BAR
4220
g[$1].type = GRAPH_CHART;
4221
g[$1].xyflip = FALSE;
4222
g[$1].stacked = FALSE;
4224
| selectgraph TYPE HBAR
4226
g[$1].type = GRAPH_CHART;
4227
g[$1].xyflip = TRUE;
4229
| selectgraph TYPE STACKEDBAR
4231
g[$1].type = GRAPH_CHART;
4232
g[$1].stacked = TRUE;
4234
| selectgraph TYPE STACKEDHBAR
4236
g[$1].type = GRAPH_CHART;
4237
g[$1].stacked = TRUE;
4238
g[$1].xyflip = TRUE;
4241
| LEGEND LAYOUT expr {
4244
| FRAMEP FILL onoff {
4245
g[whichgraph].f.fillpen.pattern = $3;
4248
| selectgraph AUTOSCALE TYPE AUTO {
4250
| selectgraph AUTOSCALE TYPE SPEC {
4253
| LINE ARROW SIZE expr {
4254
line_asize = 2.0*$4;
4257
| HARDCOPY DEVICE expr { }
4258
| PS LINEWIDTH BEGIN expr { }
4259
| PS LINEWIDTH INCREMENT expr { }
4260
| PS linew_select { }
4266
| opchoice_sel_obs {
4267
g[whichgraph].t[naxis]->label_op = $1;
4272
selectset SYMBOL FILL nexpr {
4275
g[$1->gno].p[$1->setno].symfillpen.pattern = 0;
4278
g[$1->gno].p[$1->setno].symfillpen.pattern = 1;
4281
g[$1->gno].p[$1->setno].symfillpen.pattern = 1;
4282
g[$1->gno].p[$1->setno].symfillpen.color = getbgcolor();
4286
| selectset SKIP nexpr
4288
g[$1->gno].p[$1->setno].symskip = $3;
4290
| selectset FILL nexpr
4294
g[$1->gno].p[$1->setno].filltype = SETFILL_NONE;
4297
g[$1->gno].p[$1->setno].filltype = SETFILL_POLYGON;
4300
g[$1->gno].p[$1->setno].filltype = SETFILL_BASELINE;
4301
g[$1->gno].p[$1->setno].baseline_type = BASELINE_TYPE_0;
4304
g[$1->gno].p[$1->setno].filltype = SETFILL_BASELINE;
4305
g[$1->gno].p[$1->setno].baseline_type = BASELINE_TYPE_GMIN;
4308
g[$1->gno].p[$1->setno].filltype = SETFILL_BASELINE;
4309
g[$1->gno].p[$1->setno].baseline_type = BASELINE_TYPE_GMAX;
4313
| selectset ERRORBAR TYPE opchoice_obs {
4314
g[$1->gno].p[$1->setno].errbar.ptype = $4;
4317
* | selectset SYMBOL COLOR '-' N_NUMBER {
4318
* g[$1->gno].p[$1->setno].sympen.color = -1;
4321
| selectset SYMBOL CENTER onoff { }
4322
| selectset lines_select {
4323
g[$1->gno].p[$1->setno].lines = $2;
4325
| selectset linew_select {
4326
g[$1->gno].p[$1->setno].linew = $2;
4328
| selectset color_select {
4329
g[$1->gno].p[$1->setno].linepen.color = $2;
4331
| selectset FILL WITH colpat_obs {filltype_obs = $4;}
4332
| selectset XYZ expr ',' expr { }
4333
| selectset ERRORBAR LENGTH expr {
4334
g[$1->gno].p[$1->setno].errbar.barsize = $4;
4336
| selectset ERRORBAR RISER onoff { }
4343
g[whichgraph].t[naxis]->active = $2;
4351
g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_NONE;
4354
if (g[whichgraph].t[naxis]->t_spec != TICKS_SPEC_BOTH) {
4355
g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_MARKS;
4360
g[whichgraph].t[naxis]->nminor =
4361
(int) rint(g[whichgraph].t[naxis]->tmajor / $2 - 1);
4363
g[whichgraph].t[naxis]->nminor = 0;
4367
g[whichgraph].t[naxis]->props.size = $2;
4370
g[whichgraph].t[naxis]->tloc[$1].wtpos = $3;
4371
g[whichgraph].t[naxis]->tloc[$1].type = TICK_TYPE_MAJOR;
4373
| opchoice_sel_obs {
4374
g[whichgraph].t[naxis]->t_op = $1;
4381
if (g[whichgraph].t[naxis]->t_spec == TICKS_SPEC_BOTH) {
4382
g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_MARKS;
4386
g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_BOTH;
4390
| LAYOUT HORIZONTAL {
4391
g[whichgraph].t[naxis]->tl_angle = 0;
4394
g[whichgraph].t[naxis]->tl_angle = 90;
4396
| PLACE ON TICKSP { }
4397
| PLACE BETWEEN TICKSP { }
4398
| opchoice_sel_obs {
4399
g[whichgraph].t[naxis]->tl_op = $1;
4404
g[whichgraph].t[naxis]->tl_formula =
4405
copy_string(g[whichgraph].t[naxis]->tl_formula, "-$t");
4408
g[whichgraph].t[naxis]->tl_formula =
4409
copy_string(g[whichgraph].t[naxis]->tl_formula, "abs($t)");
4412
g[whichgraph].t[naxis]->tl_formula =
4413
copy_string(g[whichgraph].t[naxis]->tl_formula, NULL);
4424
opchoice_sel_obs: OP opchoice_obs
4430
opchoice_obs: TOP { $$ = PLACEMENT_OPPOSITE; }
4431
| BOTTOM { $$ = PLACEMENT_NORMAL; }
4432
| LEFT { $$ = PLACEMENT_NORMAL; }
4433
| RIGHT { $$ = PLACEMENT_OPPOSITE; }
4434
| BOTH { $$ = PLACEMENT_BOTH; }
4439
/* list of intrinsic functions and keywords */
4440
symtab_entry ikey[] = {
4441
{"A0", FITPARM, NULL},
4442
{"A0MAX", FITPMAX, NULL},
4443
{"A0MIN", FITPMIN, NULL},
4444
{"A1", FITPARM, NULL},
4445
{"A1MAX", FITPMAX, NULL},
4446
{"A1MIN", FITPMIN, NULL},
4447
{"A2", FITPARM, NULL},
4448
{"A2MAX", FITPMAX, NULL},
4449
{"A2MIN", FITPMIN, NULL},
4450
{"A3", FITPARM, NULL},
4451
{"A3MAX", FITPMAX, NULL},
4452
{"A3MIN", FITPMIN, NULL},
4453
{"A4", FITPARM, NULL},
4454
{"A4MAX", FITPMAX, NULL},
4455
{"A4MIN", FITPMIN, NULL},
4456
{"A5", FITPARM, NULL},
4457
{"A5MAX", FITPMAX, NULL},
4458
{"A5MIN", FITPMIN, NULL},
4459
{"A6", FITPARM, NULL},
4460
{"A6MAX", FITPMAX, NULL},
4461
{"A6MIN", FITPMIN, NULL},
4462
{"A7", FITPARM, NULL},
4463
{"A7MAX", FITPMAX, NULL},
4464
{"A7MIN", FITPMIN, NULL},
4465
{"A8", FITPARM, NULL},
4466
{"A8MAX", FITPMAX, NULL},
4467
{"A8MIN", FITPMIN, NULL},
4468
{"A9", FITPARM, NULL},
4469
{"A9MAX", FITPMAX, NULL},
4470
{"A9MIN", FITPMIN, NULL},
4471
{"ABOVE", ABOVE, NULL},
4472
{"ABS", FUNC_D, (void *) fabs},
4473
{"ABSOLUTE", ABSOLUTE, NULL},
4474
{"ACOS", FUNC_D, (void *) acos},
4475
{"ACOSH", FUNC_D, (void *) acosh},
4476
{"AI", FUNC_D, (void *) ai_wrap},
4477
{"ALIAS", ALIAS, NULL},
4479
{"ALTXAXIS", ALTXAXIS, NULL},
4480
{"ALTYAXIS", ALTYAXIS, NULL},
4482
{"ANGLE", ANGLE, NULL},
4483
{"ANTIALIASING", ANTIALIASING, NULL},
4484
{"APPEND", APPEND, NULL},
4485
{"ARRANGE", ARRANGE, NULL},
4486
{"ARROW", ARROW, NULL},
4487
{"ASCENDING", ASCENDING, NULL},
4488
{"ASIN", FUNC_D, (void *) asin},
4489
{"ASINH", FUNC_D, (void *) asinh},
4490
{"ASPLINE", ASPLINE, NULL},
4491
{"ATAN", FUNC_D, (void *) atan},
4492
{"ATAN2", FUNC_DD, (void *) atan2},
4493
{"ATANH", FUNC_D, (void *) atanh},
4494
{"AUTO", AUTO, NULL},
4495
{"AUTOSCALE", AUTOSCALE, NULL},
4496
{"AUTOTICKS", AUTOTICKS, NULL},
4497
{"AVALUE", AVALUE, NULL},
4499
{"BACKGROUND", BACKGROUND, NULL},
4501
{"BARDY", BARDY, NULL},
4502
{"BARDYDY", BARDYDY, NULL},
4503
{"BASELINE", BASELINE, NULL},
4504
{"BATCH", BATCH, NULL},
4505
{"BEGIN", BEGIN, NULL},
4506
{"BELOW", BELOW, NULL},
4507
{"BETA", FUNC_DD, (void *) beta},
4508
{"BETWEEN", BETWEEN, NULL},
4509
{"BI", FUNC_D, (void *) bi_wrap},
4510
{"BLACKMAN", BLACKMAN, NULL},
4511
{"BLOCK", BLOCK, NULL},
4512
{"BOTH", BOTH, NULL},
4513
{"BOTTOM", BOTTOM, NULL},
4516
{"CEIL", FUNC_D, (void *) ceil},
4517
{"CENTER", CENTER, NULL},
4518
{"CHAR", CHAR, NULL},
4519
{"CHART", CHART, NULL},
4520
{"CHDTR", FUNC_DD, (void *) chdtr},
4521
{"CHDTRC", FUNC_DD, (void *) chdtrc},
4522
{"CHDTRI", FUNC_DD, (void *) chdtri},
4523
{"CHI", FUNC_D, (void *) chi_wrap},
4524
{"CHRSTR", CHRSTR, NULL},
4525
{"CI", FUNC_D, (void *) ci_wrap},
4526
{"CLEAR", CLEAR, NULL},
4527
{"CLICK", CLICK, NULL},
4528
{"CLIP", CLIP, NULL},
4529
{"CLOSE", CLOSE, NULL},
4530
{"COEFFICIENTS", COEFFICIENTS, NULL},
4531
{"COLOR", COLOR, NULL},
4532
{"COMMENT", COMMENT, NULL},
4533
{"COMPLEX", COMPLEX, NULL},
4534
{"CONST", KEY_CONST, NULL},
4535
{"CONSTRAINTS", CONSTRAINTS, NULL},
4536
{"COPY", COPY, NULL},
4537
{"COS", FUNC_D, (void *) cos},
4538
{"COSH", FUNC_D, (void *) cosh},
4539
{"CYCLE", CYCLE, NULL},
4540
{"DATE", DATE, NULL},
4541
{"DAWSN", FUNC_D, (void *) dawsn},
4542
{"DAYMONTH", DAYMONTH, NULL},
4543
{"DAYOFWEEKL", DAYOFWEEKL, NULL},
4544
{"DAYOFWEEKS", DAYOFWEEKS, NULL},
4545
{"DAYOFYEAR", DAYOFYEAR, NULL},
4546
{"DDMMYY", DDMMYY, NULL},
4547
{"DECIMAL", DECIMAL, NULL},
4549
{"DEFAULT", DEFAULT, NULL},
4550
{"DEFINE", DEFINE, NULL},
4551
{"DEG", UCONSTANT, (void *) deg_uconst},
4552
{"DEGREESLAT", DEGREESLAT, NULL},
4553
{"DEGREESLON", DEGREESLON, NULL},
4554
{"DEGREESMMLAT", DEGREESMMLAT, NULL},
4555
{"DEGREESMMLON", DEGREESMMLON, NULL},
4556
{"DEGREESMMSSLAT", DEGREESMMSSLAT, NULL},
4557
{"DEGREESMMSSLON", DEGREESMMSSLON, NULL},
4558
{"DESCENDING", DESCENDING, NULL},
4559
{"DESCRIPTION", DESCRIPTION, NULL},
4560
{"DEVICE", DEVICE, NULL},
4562
{"DIFF", DIFFERENCE, NULL},
4563
{"DIFFERENCE", DIFFERENCE, NULL},
4564
{"DISK", DISK, NULL},
4565
{"DOWN", DOWN, NULL},
4567
{"DROP", DROP, NULL},
4568
{"DROPLINE", DROPLINE, NULL},
4569
{"ECHO", ECHO, NULL},
4570
{"ELLIE", FUNC_DD, (void *) ellie},
4571
{"ELLIK", FUNC_DD, (void *) ellik},
4572
{"ELLIPSE", ELLIPSE, NULL},
4573
{"ELLPE", FUNC_D, (void *) ellpe_wrap},
4574
{"ELLPK", FUNC_D, (void *) ellpk_wrap},
4575
{"ENGINEERING", ENGINEERING, NULL},
4577
{"ER", ERRORBAR, NULL},
4578
{"ERF", FUNC_D, (void *) erf},
4579
{"ERFC", FUNC_D, (void *) erfc},
4580
{"ERRORBAR", ERRORBAR, NULL},
4581
{"EXIT", EXIT, NULL},
4582
{"EXP", FUNC_D, (void *) exp},
4583
{"EXPN", FUNC_ND, (void *) expn},
4584
{"EXPONENTIAL", EXPONENTIAL, NULL},
4585
{"FAC", FUNC_I, (void *) fac},
4586
{"FALSE", OFF, NULL},
4587
{"FDTR", FUNC_NND, (void *) fdtr},
4588
{"FDTRC", FUNC_NND, (void *) fdtrc},
4589
{"FDTRI", FUNC_NND, (void *) fdtri},
4591
{"FILE", FILEP, NULL},
4592
{"FILL", FILL, NULL},
4594
{"FIXED", FIXED, NULL},
4595
{"FIXEDPOINT", FIXEDPOINT, NULL},
4596
{"FLOOR", FUNC_D, (void *) floor},
4597
{"FLUSH", FLUSH, NULL},
4598
{"FOCUS", FOCUS, NULL},
4599
{"FOLLOWS", FOLLOWS, NULL},
4600
{"FONT", FONTP, NULL},
4601
{"FORCE", FORCE, NULL},
4602
{"FORMAT", FORMAT, NULL},
4603
{"FORMULA", FORMULA, NULL},
4604
{"FRAME", FRAMEP, NULL},
4605
{"FREE", FREE, NULL},
4606
{"FREQUENCY", FREQUENCY, NULL},
4607
{"FRESNLC", FUNC_D, (void *) fresnlc_wrap},
4608
{"FRESNLS", FUNC_D, (void *) fresnls_wrap},
4609
{"FROM", FROM, NULL},
4610
{"F_OF_D", KEY_FUNC_D, NULL},
4611
{"F_OF_DD", KEY_FUNC_DD, NULL},
4612
{"F_OF_I", KEY_FUNC_I, NULL},
4613
{"F_OF_ND", KEY_FUNC_ND, NULL},
4614
{"F_OF_NN", KEY_FUNC_NN, NULL},
4615
{"F_OF_NND", KEY_FUNC_NND, NULL},
4616
{"F_OF_PPD", KEY_FUNC_PPD, NULL},
4617
{"F_OF_PPPD", KEY_FUNC_PPPD, NULL},
4618
{"GAMMA", FUNC_D, (void *) true_gamma},
4619
{"GDTR", FUNC_PPD, (void *) gdtr},
4620
{"GDTRC", FUNC_PPD, (void *) gdtrc},
4622
{"GENERAL", GENERAL, NULL},
4623
{"GETP", GETP, NULL},
4624
{"GRAPH", GRAPH, NULL},
4625
{"GRID", GRID, NULL},
4627
{"HAMMING", HAMMING, NULL},
4628
{"HANNING", HANNING, NULL},
4629
{"HARDCOPY", HARDCOPY, NULL},
4630
{"HBAR", HBAR, NULL},
4631
{"HELP", HELP, NULL},
4632
{"HGAP", HGAP, NULL},
4633
{"HIDDEN", HIDDEN, NULL},
4634
{"HISTOGRAM", HISTOGRAM, NULL},
4636
{"HORIZI", HORIZI, NULL},
4637
{"HORIZO", HORIZO, NULL},
4638
{"HORIZONTAL", HORIZONTAL, NULL},
4639
{"HYP2F1", FUNC_PPPD, (void *) hyp2f1},
4640
{"HYPERG", FUNC_PPD, (void *) hyperg},
4641
{"HYPOT", FUNC_DD, (void *) hypot},
4642
{"I0E", FUNC_D, (void *) i0e},
4643
{"I1E", FUNC_D, (void *) i1e},
4645
{"IFILTER", IFILTER, NULL},
4646
{"IGAM", FUNC_DD, (void *) igam},
4647
{"IGAMC", FUNC_DD, (void *) igamc},
4648
{"IGAMI", FUNC_DD, (void *) igami},
4650
{"INCBET", FUNC_PPD, (void *) incbet},
4651
{"INCBI", FUNC_PPD, (void *) incbi},
4652
{"INCREMENT", INCREMENT, NULL},
4653
{"INDEX", INDEX, NULL},
4654
{"INOUT", INOUT, NULL},
4655
{"INTEGRATE", INTEGRATE, NULL},
4656
{"INTERPOLATE", INTERPOLATE, NULL},
4657
{"INVDFT", INVDFT, NULL},
4658
{"INVERT", INVERT, NULL},
4659
{"INVFFT", INVFFT, NULL},
4660
{"IRAND", FUNC_I, (void *) irand_wrap},
4661
{"IV", FUNC_DD, (void *) iv_wrap},
4662
{"JUST", JUST, NULL},
4663
{"JV", FUNC_DD, (void *) jv_wrap},
4664
{"K0E", FUNC_D, (void *) k0e},
4665
{"K1E", FUNC_D, (void *) k1e},
4666
{"KILL", KILL, NULL},
4667
{"KN", FUNC_ND, (void *) kn_wrap},
4668
{"LABEL", LABEL, NULL},
4669
{"LANDSCAPE", LANDSCAPE, NULL},
4670
{"LAYOUT", LAYOUT, NULL},
4671
{"LBETA", FUNC_DD, (void *) lbeta},
4673
{"LEFT", LEFT, NULL},
4674
{"LEGEND", LEGEND, NULL},
4675
{"LENGTH", LENGTH, NULL},
4676
{"LGAMMA", FUNC_D, (void *) lgamma},
4677
{"LINE", LINE, NULL},
4678
{"LINEAR", LINEAR, NULL},
4679
{"LINESTYLE", LINESTYLE, NULL},
4680
{"LINEWIDTH", LINEWIDTH, NULL},
4681
{"LINK", LINK, NULL},
4682
{"LN", FUNC_D, (void *) log},
4683
{"LOAD", LOAD, NULL},
4684
{"LOCTYPE", LOCTYPE, NULL},
4686
{"LOG10", FUNC_D, (void *) log10},
4687
{"LOG2", FUNC_D, (void *) log2},
4688
{"LOGARITHMIC", LOGARITHMIC, NULL},
4689
{"LOGX", LOGX, NULL},
4690
{"LOGXY", LOGXY, NULL},
4691
{"LOGY", LOGY, NULL},
4692
{"LOGIT", LOGIT, NULL},
4694
{"MAGIC", MAGIC, NULL},
4695
{"MAGNITUDE", MAGNITUDE, NULL},
4696
{"MAJOR", MAJOR, NULL},
4698
{"MAX", MAXP, NULL},
4699
{"MAXOF", FUNC_DD, (void *) max_wrap},
4700
{"MESH", MESH, NULL},
4701
{"MIN", MINP, NULL},
4702
{"MINOF", FUNC_DD, (void *) min_wrap},
4703
{"MINOR", MINOR, NULL},
4704
{"MMDD", MMDD, NULL},
4705
{"MMDDHMS", MMDDHMS, NULL},
4706
{"MMDDYY", MMDDYY, NULL},
4707
{"MMDDYYHMS", MMDDYYHMS, NULL},
4708
{"MMSSLAT", MMSSLAT, NULL},
4709
{"MMSSLON", MMSSLON, NULL},
4710
{"MMYY", MMYY, NULL},
4711
{"MOD", FUNC_DD, (void *) fmod},
4712
{"MONTHDAY", MONTHDAY, NULL},
4713
{"MONTHL", MONTHL, NULL},
4714
{"MONTHS", MONTHS, NULL},
4715
{"MONTHSY", MONTHSY, NULL},
4716
{"MOVE", MOVE, NULL},
4717
{"NDTR", FUNC_D, (void *) ndtr},
4718
{"NDTRI", FUNC_D, (void *) ndtri},
4720
{"NEGATE", NEGATE, NULL},
4722
{"NONE", NONE, NULL},
4723
{"NONLFIT", NONLFIT, NULL},
4724
{"NORM", FUNC_D, (void *) fx},
4725
{"NORMAL", NORMAL, NULL},
4729
{"OFFSET", OFFSET, NULL},
4730
{"OFFSETX", OFFSETX, NULL},
4731
{"OFFSETY", OFFSETY, NULL},
4732
{"OFILTER", OFILTER, NULL},
4734
{"ONREAD", ONREAD, NULL},
4736
{"OPPOSITE", OPPOSITE, NULL},
4739
{"PAGE", PAGE, NULL},
4740
{"PARA", PARA, NULL},
4741
{"PARAMETERS", PARAMETERS, NULL},
4742
{"PARZEN", PARZEN, NULL},
4743
{"PATTERN", PATTERN, NULL},
4744
{"PDTR", FUNC_ND, (void *) pdtr},
4745
{"PDTRC", FUNC_ND, (void *) pdtrc},
4746
{"PDTRI", FUNC_ND, (void *) pdtri},
4747
{"PERIOD", PERIOD, NULL},
4748
{"PERP", PERP, NULL},
4749
{"PHASE", PHASE, NULL},
4750
{"PI", CONSTANT, (void *) pi_const},
4752
{"PIPE", PIPE, NULL},
4753
{"PLACE", PLACE, NULL},
4754
{"POINT", POINT, NULL},
4755
{"POLAR", POLAR, NULL},
4756
{"POLYI", POLYI, NULL},
4757
{"POLYO", POLYO, NULL},
4759
{"PORTRAIT", PORTRAIT, NULL},
4760
{"POWER", POWER, NULL},
4761
{"PREC", PREC, NULL},
4762
{"PREPEND", PREPEND, NULL},
4763
{"PRINT", PRINT, NULL},
4765
{"PSI", FUNC_D, (void *) psi},
4766
{"PUSH", PUSH, NULL},
4767
{"PUTP", PUTP, NULL},
4768
{"RAD", UCONSTANT, (void *) rad_uconst},
4769
{"RAND", RAND, NULL},
4770
{"READ", READ, NULL},
4771
{"REAL", REAL, NULL},
4772
{"RECIPROCAL", RECIPROCAL, NULL},
4773
{"REDRAW", REDRAW, NULL},
4774
{"REFERENCE", REFERENCE, NULL},
4775
{"REGRESS", REGRESS, NULL},
4776
{"RESIZE", RESIZE, NULL},
4777
{"RESTRICT", RESTRICT, NULL},
4778
{"REVERSE", REVERSE, NULL},
4779
{"RGAMMA", FUNC_D, (void *) rgamma},
4780
{"RIGHT", RIGHT, NULL},
4781
{"RINT", FUNC_D, (void *) rint},
4782
{"RISER", RISER, NULL},
4783
{"RNORM", FUNC_DD, (void *) rnorm},
4785
{"ROUNDED", ROUNDED, NULL},
4786
{"RULE", RULE, NULL},
4787
{"RUNAVG", RUNAVG, NULL},
4788
{"RUNMAX", RUNMAX, NULL},
4789
{"RUNMED", RUNMED, NULL},
4790
{"RUNMIN", RUNMIN, NULL},
4791
{"RUNSTD", RUNSTD, NULL},
4792
{"SAVEALL", SAVEALL, NULL},
4793
{"SCALE", SCALE, NULL},
4794
{"SCIENTIFIC", SCIENTIFIC, NULL},
4795
{"SCROLL", SCROLL, NULL},
4798
{"SFORMAT", SFORMAT, NULL},
4799
{"SHI", FUNC_D, (void *) shi_wrap},
4800
{"SI", FUNC_D, (void *) si_wrap},
4801
{"SIGN", SIGN, NULL},
4802
{"SIN", FUNC_D, (void *) sin},
4803
{"SINH", FUNC_D, (void *) sinh},
4804
{"SIZE", SIZE, NULL},
4805
{"SKIP", SKIP, NULL},
4806
{"SLEEP", SLEEP, NULL},
4807
{"SMITH", SMITH, NULL},
4808
{"SORT", SORT, NULL},
4809
{"SOURCE", SOURCE, NULL},
4810
{"SPEC", SPEC, NULL},
4811
{"SPENCE", FUNC_D, (void *) spence},
4812
{"SPLINE", SPLINE, NULL},
4813
{"SPLIT", SPLIT, NULL},
4814
{"SQR", FUNC_D, (void *) sqr_wrap},
4815
{"SQRT", FUNC_D, (void *) sqrt},
4816
{"STACK", STACK, NULL},
4817
{"STACKED", STACKED, NULL},
4818
{"STACKEDBAR", STACKEDBAR, NULL},
4819
{"STACKEDHBAR", STACKEDHBAR, NULL},
4820
{"STAGGER", STAGGER, NULL},
4821
{"START", START, NULL},
4822
{"STDTR", FUNC_ND, (void *) stdtr},
4823
{"STDTRI", FUNC_ND, (void *) stdtri},
4824
{"STOP", STOP, NULL},
4825
{"STRING", STRING, NULL},
4826
{"STRUVE", FUNC_DD, (void *) struve},
4827
{"SUBTITLE", SUBTITLE, NULL},
4829
{"SWAP", SWAP, NULL},
4830
{"SYMBOL", SYMBOL, NULL},
4831
{"TAN", FUNC_D, (void *) tan},
4832
{"TANH", FUNC_D, (void *) tanh},
4833
{"TARGET", TARGET, NULL},
4834
{"TICK", TICKP, NULL},
4835
{"TICKLABEL", TICKLABEL, NULL},
4836
{"TICKS", TICKSP, NULL},
4837
{"TIMER", TIMER, NULL},
4838
{"TIMESTAMP", TIMESTAMP, NULL},
4839
{"TITLE", TITLE, NULL},
4842
{"TRIANGULAR", TRIANGULAR, NULL},
4844
{"TYPE", TYPE, NULL},
4845
{"UNLINK", UNLINK, NULL},
4846
{"UNIT", KEY_UNIT, NULL},
4849
{"VERSION", VERSION, NULL},
4850
{"VERTI", VERTI, NULL},
4851
{"VERTICAL", VERTICAL, NULL},
4852
{"VERTO", VERTO, NULL},
4853
{"VGAP", VGAP, NULL},
4854
{"VIEW", VIEW, NULL},
4857
{"VXMAX", VXMAX, NULL},
4860
{"VYMAX", VYMAX, NULL},
4861
{"WELCH", WELCH, NULL},
4862
{"WITH", WITH, NULL},
4863
{"WORLD", WORLD, NULL},
4864
{"WRAP", WRAP, NULL},
4865
{"WRITE", WRITE, NULL},
4873
{"XAXES", XAXES, NULL},
4874
{"XAXIS", XAXIS, NULL},
4875
{"XCOR", XCOR, NULL},
4876
{"XMAX", XMAX, NULL},
4877
{"XMIN", XMIN, NULL},
4879
{"XYAXES", XYAXES, NULL},
4880
{"XYBOXPLOT", XYBOXPLOT, NULL},
4881
{"XYCOLOR", XYCOLOR, NULL},
4882
{"XYCOLPAT", XYCOLPAT, NULL},
4883
{"XYDX", XYDX, NULL},
4884
{"XYDXDX", XYDXDX, NULL},
4885
{"XYDXDXDYDY", XYDXDXDYDY, NULL},
4886
{"XYDXDY", XYDXDY, NULL},
4887
{"XYDY", XYDY, NULL},
4888
{"XYDYDY", XYDYDY, NULL},
4889
{"XYHILO", XYHILO, NULL},
4891
{"XYSIZE", XYSIZE, NULL},
4892
{"XYSTRING", XYSTRING, NULL},
4893
{"XYVMAP", XYVMAP, NULL},
4901
{"YAXES", YAXES, NULL},
4902
{"YAXIS", YAXIS, NULL},
4903
{"YEAR", YEAR, NULL},
4904
{"YMAX", YMAX, NULL},
4905
{"YMIN", YMIN, NULL},
4906
{"YV", FUNC_DD, (void *) yv_wrap},
4907
{"YYMMDD", YYMMDD, NULL},
4908
{"YYMMDDHMS", YYMMDDHMS, NULL},
4909
{"ZERO", ZERO, NULL},
4910
{"ZEROXAXIS", ALTXAXIS, NULL},
4911
{"ZEROYAXIS", ALTYAXIS, NULL},
4912
{"ZETA", FUNC_DD, (void *) zeta},
4913
{"ZETAC", FUNC_D, (void *) zetac},
4914
{"ZNORM", ZNORM, NULL}
4917
static int maxfunc = sizeof(ikey) / sizeof(symtab_entry);
4919
int get_parser_gno(void)
4924
int set_parser_gno(int gno)
4926
if (is_valid_gno(gno) == TRUE) {
4928
return RETURN_SUCCESS;
4930
return RETURN_FAILURE;
4934
int get_parser_setno(void)
4939
int set_parser_setno(int gno, int setno)
4941
if (is_valid_setno(gno, setno) == TRUE) {
4944
/* those will usually be overridden except when evaluating
4945
a _standalone_ vexpr */
4947
vasgn_setno = setno;
4948
return RETURN_SUCCESS;
4950
return RETURN_FAILURE;
4954
void realloc_vrbl(grarr *vrbl, int len)
4959
if (vrbl->type != GRARR_VEC) {
4960
errmsg("Internal error");
4963
oldlen = vrbl->length;
4964
if (oldlen == len) {
4967
a = xrealloc(vrbl->data, len*SIZEOF_DOUBLE);
4968
if (a != NULL || len == 0) {
4971
for (i = oldlen; i < len; i++) {
4972
vrbl->data[i] = 0.0;
4975
errmsg("Malloc failed in realloc_vrbl()");
4981
#define PARSER_TYPE_VOID 0
4982
#define PARSER_TYPE_EXPR 1
4983
#define PARSER_TYPE_VEXPR 2
4985
static int parser(char *s, int type)
4990
if (s == NULL || s[0] == '\0') {
4991
if (type == PARSER_TYPE_VOID) {
4992
/* don't consider an empty string as error for generic parser */
4993
return RETURN_SUCCESS;
4995
return RETURN_FAILURE;
4999
strncpy(f_string, s, MAX_PARS_STRING_LENGTH - 2);
5000
f_string[MAX_PARS_STRING_LENGTH - 2] = '\0';
5001
strcat(f_string, " ");
5005
while ((seekpos - f_string < MAX_PARS_STRING_LENGTH - 1) && (*seekpos == ' ' || *seekpos == '\t')) {
5008
if (*seekpos == '\n' || *seekpos == '#') {
5009
if (type == PARSER_TYPE_VOID) {
5010
/* don't consider an empty string as error for generic parser */
5011
return RETURN_SUCCESS;
5013
return RETURN_FAILURE;
5017
lowtoupper(f_string);
5021
expr_parsed = FALSE;
5022
vexpr_parsed = FALSE;
5026
/* free temp. arrays; for a vector expression keep the last one
5027
* (which is none but v_result), given there have been no errors
5028
* and it's what we've been asked for
5030
if (vexpr_parsed && !interr && type == PARSER_TYPE_VEXPR) {
5031
for (i = 0; i < fcnt - 1; i++) {
5032
free_tmpvrbl(&(freelist[i]));
5035
for (i = 0; i < fcnt; i++) {
5036
free_tmpvrbl(&(freelist[i]));
5043
if ((type == PARSER_TYPE_VEXPR && !vexpr_parsed) ||
5044
(type == PARSER_TYPE_EXPR && !expr_parsed)) {
5045
return RETURN_FAILURE;
5047
return (interr ? RETURN_FAILURE:RETURN_SUCCESS);
5051
int s_scanner(char *s, double *res)
5053
int retval = parser(s, PARSER_TYPE_EXPR);
5058
int v_scanner(char *s, int *reslen, double **vres)
5060
int retval = parser(s, PARSER_TYPE_VEXPR);
5061
if (retval != RETURN_SUCCESS) {
5062
return RETURN_FAILURE;
5064
*reslen = v_result->length;
5065
if (v_result->type == GRARR_TMP) {
5066
*vres = v_result->data;
5067
v_result->length = 0;
5068
v_result->data = NULL;
5070
*vres = copy_data_column(v_result->data, v_result->length);
5072
return RETURN_SUCCESS;
5076
int scanner(char *s)
5078
int retval = parser(s, PARSER_TYPE_VOID);
5079
if (retval != RETURN_SUCCESS) {
5080
return RETURN_FAILURE;
5085
getparms(paramfile);
5090
getdata(whichgraph, readfile, cursource, LOAD_SINGLE);
5095
do_nonlfit(nlfit_gno, nlfit_setno, nlfit_warray, NULL, nlfit_nsteps);
5096
XCFREE(nlfit_warray);
5101
static void free_tmpvrbl(grarr *vrbl)
5103
if (vrbl->type == GRARR_TMP) {
5109
static void copy_vrbl(grarr *dest, grarr *src)
5111
dest->type = src->type;
5112
dest->data = xmalloc(src->length*SIZEOF_DOUBLE);
5113
if (dest->data == NULL) {
5114
errmsg("Malloc failed in copy_vrbl()");
5116
memcpy(dest->data, src->data, src->length*SIZEOF_DOUBLE);
5117
dest->length = src->length;
5121
grarr *get_parser_arr_by_name(char * const name)
5126
s = copy_string(NULL, name);
5129
position = findf(key, s);
5132
if (position >= 0) {
5133
if (key[position].type == KEY_VEC) {
5134
return (grarr *) key[position].data;
5141
grarr *define_parser_arr(char * const name)
5143
if (get_parser_arr_by_name(name) == NULL) {
5144
symtab_entry tmpkey;
5147
var = xmalloc(sizeof(grarr));
5148
var->type = GRARR_VEC;
5153
tmpkey.type = KEY_VEC;
5154
tmpkey.data = (void *) var;
5155
if (addto_symtab(tmpkey) == RETURN_SUCCESS) {
5165
int undefine_parser_var(void *ptr)
5169
for (i = 0; i < maxfunc; i++) {
5170
if (key[i].data == ptr) {
5174
memmove(&(key[i]), &(key[i + 1]), (maxfunc - i)*sizeof(symtab_entry));
5176
key = xrealloc(key, maxfunc*sizeof(symtab_entry));
5177
return RETURN_SUCCESS;
5180
return RETURN_FAILURE;
5183
static int find_set_bydata(double *data, target *tgt)
5185
int gno, setno, ncol;
5188
return RETURN_FAILURE;
5190
for (gno = 0; gno < number_of_graphs(); gno++) {
5191
for (setno = 0; setno < number_of_sets(gno); setno++) {
5192
for (ncol = 0; ncol < MAX_SET_COLS; ncol++) {
5193
if (getcol(gno, setno, ncol) == data) {
5196
return RETURN_SUCCESS;
5202
return RETURN_FAILURE;
5205
static int findf(symtab_entry *keytable, char *s)
5212
while (low <= high) {
5213
mid = (low + high) / 2;
5214
if (strcmp(s, keytable[mid].s) < 0) {
5217
if (strcmp(s, keytable[mid].s) > 0) {
5227
static int compare_keys (const void *a, const void *b)
5229
return (int) strcmp (((const symtab_entry*)a)->s,
5230
((const symtab_entry*)b)->s);
5233
/* add new entry to the symbol table */
5234
int addto_symtab(symtab_entry newkey)
5239
s = copy_string(NULL, newkey.s);
5241
if ((position = findf(key, s)) < 0) {
5242
if ((key = (symtab_entry *) xrealloc(key, (maxfunc + 1)*sizeof(symtab_entry))) != NULL) {
5243
key[maxfunc].type = newkey.type;
5244
key[maxfunc].data = newkey.data;
5247
qsort(key, maxfunc, sizeof(symtab_entry), compare_keys);
5248
return RETURN_SUCCESS;
5251
return RETURN_FAILURE;
5253
} else if (alias_force == TRUE) { /* already exists but alias_force enabled */
5254
key[position].type = newkey.type;
5255
key[position].data = newkey.data;
5256
return RETURN_SUCCESS;
5259
return RETURN_FAILURE;
5263
/* initialize symbol table */
5264
void init_symtab(void)
5268
if ((key = (symtab_entry *) xmalloc(maxfunc*sizeof(symtab_entry))) != NULL) {
5269
memcpy (key, ikey, maxfunc*sizeof(symtab_entry));
5270
for (i = 0; i < maxfunc; i++) {
5271
key[i].s = xmalloc(strlen(ikey[i].s) + 1);
5272
strcpy(key[i].s, ikey[i].s);
5274
qsort(key, maxfunc, sizeof(symtab_entry), compare_keys);
5282
static int getcharstr(void)
5284
if (pos >= strlen(f_string))
5286
return (f_string[pos++]);
5289
static void ungetchstr(void)
5295
static int yylex(void)
5299
char sbuf[MAX_PARS_STRING_LENGTH + 40];
5301
while ((c = getcharstr()) == ' ' || c == '\t');
5307
while ((c = getcharstr()) != '"' && c != EOF) {
5310
ctmp = getcharstr();
5322
yyerror("Nonterminating string");
5326
yylval.sval = copy_string(NULL, sbuf);
5329
if (c == '.' || isdigit(c)) {
5334
while (c == '.' || isdigit(c)) {
5337
yyerror("Reading number, too many dots");
5346
if (c == 'E' || c == 'e') {
5349
if (c == '+' || c == '-') {
5353
while (isdigit(c)) {
5358
if (gotdot && i == 1) {
5364
sscanf(sbuf, "%lf", &d);
5368
/* graphs, sets, regions resp. */
5369
if (c == 'G' || c == 'S' || c == 'R') {
5370
int i = 0, ctmp = c, gn, sn, rn;
5372
while (isdigit(c) || c == '$' || c == '_') {
5383
if (i == 1 && sbuf[0] == '_') {
5384
gn = get_recent_gno();
5385
} else if (i == 1 && sbuf[0] == '$') {
5390
if (is_valid_gno(gn) || graph_allocate(gn) == RETURN_SUCCESS) {
5394
} else if (ctmp == 'S') {
5396
if (i == 1 && sbuf[0] == '_') {
5397
sn = get_recent_setno();
5398
} else if (i == 1 && sbuf[0] == '$') {
5405
} else if (ctmp == 'R') {
5408
if (rn >= 0 && rn < MAXREGION) {
5412
errmsg("Invalid region number");
5417
if (isalpha(c) || c == '$') {
5422
} while ((c = getcharstr()) != EOF && (isalpha(c) || isdigit(c) ||
5423
c == '_' || c == '$'));
5427
if (get_debuglevel() == 2) {
5428
printf("->%s<-\n", sbuf);
5432
if ((found = findf(key, sbuf)) >= 0) {
5433
if (key[found].type == FITPARM) {
5434
int index = sbuf[1] - '0';
5435
yylval.ival = index;
5438
else if (key[found].type == FITPMAX) {
5439
int index = sbuf[1] - '0';
5440
yylval.ival = index;
5443
else if (key[found].type == FITPMIN) {
5444
int index = sbuf[1] - '0';
5445
yylval.ival = index;
5449
else if (key[found].type == KEY_VAR) {
5450
yylval.dptr = (double *) key[found].data;
5453
else if (key[found].type == KEY_VEC) {
5454
yylval.vrbl = (grarr *) key[found].data;
5458
else if (key[found].type == FUNC_I) {
5459
yylval.ival = found;
5462
else if (key[found].type == CONSTANT) {
5463
yylval.ival = found;
5466
else if (key[found].type == UCONSTANT) {
5467
yylval.ival = found;
5470
else if (key[found].type == FUNC_D) {
5471
yylval.ival = found;
5474
else if (key[found].type == FUNC_ND) {
5475
yylval.ival = found;
5478
else if (key[found].type == FUNC_DD) {
5479
yylval.ival = found;
5482
else if (key[found].type == FUNC_NND) {
5483
yylval.ival = found;
5486
else if (key[found].type == FUNC_PPD) {
5487
yylval.ival = found;
5490
else if (key[found].type == FUNC_PPPD) {
5491
yylval.ival = found;
5495
yylval.ival = key[found].type;
5496
return key[found].type;
5499
yylval.sval = copy_string(NULL, sbuf);
5505
return follow('=', GE, GT);
5507
return follow('=', LE, LT);
5509
return follow('=', EQ, '=');
5511
return follow('=', NE, NOT);
5513
return follow('|', OR, '|');
5515
return follow('&', AND, '&');
5523
static int follow(int expect, int ifyes, int ifno)
5525
int c = getcharstr();
5534
static void yyerror(char *s)
5538
buf = copy_string(NULL, s);
5539
buf = concat_strings(buf, ": ");
5540
buf = concat_strings(buf, f_string);