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 *)¶m3[n1++];
3837 break;
3838 case 4: /* int */
3839 para[1]=(void *)¶m4[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 *)¶m2[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 *)¶m3[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 *)¶m4[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 *)¶m3[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 *)¶m3[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 *)¶m3[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 *)¶m3[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 *)¶m4[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 *)¶m1[0];
3978 param=(void *)¶[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