p073.c

0000#define MAXINP 20500 /* maximum input characters */
0001#define MAXNOD 10000 /* maximun processed node */
0002#define MAXNMP 500   /* multi-purpose stack */
0003#include <stdio.h>
0004#include <stdlib.h>
0005#include <ctype.h>
0006
0007#include <math.h>
0008#include "draw.h"
0009#include "gcs1.h"
0010#include "gcs2.h"
0011note000
0012int func(void *param);
0013
0014typedef struct {
0015    char *name;
0016    char *val;
0017} entry;
0018
0019/* structs darray and iarray moved to gcs2.h */
0020
0021typedef struct {
0022 int scop;
0023 char *bchar; /* base of characters */
0024 int *bstring; /* base of offset to bchar */
0025 double *bdouble; /* base of doubles */
0026 int *bint; /* base of integers - includes pointers */
0027 darray *bdarr; /* base of darrays */
0028 iarray *biarr; /* base of iarrays */
0029 int schar; /* start offset of global subscript */
0030 int sstring;
0031 int sdouble;
0032 int sint;
0033 int sdarr;
0034 int siarr;
0035} memory;
0036
0037typedef struct {
0038 char name[30];
0039 int noderoot; /* starting node number */
0040 int nodedecl; /* declaration */
0041 int nodeexec;
0042
0043 int nchar; /* numbr of characters */
0044 int nstring; /* number of strings */
0045 int ndouble; /* number of doubles */
0046 int nint; /* number of ints */
0047 int ndarr; /* number of darrays */
0048 int niarr; /* number of iarrays */
0049
0050 int nident; /* number of identifiers */
0051 int *ident;
0052 int *kind; /* kind of identifiers  */
0053            /* 1:char 2:string 3:double 4:int 5:darray   */
0054            /* 6:iarray                                  */
0055            /* 7:char* 8:string* 9:double* 10:int*       */
0056            /* 11:darray* 12:iarray*                     */
0057 int *offs; /* offset to memory data */
0058 memory mem;
0059} scope;
0060
0061
0062#define LF 10
0063#define CR 13
0064
0065int firstTime=1;
0066
0067void contype(int ernum) /* call before printing error message and exit */
0068{
0069 if(firstTime){
0070  printf("Content-type: text/html%c%c",10,10);
0071 }
0072 printf("*** Terminated by error %i ***\n",ernum);
0073}
0074note001
0075void getword(char *word, char *line, char stop) {
0076    int x = 0,y;
0077
0078    for(x=0;((line[x]) && (line[x] != stop));x++)
0079        word[x] = line[x];
0080
0081    word[x] = '\0';
0082    if(line[x]) ++x;
0083    y=0;
0084
0085    while(line[y++] = line[x++]);
0086}
0087
0088char *makeword(char *line, char stop) {
0089    int x = 0,y;
0090    char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1));
0091
0092    for(x=0;((line[x]) && (line[x] != stop));x++)
0093        word[x] = line[x];
0094
0095    word[x] = '\0';
0096    if(line[x]) ++x;
0097    y=0;
0098
0099    while(line[y++] = line[x++]);
0100    return word;
0101}
0102
0103char *fmakeword(FILE *f, char stop, int *cl) {
0104    int wsize;
0105    char *word;
0106    int ll;
0107
0108    wsize = 1024;
0109    ll=0;
0110    word = (char *) malloc(sizeof(char) * (wsize + 1));
0111
0112    while(1) {
0113        word[ll] = (char)fgetc(f);
0114        if(ll==wsize) {
0115            word[ll+1] = '\0';
0116            wsize+=1024;
0117            if(wsize>MAXINP){
0118             contype(0);
0119             printf("Input length limit over.");
0120             exit(0);
0121            }
0122            word = (char *)realloc(word,sizeof(char)*(wsize+1));
0123        }
0124        --(*cl);
0125        if((word[ll] == stop) || (feof(f)) || (!(*cl))) {
0126            if(word[ll] != stop) ll++;
0127            word[ll] = '\0';
0128            if(ll>80){ // source allow for input field extention
0129             wsize+=1024;
0130             word = (char *)realloc(word,sizeof(char)*(wsize+1));
0131            }
0132            return word;
0133        }
0134        ++ll;
0135    }
0136}
0137
0138char x2c(char *what) {
0139    register char digit;
0140
0141    digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
0142    digit *= 16;
0143    digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
0144    return(digit);
0145}
0146
0147void unescape_url(char *url) {
0148    register int x,y;
0149
0150    for(x=0,y=0;url[y];++x,++y) {
0151        if((url[x] = url[y]) == '%') {
0152            url[x] = x2c(&url[y+1]);
0153            y+=2;
0154        }
0155    }
0156    url[x] = '\0';
0157}
0158
0159void plustospace(char *str) {
0160    register int x;
0161
0162    for(x=0;str[x];x++) if(str[x] == '+') str[x] = ' ';
0163}
0164
0165int rind(char *s, char c) {
0166    register int x;
0167    for(x=strlen(s) - 1;x != -1; x--)
0168        if(s[x] == c) return x;
0169    return -1;
0170}
0171
0172int getline(char *s, int n, FILE *f) {
0173    register int i=0;
0174
0175    while(1) {
0176        s[i] = (char)fgetc(f);
0177
0178        if(s[i] == CR)
0179            s[i] = fgetc(f);
0180
0181        if((s[i] == 0x4) || (s[i] == LF) || (i == (n-1))) {
0182            s[i] = '\0';
0183            return (feof(f) ? 1 : 0);
0184        }
0185        ++i;
0186    }
0187}
0188
0189void send_fd(FILE *f, FILE *fd)
0190{
0191    int num_chars=0;
0192    char c;
0193
0194    while (1) {
0195        c = fgetc(f);
0196        if(feof(f))
0197            return;
0198        fputc(c,fd);
0199    }
0200}
0201
0202main(int argc, char *argv[]) {
0203    entry entries[10];
0204    int x,mx=0;
0205    int cl;
0206
0207 char *inp; /* input c-code cleaned */
0208 int *tmnl; /* input terminals in teminal number (2-31) */
0209 int ninp,ntmnl; /* number of inp[] and tmnl[] */
0210 int comment; /* comment cleaning process status */
0211 char c;
0212 int stk[100]; /* stack used at parsing (grammar symbol and state pairs) */
0213 int i,j,k,l,m,n,o,i1,j1,k1,l1,m1,n1,o1;
0214 int i2,i3,i4,i5,i6,i7;
0215 int test;
0216 FILE *fp;
0217 int *gsymbol; /* garmmar symbol */
0218 int *produc; /* production */
0219 int *parent; /* parent index */
0220 int *child; /* left-most child */
0221 int *sibli; /* next sibling */
0222 int *attri1; /* attribute 1 */
0223 void *param;
0224 void *para[10];
0225 int param1[10];
0226 char param2[100];
0227 double param3[5];
0228 int param4[5];
0229 int ngsymb;
0230 char s[30];
0231 int mpstk[MAXNMP];
0232 double dstk[25];
0233 int nmp;
0234 int njp; /* jump control depth */
0235 int jmpcnt[10]; /* jump control */
0236 double d1,d2;
0237 FILE *fp1;
0238 char *inpchar;
0239 int *chcon;
0240 int nchcon;
0241 int *ident;
0242 int nident;
0243 double *flcon;
0244 int nflcon;
0245 scope *scop;
0246 int nscop;
0247 memory *mem[200];  /* memory stack 0:global 1:main */
0248 int nmem;
0249 int decltype;
0250 int ochar,ostring,odouble,oint,odarr,oiarr,oident;
0251 int odata;
0252note002
0253 int lex1[26]={ /* number of entries for alphabet letter */
0254    1,  1,  4,  3,  3,  2,  1,  0,  2,  0,
0255    0,  1,  0,  0,  0,  0,  0,  2,  7,  1,
0256    2,  2,  1,  0,  0,  0};
0257 int lex2[26]={ /* offset to lex3 */
0258    0,  1,  2,  6,  9, 12, 14,  0, 15,  0,
0259    0, 17,  0,  0,  0,  0,  0, 18, 20, 27,
0260   28, 30, 32,  0,  0,  0};
0261 int lex3[33]={ /* terminal number */
0262   42, 43, 44, 45, 47, 48, 49, 50, 51, 52,
0263   53, 55, 56, 58, 59, 61, 62, 64, 65, 66,
0264   67, 68, 69, 70, 71, 72, 73, 74, 76, 77,
0265   78, 79, 80};
0266 int lex4[33]={ /* no of total characters */
0267    4,  5,  4,  4,  5,  8,  7,  2,  6,  4,
0268    4,  6,  5,  3,  4,  2,  3,  4,  8,  6,
0269    5,  6,  6,  6,  6,  6,  6,  7,  5,  8,
0270    4,  8,  5};
0271 int lex5[33]={ /* offset to character table */
0272    0,  3,  7, 10, 13, 17, 24, 30, 31, 36,
0273   39, 42, 47, 51, 53, 56, 57, 59, 62, 69,
0274   74, 78, 83, 88, 93, 98,103,108,114,118,
0275  125,128,135};
0276 int lex6[139]={ /* character table */
0277  'u','t','o','r','e','a','k','a','s','e','h','a','r','o','n','s','t','o',
0278  'n','t','i','n','u','e','e','f','a','u','l','t','o','o','u','b','l','e',
0279  'l','s','e','n','u','m','x','t','e','r','n','l','o','a','t','o','r','o',
0280  't','o','f','n','t','o','n','g','e','g','i','s','t','e','r','e','t','u',
0281  'r','n','h','o','r','t','i','g','n','e','d','i','z','e','o','f','t','a',
0282  't','i','c','t','r','i','n','g','t','r','u','c','t','w','i','t','c','h',
0283  'y','p','e','d','e','f','n','i','o','n','n','s','i','g','n','e','d','o',
0284  'i','d','o','l','a','t','i','l','e','h','i','l','e'};
0285 int lex7[41]={ /* special character table 233840 */
0286  '!','%','&','(',')','*','+',',','-','.','/',':',';','<','=','>','?','[',
0287  ']','^','{','|','}','~','=','&','=','+','=','-','=','>','.','<','=','=',
0288  '>','=','|','.','='};
0289 int lex8[41]={ /* terminal number 233840 */
0290    2,  4,  6,  9, 10, 11, 13, 16, 17, 22, 23, 25, 26, 27, 31, 33, 37, 38,
0291   39, 40, 81, 82, 85, 86,  1,  1,  2,  1,  2,  1,  2,  3,  0,  1,  3,  1,
0292    2,  1,  2,  1,  1};
0293 int lex9[41]={ /* index for next char 233840 */
0294   24, 24, 25,  0,  0, 24, 27,  0, 29, 32, 24,  0,  0, 33, 24, 35,  0,  0,
0295    0, 24,  0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 40,  0,  0,
0296   40,  0,  0,  0,  0};
0297 int lex10[41]={ /* number if indices 233840 */
0298    1,  1,  2,  0,  0,  1,  2,  0,  3,  1,  1,  0,  0,  2,  1,  2,  0,  0,
0299    0,  1,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,
0300    1,  0,  0,  0,  0};
0301 int lex11[136]={ /* with space or not */
0302  'c','i','t','a','t','s','d','e','n','g','i','s','d','e','n','g','i','s',
0303  'n','u','d','i','o','v','e','l','b','u','o','d','e','l','i','t','a','l',
0304  'o','v','e','s','a','c','e','s','l','e','f','e','d','e','p','y','t','f',
0305  'o','e','z','i','s','g','n','i','r','t','s','g','n','o','l','h','c','t',
0306  'i','w','s','n','o','i','n','u','n','r','e','t','x','e','n','r','u','t',
0307  'e','r','o','t','o','g','o','t','u','a','r','a','h','c','r','e','t','s',
0308  'i','g','e','r','t','a','o','l','f','t','c','u','r','t','s','t','n','i',
0309  't','r','o','h','s','t','s','n','o','c'};
0310 int lex12[25]={ /* offset to lex11 */
0311    0,  6, 12, 20, 24, 30, 38, 42, 46, 53, 59, 65, 69, 75, 80, 86, 92, 96,
0312  100,104,112,117,123,126,131};
0313 int lex13[25]={ /* string length */
0314    6,  6,  8,  4,  6,  8,  4,  4,  7,  6,  6,  4,  6,  5,  6,  6,  4,  4,
0315    4,  8,  5,  6,  3,  5,  5};
0316 int lex14[26]={ /* offset to lex12 and lex13 */
0317    0,  0,  0,  1,  4,  8, 10, 12,  0,  0,  0,  0,  0, 13, 16,  0,  0, 18,
0318    0, 20,  0,  0,  0,  0,  0,  0};
0319 int lex15[26]={ /* number of entries */
0320    0,  0,  1,  3,  4,  2,  2,  1,  0,  0,  0,  0,  0,  3,  2,  0,  0,  2,
0321    0,  5,  0,  0,  0,  0,  0,  0};
0322note003
0323/** output of m18 **/
0324 int pars1[3230]={
0325       9,    11,    42,    45,    47,    51,    53,    55,    56,    60,
0326      62,    64,    65,    67,    68,    70,    72,    74,    75,    76,
0327      77,    78,    79,   161,   163,   194,   197,   199,   203,   205,
0328     207,   208,   212,   214,   216,   217,   219,   220,   222,   224,
0329     226,   227,   228,   229,   230,   231,   303,   313,   315,   330,
0330     364,   498,   501,   503,   507,   509,   511,   512,   518,   520,
0331     521,   523,   524,   526,   528,   530,   531,   532,   533,   534,
0332     535,   537,   617,   618,   619,   624,   634,   646,   650,   653,
0333     655,   659,   661,   663,   664,   668,   670,   672,   673,   675,
0334     676,   678,   680,   682,   683,   684,   685,   686,   687,   769,
0335     770,   771,   776,   786,   798,   802,   805,   807,   811,   813,
0336     815,   816,   820,   822,   824,   825,   827,   828,   830,   832,
0337     834,   835,   836,   837,   838,   839,   921,   922,   923,   928,
0338     938,   950,   954,   957,   959,   963,   965,   967,   968,   972,
0339     974,   976,   977,   979,   980,   982,   984,   986,   987,   988,
0340     989,   990,   991,  1073,  1124,  1225,  1226,  1232,  1241,  1242,
0341    1247,  1254,  1258,  1261,  1263,  1267,  1269,  1271,  1272,  1278,
0342    1280,  1281,  1283,  1284,  1286,  1288,  1290,  1291,  1292,  1293,
0343    1294,  1295,  1297,  1377,  1378,  1379,  1384,  1406,  1415,  1428,
0344    1447,  1529,  1531,  1580,  1732,  1753,  1884,  1905,  1992,  2002,
0345    2007,  2018,  2021,  2023,  2027,  2029,  2031,  2032,  2038,  2040,
0346    2041,  2043,  2044,  2046,  2048,  2050,  2051,  2052,  2053,  2054,
0347    2055,  2057,  2144,  2154,  2322,  2325,  2327,  2331,  2333,  2335,
0348    2336,  2342,  2344,  2345,  2347,  2348,  2350,  2352,  2354,  2355,
0349    2356,  2357,  2358,  2359,  2361,  2434,  2438,  2441,  2443,  2445,
0350    2446,  2449,  2450,  2458,  2474,  2475,  2476,  2477,  2478,  2479,
0351    2480,  2481,  2482,  2483,  2485,  2486,  2487,  2488,  2489,  2490,
0352    2491,  2492,  2493,  2494,  2495,  2496,  2497,  2498,  2499,  2500,
0353    2501,  2502,  2503,  2504,  2505,  2506,  2507,  2508,  2509,  2510,
0354    2511,  2512,  2513,  2517,  2518,  2593,  2595,  2610,  2644,  2745,
0355    2746,  2752,  2761,  2762,  2767,  2774,  2778,  2781,  2783,  2787,
0356    2789,  2791,  2792,  2798,  2800,  2801,  2803,  2804,  2806,  2808,
0357    2810,  2811,  2812,  2813,  2814,  2815,  2817,  2890,  2894,  2897,
0358    2899,  2901,  2902,  2905,  2906,  2927,  2934,  2942,  2945,  2948,
0359    2951,  2957,  2959,  2974,  3050,  3082,  3085,  3087,  3091,  3093,
0360    3095,  3096,  3100,  3102,  3104,  3105,  3107,  3108,  3110,  3112,
0361    3114,  3115,  3116,  3117,  3118,  3119,  3201,  3202,  3203,  3208,
0362    3230,  3239,  3252,  3271,  3354,  3505,  3506,  3507,  3512,  3521,
0363    3522,  3534,  3538,  3541,  3543,  3547,  3549,  3551,  3552,  3556,
0364    3558,  3560,  3561,  3563,  3564,  3566,  3568,  3570,  3571,  3572,
0365    3573,  3574,  3575,  3577,  3693,  3695,  3699,  3701,  3704,  3710,
0366    3712,  3715,  3716,  3720,  3723,  3724,  3725,  3726,  3727,  3809,
0367    3810,  3811,  3816,  3825,  3826,  3838,  3842,  3845,  3847,  3851,
0368    3853,  3855,  3856,  3860,  3862,  3864,  3865,  3867,  3868,  3870,
0369    3872,  3874,  3875,  3876,  3877,  3878,  3879,  3881,  4012,  4146,
0370    4149,  4151,  4155,  4157,  4159,  4160,  4166,  4168,  4169,  4171,
0371    4172,  4174,  4176,  4178,  4179,  4180,  4181,  4182,  4183,  4185,
0372    4258,  4262,  4265,  4267,  4269,  4270,  4273,  4274,  4302,  4310,
0373    4313,  4316,  4319,  4325,  4327,  4337,  4342,  4417,  4419,  4468,
0374    4562,  4566,  4569,  4571,  4573,  4574,  4577,  4578,  4586,  4602,
0375    4603,  4604,  4605,  4606,  4607,  4608,  4609,  4610,  4611,  4613,
0376    4614,  4615,  4616,  4617,  4618,  4619,  4620,  4621,  4622,  4623,
0377    4624,  4625,  4626,  4627,  4628,  4629,  4630,  4631,  4632,  4633,
0378    4634,  4635,  4636,  4637,  4638,  4639,  4640,  4641,  4645,  4646,
0379    4714,  4718,  4721,  4723,  4725,  4726,  4729,  4730,  4738,  4755,
0380    4756,  4758,  4760,  4761,  4762,  4766,  4769,  4770,  4771,  4772,
0381    4773,  4775,  4778,  4781,  4783,  4785,  4792,  4793,  4797,  4798,
0382    4866,  4867,  4868,  4869,  4870,  4871,  4872,  4873,  4874,  4875,
0383    4876,  4877,  4878,  4879,  4880,  4881,  4882,  4883,  4884,  4885,
0384    4887,  4888,  4889,  4890,  4891,  4892,  4893,  4894,  4895,  4896,
0385    4897,  4898,  4899,  4900,  4901,  4902,  4903,  4904,  4905,  4910,
0386    4918,  4921,  4924,  4927,  4933,  4935,  4946,  4947,  4948,  4949,
0387    4950,  5018,  5022,  5025,  5027,  5029,  5030,  5033,  5034,  5062,
0388    5070,  5073,  5076,  5079,  5085,  5087,  5102,  5193,  5336,  5346,
0389    5481,  5633,  5785,  5930,  5934,  5937,  5939,  5941,  5942,  5945,
0390    5946,  5954,  5971,  5972,  5974,  5976,  5977,  5978,  5982,  5985,
0391    5986,  5987,  5988,  5989,  5991,  5994,  5997,  5999,  6001,  6008,
0392    6009,  6014,  6089,  6292,  6410,  6562,  6690,  6694,  6697,  6699,
0393    6701,  6702,  6705,  6706,  6714,  6734,  6742,  6745,  6748,  6751,
0394    6757,  6759,  6774,  6842,  6843,  6844,  6845,  6846,  6847,  6848,
0395    6849,  6850,  6851,  6852,  6853,  6854,  6855,  6856,  6857,  6858,
0396    6859,  6863,  6864,  6865,  6866,  6867,  6868,  6869,  6870,  6871,
0397    6872,  6873,  6874,  6875,  6876,  6877,  6879,  6880,  6881,  6886,
0398    6894,  6897,  6900,  6903,  6909,  6911,  6922,  6923,  6924,  6925,
0399    6926,  6994,  6998,  7001,  7002,  7003,  7005,  7006,  7008,  7009,
0400    7010,  7017,  7018,  7029,  7031,  7038,  7046,  7049,  7052,  7055,
0401    7061,  7063,  7076,  7077,  7078,  7146,  7147,  7148,  7149,  7150,
0402    7151,  7152,  7153,  7154,  7155,  7156,  7157,  7158,  7159,  7160,
0403    7161,  7162,  7163,  7164,  7165,  7167,  7168,  7169,  7170,  7171,
0404    7172,  7173,  7174,  7175,  7176,  7177,  7178,  7179,  7180,  7181,
0405    7182,  7183,  7184,  7185,  7190,  7198,  7201,  7204,  7207,  7213,
0406    7215,  7226,  7227,  7228,  7229,  7230,  7298,  7302,  7305,  7307,
0407    7309,  7310,  7313,  7314,  7342,  7350,  7353,  7356,  7359,  7365,
0408    7367,  7382,  7450,  7454,  7457,  7459,  7461,  7462,  7465,  7466,
0409    7494,  7502,  7505,  7508,  7511,  7517,  7519,  7534,  7602,  7606,
0410    7609,  7611,  7613,  7614,  7617,  7618,  7646,  7654,  7657,  7660,
0411    7663,  7669,  7671,  7686,  7754,  7758,  7761,  7763,  7765,  7766,
0412    7769,  7770,  7798,  7806,  7809,  7812,  7815,  7821,  7823,  7838,
0413    7906,  7910,  7911,  7913,  7914,  7915,  7917,  7918,  7920,  7921,
0414    7922,  7929,  7930,  7941,  7943,  7950,  7958,  7961,  7964,  7967,
0415    7973,  7975,  7988,  7989,  7990,  8058,  8062,  8063,  8065,  8066,
0416    8067,  8069,  8070,  8072,  8073,  8074,  8081,  8082,  8093,  8095,
0417    8102,  8110,  8113,  8116,  8119,  8125,  8127,  8138,  8140,  8141,
0418    8142,  8210,  8214,  8217,  8219,  8221,  8222,  8225,  8226,  8253,
0419    8254,  8255,  8259,  8261,  8262,  8264,  8265,  8268,  8270,  8271,
0420    8272,  8275,  8276,  8277,  8279,  8280,  8283,  8284,  8285,  8286,
0421    8287,  8294,  8362,  8366,  8367,  8369,  8370,  8371,  8373,  8374,
0422    8376,  8377,  8378,  8385,  8386,  8397,  8399,  8400,  8406,  8414,
0423    8417,  8420,  8423,  8429,  8431,  8442,  8444,  8445,  8446,  8514,
0424    8518,  8519,  8521,  8522,  8523,  8525,  8526,  8528,  8529,  8530,
0425    8537,  8538,  8549,  8551,  8552,  8558,  8566,  8569,  8572,  8575,
0426    8581,  8583,  8594,  8596,  8597,  8598,  8666,  8667,  8670,  8671,
0427    8673,  8674,  8675,  8677,  8678,  8680,  8681,  8682,  8689,  8690,
0428    8696,  8701,  8703,  8704,  8710,  8718,  8721,  8724,  8727,  8733,
0429    8735,  8746,  8748,  8749,  8750,  8818,  8819,  8822,  8823,  8825,
0430    8826,  8827,  8829,  8830,  8832,  8833,  8834,  8841,  8842,  8843,
0431    8846,  8848,  8849,  8850,  8853,  8855,  8856,  8862,  8870,  8873,
0432    8876,  8879,  8885,  8887,  8898,  8900,  8901,  8902,  8970,  8971,
0433    8974,  8975,  8977,  8978,  8979,  8981,  8982,  8984,  8985,  8986,
0434    8993,  8994,  8995,  8996,  8998,  9000,  9001,  9002,  9003,  9005,
0435    9007,  9008,  9014,  9022,  9025,  9028,  9031,  9037,  9039,  9050,
0436    9052,  9053,  9054,  9122,  9123,  9126,  9127,  9129,  9130,  9131,
0437    9133,  9134,  9136,  9137,  9138,  9145,  9146,  9147,  9148,  9150,
0438    9152,  9153,  9154,  9155,  9157,  9159,  9160,  9166,  9174,  9177,
0439    9180,  9183,  9189,  9191,  9202,  9204,  9205,  9206,  9274,  9275,
0440    9276,  9278,  9279,  9281,  9282,  9283,  9285,  9286,  9288,  9289,
0441    9290,  9295,  9297,  9298,  9299,  9300,  9302,  9304,  9305,  9306,
0442    9307,  9309,  9311,  9312,  9318,  9326,  9329,  9332,  9335,  9341,
0443    9343,  9354,  9356,  9357,  9358,  9440,  9450,  9455,  9615,  9730,
0444    9734,  9737,  9739,  9741,  9742,  9745,  9746,  9773,  9774,  9775,
0445    9779,  9781,  9782,  9784,  9785,  9788,  9790,  9791,  9792,  9795,
0446    9796,  9797,  9799,  9800,  9803,  9804,  9805,  9806,  9807,  9814,
0447    9890, 10042, 10048, 10194, 10200, 10345, 10346, 10347, 10352, 10374,
0448   10396, 10533, 10535, 10539, 10541, 10544, 10550, 10552, 10555, 10556,
0449   10560, 10563, 10564, 10565, 10566, 10567, 10685, 10687, 10691, 10693,
0450   10696, 10702, 10704, 10707, 10708, 10712, 10715, 10716, 10717, 10718,
0451   10719, 10725, 10801, 10803, 10817, 10852, 10953, 10954, 10955, 10969,
0452   10982, 10989, 10991, 10995, 10997, 11000, 11004, 11006, 11008, 11011,
0453   11012, 11016, 11019, 11020, 11021, 11022, 11023, 11105, 11106, 11107,
0454   11121, 11134, 11141, 11143, 11147, 11149, 11152, 11156, 11158, 11160,
0455   11163, 11164, 11168, 11171, 11172, 11173, 11174, 11175, 11308, 11416,
0456   11485, 11568, 11583, 11637, 11706, 11710, 11713, 11715, 11717, 11718,
0457   11721, 11722, 11750, 11758, 11761, 11764, 11767, 11773, 11775, 11785,
0458   11790, 11858, 11862, 11865, 11867, 11869, 11870, 11873, 11874, 11882,
0459   11899, 11900, 11902, 11904, 11905, 11906, 11910, 11913, 11914, 11915,
0460   11916, 11917, 11919, 11922, 11925, 11927, 11929, 11936, 11937, 11941,
0461   11942, 12010, 12014, 12017, 12019, 12021, 12022, 12025, 12026, 12034,
0462   12051, 12052, 12054, 12056, 12057, 12058, 12062, 12065, 12066, 12067,
0463   12068, 12069, 12071, 12074, 12077, 12079, 12081, 12088, 12089, 12094,
0464   12185, 12314, 12318, 12321, 12323, 12325, 12326, 12329, 12330, 12338,
0465   12355, 12356, 12358, 12360, 12361, 12362, 12366, 12369, 12370, 12371,
0466   12372, 12373, 12375, 12378, 12381, 12383, 12385, 12392, 12393, 12398,
0467   12466, 12470, 12473, 12475, 12477, 12478, 12481, 12482, 12510, 12518,
0468   12521, 12524, 12527, 12533, 12535, 12550, 12618, 12622, 12625, 12627,
0469   12629, 12630, 12633, 12634, 12662, 12670, 12673, 12676, 12679, 12685,
0470   12687, 12702, 12770, 12774, 12777, 12779, 12781, 12782, 12785, 12786,
0471   12814, 12822, 12825, 12828, 12831, 12837, 12839, 12854, 12922, 12926,
0472   12929, 12931, 12933, 12934, 12937, 12938, 12966, 12974, 12977, 12980,
0473   12983, 12989, 12991, 13006, 13152, 13226, 13230, 13233, 13235, 13237,
0474   13238, 13241, 13242, 13250, 13270, 13278, 13281, 13284, 13287, 13293,
0475   13295, 13310, 13402, 13544, 13554, 13682, 13686, 13689, 13691, 13693,
0476   13694, 13697, 13698, 13726, 13734, 13737, 13740, 13743, 13749, 13751,
0477   13766, 13834, 13838, 13841, 13843, 13845, 13846, 13849, 13850, 13878,
0478   13886, 13889, 13892, 13895, 13901, 13903, 13918, 13986, 13990, 13993,
0479   13995, 13997, 13998, 14001, 14002, 14030, 14038, 14041, 14044, 14047,
0480   14053, 14055, 14070, 14138, 14142, 14145, 14147, 14149, 14150, 14153,
0481   14154, 14182, 14190, 14193, 14196, 14199, 14205, 14207, 14222, 14290,
0482   14294, 14297, 14298, 14299, 14301, 14302, 14305, 14306, 14334, 14342,
0483   14345, 14348, 14351, 14357, 14359, 14374, 14500, 14652, 14746, 14750,
0484   14753, 14755, 14757, 14758, 14761, 14762, 14789, 14790, 14791, 14795,
0485   14797, 14798, 14800, 14801, 14804, 14806, 14807, 14808, 14811, 14812,
0486   14813, 14815, 14816, 14819, 14820, 14821, 14822, 14823, 14830, 14898,
0487   14902, 14905, 14907, 14909, 14910, 14913, 14914, 14942, 14950, 14953,
0488   14956, 14959, 14965, 14967, 14982, 15050, 15054, 15057, 15059, 15061,
0489   15062, 15065, 15066, 15094, 15102, 15105, 15108, 15111, 15117, 15119,
0490   15134, 15210, 15216, 15362, 15513, 15514, 15515, 15542, 15658, 15662,
0491   15665, 15667, 15669, 15670, 15673, 15674, 15702, 15710, 15713, 15716,
0492   15719, 15725, 15727, 15742, 15810, 15814, 15817, 15819, 15821, 15822,
0493   15825, 15826, 15854, 15862, 15865, 15868, 15871, 15877, 15879, 15894,
0494   15962, 15966, 15969, 15971, 15973, 15974, 15977, 15978, 16006, 16014,
0495   16017, 16020, 16023, 16029, 16031, 16046, 16114, 16118, 16121, 16123,
0496   16125, 16126, 16129, 16130, 16158, 16166, 16169, 16172, 16175, 16181,
0497   16183, 16198, 16266, 16270, 16273, 16275, 16277, 16278, 16281, 16282,
0498   16310, 16318, 16321, 16324, 16327, 16333, 16335, 16350, 16418, 16422,
0499   16425, 16427, 16429, 16430, 16433, 16434, 16462, 16470, 16473, 16476,
0500   16479, 16485, 16487, 16502, 16570, 16574, 16577, 16579, 16581, 16582,
0501   16585, 16586, 16614, 16622, 16625, 16628, 16631, 16637, 16639, 16654,
0502   16722, 16726, 16729, 16731, 16733, 16734, 16737, 16738, 16766, 16774,
0503   16777, 16780, 16783, 16789, 16791, 16806, 16874, 16878, 16881, 16883,
0504   16885, 16886, 16889, 16890, 16918, 16926, 16929, 16932, 16935, 16941,
0505   16943, 16958, 17026, 17030, 17033, 17035, 17037, 17038, 17041, 17042,
0506   17070, 17078, 17081, 17084, 17087, 17093, 17095, 17110, 17178, 17182,
0507   17185, 17187, 17189, 17190, 17193, 17194, 17222, 17230, 17233, 17236,
0508   17239, 17245, 17247, 17262, 17330, 17334, 17337, 17339, 17341, 17342,
0509   17345, 17346, 17374, 17382, 17385, 17388, 17391, 17397, 17399, 17414,
0510   17482, 17486, 17489, 17491, 17493, 17494, 17497, 17498, 17526, 17534,
0511   17537, 17540, 17543, 17549, 17551, 17566, 17634, 17638, 17641, 17643,
0512   17645, 17646, 17649, 17650, 17678, 17686, 17689, 17692, 17695, 17701,
0513   17703, 17718, 17786, 17790, 17793, 17795, 17797, 17798, 17801, 17802,
0514   17830, 17838, 17841, 17844, 17847, 17853, 17855, 17870, 17996, 18110,
0515   18130, 18133, 18135, 18139, 18141, 18143, 18144, 18150, 18152, 18153,
0516   18155, 18156, 18158, 18160, 18162, 18163, 18164, 18165, 18166, 18167,
0517   18249, 18250, 18256, 18278, 18300, 18401, 18402, 18408, 18430, 18553,
0518   18554, 18555, 18582, 18586, 18589, 18591, 18595, 18597, 18599, 18600,
0519   18604, 18606, 18608, 18609, 18611, 18612, 18614, 18616, 18618, 18619,
0520   18620, 18621, 18622, 18623, 18698, 18702, 18705, 18707, 18709, 18710,
0521   18713, 18714, 18735, 18742, 18750, 18753, 18756, 18759, 18765, 18767,
0522   18782, 18893, 18895, 18899, 18901, 18904, 18910, 18912, 18915, 18916,
0523   18920, 18923, 18924, 18925, 18926, 18927, 18933, 19016, 19026, 19168,
0524   19177, 19178, 19306, 19310, 19313, 19315, 19317, 19318, 19321, 19322,
0525   19350, 19358, 19361, 19364, 19367, 19373, 19375, 19390, 19472, 19541,
0526   19668, 19762, 19766, 19769, 19771, 19773, 19774, 19777, 19778, 19806,
0527   19814, 19817, 19820, 19823, 19829, 19831, 19846, 19928, 19997, 20066,
0528   20070, 20073, 20075, 20077, 20078, 20081, 20082, 20090, 20107, 20108,
0529   20110, 20112, 20113, 20114, 20118, 20121, 20122, 20123, 20124, 20125,
0530   20127, 20130, 20133, 20135, 20137, 20144, 20145, 20150, 20226, 20232,
0531   20378, 20384, 20530, 20536, 20681, 20840, 20850, 20978, 20982, 20985,
0532   20987, 20989, 20990, 20993, 20994, 21002, 21022, 21030, 21033, 21036,
0533   21039, 21045, 21047, 21062, 21130, 21134, 21137, 21139, 21141, 21142,
0534   21144, 21145, 21146, 21174, 21182, 21185, 21188, 21191, 21197, 21199,
0535   21214, 21282, 21286, 21287, 21289, 21290, 21291, 21293, 21294, 21296,
0536   21297, 21298, 21305, 21306, 21317, 21319, 21326, 21334, 21337, 21340,
0537   21343, 21349, 21351, 21364, 21365, 21366, 21448, 21471, 21594, 21600,
0538   21746, 21890, 21894, 21895, 21897, 21898, 21899, 21901, 21902, 21904,
0539   21905, 21906, 21913, 21914, 21925, 21927, 21934, 21942, 21945, 21948,
0540   21951, 21957, 21959, 21970, 21972, 21973, 21974, 22042, 22046, 22047,
0541   22049, 22050, 22051, 22053, 22054, 22056, 22057, 22058, 22065, 22066,
0542   22077, 22079, 22080, 22086, 22094, 22097, 22100, 22103, 22109, 22111,
0543   22122, 22124, 22125, 22126, 22194, 22198, 22201, 22203, 22205, 22206,
0544   22209, 22210, 22238, 22246, 22249, 22252, 22255, 22261, 22263, 22278,
0545   22353, 22354, 22360, 22382, 22505, 22506, 22507, 22534, 22538, 22541,
0546   22543, 22547, 22549, 22551, 22552, 22558, 22560, 22561, 22563, 22564,
0547   22566, 22568, 22570, 22571, 22572, 22573, 22574, 22575, 22650, 22654,
0548   22655, 22657, 22658, 22659, 22661, 22662, 22664, 22665, 22666, 22673,
0549   22674, 22685, 22687, 22688, 22694, 22702, 22705, 22708, 22711, 22717,
0550   22719, 22730, 22732, 22733, 22734, 22802, 22803, 22806, 22807, 22809,
0551   22810, 22811, 22813, 22814, 22816, 22817, 22818, 22825, 22826, 22832,
0552   22837, 22839, 22840, 22846, 22854, 22857, 22860, 22863, 22869, 22871,
0553   22882, 22884, 22885, 22886, 22954, 22955, 22958, 22959, 22961, 22962,
0554   22963, 22965, 22966, 22968, 22969, 22970, 22977, 22978, 22979, 22982,
0555   22984, 22985, 22986, 22989, 22991, 22992, 22998, 23006, 23009, 23012,
0556   23015, 23021, 23023, 23034, 23036, 23037, 23038, 23106, 23107, 23110,
0557   23111, 23113, 23114, 23115, 23117, 23118, 23120, 23121, 23122, 23129,
0558   23130, 23131, 23134, 23136, 23137, 23138, 23141, 23143, 23144, 23150,
0559   23158, 23161, 23164, 23167, 23173, 23175, 23186, 23188, 23189, 23190,
0560   23258, 23259, 23262, 23263, 23265, 23266, 23267, 23269, 23270, 23272,
0561   23273, 23274, 23281, 23282, 23283, 23284, 23286, 23288, 23289, 23290,
0562   23291, 23293, 23295, 23296, 23302, 23310, 23313, 23316, 23319, 23325,
0563   23327, 23338, 23340, 23341, 23342, 23410, 23411, 23414, 23415, 23417,
0564   23418, 23419, 23421, 23422, 23424, 23425, 23426, 23433, 23434, 23435,
0565   23436, 23438, 23440, 23441, 23442, 23443, 23445, 23447, 23448, 23454,
0566   23462, 23465, 23468, 23471, 23477, 23479, 23490, 23492, 23493, 23494,
0567   23562, 23563, 23566, 23567, 23569, 23570, 23571, 23573, 23574, 23576,
0568   23577, 23578, 23585, 23586, 23587, 23588, 23590, 23592, 23593, 23594,
0569   23595, 23597, 23599, 23600, 23606, 23614, 23617, 23620, 23623, 23629,
0570   23631, 23642, 23644, 23645, 23646, 23714, 23715, 23718, 23719, 23721,
0571   23722, 23723, 23725, 23726, 23728, 23729, 23730, 23737, 23738, 23739,
0572   23740, 23742, 23744, 23745, 23746, 23747, 23749, 23751, 23752, 23758,
0573   23766, 23769, 23772, 23775, 23781, 23783, 23794, 23796, 23797, 23798,
0574   23866, 23867, 23870, 23871, 23873, 23874, 23875, 23877, 23878, 23880,
0575   23881, 23882, 23889, 23890, 23891, 23892, 23894, 23896, 23897, 23898,
0576   23899, 23901, 23903, 23904, 23910, 23918, 23921, 23924, 23927, 23933,
0577   23935, 23946, 23948, 23949, 23950, 24018, 24019, 24022, 24023, 24025,
0578   24026, 24027, 24029, 24030, 24032, 24033, 24034, 24041, 24042, 24043,
0579   24044, 24046, 24048, 24049, 24050, 24051, 24053, 24055, 24056, 24062,
0580   24070, 24073, 24076, 24079, 24085, 24087, 24098, 24100, 24101, 24102,
0581   24170, 24171, 24172, 24174, 24175, 24177, 24178, 24179, 24181, 24182,
0582   24184, 24185, 24186, 24191, 24193, 24194, 24195, 24196, 24198, 24200,
0583   24201, 24202, 24203, 24205, 24207, 24208, 24214, 24222, 24225, 24228,
0584   24231, 24237, 24239, 24250, 24252, 24253, 24254, 24322, 24323, 24324,
0585   24326, 24327, 24329, 24330, 24331, 24333, 24334, 24336, 24337, 24338,
0586   24343, 24345, 24346, 24347, 24348, 24350, 24352, 24353, 24354, 24355,
0587   24357, 24359, 24360, 24366, 24374, 24377, 24380, 24383, 24389, 24391,
0588   24402, 24404, 24405, 24406, 24481, 24482, 24488, 24510, 24626, 24630,
0589   24633, 24635, 24637, 24638, 24641, 24642, 24663, 24670, 24678, 24681,
0590   24684, 24687, 24693, 24695, 24710, 24786, 24818, 24821, 24823, 24827,
0591   24829, 24831, 24832, 24838, 24840, 24841, 24843, 24844, 24846, 24848,
0592   24850, 24851, 24852, 24853, 24854, 24855, 24938, 25090, 25271, 25393,
0593   25395, 25409, 25444, 25538, 25542, 25545, 25547, 25549, 25550, 25553,
0594   25554, 25582, 25590, 25593, 25596, 25599, 25605, 25607, 25622, 25690,
0595   25694, 25697, 25699, 25701, 25702, 25705, 25706, 25734, 25742, 25745,
0596   25748, 25751, 25757, 25759, 25769, 25773, 25774, 25842, 25846, 25849,
0597   25851, 25853, 25854, 25857, 25858, 25866, 25883, 25884, 25886, 25888,
0598   25889, 25890, 25894, 25897, 25898, 25899, 25900, 25901, 25903, 25906,
0599   25909, 25911, 25913, 25920, 25921, 25926, 25994, 25998, 26001, 26003,
0600   26005, 26006, 26009, 26010, 26018, 26035, 26036, 26038, 26040, 26041,
0601   26042, 26046, 26049, 26050, 26051, 26052, 26053, 26055, 26058, 26061,
0602   26063, 26065, 26072, 26073, 26078, 26146, 26150, 26153, 26155, 26157,
0603   26158, 26161, 26162, 26170, 26187, 26188, 26190, 26192, 26193, 26194,
0604   26198, 26201, 26202, 26203, 26204, 26205, 26207, 26210, 26213, 26215,
0605   26217, 26224, 26225, 26230, 26298, 26302, 26305, 26307, 26309, 26310,
0606   26313, 26314, 26342, 26350, 26353, 26356, 26359, 26365, 26367, 26382,
0607   26450, 26454, 26457, 26459, 26461, 26462, 26465, 26466, 26474, 26494,
0608   26502, 26505, 26508, 26511, 26517, 26519, 26534, 26616, 26626, 26754,
0609   26758, 26761, 26762, 26763, 26765, 26766, 26769, 26770, 26798, 26806,
0610   26809, 26812, 26815, 26821, 26823, 26838, 26906, 26910, 26913, 26915,
0611   26917, 26918, 26921, 26922, 26950, 26958, 26961, 26964, 26967, 26973,
0612   26975, 26990, 27095, 27218, 27362, 27366, 27369, 27371, 27373, 27374,
0613   27377, 27378, 27386, 27403, 27404, 27406, 27408, 27409, 27410, 27412,
0614   27414, 27417, 27418, 27419, 27420, 27421, 27423, 27426, 27429, 27431,
0615   27433, 27440, 27441, 27445, 27446, 27522, 27528, 27680, 27690, 27818,
0616   27822, 27825, 27826, 27827, 27829, 27830, 27833, 27834, 27862, 27870,
0617   27873, 27876, 27879, 27885, 27887, 27902, 27970, 27974, 27977, 27978,
0618   27979, 27981, 27982, 27985, 27986, 28014, 28022, 28025, 28028, 28031,
0619   28037, 28039, 28054, 28130, 28136, 28274, 28278, 28281, 28283, 28285,
0620   28286, 28289, 28290, 28298, 28315, 28316, 28318, 28320, 28321, 28322,
0621   28326, 28329, 28330, 28331, 28332, 28333, 28335, 28338, 28341, 28343,
0622   28345, 28352, 28353, 28358, 28426, 28430, 28433, 28435, 28437, 28438,
0623   28441, 28442, 28450, 28467, 28468, 28470, 28472, 28473, 28474, 28478,
0624   28481, 28482, 28483, 28484, 28485, 28487, 28490, 28493, 28495, 28497,
0625   28504, 28505, 28510, 28602, 28730, 28734, 28737, 28738, 28739, 28741,
0626   28742, 28745, 28746, 28774, 28782, 28785, 28788, 28791, 28797, 28799,
0627   28814, 28890, 28896, 29034, 29038, 29041, 29043, 29045, 29046, 29049,
0628   29050, 29058, 29075, 29076, 29078, 29080, 29081, 29082, 29086, 29089,
0629   29090, 29091, 29092, 29093, 29095, 29098, 29101, 29103, 29105, 29112,
0630   29113, 29118, 29194, 29200, 29338, 29342, 29345, 29347, 29349, 29350,
0631   29353, 29354, 29362, 29379, 29380, 29382, 29384, 29385, 29386, 29390,
0632   29393, 29394, 29395, 29396, 29397, 29399, 29402, 29405, 29407, 29409,
0633   29416, 29417, 29422, 29490, 29494, 29497, 29499, 29501, 29502, 29505,
0634   29506, 29514, 29531, 29532, 29534, 29536, 29537, 29538, 29542, 29545,
0635   29546, 29547, 29548, 29549, 29551, 29554, 29557, 29559, 29561, 29568,
0636   29569, 29574, 29650, 29656, 29794, 29798, 29801, 29803, 29805, 29806,
0637   29809, 29810, 29818, 29835, 29836, 29838, 29840, 29841, 29842, 29846,
0638   29849, 29850, 29851, 29852, 29853, 29855, 29858, 29861, 29863, 29865,
0639   29872, 29873, 29878, 29946, 29950, 29953, 29955, 29957, 29958, 29961,
0640   29962, 29970, 29987, 29988, 29990, 29992, 29993, 29994, 29998, 30001,
0641   30002, 30003, 30004, 30005, 30007, 30010, 30013, 30015, 30017, 30024,
0642   30025, 30030, 30098, 30102, 30105, 30107, 30109, 30110, 30113, 30114,
0643   30122, 30139, 30140, 30142, 30144, 30145, 30146, 30150, 30153, 30154,
0644   30155, 30156, 30157, 30159, 30162, 30165, 30167, 30169, 30176, 30177,
0645   30182, 30250, 30254, 30257, 30259, 30261, 30262, 30265, 30266, 30274,
0646   30291, 30292, 30294, 30296, 30297, 30298, 30302, 30305, 30306, 30307,
0647   30308, 30309, 30311, 30314, 30317, 30319, 30321, 30328, 30329, 30334};
0648 int pars2[3230]={
0649    40,  36, 812, 836, 880, 856,  48, 824, 852, 888, 844, 848,
0650   816, 840, 860, 820, 892, 828, 876, 896, 864, 832, 884,  40,
0651    36, 812, 836, 880, 856,  48, 824, 852, 888, 844, 848, 816,
0652   840, 860, 820, 892, 828, 876, 896, 864, 832, 884,   7,  40, // changed manually from 6 to 7
0653    36, 904, 888, 812, 836, 880, 856,  48, 824, 852, 844, 848,
0654   816, 840, 860, 820, 892, 828, 876, 896, 864, 832, 884,  64,
0655    62,  62,  62,  62,  62,  62, 812, 836, 880, 856,  48, 824,
0656   852,  62, 844, 848, 816, 840, 860, 820, 892, 828, 876, 896,
0657   864, 832, 884,  70,  70,  70,  70,  70,  70, 812, 836, 880,
0658   856,  48, 824, 852,  70, 844, 848, 816, 840, 860, 820, 892,
0659   828, 876, 896, 864, 832, 884,  78,  78,  78,  78,  78,  78,
0660   812, 836, 880, 856,  48, 824, 852,  78, 844, 848, 816, 840,
0661   860, 820, 892, 828, 876, 896, 864, 832, 884,  40, 888,  80,
0662   274, 274, 274, 274, 274,  76, 274, 274, 274, 274, 274, 274,
0663   274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
0664   274, 274, 274, 310, 310,  36, 310, 310, 880, 310, 884,  40,
0665    36, 888,  92,  96, 100, 104, 194, 194, 112, 812, 836, 880,
0666   856,  48, 824, 852, 844, 848, 816, 840, 860, 820, 892, 828,
0667   876, 896, 864, 832, 884,  64, 116, 944, 812, 836, 880, 856,
0668    48, 824, 852, 844, 848, 816, 840, 860, 820, 892, 828, 876,
0669   896, 864, 832, 884,  64,1024,1004, 216,1008,1012, 192,1016,
0670   196, 988, 812, 172, 132, 836,1040, 880, 168, 136, 156, 856,
0671    48,1048, 824, 852,1044, 160, 164, 128, 144, 844,1036, 848,
0672   816, 176, 840, 860, 204, 820,1032, 892, 148, 828, 876, 896,
0673   864, 832, 884, 152,  64, 956,1020,  40,  36, 904, 888,  80,
0674   270, 270, 270, 270, 270,  76, 270, 270, 270, 270, 270, 270,
0675   270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
0676   270, 270, 270,1024,1004, 256,1008,1012, 192,1016, 196,1056,
0677  1040,1048,1044,1068,1036, 204,1032,1020,1072, 812, 836, 880,
0678   856,  48, 824, 852,1076, 844, 848, 816, 840, 860, 820, 892,
0679   828, 876, 896, 864, 832, 884, 306, 306,  36, 306, 306, 880,
0680   306, 884,1092, 166, 166, 166, 166, 166, 166, 166, 166, 166,
0681   166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
0682   166, 166, 166, 166, 166, 166, 166, 276, 836, 880, 856,  48,
0683   852, 844, 848, 840, 860, 892, 876, 896, 864, 832, 884, 250,
0684   250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
0685   250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
0686   250, 250, 250, 296, 304, 812, 836, 880, 856,  48, 824, 852,
0687   844, 848, 816, 840, 860, 820, 892, 828, 876, 896, 864, 832,
0688   884,  64,1024,1004, 216,1008,1012, 192,1016, 196,1040,1048,
0689  1044,1068,1036, 204,1032, 308,1020,  40,  36, 888,1024,1004,
0690   216,1008,1012, 192,1016, 196, 988, 812, 172, 132, 836,1040,
0691   880, 168, 136, 156, 856,  48,1048, 824, 852,1044, 160, 164,
0692   128, 144, 844,1036, 848, 816, 176, 840, 860, 204, 820,1032,
0693   892, 148, 828, 876, 896, 864, 832, 884, 152,  64,1120,1020,
0694  1024,1004, 216,1008,1012, 192,1016, 196, 988, 172, 132,1040,
0695   168, 136, 156,1048,1044, 160, 164, 128, 144,1036, 176, 204,
0696  1032, 148, 152,  64,1124,1020, 854, 854, 854, 854, 854, 854,
0697   854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854,
0698   854, 854, 854, 854, 316, 854, 854, 854, 854, 854, 854, 854,
0699   854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854,
0700   854, 854, 854, 854, 854, 854, 854, 854, 854,1024,1004, 256,
0701  1008,1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,1032,
0702  1020, 324, 328,1132, 332, 336, 340,1024,1004, 216,1008,1012,
0703   192,1016, 196, 988, 172, 132,1040, 168, 136, 156,1048,1044,
0704   160, 164, 128, 144,1036, 176, 204,1032, 148, 152,  64,1020,
0705   348, 352,1136,1140,1024,1004, 216,1008,1012, 192,1016, 196,
0706  1144,1040,1048,1044,1068,1036, 204,1032,1020, 766, 766, 766,
0707  1160, 766, 766,1180, 766, 766, 766,1152, 766, 766,1164, 766,
0708   766, 766,1168, 766,1156, 766, 766, 766, 766,1172, 766,1148,
0709   766, 766, 766, 766,1176, 766, 766, 766,1184, 766, 766, 766,
0710   766, 766, 766, 766, 766,1188, 766, 766, 766, 642, 642, 642,
0711   642, 642, 642, 642, 642, 642, 642, 642, 642, 364, 642, 642,
0712   642, 642, 642, 642, 642, 642, 368, 642, 642, 774, 774, 774,
0713   774, 774, 774, 774, 376, 774, 774, 774, 774,1192, 774, 774,
0714   774,1196, 774, 384, 380, 774, 774, 774, 774, 774, 774, 774,
0715   774, 774, 774, 774, 774, 774, 774, 774, 372, 774, 774, 774,
0716   774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, 774,
0717  1024,1004, 216,1008,1012, 192,1016, 196,1040,1048,1044,1068,
0718  1036, 204,1032,1020,1024,1004, 216,1008,1012, 192,1016, 196,
0719  1040,1048,1044,1068,1036, 204,1032,1020,1024,1004, 256,1008,
0720  1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,
0721  1024,1004, 388,1008,1012, 192,1016, 196,1040,1048,1044,1068,
0722  1036, 204,1032,1020, 654, 654, 392, 654, 654, 654, 654, 654,
0723   654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654,
0724   654, 654, 654, 654, 654, 662, 662, 662, 662, 662, 662, 662,
0725   662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662,
0726   662, 662, 662, 396, 662, 662, 662,1024,1004, 216,1008,1012,
0727   192,1016, 196, 836,1040, 880, 856,  48,1048, 852,1044,1068,
0728   844,1036, 848, 840, 860, 204,1032, 892, 876, 896, 864, 832,
0729   884,1020, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670,
0730   670, 670, 670, 670, 670, 412, 670, 670, 670, 670, 670, 670,
0731   670, 670, 670, 670, 670, 678, 416, 678, 678, 678, 678, 678,
0732   678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678,
0733   678, 678, 678, 678, 678, 678, 678, 678, 686, 424, 686, 686,
0734   686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 420, 686,
0735   686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
0736   686, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694,
0737   694, 694, 694, 428, 436, 694, 432, 440, 694, 694, 694, 694,
0738   694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 706, 706,
0739   706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
0740   706, 444, 706, 706, 706, 706, 448, 706, 706, 706, 706, 706,
0741   706, 706, 706, 706, 706, 706, 706, 706, 706, 726, 726, 726,
0742   726, 726, 726, 726, 452, 726, 726, 456, 726, 726, 726, 726,
0743   726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
0744   726, 726, 726, 726, 726, 726, 726, 726, 738, 738, 468, 738,
0745   738, 738, 738, 460, 738, 738, 738, 738, 738, 464, 738, 738,
0746   738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738,
0747   738, 738, 738, 738, 738, 738, 738, 738, 738, 194, 194, 112,
0748  1216,1024,1004, 216,1008,1012, 192,1016, 196, 836,1040, 880,
0749   856,  48,1048, 852,1044,1068, 844,1036, 848, 840, 860, 204,
0750  1032, 892, 876, 896, 864, 832, 884,1020,1220,1224, 472, 330,
0751   476, 488, 350,  36, 350, 492, 888, 836, 880, 856,  48, 852,
0752   844, 848, 840, 860, 892, 876, 896, 864, 832, 884, 836, 880,
0753   856,  48, 852, 844, 848, 840, 860, 892, 876, 896, 864, 832,
0754   884,1236,  40,  36, 508, 888, 210, 210, 210, 210, 210, 836,
0755   880, 856,  48, 852, 210, 844, 848, 840, 860, 892, 876, 896,
0756   864, 832, 884, 218, 218, 218, 218, 218, 836, 880, 856,  48,
0757   852, 218, 844, 848, 840, 860, 892, 876, 896, 864, 832, 884,
0758   304, 516,1256, 262, 520, 262,1024,1004, 216,1008,1012, 192,
0759  1016, 196,1040,1048,1044,1068,1036, 204,1032, 308,1020,1024,
0760  1004, 216,1008,1012, 192,1016, 196, 988, 172, 132,1040, 168,
0761   136, 156,1048,1044, 160, 164, 128, 144,1036, 176, 204,1032,
0762   148, 152,  64,1264,1020,1024,1004, 216,1008,1012, 192,1016,
0763   196, 988, 172, 132,1040, 168, 136, 156,1048,1044, 160, 164,
0764   128, 144,1036, 176, 204,1032, 148, 152,  64,1020, 528,1024,
0765  1004, 216,1008,1012, 192,1016, 196, 988, 172, 132,1040, 168,
0766   136, 156,1048,1044, 160, 164, 128, 144,1036, 176, 204,1032,
0767   148, 152,  64,1020,1024,1004, 216,1008,1012, 192,1016, 196,
0768  1040,1048,1044,1068,1036, 204,1032,1020,1024,1004, 216,1008,
0769  1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,
0770  1024,1004, 216,1008,1012, 192,1016, 196,1040,1048,1044,1068,
0771  1036, 204,1032,1020,1024,1004, 216,1008,1012, 192,1016, 196,
0772  1040,1048,1044,1068,1036, 204,1032,1020, 544,1024,1004, 216,
0773  1008,1012, 192,1016, 196, 552,1040,1048,1044,1068,1036, 204,
0774  1032,1020,1280, 328,1284,1024,1004, 216,1008,1012, 192,1016,
0775   196,1040,1048,1044,1068,1036, 204,1032,1020,1024,1004, 216,
0776  1008,1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,1032,
0777  1020,1024,1004, 256,1008,1012, 192,1016, 196,1040,1048,1044,
0778  1068,1036, 204,1032,1020,1024,1004, 216,1008,1012, 192,1016,
0779   196,1040,1048,1044,1068,1036, 204,1032,1020,1024,1004, 216,
0780  1292,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,
0781  1032,1020,1300,1304,1024,1004, 216,1008,1012, 192,1016, 196,
0782   836,1040, 880, 856,  48,1048, 852,1044,1068, 844,1036, 848,
0783   840, 860, 204,1032, 892, 876, 896, 864, 832, 884,1020,1024,
0784  1004, 256,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036,
0785   204,1032,1020,1024,1004, 256,1008,1012, 192,1016, 196,1040,
0786  1048,1044,1068,1036, 204,1032,1020,1308, 328, 584, 592, 390,
0787    36, 492,1024,1004, 256,1008,1012, 192,1016, 196,1040,1048,
0788  1044,1068,1036, 204,1032,1020,1024,1004, 256,1008,1012, 192,
0789  1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,1024,1004,
0790   256,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,
0791  1032,1020,1024,1004, 256,1008,1012, 192,1016, 196,1040,1048,
0792  1044,1068,1036, 204,1032,1020,1024,1004, 256,1008,1012, 192,
0793  1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,1024,1004,
0794   256,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,
0795  1032,1020,1024,1004, 256,1008,1012, 192,1016, 196,1040,1048,
0796  1044,1068,1036, 204,1032,1020,1024,1004, 256,1008,1012, 192,
0797  1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,1024,1004,
0798   256,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,
0799  1032,1020,1024,1004, 256,1008,1012, 192,1016, 196,1040,1048,
0800  1044,1068,1036, 204,1032,1020,1024,1004, 256,1008,1012, 192,
0801  1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,1024,1004,
0802   256,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,
0803  1032,1020,1024,1004, 256,1008,1012, 192,1016, 196,1040,1048,
0804  1044,1068,1036, 204,1032,1020,1024,1004, 256,1008,1012, 192,
0805  1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,1024,1004,
0806   256,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,
0807  1032,1020,1328,1332, 812, 836, 880, 856,  48, 824, 852, 844,
0808   848, 816, 840, 860, 820, 892, 828, 876, 896, 864, 832, 884,
0809   488, 394, 394, 492, 888, 652, 402, 402, 648, 488,1340,  36,
0810   492, 812, 836, 880, 856,  48, 824, 852, 888, 844, 848, 816,
0811   840, 860, 820, 892, 828, 876, 896, 864, 832, 884,1024,1004,
0812   256,1008,1012, 192,1016, 196,1344,1040,1048,1044,1068,1036,
0813   204,1032,1020, 836, 880, 856,  48, 852, 844, 848, 840, 860,
0814   892, 876, 896, 864, 832, 884,1348, 668,1352, 230, 672, 230,
0815  1024,1004, 256,1008,1012, 192,1016, 196,1040,1048,1044,1068,
0816  1036, 204,1032,1020, 516,1360, 304,1024,1004, 256,1008,1012,
0817   192,1016, 196,1040,1048,1044,1068,1036, 204,1032,1020, 676,
0818  1372,1024,1004, 216,1008,1012, 192,1016, 196, 988, 172, 132,
0819  1040, 168, 136, 156,1048,1044, 160, 164, 128, 144,1036, 176,
0820   204,1032, 148, 152,  64,1020, 680, 328, 684, 328, 688, 328,
0821   692, 328, 696,1024,1004, 216,1008,1012, 192,1016, 196, 704,
0822  1040,1048,1044,1068,1036, 204,1032,1020,1024,1004, 256,1008,
0823  1012, 192, 328,1016, 196,1040,1048,1044,1068,1036, 204,1032,
0824  1020, 658, 658, 392, 658, 658, 658, 658, 658, 658, 658, 658,
0825   658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658,
0826   658, 658, 328,1384,1388, 708,1392, 666, 666, 666, 666, 666,
0827   666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666,
0828   666, 666, 666, 666, 666, 396, 666, 666, 666, 674, 674, 674,
0829   674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674,
0830   412, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674,
0831  1024,1004, 256,1008,1012, 192,1016, 196,1040,1048,1044,1068,
0832  1036, 204,1032,1020, 592, 394, 394, 492, 592,1340,  36, 492,
0833   812, 836, 880, 856,  48, 824, 852, 844, 848, 816, 840, 860,
0834   820, 892, 828, 876, 896, 864, 832, 884, 682, 416, 682, 682,
0835   682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682,
0836   682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 690,
0837   424, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690,
0838   690, 420, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690,
0839   690, 690, 690, 690, 698, 698, 698, 698, 698, 698, 698, 698,
0840   698, 698, 698, 698, 698, 698, 428, 436, 698, 432, 440, 698,
0841   698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698,
0842   698, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702,
0843   702, 702, 702, 428, 436, 702, 432, 440, 702, 702, 702, 702,
0844   702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 710, 710,
0845   710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710,
0846   710, 444, 710, 710, 710, 710, 448, 710, 710, 710, 710, 710,
0847   710, 710, 710, 710, 710, 710, 710, 710, 710, 714, 714, 714,
0848   714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
0849   444, 714, 714, 714, 714, 448, 714, 714, 714, 714, 714, 714,
0850   714, 714, 714, 714, 714, 714, 714, 714, 718, 718, 718, 718,
0851   718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 444,
0852   718, 718, 718, 718, 448, 718, 718, 718, 718, 718, 718, 718,
0853   718, 718, 718, 718, 718, 718, 718, 722, 722, 722, 722, 722,
0854   722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 444, 722,
0855   722, 722, 722, 448, 722, 722, 722, 722, 722, 722, 722, 722,
0856   722, 722, 722, 722, 722, 722, 730, 730, 730, 730, 730, 730,
0857   730, 452, 730, 730, 456, 730, 730, 730, 730, 730, 730, 730,
0858   730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730,
0859   730, 730, 730, 730, 730, 734, 734, 734, 734, 734, 734, 734,
0860   452, 734, 734, 456, 734, 734, 734, 734, 734, 734, 734, 734,
0861   734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734,
0862   734, 734, 734, 734, 742, 742, 468, 742, 742, 742, 742, 460,
0863   742, 742, 742, 742, 742, 464, 742, 742, 742, 742, 742, 742,
0864   742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742,
0865   742, 742, 742, 742, 742, 746, 746, 468, 746, 746, 746, 746,
0866   460, 746, 746, 746, 746, 746, 464, 746, 746, 746, 746, 746,
0867   746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746,
0868   746, 746, 746, 746, 746, 746, 652, 398, 398, 648,1024,1004,
0869   256,1008,1012, 192,1016, 196,1400,1040,1048,1044,1068,1036,
0870   204,1032,1020,1404, 812, 836, 880, 856,  48, 824, 852, 844,
0871   848, 816, 840, 860, 820, 892, 828, 876, 896, 864, 832, 884,
0872  1408,1412,1416,  40,  36, 508, 888,1024,1004, 256,1008,1012,
0873   192,1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,1024,
0874  1004, 216,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036,
0875   204,1032, 308,1428,1020,1024,1004, 216,1008,1012, 192,1016,
0876   196, 988, 172, 132,1040, 168, 136, 156,1048,1044, 160, 164,
0877   128, 144,1036, 176, 204,1032, 148, 152,  64,1020,1024,1004,
0878   216,1008,1012, 192,1016, 196, 988, 172, 132,1040, 168, 136,
0879   156,1048,1044, 160, 164, 128, 144,1036, 176, 204,1032, 148,
0880   152,  64,1020,1024,1004, 216,1008,1012, 192,1016, 196, 988,
0881   172, 132,1040, 168, 136, 156,1048,1044, 160, 164, 128, 144,
0882  1036, 176, 204,1032, 148, 152,  64,1020,1024,1004, 216,1008,
0883  1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,
0884  1024,1004, 216,1008,1012, 192,1016, 196, 732,1040,1048,1044,
0885  1068,1036, 204,1032,1020, 328, 736,1024,1004, 216, 744,1008,
0886  1012, 192,1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,
0887  1024,1004, 216,1008,1012, 192,1016, 196,1040,1048,1044,1068,
0888  1036, 204,1032,1020,1448,1452, 510, 510, 510, 510, 510, 510,
0889   510, 510, 510, 510, 510, 510, 510, 510, 510, 748, 510, 510,
0890   510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
0891   510, 752, 328, 328, 756,1024,1004, 216, 764,1008,1012, 192,
0892  1016, 196,1040,1048,1044,1068,1036, 204,1032,1020,1024,1004,
0893   216, 772,1008,1012, 192,1016, 196,1040,1048,1044,1068,1036,
0894   204,1032,1020, 776, 328,1024,1004, 216,1008,1012, 192,1016,
0895   196, 988, 172, 132,1040, 168, 136, 156,1048,1044, 160, 164,
0896   128, 144,1036, 176, 204,1032, 148, 152,  64,1020,1024,1004,
0897   216,1008,1012, 192,1016, 196, 988, 172, 132,1040, 168, 136,
0898   156,1048,1044, 160, 164, 128, 144,1036, 176, 204,1032, 148,
0899   152,  64,1020,1464,1024,1004, 216, 784,1008,1012, 192,1016,
0900   196,1040,1048,1044,1068,1036, 204,1032,1020, 788, 328,1024,
0901  1004, 216,1008,1012, 192,1016, 196, 988, 172, 132,1040, 168,
0902   136, 156,1048,1044, 160, 164, 128, 144,1036, 176, 204,1032,
0903   148, 152,  64,1020, 792, 328,1024,1004, 216,1008,1012, 192,
0904  1016, 196, 988, 172, 132,1040, 168, 136, 156,1048,1044, 160,
0905   164, 128, 144,1036, 176, 204,1032, 148, 152,  64,1020,1024,
0906  1004, 216,1008,1012, 192,1016, 196, 988, 172, 132,1040, 168,
0907   136, 156,1048,1044, 160, 164, 128, 144,1036, 176, 204,1032,
0908   148, 152,  64,1020, 796, 328,1024,1004, 216,1008,1012, 192,
0909  1016, 196, 988, 172, 132,1040, 168, 136, 156,1048,1044, 160,
0910   164, 128, 144,1036, 176, 204,1032, 148, 152,  64,1020,1024,
0911  1004, 216,1008,1012, 192,1016, 196, 988, 172, 132,1040, 168,
0912   136, 156,1048,1044, 160, 164, 128, 144,1036, 176, 204,1032,
0913   148, 152,  64,1020,1024,1004, 216,1008,1012, 192,1016, 196,
0914   988, 172, 132,1040, 168, 136, 156,1048,1044, 160, 164, 128,
0915   144,1036, 176, 204,1032, 148, 152,  64,1020,1024,1004, 216,
0916  1008,1012, 192,1016, 196, 988, 172, 132,1040, 168, 136, 156,
0917  1048,1044, 160, 164, 128, 144,1036, 176, 204,1032, 148, 152,
0918    64,1020};
0919 int pars3[1587]={
0920      98,   100,   101,   103,   104,   111,   112,   128,   137,   142,
0921     143,   144,   146,   148,   250,   252,   253,   255,   256,   263,
0922     264,   280,   289,   294,   295,   298,   300,   405,   407,   419,
0923     420,   432,   550,   554,   555,   556,   560,   593,   598,   599,
0924     602,   604,   708,   712,   745,   750,   751,   754,   756,   860,
0925     864,   897,   902,   903,   906,   908,  1012,  1016,  1049,  1054,
0926    1055,  1058,  1060,  1167,  1496,  1514,  1515,  1621,  1623,  1648,
0927    2070,  2074,  2075,  2076,  2080,  2113,  2118,  2119,  2122,  2124,
0928    2374,  2378,  2380,  2384,  2417,  2422,  2423,  2426,  2428,  2519,
0929    2521,  2523,  2525,  2526,  2527,  2528,  2530,  2531,  2532,  2536,
0930    2539,  2540,  2541,  2542,  2546,  2551,  2552,  2553,  2554,  2555,
0931    2556,  2561,  2562,  2563,  2564,  2565,  2567,  2568,  2569,  2574,
0932    2575,  2578,  2580,  2581,  2582,  2685,  2687,  2699,  2700,  2712,
0933    2975,  2977,  2981,  2983,  2984,  2985,  2995,  2996,  3002,  3010,
0934    3011,  3012,  3017,  3018,  3019,  3021,  3037,  3038,  3140,  3144,
0935    3153,  3165,  3166,  3167,  3177,  3182,  3183,  3186,  3188,  3320,
0936    3338,  3752,  3782,  3786,  3787,  3790,  3791,  3794,  3796,  4057,
0937    4058,  4198,  4202,  4204,  4208,  4241,  4246,  4247,  4250,  4252,
0938    4343,  4345,  4347,  4349,  4351,  4352,  4363,  4364,  4370,  4373,
0939    4378,  4379,  4380,  4385,  4386,  4387,  4389,  4405,  4406,  4509,
0940    4511,  4523,  4536,  4647,  4649,  4651,  4653,  4654,  4655,  4656,
0941    4658,  4660,  4664,  4667,  4668,  4669,  4670,  4674,  4679,  4680,
0942    4681,  4682,  4683,  4684,  4689,  4690,  4691,  4692,  4693,  4695,
0943    4696,  4697,  4702,  4703,  4706,  4708,  4709,  4710,  4799,  4801,
0944    4803,  4805,  4806,  4807,  4808,  4819,  4820,  4821,  4822,  4826,
0945    4831,  4832,  4833,  4834,  4835,  4836,  4841,  4842,  4843,  4844,
0946    4845,  4847,  4861,  4862,  5103,  5105,  5109,  5111,  5112,  5113,
0947    5123,  5124,  5130,  5138,  5139,  5140,  5145,  5146,  5147,  5149,
0948    5165,  5166,  6015,  6017,  6019,  6021,  6022,  6023,  6024,  6035,
0949    6036,  6037,  6038,  6042,  6047,  6048,  6049,  6050,  6051,  6052,
0950    6057,  6058,  6059,  6060,  6061,  6063,  6077,  6078,  6775,  6777,
0951    6779,  6781,  6783,  6784,  6795,  6796,  6797,  6802,  6810,  6811,
0952    6812,  6817,  6818,  6819,  6821,  6837,  6838,  6932,  7392,  7425,
0953    7426,  7445,  7446,  7544,  7577,  7578,  7597,  7598,  7693,  7696,
0954    7729,  7730,  7749,  7750,  7848,  7881,  7882,  7901,  7902,  8295,
0955    8297,  8299,  8301,  8303,  8304,  8312,  8315,  8316,  8317,  8322,
0956    8330,  8331,  8332,  8337,  8338,  8339,  8341,  8342,  8350,  8351,
0957    8353,  8354,  8356,  8357,  8358,  9815,  9817,  9819,  9821,  9823,
0958    9824,  9832,  9835,  9836,  9837,  9842,  9850,  9851,  9852,  9857,
0959    9858,  9859,  9861,  9862,  9870,  9871,  9873,  9874,  9876,  9877,
0960    9878, 10424, 10437, 10438, 10439, 10464, 10592, 10622, 10626, 10627,
0961   10630, 10631, 10634, 10636, 10744, 10774, 10778, 10782, 10783, 10786,
0962   10788, 10893, 10895, 10920, 10932, 10933, 11048, 11078, 11086, 11087,
0963   11090, 11092, 11200, 11230, 11238, 11239, 11242, 11244, 11353, 11354,
0964   11791, 11793, 11795, 11797, 11799, 11800, 11811, 11812, 11818, 11821,
0965   11822, 11826, 11827, 11828, 11833, 11834, 11835, 11837, 11853, 11854,
0966   11943, 11945, 11947, 11949, 11950, 11951, 11952, 11963, 11964, 11965,
0967   11966, 11970, 11975, 11976, 11977, 11978, 11979, 11980, 11985, 11986,
0968   11987, 11988, 11989, 11991, 12005, 12006, 12095, 12097, 12099, 12101,
0969   12102, 12103, 12104, 12115, 12116, 12117, 12118, 12122, 12127, 12128,
0970   12129, 12130, 12131, 12132, 12137, 12138, 12139, 12140, 12141, 12143,
0971   12157, 12158, 12399, 12401, 12403, 12405, 12406, 12407, 12408, 12419,
0972   12420, 12421, 12422, 12426, 12431, 12432, 12433, 12434, 12435, 12436,
0973   12441, 12442, 12443, 12444, 12445, 12447, 12461, 12462, 12551, 12553,
0974   12555, 12557, 12559, 12560, 12571, 12572, 12578, 12586, 12587, 12588,
0975   12593, 12594, 12595, 12597, 12613, 12614, 12703, 12705, 12707, 12709,
0976   12711, 12712, 12723, 12724, 12725, 12730, 12738, 12739, 12740, 12745,
0977   12746, 12747, 12749, 12765, 12766, 12855, 12857, 12859, 12861, 12863,
0978   12864, 12875, 12876, 12877, 12882, 12890, 12891, 12892, 12897, 12898,
0979   12899, 12901, 12917, 12918, 13007, 13009, 13011, 13013, 13015, 13016,
0980   13027, 13028, 13029, 13034, 13042, 13043, 13044, 13049, 13050, 13051,
0981   13053, 13069, 13070, 13311, 13313, 13315, 13317, 13319, 13320, 13331,
0982   13332, 13333, 13338, 13346, 13347, 13348, 13353, 13354, 13355, 13357,
0983   13373, 13374, 13767, 13769, 13771, 13773, 13775, 13776, 13787, 13788,
0984   13794, 13802, 13803, 13804, 13809, 13810, 13811, 13813, 13829, 13830,
0985   13919, 13921, 13923, 13925, 13927, 13928, 13939, 13940, 13941, 13946,
0986   13954, 13955, 13956, 13961, 13962, 13963, 13965, 13981, 13982, 14071,
0987   14073, 14077, 14080, 14091, 14092, 14098, 14106, 14108, 14113, 14114,
0988   14115, 14117, 14133, 14134, 14223, 14225, 14227, 14229, 14231, 14232,
0989   14243, 14244, 14245, 14250, 14258, 14259, 14260, 14265, 14266, 14267,
0990   14269, 14285, 14286, 14375, 14377, 14378, 14379, 14381, 14383, 14384,
0991   14395, 14396, 14402, 14410, 14411, 14412, 14417, 14418, 14419, 14421,
0992   14437, 14438, 14831, 14833, 14835, 14837, 14839, 14840, 14848, 14851,
0993   14852, 14853, 14858, 14866, 14867, 14868, 14873, 14874, 14875, 14877,
0994   14878, 14886, 14887, 14889, 14890, 14892, 14893, 14894, 14983, 14985,
0995   14989, 14992, 15003, 15004, 15010, 15020, 15025, 15026, 15027, 15029,
0996   15045, 15046, 15135, 15137, 15141, 15144, 15155, 15156, 15172, 15177,
0997   15178, 15179, 15181, 15197, 15198, 15592, 15606, 15632, 15743, 15745,
0998   15749, 15752, 15763, 15780, 15785, 15786, 15787, 15789, 15805, 15806,
0999   15897, 15901, 15904, 15915, 15932, 15937, 15938, 15939, 15941, 15957,
1000   15958, 16049, 16053, 16056, 16084, 16089, 16090, 16091, 16093, 16109,
1001   16110, 16201, 16205, 16208, 16236, 16241, 16242, 16243, 16245, 16261,
1002   16262, 16353, 16357, 16360, 16388, 16393, 16394, 16397, 16413, 16414,
1003   16505, 16509, 16512, 16540, 16545, 16546, 16549, 16565, 16566, 16657,
1004   16661, 16664, 16692, 16697, 16698, 16701, 16717, 16718, 16809, 16813,
1005   16816, 16844, 16849, 16850, 16853, 16869, 16870, 16961, 16965, 16968,
1006   16996, 17001, 17002, 17021, 17022, 17113, 17117, 17120, 17148, 17153,
1007   17154, 17173, 17174, 17269, 17272, 17300, 17305, 17306, 17325, 17326,
1008   17421, 17424, 17452, 17457, 17458, 17477, 17478, 17573, 17576, 17609,
1009   17610, 17629, 17630, 17725, 17728, 17761, 17762, 17781, 17782, 17877,
1010   17880, 17913, 17914, 17933, 17934, 18188, 18192, 18213, 18225, 18230,
1011   18231, 18234, 18236, 18342, 18343, 18632, 18644, 18645, 18646, 18647,
1012   18648, 18669, 18670, 18671, 18672, 18681, 18686, 18687, 18690, 18692,
1013   18783, 18785, 18789, 18791, 18792, 18793, 18803, 18804, 18810, 18818,
1014   18819, 18820, 18825, 18826, 18827, 18829, 18845, 18846, 18952, 18982,
1015   18986, 18990, 18991, 18994, 18996, 19391, 19393, 19397, 19399, 19400,
1016   19401, 19411, 19412, 19418, 19426, 19427, 19428, 19433, 19434, 19435,
1017   19437, 19453, 19454, 19713, 19847, 19849, 19853, 19855, 19856, 19857,
1018   19867, 19868, 19874, 19882, 19883, 19884, 19889, 19890, 19891, 19893,
1019   19909, 19910, 20151, 20153, 20155, 20157, 20158, 20159, 20160, 20171,
1020   20172, 20173, 20174, 20178, 20183, 20184, 20185, 20186, 20187, 20188,
1021   20193, 20194, 20195, 20196, 20197, 20199, 20213, 20214, 21063, 21065,
1022   21067, 21069, 21071, 21072, 21083, 21084, 21085, 21090, 21098, 21099,
1023   21100, 21105, 21106, 21107, 21109, 21125, 21126, 21215, 21217, 21221,
1024   21223, 21224, 21235, 21236, 21242, 21250, 21251, 21252, 21257, 21258,
1025   21259, 21261, 21277, 21278, 22285, 22288, 22321, 22322, 22341, 22342,
1026   22446, 22584, 22596, 22598, 22600, 22621, 22622, 22623, 22624, 22633,
1027   22638, 22639, 22642, 22644, 24711, 24713, 24717, 24719, 24720, 24721,
1028   24731, 24732, 24738, 24746, 24747, 24748, 24753, 24754, 24755, 24757,
1029   24773, 24774, 24876, 24880, 24901, 24902, 24903, 24913, 24918, 24919,
1030   24922, 24924, 25485, 25487, 25512, 25524, 25623, 25625, 25629, 25631,
1031   25632, 25633, 25643, 25644, 25650, 25658, 25659, 25660, 25665, 25666,
1032   25667, 25669, 25685, 25686, 25775, 25777, 25779, 25781, 25783, 25784,
1033   25795, 25796, 25802, 25805, 25810, 25811, 25812, 25817, 25818, 25819,
1034   25821, 25837, 25838, 25927, 25929, 25931, 25933, 25934, 25935, 25936,
1035   25947, 25948, 25949, 25950, 25954, 25959, 25960, 25961, 25962, 25963,
1036   25964, 25969, 25970, 25971, 25972, 25973, 25975, 25989, 25990, 26079,
1037   26081, 26083, 26085, 26086, 26087, 26088, 26099, 26100, 26101, 26102,
1038   26106, 26111, 26112, 26113, 26114, 26115, 26116, 26121, 26122, 26123,
1039   26124, 26125, 26127, 26141, 26142, 26231, 26233, 26235, 26237, 26238,
1040   26239, 26240, 26251, 26252, 26253, 26254, 26258, 26263, 26264, 26265,
1041   26266, 26267, 26268, 26273, 26274, 26275, 26276, 26277, 26279, 26293,
1042   26294, 26383, 26385, 26387, 26389, 26391, 26392, 26403, 26404, 26405,
1043   26410, 26418, 26419, 26420, 26425, 26426, 26427, 26429, 26445, 26446,
1044   26535, 26537, 26539, 26541, 26543, 26544, 26555, 26556, 26557, 26562,
1045   26570, 26571, 26572, 26577, 26578, 26579, 26581, 26597, 26598, 26839,
1046   26841, 26843, 26845, 26847, 26848, 26859, 26860, 26861, 26866, 26874,
1047   26875, 26876, 26881, 26882, 26883, 26885, 26901, 26902, 26991, 26993,
1048   26995, 26997, 26999, 27000, 27011, 27012, 27018, 27026, 27027, 27028,
1049   27033, 27034, 27035, 27037, 27053, 27054, 27903, 27905, 27907, 27909,
1050   27911, 27912, 27923, 27924, 27925, 27930, 27938, 27939, 27940, 27945,
1051   27946, 27947, 27949, 27965, 27966, 28055, 28057, 28059, 28061, 28063,
1052   28064, 28075, 28076, 28077, 28082, 28090, 28091, 28092, 28097, 28098,
1053   28099, 28101, 28117, 28118, 28359, 28361, 28363, 28365, 28366, 28367,
1054   28368, 28379, 28380, 28381, 28382, 28386, 28391, 28392, 28393, 28394,
1055   28395, 28396, 28401, 28402, 28403, 28404, 28405, 28407, 28421, 28422,
1056   28511, 28513, 28515, 28517, 28518, 28519, 28520, 28531, 28532, 28533,
1057   28534, 28538, 28543, 28544, 28545, 28546, 28547, 28548, 28553, 28554,
1058   28555, 28556, 28557, 28559, 28573, 28574, 28815, 28817, 28819, 28821,
1059   28823, 28824, 28835, 28836, 28837, 28842, 28850, 28851, 28852, 28857,
1060   28858, 28859, 28861, 28877, 28878, 29119, 29121, 29123, 29125, 29126,
1061   29127, 29128, 29139, 29140, 29141, 29142, 29146, 29151, 29152, 29153,
1062   29154, 29155, 29156, 29161, 29162, 29163, 29164, 29165, 29167, 29181,
1063   29182, 29423, 29425, 29427, 29429, 29430, 29431, 29432, 29443, 29444,
1064   29445, 29446, 29450, 29455, 29456, 29457, 29458, 29459, 29460, 29465,
1065   29466, 29467, 29468, 29469, 29471, 29485, 29486, 29575, 29577, 29579,
1066   29581, 29582, 29583, 29584, 29595, 29596, 29597, 29598, 29602, 29607,
1067   29608, 29609, 29610, 29611, 29612, 29617, 29618, 29619, 29620, 29621,
1068   29623, 29637, 29638, 29879, 29881, 29883, 29885, 29886, 29887, 29888,
1069   29899, 29900, 29901, 29902, 29906, 29911, 29912, 29913, 29914, 29915,
1070   29916, 29921, 29922, 29923, 29924, 29925, 29927, 29941, 29942, 30031,
1071   30033, 30035, 30037, 30038, 30039, 30040, 30051, 30052, 30053, 30054,
1072   30058, 30063, 30064, 30065, 30066, 30067, 30068, 30073, 30074, 30075,
1073   30076, 30077, 30079, 30093, 30094, 30183, 30185, 30187, 30189, 30190,
1074   30191, 30192, 30203, 30204, 30205, 30206, 30210, 30215, 30216, 30217,
1075   30218, 30219, 30220, 30225, 30226, 30227, 30228, 30229, 30231, 30245,
1076   30246, 30335, 30337, 30339, 30341, 30342, 30343, 30344, 30355, 30356,
1077   30357, 30358, 30362, 30367, 30368, 30369, 30370, 30371, 30372, 30377,
1078   30378, 30379, 30380, 30381, 30383, 30397, 30398};
1079 int pars4[1587]={
1080  202,  2,  3,  8,218,200,201,  7,  4, 11,217,  1,  6,  5,202,  2,
1081    3,  8,218,225,201,  7,  4, 11,217,  6,  5, 13,  8,227, 14,  7,
1082  228,229, 15, 17,218,  4, 11,217,  6,  5,230,218,  4, 11,217,  6,
1083    5,231,218,  4, 11,217,  6,  5,232,218,  4, 11,217,  6,  5, 18,
1084  233,234, 21, 22,  8,  7,235,229, 27, 17,218,  4, 11,217,  6,  5,
1085  237,238, 17,218,  4, 11,217,  6,  5, 56, 60,248,263,243,249,257,
1086  229, 30, 17,218, 57, 55, 35,242, 53,245,246,241, 52, 46, 61, 47,
1087  250, 58,244, 59,240, 31,  4, 11,217,  6,  5, 45, 50, 62,  8,227,
1088   14,  7, 56, 60,263,265,257, 63, 57, 55, 53, 52, 46, 61, 47,250,
1089   58, 59,266, 50, 68,218, 66,270, 67, 65,  4, 11,217,  6,  5,271,
1090  272,218, 71,274, 70, 11,217, 73, 72,275, 75,276,238, 17,218,  4,
1091   11,217,  6,  5, 56, 60,278,263,249,257, 57, 55, 53,277, 52, 46,
1092   61, 47,250, 58, 59, 45, 50, 62,  8,279,  7, 56, 60,248,263,243,
1093  249,257,238, 17,218, 57, 55, 35,242, 53,245,246,241, 52, 46, 61,
1094   47,250, 58,244, 59,240, 78,  4, 11,217,  6,  5, 45, 50, 56, 60,
1095  248,263,243,249,257, 57, 55, 35,242, 53,245,246,241, 52, 46, 61,
1096   47,250, 58,244, 59,282, 45, 50, 56, 60,263,265,257, 80, 57, 55,
1097   53, 52, 46, 61, 47,250, 58, 59,266, 50, 56, 60,248,263,243,249,
1098  257, 57, 55, 35,242, 53,245,246,241, 52, 46, 61, 47,250, 58,244,
1099   59, 86, 45, 50, 56, 60,248,263,249,257, 57, 55, 89, 53, 52, 46,
1100   61, 47,250, 58, 59, 45, 50, 90,257, 47,250,300, 50,257, 47,250,
1101  301, 50,302,257, 47,250,266, 50,257, 47,250,303, 50, 56, 60,248,
1102  263,249,257,218, 57, 55,100, 53, 52, 46, 61, 47,250, 58, 59,102,
1103   11,217,101, 73, 72, 45, 50, 56, 60,248,263,249,257,218, 57, 55,
1104  100, 53, 52, 46, 61, 47,250, 58, 59,102, 11,217,101, 73, 72, 45,
1105   50,308,307,121,  8,120,218, 71,274,124, 11,217, 73, 72,218, 71,
1106  310, 11,217, 73, 72,126,  8,  7,311,125,218,312, 11,217, 73, 72,
1107  218,313, 11,217, 73, 72,275,128, 56, 60,278,263,249,257, 57, 55,
1108   53,315,131, 52, 46, 61, 47,250, 58, 59, 45, 50, 56, 60,248,263,
1109  243,249,257, 57, 55, 35,242, 53,245,246,241, 52, 46, 61, 47,250,
1110   58,244, 59,282, 45, 50, 56, 60,248,263,243,249,257, 57, 55, 35,
1111  242, 53,245,246,241, 52, 46, 61, 47,250, 58,244, 59,317, 45, 50,
1112   56, 60,248,263,243,249,257, 57, 55, 35,242, 53,245,246,241, 52,
1113   46, 61, 47,250, 58,244, 59,318, 45, 50, 56, 60,319,263,249,257,
1114   57, 55, 53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56, 60,248,263,
1115  249,257, 57, 55,133, 53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56,
1116   60,248,263,249,257, 57, 55,134, 53, 52, 46, 61, 47,250, 58, 59,
1117   45, 50, 56, 60,248,263,249,257, 57, 55,135, 53, 52, 46, 61, 47,
1118  250, 58, 59, 45, 50, 56, 60,248,263,249,257, 57, 55,137, 53, 52,
1119   46, 61, 47,250, 58, 59, 45, 50, 56, 60,322,263,249,257, 57, 55,
1120   53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56, 60,248,263,249,257,
1121   57, 55,139, 53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56, 60,263,
1122  257, 57, 55, 53,140, 61, 47,250, 58, 59,266, 50, 56, 60,248,263,
1123  249,257, 57, 55,141, 53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56,
1124   60,142,324,263,249,257, 57, 55, 53, 52, 46, 61, 47,250, 58, 59,
1125   45, 50, 56, 60,248,263,249,257,218, 57, 55,100, 53, 52, 46, 61,
1126   47,250, 58, 59,102, 11,217,143, 73, 72, 45, 50, 56, 60,263,257,
1127   57, 55,144, 61, 47,250, 58, 59,266, 50, 56, 60,263,257, 57,145,
1128   61, 47,250, 58, 59,266, 50,328,121,147,149, 60,263,257, 57, 61,
1129   47,250, 58, 59,266, 50, 60,263,257,150, 61, 47,250, 58, 59,266,
1130   50, 60,263,257, 61, 47,250,151, 59,266, 50, 60,263,257, 61, 47,
1131  250,152, 59,266, 50, 60,263,257, 61, 47,250,153,266, 50, 60,263,
1132  257, 61, 47,250,154,266, 50, 60,263,257, 61, 47,250,155,266, 50,
1133   60,263,257, 61, 47,250,156,266, 50,157,263,257, 61, 47,250,266,
1134   50,158,263,257, 61, 47,250,266, 50,263,257,159, 47,250,266, 50,
1135  263,257,160, 47,250,266, 50,329,257, 47,250,266, 50,330,257, 47,
1136  250,266, 50,331,257, 47,250,266, 50, 68,218,334,  4, 11,217,  6,
1137    5,161, 18,164, 68, 22,121,  8,218,270, 67,165,120,  4, 11,217,
1138    6,  5, 56, 60,263,265,257,166, 57, 55, 53, 52, 46, 61, 47,250,
1139   58, 59,266, 50,218, 71,310, 11,217, 73, 72, 56, 60,263,265,257,
1140  339, 57, 55, 53, 52, 46, 61, 47,250, 58, 59,266, 50,341, 56, 60,
1141  263,265,257,342, 57, 55, 53, 52, 46, 61, 47,250, 58, 59,266, 50,
1142   56, 60,248,263,243,249,257, 57, 55, 35,242, 53,245,246,241, 52,
1143   46, 61, 47,250, 58,244, 59,344, 45, 50, 56, 60,248,263,249,257,
1144   57, 55,175, 53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56, 60,263,
1145  345,257, 57, 55, 53, 52, 46, 61, 47,250, 58, 59,266, 50,349,257,
1146   47,250,266, 50,161,164, 68,121,218,270, 67,165,147,  4, 11,217,
1147    6,  5, 56, 60,263,265,257,178, 57, 55, 53, 52, 46, 61, 47,250,
1148   58, 59,266, 50, 68,218,270, 67,179,  4, 11,217,  6,  5,126,  8,
1149    7,355, 56, 60,263,265,257,356, 57, 55, 53, 52, 46, 61, 47,250,
1150   58, 59,266, 50, 56, 60,278,263,249,257, 57, 55, 53,358, 52, 46,
1151   61, 47,250, 58, 59, 45, 50, 56, 60,248,263,243,249,257, 57, 55,
1152   35,242, 53,245,246,241, 52, 46, 61, 47,250, 58,244, 59,180, 45,
1153   50, 56, 60,248,263,243,249,257, 57, 55, 35,242, 53,245,246,241,
1154   52, 46, 61, 47,250, 58,244, 59,359, 45, 50, 56, 60,248,263,243,
1155  249,257, 57, 55, 35,242, 53,245,246,241, 52, 46, 61, 47,250, 58,
1156  244, 59,360, 45, 50, 56, 60,248,263,249,257, 57, 55,181, 53, 52,
1157   46, 61, 47,250, 58, 59, 45, 50, 56, 60,248,263,249,257, 57, 55,
1158  182, 53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56, 60,248,263,249,
1159  257, 57, 55,185, 53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56, 60,
1160  361,263,249,257, 57, 55, 53, 52, 46, 61, 47,250, 58, 59, 45, 50,
1161   56, 60,248,263,249,257, 57, 55,190, 53, 52, 46, 61, 47,250, 58,
1162   59, 45, 50, 56, 60,248,263,249,257, 57, 55,192, 53, 52, 46, 61,
1163   47,250, 58, 59, 45, 50, 56, 60,248,263,243,249,257, 57, 55, 35,
1164  242, 53,245,246,241, 52, 46, 61, 47,250, 58,244, 59,364, 45, 50,
1165   56, 60,248,263,243,249,257, 57, 55, 35,242, 53,245,246,241, 52,
1166   46, 61, 47,250, 58,244, 59,365, 45, 50, 56, 60,248,263,249,257,
1167   57, 55,195, 53, 52, 46, 61, 47,250, 58, 59, 45, 50, 56, 60,248,
1168  263,243,249,257, 57, 55, 35,242, 53,245,246,241, 52, 46, 61, 47,
1169  250, 58,244, 59,367, 45, 50, 56, 60,248,263,243,249,257, 57, 55,
1170   35,242, 53,245,246,241, 52, 46, 61, 47,250, 58,244, 59,368, 45,
1171   50, 56, 60,248,263,243,249,257, 57, 55, 35,242, 53,245,246,241,
1172   52, 46, 61, 47,250, 58,244, 59,369, 45, 50, 56, 60,248,263,243,
1173  249,257, 57, 55, 35,242, 53,245,246,241, 52, 46, 61, 47,250, 58,
1174  244, 59,370, 45, 50, 56, 60,248,263,243,249,257, 57, 55, 35,242,
1175   53,245,246,241, 52, 46, 61, 47,250, 58,244, 59,371, 45, 50, 56,
1176   60,248,263,243,249,257, 57, 55, 35,242, 53,245,246,241, 52, 46,
1177   61, 47,250, 58,244, 59,372, 45, 50, 56, 60,248,263,243,249,257,
1178   57, 55, 35,242, 53,245,246,241, 52, 46, 61, 47,250, 58,244, 59,
1179  373, 45, 50};
1180 int pars5[174]={
1181    2,  4,  5, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
1182   33, 34, 35, 36, 37, 38, 69, 42, 43,  3, 11, 46,  9, 12, 14, 16,
1183   18, 79, 80,  8, 10,  7, 13,124,125,110,111,112,113,114,115,120,
1184  145,147,205,199,200,201,202,203,204,214,215,219,220,221,222,187,
1185   72,162,191,213, 75, 89, 84, 78, 81, 70, 44, 63,  6, 49, 91, 47,
1186  122,123,126,119,141,142,144,149,150,151,152,153,154,155,156,157,
1187  158,159,211,212,194,195,196,197, 71, 73, 74, 86, 88, 40, 45, 55,
1188   51, 53, 61, 94,121,116,118,146,140,143,148,208,217,209,210,216,
1189   96,188,189,190, 90, 83, 85,109,105, 39, 50, 59, 60, 64, 66, 92,
1190  117,161,206,207,198,192,103,107,101,108,104, 56, 58, 93, 95,129,
1191  130,218,102,106,139,128,131,136,137,138,135,134,133,132};
1192 int pars6[721]={
1193    1,144,144,111,144,144,111,111,112,111, 98,112,100,101, 99, 94,112,101,
1194   99, 94,112,100,101, 94,112,101, 94, 98,100,116, 26, 98,100, 26, 99, 98,
1195   99, 99, 98,100,137,100,100,137,100,148,100,100,148,100,146,100,100,146,
1196  137, 42,137, 65,137, 70,137, 55,137, 74,148, 78,148, 45,148, 67,148, 62,
1197  148, 64,148, 56,148, 51,148, 68,148, 77,148,143,148,104,148, 75,146, 47,
1198  146, 79,143,142, 60, 81,139, 85,143,142, 81,139, 85,143,142, 60,142, 72,
1199  142, 76,139,138,139,139,138,116,115,116,116, 16,115,115,101,115,101, 31,
1200  117,138,134,141, 26,134,148,134,134,148,134,146,134,134,146,141,140,141,
1201  141, 16,140,140,101,140,101, 25, 97,140, 25, 97,104, 53, 60, 81,106, 85,
1202  104, 53, 81,106, 85,104, 53, 60,106,105,106,106, 16,105,105, 60,105, 60,
1203   31, 97,101,128,103,101,103,103, 60,103,  9,101, 10,103,103, 38, 97, 39,
1204  103,103, 38, 39,103,103,  9,127, 10,103,103,  9,113, 10,103,103,  9, 10,
1205  128, 11,147,128, 11,128, 11,147,128,128, 11,128,147,146,147,147,146,127,
1206  126,127,126, 16, 22,126,125,126,126, 16,125,125,100,101,125,100,125,100,
1207   88,113, 60,113,113, 16, 60,117, 91,117, 81,118, 85,117, 81,118, 16, 85,
1208  118,117,118,118, 16,117,145,134, 88,145,134, 88,128, 88,128,102, 88,102,
1209  102,  9, 88, 10,102,102, 38, 97, 39,102,102, 38, 39,102, 38, 97, 39,102,
1210   38, 39,102,102,  9,127, 10,102,102,  9, 10,102,  9,127, 10,102,  9, 10,
1211  135,121,135,110,135, 94,135,132,135,119,135,120,121, 60, 25,135,121, 44,
1212   97, 25,135,121, 49, 25,135,110,109, 26,110, 26, 94, 81, 99,136, 85, 94,
1213   81, 99, 85, 94, 81,136, 85, 94, 81, 85,136,135,136,136,135,132, 61,  9,
1214  109, 10,135,132, 61,  9,109, 10,135, 52,135,132, 73,  9,109, 10,135,119,
1215   80,  9,109, 10,135,119, 50,135, 80,  9,109, 10, 26,119, 58,  9,109, 26,
1216  109, 26,109, 10,135,119, 58,  9, 26,109, 26,109, 10,135,119, 58,  9,109,
1217   26, 26,109, 10,135,119, 58,  9,109, 26,109, 26, 10,135,119, 58,  9,109,
1218   26, 26, 10,135,119, 58,  9, 26,109, 26, 10,135,119, 58,  9, 26, 26,109,
1219   10,135,119, 58,  9, 26, 26, 10,135,120, 59, 60, 26,120, 48, 26,120, 43,
1220   26,120, 66,109, 26,120, 66, 26,109, 91,109,109, 16, 91, 91, 95, 91,149,
1221   92, 91, 92, 31, 92, 12, 92, 24, 92,  5, 92, 15, 92, 19, 92, 29, 92, 36,
1222   92,  8, 92, 41, 92, 83, 95,123, 95,123, 37,109, 95, 97, 95,123,122,123,
1223  123, 84,122,122,114,122,122,  7,114,114,108,114,114, 82,108,108, 87,108,
1224  108, 40, 87, 87,107, 87, 87,  6,107,107,131,107,107, 32,131,107,107,  3,
1225  131,131,133,131,131, 27,133,131,131, 33,133,131,131, 30,133,131,131, 34,
1226  133,133, 89,133,133, 28, 89,133,133, 35, 89, 89,124, 89, 89, 13,124, 89,
1227   89, 17,124,124, 93,124,124, 11, 93,124,124, 23, 93,124,124,  4, 93, 93,
1228  149, 93,  9,145, 10, 93,149,129,149, 14,149,149, 18,149,149,150, 93,149,
1229   69,149,149, 69,  9,145, 10,150,  6,150, 11,150, 13,150, 17,150, 86,150,
1230    2,129,130,129,129, 38,109, 39,129,129,  9, 90, 10,129,129,  9, 10,129,
1231  129, 21, 60,129,129, 20, 60,129,129, 14,129,129, 18,130, 60,130, 96,130,
1232   71,130,  9,109, 10, 90, 91, 90, 90, 16, 91, 96, 63, 96, 46, 96, 57, 96,
1233   54};
1234 int pars7[223]={ /* includes past-the-end index */
1235    0,  2,  4,  7,  9, 11, 16, 20, 24, 27, 31, 34, 36, 39, 42, 44, 47, 49,
1236   52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86,
1237   88, 90, 92, 98,103,106,108,110,112,115,117,121,123,127,131,134,136,139,
1238  141,143,147,149,153,156,162,167,170,172,176,178,182,185,187,189,193,198,
1239  202,207,212,216,219,221,225,228,230,233,235,239,241,245,248,250,253,255,
1240  259,261,265,270,272,276,279,281,283,286,288,292,297,301,305,308,313,317,
1241  321,324,326,328,330,332,334,336,340,345,349,352,354,359,363,367,370,372,
1242  375,381,389,395,401,409,419,428,437,446,454,462,470,477,481,484,487,491,
1243  494,496,500,502,506,508,510,512,514,516,518,520,522,524,526,528,530,535,
1244  537,539,543,545,549,551,555,557,561,563,567,569,573,577,579,583,587,591,
1245  595,597,601,605,607,611,615,617,621,625,629,631,636,638,641,644,647,650,
1246  655,657,659,661,663,665,667,669,674,679,683,687,691,694,697,699,701,703,
1247  707,709,713,715,717,719,721};
1248note004
1249 int numfunc=48; // copied from cbnf16
1250 char prs6[314]={ // functions
1251  'C','l','o','s','e','P','o','l','y','\0','D','r','a','w','F','N',
1252  'u','m','\0','D','r','a','w','N','u','m','\0','D','r','a','w','S',
1253  't','r','i','n','g','\0','F','o','n','t','I','n','f','o','\0','G',
1254  'i','f','O','u','t','\0','H','o','r','i','z','S','c','a','l','e',
1255  '\0','H','o','r','i','z','T','i','m','e','\0','J','n','\0','L','i',
1256  'n','e','T','o','\0','L','i','n','e','T','o','G','\0','M','a','k',
1257  'e','G','r','a','p','h','\0','M','a','k','e','V','i','e','w','\0',
1258  'M','o','v','e','T','o','\0','M','o','v','e','T','o','G','\0','O',
1259  'p','e','n','P','o','l','y','\0','P','l','o','t','G','\0','P','n',
1260  'g','O','u','t','\0','S','e','t','C','o','l','o','r','\0','V','e',
1261  'r','t','S','c','a','l','e','\0','Y','n','\0','a','c','o','s','\0',
1262  'a','s','i','n','\0','a','t','a','n','\0','a','t','a','n','2','\0',
1263  'c','e','i','l','\0','c','o','s','\0','c','o','s','h','\0','e','r',
1264  'f','\0','e','x','i','t','\0','e','x','p','\0','f','a','b','s','\0',
1265  'f','l','o','o','r','\0','f','m','o','d','\0','h','m','s','d','a',
1266  'y','\0','l','o','g','\0','l','o','g','1','0','\0','m','a','t','i',
1267  'n','v','\0','m','a','t','m','u','l','\0','m','d','y','d','a','y',
1268  '\0','p','o','w','\0','p','r','i','n','t','f','\0','r','e','f','d',
1269  'a','y','\0','s','i','n','\0','s','i','n','h','\0','s','q','r','t',
1270  '\0','t','a','n','\0','t','a','n','h','\0'};
1271 int prs7[48]={ // pointer to prs6
1272    0, 10, 19, 27, 38, 47, 54, 65, 75, 78,
1273   85, 93,103,112,119,127,136,142,149,158,
1274  168,171,176,181,186,192,197,201,206,210,
1275  215,219,224,230,235,242,246,252,259,266,
1276  273,277,284,291,295,300,305,309};
1277 int prs8[48]={ // function id number
1278   26, 43, 42, 28, 27, 24, 31, 30, 37, 23,
1279   34, 29, 20, 22, 33, 25, 35, 45, 21, 32,
1280   38,  5,  4,  6,  7, 16,  2,  9, 36, 44,
1281   11, 18, 17, 19, 41, 12, 13, 47, 46, 40,
1282   14,  0, 39,  1,  8, 15,  3, 10};
1283 int prs9[119]={ // type ids
1284    4,  1,  6,  2,  2,  2,  2,  2,  2,  2,
1285    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
1286    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
1287    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
1288    2,  2,  2,  2,  4,  4,  4,  4,  4,  4,
1289    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
1290    4,  4,  4,  4,  4,  1,  4,  4,  4,  4,
1291    4,  4,  4,  1,  2,  2,  4,  1,  2,  2,
1292    4,  2,  2,  4,  2,  2,  4,  4,  2,  2,
1293    2,  2,  2,  4,  2,  2,  4,  2,  2,  2,
1294    2,  2,  2,  2,  2,  4,  4,  4,  1,  2,
1295    4,  4,  4,  4,  7,  7,  7,  4,  7};
1296 int prs10[48]={ // start indices to prs9
1297   59,107,105, 64, 60, 57, 72, 71, 92, 54,
1298   83, 66, 44, 51, 80, 58, 86,112, 47, 76,
1299   95, 11,  9, 13, 15, 35,  5, 20, 90,110,
1300   24, 39, 37, 41,103, 26, 28,117,113,101,
1301   30,  0, 98,  3, 18, 33,  7, 22};
1302 int prs11[48]={ // past-the-end indices to prs9
1303   60,110,107, 66, 64, 58, 76, 72, 95, 57,
1304   86, 71, 47, 54, 83, 59, 90,113, 51, 80,
1305   98, 13, 11, 15, 18, 37,  7, 22, 92,112,
1306   26, 41, 39, 44,105, 28, 30,119,117,103,
1307   33,  3,101,  5, 20, 35,  9, 24};
1308
1309note005
1310#ifdef CGI
1311
1312    if(strcmp(getenv("REQUEST_METHOD"),"POST")) {
1313        contype(0);
1314        printf("This CGI should be referenced with a METHOD of POST.\n");
1315        exit(0);
1316    }
1317    if(strcmp(getenv("CONTENT_TYPE"),"application/x-www-form-urlencoded")) {
1318        contype(0);
1319        printf("This CGI can only be used to decode form results. \n");
1320        exit(0);
1321    }
1322    cl = atoi(getenv("CONTENT_LENGTH"));
1323
1324    if(cl>MAXINP){
1325     contype(0);
1326     printf("Input length limit over.");
1327     exit(0);
1328    }
1329    for(x=0;cl && (!feof(stdin));x++) {
1330        if(x>9){
1331         contype(0);
1332         printf("Form field limit over.");
1333         exit(0);
1334        }
1335        mx=x;
1336        entries[x].val = fmakeword(stdin,'&',&cl);
1337        plustospace(entries[x].val);
1338        unescape_url(entries[x].val);
1339        entries[x].name = makeword(entries[x].val,'=');
1340    }
1341
1342/* scan the input file, count characters, deleting comments */
1343// fp=fopen("test.c","r");
1344 comment=0; /* comment cleaning process status */
1345 ninp=0; /* number of input characters */
1346 for(x=0;x<=mx;x++){
1347  if(strcmp(entries[x].name,"source")==0) break;
1348 }
1349 if(x>mx){
1350  contype(0);
1351  printf("Form not standard.");
1352  exit(0);
1353 }
1354/* substitute input fields */
1355 for(i=0;i<=mx;i++){
1356  if(strcmp(entries[i].name,"source")!=0&&strcmp(entries[i].name,"code")!=0){
1357   k=0;
1358   l=strlen(entries[i].val);
1359   for(j=0;entries[x].val[j]!='\0';j++){
1360    if(entries[x].val[j]==entries[i].name[k]) k++;
1361    else if(k!=0){ // at least partially matched
1362     if(entries[i].name[k]=='\0'){ // fully matched
1363      if(l>k) // val is longer
1364       for(m=strlen(entries[x].val)+l-k;m>j;m--)
1365        entries[x].val[m]=entries[x].val[m-l+k];
1366      else if(l<k){
1367       o=strlen(entries[x].val);
1368       for(m=j;m<=o;m++)
1369        entries[x].val[m+l-k]=entries[x].val[m];
1370      }
1371      for(m=0;entries[i].val[m]!='\0';m++) entries[x].val[j-k+m]=entries[i].val[m];
1372      k=0;
1373      j=j-k+m-1;
1374     }
1375     else k=0;
1376    }
1377   }
1378  }
1379 }
1380/* substitution end */
1381 mx=x;
1382 x=0;
1383 while((c=entries[mx].val[x++])!='\0'){
1384#else
1385/* scan the input file, count characters, deleting comments */
1386 fp=fopen("test.c","r");
1387 comment=0; /* comment cleaning process status */
1388 ninp=0; /* number of input characters */
1389 while((c=fgetc(fp))!=EOF){
1390#endif
1391note006
1392  switch (comment){
1393   case 0:  /* expecting new comment */
1394    if(c=='/') comment=1;
1395    else ninp++;
1396    break;
1397   case 1: /* expecting the second part of comment start mark */
1398    if(c=='/') comment=2;
1399    else if(c=='*') comment=3;
1400    else{
1401     comment=0;
1402     ninp+=2;
1403    }
1404    break;
1405   case 2: /* comment started by two slashes */
1406    if(c=='\n'||c=='\x0d'||c=='\x0a') comment=0;
1407    break;
1408   case 3: /* comment started by slash-asterisk */
1409    if(c=='*') comment=4;
1410    break;
1411   case 4:
1412    if(c=='/') comment=0;
1413    else  if(c!='*') comment=3;
1414    break;
1415   default:
1416    printf("\nillegal character %c",c);
1417  } /* switch */
1418 } /* while */
1419 if(comment!=0){
1420  contype(0);
1421  printf("Comment not closed.");
1422  exit(0);
1423 }
1424
1425#ifndef CGI
1426 fclose(fp);
1427 printf("ninp=%i\n",ninp);
1428 fp=fopen("test.c","r");
1429#endif
1430
1431/* allocate input buffer and read the input */
1432 inp=(char *)malloc(ninp*sizeof(char));
1433 comment=0;
1434 ninp=0;
1435#ifdef CGI
1436 x=0;
1437 while((c=entries[mx].val[x++])!='\0'){
1438#else
1439 while((c=fgetc(fp))!=EOF){
1440#endif
1441  switch (comment){
1442   case 0:
1443    if(c=='/') comment=1;
1444    else inp[ninp++]=c;
1445    break;
1446   case 1:
1447    if(c=='/') comment=2;
1448    else if(c=='*') comment=3;
1449    else{
1450     comment=0;
1451     inp[ninp++]='/';
1452     inp[ninp++]=c;
1453    }
1454    break;
1455   case 2:
1456    if(c=='\n'||c=='\x0d'||c=='\x0a') comment=0;
1457    break;
1458   case 3:
1459    if(c=='*') comment=4;
1460    break;
1461   case 4:
1462    if(c=='/') comment=0;
1463    else if(c!='*') comment=3;
1464    break;
1465   default:
1466    break;
1467  } /* switch */
1468 } /* while */
1469#ifndef CGI
1470 fclose(fp);
1471#endif
1472/* compact the input buffer */
1473 for(i=0;i<ninp;i++){
1474  if(inp[i]=='\t'||inp[i]=='\n'||inp[i]=='\x0d') inp[i]=' ';
1475  if(!isprint(inp[i])){
1476   contype(0);
1477   printf("Only printable ascii characters allowed.");
1478   exit(0);
1479  }
1480 }note007
1481 j=0; /* index for compacted chars */
1482 l=0; /* spaces within a character-constant are left as-is */
1483 for(i=0;i<ninp;i++){
1484  c=inp[i];
1485  if(l==0){
1486   if(c=='\"') l=1; // start of character constant
1487  }
1488  else {
1489   if(c=='\"'&&inp[i-1]!='\\') l=0; // end of character constant
1490  }
1491  if(c==' '&&l==0){
1492   k=0;
1493   if(inp[j-1]>='c'&&inp[j-1]<='t'){ // if the string that ends with inp[j-1]
1494    i1=inp[j-1]-'a';   // needs space after it
1495    i2=lex15[i1]; // num of entries
1496    for(i3=0;i3<i2;i3++){
1497     i4=lex14[i1]+i3; // offset to lex12 and lex13
1498     i5=lex12[i4];
1499     i6=lex13[i4];
1500     for(i7=0;i7<i6;i7++) if(inp[j-1-i7]!=lex11[i5+i7]) break;
1501     if(i7==i6){
1502      k=1;
1503      break;
1504     }
1505    } // for(i3=0;i3
1506   } // if(inp[j-1]
1507   if(k==1) inp[j++]=' ';
1508  } // if(c==' '&&l==0)
1509  else inp[j++]=c;
1510 }
1511 ninp=j;
1512#ifndef CGI
1513 printf("compacted ninp=%i\n",ninp);
1514#endif
1515note008
1516/* allocate tmnl[] */
1517 tmnl=(int *)malloc(ninp*sizeof(int)); /* string of terminal numbers */
1518// tmnl[0]=0;
1519 ntmnl=0;
1520 i=0;
1521 while(i<ninp){
1522  c=inp[i];
1523  i1=16;  // compare c with lex7[0]-lex7[23]
1524  for(i2=8;i2>0;i2/=2){
1525   if(i1>23){
1526    i1=i1-i2;
1527   }
1528   else{
1529    if(c==lex7[i1]) break;
1530    if(c<lex7[i1]) i1=i1-i2;
1531    else i1=i1+i2;
1532   }
1533  }
1534  if(c==lex7[i1]){ /* if c is in lex7[0]-lex7[23] */
1535   tmnl[ntmnl]=lex8[i1]; // default
1536   i4=1; // number of chars consumed
1537   if(lex10[i1]!=0){ // if there are next chars to be compared
1538    for(i2=0;i2<lex10[i1];i2++){ // do for each second char
1539     if(inp[i+1]==lex7[i2+lex9[i1]]){
1540      i3=i2+lex9[i1];
1541      tmnl[ntmnl]+=lex8[i3];
1542      i4=2; // number of chars consumed
1543      if(lex10[i3]!=0){ // if there are third char to be compared
1544       if(inp[i+2]==lex7[lex9[i3]]){
1545        tmnl[ntmnl]+=lex8[lex9[i3]];
1546        i4=3; // number of chars consumed
1547       }
1548      }
1549     } // if(inp[i+1]
1550    }
1551   }
1552   ntmnl++;
1553   i+=i4;
1554   if(tmnl[ntmnl-1]==17){ // -
1555    if(tmnl[ntmnl-2]!=10&&tmnl[ntmnl-2]!=39&&
1556       tmnl[ntmnl-3]!=57&&tmnl[ntmnl-3]!=60&&
1557       tmnl[ntmnl-3]!=63&&!isalpha(inp[i])) ntmnl--; // not binary nor unary operator
1558   }
1559  } // if(c==lex7[i1]
1560  else if(c=='\"'){
1561   tmnl[ntmnl++]=46; // in the case of character-constant, offset to the
1562                       //  character is saved next to terminal number
1563   tmnl[ntmnl++]=i;
1564   while(inp[++i]!='\"');
1565   while(inp[i-1]=='\\') while(inp[++i]!='\"');
1566   i++;
1567  }
1568  else if(isdigit(c)){
1569   if(inp[i-1]=='.'&&tmnl[ntmnl-1]==21) { // if . followed by digit cancel previous
1570    i--;
1571    ntmnl--;
1572   }
1573   if(inp[i-1]=='-'&&tmnl[ntmnl-1]!=17) tmnl[ntmnl+1]=i-1;  // offset of data
1574   else tmnl[ntmnl+1]=i;
1575   while(isdigit(inp[i])) i++;
1576   if(inp[i]=='.'){
1577    tmnl[ntmnl]=57;  // floating point constant
1578    i++;
1579    while(isdigit(inp[i])) i++;
1580   }
1581   else tmnl[ntmnl]=63; // integer constant
1582   ntmnl+=2;
1583  }
1584  else{  // isalpha and _
1585   j=0;
1586   while(isalnum(inp[i+j])||inp[i+j]=='_') j++;
1587   k=0;  // if reserved string k=1
1588   if(c>='a'&&c<='w'){ // test if reserved word
1589    i1=c-'a';
1590    i2=lex1[i1];
1591    for(i3=i2-1;i3>=0;i3--){
1592     i4=i3+lex2[i1];
1593     for(i5=0;i5<lex4[i4]-1;i5++)
1594       if(inp[i+1+i5]!=lex6[lex5[i4]+i5]) break;
1595     if(i5==lex4[i4]-1){
1596       tmnl[ntmnl]=lex3[i4];
1597       k=1;
1598       break;
1599     }
1600    }
1601   }
1602   if(k==1){
1603     i=i+j;
1604     if(inp[i]==' ') i++; // type is followed by a space
1605     ntmnl++;
1606   }
1607   else{
1608    tmnl[ntmnl]=60; // identifier
1609    tmnl[ntmnl+1]=i;
1610    ntmnl+=2;
1611    i=i+j;
1612   }
1613  } /* else */
1614 } /* while(i<ninp) */
1615
1616 tmnl[ntmnl++]=151; /* end terminal */
1617note009
1618/* move constants and names from inp[] to places for each data */
1619/* default minimum is one */
1620 i1=1; /* inpchar */
1621 j1=1; /* chcon */
1622 k1=1; /* ident */
1623 l1=1; /* flcon */
1624// m1=1; /* intcon */
1625 for(i=0;i<ntmnl;i++){
1626  switch(tmnl[i]){
1627   case 46: /* character constant */
1628    j=tmnl[i+1];
1629    while(inp[++j]!='\"');
1630    while(inp[j-1]=='\\') while(inp[++j]!='\"');
1631    i1+=j-tmnl[i+1];
1632    j1++;
1633    i++;
1634    break;
1635   case 57: /* floating constant */
1636    l1++;
1637    i++;
1638    break;
1639   case 60: /* identifier */
1640    j=tmnl[i+1];
1641    while(isalnum(inp[j])||inp[j]=='_') j++;
1642    i1+=j-tmnl[i+1]+1;
1643    k1++;
1644    i++;
1645    break;
1646   case 63: /* integer constant */
1647//    m1++;
1648    i++;
1649    break;
1650   default:
1651    break;
1652  }
1653 }
1654/* reserve memeory and put constants there */
1655 inpchar=(char *)malloc(sizeof(char)*i1); /* input characters */
1656 chcon=(int *)malloc(sizeof(int)*j1); /* character constants offset to inpchar */
1657 ident=(int *)malloc(sizeof(int)*k1); /* identifier offset to inpchar */
1658 flcon=(double *)malloc(sizeof(double)*l1); /* double constant */
1659/* move constants and names from inp[] to places for each data */
1660 i1=0; /* inpchar */
1661 nchcon=0; /* chcon */
1662 nident=0; /* ident */
1663 nflcon=0; /* flcon */
1664 for(i=0;i<ntmnl;i++){
1665  switch(tmnl[i]){
1666   case 46: /* character constant */
1667    chcon[nchcon++]=i1;
1668    j=tmnl[i+1];
1669    while(inp[++j]!='\"');
1670    while(inp[j-1]=='\\') while((c=inp[++j])!='\"');
1671    for(k=tmnl[i+1]+1;k<j;k++) inpchar[i1++]=inp[k];
1672    inpchar[i1++]='\0';
1673    tmnl[i+1]=nchcon-1;
1674    i++;
1675    break;
1676   case 57: /* floating constant */
1677    for(j=tmnl[i+1]+1;isdigit(inp[j])||inp[j]=='.';j++);
1678    j-=tmnl[i+1];
1679    for(k=0;k<j;k++) s[k]=inp[k+tmnl[i+1]];
1680    s[k]='\0';
1681    if(sscanf(s,"%lf",&flcon[nflcon])!=1){
1682     contype(0);
1683     printf("double constant form error.");
1684     exit(0);
1685    }
1686    tmnl[i+1]=nflcon;
1687    nflcon++;
1688    i++;
1689    break;
1690   case 60: /* identifier */
1691    j=tmnl[i+1];
1692    k=0;
1693    while(isalnum(inp[j+k])||inp[j+k]=='_'){
1694     s[k]=inp[j+k];
1695     k++;
1696    }
1697    s[k]='\0';
1698    for(k=0;k<nident;k++) if(strcmp(s,&inpchar[ident[k]])==0) break;
1699    tmnl[i+1]=k;
1700    if(k==nident){
1701     ident[nident++]=i1;
1702     for(k=0;;k++){
1703      inpchar[i1++]=s[k];
1704      if(s[k]=='\0') break;
1705     }
1706    }
1707    i++;
1708    break;
1709   case 63: /* integer constant */
1710    for(j=tmnl[i+1]+1;isdigit(inp[j]);j++);
1711    j-=tmnl[i+1];
1712    for(k=0;k<j;k++) s[k]=inp[k+tmnl[i+1]];
1713    s[k]='\0';
1714    if(sscanf(s,"%i",&tmnl[i+1])!=1){
1715     contype(0);
1716     printf("int constant form error.");
1717     exit(0);
1718    }
1719    i++;
1720    break;
1721   default:
1722    break;
1723  }
1724 }
1725/* now, inp[] is no more needed */
1726 free(inp);
1727note010
1728 gsymbol=(int *)malloc(ntmnl*2*sizeof(int)); /* garmmar symbol */
1729 produc=(int *)malloc(ntmnl*2*sizeof(int)); /* production */
1730 parent=(int *)malloc(ntmnl*2*sizeof(int)); /* parent index */
1731 child=(int *)malloc(ntmnl*2*sizeof(int)); /* left-most child */
1732 sibli=(int *)malloc(ntmnl*2*sizeof(int)); /* next sibling */
1733 attri1=(int *)malloc(ntmnl*2*sizeof(int)); /* attribute 1 */
1734
1735 gsymbol[0]=0;
1736 produc[0]=0;
1737 parent[0]=0;
1738 child[0]=0;
1739 sibli[0]=0;
1740 attri1[0]=0;
1741 ngsymb=1;
1742 stk[0]=0;
1743 i=0; // pointer for stack stk[]
1744 for(o=1;o<3230;o*=2); /* power of 2 and larger than 3230 */
1745 for(o1=1;o1<1587;o1*=2);
1746 for(j=0;j<ntmnl;j++){ note011
1747  if(stk[i]>=200){ // reduce-only states
1748   k=2; /* reduce */
1749   l=pars5[stk[i]-200]; /* production no */
1750  }
1751  else{
1752   k=stk[i]*152+tmnl[j];
1753/* binary search of the index where pars1[]=k */
1754   l=-1; /* decrement next */
1755   n=o;
1756   m=n;
1757   for(;n>0;n/=2){
1758    m+=(l*n);
1759    if(m<3230){
1760     if(pars1[m]==k) l=0;
1761     else if(pars1[m]<k) l=1;
1762     else l=-1;
1763     if(l==0) break;
1764    }
1765    else l=-1;
1766   }
1767   if(l!=0){
1768    contype(0);
1769    printf("parse error state=%i terminal=%i\n",stk[i],tmnl[j]);
1770    exit(0);
1771   }
1772   k=pars2[m]%4; /* 0:shift (1:goto) 2:reduce 3:accept*/
1773   l=pars2[m]/4; /* new state or production number */
1774  }
1775  switch (k){
1776   case 0: /* shift */note012
1777    gsymbol[ngsymb]=tmnl[j];
1778    produc[ngsymb]=0;
1779    child[ngsymb]=0;
1780    sibli[ngsymb]=0;
1781/* attributes that depend on tmnl array are established here */
1782    k1=tmnl[j];
1783    if(k1==46||k1==57||k1==60||k1==63){ // literal input
1784     attri1[ngsymb]=tmnl[j+1]; // chcon[], flcon[], ident[] or int value
1785    }
1786    else attri1[ngsymb]=0; /* no attribute */
1787    stk[++i]=ngsymb;
1788    ngsymb++;
1789    stk[++i]=l;
1790    break;
1791   case 2: /* reduce */note013
1792    i-=2*(pars7[l]-pars7[l-1]-1); /* number of grammer symbols on the right
1793                                   side of production */
1794    k1=stk[i]*152+pars6[pars7[l-1]];
1795/* binary search of the index where pars3[]=k1 */
1796    l1=-1; /* decrement next */
1797    n1=o1;
1798    m1=n1;
1799    for(;n1>0;n1/=2){
1800     m1+=(l1*n1);
1801     if(m1<1587){
1802      if(pars3[m1]==k1) l1=0;
1803      else if(pars3[m1]<k1) l1=1;
1804      else l1=-1;
1805      if(l1==0) break;
1806     }
1807     else l1=-1;
1808    }
1809    if(l1!=0){
1810     contype(0);
1811     printf("parse error state=%i non-terminal=%i\n",stk[i],pars6[pars7[l-1]]);
1812     exit(0);
1813    }
1814    gsymbol[ngsymb]=pars6[pars7[l-1]];
1815    produc[ngsymb]=l;
1816    parent[ngsymb]=-1; // tentative
1817    child[ngsymb]=stk[i+1];
1818    for(k1=0;k1<pars7[l]-pars7[l-1]-1;k1++){
1819     l1=stk[i+2*k1+1];
1820     parent[l1]=ngsymb;
1821     if(k1==pars7[l]-pars7[l-1]-2) sibli[l1]=0;
1822     else sibli[l1]=stk[i+2*(k1+1)+1];
1823    }
1824    stk[++i]=ngsymb;
1825/* prune parse tree. if the preceeding leaf is prunable, delete it */note014
1826    if((pars7[l]-pars7[l-1])==2){ /* if the right-side of production is single */
1827     l1=produc[child[ngsymb]];
1828     if(l1!=0){
1829      gsymbol[ngsymb-1]=gsymbol[ngsymb];
1830      parent[ngsymb-1]=-1;
1831      stk[i]=ngsymb-1; /* child is left as is. attribute assumed to be none */
1832      ngsymb--;
1833     }
1834     else{ /* terminal */
1835      stk[i]=ngsymb-1; /* child is left as is. attribute assumed to be none */
1836      ngsymb--;
1837     }
1838    }
1839    ngsymb++;
1840    stk[++i]=pars4[m1]; // new state
1841    break;
1842   case 3: /* accept */
1843    j=ntmnl; /* force exit */
1844    break;
1845  } /* switch k */
1846  if(k==2) j--; // reduce
1847  else if(tmnl[j]==46||tmnl[j]==57||tmnl[j]==60||tmnl[j]==63) j++; /* skip offset */
1848 } /* for(j=0;j<ntmnl;j++) */
1849
1850#ifndef CGI
1851 fp1=fopen("cbnf12","w");note015
1852 for(i=0;i<ngsymb;i++) fprintf(fp1,"%3i %4i %3i %3i %3i %3i\n",
1853   i,gsymbol[i],produc[i],parent[i],child[i],sibli[i]);
1854 fclose(fp1);
1855 printf("ngsymb=%i\n",ngsymb);
1856#endif
1857
1858/* get statistical data */note016
1859 nscop=1;
1860/* search for function declarations */
1861 for(i=0;i<ngsymb;i++) if(produc[i]==73||produc[i]==75) nscop++;
1862 scop=(scope *)malloc(sizeof(scope)*nscop);
1863 j=0;	// global scope
1864 strcpy(scop[j].name,"global");
1865 j++;
1866
1867 for(i=0;i<ngsymb;i++) if(produc[i]==73||produc[i]==75){
1868  k=child[i]; /* identifier */
1869  k=attri1[k]; /* index into ident[] */
1870  k=ident[k]; /* index into inpchar[] */
1871  strcpy(scop[j].name,&inpchar[k]);
1872  scop[j].noderoot=parent[i];
1873  scop[j].nodedecl=sibli[child[sibli[i]]];
1874  l=produc[scop[j].nodedecl];
1875  if(l==119||l==126||l==127){ /* no declaration */
1876   scop[j].nodeexec=scop[j].nodedecl;
1877   scop[j].nodedecl=-1;
1878  }
1879  else scop[j].nodeexec=sibli[scop[j].nodedecl];
1880  j++;
1881 }
1882 k=parent[scop[1].noderoot];
1883 if(k==-1){
1884  scop[0].noderoot=-1;
1885  scop[0].nodedecl=-1;
1886 }
1887 else{
1888  scop[0].noderoot=k;
1889  if(child[k]!=scop[1].noderoot) scop[0].nodedecl=child[k];
1890  else scop[0].nodedecl=-1;
1891 }
1892 scop[0].nodeexec=-1;
1893
1894//for(n1=0;n1<nscop;n1++) printf("n1=%i root=%i decl=%i exec=%i\n",
1895// n1,scop[n1].noderoot,scop[n1].nodedecl,scop[n1].nodeexec);
1896/* process declarations */note017
1897 for(n1=0;n1<nscop;n1++){ /* do for each scope */
1898  scop[n1].nchar=0; /* numbr of characters */
1899  scop[n1].nstring=0; /* number of strings */
1900  scop[n1].ndouble=0; /* number of doubles */
1901  scop[n1].nint=0; /* number of ints */
1902  scop[n1].ndarr=0; /* number of darrays */
1903  scop[n1].niarr=0; /* number of iarrays */
1904  scop[n1].nident=0; /* number of identifiers */
1905  ochar=0;
1906  ostring=0;
1907  odouble=0;
1908  oint=0;
1909  odarr=0;
1910  oiarr=0;
1911  oident=0;
1912
1913  for(m1=0;m1<2;m1++){ /* m1=0 collect the size, m1=1 setup memory and initialize */
1914   if(n1>0){ /* if not global, process function interface */
1915    if(m1==0) scop[n1].nint++; /* number of parameters */
1916    else scop[n1].mem.bint[oint++]=i7;
1917    i7=0; /* number of parameters */
1918    k1=scop[n1].noderoot;
1919    if(produc[k1]==8){
1920     k1=child[k1];
1921     decltype=gsymbol[k1];
1922     switch(decltype){
1923      case 45: // char
1924       if(m1==0) scop[n1].nchar++;
1925       else scop[n1].offs[oident]=ochar++;
1926       break;
1927      case 51: // double
1928       if(m1==0) scop[n1].ndouble++;
1929       else scop[n1].offs[oident]=odouble++;
1930       break;
1931      case 62: // int
1932      case 78: // void
1933       if(m1==0) scop[n1].nint++;
1934       else scop[n1].offs[oident]=oint++;
1935       break;
1936     }
1937     k1=child[sibli[k1]]; /* identifier */
1938    } /* if(produc[k1]==8) */
1939    else if(produc[k1]==9){ /* without type */
1940     if(m1==0) scop[n1].nint++;
1941     else scop[n1].offs[oident]=oint++;
1942     decltype=62; /* default int */
1943     k1=child[child[k1]]; /* identifier */
1944    }
1945    if(m1==0) scop[n1].nident++; /* function name */
1946    else{
1947     scop[n1].ident[oident]=attri1[k1]; /* offset into ident[], ident in turn is offset to inpchar[] */
1948     switch(decltype){
1949      case 45:
1950       scop[n1].kind[oident]=1;
1951       break;
1952      case 51:
1953       scop[n1].kind[oident]=3;
1954       break;
1955      case 62:
1956       scop[n1].kind[oident]=4;
1957       break;
1958      case 78:
1959       scop[n1].kind[oident]=4;
1960       break;
1961     }
1962     oident++;
1963    }
1964    i7++;
1965    k1=parent[k1];
1966    if(produc[k1]==73){ /* parameter-type-list to follow */
1967     mpstk[0]=0;
1968     mpstk[1]=0;
1969     nmp=1;
1970     test=100;
1971     while(test--){note018
1972      if(k1<=0) break;
1973      for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0&&mpstk[2*i+1]==k1) break;
1974      if(i==0){ /* not return pass */
1975       if((i=child[k1])!=0){
1976        if(nmp!=1&&(j=sibli[k1])!=0){
1977         mpstk[nmp*2]=1; /* sibling node */
1978         mpstk[nmp*2+1]=j; /* jump node */
1979         nmp++;
1980         mpstk[nmp*2]=0; /* return node */
1981         mpstk[nmp*2+1]=k1; /* jump node */
1982         nmp++;
1983        }
1984        else{
1985         mpstk[nmp*2]=0; /* return node */
1986         mpstk[nmp*2+1]=k1; /* jump node */
1987         nmp++;
1988        }
1989        k1=i; /* jump to child */
1990       } /* if((i=child[k1])!=0) */
1991       else{ /* no child */
1992        j=gsymbol[k1];
1993        if(j==45||j==51||j==62){ /* char double int */
1994         mpstk[nmp*2]=3;  /* gsymbol */
1995         mpstk[nmp*2+1]=j; /* type */
1996         nmp++;
1997        }
1998        if(j==60){ /* identifier */
1999         mpstk[nmp*2]=7;
2000         mpstk[nmp*2+1]=attri1[k1];
2001         nmp++;
2002        }
2003        if((j=sibli[k1])!=0){
2004         k1=j;
2005        }
2006        else{ /* no child, no sibling */
2007         for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2008         k1=mpstk[2*i+1];
2009         if(mpstk[2*i]==1){ /* if sibling delete that node */
2010          for(j=i+1;i<nmp;i++){
2011           mpstk[(j-1)*2]=mpstk[j*2];
2012           mpstk[(j-1)*2+1]=mpstk[j*2+1];
2013          }
2014          nmp--;
2015         }
2016        } /* else */
2017       } /* else */
2018      } /* if(i==0) */
2019      else{ /* return pass */note019
2020       i1=i; /* remember pointer for return node k1 */
2021       j1=nmp; /* remember stack pointer */
2022       nmp=i; /* new stack pointer */
2023       switch(produc[k1]){
2024        case 72: /* id[] */
2025         mpstk[(nmp-1)*2+1]+=200; /* indicate pointer */
2026         mpstk[nmp*2]=mpstk[(i1+1)*2];
2027         mpstk[nmp*2+1]=mpstk[(i1+1)*2+1];
2028         nmp++;
2029         break;
2030        case 85:
2031         k1=0; /* force break */
2032         break;
2033        case 86:
2034         /* mpstk[2*i1+1]=return node, mpstk[2*(i1+1)+1]=type, mpstk[2*(i1+2)+1]=identifier */
2035         i=i1+1;
2036         switch(mpstk[2*i+1]){
2037          case 45: // char
2038           if(m1==0){
2039            scop[n1].nchar++;
2040            scop[n1].nident++;
2041           }
2042           else{
2043            scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2044            scop[n1].kind[oident]=1;
2045            scop[n1].offs[oident]=ochar++;
2046            oident++;
2047           }
2048           break;
2049          case 51: // double
2050           if(m1==0){
2051            scop[n1].ndouble++;
2052            scop[n1].nident++;
2053           }
2054           else{
2055            scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2056            scop[n1].kind[oident]=3;
2057            scop[n1].offs[oident]=odouble++;
2058            oident++;
2059           }
2060           break;
2061          case 62: // int
2062           if(m1==0){
2063            scop[n1].nint++;
2064            scop[n1].nident++;
2065           }
2066           else{
2067            scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2068            scop[n1].kind[oident]=4;
2069            scop[n1].offs[oident]=oint++;
2070            oident++;
2071           }
2072           break;
2073          case 245: // char
2074           if(m1==0){
2075            scop[n1].nint++;
2076            scop[n1].nident++;
2077           }
2078           else{
2079            scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2080            scop[n1].kind[oident]=7;
2081            scop[n1].offs[oident]=oint++;
2082            oident++;
2083           }
2084           break;
2085          case 251: // double
2086           if(m1==0){
2087            scop[n1].nint++;
2088            scop[n1].nident++;
2089           }
2090           else{
2091            scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2092            scop[n1].kind[oident]=11;
2093            scop[n1].offs[oident]=oint++;
2094            oident++;
2095           }
2096           break;
2097          case 262: // int
2098           if(m1==0){
2099            scop[n1].nint++;
2100            scop[n1].nident++;
2101           }
2102           else{
2103            scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2104            scop[n1].kind[oident]=12;
2105            scop[n1].offs[oident]=oint++; /* to be supplied by the calling program */
2106            oident++;
2107           }
2108           break;
2109          default:
2110           break;
2111         } /* switch(mpstk[2*i+1]) */
2112         i7++;
2113         break;
2114       } /* switch(produc[k1]) */
2115       for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2116       if(i>0){
2117        k1=mpstk[2*i+1];
2118        if(mpstk[2*i]==1||mpstk[2*i]==2){
2119         for(;i<nmp;i++){
2120          mpstk[2*i]=mpstk[2*(i+1)];
2121          mpstk[2*i+1]=mpstk[2*(i+1)+1];
2122         }
2123         nmp--;
2124        }
2125       } /* if(i>0) */
2126       else k1=0;
2127      } /* else */
2128     } /* while(test--) */
2129    } /*  if(produc[k1]==73) */
2130   } /* if(n1>0) */
2131   mpstk[0]=0;note020
2132   mpstk[1]=0;
2133   nmp=1;
2134   k1=scop[n1].nodedecl; /* start from declaration node */
2135  if(k1!=-1){
2136   test=1000;
2137   while(test--){
2138    if(k1<=0) break;
2139//    printf("**%i** %i ",k1,nmp);
2140//    for(i=0;i<nmp;i++) printf("%i-%i ",mpstk[2*i],mpstk[2*i+1]);
2141//    printf("\n");
2142    for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0&&mpstk[2*i+1]==k1) break;
2143    if(i==0){ /* not return pass */
2144     if((i=child[k1])!=0){ /* if there is a child, depth-first traversal jump to child */
2145      if(nmp!=1&&(j=sibli[k1])!=0){ /* if there is a sibling, push it so that it can be traversed later */
2146       mpstk[nmp*2]=1; /* sibling node */
2147       mpstk[nmp*2+1]=j; /* jmp node */
2148       nmp++;
2149      }
2150      mpstk[nmp*2]=0; /* return node */
2151      mpstk[nmp*2+1]=k1; /* jmp node */
2152      nmp++;
2153      k1=i; /* jmp to child */
2154     }
2155     else{ /* no child */
2156      j=gsymbol[k1];
2157      if(j==45||j==51||j==62){ /* char double or int */
2158       mpstk[nmp*2]=3; /* gsymbol */
2159       mpstk[nmp*2+1]=j; /* type */
2160       nmp++;
2161       decltype=j;
2162      }
2163      if(j==46){ /* character constant */
2164       mpstk[nmp*2]=4;
2165       mpstk[nmp*2+1]=attri1[k1];
2166       nmp++;
2167      }
2168      if(j==57){ /* floating constant */
2169       mpstk[nmp*2]=6;
2170       mpstk[nmp*2+1]=attri1[k1];
2171       nmp++;
2172      }
2173      if(j==60){ /* identifier */
2174       mpstk[nmp*2]=7;
2175       mpstk[nmp*2+1]=attri1[k1];
2176       nmp++;
2177      }
2178      if(j==63){ /* integer constant */
2179       mpstk[nmp*2]=5;
2180       mpstk[nmp*2+1]=attri1[k1];
2181       nmp++;
2182      }
2183      if((j=sibli[k1])!=0){
2184       k1=j;
2185      }
2186      else{ /* no child, no sibling */
2187       for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2188       k1=mpstk[2*i+1];
2189       if(mpstk[2*i]==1){ /* if sibling delete that node */
2190        for(j=i+1;i<nmp;i++){
2191         mpstk[(j-1)*2]=mpstk[j*2];
2192         mpstk[(j-1)*2+1]=mpstk[j*2+1];
2193        }
2194        nmp--;
2195       }
2196      } /* else */
2197     } /* else */
2198    } /* if(i==0) */
2199    else{ /* return pass - reduction by non-terminal */note021
2200     i1=i;
2201     j1=nmp;
2202     nmp=i;
2203     switch(produc[k1]){
2204      case 10:
2205       if(mpstk[(i1+2)*2]!=11){ /* single declaration */
2206        switch(decltype){
2207         case 45: // char
2208          if(m1==0){
2209           scop[n1].nchar++;
2210           scop[n1].nident++;
2211          }
2212          else{
2213           scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2214           scop[n1].kind[oident]=1;
2215           scop[n1].offs[oident++]=ochar++;
2216          }
2217          break;
2218         case 51: // double
2219          if(m1==0){
2220           scop[n1].ndouble++;
2221           scop[n1].nident++;
2222          }
2223          else{
2224           scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2225           scop[n1].kind[oident]=3;
2226           scop[n1].offs[oident++]=odouble++;
2227          }
2228          break;
2229         case 62: // int
2230          if(m1==0){
2231           scop[n1].nint++;
2232           scop[n1].nident++;
2233          }
2234          else{
2235           scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2236           scop[n1].kind[oident]=4;
2237           scop[n1].offs[oident++]=oint++;
2238          }
2239          break;
2240        } /* switch(decltype) */
2241       } /* if(mpstk[(i1+2)*2]!=11) */
2242       break;
2243      case 47:
2244       switch(decltype){
2245        case 45: // char
2246         if(m1==0){
2247          if(mpstk[2*(i1+2)]==11);
2248          else if(mpstk[2*(i1+1)]==11){ /* only second entry */
2249           scop[n1].nchar++;
2250           scop[n1].nident++;
2251          }
2252          else{ /* both entries */
2253           scop[n1].nchar+=2;
2254           scop[n1].nident+=2;
2255          }
2256          mpstk[2*nmp]=11; /* indicate the pocess finished */
2257          mpstk[2*nmp+1]=0; /* does not mean anything */
2258          nmp++;
2259         }
2260         else{
2261          if(mpstk[(i1+1)*2]!=11){
2262           scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2263           scop[n1].kind[oident]=1;
2264           scop[n1].offs[oident++]=ochar++;
2265          }
2266          if(mpstk[(i1+2)*2]!=11){
2267           scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2268           scop[n1].kind[oident]=1;
2269           scop[n1].offs[oident++]=ochar++;
2270          }
2271          mpstk[2*nmp]=11; /* indicate the pocess finished */
2272          mpstk[2*nmp+1]=0; /* does not mean anything */
2273          nmp++;
2274         }
2275         break;
2276        case 51: // double
2277         if(m1==0){
2278          if(mpstk[2*(i1+2)]==11);
2279          else if(mpstk[2*(i1+1)]==11){ /* only second entry */
2280           scop[n1].ndouble++;
2281           scop[n1].nident++;
2282          }
2283          else{ /* both entries */
2284           scop[n1].ndouble+=2;
2285           scop[n1].nident+=2;
2286          }
2287          mpstk[2*nmp]=11; /* indicate the pocess finished */
2288          mpstk[2*nmp+1]=0; /* does not mean anything */
2289          nmp++;
2290         }
2291         else{
2292          if(mpstk[(i1+1)*2]!=11){
2293           scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2294           scop[n1].kind[oident]=3;
2295           scop[n1].offs[oident++]=odouble++;
2296          }
2297          if(mpstk[(i1+2)*2]!=11){
2298           scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2299           scop[n1].kind[oident]=3;
2300           scop[n1].offs[oident++]=odouble++;
2301          }
2302          mpstk[2*nmp]=11; /* indicate the pocess finished */
2303          mpstk[2*nmp+1]=0; /* does not mean anything */
2304          nmp++;
2305         }
2306         break;
2307        case 62: // int
2308         if(m1==0){
2309          if(mpstk[2*(i1+2)]==11);
2310          else if(mpstk[2*(i1+1)]==11){ /* only second entry */
2311           scop[n1].nint++;
2312           scop[n1].nident++;
2313          }
2314          else{ /* both entries */
2315           scop[n1].nint+=2;
2316           scop[n1].nident+=2;
2317          }
2318          mpstk[2*nmp]=11; /* indicate the pocess finished */
2319          mpstk[2*nmp+1]=0; /* does not mean anything */
2320          nmp++;
2321         }
2322         else{
2323          if(mpstk[(i1+1)*2]!=11){
2324           scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2325           scop[n1].kind[oident]=4;
2326           scop[n1].offs[oident++]=oint++;
2327          }
2328          if(mpstk[(i1+2)*2]!=11){
2329           scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2330           scop[n1].kind[oident]=4;
2331           scop[n1].offs[oident++]=oint++;
2332          }
2333          mpstk[2*nmp]=11; /* indicate the pocess finished */
2334          mpstk[2*nmp+1]=0; /* does not mean anything */
2335          nmp++;
2336         }
2337         break;
2338        default:
2339         break;
2340       }
2341       break;
2342      case 71: /* id[i] */
2343       switch(decltype){
2344        case 45: // char
2345         if(m1==0){
2346           odata=scop[n1].nchar;
2347           scop[n1].nchar+=mpstk[(i1+2)*2+1];
2348           scop[n1].nstring++;
2349           scop[n1].nident++;
2350           mpstk[2*nmp]=11; /* indicate the pocess finished */
2351           mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
2352           nmp++;
2353         }
2354         else{
2355           scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2356           scop[n1].kind[oident]=2; /* to be looked at later */
2357           scop[n1].offs[oident++]=ostring;
2358           scop[n1].mem.bstring[ostring++]=ochar;
2359           ochar+=mpstk[(i1+2)*2+1];
2360           mpstk[2*nmp]=11; /* indicate the pocess finished */
2361           mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
2362           nmp++;
2363         }
2364         break;
2365        case 51: // double
2366         if(m1==0){
2367          if(mpstk[2*(i1+1)]==11){ /* multi-dimension */
2368           scop[n1].ndouble-=mpstk[(i1+1)*2+1];
2369           scop[n1].ndouble+=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1];
2370           mpstk[2*nmp]=11; /* indicate the pocess finished */
2371           mpstk[2*nmp+1]=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1]; /* amount added */
2372           nmp++;
2373          }
2374          else{
2375           odata=scop[n1].ndouble;
2376           scop[n1].ndouble+=mpstk[(i1+2)*2+1];
2377           scop[n1].ndarr++;
2378           scop[n1].nident++;
2379           mpstk[2*nmp]=11; /* indicate the process finished */
2380           mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
2381           nmp++;
2382          }
2383         }
2384         else{
2385          if(mpstk[2*(i1+1)]==11){ /* multi-dimension */
2386           scop[n1].mem.bdarr[odarr-1].dimen++;
2387           scop[n1].mem.bdarr[odarr-1].size[scop[n1].mem.bdarr[odarr-1].dimen-1]=mpstk[(i1+2)*2+1];
2388           odouble-=mpstk[(i1+1)*2+1];
2389           odouble+=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1];
2390           mpstk[2*nmp]=11; /* indicate the pocess finished */
2391           mpstk[2*nmp+1]=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1]; /* amount added */
2392           nmp++;
2393          }
2394          else{
2395           scop[n1].mem.bdarr[odarr].dimen=1;
2396           scop[n1].mem.bdarr[odarr].size[0]=mpstk[(i1+2)*2+1];
2397           scop[n1].mem.bdarr[odarr].dat=&scop[n1].mem.bdouble[odouble];
2398           scop[n1].mem.bdarr[odarr++].offs=odouble;
2399           scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2400           scop[n1].kind[oident]=5;
2401           scop[n1].offs[oident++]=odarr-1;
2402           odata=odouble; /* used at initialization */
2403           odouble+=mpstk[(i1+2)*2+1];
2404           mpstk[2*nmp]=11; /* indicate the process finished */
2405           mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
2406           nmp++;
2407          }
2408         }
2409         break;
2410        case 62: // int
2411         if(m1==0){
2412          if(mpstk[2*(i1+1)]==11){ /* multi-dimension */
2413           scop[n1].nint-=mpstk[(i1+1)*2+1];
2414           scop[n1].nint+=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1];
2415           mpstk[2*nmp]=11; /* indicate the pocess finished */
2416           mpstk[2*nmp+1]=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1]; /* amount added */
2417           nmp++;
2418          }
2419          else{
2420           odata=scop[n1].nint;
2421           scop[n1].nint+=mpstk[(i1+2)*2+1];
2422           scop[n1].niarr++;
2423           scop[n1].nident++;
2424           mpstk[2*nmp]=11; /* indicate the pocess finished */
2425           mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
2426           nmp++;
2427          }
2428         }
2429         else{
2430          if(mpstk[2*(i1+1)]==11){ /* multi-dimension */
2431           scop[n1].mem.biarr[oiarr-1].dimen++;
2432           scop[n1].mem.biarr[oiarr-1].size[scop[n1].mem.biarr[oiarr-1].dimen-1]=mpstk[(i1+2)*2+1];
2433           oint-=mpstk[(i1+1)*2+1];
2434           oint+=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1];
2435           mpstk[2*nmp]=11; /* indicate the pocess finished */
2436           mpstk[2*nmp+1]=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1]; /* amount added */
2437           nmp++;
2438          }
2439          else{
2440           scop[n1].mem.biarr[oiarr].dimen=1;
2441           scop[n1].mem.biarr[oiarr].size[0]=mpstk[(i1+2)*2+1];
2442           scop[n1].mem.biarr[oiarr].dat=&scop[n1].mem.bint[oint];
2443           scop[n1].mem.biarr[oiarr++].offs=oint;
2444           scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2445           scop[n1].kind[oident]=6; /* iarray */
2446           scop[n1].offs[oident++]=oiarr-1;
2447           odata=oint;
2448           oint+=mpstk[(i1+2)*2+1];
2449           mpstk[2*nmp]=11; /* indicate the pocess finished */
2450           mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
2451           nmp++;
2452          }
2453         }
2454         break;
2455        default:
2456         break;
2457       }
2458       break;
2459      case 72: /* id[] */
2460       if(m1==0){
2461        scop[n1].nident++;
2462        switch(decltype){
2463         case 45: // char
2464          odata=scop[n1].nchar;
2465          scop[n1].nstring++;
2466          break;
2467         case 51: // double
2468          scop[n1].ndarr++;
2469          odata=scop[n1].ndouble;
2470          break;
2471         case 62: // int
2472          scop[n1].niarr++;
2473          odata=scop[n1].nint;
2474          break;
2475         default:
2476          break;
2477        }
2478       }
2479       else{
2480        switch(decltype){
2481         case 45: // char
2482          scop[n1].mem.bstring[ostring]=ochar;
2483          scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2484          scop[n1].kind[oident]=7; // string
2485          scop[n1].offs[oident++]=ostring++;
2486          odata=ochar;
2487          break;
2488         case 51: // double
2489          scop[n1].mem.bdarr[odarr].dimen=1;
2490          scop[n1].mem.bdarr[odarr].size[0]=0;
2491          scop[n1].mem.bdarr[odarr].dat=&scop[n1].mem.bdouble[odouble];
2492          scop[n1].mem.bdarr[odarr++].offs=odouble;
2493          scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2494          scop[n1].kind[oident]=5; // darray
2495          scop[n1].offs[oident++]=odarr-1;
2496          odata=odouble;
2497          break;
2498         case 62: // int
2499          scop[n1].mem.biarr[oiarr].dimen=1;
2500          scop[n1].mem.biarr[oiarr].size[0]=0;
2501          scop[n1].mem.biarr[oiarr].dat=&scop[n1].mem.bint[oint];
2502          scop[n1].mem.biarr[oiarr++].offs=oint;
2503          scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
2504          scop[n1].kind[oident]=6;
2505          scop[n1].offs[oident++]=oiarr-1;
2506          odata=oint;
2507          break;
2508         default:
2509          break;
2510        }
2511       }
2512       break;
2513/*      case 92: ps */
2514/*      case 93: ps */
2515      case 95:
2516       switch(decltype){
2517        case 45: // char - to be worked later
2518         if(m1==0){
2519          if(mpstk[2*(i1+1)]==11){ /* only second entry */
2520           scop[n1].nchar++;
2521          }
2522          else{ /* both entries */
2523           scop[n1].nchar+=2;
2524          }
2525          mpstk[2*nmp]=11; /* indicate the pocess finished */
2526          mpstk[2*nmp+1]=0; /* does not mean anything */
2527          nmp++;
2528         }
2529         else{
2530          if(mpstk[2*(i1+1)]!=11) /* the first entry */
2531           scop[n1].mem.bchar[ochar++]=chcon[mpstk[(i1+1)*2+1]];
2532          scop[n1].mem.bchar[ochar++]=chcon[mpstk[(i1+2)*2+1]];
2533          mpstk[2*nmp]=11; /* indicate the pocess finished */
2534          mpstk[2*nmp+1]=0; /* does not mean anything */
2535          nmp++;
2536         }          
2537         break;
2538        case 51: // double
2539         if(m1==0){
2540          if(mpstk[2*(i1+1)]==11){ /* only second entry */
2541           odata++;
2542          }
2543          else{ /* both entries */
2544           odata+=2;
2545          }
2546          if(scop[n1].ndouble<odata) scop[n1].ndouble=odata;
2547          mpstk[2*nmp]=11; /* indicate the pocess finished */
2548          mpstk[2*nmp+1]=0; /* does not mean anything */
2549          nmp++;
2550         }
2551         else{
2552          if(mpstk[2*(i1+1)]!=11){ /* the first entry */
2553           scop[n1].mem.bdouble[odata++]=flcon[mpstk[(i1+1)*2+1]];
2554           if(odouble<odata) scop[n1].mem.bdarr[odarr-1].size[0]++;
2555          }
2556          scop[n1].mem.bdouble[odata++]=flcon[mpstk[(i1+2)*2+1]];
2557          if(odouble<odata) scop[n1].mem.bdarr[odarr-1].size[0]++;
2558          if(odouble<odata) odouble=odata;
2559          mpstk[2*nmp]=11; /* indicate the pocess finished */
2560          mpstk[2*nmp+1]=0; /* does not mean anything */
2561          nmp++;
2562         }          
2563         break;
2564        case 62: // int
2565         if(m1==0){
2566          if(mpstk[2*(i1+1)]==11){ /* only second entry */
2567           odata++;
2568          }
2569          else{ /* both entries */
2570           odata+=2;
2571          }
2572          if(scop[n1].nint<odata) scop[n1].nint=odata;
2573          mpstk[2*nmp]=11; /* indicate the pocess finished */
2574          mpstk[2*nmp+1]=0; /* does not mean anything */
2575          nmp++;
2576         }
2577         else{
2578          if(mpstk[2*(i1+1)]!=11){ /* the first entry */
2579           scop[n1].mem.bint[odata++]=mpstk[(i1+1)*2+1];
2580           if(oint<odata) scop[n1].mem.biarr[oiarr-1].size[0]++;
2581          }
2582          scop[n1].mem.bint[odata++]=mpstk[(i1+2)*2+1];
2583          if(oint<odata) scop[n1].mem.biarr[oiarr-1].size[0]++;
2584          if(oint<odata) oint=odata;
2585          mpstk[2*nmp]=11; /* indicate the pocess finished */
2586          mpstk[2*nmp+1]=0; /* does not mean anything */
2587          nmp++;
2588         }          
2589         break;
2590        default:
2591         break;
2592       }
2593       break;
2594      default:
2595       for(i=i1;i<j1-1;i++){
2596        mpstk[i*2]=mpstk[(i+1)*2];
2597        mpstk[i*2+1]=mpstk[(i+1)*2+1];
2598       }
2599       nmp=j1-1;
2600       break;
2601     }
2602     for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2603     if(i>0){
2604      k1=mpstk[2*i+1];
2605      if(mpstk[2*i]==1||mpstk[2*i]==2){
2606       for(;i<nmp;i++){
2607        mpstk[2*i]=mpstk[2*(i+1)];
2608        mpstk[2*i+1]=mpstk[2*(i+1)+1];
2609       }
2610       nmp--;
2611      }
2612     } /* if(i>0) */
2613     else k1=0;
2614    } /* else */
2615   } /* while(test--) */
2616  } /* if(k1!=-1) */
2617   if(m1==0){
2618//    printf("scop[%i].nchar=%i\n",n1,scop[n1].nchar);
2619//    printf("scop[%i].nstring=%i\n",n1,scop[n1].nstring);
2620//    printf("scop[%i].ndouble=%i\n",n1,scop[n1].ndouble);
2621//    printf("scop[%i].nint=%i\n",n1,scop[n1].nint);
2622//    printf("scop[%i].ndarr=%i\n",n1,scop[n1].ndarr);
2623//    printf("scop[%i].niarr=%i\n",n1,scop[n1].niarr);
2624//    printf("scop[%i].nident=%i\n",n1,scop[n1].nident);
2625    if(scop[n1].nchar==0) scop[n1].mem.bchar=NULL;
2626    else scop[n1].mem.bchar=(char *)malloc(sizeof(char)*scop[n1].nchar);
2627    if(scop[n1].nstring==0) scop[n1].mem.bstring=NULL;
2628    else scop[n1].mem.bstring=(int *)malloc(sizeof(int)*scop[n1].nstring);
2629    if(scop[n1].ndouble==0) scop[n1].mem.bdouble=NULL;
2630    else scop[n1].mem.bdouble=(double *)malloc(sizeof(double)*scop[n1].ndouble);
2631    if(scop[n1].nint==0) scop[n1].mem.bint=NULL;
2632    else scop[n1].mem.bint=(int *)malloc(sizeof(int)*scop[n1].nint);
2633    if(scop[n1].ndarr==0) scop[n1].mem.bdarr=NULL;
2634    else scop[n1].mem.bdarr=(darray *)malloc(sizeof(darray)*scop[n1].ndarr);
2635    if(scop[n1].niarr==0) scop[n1].mem.biarr=NULL;
2636    else scop[n1].mem.biarr=(iarray *)malloc(sizeof(iarray)*scop[n1].niarr);
2637    if(scop[n1].nident==0){
2638     scop[n1].ident=NULL;
2639     scop[n1].kind=NULL;
2640     scop[n1].offs=NULL;
2641    }
2642    else{
2643     scop[n1].ident=(int *)malloc(sizeof(int)*scop[n1].nident);
2644     scop[n1].kind=(int *)malloc(sizeof(int)*scop[n1].nident);
2645     scop[n1].offs=(int *)malloc(sizeof(int)*scop[n1].nident);
2646    }
2647    if(n1==0){
2648     mem[0]=&scop[n1].mem; /* global */
2649     mem[0]->scop=0;
2650     }
2651    if(strcmp(scop[n1].name,"main")==0){
2652     mem[1]=&scop[n1].mem; /* main */
2653     mem[1]->scop=n1;
2654     nmem=2; /* memory stack pointer */
2655    }
2656   } /* if(m1==0) */
2657  } /*  for(m1=0;m1<2;m1++) */
2658 } /*  for(n1=0;n1<nscop;n1++) */
2659
2660 mem[0]->schar=0;
2661 mem[0]->sstring=0;
2662 mem[0]->sdouble=0;
2663 mem[0]->sint=0;
2664 mem[0]->sdarr=0;
2665 mem[0]->siarr=0;
2666 mem[1]->schar=scop[0].nchar;
2667 mem[1]->sstring=scop[0].nstring;
2668 mem[1]->sdouble=scop[0].ndouble;
2669 mem[1]->sint=scop[0].nint;
2670 mem[1]->sdarr=scop[0].ndarr;
2671 mem[1]->siarr=scop[0].niarr;
2672note022
2673 mpstk[0]=0; /* 0:return node 1:sibling node 2:loop control node */
2674 mpstk[1]=0; /* terminate marker */
2675 nmp=1; /* the next stack entry begins at nmp*2 */
2676 for(i=0;i<nscop;i++)
2677  if(strcmp(scop[i].name,"main")==0) break;
2678 k1=scop[i].nodeexec; /* start parse tree node - ***EXECUTION STARTS HERE*** */
2679 test=MAXNOD;
2680 for(i=0;i<10;i++) jmpcnt[i]=0;
2681 njp=0; /* jump control depth */
2682 jmpcnt[njp]=0; /* jump control */
2683
2684 while(test--){
2685#ifndef CGI
2686  printf("**%i** %i ",k1,nmp);
2687  for(i=0;i<nmp;i++) printf("%i-%i ",mpstk[2*i],mpstk[2*i+1]);
2688  printf("\n");
2689#endif
2690  if(k1==0) break; /* terminate execution */
2691  if(nmp>(MAXNMP/2-3)){
2692   contype(0);
2693   printf("max stack depth\n");
2694   exit(0);
2695  }
2696  j=0; /* can be new control */
2697  if(k1<0){
2698   k1=-k1;
2699   j=1;
2700  }
2701  for(i=nmp-1;i>0;i--){
2702   if(mpstk[2*i]==10&&mpstk[2*(i-1)+1]!=k1) i=1;
2703   else if(mpstk[2*i]==0&&mpstk[2*i+1]==k1) break;
2704  }
2705  if(i==0){ /* not return pass */note023
2706   switch (produc[k1]){ /* intercept controls */
2707    case 127: /* if statement */
2708    case 128:
2709     if(j==0) jmpcnt[++njp]=0; /* new entry */
2710     switch(jmpcnt[njp]){
2711      case 0: /* first entry */
2712       mpstk[nmp*2]=2;
2713       mpstk[nmp*2+1]=-k1;
2714       nmp++;
2715       k1=sibli[sibli[child[k1]]]; /* conditional statement */
2716       jmpcnt[njp]=1;
2717       break;
2718      case 1: /* branch test */
2719       nmp--;
2720       if(mpstk[(nmp)*2+1]){ /* execute */
2721        mpstk[nmp*2]=2;
2722        mpstk[nmp*2+1]=-k1;
2723        nmp++;
2724        k1=sibli[sibli[child[k1]]];
2725        k1=sibli[sibli[k1]];
2726        jmpcnt[njp]=2;
2727       }
2728       else if(produc[k1]==127){
2729        if((j=sibli[k1])!=0){
2730         k1=j;
2731        }
2732        else{ /* no child, no sibling */
2733         for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2734         k1=mpstk[2*i+1];
2735         if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
2736          for(;i<nmp;i++){
2737           mpstk[i*2]=mpstk[(i+1)*2];
2738           mpstk[i*2+1]=mpstk[(i+1)*2+1];
2739          }
2740          nmp--;
2741         }
2742        } /* else */
2743        jmpcnt[njp]=0;
2744        njp--;
2745       }
2746       else{
2747        mpstk[nmp*2]=2;
2748        mpstk[nmp*2+1]=-k1;
2749        nmp++;
2750        k1=sibli[sibli[child[k1]]];
2751        k1=sibli[sibli[k1]];
2752        k1=sibli[sibli[k1]];
2753        jmpcnt[njp]=2;
2754       }
2755       break;
2756      case 2: /* get out */
2757       if((j=sibli[k1])!=0){
2758        k1=j;
2759       }
2760       else{ /* no child, no sibling */
2761        for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2762        k1=mpstk[2*i+1];
2763        if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
2764         for(;i<nmp;i++){
2765          mpstk[i*2]=mpstk[(i+1)*2];
2766          mpstk[i*2+1]=mpstk[(i+1)*2+1];
2767         }
2768         nmp--;
2769        }
2770       } /* else */
2771       jmpcnt[njp]=0;
2772       njp--;
2773       break;
2774      default:
2775       k1=0;
2776       break;
2777      }
2778     break;
2779    case 133:
2780    case 134:
2781    case 135:
2782    case 136:
2783    case 137:
2784    case 138:
2785    case 139:
2786     contype(0);
2787     printf("this form of for not implementd\n");
2788     exit(0);      
2789    case 132: /* iteration-statement for */
2790     if(j==0){
2791      njp++;
2792      jmpcnt[njp]=0;
2793     }
2794     switch(jmpcnt[njp]){
2795      case 0: /* first entry */
2796       mpstk[nmp*2]=2;
2797       mpstk[nmp*2+1]=-k1;
2798       nmp++;
2799       k1=sibli[sibli[child[k1]]]; /* first arg */
2800       jmpcnt[njp]=1;
2801       break;
2802      case 1: /* relational condition */
2803       if(mpstk[(nmp-1)*2]==6) nmp--; // erase post-increment
2804       mpstk[nmp*2]=2;
2805       mpstk[nmp*2+1]=-k1;
2806       nmp++;
2807       k1=sibli[sibli[child[k1]]];
2808       k1=sibli[sibli[k1]]; /* second arg */
2809       jmpcnt[njp]=2;
2810       break;
2811      case 2: /* branch test */
2812       nmp--;
2813       if(mpstk[(nmp)*2+1]){ /* execute */
2814        mpstk[nmp*2]=2;
2815        mpstk[nmp*2+1]=-k1;
2816        nmp++;
2817        k1=sibli[sibli[child[k1]]];
2818        k1=sibli[sibli[k1]];
2819        k1=sibli[sibli[k1]];
2820        k1=sibli[sibli[k1]];
2821        jmpcnt[njp]=3;
2822       }
2823       else{
2824        if((j=sibli[k1])!=0){
2825         k1=j;
2826        }
2827        else{ /* no child, no sibling */
2828         for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2829         k1=mpstk[2*i+1];
2830         if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
2831          for(;i<nmp;i++){
2832           mpstk[i*2]=mpstk[(i+1)*2];
2833           mpstk[i*2+1]=mpstk[(i+1)*2+1];
2834          }
2835          nmp--;
2836         }
2837        } /* else */
2838        jmpcnt[njp]=0;
2839        njp--;
2840       }
2841       break;
2842      case 3: /* increment loop index */
2843       mpstk[nmp*2]=2;
2844       mpstk[nmp*2+1]=-k1;
2845       nmp++;
2846       k1=sibli[sibli[child[k1]]];
2847       k1=sibli[sibli[k1]];
2848       k1=sibli[sibli[k1]];
2849       jmpcnt[njp]=1;
2850       break;
2851      default:
2852       k1=0;
2853       break;
2854      }
2855     break;
2856    default:
2857     i=1;
2858     break;
2859   }
2860   if(i==1){ /* not controls */
2861    if((i=child[k1])!=0){
2862     if((j=sibli[k1])!=0){
2863      mpstk[nmp*2]=1; /* sibling node */
2864      mpstk[nmp*2+1]=j; /* jmp node */
2865      nmp++;
2866      mpstk[nmp*2]=0; /* return node */
2867      mpstk[nmp*2+1]=k1; /* jmp node */
2868      nmp++;
2869     }
2870     else{
2871      mpstk[nmp*2]=0; /* return node */
2872      mpstk[nmp*2+1]=k1; /* jmp node */
2873      nmp++;
2874     }
2875     k1=i; /* jump to child */
2876    } /* if((i=child[k1])!=0) */
2877    else{ /* no child */
2878     j=gsymbol[k1];
2879     if(j==45||j==51||j==62){ /* char double int */
2880      mpstk[nmp*2]=3; /* gsymbol */
2881      mpstk[nmp*2+1]=j; /* type */
2882      nmp++;
2883     }
2884     else if(j==11||j==13||j==17||j==23||j==27||j==30||j==31||j==32||j==33||j==34){
2885      mpstk[nmp*2]=3; /* gsymbol */
2886      mpstk[nmp*2+1]=j; /* binary operator */
2887      nmp++;
2888     }
2889     else if(j==5||j==12||j==15||j==19||j==24){
2890      mpstk[nmp*2]=3; /* gsymbol */
2891      mpstk[nmp*2+1]=j; /* assignment operator */
2892      nmp++;
2893     }
2894     else if(j==46){ /* character constant */
2895      mpstk[nmp*2]=4; /* attri1[node] */
2896      mpstk[nmp*2+1]=attri1[k1]; /* offset into chcon could this be changed to offset into inpchar? */
2897      nmp++;
2898     }
2899     if(j==57){ /* floating constant */
2900      mpstk[nmp*2]=5; /* double */
2901      mpstk[nmp*2+1]=attri1[k1]; /* index into flcon[] */
2902      nmp++;
2903     }
2904     if(j==60){ /* identifier */
2905      k=attri1[k1]; /* attribute for k1 */
2906/* convert identifier to mpstk information */
2907      m1=nmem-1;
2908      l=mem[m1]->scop;
2909      for(l1=1;l1<scop[l].nident;l1++) if(scop[l].ident[l1]==k) break; /* excl fname */
2910      if(l1==scop[l].nident){
2911       m1=0;
2912       l=mem[m1]->scop;
2913       for(l1=0;l1<scop[l].nident;l1++) if(scop[l].ident[l1]==k) break;
2914       if(l1==scop[l].nident) l1=-1;
2915      }
2916      if(l1==-1){ // function name
2917       mpstk[nmp*2]=7;
2918       mpstk[nmp*2+1]=k;
2919      }
2920      else{
2921       mpstk[nmp*2]=scop[l].kind[l1];
2922       if(m1==0) mpstk[nmp*2]+=40; /* global */
2923       else mpstk[nmp*2]+=20; /* current scope */
2924       mpstk[nmp*2+1]=scop[l].offs[l1];
2925      }
2926      nmp++;
2927     }
2928     if(j==63){ /* integer constant */
2929      mpstk[nmp*2]=6; /* int */
2930      mpstk[nmp*2+1]=attri1[k1]; /* integer value */
2931      nmp++;
2932     }
2933     if((j=sibli[k1])!=0){
2934      k1=j;
2935     }
2936     else{ /* no child, no sibling */
2937      for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2938      k1=mpstk[2*i+1];
2939      if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
2940       for(;i<nmp;i++){
2941        mpstk[i*2]=mpstk[(i+1)*2];
2942        mpstk[i*2+1]=mpstk[(i+1)*2+1];
2943       }
2944       nmp--;
2945      }
2946     } /* else */
2947    } /* else */
2948   } /* if(i==1) not jump control */
2949  } /* if(i==0) */
2950  else{ /* return pass - reduction by non-terminal           */note024
2951   /* this return node is on the i-th stack.                 */
2952   /* as the data is no more needed, nmp is tentatively      */
2953   /* set to i.                                              */
2954   /* if data propagated on to this pass are to be accessed, */
2955   /* old stack pointer which is saved in j1 may be used.    */
2956   /* data to be propagated should be put into stack and     */
2957   /* increment nmp as needed                                */
2958   i1=i; /* remember pointer for return node k1 */
2959   j1=nmp; /* remember stack pointer */
2960   nmp=i; /* new stack pointer */
2961   switch (produc[k1]){
2962    case 1: /* */
2963     break;
2964    case 2: /* */
2965     break;
2966    case 3: /* */
2967     break;
2968    case 4: /* */
2969     break;
2970    case 5: /* */
2971     break;
2972    case 6: /* */
2973     break;
2974    case 7: /* */
2975     break;
2976    case 9: /* */
2977     break;
2978    case 11: /* */
2979     break;
2980    case 12: /* */
2981     break;
2982    case 14: /* */
2983     break;
2984    case 15: /* */
2985     break;
2986    case 16: /* */
2987     break;
2988    case 17: /* */
2989     break;
2990    case 18: /* */
2991     break;
2992    case 19: /* */
2993     break;
2994    case 20: /* */
2995     break;
2996    case 34: /* */
2997     break;
2998    case 35: /* */
2999     break;
3000    case 39: /* */
3001     break;
3002    case 40: /* */
3003     break;
3004    case 41: /* */
3005     break;
3006    case 44: /* */
3007     break;
3008    case 45: /* */
3009     break;
3010    case 46: /* */
3011     break;
3012    case 48: /* */
3013     break;
3014    case 50: /* */
3015     break;
3016    case 51: /* */
3017     break;
3018    case 52: /* */
3019     break;
3020    case 53: /* */
3021     break;
3022    case 54: /* */
3023     break;
3024    case 55: /* */
3025     break;
3026    case 56: /* */
3027     break;
3028    case 57: /* */
3029     break;
3030    case 58: /* */
3031     break;
3032    case 59: /* */
3033     break;
3034    case 60: /* */
3035     break;
3036    case 61: /* */
3037     break;
3038    case 62: /* */
3039     break;
3040    case 63: /* */
3041     break;
3042    case 64: /* */
3043     break;
3044    case 66: /* */
3045     break;
3046    case 67: /* */
3047     break;
3048    case 68: /* */
3049     break;
3050    case 70: /* */
3051     break;
3052    case 71: /* */
3053     break;
3054    case 74: /* */
3055     break;
3056    case 75: /* */
3057     break;
3058    case 76: /* */
3059     break;
3060    case 78: /* */
3061     break;
3062    case 79: /* */
3063     break;
3064    case 80: /* */
3065     break;
3066    case 81: /* */
3067     break;
3068    case 82: /* */
3069     break;
3070    case 83: /* */
3071     break;
3072    case 84: /* */
3073     break;
3074    case 87: /* */
3075     break;
3076    case 88: /* */
3077     break;
3078    case 90: /* */
3079     break;
3080    case 91: /* */
3081     break;
3082    case 93: /* */
3083     break;
3084    case 94: /* */
3085     break;
3086    case 96: /* */
3087     break;
3088    case 97: /* */
3089     break;
3090    case 98: /* */
3091     break;
3092    case 99: /* */
3093     break;
3094    case 100: /* */
3095     break;
3096    case 101: /* */
3097     break;
3098    case 102: /* */
3099     break;
3100    case 103: /* */
3101     break;
3102    case 104: /* */
3103     break;
3104    case 105: /* */
3105     break;
3106    case 106: /* */
3107     break;
3108    case 107: /* */
3109     break;
3110    case 108: /* */
3111     break;
3112    case 109: /* */
3113     break;
3114    case 110: /* */
3115     break;
3116    case 111: /* */
3117     break;
3118    case 112: /* */
3119     break;
3120    case 113: /* */
3121     break;
3122    case 114: /* */
3123     break;
3124    case 115: /* */
3125     break;
3126    case 116: /* */
3127     break;
3128    case 117: /* */
3129     break;
3130    case 118: /* */
3131     break;
3132    case 119: /* */
3133     break;
3134    case 121: /* */
3135     break;
3136    case 122: /* */
3137     break;
3138    case 123: /* */
3139     break;
3140    case 124: /* */
3141     break;
3142    case 125: /* */
3143     break;
3144    case 126: /* */
3145     break;
3146    case 140: /* */
3147     break;
3148    case 141: /* */
3149     break;
3150    case 142: /* break */
3151     for(i=nmp-1;i>0;i--) if(mpstk[2*i]==2) break;
3152     nmp=i+1;
3153     break;
3154    case 143: /* */
3155     break;
3156    case 144: /* return */
3157     for(i=nmp-1;i>0;i--) if(mpstk[2*i]==10) break;
3158     nmp=i+1;
3159     break;
3160    case 145: /* */
3161     break;
3162    case 146: /* */
3163     break;
3164    case 147: /* */
3165     break;
3166    case 148: /* */note025
3167     switch(mpstk[(i1+3)*2]){ /* right-hand side */
3168      case 5: /* flcon */
3169       d1=flcon[mpstk[(i1+3)*2+1]];
3170       break;
3171      case 6: /* int const */
3172       d1=mpstk[(i1+3)*2+1];
3173       break;
3174      case 8: /* double dstk[] */
3175       d1=dstk[mpstk[(i1+3)*2+1]];
3176       break;
3177      case 23: /* current memory.bdouble */
3178       d1=mem[nmem-1]->bdouble[mpstk[(i1+3)*2+1]];
3179       break;
3180      case 24: /* current memory.bint */
3181       d1=mem[nmem-1]->bint[mpstk[(i1+3)*2+1]];
3182       break;
3183      case 43: /* global memory.bdouble */
3184       d1=mem[0]->bdouble[mpstk[(i1+3)*2+1]];
3185       break;
3186      case 44: /* global memory.bint */
3187       for(i=nmem-1;i>=0;i--)
3188        if(mem[i]->sint<=mpstk[(i1+3)*2+1]) break;
3189       d1=mem[i]->bint[mpstk[(i1+3)*2+1]-mem[i]->sint];
3190       break;
3191/* to be added later */
3192      default:
3193       contype(1);
3194       exit(0);
3195     }
3196     if(mpstk[(i1+2)*2+1]==31){ /* = */
3197      switch(mpstk[(i1+1)*2]){ /* left-hand side */
3198       case 8: /* double dstk[] */
3199        dstk[mpstk[(i1+1)*2+1]]=d1;
3200        break;
3201       case 23: /* current memory.bdouble */
3202        mem[nmem-1]->bdouble[mpstk[(i1+1)*2+1]]=d1;
3203        break;
3204       case 24: /* current memory.bint */
3205        mem[nmem-1]->bint[mpstk[(i1+1)*2+1]]=d1;
3206        break;
3207       case 43: /* global memory.bdouble */
3208        mem[0]->bdouble[mpstk[(i1+1)*2+1]]=d1;
3209        break;
3210       case 44: /* global memory.bint */
3211        for(i=nmem-1;i>=0;i--)
3212         if(mem[i]->sint<=mpstk[(i1+1)*2+1]) break;
3213        i3=mem[i]->bint[mpstk[(i1+1)*2+1]-mem[i]->sint]=d1;
3214        break;
3215/* to be added later */
3216      default:
3217       contype(1);
3218       exit(0);       
3219      }
3220     }
3221     else {
3222      switch(mpstk[(i1+1)*2]){ /* left-hand side */
3223       case 8: /* double dstk[] */
3224        d2=dstk[mpstk[(i1+1)*2+1]];
3225        break;
3226       case 23: /* current memory.bdouble */
3227        d2=mem[nmem-1]->bdouble[mpstk[(i1+1)*2+1]];
3228        break;
3229       case 24: /* current memory.bint */
3230        d2=mem[nmem-1]->bint[mpstk[(i1+1)*2+1]];
3231        break;
3232       case 43: /* global memory.bdouble */
3233        d2=mem[0]->bdouble[mpstk[(i1+1)*2+1]];
3234        break;
3235       case 44: /* global memory.bint */
3236        for(i=nmem-1;i>=0;i--)
3237         if(mem[i]->sint<=mpstk[(i1+1)*2+1]) break;
3238        d2=mem[i]->bint[mpstk[(i1+1)*2+1]-mem[i]->sint];
3239        break;
3240/* to be added later */
3241       default:
3242        contype(1);
3243        exit(0);
3244      }
3245      i3=d1;
3246      i4=d2;
3247      switch(mpstk[(i1+2)*2+1]){ /* operator */
3248       case 12: // *=
3249        d2*=d1;
3250        break;
3251       case 24: // /=
3252        d2/=d1;
3253        break;
3254       case 5: // %=
3255        i4%=i3;
3256        d2=i4;
3257        break;
3258       case 15: // +=
3259        d2+=d1;
3260        break;
3261       case 19: // -=
3262        d2-=d1;
3263       case 29: // <<=
3264        i4<<=i3;
3265        d2=i4;
3266        break;
3267       case 36: // >>=
3268        i4>>=i3;
3269        d2=i4;
3270        break;
3271       case 8: // &=
3272        i4&=i3;
3273        d2=i4;
3274        break;
3275       case 41: // ^=
3276        i4^=i3;
3277        d2=i4;
3278        break;
3279       case 83: // |=
3280        i4|=i3;
3281        d2=i4;
3282        break;
3283     }  
3284      switch(mpstk[(i1+1)*2]){ /* left-hand side */
3285       case 8: /* double dstk[] */
3286        dstk[mpstk[(i1+1)*2+1]]=d2;
3287        break;
3288       case 23: /* current memory.bdouble */
3289        mem[nmem-1]->bdouble[mpstk[(i1+1)*2+1]]=d2;
3290printf("d2=%f\n",d2);
3291        break;
3292       case 24: /* current memory.bint */
3293        mem[nmem-1]->bint[mpstk[(j1-3)*2+1]]=d2;
3294        break;
3295       case 43: /* global memory.bdouble */
3296        mem[0]->bdouble[mpstk[(i1+1)*2+1]]=d2;
3297        break;
3298       case 44: /* global memory.bint */
3299        for(i=nmem-1;i>=0;i--)
3300         if(mem[i]->sint<=mpstk[(j1-3)*2+1]) break;
3301        mem[i]->bint[mpstk[(j1-3)*2+1]-mem[i]->sint]=d2;
3302        break;
3303/* to be added later */
3304      }
3305     }
3306/* should i push the result here? */
3307     break;
3308    case 161: /* */
3309     if(mpstk[(i1+1)*2+1]){
3310      mpstk[nmp*2]=mpstk[(i1+3)*2];
3311      mpstk[nmp*2+1]=mpstk[(i1+3)*2+1];
3312     }
3313     else{
3314      mpstk[nmp*2]=mpstk[(i1+4)*2];
3315      mpstk[nmp*2+1]=mpstk[(i1+4)*2+1];
3316     }
3317     nmp++;
3318     break;
3319    case 164: /* */
3320     mpstk[nmp*2]=6;
3321     mpstk[nmp*2+1]=mpstk[(i1+1)*2+1]||mpstk[(i1+3)+1];
3322     nmp++;
3323     break;
3324    case 166: /* */
3325     mpstk[nmp*2]=6;
3326     mpstk[nmp*2+1]=mpstk[(i1+1)*2+1]&&mpstk[(i1+3)+1];
3327     nmp++;
3328     break;
3329    case 168: /* | */
3330     break;
3331    case 170: /* ^ */
3332     break;
3333    case 172: /* & */
3334     break;
3335    case 174: /* == */
3336    case 175: /* != */
3337    case 177: /* < */
3338    case 178: /* > */
3339    case 179: /* <= */
3340    case 180: /* >= */note026
3341     switch(mpstk[(j1-3)*2]){
3342      case 5: /* flcon */
3343       d1=flcon[mpstk[(j1-3)*2+1]];
3344       break;
3345      case 6: /* int const */
3346       d1=mpstk[(j1-3)*2+1];
3347       break;
3348      case 8: /* double dstk[] */
3349       d1=dstk[mpstk[(j1-3)*2+1]];
3350       break;
3351      case 23: /* current memory.bdouble */
3352       d1=mem[nmem-1]->bdouble[mpstk[(j1-3)*2+1]];
3353       break;
3354      case 24: /* current memory.bint */
3355       d1=mem[nmem-1]->bint[mpstk[(j1-3)*2+1]];
3356       break;
3357      case 43: /* global memory.bdouble */
3358       d1=mem[0]->bdouble[mpstk[(j1-3)*2+1]];
3359       break;
3360      case 44: /* global memory.bint */
3361       for(i=nmem-1;i>=0;i--)
3362        if(mem[i]->sint<=mpstk[(j1-3)*2+1]) break;
3363       d1=mem[i]->bint[mpstk[(j1-3)*2+1]-mem[i]->sint];
3364       break;
3365/* to be added later */
3366      default:
3367       contype(1);
3368       exit(0);
3369     }
3370     switch(mpstk[(j1-1)*2]){
3371      case 5: /* flcon */
3372       d2=flcon[mpstk[(j1-1)*2+1]];
3373       break;
3374      case 6: /* int const */
3375       d2=mpstk[(j1-1)*2+1];
3376       break;
3377      case 8: /* double dstk[] */
3378       d2=dstk[mpstk[(j1-1)*2+1]];
3379       break;
3380      case 23: /* current memory.bdouble */
3381       d2=mem[nmem-1]->bdouble[mpstk[(j1-1)*2+1]];
3382       break;
3383      case 24: /* current memory.bint */
3384       d2=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
3385       break;
3386      case 43: /* global memory.bdouble */
3387       d2=mem[0]->bdouble[mpstk[(j1-1)*2+1]];
3388       break;
3389      case 44: /* global memory.bint */
3390       for(i=nmem-1;i>=0;i--)
3391        if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
3392       d2=mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint];
3393       break;
3394/* to be added later */
3395      default:
3396       contype(1);
3397       exit(0);
3398     }
3399     i=0; /* FALSE */
3400     switch(mpstk[(j1-2)*2+1]){
3401      case 3:
3402       if(d1!=d2) i=1;
3403       break;
3404      case 27:
3405       if(d1<d2) i=1;
3406       break;
3407      case 30:
3408       if(d1<=d2) i=1;
3409       break;
3410      case 32:
3411       if(d1==d2) i=1;
3412       break;
3413      case 33:
3414       if(d1>d2) i=1;
3415       break;
3416      case 34:
3417       if(d1>=d2) i=1;
3418       break;
3419     }
3420     mpstk[nmp*2]=6;
3421     mpstk[nmp*2+1]=i;
3422     nmp++;
3423     break;
3424    case 182: /* << */
3425     break;
3426    case 183: /* >> */
3427     break;
3428    case 185: /* + */
3429    case 186: /* - */
3430    case 188: /* multiply */
3431    case 189: /* divide */
3432    case 190: /* % */note027
3433     i=1; /* int */
3434     switch(mpstk[(j1-3)*2]){
3435      case 5: /* flcon */
3436       d1=flcon[mpstk[(j1-3)*2+1]];
3437       i=0;
3438       break;
3439      case 6: /* int const */
3440       d1=mpstk[(j1-3)*2+1];
3441       break;
3442      case 8: /* double dstk[] */
3443       d1=dstk[mpstk[(j1-3)*2+1]];
3444       i=0;
3445       break;
3446      case 23: /* current memory.bdouble */
3447       d1=mem[nmem-1]->bdouble[mpstk[(j1-3)*2+1]];
3448       i=0;
3449       break;
3450      case 24: /* current memory.bint */
3451       d1=mem[nmem-1]->bint[mpstk[(j1-3)*2+1]];
3452       break;
3453      case 43: /* global memory.bdouble */
3454       d1=mem[0]->bdouble[mpstk[(j1-3)*2+1]];
3455       i=0;
3456       break;
3457      case 44: /* global memory.bint */
3458       for(i=nmem-1;i>=0;i--)
3459        if(mem[i]->sint<=mpstk[(j1-3)*2+1]) break;
3460       d1=mem[i]->bint[mpstk[(j1-3)*2+1]-mem[i]->sint];
3461       break;
3462/* to be added later */
3463      default:
3464       contype(1);
3465       exit(0);
3466     }
3467     switch(mpstk[(j1-1)*2]){
3468      case 5: /* flcon */
3469       d2=flcon[mpstk[(j1-1)*2+1]];
3470       i=0;
3471       break;
3472      case 6: /* int const */
3473       d2=mpstk[(j1-1)*2+1];
3474       break;
3475      case 8: /* double dstk[] */
3476       d2=dstk[mpstk[(j1-1)*2+1]];
3477       i=0;
3478       break;
3479      case 23: /* current memory.bdouble */
3480       d2=mem[nmem-1]->bdouble[mpstk[(j1-1)*2+1]];
3481       i=0;
3482       break;
3483      case 24: /* current memory.bint */
3484       d2=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
3485       break;
3486      case 43: /* global memory.bdouble */
3487       d2=mem[0]->bdouble[mpstk[(j1-1)*2+1]];
3488       i=0;
3489       break;
3490      case 44: /* global memory.bint */
3491       for(i=nmem-1;i>=0;i--)
3492        if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
3493       d2=mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint];
3494       break;
3495/* to be added later */
3496      default:
3497       contype(1);
3498       exit(0);
3499     }
3500     switch(mpstk[(j1-2)*2+1]){
3501      case 4: // %
3502       i3=d1;
3503       i4=d2;
3504       i3%=i4;
3505       d1=i3;
3506       break;
3507      case 11: /* multiply */
3508       d1*=d2;
3509       break;
3510      case 13: /* plus */
3511       d1+=d2;
3512       break;
3513      case 17: /* minus */
3514       d1-=d2;
3515       break;
3516      case 23: /* divide */
3517       if(d2==0.){
3518        contype(0);
3519        printf("Divide by 0\n");
3520        exit(0);
3521       }
3522       d1/=d2;
3523       break;
3524     }
3525     if(i==1){
3526      i=d1;
3527      mpstk[nmp*2]=6;  // integer
3528      mpstk[nmp*2+1]=i;
3529     }
3530     else{
3531      mpstk[nmp*2]=8;
3532      for(j=nmp-1;j>0;j--) if(mpstk[j*2]==8) break;
3533      if(j==0) mpstk[nmp*2+1]=0;
3534      else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
3535      dstk[mpstk[nmp*2+1]]=d1;
3536     }
3537     nmp++;
3538     break;
3539    case 192: /* type cast */
3540     break;
3541    case 194: /* pre-increment */
3542    case 195: /* pre-decrement */
3543     switch(mpstk[(j1-1)*2]){
3544      case 24: /* current memory.bint */
3545       i3=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
3546       break;
3547      case 44: /* global memory.bint */
3548       for(i=nmem-1;i>=0;i--)
3549        if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
3550       i3=mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint];
3551       break;
3552/* to be added later */
3553      default:
3554       contype(1);
3555       exit(0);
3556     }
3557     if(produc[k1]==194) i3++;
3558     else i3--;
3559     switch(mpstk[(j1-1)*2]){
3560      case 24: /* current memory.bint */
3561       mem[nmem-1]->bint[mpstk[(j1-1)*2+1]]=i3;
3562       break;
3563      case 44: /* global memory.bint */
3564       for(i=nmem-1;i>=0;i--)
3565        if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
3566       mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint]=i3;
3567       break;
3568/* to be added later */
3569     }
3570     mpstk[2*nmp]=6;
3571     mpstk[2*nmp+1]=i3;
3572     nmp++;
3573     break;
3574    case 196: /* unary processing */note028
3575     i=1;
3576     switch(mpstk[(j1-1)*2]){
3577      case 6: /* int */
3578       d2=mpstk[(j1-1)*2+1];
3579       break;
3580      case 5: /* double flcon[] */
3581       d2=flcon[mpstk[(j1-1)*2+1]];
3582       i=0;
3583       break;
3584      case 8: /* double dstk[] */
3585       d2=dstk[mpstk[(j1-1)*2+1]];
3586       i=0;
3587       break;
3588      case 23: /* current memory.bdouble */
3589       d2=mem[nmem-1]->bdouble[mpstk[(j1-1)*2+1]];
3590       i=0;
3591       break;
3592      case 24: /* current memory.bint */
3593       d2=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
3594       break;
3595      case 43: /* global memory.bdouble */
3596       d2=mem[0]->bdouble[mpstk[(j1-1)*2+1]];
3597       i=0;
3598       break;
3599      case 44: /* global memory.bint */
3600       for(i=nmem-1;i>=0;i--)
3601        if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
3602       d2=mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint];
3603       break;
3604     }
3605     switch(mpstk[(j1-2)*2+1]){
3606      case 13: /* + */
3607       d1=d2;
3608       break;
3609      case 17: /* - */
3610       d1=-d2;
3611       break;
3612     }
3613     if(i==1){
3614      i=d1;
3615      mpstk[nmp*2]=6;
3616      mpstk[nmp*2+1]=i;
3617     }
3618     else{
3619      mpstk[nmp*2]=8;
3620      for(j=nmp-1;j>0;j--) if(mpstk[j*2]==8) break;
3621      if(j==0) mpstk[nmp*2+1]=0;
3622      else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
3623      dstk[mpstk[nmp*2+1]]=d1;
3624     }
3625     nmp++;     
3626     break;
3627    case 197: /* sizeof */
3628     break;
3629    case 198: /* sizeof */
3630     break;
3631    case 206: /* subscript - to be worked later */
3632     switch(mpstk[(i1+2)*2]){ /* subscript */
3633      case 6: /* value */
3634       i3=mpstk[(i1+2)*2+1];
3635       break;
3636      case 24: /* offset into current memory.bint */
3637       i3=mem[nmem-1]->bint[mpstk[(i1+2)*2+1]];
3638       break;
3639      case 44: /* offset into global memory.bint */
3640       for(i=nmem-1;i>=0;i--)
3641        if(mem[i]->sint<=mpstk[(i1+2)*2+1]) break;
3642       i3=mem[i]->bint[mpstk[(i1+2)*2+1]-mem[i]->sint];
3643       break;
3644     }
3645     switch(mpstk[(i1+1)*2]){ /* identifier */
3646      case 25: /* current memery.bdarr */
3647       i4=mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].offs;
3648       if(mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].dimen==2){
3649        i3*=mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[1];
3650        mpstk[nmp*2]=61;
3651       }
3652       else mpstk[nmp*2]=23;
3653/*
3654printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].dimen=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].dimen);
3655printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[0]=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[0]);
3656printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[1]=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[1]);
3657printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[2]=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[2]);
3658printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[3]=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[3]);
3659printf("i3=%ii4=%i\n",i3,i4);
3660exit(0);*/
3661       break;
3662      case 26: /* current memory.biarr */
3663       i4=mem[nmem-1]->biarr[mpstk[(i1+1)*2+1]].offs;
3664       mpstk[nmp*2]=24;
3665       break;
3666      case 32: /* biarr */
3667       i4=mem[nmem-1]->bint[mpstk[(i1+1)*2+1]];
3668       for(i=nmem-1;i>=0;i--)
3669        if(mem[i]->siarr<=i4) break;
3670       i4=mem[i]->biarr[i4-mem[i]->siarr].offs+mem[i]->sint;
3671       mpstk[nmp*2]=44;
3672       break;
3673      case 45: /* global memery.bdarr */
3674       i4=mpstk[(i1+1)*2+1];
3675       mpstk[nmp*2]=43;
3676       break;
3677      case 46: /* global memory.biarr */
3678       i4=mpstk[(i1+1)*2+1];
3679       mpstk[nmp*2]=44;
3680       break;
3681      case 61:
3682       i4=mpstk[(i1+1)*2+1];
3683       mpstk[nmp*2]=23;
3684       break;
3685     }
3686     mpstk[nmp*2+1]=i3+i4;
3687     nmp++;
3688     break;
3689    case 207: /* o*/
3690    case 208: /* */note029
3691     if(mpstk[(i1+1)*2]==10){ /* return from user function */
3692      /* enter the returned value to the proper place */
3693      nmem--;
3694      k=mem[nmem]->scop;
3695      if(scop[k].nchar!=0) free(mem[nmem]->bchar);
3696      if(scop[k].nstring!=0) free(mem[nmem]->bstring);
3697      if(scop[k].ndouble!=0) free(mem[nmem]->bdouble);
3698      if(scop[k].nint!=0) free(mem[nmem]->bint);
3699      if(scop[k].ndarr!=0) free(mem[nmem]->bdarr);
3700      if(scop[k].niarr!=0) free(mem[nmem]->biarr);
3701     }
3702     else{
3703#ifndef CGI
3704      printf("at the entry of 208\n");
3705#endif
3706      l1=mpstk[(i1+1)*2+1]; /* function name */
3707      l1=ident[l1];
3708      for(i=0;inpchar[l1+i]!='\0';i++) s[i]=inpchar[l1+i];
3709      s[i]='\0';
3710#ifndef CGI
3711      printf("l1=%i %s\n",l1,s);
3712#endif
3713      for(k=1;k<nscop;k++) if(strcmp(s,scop[k].name)==0) break;
3714      if(k<nscop){
3715       mem[nmem]=(memory *)malloc(sizeof(memory));
3716       mem[nmem]->scop=k;
3717       if(scop[k].nchar!=0){
3718        mem[nmem]->bchar=(char *)malloc(sizeof(char)*scop[k].nchar);
3719        for(i=0;i<scop[k].nchar;i++) mem[nmem]->bchar[i]=scop[k].mem.bchar[i];
3720       }
3721       if(scop[k].nstring!=0){
3722        mem[nmem]->bstring=(int *)malloc(sizeof(int)*scop[k].nstring);
3723        for(i=0;i<scop[k].nstring;i++) mem[nmem]->bstring[i]=scop[k].mem.bstring[i];
3724       }
3725       if(scop[k].ndouble!=0){
3726        mem[nmem]->bdouble=(double *)malloc(sizeof(double)*scop[k].ndouble);
3727        for(i=0;i<scop[k].ndouble;i++) mem[nmem]->bdouble[i]=scop[k].mem.bdouble[i];
3728       }
3729       if(scop[k].nint!=0){
3730        mem[nmem]->bint=(int *)malloc(sizeof(int)*scop[k].nint);
3731        for(i=0;i<scop[k].nint;i++) mem[nmem]->bint[i]=scop[k].mem.bint[i];
3732       }
3733       if(scop[k].ndarr!=0){
3734        mem[nmem]->bdarr=(darray *)malloc(sizeof(darray)*scop[k].ndarr);
3735        for(i=0;i<scop[k].ndarr;i++){
3736         mem[nmem]->bdarr[i].dimen=scop[k].mem.bdarr[i].dimen;
3737         for(j=0;j<scop[k].mem.bdarr[i].dimen;j++)
3738           mem[nmem]->bdarr[i].size[j]=scop[k].mem.bdarr[i].size[j];
3739         mem[nmem]->bdarr[i].dat=&mem[nmem]->bdouble[scop[k].mem.bdarr[i].offs];
3740         mem[nmem]->bdarr[i].offs=scop[k].mem.bdarr[i].offs;
3741        }
3742       }
3743       if(scop[k].niarr!=0){
3744        mem[nmem]->biarr=(iarray *)malloc(sizeof(iarray)*scop[k].niarr);
3745        for(i=0;i<scop[k].niarr;i++){
3746         mem[nmem]->biarr[i].dimen=scop[k].mem.biarr[i].dimen;
3747         for(j=0;j<scop[k].mem.biarr[i].dimen;j++)
3748          mem[nmem]->biarr[i].size[j]=scop[k].mem.biarr[i].size[j];
3749         mem[nmem]->biarr[i].dat=&mem[nmem]->bint[scop[k].mem.biarr[i].offs];
3750         mem[nmem]->biarr[i].offs=scop[k].mem.biarr[i].offs;
3751        }
3752       }
3753       mem[nmem]->schar=mem[nmem-1]->schar+scop[mem[nmem-1]->scop].nchar;
3754       mem[nmem]->sstring=mem[nmem-1]->sstring+scop[mem[nmem-1]->scop].nstring;
3755       mem[nmem]->sdouble=mem[nmem-1]->sdouble+scop[mem[nmem-1]->scop].ndouble;
3756       mem[nmem]->sint=mem[nmem-1]->sint+scop[mem[nmem-1]->scop].nint;
3757       mem[nmem]->sdarr=mem[nmem-1]->sdarr+scop[mem[nmem-1]->scop].ndarr;
3758       mem[nmem]->siarr=mem[nmem-1]->siarr+scop[mem[nmem-1]->scop].niarr;
3759       nmem++;
3760/* pass the parameters here */
3761//       printf("mem[nmem-1]->bint[0]=%i\n",mem[nmem-1]->bint[0]);
3762       for(i=1;i<mem[nmem-1]->bint[0];i++){
3763//        printf("i=%i scop[k].ident[i]=%i scop[k].kind[i]=%i scop[k].offs[i]=%i\n",
3764//          i,scop[k].ident[i],scop[k].kind[i],scop[k].offs[i]);
3765        switch(scop[k].kind[i]){
3766         case 4: /* int */
3767          switch(mpstk[(i1+i+1)*2]){
3768           case 6:
3769            mem[nmem-1]->bint[scop[k].offs[i]]=mpstk[(i1+i+1)*2+1];
3770            break;
3771           case 24:
3772            mem[nmem-1]->bint[scop[k].offs[i]]= mem[nmem-2]->bint[mpstk[(i1+i+1)*2+1]];
3773            break;
3774           default:
3775            contype(1);
3776            exit(0);
3777          }
3778          break;
3779         case 12: /* iarray * */
3780          switch(mpstk[(i1+i+1)*2]){
3781           case 26: /* iarray */
3782            mem[nmem-1]->bint[scop[k].offs[i]]=
3783                mpstk[(i1+i+1)*2+1]+mem[nmem-2]->siarr;
3784            break;
3785           case 32:
3786            mem[nmem-1]->bint[scop[k].offs[i]]=
3787             mem[nmem-2]->bint[mpstk[(i1+i+1)*2+1]];
3788            break;
3789           default:
3790            contype(1);
3791            exit(0);
3792          }
3793          break;
3794         default:
3795          contype(1);
3796          exit(0);
3797        }
3798       }
3799       mpstk[2*nmp]=0;
3800       mpstk[2*nmp+1]=k1;
3801       nmp++;
3802       mpstk[2*nmp]=10;
3803       mpstk[2*nmp+1]=nmem;
3804       nmp++;
3805       mpstk[2*nmp]=1;
3806       mpstk[2*nmp+1]=scop[k].nodeexec;
3807       nmp++;
3808      } /* if(k<nscop) */
3809      else{ /* library function */
3810       for(k=1;k<numfunc;k*=2); /* power of 2 larger than number of functions */
3811       i=k;
3812       j=-1;
3813       for(;k>0;k/=2){
3814        if(j<0) i-=k;
3815        if(j>0) i+=k;
3816        if(i<numfunc) j=strcmp(s,&prs6[prs7[i]]);
3817        else j=-1;
3818        if(j==0) break;
3819       }
3820       if(j!=0){
3821        contype(0);
3822        printf("function not found\n");
3823        exit(0);
3824       }
3825#ifndef CGI
3826       printf("function number=%i\n",prs8[i]);
3827#endif
3828       param1[0]=prs8[i]; /* function number */
3829       param1[1]=prs11[i]-prs10[i]; /* number of parameters */
3830       for(j=0;j<param1[1];j++) param1[2+j]=prs9[prs10[i]+j]; /* types */
3831       m1=0; /* past-the-end index to char param2[] */
3832       n1=0; /* past-the-end index to double param3[] */
3833       o1=0; /* past-the-end index to int param4[] */
3834       switch(param1[2]){ /* type of return value */
3835        case 2: /* double */
3836         para[1]=(void *)&param3[n1++];
3837         break;
3838        case 4: /* int */
3839         para[1]=(void *)&param4[o1++];
3840         break;
3841        case 6: /* ... */
3842         break;
3843        default:
3844         contype(0);
3845         printf("return type not supported\n");
3846         exit(0);
3847         break;
3848       }
3849       k=0; /* index to argument */
3850       for(l1=i1+2;l1<j1;l1++){
3851        switch(mpstk[l1*2]){
3852         case 4: /* character constant */
3853           l=mpstk[l1*2+1];
3854           l=chcon[l];
3855           for(i=0;inpchar[l+i]!='\0';i++) param2[m1+i]=inpchar[l+i];
3856           param2[m1+i]='\0';
3857           if(param1[k+3]!=1){
3858            contype(0);
3859            printf("argument type incompatible\n");
3860            printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
3861            exit(0);
3862           }
3863           para[k+2]=(void *)&param2[m1];
3864           if(param1[0]==0){ /* printf - type infered from format */
3865            j=m1; /* scan index */
3866            l=0; /* 0:seek for % or \  1:seek for f or i  2:seek for n */
3867            k=4; /* index into param1[] - to be restored later */
3868            while((c=param2[j++])!='\0'){
3869             switch (c){
3870              case '%' :
3871               l=1;
3872               break;
3873              case 'f' :
3874              case 'e' :
3875               if(l==1){
3876                param1[k++]=2; /* type double */
3877                l=0;
3878               }
3879               break;
3880              case 'i' :
3881               if(l==1){
3882                param1[k++]=4; /* type int */
3883                l=0;
3884               }
3885               break;
3886              case '\\' :
3887               l=2;
3888               break;
3889              case 'n' :
3890               if(l==2){
3891                for(l=m1+i+2;l>j;l--) param2[l]=param2[l-2];
3892                param2[j-2]='<';
3893                param2[j-1]='b';
3894                param2[j]='r';
3895                param2[j+1]='>';
3896                i+=2;
3897                l=0;
3898               }
3899               break;
3900              default:
3901               break;
3902             } /* switch (c) */
3903            } /* while((c=param2[j++])!='\0') */
3904            param1[1]=k-2; /* number of parameters */
3905            k=0;
3906           } /* if(param1[0]==0) */
3907           m1=m1+i+1;
3908           k++;
3909           break;
3910         case 6: /* int */
3911          if(param1[k+3]!=4){
3912           param3[n1]=mpstk[l1*2+1];
3913           para[k+2]=(void *)&param3[n1];
3914           n1++;
3915           k++;
3916          }
3917          else{
3918// printf("o1=%i l1=%i mpstk[l1*2+1]=%i\n",o1,l1,mpstk[l1*2+1]);
3919           param4[o1]=mpstk[l1*2+1];
3920           para[k+2]=(void *)&param4[o1];
3921           o1++;
3922           k++;
3923          }
3924          break;
3925         case 5: /* double (floating const)  flcon[] */
3926          param3[n1]=flcon[mpstk[l1*2+1]];
3927          if(param1[k+3]!=2){
3928           contype(0);
3929           printf("argument type incompatible\n");
3930           printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
3931           exit(0);
3932          }
3933          para[k+2]=(void *)&param3[n1];
3934          n1++;
3935          k++;
3936          break;
3937         case 8: /* double dstk[] */
3938           if(param1[k+3]!=2){
3939            contype(0);
3940            printf("argument type incompatible\n");
3941            printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
3942            exit(0);
3943           }
3944           param3[n1]=dstk[mpstk[l1*2+1]];
3945           para[k+2]=(void *)&param3[n1];
3946           n1++;
3947           k++;
3948           break;
3949         case 23: /* mem[nmem-1]->bdouble[mpstk[l1*2+1]] */
3950           param3[n1]=mem[nmem-1]->bdouble[mpstk[l1*2+1]];
3951           para[k+2]=(void *)&param3[n1];
3952           n1++;
3953           k++;
3954           break;
3955         case 24: /* mem[nmem-1]->bint[mpstk[l1*2+1]] */
3956           if(param1[k+3]!=4){ // double
3957            param3[n1]=mem[nmem-1]->bint[mpstk[l1*2+1]];
3958            para[k+2]=(void *)&param3[n1];
3959            n1++;
3960            k++;
3961           }
3962           else{
3963// printf("o1=%i l1=%i mpstk[l1*2+1]=%i\n",o1,l1,mpstk[l1*2+1]);
3964            param4[o1]=mem[nmem-1]->bint[mpstk[l1*2+1]];
3965// printf("param4[o1]=%i\n",param4[o1]);
3966            para[k+2]=(void *)&param4[o1];
3967            o1++;
3968            k++;
3969           }
3970           break;
3971         case 25: /* mem[nmem-1]->bdarr[mpstk[l1*2+1]] */
3972           para[k+2]=(void *)&mem[nmem-1]->bdarr[mpstk[l1*2+1]];
3973           k++;
3974           break;
3975        } /* switch(mpstk[l1*2]) */
3976       } /* for(l1=i1+2;l1<j1;l1++) */
3977       para[0]=(void *)&param1[0];
3978       param=(void *)&para[0];
3979       func(param);
3980       if(param1[2]==2){ /* double */
3981        mpstk[2*nmp]=8;
3982        for(j=nmp-1;j>0;j--) if(mpstk[2*j]==8) break;
3983        if(j==0) mpstk[2*nmp+1]=0;
3984        else mpstk[2*nmp+1]=mpstk[2*j+1]+1;
3985        dstk[mpstk[2*nmp+1]]=*(double *)para[1];
3986//      printf("return value=%lf\n",dstk[mpstk[2*nmp+1]]);
3987        nmp++;
3988       }
3989       else{ /* int */
3990        mpstk[2*nmp]=6;
3991        mpstk[2*nmp+1]=*(int *)para[1];
3992//      printf("return value=%i\n",mpstk[2*nmp+1]);
3993        nmp++;
3994       }
3995      } /* else */
3996     } /* else */
3997     break;
3998    case 209: /* struct */
3999     break;
4000    case 210: /* struct */
4001     break;
4002    case 211: /* post-increment */
4003    case 212: /* post-decrement */
4004     switch(mpstk[(j1-1)*2]){
4005      case 24: /* current memory.bint */
4006       i3=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
4007       break;
4008      case 44: /* global memory.bint */
4009       i3=mem[0]->bint[mpstk[(j1-1)*2+1]];
4010       break;
4011/* to be added later */
4012      default:
4013       contype(1);
4014       exit(0);
4015     }
4016     if(produc[k1]==211) i4=i3+1;
4017     else i4=i3-1;
4018     switch(mpstk[(j1-1)*2]){
4019      case 24: /* current memory.bint */
4020       mem[nmem-1]->bint[mpstk[(j1-1)*2+1]]=i4;
4021       break;
4022      case 44: /* global memory.bint */
4023       mem[0]->bint[mpstk[(j1-1)*2+1]]=i4;
4024       break;
4025/* to be added later */
4026     }
4027     mpstk[2*nmp]=6;
4028     mpstk[2*nmp+1]=i3;
4029     nmp++;
4030     break;
4031    default:note030
4032     for(i=i1;i<j1-1;i++){
4033      mpstk[i*2]=mpstk[(i+1)*2];
4034      mpstk[i*2+1]=mpstk[(i+1)*2+1];
4035     }
4036     nmp=j1-1;
4037     break;     
4038   } /* switch (produc[k1]) */
4039   for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
4040   if(i>0){
4041    if(mpstk[2*i]==1&&mpstk[2*(i-1)]==2){
4042     i--;
4043     k1=mpstk[2*i+1];
4044     for(;i<nmp-1;i++){
4045      mpstk[2*i]=mpstk[2*(i+2)];
4046      mpstk[2*i+1]=mpstk[2*(i+2)+1];
4047     }
4048     nmp-=2;
4049    }
4050    else{
4051     k1=mpstk[2*i+1];
4052     if(mpstk[2*i]==1||mpstk[2*i]==2){
4053      for(;i<nmp;i++){
4054       mpstk[2*i]=mpstk[2*(i+1)];
4055       mpstk[2*i+1]=mpstk[2*(i+1)+1];
4056      }
4057      nmp--;
4058     }
4059    }
4060   }
4061   else k1=0; 
4062  } /* else */
4063 } /* while(test--) */
4064}
4065
4066/**************************************************************************
4067 functions
4068  passed parameter
4069  param[0] : int**param1 param1[0]:function number
4070                         param1[1]:number of parameters
4071                         param1[2]:type of return value
4072                         param1[3]:type of the first parameter in parentheses
4073                         param1[4]:type of the second parameter in parentheses
4074  param[1] : param1[2]*
4075  param[2] : param1[3]* format
4076  param[3] : param1[4]*
4077
4078  
4079**************************************************************************/
4080int func(void *param)
4081{
4082  int *param1;
4083  int i,j,k;
4084  double d=3.14159265;
4085  char f[30];
4086  char *fmt;
4087  double a,b;
4088
4089  param1=*(int **)param;note031
4090//  printf("param1[0]=%i [1]=%i   ",param1[0],param1[1]);
4091//  for(i=0;i<param1[1];i++) printf("[%i]=%i ",i+2,param1[i+2]);
4092//  printf("\n");
4093  switch (param1[0]){
4094   case 0: /* printf */
4095    if(firstTime){
4096     printf("Content-type: text/html%c%c",10,10);
4097     firstTime=0;
4098    }
4099    j=0;
4100    i=0;
4101    fmt=(char *)((void **)param)[2];
4102    for(j=0;;j++){
4103     if(fmt[i]=='\0'||fmt[i]=='%') break;
4104     f[j]=fmt[i];
4105     i++;
4106    }
4107    f[j]='\0';
4108    printf(f);
4109    for(k=2;k<param1[1];k++){ /* do for number of parameters */
4110     for(j=0;;j++){
4111      f[j]=fmt[i];
4112      if(fmt[i]=='i'){
4113       f[j+1]='\0';
4114       printf(f,*(int *)((void **)param)[k+1]);
4115       i++;
4116       break;
4117      }
4118      if(fmt[i]=='f'||fmt[i]=='e'){
4119       f[j+1]='\0';
4120       printf(f,*(double *)((void **)param)[k+1]);
4121       i++;
4122       break;
4123      }
4124      i++;
4125     }
4126     for(j=0;;j++){
4127      if(fmt[i]=='\0'||fmt[i]=='%') break;
4128      f[j]=fmt[i];
4129      i++;
4130     }
4131     f[j]='\0';
4132     printf(f);
4133    }
4134    *(int *)((void **)param)[1]=0;
4135    break;
4136   case 1: /* sin */
4137    *(double *)((void **)param)[1]=sin(*(double *)((void **)param)[2]);
4138    break;
4139   case 2: /* cos */
4140    *(double *)((void **)param)[1]=cos(*(double *)((void **)param)[2]);
4141    break;
4142   case 3: /* tan */
4143    *(double *)((void **)param)[1]=tan(*(double *)((void **)param)[2]);
4144    break;
4145   case 4: /* asin */
4146    a=*(double *)((void **)param)[2];
4147    if(a<1.||a>1.){
4148     contype(0);
4149     printf("asin arg\n");
4150     exit(0);
4151    }
4152    *(double *)((void **)param)[1]=asin(a);
4153    break;
4154   case 5: /* acos */
4155    a=*(double *)((void **)param)[2];
4156    if(a<1.||a>1.){
4157     contype(0);
4158     printf("acos arg\n");
4159     exit(0);
4160    }
4161    *(double *)((void **)param)[1]=acos(a);
4162    break;
4163   case 6: /* atan */
4164    *(double *)((void **)param)[1]=atan(*(double *)((void **)param)[2]);
4165    break;
4166   case 7: /* atan2 */
4167    *(double *)((void **)param)[1]=atan2(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
4168    break;
4169   case 8: /* sinh */
4170    *(double *)((void **)param)[1]=sinh(*(double *)((void **)param)[2]);
4171    break;
4172   case 9: /* cosh */
4173    *(double *)((void **)param)[1]=cosh(*(double *)((void **)param)[2]);
4174    break;
4175   case 10: /* tanh */
4176    *(double *)((void **)param)[1]=tanh(*(double *)((void **)param)[2]);
4177    break;
4178   case 11: /* exp */
4179    *(double *)((void **)param)[1]=exp(*(double *)((void **)param)[2]);
4180    break;
4181   case 12: /* log */
4182    a=*(double *)((void **)param)[2];
4183    if(a<=0.){
4184     contype(0);
4185     printf("log arg\n");
4186     exit(0);
4187    }
4188    *(double *)((void **)param)[1]=log(a);
4189    break;
4190   case 13: /* log10 */
4191    a=*(double *)((void **)param)[2];
4192    if(a<=0.){
4193     contype(0);
4194     printf("log10 arg\n");
4195     exit(0);
4196    }
4197    *(double *)((void **)param)[1]=log10(a);
4198    break;
4199   case 14: /* pow */
4200    a=*(double *)((void **)param)[2];
4201    b=*(double *)((void **)param)[3];
4202    if((a==0.&&b<=0.)||(a<0.&&fmod(b,1.)!=0.)){
4203     contype(0);
4204     printf("pow arg\n");
4205     exit(0);
4206    }
4207    *(double *)((void **)param)[1]=pow(a,b);
4208    break;
4209   case 15: /* sqrt */
4210    a=*(double *)((void **)param)[2];
4211    if(a<0.){
4212     contype(0);
4213     printf("sqrt arg negative\n");
4214     exit(0);
4215    }
4216    *(double *)((void **)param)[1]=sqrt(a);
4217    break;
4218   case 16: /* ceil */
4219    *(double *)((void **)param)[1]=ceil(*(double *)((void **)param)[2]);
4220    break;
4221   case 17: /* floor */
4222    *(double *)((void **)param)[1]=floor(*(double *)((void **)param)[2]);
4223    break;
4224   case 18: /* fabs */
4225    *(double *)((void **)param)[1]=fabs(*(double *)((void **)param)[2]);
4226    break;
4227   case 19: /* fmod */
4228    *(double *)((void **)param)[1]=fmod(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
4229    break;
4230   case 20: /* MakeView */
4231    *(int *)((void **)param)[1]=MakeView(*(int *)((void **)param)[2],*(int *)((void **)param)[3]);
4232    break;
4233   case 21: /* SetColor */
4234    *(int *)((void **)param)[1]=SetColor(*(int *)((void **)param)[2],*(int *)((void **)param)[3],*(int *)((void **)param)[4]);
4235    break;
4236   case 22: /* MoveTo */
4237    *(int *)((void **)param)[1]=MoveTo(*(int *)((void **)param)[2],*(int *)((void **)param)[3]);
4238    break;
4239   case 23: /* LineTo */
4240    *(int *)((void **)param)[1]=LineTo(*(int *)((void **)param)[2],*(int *)((void **)param)[3]);
4241    break;
4242   case 24: /* GifOut */
4243    if(!firstTime){
4244     contype(0);
4245     printf("text and image cannot be mixed");
4246     exit(0);
4247    }
4248    *(int *)((void **)param)[1]=GifOut();
4249    break;
4250   case 25: /* OpenPoly */
4251    *(int *)((void **)param)[1]=OpenPoly();
4252    break;
4253   case 26: /* ClosePoly */
4254    *(int *)((void **)param)[1]=ClosePoly();
4255    break;
4256   case 27: /* FontInfo */
4257    *(int *)((void **)param)[1]=FontInfo(*(int *)((void **)param)[2],*(int *)((void **)param)[3],*(int *)((void **)param)[4]);
4258    break;
4259   case 28: /* DrawString */
4260    *(int *)((void **)param)[1]=DrawString((char *)((void **)param)[2]);
4261    break;
4262   case 29: /* MakeGraph */
4263    *(int *)((void **)param)[1]=MakeGraph(*(int *)((void **)param)[2],*(int *)((void **)param)[3]
4264                                       ,*(int *)((void **)param)[4],*(int *)((void **)param)[5]);
4265    break;
4266   case 30: /* HorizTime */
4267    *(int *)((void **)param)[1]=HorizTime();
4268    break;
4269   case 31: /* HorizScale */
4270    *(int *)((void **)param)[1]=HorizScale((char *)((void **)param)[2],*(double *)((void **)param)[3],*(double *)((void **)param)[4]);
4271    break;
4272   case 32: /* VertScale */
4273    *(int *)((void **)param)[1]=VertScale((char *)((void **)param)[2],*(double *)((void **)param)[3],*(double *)((void **)param)[4]);
4274    break;
4275   case 33: /* MoveToG */
4276    *(int *)((void **)param)[1]=MoveToG(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
4277    break;
4278   case 34: /* LineToG */
4279    *(int *)((void **)param)[1]=LineToG(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
4280    break;
4281   case 35: /* PlotG */
4282    *(int *)((void **)param)[1]=PlotG(*(int *)((void **)param)[2],*(double *)((void **)param)[3],*(double *)((void **)param)[4]);
4283    break;
4284   case 36: /* erf */
4285    *(double *)((void **)param)[1]=erf(*(double *)((void **)param)[2]);
4286    break;
4287   case 37: /* Jn */
4288    *(double *)((void **)param)[1]=Jn(*(int *)((void **)param)[2],*(double *)((void **)param)[3]);
4289    break;
4290   case 38: /* Yn */
4291    *(double *)((void **)param)[1]=Yn(*(int *)((void **)param)[2],*(double *)((void **)param)[3]);
4292    break;
4293   case 39: /* refday */
4294    *(double *)((void **)param)[1]=refday(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
4295    break;
4296   case 40: /* mdyday */
4297    *(double *)((void **)param)[1]=mdyday(*(double *)((void **)param)[2]);
4298    break;
4299   case 41: /* hmsday */
4300    *(double *)((void **)param)[1]=hmsday(*(double *)((void **)param)[2]);
4301    break;
4302   case 42: /* DrawNum */
4303    *(int *)((void **)param)[1]=DrawNum(*(int *)((void **)param)[2]);
4304    break;
4305   case 43: /* DrawFNum */
4306    *(int *)((void **)param)[1]=DrawFNum((char *)((void **)param)[2],*(double *)((void **)param)[3]);
4307    break;
4308   case 44: /* exit */
4309    if(firstTime){
4310     printf("Content-type: text/html%c%c",10,10);
4311    }
4312    printf("exit(%i)",*(int *)((void **)param)[2]);
4313    exit(0);
4314    break;
4315   case 45: /* PngOut */
4316    if(!firstTime){
4317     contype(0);
4318     printf("text and image cannot be mixed");
4319     exit(0);
4320    }
4321    *(int *)((void **)param)[1]=PngOut();
4322    break;
4323   case 46: /* matmul */
4324    *(int *)((void **)param)[1]=matmul((darray *)((void **)param)[2],(darray *)((void **)param)[3],(darray *)((void **)param)[4]);
4325    break;
4326   case 47: /* matinv */
4327    *(int *)((void **)param)[1]=matinv((darray *)((void **)param)[2]);
4328    break;
4329   default:
4330    break;
4331  }
4332
4333}
4334
4335