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