p068.c

0000#define MAXINP 20500 /* maximum input characters */
0001#define MAXNOD 40000 /* maximun processed node */
0002#define MAXNMP 500   /* multi-purpose stack */
0003#include <stdio.h>
0004#include <stdlib.h>
0005#include <ctype.h>
0006#include <math.h>
0007#include "draw.h"
0008#include "gcs1.h"
0009
0010int func(void *param);
0011
0012typedef struct {
0013    char *name;
0014    char *val;
0015} entry;
0016
0017#define LF 10
0018#define CR 13
0019
0020int firstTime=1;
0021
0022void contype(int ernum) /* call before printing error message and exit */
0023{
0024 if(firstTime){
0025  printf("Content-type: text/html%c%c",10,10);
0026 }
0027 printf("*** Terminated by error %i ***\n",ernum);
0028}
0029  
0030void getword(char *word, char *line, char stop) {
0031    int x = 0,y;
0032
0033    for(x=0;((line[x]) && (line[x] != stop));x++)
0034        word[x] = line[x];
0035
0036    word[x] = '\0';
0037    if(line[x]) ++x;
0038    y=0;
0039
0040    while(line[y++] = line[x++]);
0041}
0042
0043char *makeword(char *line, char stop) {
0044    int x = 0,y;
0045    char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1));
0046
0047    for(x=0;((line[x]) && (line[x] != stop));x++)
0048        word[x] = line[x];
0049
0050    word[x] = '\0';
0051    if(line[x]) ++x;
0052    y=0;
0053
0054    while(line[y++] = line[x++]);
0055    return word;
0056}
0057
0058char *fmakeword(FILE *f, char stop, int *cl) {
0059    int wsize;
0060    char *word;
0061    int ll;
0062
0063    wsize = 1024;
0064    ll=0;
0065    word = (char *) malloc(sizeof(char) * (wsize + 1));
0066
0067    while(1) {
0068        word[ll] = (char)fgetc(f);
0069        if(ll==wsize) {
0070            word[ll+1] = '\0';
0071            wsize+=1024;
0072            if(wsize>MAXINP){
0073             contype(0);
0074             printf("Input length limit over.");
0075             exit(0);
0076            }
0077            word = (char *)realloc(word,sizeof(char)*(wsize+1));
0078        }
0079        --(*cl);
0080        if((word[ll] == stop) || (feof(f)) || (!(*cl))) {
0081            if(word[ll] != stop) ll++;
0082            word[ll] = '\0';
0083            if(ll>80){ // source allow for input field extention
0084             wsize+=1024;
0085             word = (char *)realloc(word,sizeof(char)*(wsize+1));
0086            }
0087            return word;
0088        }
0089        ++ll;
0090    }
0091}
0092
0093char x2c(char *what) {
0094    register char digit;
0095
0096    digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
0097    digit *= 16;
0098    digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
0099    return(digit);
0100}
0101
0102void unescape_url(char *url) {
0103    register int x,y;
0104
0105    for(x=0,y=0;url[y];++x,++y) {
0106        if((url[x] = url[y]) == '%') {
0107            url[x] = x2c(&url[y+1]);
0108            y+=2;
0109        }
0110    }
0111    url[x] = '\0';
0112}
0113
0114void plustospace(char *str) {
0115    register int x;
0116
0117    for(x=0;str[x];x++) if(str[x] == '+') str[x] = ' ';
0118}
0119
0120int rind(char *s, char c) {
0121    register int x;
0122    for(x=strlen(s) - 1;x != -1; x--)
0123        if(s[x] == c) return x;
0124    return -1;
0125}
0126
0127int getline(char *s, int n, FILE *f) {
0128    register int i=0;
0129
0130    while(1) {
0131        s[i] = (char)fgetc(f);
0132
0133        if(s[i] == CR)
0134            s[i] = fgetc(f);
0135
0136        if((s[i] == 0x4) || (s[i] == LF) || (i == (n-1))) {
0137            s[i] = '\0';
0138            return (feof(f) ? 1 : 0);
0139        }
0140        ++i;
0141    }
0142}
0143
0144void send_fd(FILE *f, FILE *fd)
0145{
0146    int num_chars=0;
0147    char c;
0148
0149    while (1) {
0150        c = fgetc(f);
0151        if(feof(f))
0152            return;
0153        fputc(c,fd);
0154    }
0155}
0156
0157main(int argc, char *argv[]) {
0158    entry entries[10];
0159    int x,mx=0;
0160    int cl;
0161
0162 char *inp; /* input c-code cleaned */
0163 int *tmnl; /* input terminals in teminal number (2-31) */
0164 int ninp,ntmnl; /* number of inp[] and tmnl[] */
0165 int comment; /* comment cleaning process status */
0166 char c;
0167 int stk[100]; /* stack used at parsing (grammar symbol and state pairs) */
0168 int i,j,k,l,m,n,o,i1,j1,k1,l1,m1,n1,o1;
0169 int test;
0170 FILE *fp;
0171 int *gsymbol; /* garmmar symbol */
0172 int *produc; /* production */
0173 int *parent; /* parent index */
0174 int *child; /* left-most child */
0175 int *sibli; /* next sibling */
0176 int *attri1; /* attribute 1 */
0177 int *attri2; /* attribute 2 */
0178 double *attri3; /* attribute 2 */
0179 void *param;
0180 void *para[10];
0181 int param1[10];
0182 char param2[100];
0183 double param3[5];
0184 int param4[5];
0185 int ngsymb,nattri2,nattri3;
0186 char vari[100]; /* variable name strings with last 0 */
0187 char varioff[20]; /* variable name offset */
0188 int nvari; /* number of variables */
0189 int varitype[20]; /* varable type 21:double 27:int */
0190 int varisub[20][2]; /* varable subscript */
0191 int valoff[20]; /* value offset */
0192 int ival[100]; /* int values */
0193 int nival;
0194 double dval[100]; /* double values */
0195 int ndval;
0196 char s[30];
0197 int mpstk[MAXNMP];
0198 double dstk[25];
0199 int nmp;
0200 int njp; /* jump control depth */
0201 int jmpcnt[10]; /* jump control */
0202 double d1,d2;
0203 FILE *fp1;
0204 int prs1[2592]={
0205       2,     4,    19,    21,    25,    27,    39,    41,    42,    44,
0206      48,    49,    60,    68,    70,   102,   104,   119,   121,   125,
0207     127,   139,   141,   142,   144,   148,   149,   160,   170,   199,
0208     202,   204,   219,   221,   225,   227,   299,   302,   304,   319,
0209     321,   325,   327,   399,   402,   404,   419,   421,   425,   427,
0210     499,   502,   504,   509,   525,   542,   544,   551,   552,   560,
0211     619,   621,   627,   630,   637,   639,   640,   641,   670,   702,
0212     703,   704,   706,   709,   716,   719,   721,   725,   727,   741,
0213     770,   802,   825,   844,   902,   903,   906,   909,   912,   916,
0214     919,   921,   927,   930,  1002,  1003,  1004,  1006,  1009,  1016,
0215    1019,  1021,  1025,  1027,  1102,  1103,  1104,  1106,  1109,  1116,
0216    1119,  1121,  1125,  1127,  1202,  1203,  1204,  1206,  1209,  1216,
0217    1219,  1221,  1225,  1227,  1302,  1303,  1304,  1306,  1316,  1325,
0218    1360,  1402,  1403,  1406,  1409,  1412,  1416,  1419,  1421,  1427,
0219    1430,  1502,  1504,  1525,  1542,  1544,  1560,  1602,  1604,  1619,
0220    1621,  1625,  1627,  1699,  1706,  1709,  1712,  1719,  1721,  1727,
0221    1730,  1737,  1739,  1740,  1741,  1770,  1806,  1809,  1902,  1904,
0222    1905,  1907,  1909,  1918,  1919,  1920,  1921,  1923,  1924,  1925,
0223    1926,  1927,  1928,  1929,  1930,  1931,  1999,  2006,  2009,  2119,
0224    2121,  2127,  2130,  2137,  2139,  2141,  2170,  2202,  2204,  2219,
0225    2221,  2225,  2227,  2299,  2302,  2304,  2305,  2307,  2309,  2318,
0226    2319,  2320,  2321,  2323,  2324,  2325,  2326,  2327,  2328,  2329,
0227    2330,  2331,  2402,  2404,  2405,  2407,  2409,  2418,  2419,  2420,
0228    2421,  2423,  2424,  2425,  2426,  2427,  2428,  2429,  2430,  2431,
0229    2433,  2435,  2436,  2437,  2438,  2439,  2440,  2441,  2445,  2446,
0230    2447,  2455,  2456,  2457,  2461,  2462,  2463,  2464,  2466,  2467,
0231    2470,  2471,  2472,  2502,  2504,  2509,  2525,  2542,  2544,  2551,
0232    2552,  2560,  2602,  2603,  2604,  2606,  2609,  2616,  2625,  2702,
0233    2703,  2706,  2709,  2712,  2716,  2719,  2721,  2727,  2730,  2802,
0234    2804,  2805,  2807,  2817,  2820,  2823,  2825,  2828,  2833,  2836,
0235    2838,  2845,  2857,  2861,  2862,  2863,  2871,  2872,  2903,  2919,
0236    2921,  2925,  2927,  2941,  2950,  2958,  2959,  2970,  3002,  3003,
0237    3006,  3016,  3025,  3103,  3219,  3221,  3227,  3230,  3237,  3239,
0238    3241,  3270,  3302,  3304,  3319,  3321,  3325,  3327,  3399,  3402,
0239    3404,  3405,  3407,  3420,  3423,  3425,  3428,  3430,  3433,  3435,
0240    3436,  3438,  3445,  3453,  3457,  3461,  3462,  3463,  3471,  3472,
0241    3502,  3504,  3505,  3507,  3509,  3518,  3519,  3520,  3521,  3523,
0242    3524,  3525,  3526,  3527,  3528,  3529,  3530,  3531,  3599,  3602,
0243    3604,  3625,  3642,  3644,  3651,  3660,  3702,  3704,  3719,  3721,
0244    3725,  3727,  3799,  3802,  3804,  3805,  3807,  3809,  3818,  3819,
0245    3820,  3821,  3823,  3824,  3825,  3826,  3827,  3828,  3829,  3830,
0246    3831,  3902,  3904,  3905,  3907,  3909,  3918,  3919,  3920,  3921,
0247    3923,  3924,  3925,  3926,  3927,  3928,  3929,  3930,  3931,  3933,
0248    3935,  3936,  3937,  3938,  3939,  3941,  3945,  3946,  3947,  3955,
0249    3956,  3957,  3961,  3962,  3963,  3964,  3966,  3967,  3970,  3971,
0250    3972,  4002,  4004,  4005,  4007,  4009,  4018,  4020,  4023,  4024,
0251    4025,  4026,  4028,  4029,  4030,  4031,  4033,  4035,  4036,  4037,
0252    4038,  4045,  4046,  4047,  4055,  4056,  4057,  4061,  4062,  4063,
0253    4064,  4066,  4071,  4072,  4102,  4104,  4105,  4107,  4109,  4118,
0254    4119,  4120,  4121,  4122,  4123,  4124,  4125,  4126,  4127,  4128,
0255    4129,  4130,  4131,  4199,  4202,  4204,  4205,  4207,  4209,  4218,
0256    4220,  4223,  4224,  4225,  4226,  4228,  4229,  4230,  4231,  4302,
0257    4304,  4305,  4307,  4309,  4318,  4320,  4322,  4323,  4324,  4325,
0258    4326,  4328,  4329,  4330,  4331,  4402,  4404,  4405,  4407,  4409,
0259    4418,  4420,  4422,  4423,  4424,  4425,  4426,  4428,  4429,  4430,
0260    4431,  4502,  4504,  4505,  4507,  4509,  4518,  4520,  4522,  4523,
0261    4524,  4525,  4526,  4528,  4529,  4530,  4531,  4602,  4604,  4605,
0262    4607,  4609,  4618,  4620,  4622,  4623,  4624,  4625,  4626,  4628,
0263    4629,  4630,  4631,  4702,  4704,  4705,  4707,  4709,  4718,  4720,
0264    4722,  4723,  4724,  4725,  4726,  4728,  4729,  4730,  4731,  4806,
0265    4809,  4902,  4904,  4905,  4907,  4909,  4918,  4920,  4922,  4923,
0266    4924,  4925,  4926,  4928,  4929,  4930,  4931,  5002,  5102,  5209,
0267    5302,  5304,  5305,  5307,  5309,  5320,  5323,  5325,  5328,  5333,
0268    5335,  5336,  5338,  5345,  5346,  5357,  5361,  5362,  5363,  5371,
0269    5372,  5403,  5406,  5409,  5417,  5503,  5506,  5509,  5513,  5517,
0270    5531,  5603,  5604,  5605,  5606,  5607,  5608,  5609,  5610,  5611,
0271    5612,  5613,  5614,  5615,  5617,  5631,  5703,  5706,  5709,  5710,
0272    5711,  5713,  5714,  5715,  5717,  5731,  5802,  5803,  5804,  5805,
0273    5806,  5807,  5808,  5809,  5810,  5811,  5812,  5813,  5814,  5815,
0274    5816,  5817,  5831,  5902,  5904,  5905,  5907,  5920,  5923,  5925,
0275    5928,  5936,  5938,  5961,  5962,  5971,  5972,  6003,  6005,  6006,
0276    6007,  6009,  6010,  6011,  6013,  6014,  6015,  6017,  6031,  6102,
0277    6103,  6104,  6105,  6106,  6107,  6108,  6109,  6110,  6111,  6112,
0278    6113,  6114,  6115,  6116,  6117,  6131,  6202,  6204,  6205,  6207,
0279    6220,  6223,  6225,  6228,  6302,  6304,  6305,  6307,  6320,  6323,
0280    6325,  6328,  6402,  6404,  6405,  6407,  6420,  6423,  6425,  6428,
0281    6503,  6504,  6505,  6506,  6507,  6508,  6509,  6510,  6511,  6513,
0282    6514,  6515,  6517,  6531,  6602,  6603,  6604,  6605,  6606,  6607,
0283    6608,  6609,  6610,  6611,  6612,  6613,  6614,  6615,  6616,  6617,
0284    6631,  6702,  6703,  6704,  6705,  6706,  6707,  6708,  6709,  6710,
0285    6711,  6712,  6713,  6714,  6715,  6716,  6717,  6731,  6802,  6804,
0286    6805,  6807,  6819,  6820,  6821,  6823,  6825,  6827,  6828,  6833,
0287    6835,  6836,  6838,  6845,  6846,  6857,  6861,  6862,  6863,  6865,
0288    6869,  6870,  6871,  6872,  6903,  6904,  6905,  6906,  6907,  6908,
0289    6909,  6910,  6911,  6913,  6914,  6915,  6917,  6931,  7002,  7003,
0290    7004,  7005,  7006,  7007,  7008,  7009,  7010,  7011,  7012,  7013,
0291    7014,  7015,  7016,  7017,  7031,  7102,  7103,  7104,  7105,  7106,
0292    7107,  7108,  7109,  7110,  7111,  7112,  7113,  7114,  7115,  7116,
0293    7117,  7131,  7202,  7203,  7204,  7205,  7206,  7207,  7208,  7209,
0294    7210,  7211,  7212,  7213,  7214,  7215,  7216,  7217,  7231,  7306,
0295    7309,  7312,  7413,  7417,  7502,  7503,  7506,  7509,  7512,  7516,
0296    7519,  7521,  7527,  7530,  7603,  7604,  7605,  7606,  7607,  7608,
0297    7609,  7610,  7611,  7612,  7613,  7614,  7615,  7617,  7631,  7702,
0298    7704,  7705,  7707,  7719,  7720,  7721,  7723,  7725,  7727,  7728,
0299    7733,  7735,  7736,  7738,  7745,  7746,  7757,  7761,  7762,  7763,
0300    7765,  7769,  7770,  7771,  7772,  7803,  7806,  7903,  7906,  8002,
0301    8003,  8006,  8009,  8012,  8016,  8019,  8021,  8027,  8030,  8103,
0302    8106,  8203,  8206,  8302,  8303,  8304,  8306,  8316,  8325,  8332,
0303    8342,  8343,  8344,  8360,  8402,  8403,  8406,  8409,  8412,  8416,
0304    8419,  8421,  8427,  8430,  8502,  8504,  8519,  8521,  8525,  8527,
0305    8599,  8606,  8609,  8706,  8709,  8731,  8802,  8804,  8805,  8807,
0306    8820,  8823,  8825,  8828,  8830,  8833,  8835,  8836,  8838,  8845,
0307    8853,  8854,  8857,  8861,  8862,  8863,  8871,  8872,  8906,  8909,
0308    9002,  9004,  9005,  9007,  9009,  9018,  9020,  9023,  9024,  9025,
0309    9026,  9028,  9029,  9030,  9031,  9033,  9035,  9036,  9037,  9038,
0310    9045,  9046,  9047,  9055,  9056,  9057,  9061,  9062,  9063,  9064,
0311    9066,  9071,  9072,  9102,  9104,  9105,  9107,  9109,  9118,  9119,
0312    9120,  9121,  9122,  9123,  9124,  9125,  9126,  9127,  9128,  9129,
0313    9130,  9131,  9199,  9202,  9204,  9205,  9207,  9209,  9218,  9219,
0314    9220,  9221,  9222,  9223,  9224,  9225,  9226,  9227,  9228,  9229,
0315    9230,  9231,  9299,  9302,  9304,  9305,  9307,  9309,  9318,  9320,
0316    9323,  9324,  9325,  9326,  9328,  9329,  9330,  9331,  9402,  9404,
0317    9405,  9407,  9409,  9418,  9420,  9422,  9423,  9424,  9425,  9426,
0318    9428,  9429,  9430,  9431,  9502,  9504,  9505,  9507,  9520,  9523,
0319    9525,  9528,  9533,  9535,  9536,  9538,  9545,  9557,  9561,  9562,
0320    9563,  9571,  9572,  9602,  9604,  9605,  9607,  9620,  9623,  9625,
0321    9628,  9633,  9635,  9636,  9638,  9645,  9646,  9657,  9661,  9662,
0322    9663,  9671,  9672,  9702,  9704,  9705,  9707,  9709,  9720,  9723,
0323    9725,  9728,  9733,  9735,  9736,  9738,  9745,  9746,  9757,  9761,
0324    9762,  9763,  9771,  9772,  9802,  9804,  9805,  9807,  9809,  9818,
0325    9820,  9822,  9823,  9824,  9825,  9826,  9828,  9829,  9830,  9831,
0326    9906,  9909, 10002, 10004, 10005, 10007, 10009, 10018, 10020, 10022,
0327   10023, 10024, 10025, 10026, 10028, 10029, 10030, 10031, 10102, 10104,
0328   10105, 10107, 10120, 10123, 10125, 10128, 10133, 10136, 10138, 10157,
0329   10161, 10162, 10163, 10171, 10172, 10202, 10204, 10205, 10207, 10220,
0330   10223, 10225, 10228, 10233, 10235, 10236, 10238, 10245, 10257, 10261,
0331   10262, 10263, 10271, 10272, 10302, 10304, 10305, 10307, 10320, 10323,
0332   10325, 10328, 10333, 10336, 10338, 10357, 10361, 10362, 10371, 10372,
0333   10402, 10404, 10405, 10407, 10420, 10423, 10425, 10428, 10433, 10436,
0334   10438, 10457, 10461, 10462, 10471, 10472, 10502, 10504, 10505, 10507,
0335   10520, 10523, 10525, 10528, 10533, 10536, 10538, 10557, 10561, 10562,
0336   10571, 10572, 10602, 10604, 10605, 10607, 10620, 10623, 10625, 10628,
0337   10633, 10636, 10638, 10657, 10661, 10662, 10671, 10672, 10702, 10704,
0338   10705, 10707, 10720, 10723, 10725, 10728, 10733, 10735, 10736, 10738,
0339   10745, 10746, 10757, 10761, 10762, 10763, 10771, 10772, 10802, 10803,
0340   10804, 10805, 10807, 10820, 10823, 10825, 10828, 10833, 10834, 10835,
0341   10836, 10838, 10845, 10857, 10861, 10862, 10863, 10871, 10872, 10903,
0342   10904, 10905, 10906, 10907, 10908, 10909, 10910, 10911, 10912, 10913,
0343   10914, 10915, 10917, 10931, 11002, 11004, 11005, 11007, 11020, 11023,
0344   11025, 11028, 11036, 11038, 11057, 11061, 11062, 11071, 11072, 11102,
0345   11104, 11105, 11107, 11120, 11123, 11125, 11128, 11136, 11138, 11157,
0346   11161, 11162, 11171, 11172, 11202, 11204, 11205, 11207, 11220, 11223,
0347   11225, 11228, 11236, 11238, 11261, 11262, 11271, 11272, 11302, 11304,
0348   11305, 11307, 11320, 11323, 11325, 11328, 11336, 11338, 11361, 11362,
0349   11371, 11372, 11403, 11406, 11503, 11602, 11603, 11604, 11616, 11632,
0350   11643, 11660, 11702, 11703, 11704, 11716, 11719, 11721, 11727, 11765,
0351   11770, 11802, 11803, 11806, 11809, 11812, 11816, 11819, 11821, 11827,
0352   11830, 11902, 11903, 11906, 11909, 11912, 11916, 11919, 11921, 11927,
0353   11930, 12019, 12021, 12027, 12041, 12058, 12070, 12102, 12103, 12106,
0354   12109, 12112, 12116, 12119, 12121, 12127, 12130, 12225, 12303, 12306,
0355   12403, 12406, 12502, 12503, 12506, 12516, 12525, 12543, 12544, 12602,
0356   12603, 12606, 12616, 12702, 12703, 12704, 12716, 12719, 12721, 12725,
0357   12727, 12732, 12741, 12742, 12743, 12744, 12758, 12759, 12760, 12770,
0358   12802, 12804, 12805, 12807, 12817, 12820, 12823, 12825, 12828, 12833,
0359   12836, 12838, 12845, 12857, 12861, 12862, 12863, 12871, 12872, 12906,
0360   12931, 13006, 13031, 13102, 13104, 13105, 13107, 13109, 13118, 13119,
0361   13120, 13121, 13122, 13123, 13124, 13125, 13126, 13127, 13128, 13129,
0362   13130, 13131, 13199, 13203, 13206, 13209, 13217, 13303, 13306, 13406,
0363   13409, 13502, 13504, 13505, 13507, 13509, 13520, 13523, 13525, 13528,
0364   13533, 13535, 13536, 13538, 13545, 13546, 13557, 13561, 13562, 13563,
0365   13571, 13572, 13602, 13604, 13605, 13607, 13609, 13618, 13620, 13622,
0366   13623, 13624, 13625, 13626, 13628, 13629, 13630, 13631, 13703, 13706,
0367   13709, 13710, 13711, 13713, 13714, 13715, 13717, 13731, 13803, 13806,
0368   13809, 13817, 13831, 13903, 13905, 13906, 13907, 13909, 13910, 13911,
0369   13913, 13914, 13915, 13917, 13931, 14003, 14005, 14006, 14007, 14009,
0370   14010, 14011, 14013, 14014, 14015, 14017, 14031, 14103, 14105, 14106,
0371   14107, 14109, 14110, 14111, 14113, 14114, 14115, 14117, 14131, 14203,
0372   14205, 14206, 14207, 14209, 14210, 14211, 14213, 14214, 14215, 14217,
0373   14231, 14306, 14317, 14403, 14406, 14502, 14503, 14504, 14505, 14506,
0374   14507, 14508, 14509, 14510, 14511, 14512, 14513, 14514, 14515, 14516,
0375   14517, 14531, 14603, 14606, 14703, 14704, 14705, 14706, 14707, 14708,
0376   14709, 14710, 14711, 14713, 14714, 14715, 14717, 14731, 14803, 14804,
0377   14805, 14806, 14807, 14808, 14809, 14810, 14811, 14813, 14814, 14815,
0378   14817, 14831, 14903, 14904, 14905, 14906, 14907, 14908, 14909, 14910,
0379   14911, 14913, 14914, 14915, 14917, 14931, 15003, 15004, 15005, 15006,
0380   15007, 15008, 15009, 15010, 15011, 15013, 15014, 15015, 15017, 15031,
0381   15102, 15103, 15104, 15105, 15106, 15107, 15108, 15109, 15110, 15111,
0382   15112, 15113, 15114, 15115, 15116, 15117, 15131, 15202, 15204, 15205,
0383   15207, 15220, 15223, 15225, 15228, 15236, 15238, 15261, 15262, 15271,
0384   15272, 15303, 15402, 15403, 15406, 15416, 15443, 15502, 15503, 15504,
0385   15516, 15519, 15521, 15527, 15532, 15541, 15543, 15558, 15559, 15560,
0386   15570, 15602, 15603, 15604, 15616, 15703, 15706, 15803, 15806, 15902,
0387   15903, 15906, 15916, 16002, 16004, 16005, 16007, 16017, 16020, 16023,
0388   16025, 16028, 16033, 16036, 16038, 16045, 16057, 16061, 16062, 16063,
0389   16071, 16072, 16103, 16119, 16121, 16127, 16141, 16158, 16159, 16170,
0390   16203, 16303, 16306, 16402, 16403, 16406, 16416, 16513, 16517, 16602,
0391   16603, 16606, 16616, 16706, 16709, 16731, 16802, 16804, 16805, 16807,
0392   16820, 16823, 16825, 16828, 16830, 16831, 16833, 16835, 16836, 16838,
0393   16845, 16853, 16857, 16861, 16862, 16863, 16871, 16872, 16902, 16904,
0394   16905, 16907, 16909, 16918, 16920, 16923, 16924, 16925, 16926, 16928,
0395   16929, 16930, 16933, 16935, 16936, 16937, 16938, 16945, 16946, 16947,
0396   16955, 16956, 16957, 16961, 16962, 16963, 16964, 16966, 16971, 16972,
0397   17002, 17004, 17005, 17007, 17009, 17020, 17023, 17025, 17028, 17033,
0398   17035, 17036, 17038, 17045, 17046, 17057, 17061, 17062, 17063, 17071,
0399   17072, 17106, 17109, 17202, 17203, 17204, 17205, 17207, 17220, 17223,
0400   17225, 17228, 17233, 17235, 17236, 17238, 17245, 17246, 17257, 17261,
0401   17262, 17263, 17271, 17272, 17302, 17303, 17304, 17305, 17306, 17307,
0402   17308, 17309, 17310, 17311, 17312, 17313, 17314, 17315, 17316, 17317,
0403   17331, 17402, 17403, 17404, 17405, 17406, 17407, 17408, 17409, 17410,
0404   17411, 17412, 17413, 17414, 17415, 17416, 17417, 17431, 17502, 17504,
0405   17505, 17507, 17520, 17523, 17525, 17528, 17533, 17535, 17536, 17538,
0406   17545, 17557, 17561, 17562, 17563, 17571, 17572, 17603, 17604, 17605,
0407   17606, 17607, 17608, 17609, 17610, 17611, 17612, 17613, 17614, 17615,
0408   17617, 17631, 17713, 17717, 17802, 17803, 17806, 17816, 17903, 17906,
0409   18002, 18003, 18006, 18016, 18102, 18103, 18106, 18116, 18202, 18203,
0410   18206, 18216, 18302, 18303, 18306, 18316, 18406, 18409, 18431, 18506,
0411   18531, 18602, 18604, 18605, 18607, 18609, 18618, 18620, 18622, 18623,
0412   18624, 18625, 18626, 18628, 18629, 18630, 18631, 18706, 18709, 18802,
0413   18803, 18804, 18805, 18807, 18820, 18823, 18825, 18828, 18833, 18835,
0414   18836, 18838, 18845, 18846, 18857, 18861, 18862, 18863, 18871, 18872,
0415   18902, 18903, 18904, 18905, 18907, 18920, 18923, 18925, 18928, 18933,
0416   18935, 18936, 18938, 18945, 18946, 18957, 18961, 18962, 18963, 18971,
0417   18972, 19003, 19006, 19102, 19104, 19105, 19107, 19109, 19118, 19120,
0418   19123, 19124, 19125, 19126, 19128, 19129, 19130, 19133, 19135, 19136,
0419   19137, 19138, 19145, 19146, 19147, 19155, 19156, 19157, 19161, 19162,
0420   19163, 19164, 19166, 19171, 19172, 19203, 19206, 19302, 19303, 19306,
0421   19316, 19402, 19403, 19406, 19416, 19502, 19504, 19505, 19507, 19509,
0422   19518, 19520, 19523, 19524, 19525, 19526, 19528, 19529, 19530, 19533,
0423   19535, 19536, 19537, 19538, 19545, 19546, 19547, 19555, 19556, 19557,
0424   19561, 19562, 19563, 19564, 19566, 19571, 19572, 19602, 19603, 19604,
0425   19605, 19607, 19620, 19623, 19625, 19628, 19633, 19635, 19636, 19638,
0426   19645, 19646, 19657, 19661, 19662, 19663, 19671, 19672, 19703, 19706,
0427   19802, 19804, 19805, 19807, 19809, 19818, 19820, 19823, 19824, 19825,
0428   19826, 19828, 19829, 19830, 19833, 19835, 19836, 19837, 19838, 19845,
0429   19846, 19847, 19855, 19856, 19857, 19861, 19862, 19863, 19864, 19866,
0430   19871, 19872, 19903, 19906, 20002, 20004, 20005, 20007, 20009, 20018,
0431   20020, 20023, 20024, 20025, 20026, 20028, 20029, 20030, 20033, 20035,
0432   20036, 20037, 20038, 20045, 20046, 20047, 20055, 20056, 20057, 20061,
0433   20062, 20063, 20064, 20066, 20071, 20072, 20102, 20104, 20105, 20107,
0434   20109, 20118, 20120, 20123, 20124, 20125, 20126, 20128, 20129, 20130,
0435   20133, 20135, 20136, 20137, 20138, 20145, 20146, 20147, 20155, 20156,
0436   20157, 20161, 20162, 20163, 20164, 20166, 20171, 20172, 20202, 20204,
0437   20205, 20207, 20209, 20218, 20220, 20222, 20223, 20224, 20225, 20226,
0438   20228, 20229, 20230, 20231, 20302, 20304, 20305, 20307, 20309, 20318,
0439   20320, 20322, 20323, 20324, 20325, 20326, 20328, 20329, 20330, 20331,
0440   20403, 20406, 20502, 20504, 20505, 20507, 20509, 20518, 20520, 20523,
0441   20524, 20525, 20526, 20528, 20529, 20530, 20533, 20535, 20536, 20537,
0442   20538, 20545, 20546, 20547, 20555, 20556, 20557, 20561, 20562, 20563,
0443   20564, 20566, 20571, 20572, 20602, 20604, 20605, 20607, 20609, 20618,
0444   20620, 20623, 20624, 20625, 20626, 20628, 20629, 20630, 20633, 20635,
0445   20636, 20637, 20638, 20645, 20646, 20647, 20655, 20656, 20657, 20661,
0446   20662, 20663, 20664, 20666, 20671, 20672, 20702, 20704, 20705, 20707,
0447   20709, 20718, 20720, 20722, 20723, 20724, 20725, 20726, 20728, 20729,
0448   20730, 20731, 20802, 20804, 20805, 20807, 20809, 20818, 20820, 20823,
0449   20824, 20825, 20826, 20828, 20829, 20830, 20833, 20835, 20836, 20837,
0450   20838, 20845, 20846, 20847, 20855, 20856, 20857, 20861, 20862, 20863,
0451   20864, 20866, 20871, 20872, 20902, 20904, 20905, 20907, 20909, 20918,
0452   20920, 20922, 20923, 20924, 20925, 20926, 20928, 20929, 20930, 20931,
0453   21002, 21004, 21005, 21007, 21009, 21018, 21020, 21022, 21023, 21024,
0454   21025, 21026, 21028, 21029, 21030, 21031, 21102, 21104, 21105, 21107,
0455   21109, 21118, 21120, 21123, 21124, 21125, 21126, 21128, 21129, 21130,
0456   21133, 21135, 21136, 21137, 21138, 21145, 21146, 21147, 21155, 21156,
0457   21157, 21161, 21162, 21163, 21164, 21166, 21171, 21172, 21202, 21204,
0458   21205, 21207, 21209, 21218, 21220, 21222, 21223, 21224, 21225, 21226,
0459   21228, 21229, 21230, 21231, 21302, 21304, 21305, 21307, 21309, 21318,
0460   21320, 21322, 21323, 21324, 21325, 21326, 21328, 21329, 21330, 21331,
0461   21402, 21404, 21405, 21407, 21409, 21418, 21420, 21422, 21423, 21424,
0462   21425, 21426, 21428, 21429, 21430, 21431, 21502, 21504, 21505, 21507,
0463   21509, 21518, 21520, 21522, 21523, 21524, 21525, 21526, 21528, 21529,
0464   21530, 21531};
0465 int prs2[2592]={
0466  0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,3,
0467  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,1,1,1,1,1,
0468  0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,0,0,2,0,1,1,0,0,1,0,2,2,2,2,0,
0469  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0470  2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,0,0,0,1,1,1,2,2,2,
0471  2,2,2,2,2,2,0,0,0,0,0,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2,2,2,2,2,
0472  2,2,2,2,2,2,2,2,2,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,
0473  2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0474  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,
0475  1,1,2,2,2,2,2,2,2,0,2,2,2,2,0,2,2,2,2,0,0,0,0,0,0,0,0,0,1,1,
0476  1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,0,0,0,0,0,1,1,
0477  1,1,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
0478  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,1,1,1,1,2,2,2,2,
0479  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,
0480  0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0481  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0482  1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0483  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0484  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0485  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
0486  0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1,
0487  1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,
0488  0,2,2,2,2,2,2,2,2,0,0,2,0,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,
0489  0,2,2,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,0,2,0,2,2,2,2,2,2,2,2,2,
0490  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0491  2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0492  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,
0493  0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
0494  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0495  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0496  2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
0497  0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2,
0498  2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,0,0,1,1,1,1,1,2,2,2,2,2,2,
0499  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
0500  1,1,1,1,1,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
0501  1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0502  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0503  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,
0504  0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,
0505  1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
0506  2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,
0507  0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,
0508  1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,
0509  1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
0510  1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
0511  0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,
0512  2,2,2,2,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,
0513  1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,
0514  1,1,0,0,0,0,2,0,0,1,1,1,2,2,2,2,0,0,0,1,1,2,2,2,2,2,2,2,2,2,
0515  2,2,2,2,2,2,2,2,2,2,2,0,0,0,1,1,1,2,2,2,2,2,2,2,2,2,2,0,2,2,
0516  2,2,0,2,2,0,0,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,
0517  0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2,2,
0518  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
0519  1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0520  2,0,0,2,0,0,2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,0,2,0,2,
0521  2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,2,2,2,
0522  2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,
0523  2,2,2,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0524  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0525  2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,0,2,2,0,1,0,0,0,
0526  0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,0,0,
0527  0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,2,2,2,2,0,0,2,
0528  2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
0529  0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0530  0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0531  0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0532  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,1,1,1,1,
0533  1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,0,0,
0534  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,
0535  2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
0536  0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0537  0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,
0538  2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,
0539  1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
0540  0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0541  1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,
0542  1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
0543  1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0544  2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,
0545  1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
0546  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0547  2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0548  1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0549  2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
0550  1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0551  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0552  2,2,2,2,2,2,2,2,2,2,2,2};
0553 int prs3[2592]={
0554   15, 13, 10, 12, 14, 11,  4,  5,  6,  9,  2,  3,  8,  1,  7, 15, 13, 10,
0555   12, 14, 11,  4,  5,  6,  9, 16,  3,  8,  7,  1,  2,  2,  2,  2,  2,  2,
0556    2,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,  5,  5, 15, 13, 19,
0557   14, 17,  9, 20, 18,  8, 10, 12, 11, 24, 22, 23, 21, 25,  7, 15, 15, 15,
0558   15, 15, 15, 10, 12, 15, 11, 26,  7, 15, 14, 27, 29, 26, 26, 26, 26, 28,
0559   26, 26, 26, 26, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17,
0560   17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 34, 34,
0561   13, 34, 34, 34, 30, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 15, 13, 14,
0562   31,  9,  8,  3,  3,  3,  3,  3,  3,  3, 21, 21, 34, 10, 12, 11, 24, 33,
0563   23, 32, 25,  7, 36, 35, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
0564   11, 11, 11, 11, 11, 11, 11, 19, 19, 10, 12, 11, 24, 37, 38, 25,  7,  9,
0565    9,  9,  9,  9,  9,  9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
0566   12, 12, 12, 12, 12, 12, 68, 62, 63, 64, 49, 52, 10, 71, 12, 72, 51, 66,
0567   50, 11, 70, 53, 24, 41, 60, 54, 69, 44, 67, 23, 39, 25, 55, 48, 43, 46,
0568   47, 65, 58, 61, 57, 45, 42, 40,  7, 56, 59, 15, 13, 19, 14, 73,  9, 20,
0569   18,  8, 14, 14, 14, 14, 14, 14, 14, 29, 25, 25, 25, 25, 28, 25, 25, 25,
0570   25, 77, 62, 63, 64, 75, 71, 72, 66, 70, 60, 69, 67, 74, 65, 58, 61, 57,
0571   76, 59, 80, 10, 12, 82, 11, 83, 79, 81, 78,  7, 35, 35, 35, 35, 35, 84,
0572   10, 12, 11, 24, 85, 38, 25,  7,  8,  8,  8,  8,  8,  8,  8, 68, 62, 63,
0573   64, 71, 72, 66, 70, 88, 60, 87, 69, 67, 55, 86, 65, 58, 61, 57, 56, 59,
0574   10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
0575   10, 15, 13, 14, 73,  9, 89,  8,  7,  7,  7,  7,  7,  7,  7, 13, 13, 13,
0576   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 68, 62, 63,
0577   64, 49, 52, 10, 71, 12, 72, 51, 66, 50, 11, 70, 53, 24, 91, 60, 54, 69,
0578   44, 67, 38, 25, 55, 48, 43, 46, 47, 65, 58, 61, 57, 45, 42, 90,  7, 56,
0579   59, 68, 62, 63, 64, 49, 52, 71, 72, 51, 66, 50, 70, 53, 24, 92, 60, 54,
0580   69, 44, 67, 55, 48, 43, 46, 47, 65, 58, 61, 57, 45, 93, 56, 59, 72, 72,
0581   72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
0582   73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 62, 62, 62,
0583   62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63,
0584   63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64,
0585   64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65,
0586   65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
0587   66, 66, 66, 66, 66, 95, 94, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
0588   68, 68, 68, 68, 68, 96, 97, 98, 68, 62, 63, 64,100, 71, 72, 66, 70, 60,
0589   54, 69, 67, 55, 99, 65, 58, 61, 57, 56, 59, 88, 88, 88, 88, 90, 90, 90,
0590  101, 90, 90,105,105,105,105,105,105,105,105,105,102,105,105,105,105,105,
0591   92, 92, 92,103,105, 92,104,106, 92, 92,108,107,107,107,107,107,107,107,
0592  107,107,107,107,107,107,107,107,107, 77, 62, 63, 64, 71, 72, 66, 70,109,
0593   67, 58, 61, 76, 59, 94,110, 94,111, 94, 94, 94, 94, 94, 94, 94, 94,112,
0594  112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,109,109,
0595  109,109,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,
0596  111,111,111,111, 99,112, 99, 99, 99,113, 99, 99, 99, 99, 99, 99, 99, 99,
0597  116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,117,
0598  117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117, 68, 62,
0599   63, 64, 10, 71, 12, 72, 66, 11, 70, 60, 54, 69, 67, 55,114, 65, 58, 61,
0600   57,116,115,117, 56, 59,102,102,102,102,102,102,102,102,102,102,102,102,
0601  102,102,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
0602  121,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
0603  123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, 21,
0604   21, 34,101,118, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,105,105,105,105,
0605  105,105,105,105,105,105,105,105,105,105,105, 68, 62, 63, 64, 10, 71, 12,
0606   72, 66, 11, 70, 60, 54, 69, 67, 55,114, 65, 58, 61, 57,116,115,117, 56,
0607   59,119,120,121,122, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 36, 36, 41,
0608   41,127, 39, 13, 39,128, 14,124,123,126,  9,125, 28, 28, 28, 28, 28, 28,
0609   28, 28, 28, 28,  6,  6,  6,  6,  6,  6,  6, 22, 22, 43, 43, 43, 68, 62,
0610   63, 64, 71, 72, 66, 70, 88, 60, 87, 69, 67, 55,130,129, 65, 58, 61, 57,
0611   56, 59, 20, 20, 68, 62, 63, 64, 49, 52, 71, 72, 51, 66, 50, 70, 53, 24,
0612  131, 60, 54, 69, 44, 67, 55, 48, 43, 46, 47, 65, 58, 61, 57, 45, 93, 56,
0613   59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
0614   70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
0615   71, 71, 71, 71, 71, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
0616   74, 74, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
0617   68, 62, 63, 64, 71, 72, 66, 70, 60,132, 69, 67, 55, 65, 58, 61, 57, 56,
0618   59, 68, 62, 63, 64, 71, 72, 66, 70, 60, 54, 69, 67, 55,133, 65, 58, 61,
0619   57, 56, 59, 68, 62, 63, 64,135, 71, 72, 66, 70, 60, 54, 69, 67, 55,134,
0620   65, 58, 61, 57, 56, 59, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
0621   85, 85, 85, 85, 95,136, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
0622   87, 87, 87, 87, 77, 62, 63, 64, 71, 72, 66, 70, 60, 69, 67, 65, 58, 61,
0623  137, 76, 59, 68, 62, 63, 64, 71, 72, 66, 70, 60,138, 69, 67, 55, 65, 58,
0624   61, 57, 56, 59, 77, 62, 63, 64, 71, 72, 66, 70,139, 69, 67, 65, 58, 61,
0625   76, 59, 77, 62, 63, 64, 71, 72, 66, 70,140, 69, 67, 65, 58, 61, 76, 59,
0626   77, 62, 63, 64, 71, 72, 66, 70,141, 69, 67, 65, 58, 61, 76, 59, 77, 62,
0627   63, 64, 71, 72, 66, 70,142, 69, 67, 65, 58, 61, 76, 59, 68, 62, 63, 64,
0628   71, 72, 66, 70, 60, 54, 69, 67, 55,143, 65, 58, 61, 57, 56, 59, 68,145,
0629   62, 63, 64, 71, 72, 66, 70, 60,144,146, 69, 67, 55, 65, 58, 61, 57, 56,
0630   59,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, 77, 62,
0631   63, 64, 71, 72, 66, 70, 69, 67,147, 58, 61, 76, 59, 77, 62, 63, 64, 71,
0632   72, 66, 70, 69, 67,148, 58, 61, 76, 59, 77, 62, 63, 64, 71, 72, 66, 70,
0633  149, 67, 58, 61, 76, 59, 77, 62, 63, 64, 71, 72, 66, 70,150, 67, 58, 61,
0634   76, 59,151, 95,152,155, 49, 13,128,153,126,154, 24, 24, 24, 24, 10, 12,
0635   11,156,117, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31,
0636   31, 31, 31, 31, 31, 10, 12, 11, 83,157,  7, 32, 32, 32, 32, 32, 32, 32,
0637   32, 32, 32,158, 38, 38, 40, 40,127, 50, 50,128, 14,159, 27,161, 52, 52,
0638  160,127,164, 13,128, 10, 12, 14, 11,162, 83, 31,126,  9, 81,163,125,  7,
0639   77, 62, 63, 64,166, 71, 72, 66, 70, 60, 69, 67,165, 65, 58, 61, 57, 76,
0640   59,168,167, 46, 46, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
0641   69, 69, 69, 69, 69, 69, 69, 89, 89, 89, 89,169, 95, 95,170, 68, 62, 63,
0642   64,172, 71, 72, 66, 70, 60, 54, 69, 67, 55,171, 65, 58, 61, 57, 56, 59,
0643   86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 93, 93,
0644   93,103,105, 93,104,106, 93, 93, 91, 91, 91, 91, 91, 95,110, 95,111, 95,
0645   95, 95, 95, 95, 95, 95, 95, 96,110, 96,111, 96, 96, 96, 96, 96, 96, 96,
0646   96, 97,110, 97,111, 97, 97, 97, 97, 97, 97, 97, 97, 98,110, 98,111, 98,
0647   98, 98, 98, 98, 98, 98, 98, 95,173,174,175,115,115,115,115,115,115,115,
0648  115,115,115,115,115,115,115,115,115,115,119,119,100,112,100,100,100,113,
0649  100,100,100,100,100,100,100,100,101,112,101,101,101,113,101,101,101,101,
0650  101,101,101,101,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
0651  104,104,104,104,104,104,104,104,104,104,104,104,104,104,118,118,118,118,
0652  118,118,118,118,118,118,118,118,118,118,118,118,118, 77, 62, 63, 64, 71,
0653   72, 66, 70,176, 67, 58, 61, 76, 59, 48,155, 50, 50,128,159,155,164, 13,
0654  128, 10, 12, 11,162, 83,126, 81,163,154,  7, 23, 23, 23, 23, 37, 37, 42,
0655   42,161, 51, 51,160, 77, 62, 63, 64,178, 71, 72, 66, 70, 60, 69, 67,177,
0656   65, 58, 61, 57, 76, 59,180, 10, 12, 11, 83, 81,179,  7,181,182,120, 61,
0657   61, 61, 61,101,183, 57, 57, 57, 57, 44, 44, 44, 68, 62, 63, 64, 71, 72,
0658   66, 70, 88,184, 60, 87, 69, 67, 55,185, 65, 58, 61, 57, 56, 59, 68, 62,
0659   63, 64, 49, 52, 71, 72, 51, 66, 50, 70, 53, 24, 60, 54, 69, 44, 67, 55,
0660   48, 43, 46, 47, 65, 58, 61, 57, 45,186, 56, 59, 68, 62, 63, 64,188, 71,
0661   72, 66, 70, 60, 54, 69, 67, 55,187, 65, 58, 61, 57, 56, 59, 95,189, 68,
0662  191, 62, 63, 64, 71, 72, 66, 70, 60, 54, 69, 67, 55,190, 65, 58, 61, 57,
0663   56, 59,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
0664  113,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
0665   68, 62, 63, 64, 71, 72, 66, 70, 60,192, 69, 67, 55, 65, 58, 61, 57, 56,
0666   59,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,101,193,
0667   55, 55, 55, 55,194,120, 59, 59, 59, 59, 53, 53, 53, 53, 60, 60, 60, 60,
0668   56, 56, 56, 56, 45, 45, 45, 47, 47, 75, 75, 75, 75, 75, 75, 75,195, 75,
0669   75, 75, 75, 75, 75, 75, 75, 95,196, 68,198, 62, 63, 64, 71, 72, 66, 70,
0670   60, 54, 69, 67, 55,197, 65, 58, 61, 57, 56, 59, 68,200, 62, 63, 64, 71,
0671   72, 66, 70, 60, 54, 69, 67, 55,199, 65, 58, 61, 57, 56, 59,201, 95, 68,
0672   62, 63, 64, 49, 52, 71, 72, 51, 66, 50, 70, 53, 24, 60, 54, 69, 44, 67,
0673   55, 48, 43, 46, 47, 65, 58, 61, 57, 45,202, 56, 59,120,120, 54, 54, 54,
0674   54, 58, 58, 58, 58, 68, 62, 63, 64, 49, 52, 71, 72, 51, 66, 50, 70, 53,
0675   24, 60, 54, 69, 44, 67, 55, 48, 43, 46, 47, 65, 58, 61, 57, 45,203, 56,
0676   59, 68,205, 62, 63, 64, 71, 72, 66, 70, 60, 54, 69, 67, 55,204, 65, 58,
0677   61, 57, 56, 59,206, 95, 68, 62, 63, 64, 49, 52, 71, 72, 51, 66, 50, 70,
0678   53, 24, 60, 54, 69, 44, 67, 55, 48, 43, 46, 47, 65, 58, 61, 57, 45,207,
0679   56, 59,208, 95, 68, 62, 63, 64, 49, 52, 71, 72, 51, 66, 50, 70, 53, 24,
0680   60, 54, 69, 44, 67, 55, 48, 43, 46, 47, 65, 58, 61, 57, 45,209, 56, 59,
0681   68, 62, 63, 64, 49, 52, 71, 72, 51, 66, 50, 70, 53, 24, 60, 54, 69, 44,
0682   67, 55, 48, 43, 46, 47, 65, 58, 61, 57, 45,210, 56, 59, 84, 84, 84, 84,
0683   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 76, 76, 76, 76, 76, 76,
0684   76, 76, 76, 76, 76, 76, 76, 76, 76, 76,211, 95, 68, 62, 63, 64, 49, 52,
0685   71, 72, 51, 66, 50, 70, 53, 24, 60, 54, 69, 44, 67, 55, 48, 43, 46, 47,
0686   65, 58, 61, 57, 45,212, 56, 59, 68, 62, 63, 64, 49, 52, 71, 72, 51, 66,
0687   50, 70, 53, 24, 60, 54, 69, 44, 67, 55, 48, 43, 46, 47, 65, 58, 61, 57,
0688   45,213, 56, 59, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
0689   81, 81, 68, 62, 63, 64, 49, 52, 71, 72, 51, 66, 50, 70, 53, 24, 60, 54,
0690   69, 44, 67, 55, 48, 43, 46, 47, 65, 58, 61, 57, 45,214, 56, 59, 82, 82,
0691   82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83,
0692   83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 68, 62, 63, 64, 49, 52,
0693   71, 72, 51, 66, 50, 70, 53, 24, 60, 54, 69, 44, 67, 55, 48, 43, 46, 47,
0694   65, 58, 61, 57, 45,215, 56, 59, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
0695   80, 80, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
0696   79, 79, 79, 79, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
0697   78, 78, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77};
0698 int prs4[429]={
0699    1, 68, 68, 48, 68, 68, 48, 48, 49, 48, 39, 49, 41, 42, 40, 37, 49, 42,
0700   40, 37, 49, 41, 42, 37, 49, 42, 37, 39, 41, 52,  9, 39, 41,  9, 40, 39,
0701   40, 40, 39, 41, 70, 41, 41, 70, 70, 19, 70, 27, 70, 21, 52, 51, 52, 52,
0702    6, 51, 51, 42, 51, 42, 12, 53, 65, 70, 65, 65, 70, 42, 60, 44, 42, 44,
0703   44, 25, 44,  2, 42,  3, 44, 44, 16, 45, 17, 44, 44, 16, 17, 44, 44,  2,
0704   59,  3, 44, 44,  2, 50,  3, 44, 44,  2,  3, 60,  4, 60,  4, 60, 59, 58,
0705   59, 59,  6, 58, 58, 41, 42, 58, 41, 58, 41, 32, 50, 25, 50, 50,  6, 25,
0706   53, 35, 53, 30, 54, 31, 53, 30, 54,  6, 31, 54, 53, 54, 54,  6, 53, 69,
0707   65, 32, 69, 65, 32, 60, 32, 60, 43, 32, 43, 43,  2, 32,  3, 43, 43, 16,
0708   45, 17, 43, 43, 16, 17, 43, 16, 45, 17, 43, 16, 17, 43, 43,  2, 59,  3,
0709   43, 43,  2,  3, 43,  2, 59,  3, 43,  2,  3, 66, 47, 66, 37, 66, 64, 66,
0710   55, 66, 56, 47, 46,  9, 47,  9, 37, 30, 40, 67, 31, 37, 30, 40, 31, 37,
0711   30, 67, 31, 37, 30, 31, 67, 66, 67, 67, 66, 64, 26,  2, 46,  3, 66, 64,
0712   26,  2, 46,  3, 66, 22, 66, 55, 24,  2, 46,  9, 46,  9, 46,  3, 66, 55,
0713   24,  2,  9, 46,  9, 46,  3, 66, 55, 24,  2, 46,  9,  9, 46,  3, 66, 55,
0714   24,  2, 46,  9, 46,  9,  3, 66, 55, 24,  2, 46,  9,  9,  3, 66, 55, 24,
0715    2,  9, 46,  9,  3, 66, 55, 24,  2,  9,  9, 46,  3, 66, 55, 24,  2,  9,
0716    9,  3, 66, 56, 18,  9, 56, 29, 46,  9, 56, 29,  9, 46, 35, 46, 46,  6,
0717   35, 35, 45, 35, 71, 12, 35, 45, 63, 45, 45, 13, 63, 63, 33, 63, 63, 10,
0718   33, 63, 63, 14, 33, 63, 63, 11, 33, 63, 63, 15, 33, 33, 57, 33, 33,  5,
0719   57, 33, 33,  7, 57, 57, 36, 57, 57,  4, 36, 57, 57,  8, 36, 36, 71, 36,
0720    2, 69,  3, 36, 71, 61, 71, 72, 36, 72,  4, 72,  5, 72,  7, 61, 62, 61,
0721   61, 16, 46, 17, 61, 61,  2, 34,  3, 61, 61,  2,  3, 62, 25, 62, 38, 62,
0722    2, 46,  3, 34, 35, 34, 34,  6, 35, 38, 28, 38, 20, 38, 23};
0723 int prs5[124]={ /* includes past-the-end index */
0724    0,  2,  4,  7,  9, 11, 16, 20, 24, 27, 31, 34, 36, 39, 42, 44, 46, 48,
0725   50, 52, 56, 58, 62, 65, 67, 70, 72, 74, 78, 83, 87, 92, 97,101,103,106,
0726  108,112,115,117,120,122,126,128,132,137,139,143,146,148,150,153,155,159,
0727  164,168,172,175,180,184,188,191,193,195,197,199,201,204,206,211,215,219,
0728  222,224,227,233,241,251,260,269,278,286,294,302,309,312,316,319,321,325,
0729  327,331,333,337,339,343,347,351,355,357,361,365,367,371,375,377,382,384,
0730  387,389,391,393,395,400,405,409,411,413,417,419,423,425,427,429};
0731 int numfunc=46; // copied from cbnf16
0732 char prs6[300]={ // functions
0733  'C','l','o','s','e','P','o','l','y','\0','D','r','a','w','F','N',
0734  'u','m','\0','D','r','a','w','N','u','m','\0','D','r','a','w','S',
0735  't','r','i','n','g','\0','F','o','n','t','I','n','f','o','\0','G',
0736  'i','f','O','u','t','\0','H','o','r','i','z','S','c','a','l','e',
0737  '\0','H','o','r','i','z','T','i','m','e','\0','J','n','\0','L','i',
0738  'n','e','T','o','\0','L','i','n','e','T','o','G','\0','M','a','k',
0739  'e','G','r','a','p','h','\0','M','a','k','e','V','i','e','w','\0',
0740  'M','o','v','e','T','o','\0','M','o','v','e','T','o','G','\0','O',
0741  'p','e','n','P','o','l','y','\0','P','l','o','t','G','\0','P','n',
0742  'g','O','u','t','\0','S','e','t','C','o','l','o','r','\0','V','e',
0743  'r','t','S','c','a','l','e','\0','Y','n','\0','a','c','o','s','\0',
0744  'a','s','i','n','\0','a','t','a','n','\0','a','t','a','n','2','\0',
0745  'c','e','i','l','\0','c','o','s','\0','c','o','s','h','\0','e','r',
0746  'f','\0','e','x','i','t','\0','e','x','p','\0','f','a','b','s','\0',
0747  'f','l','o','o','r','\0','f','m','o','d','\0','h','m','s','d','a',
0748  'y','\0','l','o','g','\0','l','o','g','1','0','\0','m','d','y','d',
0749  'a','y','\0','p','o','w','\0','p','r','i','n','t','f','\0','r','e',
0750  'f','d','a','y','\0','s','i','n','\0','s','i','n','h','\0','s','q',
0751  'r','t','\0','t','a','n','\0','t','a','n','h','\0'};
0752 int prs7[46]={ // pointer to prs6
0753    0, 10, 19, 27, 38, 47, 54, 65, 75, 78,
0754   85, 93,103,112,119,127,136,142,149,158,
0755  168,171,176,181,186,192,197,201,206,210,
0756  215,219,224,230,235,242,246,252,259,263,
0757  270,277,281,286,291,295};
0758 int prs8[46]={ // function id number
0759   26, 43, 42, 28, 27, 24, 31, 30, 37, 23,
0760   34, 29, 20, 22, 33, 25, 35, 45, 21, 32,
0761   38,  5,  4,  6,  7, 16,  2,  9, 36, 44,
0762   11, 18, 17, 19, 41, 12, 13, 40, 14,  0,
0763   39,  1,  8, 15,  3, 10};
0764 int prs9[113]={ // type ids
0765    4,  1,  6,  2,  2,  2,  2,  2,  2,  2,
0766    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
0767    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
0768    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
0769    2,  2,  2,  2,  4,  4,  4,  4,  4,  4,
0770    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
0771    4,  4,  4,  4,  4,  1,  4,  4,  4,  4,
0772    4,  4,  4,  1,  2,  2,  4,  1,  2,  2,
0773    4,  2,  2,  4,  2,  2,  4,  4,  2,  2,
0774    2,  2,  2,  4,  2,  2,  4,  2,  2,  2,
0775    2,  2,  2,  2,  2,  4,  4,  4,  1,  2,
0776    4,  4,  4};
0777 int prs10[46]={ // start indices to prs9
0778   59,107,105, 64, 60, 57, 72, 71, 92, 54,
0779   83, 66, 44, 51, 80, 58, 86,112, 47, 76,
0780   95, 11,  9, 13, 15, 35,  5, 20, 90,110,
0781   24, 39, 37, 41,103, 26, 28,101, 30,  0,
0782   98,  3, 18, 33,  7, 22};
0783 int prs11[46]={ // past-the-end indices to prs9
0784   60,110,107, 66, 64, 58, 76, 72, 95, 57,
0785   86, 71, 47, 54, 83, 59, 90,113, 51, 80,
0786   98, 13, 11, 15, 18, 37,  7, 22, 92,112,
0787   26, 41, 39, 44,105, 28, 30,103, 33,  3,
0788  101,  5, 20, 35,  9, 24};
0789 int prs12[72]={ // number of attributes (cbnf17)
0790    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
0791    0,  0,  2,  0,  2,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0792    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0793    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
0794
0795#ifdef CGI
0796//    printf("Content-type: text/html%c%c",10,10);
0797
0798    if(strcmp(getenv("REQUEST_METHOD"),"POST")) {
0799        contype(0);
0800        printf("This CGI should be referenced with a METHOD of POST.\n");
0801        exit(0);
0802    }
0803    if(strcmp(getenv("CONTENT_TYPE"),"application/x-www-form-urlencoded")) {
0804        contype(0);
0805        printf("This CGI can only be used to decode form results. \n");
0806        exit(0);
0807    }
0808    cl = atoi(getenv("CONTENT_LENGTH"));
0809
0810    if(cl>20500){
0811     contype(0);
0812     printf("Input length limit over.");
0813     exit(0);
0814    }
0815    for(x=0;cl && (!feof(stdin));x++) {
0816        if(x>9){
0817         contype(0);
0818         printf("Form field limit over.");
0819         exit(0);
0820        }
0821        mx=x;
0822        entries[x].val = fmakeword(stdin,'&',&cl);
0823        plustospace(entries[x].val);
0824        unescape_url(entries[x].val);
0825        entries[x].name = makeword(entries[x].val,'=');
0826    }
0827
0828//    printf("<H1>Query Results</H1>");
0829//    printf("You submitted the following name/value pairs:<p>%c",10);
0830//    printf("<ul>%c",10);
0831
0832//    for(x=0; x <= mx; x++)
0833//        printf("<li> <code>%s = %s</code>%c",entries[x].name,
0834//               entries[x].val,10);
0835//    printf("</ul>%c",10);
0836/* scan the input file, count characters, deleting comments */
0837// fp=fopen("test.c","r");
0838 comment=0; /* comment cleaning process status */
0839 ninp=0; /* number of input characters */
0840 for(x=0;x<=mx;x++){
0841  if(strcmp(entries[x].name,"source")==0) break;
0842 }
0843 if(x>mx){
0844  contype(0);
0845  printf("Form not standard.");
0846  exit(0);
0847 }
0848/* substitute input fields */
0849 for(i=0;i<=mx;i++){
0850  if(strcmp(entries[i].name,"source")!=0&&strcmp(entries[i].name,"code")!=0){
0851   k=0;
0852   l=strlen(entries[i].val);
0853   for(j=0;entries[x].val[j]!='\0';j++){
0854    if(entries[x].val[j]==entries[i].name[k]) k++;
0855    else if(k!=0){ // at least partially matched
0856     if(entries[i].name[k]=='\0'){ // fully matched
0857      if(l>k) // val is longer
0858       for(m=strlen(entries[x].val)+l-k;m>j;m--)
0859        entries[x].val[m]=entries[x].val[m-l+k];
0860      else if(l<k){
0861       o=strlen(entries[x].val);
0862       for(m=j;m<=o;m++)
0863        entries[x].val[m+l-k]=entries[x].val[m];
0864      }
0865      for(m=0;entries[i].val[m]!='\0';m++) entries[x].val[j-k+m]=entries[i].val[m];
0866      k=0;
0867      j=j-k+m-1;
0868     }
0869     else k=0;
0870    }
0871   }
0872  }
0873 }
0874/* substitution end */
0875 mx=x;
0876 x=0;
0877 while((c=entries[mx].val[x++])!='\0'){
0878#else
0879/* scan the input file, count characters, deleting comments */
0880 fp=fopen("test.c","r");
0881 comment=0; /* comment cleaning process status */
0882 ninp=0; /* number of input characters */
0883 while((c=fgetc(fp))!=EOF){
0884#endif
0885  switch (comment){
0886   case 0:  /* expecting new comment */
0887    if(c=='/') comment=1;
0888    else ninp++;
0889    break;
0890   case 1: /* expecting the second part of comment start mark */
0891    if(c=='/') comment=2;
0892    else if(c=='*') comment=3;
0893    else{
0894     comment=0;
0895     ninp+=2;
0896    }
0897    break;
0898   case 2: /* comment started by two slashes */
0899    if(c=='\n'||c=='\x0d'||c=='\x0a') comment=0;
0900    break;
0901   case 3: /* comment started by slash-asterisk */
0902    if(c=='*') comment=4;
0903    break;
0904   case 4:
0905    if(c=='/') comment=0;
0906    else  if(c!='*') comment=3;
0907    break;
0908   default:
0909    printf("\nillegal character %c",c);
0910  } /* switch */
0911 } /* while */
0912 if(comment!=0){
0913  contype(0);
0914  printf("Comment not closed.");
0915  exit(0);
0916 }
0917
0918#ifndef CGI
0919 fclose(fp);
0920 printf("ninp=%i\n",ninp);
0921 fp=fopen("test.c","r");
0922#endif
0923
0924/* allocate input buffer and read the input */
0925 inp=(char *)malloc(ninp*sizeof(char));
0926 comment=0;
0927 ninp=0;
0928#ifdef CGI
0929 x=0;
0930 while((c=entries[mx].val[x++])!='\0'){
0931#else
0932 while((c=fgetc(fp))!=EOF){
0933#endif
0934  switch (comment){
0935   case 0:
0936    if(c=='/') comment=1;
0937    else inp[ninp++]=c;
0938    break;
0939   case 1:
0940    if(c=='/') comment=2;
0941    else if(c=='*') comment=3;
0942    else{
0943     comment=0;
0944     inp[ninp++]='/';
0945     inp[ninp++]=c;
0946    }
0947    break;
0948   case 2:
0949    if(c=='\n'||c=='\x0d'||c=='\x0a') comment=0;
0950    break;
0951   case 3:
0952    if(c=='*') comment=4;
0953    break;
0954   case 4:
0955    if(c=='/') comment=0;
0956    else if(c!='*') comment=3;
0957    break;
0958   default:
0959    break;
0960  } /* switch */
0961 } /* while */
0962#ifndef CGI
0963 fclose(fp);
0964#endif
0965/* compact the input buffer */
0966 for(i=0;i<ninp;i++){
0967  if(inp[i]=='\t'||inp[i]=='\n'||inp[i]=='\x0d') inp[i]=' ';
0968  if(!isprint(inp[i])){
0969   contype(0);
0970   printf("Only printable ascii characters allowed.");
0971   exit(0);
0972  }
0973 }
0974 j=0; /* index for compacted chars */
0975 l=0; /* spaces within a character-constant are left as-is */
0976 for(i=0;i<ninp;i++){
0977  c=inp[i];
0978  if(l==0){
0979   if(c=='\"') l=1;
0980  }
0981  else {
0982   if(c=='\"'&&inp[i-1]!='\\') l=0;
0983  }
0984  if(c==' '&&l==0){
0985   k=0;
0986   if(inp[j-1]=='r'&&inp[j-2]=='a'&&inp[j-3]=='h'&&inp[j-4]=='c') k=1;
0987   if(inp[j-1]=='e'&&inp[j-2]=='l'&&inp[j-3]=='b'&&inp[j-4]=='u') k=1;
0988   if(inp[j-1]=='t'&&inp[j-2]=='n'&&inp[j-3]=='i') k=1;
0989   if(inp[j-1]=='e'&&inp[j-2]=='s'&&inp[j-3]=='l'&&inp[j-4]=='e') k=1;
0990   if(inp[j-1]=='n'&&inp[j-2]=='r'&&inp[j-3]=='u'&&inp[j-4]=='t') k=1;
0991   if(k==1) inp[j++]=' ';
0992  }
0993  else inp[j++]=c;
0994 }
0995 ninp=j;
0996#ifndef CGI
0997 printf("compacted ninp=%i\n",ninp);
0998#endif
0999/* allocate tmnl[] */
1000 tmnl=(int *)malloc(ninp*sizeof(int)); /* string of terminal numbers */
1001// tmnl[0]=0;
1002 ntmnl=0;
1003 i=0;
1004 while(i<ninp){
1005  c=inp[i];
1006  if((!isalnum(c))&&(c!='.')&&(c!='_')){
1007   switch (c){
1008    case '\"':
1009     tmnl[ntmnl++]=20; // in the case of character-constant, offset to the
1010                       //  character is saved next to terminal number
1011     tmnl[ntmnl++]=i;
1012     while(inp[++i]!='\"');
1013     break;
1014    case '(':
1015     tmnl[ntmnl++]=2;
1016     break;
1017    case ')':
1018     tmnl[ntmnl++]=3;
1019     break;
1020    case '*':
1021     tmnl[ntmnl++]=4;
1022     break;
1023    case '+':
1024     tmnl[ntmnl++]=5;
1025     break;
1026    case ',':
1027     tmnl[ntmnl++]=6;
1028     break;
1029    case '-':
1030     if(tmnl[ntmnl-1]==3||tmnl[ntmnl-1]==17
1031        ||tmnl[ntmnl-2]==23||tmnl[ntmnl-2]==25||tmnl[ntmnl-2]==28)
1032     tmnl[ntmnl++]=7;  // in the case of the sign to a number, the next search path will pick this up
1033                       // in case of unary operator, the next search will pick this up
1034     break;
1035    case '/':
1036     tmnl[ntmnl++]=8;
1037     break;
1038    case ';':
1039     tmnl[ntmnl++]=9;
1040     break;
1041    case '<':
1042     if(inp[i+1]=='='){
1043      tmnl[ntmnl++]=11;
1044      i++;
1045     }
1046     else tmnl[ntmnl++]=10;
1047     break;
1048    case '=':
1049     if(inp[i+1]=='='){
1050      tmnl[ntmnl++]=13;
1051      i++;
1052     }
1053     else tmnl[ntmnl++]=12;
1054     break;
1055    case '>':
1056     if(inp[i+1]=='='){
1057      tmnl[ntmnl++]=15;
1058      i++;
1059     }
1060     else tmnl[ntmnl++]=14;
1061     break;
1062    case '[':
1063     tmnl[ntmnl++]=16;
1064     break;
1065    case ']':
1066     tmnl[ntmnl++]=17;
1067     break;
1068    case '{':
1069     tmnl[ntmnl++]=30;
1070     break;
1071    case '}':
1072     tmnl[ntmnl++]=31;
1073     break;
1074    default:
1075     contype(0);
1076     printf("lexer failed \n");
1077     printf("%x\n",c);
1078     exit(0);
1079   } /* switch (c) */
1080   i++;
1081  } /* if((!isalnum(c))&&(c!='.')&&(c!='_')) */
1082  else if(isdigit(c)||c=='.'){
1083   if(inp[i-1]=='-'&&tmnl[ntmnl-1]!=7) tmnl[ntmnl+1]=i-1;  // offset of data
1084   else tmnl[ntmnl+1]=i;
1085   while(isdigit(inp[i])) i++;
1086   if(inp[i]=='.'){
1087    tmnl[ntmnl]=23;  // floating point constant
1088    i++;
1089    while(isdigit(inp[i])) i++;
1090   }
1091   else tmnl[ntmnl]=28; // integer constant
1092   ntmnl+=2;
1093  }
1094  else{  // isalpha
1095   if(inp[i-1]=='-'&&tmnl[ntmnl-1]!=7) tmnl[ntmnl++]=7; // unary operator
1096   j=0;
1097   while(isalnum(inp[i+j])||inp[i+j]=='_') j++;
1098   k=1;  // if reserved string k=1
1099   switch (j){
1100    case 2:
1101     if(inp[i]=='i'&&inp[i+1]=='f') tmnl[ntmnl]=26;
1102     else k=0;
1103     break;
1104    case 3:
1105     if(inp[i]=='f'&&inp[i+1]=='o'&&inp[i+2]=='r') tmnl[ntmnl]=24;
1106     else if(inp[i]=='i'&&inp[i+1]=='n'&&inp[i+2]=='t') tmnl[ntmnl]=27;
1107     else k=0;
1108     break;
1109    case 4:
1110     if(inp[i]=='c'&&inp[i+1]=='h'&&inp[i+2]=='a'
1111      &&inp[i+3]=='r') tmnl[ntmnl]=19;
1112     else if(inp[i]=='e'&&inp[i+1]=='l'&&inp[i+2]=='s'
1113      &&inp[i+3]=='e') tmnl[ntmnl]=22;
1114     else k=0;
1115     break;
1116    case 5:
1117     if(inp[i]=='b'&&inp[i+1]=='r'&&inp[i+2]=='e'
1118      &&inp[i+3]=='a'&&inp[i+4]=='k') tmnl[ntmnl]=18;
1119     else k=0;
1120     break;
1121    case 6:
1122     if(inp[i]=='d'&&inp[i+1]=='o'&&inp[i+2]=='u'
1123      &&inp[i+3]=='b'&&inp[i+4]=='l'&&inp[i+5]=='e') tmnl[ntmnl]=21;
1124     else if(inp[i]=='r'&&inp[i+1]=='e'&&inp[i+2]=='t'
1125      &&inp[i+3]=='u'&&inp[i+4]=='r'&&inp[i+5]=='n') tmnl[ntmnl]=29;
1126     else k=0;
1127     break;
1128    default:
1129     k=0;
1130     break;
1131   }
1132   if(k==1){
1133     i=i+j;
1134     if(inp[i]==' ') i++; // type is followed by a space
1135     ntmnl++;
1136   }
1137   else{
1138    tmnl[ntmnl]=25; // identifier
1139    tmnl[ntmnl+1]=i;
1140    ntmnl+=2;
1141    i=i+j;
1142   }
1143  } /* else */
1144 } /* while(i<ninp) */
1145
1146 tmnl[ntmnl++]=99; /* end terminal */
1147// printf("ninp=%i ntmnl=%i\n",ninp,ntmnl);
1148//   for(i=0;i<ntmnl;i++) printf("%i%c",tmnl[i],((i+1)%5)? ' ':'\n');
1149//   printf("\n");
1150
1151 gsymbol=(int *)malloc(ntmnl*2*sizeof(int)); /* garmmar symbol */
1152 produc=(int *)malloc(ntmnl*2*sizeof(int)); /* production */
1153 parent=(int *)malloc(ntmnl*2*sizeof(int)); /* parent index */
1154 child=(int *)malloc(ntmnl*2*sizeof(int)); /* left-most child */
1155 sibli=(int *)malloc(ntmnl*2*sizeof(int)); /* next sibling */
1156 attri1=(int *)malloc(ntmnl*2*sizeof(int)); /* attribute 1 */
1157 attri2=(int *)malloc(ntmnl*5*sizeof(int)); /* attribute 2 */
1158 attri3=(double *)malloc(ntmnl*2*sizeof(double)); /* attribute 3 */
1159 nattri2=2; // 0 and 2 are used for special purposes 
1160 nattri3=0;
1161 ngsymb=1;
1162 stk[0]=0;
1163 i=0; // pointer for stack stk[]
1164 for(o=1;o<2592;o*=2); /* power of 2 and larger than 2592 */
1165 for(j=0;j<ntmnl;j++){
1166  k=stk[i]*100+tmnl[j];
1167/* binary search of the index where prs1[]=k */
1168  l=-1; /* decrement next */
1169  n=o;
1170  m=n;
1171  for(;n>0;n/=2){
1172   m+=(l*n);
1173   if(m<2592){
1174    if(prs1[m]==k) l=0;
1175    else if(prs1[m]<k) l=1;
1176    else l=-1;
1177    if(l==0) break;
1178   }
1179   else l=-1;
1180  }
1181  if(l!=0){
1182   contype(0);
1183   printf("parse error state=%i terminal=%i\n",stk[i],tmnl[j]);
1184   exit(0);
1185  }
1186  k=prs2[m]; /* 0:shift (1:goto) 2:reduce 3:accept*/
1187  l=prs3[m]; /* new state or production number */
1188//  printf("i(stack ptr)=%i stk[i]=%i tmnl[j]=%i\n",i,stk[i],tmnl[j]);
1189//  printf("m(table index)=%i k(SGR)=%i l(new state/prod)=%i\n",m,k,l);
1190  switch (k){
1191   case 0: /* shift */
1192    gsymbol[ngsymb]=tmnl[j];
1193    produc[ngsymb]=0;
1194    child[ngsymb]=0;
1195    sibli[ngsymb]=0;
1196/* attributes that depend on tmnl array are established here */
1197    if(prs12[gsymbol[ngsymb]-1]==0) attri1[ngsymb]=0; /* number of attribute = 0 */
1198    else{
1199     attri1[ngsymb]=nattri2; /* attribute offset */
1200     nattri2+=prs12[gsymbol[ngsymb]-1]+3; /* advance past-the-end index of attribute */
1201     k1=gsymbol[ngsymb];
1202     if(k1==20||k1==23||k1==25||k1==28){ // literal input
1203      attri2[attri1[ngsymb]]=0; // link
1204      attri2[attri1[ngsymb]+1]=5; // attribute record length
1205      attri2[attri1[ngsymb]+2]=0; // kind of attribute - literal
1206      attri2[attri1[ngsymb]+3]=0; // number of chars to be entered later
1207      attri2[attri1[ngsymb]+4]=tmnl[j+1]; // inp[] id
1208     }
1209    }
1210    stk[++i]=ngsymb;
1211    ngsymb++;
1212    stk[++i]=l;
1213//    printf("shifted : i=%i\n",i);
1214    break;
1215   case 2: /* reduce */
1216    i-=2*(prs5[l]-prs5[l-1]-1); /* number of grammer symbols on the right
1217                                   side of production */
1218//    printf("reduced : i=%i stk[i]=%i prs4[prs5[l-1]]=%i\n",i,stk[i],prs4[prs5[l-1]]);
1219    k1=stk[i]*100+prs4[prs5[l-1]];
1220/* binary search of the index where prs1[]=k1 */
1221    l1=-1; /* decrement next */
1222    n1=o;
1223    m1=n1;
1224    for(;n1>0;n1/=2){
1225     m1+=(l1*n1);
1226     if(m1<2592){
1227      if(prs1[m1]==k1) l1=0;
1228      else if(prs1[m1]<k1) l1=1;
1229      else l1=-1;
1230      if(l1==0) break;
1231     }
1232     else l1=-1;
1233    }
1234    if(l1!=0){
1235     contype(0);
1236     printf("parse error state=%i non-terminal=%i\n",stk[i],prs4[prs5[l-1]]);
1237     exit(0);
1238    }
1239    gsymbol[ngsymb]=prs4[prs5[l-1]];
1240    produc[ngsymb]=l;
1241    child[ngsymb]=stk[i+1];
1242    for(k1=0;k1<prs5[l]-prs5[l-1]-1;k1++){
1243     l1=stk[i+2*k1+1];
1244     parent[l1]=ngsymb;
1245     if(k1==prs5[l]-prs5[l-1]-2) sibli[l1]=0;
1246     else sibli[l1]=stk[i+2*(k1+1)+1];
1247    }
1248    stk[++i]=ngsymb;
1249    if(prs12[gsymbol[ngsymb]-1]==0) attri1[ngsymb]=0;
1250    else{ // presently this is not applied
1251     attri1[ngsymb]=nattri2;
1252     nattri2+=prs12[gsymbol[ngsymb]-1]+3; // ::::::::::::::::::::
1253    }
1254/* prune parse tree. if the preceeding leaf is prunable, delete it */
1255    if((prs5[l]-prs5[l-1])==2){ /* if the right-side of production is single */
1256     l1=produc[child[ngsymb]];
1257     if(l1!=0&&(prs5[l1]-prs5[l1-1])==2){
1258      gsymbol[ngsymb-1]=gsymbol[ngsymb];
1259      produc[ngsymb-1]=produc[ngsymb];
1260      stk[i]=ngsymb-1; /* child is left as is. attribute assumed to be none */
1261      ngsymb--;
1262     }
1263    }
1264    ngsymb++;
1265    stk[++i]=prs3[m1]; // new state
1266    break;
1267   case 3: /* accept */
1268    j=ntmnl; /* force exit */
1269    break;
1270  } /* switch k */
1271//  printf("i=%i stk[i]=%i\n",i,stk[i]);
1272  if(k==2) j--;
1273  else if(tmnl[j]==20||tmnl[j]==23||tmnl[j]==25||tmnl[j]==28) j++; /* skip string ptr */
1274 } /* for(j=0;j<ntmnl;j++) */
1275
1276#ifndef CGI
1277 fp1=fopen("cbnf12","w");
1278 for(i=0;i<ngsymb;i++) fprintf(fp1,"%3i %4i %3i %3i %3i %3i\n",
1279   i,gsymbol[i],produc[i],parent[i],child[i],sibli[i]);
1280 fclose(fp1);
1281 printf("ngsymb=%i\n",ngsymb);
1282#endif
1283
1284
1285/* start of parse tree decoration */
1286 k=0; /* start and before main */
1287 for(i=0;i<ngsymb;i++) {
1288//  printf("i=%i symbol=%i attr1=%i\n",i,gsymbol[i],attri1[i]);
1289  if(k==1&&gsymbol[i]==30){ /* { after main */
1290   attri2[0]=i;
1291   k=2;
1292  }
1293  if(k>1&&gsymbol[i]==30) k++;
1294  if(k>1&&gsymbol[i]==31) k--;
1295  if(k==2&&gsymbol[i]==31){
1296   attri2[1]=i;
1297   k=-1; /* inhibit any k related action */
1298  }
1299  switch(gsymbol[i]){
1300   case 20: /* character constant */
1301    attri2[attri1[i]+4]=attri2[attri1[i]+4]+1; // exclude starting quote
1302    for(j=attri2[attri1[i]+4];inp[j]!='\"';j++); // end of string
1303    attri2[attri1[i]+3]=j-attri2[attri1[i]+4];
1304    break;
1305   case 23: /* floating constant */
1306    for(j=attri2[attri1[i]+4]+1;isdigit(inp[j])||inp[j]=='.';j++);
1307      // by stating with 2nd char, avoided compareing with - sign
1308    attri2[attri1[i]+3]=j-attri2[attri1[i]+4];
1309    attri2[attri1[i]]=nattri2; // add link to double constant
1310    attri2[nattri2]=0; // link terminator
1311    attri2[nattri2+1]=4; // record length
1312    attri2[nattri2+2]=2; // kind of attribute - double
1313    for(j=0;j<=attri2[attri1[i]+3];j++) s[j]=inp[attri2[attri1[i]+4]+j];
1314    s[j]='\0';
1315    if(sscanf(s,"%lf",&attri3[nattri3])!=1){
1316     contype(0);
1317     printf("double constant form error.");
1318     exit(0);
1319    }
1320    attri2[nattri2+3]=nattri3;
1321    nattri3++;
1322    nattri2+=attri2[nattri2+1];
1323    break;
1324   case 25: /* identifier */
1325    for(j=attri2[attri1[i]+4]+1;isalnum(inp[j])||inp[j]=='_';j++);
1326       // no need for comparing first char
1327    attri2[attri1[i]+3]=j-attri2[attri1[i]+4];
1328    if(k==0){ /* before encountering main */
1329     j=attri2[attri1[i]+4];
1330     if(attri2[attri1[i]+3]==4&&inp[j]=='m'&&
1331       inp[j+1]=='a'&&inp[j+2]=='i'&&inp[j+3]=='n') k=1;
1332    }
1333    break;
1334   case 28: /* integer constant */
1335    for(j=attri2[attri1[i]+4]+1;isdigit(inp[j]);j++);
1336    attri2[attri1[i]+3]=j-attri2[attri1[i]+4];
1337    attri2[attri1[i]]=nattri2; // add link to int constant
1338    attri2[nattri2]=0; // link terminator
1339    attri2[nattri2+1]=4; // record length
1340    attri2[nattri2+2]=1; // kind of attribute - int
1341    for(j=0;j<=attri2[attri1[i]+3];j++) s[j]=inp[attri2[attri1[i]+4]+j];
1342    s[j]='\0';
1343    if(sscanf(s,"%i",&attri2[nattri2+3])!=1){
1344     contype(0);
1345     printf("int constant form error.");
1346     exit(0);
1347    }
1348    nattri2+=attri2[nattri2+1];
1349    break;
1350   default:
1351    break;
1352  } /* switch(gsymbol[i]) */
1353//  if(gsymbol[i]==20||gsymbol[i]==23||gsymbol[i]==25||gsymbol[i]==28){ 
1354//   for(j=0;j<attri2[attri1[i]+3];j++) printf("%c",inp[attri2[attri1[i]+4]+j]);
1355//   printf("\n");
1356//  }
1357  switch(produc[i]){
1358   case 114: /* function return value */
1359    l=child[child[i]]; /* this should be function name */
1360//    printf("l=%i attri1[l]=%i\n",l,attri1[l]);
1361    for(j=0;j<attri2[attri1[l]+3];j++) s[j]=inp[attri2[attri1[l]+4]+j];
1362    s[j]='\0';
1363    for(l=1;l<numfunc;l*=2); /* power of 2 larger than number of functions */
1364    m=l;
1365    j=-1;
1366    for(;l>0;l/=2){
1367     if(j<0) m-=l;
1368     if(j>0) m+=l;
1369     if(m<numfunc) j=strcmp(s,&prs6[prs7[m]]);
1370     else j=-1;
1371     if(j==0) break;
1372    }
1373    if(j!=0){
1374     contype(0);
1375     printf("function not found %s\n",s);
1376     exit(0);
1377    }
1378//    printf("function number=%i\n",prs8[m]);
1379    l=prs9[prs10[m]]; /* return type */
1380    if(l==2){ /* double */
1381     attri1[i]=nattri2;
1382     attri2[nattri2]=0; // link
1383     attri2[nattri2+1]=4; // record length
1384     attri2[nattri2+2]=2; // kind=double
1385     attri2[nattri2+3]=nattri3; // memory
1386     nattri3++;
1387     nattri2+=attri2[nattri2+1];
1388    }
1389    else if(l==4){ /* int */
1390     attri1[i]=nattri2;
1391     attri2[nattri2]=0; // link
1392     attri2[nattri2+1]=4; // record length
1393     attri2[nattri2+2]=1; // kind=int
1394     attri2[nattri2+3]=0; // memory cleared
1395     nattri2+=attri2[nattri2+1];
1396    }
1397    break;
1398   default:
1399    break;
1400  } /* switch(produc[i]) */
1401 }
1402 if(k!=-1){
1403  contype(0);
1404  printf("search error 1\n");
1405  exit(0);
1406 }
1407
1408// printf("attri2[0]=%i attri2[1]=%i\n",attri2[0],attri2[1]); /* start and end */
1409// printf("nattri2=%i nattri3=%i\n",nattri2,nattri3);
1410// for(i=0;i<nattri3;i++) printf("attri3[%i]=%8.6lf\n",i,attri3[i]);
1411//exit(0);
1412 nvari=0; /* number of declared variables */
1413 varioff[nvari]=0; /* variable name offset in vari[] */
1414 nival=0; /* integer varable */
1415 ndval=0; /* double variable */
1416 mpstk[0]=0; /* 0:return node 1:sibling node 2:loop control node */
1417 mpstk[1]=0; /* terminate marker */
1418 nmp=1; /* the next stack entry begins at nmp*2 */
1419 k1=attri2[0]; /* start parse tree node - ***EXECUTION STARTS HERE*** */
1420 test=MAXNOD;
1421 for(i=0;i<10;i++) jmpcnt[i]=0;
1422 njp=0; /* jump control depth */
1423 jmpcnt[njp]=0; /* jump control */
1424
1425 while(test--){
1426#ifndef CGI
1427  printf("**%i** %i ",k1,nmp);
1428  for(i=0;i<nmp;i++) printf("%i-%i ",mpstk[2*i],mpstk[2*i+1]);
1429  printf("\n");
1430#endif
1431  if(k1==0) break; /* terminate execution */
1432  if(nmp>(MAXNMP/2-3)){
1433   contype(0);
1434   printf("max stack depth\n");
1435   exit(0);
1436  }
1437  for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0&&mpstk[2*i+1]==k1) break;
1438  if(i==0){ /* not return pass */
1439   switch (produc[k1]){ /* intercept controls */
1440    case 75: /* if statement */
1441    case 76:
1442     switch(jmpcnt[njp]){
1443      case 0: /* first entry */
1444       mpstk[nmp*2]=2;
1445       mpstk[nmp*2+1]=k1;
1446       nmp++;
1447       k1=child[sibli[sibli[child[k1]]]]; /* conditional statement */
1448       jmpcnt[njp]=1;
1449       break;
1450      case 1: /* branch test */
1451//       printf("branch test %i %i\n",mpstk[(nmp-1)*2],mpstk[(nmp-1)*2+1]);
1452       nmp--;
1453       if(mpstk[(nmp)*2+1]){ /* execute */
1454        mpstk[nmp*2]=2;
1455        mpstk[nmp*2+1]=k1;
1456        nmp++;
1457        k1=sibli[sibli[child[k1]]];
1458        k1=child[sibli[sibli[k1]]];
1459        jmpcnt[njp]=2;
1460       }
1461       else if(produc[k1]==75){
1462        k1=parent[k1];
1463        jmpcnt[njp]=0;
1464        njp--;
1465       }
1466       else{
1467        mpstk[nmp*2]=2;
1468        mpstk[nmp*2+1]=k1;
1469        nmp++;
1470        k1=sibli[sibli[child[k1]]];
1471        k1=sibli[sibli[k1]];
1472        k1=child[sibli[sibli[k1]]];
1473        jmpcnt[njp]=2;
1474       }
1475       break;
1476      case 2: /* get out */
1477       k1=parent[k1];
1478       jmpcnt[njp]=0;
1479       njp--;
1480       break;
1481      default:
1482       k1=0;
1483       break;
1484      }
1485     break;
1486    case 78:
1487    case 79:
1488    case 80:
1489    case 81:
1490    case 82:
1491    case 83:
1492    case 84:
1493     contype(0);
1494     printf("this form of for not implementd\n");
1495     exit(0);      
1496    case 77: /* iteration-statement for */
1497     switch(jmpcnt[njp]){
1498      case 0: /* first entry */
1499       mpstk[nmp*2]=2;
1500       mpstk[nmp*2+1]=k1;
1501       nmp++;
1502       k1=child[sibli[sibli[child[k1]]]]; /* first arg */
1503       jmpcnt[njp]=1;
1504       break;
1505      case 1: /* relational condition */
1506       mpstk[nmp*2]=2;
1507       mpstk[nmp*2+1]=k1;
1508       nmp++;
1509       k1=sibli[sibli[child[k1]]];
1510       k1=child[sibli[sibli[k1]]]; /* second arg */
1511       jmpcnt[njp]=2;
1512       break;
1513      case 2: /* branch test */
1514//       printf("branch test %i %i\n",mpstk[(nmp-1)*2],mpstk[(nmp-1)*2+1]);
1515       nmp--;
1516       if(mpstk[(nmp)*2+1]){ /* execute */
1517        mpstk[nmp*2]=2;
1518        mpstk[nmp*2+1]=k1;
1519        nmp++;
1520        k1=sibli[sibli[child[k1]]];
1521        k1=sibli[sibli[k1]];
1522        k1=sibli[sibli[k1]];
1523        k1=child[sibli[sibli[k1]]];
1524        jmpcnt[njp]=3;
1525       }
1526       else{
1527        k1=parent[k1];
1528        jmpcnt[njp]=0;
1529        njp--;
1530       }
1531       break;
1532      case 3: /* increment loop index */
1533       mpstk[nmp*2]=2;
1534       mpstk[nmp*2+1]=k1;
1535       nmp++;
1536       k1=sibli[sibli[child[k1]]];
1537       k1=sibli[sibli[k1]];
1538       k1=child[sibli[sibli[k1]]];
1539       jmpcnt[njp]=1;
1540       break;
1541      default:
1542       k1=0;
1543       break;
1544      }
1545     break;
1546    default:
1547     i=1;
1548     break;
1549   }
1550   if(i==1){ /* not controls */
1551    if((i=child[k1])!=0){
1552     if((j=sibli[k1])!=0){
1553      mpstk[nmp*2]=1; /* sibling node */
1554      mpstk[nmp*2+1]=j; /* jmp node */
1555      nmp++;
1556      mpstk[nmp*2]=0; /* return node */
1557      mpstk[nmp*2+1]=k1; /* jmp node */
1558      nmp++;
1559     }
1560     else{
1561      mpstk[nmp*2]=0; /* return node */
1562      mpstk[nmp*2+1]=k1; /* jmp node */
1563      nmp++;
1564     }
1565     k1=i; /* jump to child */
1566    } /* if((i=child[k1])!=0) */
1567    else{ /* no child */
1568     j=gsymbol[k1];
1569     if(j==19||j==21||j==27){
1570      mpstk[nmp*2]=3; /* gsymbol */
1571      mpstk[nmp*2+1]=j; /* type */
1572      nmp++;
1573     }
1574     if(j==4||j==5||j==7||j==8||j==10||j==11||j==12||j==13||j==14||j==15){
1575      mpstk[nmp*2]=3; /* gsymbol */
1576      mpstk[nmp*2+1]=j; /* binary operator */
1577      nmp++;
1578     }
1579//     if(j==20||j==23||j==25||j==28){
1580     if(j==20){ /* character constant */
1581      mpstk[nmp*2]=4; /* attri1[node] */
1582      mpstk[nmp*2+1]=attri1[k1];
1583      nmp++;
1584     }
1585     if(j==23){ /* floating constant */
1586      k=attri1[k1]; /* attribute for k1 */
1587      k=attri2[k]; /* link */
1588      if(attri2[k+2]!=2){ /* kind of attribute */
1589       printf("error in floating const\n");
1590       exit(0);
1591      }
1592      mpstk[nmp*2]=6; /* double */
1593      mpstk[nmp*2+1]=attri2[k+3]; /* index into attri3[] */
1594      nmp++;
1595     }
1596     if(j==25){ /* identifier */
1597      k=attri1[k1]; /* attribute for k1 */
1598      for(l=0;l<attri2[k+3];l++) s[l]=inp[attri2[k+4]+l];
1599      s[l]='\0';
1600      for(l=0;l<nvari;l++) if(strcmp(s,&vari[varioff[l]])==0) break;
1601      if(l!=nvari){
1602       if(varitype[l]==21){ /* double */
1603        mpstk[nmp*2]=8; /* double */
1604        mpstk[nmp*2+1]=valoff[l]; /* index into dval[] */
1605        nmp++;
1606       }
1607       else if(varitype[l]==27){ /* int */
1608        mpstk[nmp*2]=9; /* int */
1609        mpstk[nmp*2+1]=valoff[l]; /* index into ival[] */
1610        nmp++;
1611       }
1612      }
1613      else{ /* not in varable table */
1614       mpstk[nmp*2]=4;
1615       mpstk[nmp*2+1]=attri1[k1];
1616       nmp++;
1617      }    
1618     }
1619     if(j==28){ /* integer constant */
1620      k=attri1[k1]; /* attribute for k1 */
1621      k=attri2[k]; /* link */
1622      if(attri2[k+2]!=1){ /* kind of attribute */
1623       contype(0);
1624       printf("error in integer const\n");
1625       exit(0);
1626      }
1627      mpstk[nmp*2]=5; /* int */
1628      mpstk[nmp*2+1]=attri2[k+3]; /* integer value */
1629      nmp++;
1630     }
1631     if(j==18){ /* get out of loop */
1632      for(i=nmp-1;i>0;i--) if(mpstk[2*i]==6) break;
1633      k1=mpstk[2*i+1];
1634      nmp=i+1;
1635      mpstk[nmp*2]=3; /* gsymbol */
1636      mpstk[nmp*2+1]=j; /* binary operator */
1637      nmp++;
1638     }
1639     else if((j=sibli[k1])!=0){
1640      k1=j;
1641     }
1642     else{ /* no child, no sibling */
1643      for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
1644      k1=mpstk[2*i+1];
1645      if(mpstk[2*i]==1){ /* if sibling delete that node */
1646       for(j=i+1;i<nmp;i++){
1647        mpstk[(j-1)*2]=mpstk[j*2];
1648        mpstk[(j-1)*2+1]=mpstk[j*2+1];
1649       }
1650       nmp--;
1651      }
1652     } /* else */
1653    } /* else */
1654    i=produc[k1];
1655    if(i>=75&&i<=84) njp++; /* increment nest control stack id */
1656   } /* if(i==1) not jump control */
1657  } /* if(i==0) */
1658  else{ /* return pass - reduction by non-terminal           */
1659   /* this return node is on the i-th stack.                 */
1660   /* as the data is no more needed, nmp is tentatively      */
1661   /* set to i.                                              */
1662   /* if data propagated on to this pass are to be accessed, */
1663   /* old stack pointer which is saved in j1 may be used.    */
1664   /* data to be propagated should be put into stack and     */
1665   /* increment nmp as needed                                */
1666   i1=i; /* remember pointer for return node k1 */
1667   j1=nmp; /* remember stack pointer */
1668   nmp=i; /* new stack pointer */
1669   switch (produc[k1]){
1670    case 1: /* */
1671     break;
1672    case 2: /* o no action */
1673     break;
1674    case 3: /* */
1675     break;
1676    case 4: /* */
1677     break;
1678    case 5: /* */
1679     break;
1680    case 6: /* */
1681     break;
1682    case 7: /* */
1683     break;
1684    case 8: /* o no action */
1685     break;
1686    case 9: /* */
1687     break;
1688    case 10: /* declaration */
1689//     for(i=i1;i<j1;i++) printf("%i %i %i\n",i,mpstk[i*2],mpstk[i*2+1]);
1690     for(k=i1+2;k<j1;k++){
1691      switch(mpstk[k*2]){
1692      case 4: /* attri1[node] of identifier */
1693       l=mpstk[k*2+1];
1694       for(i=0;i<attri2[l+3];i++) vari[varioff[nvari]+i]=inp[attri2[l+4]+i];
1695       vari[varioff[nvari]+i]='\0';
1696       varioff[nvari+1]=varioff[nvari]+i+1;
1697       varitype[nvari]=mpstk[(i1+1)*2+1];
1698       varisub[nvari][0]=0; /* first subscript */
1699       varisub[nvari][1]=0; /* second subscript */
1700       if(varitype[nvari]==21){ // double
1701        valoff[nvari]=ndval;
1702        ndval++;
1703       }
1704       else if(varitype[nvari]==27){ //int
1705        valoff[nvari]=nival;
1706        nival++;
1707       }
1708//       printf("nvari=%i varitype[nvari]=%i\n varioff[nvari]=%i vari[varioff[nvari]=%s\n",
1709//                 nvari,varitype[nvari],varioff[nvari],&vari[varioff[nvari]]);
1710       nvari++;
1711       break;
1712      case 5: /* subscript */
1713       if(varisub[nvari-1][0]==0){
1714        varisub[nvari-1][0]=mpstk[k*2+1];
1715        if(varitype[nvari-1]==21){ // double
1716         ndval=valoff[nvari-1];
1717         ndval+=varisub[nvari-1][0];
1718        }
1719        else if(varitype[nvari]==27){ //int
1720         nival=valoff[nvari-1];
1721         nival+=varisub[nvari-1][0];
1722        }
1723       } /* if(varisub[nvari-1][0]==0) */
1724       else{ /* second subscript */
1725        varisub[nvari-1][1]=mpstk[k*2+1];
1726        if(varitype[nvari-1]==21){ // double
1727         ndval=valoff[nvari-1];
1728         ndval+=varisub[nvari-1][0]*varisub[nvari-1][1];
1729        }
1730        else if(varitype[nvari]==27){ //int
1731         nival=valoff[nvari-1];
1732         nival+=varisub[nvari-1][0]*varisub[nvari-1][1];
1733        }
1734       } /* else */
1735       break;
1736      } /* switch(mpstk[k*2]) */       
1737     }
1738     break;  
1739    case 11: /* */
1740     break;
1741    case 12: /* o*/
1742     break;
1743    case 13: /* */
1744     break;
1745    case 14: /* */
1746     break;
1747/*    case 15: ps */
1748    case 16: /* */
1749     break;
1750    case 17: /* */
1751     break;
1752    case 18: /* */
1753     break;
1754/*    case 19:  ps */
1755/*    case 20:  ps */
1756/*    case 21:  ps */
1757    case 22: /* */
1758     break;
1759    case 23: /* */
1760     break;
1761    case 24: /* */
1762     break;
1763    case 25: /* */
1764     break;
1765    case 26: /* o*/
1766     break;
1767/*    case 27:  ps */
1768    case 28: /* */
1769     break;
1770/*    case 29:  ps */
1771    case 30: /* */
1772     break;
1773    case 31: /* */
1774     break;
1775    case 32: /* */
1776     break;
1777    case 33: /* o*/
1778     break;
1779    case 34: /* */
1780     break;
1781    case 35: /* */
1782     break;
1783    case 36: /* */
1784     break;
1785    case 37: /* */
1786     break;
1787    case 38: /* */
1788     break;
1789    case 39: /* */
1790     break;
1791    case 40: /* */
1792     break;
1793    case 41: /* */
1794     break;
1795    case 42: /* */
1796     break;
1797    case 43: /* */
1798     break;
1799    case 44: /* */
1800     break;
1801    case 45: /* */
1802     break;
1803    case 46: /* */
1804     break;
1805    case 47: /* */
1806     break;
1807    case 48: /* */
1808     break;
1809    case 49: /* */
1810     break;
1811    case 50: /* */
1812     break;
1813    case 51: /* */
1814     break;
1815    case 52: /* */
1816     break;
1817    case 53: /* */
1818     break;
1819    case 54: /* */
1820     break;
1821    case 55: /* */
1822     break;
1823    case 56: /* */
1824     break;
1825    case 57: /* */
1826     break;
1827    case 58: /* */
1828     break;
1829    case 59: /* */
1830     break;
1831    case 60: /* */
1832     break;
1833    case 61: /* */
1834     break;
1835    case 62: /* o*/
1836     break;
1837    case 63: /* o*/
1838     break;
1839    case 64: /* */
1840     break;
1841    case 65: /* */
1842     break;
1843    case 66: /* */
1844     break;
1845    case 67: /* o*/
1846     break;
1847    case 68: /* */
1848     break;
1849    case 69: /* o no action */
1850     break;
1851    case 70: /* */
1852     break;
1853    case 71: /* o*/
1854     break;
1855    case 72: /* */
1856     break;
1857    case 73: /* o*/
1858     break;
1859    case 74: /* o*/
1860     break;
1861    case 75: /* if statement */
1862    case 76:
1863     break;
1864    case 77: /* iteration-statement for */
1865    case 78:
1866    case 79:
1867    case 80:
1868    case 81:
1869    case 82:
1870    case 83:
1871    case 84:
1872     break;
1873    case 85: /* break */
1874     break;
1875    case 86: /* return */
1876    case 87:
1877     break;
1878/*    case 88: ps */
1879    case 89: /* */
1880     break;
1881/*    case 90: ps */
1882    case 91: /* o*/
1883//     for(i=i1;i<j1;i++) printf("%i %i %i\n",i,mpstk[i*2],mpstk[i*2+1]);
1884     switch(mpstk[(i1+3)*2]){
1885      case 5: /* int */
1886       d1=mpstk[(i1+3)*2+1];
1887       break;
1888      case 6: /* double attri3[] */
1889       d1=attri3[mpstk[(i1+3)*2+1]];
1890       break;
1891      case 8: /* double dval[] */
1892       d1=dval[mpstk[(i1+3)*2+1]];
1893       break;
1894      case 9: /* int ival[] */
1895       d1=ival[mpstk[(i1+3)*2+1]];
1896       break;
1897      case 10: /* double dstk[] */
1898       d1=dstk[mpstk[(i1+3)*2+1]];
1899       break;
1900     }
1901     switch(mpstk[(i1+1)*2]){     
1902      case 8: /* double dval[] */
1903       dval[mpstk[(i1+1)*2+1]]=d1;
1904       break;
1905      case 9: /* int ival[] */
1906       ival[mpstk[(i1+1)*2+1]]=d1;
1907       break;
1908      case 10: /* double dstk[] */
1909       dstk[mpstk[(i1+1)*2+1]]=d1;
1910       break;
1911     }
1912     break;
1913/*    case 92: ps */
1914/*    case 94: ps */
1915    case 93: /*== */
1916    case 95: /*<*/
1917    case 96: /*>*/
1918    case 97: /*<=*/
1919    case 98: /*>=*/
1920//     printf("stack at 95 nmp=%i j1=%i %i %i %i %i %i %i\n",nmp,j1,
1921//      mpstk[(j1-1)*2],mpstk[(j1-1)*2+1],mpstk[(j1-2)*2],mpstk[(j1-2)*2+1],mpstk[(j1-3)*2],mpstk[(j1-3)*2+1]);
1922     switch(mpstk[(j1-3)*2]){
1923      case 5: /* int */
1924       d1=mpstk[(j1-3)*2+1];
1925       break;
1926      case 6: /* double attri3[] */
1927       d1=attri3[mpstk[(j1-3)*2+1]];
1928       break;
1929      case 8: /* double dval[] */
1930       d1=dval[mpstk[(j1-3)*2+1]];
1931       break;
1932      case 9: /* int ival[] */
1933       d1=ival[mpstk[(j1-3)*2+1]];
1934       break;
1935      case 10: /* double dstk[] */
1936       d1=dstk[mpstk[(j1-3)*2+1]];
1937       break;
1938     }
1939     switch(mpstk[(j1-1)*2]){
1940      case 5: /* int */
1941       d2=mpstk[(j1-1)*2+1];
1942       break;
1943      case 6: /* double attri3[] */
1944       d2=attri3[mpstk[(j1-1)*2+1]];
1945       break;
1946      case 8: /* double dval[] */
1947       d2=dval[mpstk[(j1-1)*2+1]];
1948       break;
1949      case 9: /* int ival[] */
1950       d2=ival[mpstk[(j1-1)*2+1]];
1951       break;
1952      case 10: /* double dstk[] */
1953       d2=dstk[mpstk[(j1-1)*2+1]];
1954       break;
1955     }
1956//     printf("d1=%lf d2=%lf\n",d1,d2);
1957     i=0; /* FALSE */
1958     switch(mpstk[(j1-2)*2+1]){
1959      case 10:
1960       if(d1<d2) i=1;
1961       break;
1962      case 11:
1963       if(d1<=d2) i=1;
1964       break;
1965      case 13:
1966       if(d1==d2) i=1;
1967       break;
1968      case 14:
1969       if(d1>d2) i=1;
1970       break;
1971      case 15:
1972       if(d1>=d2) i=1;
1973       break;
1974     }
1975//     printf("nmp=%i i=%i\n",nmp,i);
1976     mpstk[nmp*2]=5;
1977     mpstk[nmp*2+1]=i;
1978     nmp++;
1979     break;
1980/*    case 99: ps */
1981/*    case 102: ps */
1982    case 100: /* +*/
1983    case 101: /* -*/
1984    case 103: /* multiply*/
1985    case 104: /* divide*/
1986//     printf("stack at 100 nmp=%i j1=%i %i %i %i %i %i %i\n",nmp,j1,
1987//      mpstk[(j1-1)*2],mpstk[(j1-1)*2+1],mpstk[(j1-2)*2],mpstk[(j1-2)*2+1],mpstk[(j1-3)*2],mpstk[(j1-3)*2+1]);
1988     i=1; /* int */
1989     switch(mpstk[(j1-3)*2]){
1990      case 5: /* int */
1991       d1=mpstk[(j1-3)*2+1];
1992       break;
1993      case 6: /* double attri3[] */
1994       d1=attri3[mpstk[(j1-3)*2+1]];
1995       i=0;
1996       break;
1997      case 8: /* double dval[] */
1998       d1=dval[mpstk[(j1-3)*2+1]];
1999       i=0;
2000       break;
2001      case 9: /* int ival[] */
2002       d1=ival[mpstk[(j1-3)*2+1]];
2003       break;
2004      case 10: /* double dstk[] */
2005       d1=dstk[mpstk[(j1-3)*2+1]];
2006       i=0;
2007       break;
2008     }
2009     switch(mpstk[(j1-1)*2]){
2010      case 5: /* int */
2011       d2=mpstk[(j1-1)*2+1];
2012       break;
2013      case 6: /* double attri3[] */
2014       d2=attri3[mpstk[(j1-1)*2+1]];
2015       i=0;
2016       break;
2017      case 8: /* double dval[] */
2018       d2=dval[mpstk[(j1-1)*2+1]];
2019       i=0;
2020       break;
2021      case 9: /* int ival[] */
2022       d2=ival[mpstk[(j1-1)*2+1]];
2023       break;
2024      case 10: /* double dstk[] */
2025       d2=dstk[mpstk[(j1-1)*2+1]];
2026       i=0;
2027       break;
2028     }
2029//     printf("d1=%lf d2=%lf\n",d1,d2);
2030     switch(mpstk[(j1-2)*2+1]){
2031      case 4: /* multiply */
2032       d1*=d2;
2033       break;
2034      case 5: /* plus */
2035       d1+=d2;
2036       break;
2037      case 7: /* minus */
2038       d1-=d2;
2039       break;
2040      case 8: /* divide */
2041       if(d2==0.){
2042        contype(0);
2043        printf("Divide by 0\n");
2044        exit(0);
2045       }
2046       d1/=d2;
2047       break;
2048     }
2049//     printf("nmp=%i d1=%lf\n",nmp,d1);
2050     if(i==1){
2051      i=d1;
2052      mpstk[nmp*2]=5;
2053      mpstk[nmp*2+1]=i;
2054     }
2055     else{
2056      mpstk[nmp*2]=10;
2057      for(j=nmp-1;j>0;j--) if(mpstk[j*2]==10) break;
2058      if(j==0) mpstk[nmp*2+1]=0;
2059      else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
2060      dstk[mpstk[nmp*2+1]]=d1;
2061     }
2062     nmp++;
2063     break;
2064/*    case 105: ps */
2065     break;
2066    case 106: /* */
2067     break;
2068/*    case 107: ps */
2069    case 108: /* unary processing */
2070     switch(mpstk[(j1-1)*2]){
2071      case 5: /* int */
2072       d2=mpstk[(j1-1)*2+1];
2073       break;
2074      case 6: /* double attri3[] */
2075       d2=attri3[mpstk[(j1-1)*2+1]];
2076       i=0;
2077       break;
2078      case 8: /* double dval[] */
2079       d2=dval[mpstk[(j1-1)*2+1]];
2080       i=0;
2081       break;
2082      case 9: /* int ival[] */
2083       d2=ival[mpstk[(j1-1)*2+1]];
2084       break;
2085      case 10: /* double dstk[] */
2086       d2=dstk[mpstk[(j1-1)*2+1]];
2087       i=0;
2088       break;
2089     }
2090     switch(mpstk[(j1-2)*2+1]){
2091      case 5: /* + */
2092       d1=d2;
2093       break;
2094      case 7: /* - */
2095       d1=-d2;
2096       break;
2097     }
2098     if(i==1){
2099      i=d1;
2100      mpstk[nmp*2]=5;
2101      mpstk[nmp*2+1]=i;
2102     }
2103     else{
2104      mpstk[nmp*2]=10;
2105      for(j=nmp-1;j>0;j--) if(mpstk[j*2]==10) break;
2106      if(j==0) mpstk[nmp*2+1]=0;
2107      else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
2108      dstk[mpstk[nmp*2+1]]=d1;
2109     }
2110     nmp++;     
2111     break;
2112    case 109: /* */
2113     break;
2114/*    case 110: ps */
2115     break;
2116/*    case 111: ps */
2117     break;
2118/*    case 112: ps */
2119    case 113: /* subscript */
2120     mpstk[nmp*2]=mpstk[(nmp+1)*2];
2121     switch(mpstk[(nmp+2)*2]){
2122      case 5: /* value */
2123       mpstk[nmp*2+1]=mpstk[(nmp+1)*2+1]+mpstk[(nmp+2)*2+1];
2124       break;
2125      case 9: /* ival[] */
2126       mpstk[nmp*2+1]=mpstk[(nmp+1)*2+1]+ival[mpstk[(nmp+2)*2+1]];
2127       break;
2128     }
2129     nmp++;
2130     break;
2131    case 114: /* o*/
2132    case 115: /* */
2133#ifndef CGI
2134     printf("at the entry of 114\n");
2135#endif
2136     l1=mpstk[(i1+1)*2+1]; /* function name */
2137     for(i=0;i<attri2[l1+3];i++) s[i]=inp[attri2[l1+4]+i];
2138     s[i]='\0';
2139#ifndef CGI
2140     printf("l1=%i %s\n",l1,s);
2141#endif
2142     for(k=1;k<numfunc;k*=2); /* power of 2 larger than number of functions */
2143     i=k;
2144     j=-1;
2145     for(;k>0;k/=2){
2146      if(j<0) i-=k;
2147      if(j>0) i+=k;
2148      if(i<numfunc) j=strcmp(s,&prs6[prs7[i]]);
2149      else j=-1;
2150      if(j==0) break;
2151     }
2152     if(j!=0){
2153      contype(0);
2154      printf("function not found\n");
2155      exit(0);
2156     }
2157#ifndef CGI
2158     printf("function number=%i\n",prs8[i]);
2159#endif
2160     param1[0]=prs8[i]; /* function number */
2161     param1[1]=prs11[i]-prs10[i]; /* number of parameters */
2162     for(j=0;j<param1[1];j++) param1[2+j]=prs9[prs10[i]+j]; /* types */
2163     m1=0; /* past-the-end index to char param2[] */
2164     n1=0; /* past-the-end index to double param3[] */
2165     o1=0; /* past-the-end index to int param4[] */
2166     switch(param1[2]){ /* type of return value */
2167      case 2: /* double */
2168       para[1]=(void *)&param3[n1++];
2169       break;
2170      case 4: /* int */
2171       para[1]=(void *)&param4[o1++];
2172       break;
2173      case 6: /* ... */
2174       break;
2175      default:
2176       contype(0);
2177       printf("return type not supported\n");
2178       exit(0);
2179       break;
2180     }
2181     k=0; /* index to argument */
2182     for(l1=i1+2;l1<j1;l1++){
2183       switch(mpstk[l1*2]){
2184        case 4: /* character constant */
2185          l=mpstk[l1*2+1];
2186          for(i=0;i<attri2[l+3];i++) param2[m1+i]=inp[attri2[l+4]+i];
2187          param2[m1+i]='\0';
2188          if(param1[k+3]!=1){
2189           contype(0);
2190           printf("argument type incompatible\n");
2191           printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
2192           exit(0);
2193          }
2194          para[k+2]=(void *)&param2[m1];
2195          if(param1[0]==0){ /* printf - type infered from format */
2196           j=m1; /* scan index */
2197           l=0; /* 0:seek for % or \  1:seek for f or i  2:seek for n */
2198           k=4; /* index into param1[] - to be restored later */
2199           while((c=param2[j++])!='\0'){
2200            switch (c){
2201             case '%' :
2202              l=1;
2203              break;
2204             case 'f' :
2205             case 'e' :
2206              if(l==1){
2207               param1[k++]=2; /* type double */
2208               l=0;
2209              }
2210              break;
2211             case 'i' :
2212              if(l==1){
2213               param1[k++]=4; /* type int */
2214               l=0;
2215              }
2216              break;
2217             case '\\' :
2218              l=2;
2219              break;
2220             case 'n' :
2221              if(l==2){
2222               for(l=m1+i+2;l>j;l--) param2[l]=param2[l-2];
2223               param2[j-2]='<';
2224               param2[j-1]='b';
2225               param2[j]='r';
2226               param2[j+1]='>';
2227               i+=2;
2228               l=0;
2229              }
2230              break;
2231             default:
2232              break;
2233            } /* switch (c) */
2234           } /* while((c=param2[j++])!='\0') */
2235           param1[1]=k-2; /* number of parameters */
2236           k=0;
2237          } /* if(param1[0]==0) */
2238          m1=m1+i+1;
2239          k++;
2240          break;
2241        case 5: /* int */
2242           if(param1[k+3]!=4){
2243            param3[n1]=attri3[mpstk[l1*2+1]];
2244            para[k+2]=(void *)&param3[n1];
2245            n1++;
2246            k++;
2247           }
2248           else{
2249            param4[o1]=mpstk[l1*2+1];
2250            para[k+2]=(void *)&param4[o1];
2251            o1++;
2252            k++;
2253           }
2254           break;
2255        case 6: /* double (floating const)  attri3[] */
2256          param3[n1]=attri3[mpstk[l1*2+1]];
2257          if(param1[k+3]!=2){
2258           contype(0);
2259           printf("argument type incompatible\n");
2260           printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
2261           exit(0);
2262          }
2263          para[k+2]=(void *)&param3[n1];
2264          n1++;
2265          k++;
2266          break;
2267        case 8: /* double dval[] */
2268          if(param1[k+3]!=2){
2269           contype(0);
2270           printf("argument type incompatible\n");
2271           printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
2272           exit(0);
2273          }
2274          param3[n1]=dval[mpstk[l1*2+1]];
2275          para[k+2]=(void *)&param3[n1];
2276          n1++;
2277          k++;
2278          break;
2279        case 9: /* int ival[] */
2280           if(param1[k+3]!=4){
2281            contype(0);
2282            printf("argument type incompatible\n");
2283            printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
2284            exit(0);
2285           }
2286           else{
2287            param4[o1]=ival[mpstk[l1*2+1]];
2288            para[k+2]=(void *)&param4[o1];
2289            o1++;
2290            k++;
2291           }
2292           break;
2293         break;
2294        case 10: /* double dstk[] */
2295          if(param1[k+3]!=2){
2296           contype(0);
2297           printf("argument type incompatible\n");
2298           printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
2299           exit(0);
2300          }
2301          param3[n1]=dstk[mpstk[l1*2+1]];
2302          para[k+2]=(void *)&param3[n1];
2303          n1++;
2304          k++;
2305          break;
2306       } /* switch(mpstk[l1*2]) */
2307     } /* for(l1=i1+2;l1<j1;l1++) */
2308
2309     para[0]=(void *)&param1[0];
2310     param=(void *)&para[0];
2311     func(param);
2312//    printf("attri1[k1]=%i attri2[attri1[k1]+2]=%i\n",attri1[k1],attri2[attri1[k1]+2]);
2313//     if(attri2[attri1[k1]+2]==1) attri2[attri1[k1]+3]=*(int *)para[1];
2314//     else if(attri2[attri1[k1]+2]==2) attri3[attri2[attri1[k1]+3]]=*(double *)para[1];
2315     if(param1[2]==2){ /* double */
2316      mpstk[2*nmp]=10;
2317      for(j=nmp-1;j>0;j--) if(mpstk[2*j]==10) break;
2318      if(j==0) mpstk[2*nmp+1]=0;
2319      else mpstk[2*nmp+1]=mpstk[2*j+1]+1;
2320      dstk[mpstk[2*nmp+1]]=*(double *)para[1];
2321//      printf("return value=%lf\n",dstk[mpstk[2*nmp+1]]);
2322      nmp++;
2323     }
2324     else{ /* int */
2325      mpstk[2*nmp]=5;
2326      mpstk[2*nmp+1]=*(int *)para[1];
2327//      printf("return value=%i\n",mpstk[2*nmp+1]);
2328      nmp++;
2329     }
2330     break;
2331    case 116: /* */
2332     break;
2333    case 117: /* */
2334     break;
2335/*    case 118: ps */
2336/*    case 119: ps */
2337/*    case 120: ps */
2338    case 121: /* */
2339     break;
2340    case 122: /* */
2341     break;
2342    case 123: /* */
2343     break;
2344    default:
2345//    case 15:
2346//    case 19:
2347//    case 20:
2348//    case 21:
2349//    case 27:
2350//    case 29:
2351//    case 88:
2352//    case 90:
2353//    case 92:
2354//    case 94:
2355//    case 99: /* propagate stack */
2356//    case 102:
2357//    case 107:
2358//    case 110:
2359//    case 111:
2360//    case 112:
2361//    case 118:
2362//    case 119:
2363//    case 120:
2364     for(i=i1;i<j1-1;i++){
2365      mpstk[i*2]=mpstk[(i+1)*2];
2366      mpstk[i*2+1]=mpstk[(i+1)*2+1];
2367     }
2368     nmp=j1-1;
2369     break;     
2370   } /* switch (produc[k1]) */
2371   for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2372   if(i>0){
2373    k1=mpstk[2*i+1];
2374    if(mpstk[2*i]==1||mpstk[2*i]==2){
2375     for(;i<nmp;i++){
2376      mpstk[2*i]=mpstk[2*(i+1)];
2377      mpstk[2*i+1]=mpstk[2*(i+1)+1];
2378     }
2379     nmp--;
2380    }
2381   }
2382   else k1=0; 
2383  } /* else */
2384 } /* while(test--) */
2385}
2386
2387/**************************************************************************
2388 functions
2389  passed parameter
2390  param[0] : int**param1 param1[0]:function number
2391                         param1[1]:number of parameters
2392                         param1[2]:type of return value
2393                         param1[3]:type of the first parameter in parentheses
2394                         param1[4]:type of the second parameter in parentheses
2395  param[1] : param1[2]*
2396  param[2] : param1[3]* format
2397  param[3] : param1[4]*
2398
2399  
2400**************************************************************************/
2401int func(void *param)
2402{
2403  int *param1;
2404  int i,j,k;
2405  double d=3.14159265;
2406  char f[30];
2407  char *fmt;
2408  double a,b;
2409
2410  param1=*(int **)param;
2411//  printf("param1[0]=%i [1]=%i   ",param1[0],param1[1]);
2412//  for(i=0;i<param1[1];i++) printf("[%i]=%i ",i+2,param1[i+2]);
2413//  printf("\n");
2414  switch (param1[0]){
2415   case 0: /* printf */
2416    if(firstTime){
2417     printf("Content-type: text/html%c%c",10,10);
2418     firstTime=0;
2419    }
2420    j=0;
2421    i=0;
2422    fmt=(char *)((void **)param)[2];
2423    for(j=0;;j++){
2424     if(fmt[i]=='\0'||fmt[i]=='%') break;
2425     f[j]=fmt[i];
2426     i++;
2427    }
2428    f[j]='\0';
2429    printf(f);
2430    for(k=2;k<param1[1];k++){ /* do for number of parameters */
2431     for(j=0;;j++){
2432      f[j]=fmt[i];
2433      if(fmt[i]=='i'){
2434       f[j+1]='\0';
2435       printf(f,*(int *)((void **)param)[k+1]);
2436       i++;
2437       break;
2438      }
2439      if(fmt[i]=='f'||fmt[i]=='e'){
2440       f[j+1]='\0';
2441       printf(f,*(double *)((void **)param)[k+1]);
2442       i++;
2443       break;
2444      }
2445      i++;
2446     }
2447     for(j=0;;j++){
2448      if(fmt[i]=='\0'||fmt[i]=='%') break;
2449      f[j]=fmt[i];
2450      i++;
2451     }
2452     f[j]='\0';
2453     printf(f);
2454    }
2455    *(int *)((void **)param)[1]=0;
2456    break;
2457   case 1: /* sin */
2458    *(double *)((void **)param)[1]=sin(*(double *)((void **)param)[2]);
2459    break;
2460   case 2: /* cos */
2461    *(double *)((void **)param)[1]=cos(*(double *)((void **)param)[2]);
2462    break;
2463   case 3: /* tan */
2464    *(double *)((void **)param)[1]=tan(*(double *)((void **)param)[2]);
2465    break;
2466   case 4: /* asin */
2467    a=*(double *)((void **)param)[2];
2468    if(a<1.||a>1.){
2469     contype(0);
2470     printf("asin arg\n");
2471     exit(0);
2472    }
2473    *(double *)((void **)param)[1]=asin(a);
2474    break;
2475   case 5: /* acos */
2476    a=*(double *)((void **)param)[2];
2477    if(a<1.||a>1.){
2478     contype(0);
2479     printf("acos arg\n");
2480     exit(0);
2481    }
2482    *(double *)((void **)param)[1]=acos(a);
2483    break;
2484   case 6: /* atan */
2485    *(double *)((void **)param)[1]=atan(*(double *)((void **)param)[2]);
2486    break;
2487   case 7: /* atan2 */
2488    *(double *)((void **)param)[1]=atan2(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
2489    break;
2490   case 8: /* sinh */
2491    *(double *)((void **)param)[1]=sinh(*(double *)((void **)param)[2]);
2492    break;
2493   case 9: /* cosh */
2494    *(double *)((void **)param)[1]=cosh(*(double *)((void **)param)[2]);
2495    break;
2496   case 10: /* tanh */
2497    *(double *)((void **)param)[1]=tanh(*(double *)((void **)param)[2]);
2498    break;
2499   case 11: /* exp */
2500    *(double *)((void **)param)[1]=exp(*(double *)((void **)param)[2]);
2501    break;
2502   case 12: /* log */
2503    a=*(double *)((void **)param)[2];
2504    if(a<=0.){
2505     contype(0);
2506     printf("log arg\n");
2507     exit(0);
2508    }
2509    *(double *)((void **)param)[1]=log(a);
2510    break;
2511   case 13: /* log10 */
2512    a=*(double *)((void **)param)[2];
2513    if(a<=0.){
2514     contype(0);
2515     printf("log10 arg\n");
2516     exit(0);
2517    }
2518    *(double *)((void **)param)[1]=log10(a);
2519    break;
2520   case 14: /* pow */
2521    a=*(double *)((void **)param)[2];
2522    b=*(double *)((void **)param)[3];
2523    if((a==0.&&b<=0.)||(a<0.&&fmod(b,1.)!=0.)){
2524     contype(0);
2525     printf("pow arg\n");
2526     exit(0);
2527    }
2528    *(double *)((void **)param)[1]=pow(a,b);
2529    break;
2530   case 15: /* sqrt */
2531    a=*(double *)((void **)param)[2];
2532    if(a<0.){
2533     contype(0);
2534     printf("sqrt arg negative\n");
2535     exit(0);
2536    }
2537    *(double *)((void **)param)[1]=sqrt(a);
2538    break;
2539   case 16: /* ceil */
2540    *(double *)((void **)param)[1]=ceil(*(double *)((void **)param)[2]);
2541    break;
2542   case 17: /* floor */
2543    *(double *)((void **)param)[1]=floor(*(double *)((void **)param)[2]);
2544    break;
2545   case 18: /* fabs */
2546    *(double *)((void **)param)[1]=fabs(*(double *)((void **)param)[2]);
2547    break;
2548   case 19: /* fmod */
2549    *(double *)((void **)param)[1]=fmod(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
2550    break;
2551   case 20: /* MakeView */
2552    *(int *)((void **)param)[1]=MakeView(*(int *)((void **)param)[2],*(int *)((void **)param)[3]);
2553    break;
2554   case 21: /* SetColor */
2555    *(int *)((void **)param)[1]=SetColor(*(int *)((void **)param)[2],*(int *)((void **)param)[3],*(int *)((void **)param)[4]);
2556    break;
2557   case 22: /* MoveTo */
2558    *(int *)((void **)param)[1]=MoveTo(*(int *)((void **)param)[2],*(int *)((void **)param)[3]);
2559    break;
2560   case 23: /* LineTo */
2561    *(int *)((void **)param)[1]=LineTo(*(int *)((void **)param)[2],*(int *)((void **)param)[3]);
2562    break;
2563   case 24: /* GifOut */
2564    if(!firstTime){
2565     contype(0);
2566     printf("text and image cannot be mixed");
2567     exit(0);
2568    }
2569    *(int *)((void **)param)[1]=GifOut();
2570    break;
2571   case 25: /* OpenPoly */
2572    *(int *)((void **)param)[1]=OpenPoly();
2573    break;
2574   case 26: /* ClosePoly */
2575    *(int *)((void **)param)[1]=ClosePoly();
2576    break;
2577   case 27: /* FontInfo */
2578    *(int *)((void **)param)[1]=FontInfo(*(int *)((void **)param)[2],*(int *)((void **)param)[3],*(int *)((void **)param)[4]);
2579    break;
2580   case 28: /* DrawString */
2581    *(int *)((void **)param)[1]=DrawString((char *)((void **)param)[2]);
2582    break;
2583   case 29: /* MakeGraph */
2584    *(int *)((void **)param)[1]=MakeGraph(*(int *)((void **)param)[2],*(int *)((void **)param)[3]
2585                                       ,*(int *)((void **)param)[4],*(int *)((void **)param)[5]);
2586    break;
2587   case 30: /* HorizTime */
2588    *(int *)((void **)param)[1]=HorizTime();
2589    break;
2590   case 31: /* HorizScale */
2591    *(int *)((void **)param)[1]=HorizScale((char *)((void **)param)[2],*(double *)((void **)param)[3],*(double *)((void **)param)[4]);
2592    break;
2593   case 32: /* VertScale */
2594    *(int *)((void **)param)[1]=VertScale((char *)((void **)param)[2],*(double *)((void **)param)[3],*(double *)((void **)param)[4]);
2595    break;
2596   case 33: /* MoveToG */
2597    *(int *)((void **)param)[1]=MoveToG(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
2598    break;
2599   case 34: /* LineToG */
2600    *(int *)((void **)param)[1]=LineToG(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
2601    break;
2602   case 35: /* PlotG */
2603    *(int *)((void **)param)[1]=PlotG(*(int *)((void **)param)[2],*(double *)((void **)param)[3],*(double *)((void **)param)[4]);
2604    break;
2605   case 36: /* erf */
2606    *(double *)((void **)param)[1]=erf(*(double *)((void **)param)[2]);
2607    break;
2608   case 37: /* Jn */
2609    *(double *)((void **)param)[1]=Jn(*(int *)((void **)param)[2],*(double *)((void **)param)[3]);
2610    break;
2611   case 38: /* Yn */
2612    *(double *)((void **)param)[1]=Yn(*(int *)((void **)param)[2],*(double *)((void **)param)[3]);
2613    break;
2614   case 39: /* refday */
2615    *(double *)((void **)param)[1]=refday(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
2616    break;
2617   case 40: /* mdyday */
2618    *(double *)((void **)param)[1]=mdyday(*(double *)((void **)param)[2]);
2619    break;
2620   case 41: /* hmsday */
2621    *(double *)((void **)param)[1]=hmsday(*(double *)((void **)param)[2]);
2622    break;
2623   case 42: /* DrawNum */
2624    *(int *)((void **)param)[1]=DrawNum(*(int *)((void **)param)[2]);
2625    break;
2626   case 43: /* DrawFNum */
2627    *(int *)((void **)param)[1]=DrawFNum((char *)((void **)param)[2],*(double *)((void **)param)[3]);
2628    break;
2629   case 44: /* exit */
2630    if(firstTime){
2631     printf("Content-type: text/html%c%c",10,10);
2632    }
2633    printf("exit(%i)",*(int *)((void **)param)[2]);
2634    exit(0);
2635    break;
2636   case 45: /* PngOut */
2637    if(!firstTime){
2638     contype(0);
2639     printf("text and image cannot be mixed");
2640     exit(0);
2641    }
2642    *(int *)((void **)param)[1]=PngOut();
2643    break;
2644   default:
2645    break;
2646  }
2647
2648}
2649