p077.c
0000#define MAXINP 300000 /* maximum input characters */
0001#define MAXNOD 10000000 /* maximun processed node */
0002#define MAXNMP 8000 /* multi-purpose stack */
0003#include <stdio.h>
0004#include <stdlib.h>
0005#include <ctype.h>
0006#include <string.h>
0007#include <time.h>
0008
0009/* ipc */
0010#include <sys/types.h>
0011#include <unistd.h>
0012#include <sys/ipc.h>
0013#include <sys/shm.h>
0014#include <sys/sem.h>
0015#include <sys/wait.h>
0016
0017
0018#include <math.h>
0019#include "draw.h"
0020#include "gcs1.h"
0021#include "gcs2.h"
0022
0023#include <sys/socket.h>
0024#include <sys/un.h>
0025#include <errno.h>
0026#include <dirent.h>
0027#include <iconv.h>
0028#include <gdbm.h>
0029
0030#include <dlfcn.h>
0031
0032#include <signal.h>
0033
0034#define SOCK_PATH "/var/gcs/fdb_socket"
0035
0036extern int errno;
0037
0038note000
0039int func(void *param);
0040void plustospace(char *str);
0041
0042typedef struct {
0043 char *name;
0044 char *val;
0045} entry;
0046
0047/* structs darray and iarray moved to gcs2.h */
0048
0049typedef struct {
0050 int scop;
0051 char *bchar; /* base of characters */
0052 int *bstring; /* base of offset to bchar */
0053 int *nstring; /* effective number of characters in the string */
0054 int *mstring; /* maximum allowed characters in the string */
0055 double *bdouble; /* base of doubles */
0056 int *bint; /* base of integers - includes pointers */
0057 darray *bdarr; /* base of darrays */
0058 iarray *biarr; /* base of iarrays */
0059 int schar; /* start offset of global subscript */
0060 int sstring;
0061 int sdouble;
0062 int sint;
0063 int sdarr;
0064 int siarr;
0065} memory;
0066
0067typedef struct {
0068 char name[30];
0069 int noderoot; /* starting node number */
0070 int nodedecl; /* declaration */
0071 int nodeexec;
0072
0073 int nchar; /* numbr of characters */
0074 int nstring; /* number of strings */
0075 int ndouble; /* number of doubles */
0076 int nint; /* number of ints */
0077 int ndarr; /* number of darrays */
0078 int niarr; /* number of iarrays */
0079
0080 int nident; /* number of identifiers */
0081 int *ident;
0082 int *kind; /* kind of identifiers */
0083 /* 1:char 2:string 3:double 4:int 5:darray */
0084 /* 6:iarray */
0085 /* 7:char* 8:string* 9:double* 10:int* */
0086 /* 11:darray* 12:iarray* */
0087 int *offs; /* offset to memory data */
0088 memory mem;
0089} scope;
0090
0091
0092#define LF 10
0093#define CR 13
0094
0095
0096int firstTime=1;
0097int semid=0;
0098int shmid=0;
0099char *shmbuf;
0100struct sembuf sb;
0101int nprog=0; // number of programs
0102int prs19[7]; // program number
0103int prs20[7]; // semaphore number
0104int callfrom=0; // semaphore at callback
0105pid_t prs21[7]; // child pid
0106
0107int nso=0; // number of shared objects
0108void *prs24[5]; // dl handles
0109
0110int tweak=0;
0111int outcnt,outfrom,outto;
0112
0113void contype(int ernum) /* call before printing error message and exit */
0114{
0115 if(firstTime){
0116 printf("Content-type: text/plain%c%c",10,10);
0117 }
0118 printf("*** Terminated by error %i ***\n",ernum);
0119}
0120
0121void beforeexit()
0122{
0123 int i;
0124 int status;
0125 if(nprog){
0126 for(i=0;i<nprog;i++){
0127 *(int *)shmbuf=999;
0128 if(prs20[i]==callfrom) sb.sem_num=2;
0129 else sb.sem_num=prs20[i];
0130 sb.sem_op=1;
0131 sb.sem_flg=0;
0132 semop(semid,&sb,1); /* post */
0133 sb.sem_num=0;
0134 sb.sem_op=-1;
0135 sb.sem_flg=0;
0136 semop(semid,&sb,1); /* wait for detach */
0137 waitpid(prs21[i],&status,0);
0138 }
0139 }
0140 if(semid) semctl(semid,0,IPC_RMID);
0141 if(shmid) shmctl(shmid,IPC_RMID,0);
0142 if(nso){
0143 for(i=0;i<nso;i++) dlclose(prs24[i]);
0144 }
0145}
0146
0147void sighandl(int j)
0148{
0149 int i;
0150 for(i=0;i<nprog;i++){
0151 kill(prs21[i],SIGKILL);
0152 waitpid(prs21[i],NULL,0);
0153 }
0154}
0155
0156note001
0157void getword(char *word, char *line, char stop) {
0158 int x = 0,y;
0159
0160 for(x=0;((line[x]) && (line[x] != stop));x++)
0161 word[x] = line[x];
0162
0163 word[x] = '\0';
0164 if(line[x]) ++x;
0165 y=0;
0166
0167 while((line[y++] = line[x++]));
0168}
0169
0170char *makeword(char *line, char stop) {
0171 int x = 0,y;
0172 char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1));
0173
0174 for(x=0;((line[x]) && (line[x] != stop));x++)
0175 word[x] = line[x];
0176
0177 word[x] = '\0';
0178 if(line[x]) ++x;
0179 y=0;
0180
0181 while((line[y++] = line[x++]));
0182 return word;
0183}
0184
0185char *fmakeword(FILE *f, char stop, int *cl) {
0186 int wsize;
0187 char *word;
0188 int ll;
0189
0190 wsize = 1024;
0191 ll=0;
0192 word = (char *) malloc(sizeof(char) * (wsize + 1));
0193
0194 while(1) {
0195 word[ll] = (char)fgetc(f);
0196 if(ll==wsize) {
0197 word[ll+1] = '\0';
0198 wsize+=1024;
0199 if(wsize>MAXINP){
0200 contype(1);
0201 printf("Input length limit over.");
0202 exit(0);
0203 }
0204 word = (char *)realloc(word,sizeof(char)*(wsize+1));
0205 }
0206 --(*cl);
0207 if((word[ll] == stop) || (feof(f)) || (!(*cl))) {
0208 if(word[ll] != stop) ll++;
0209 word[ll] = '\0';
0210 if(ll>80){ // source allow for input field expansion
0211 wsize+=1024;
0212 word = (char *)realloc(word,sizeof(char)*(wsize+1));
0213 }
0214 return word;
0215 }
0216 ++ll;
0217 }
0218}
0219
0220char x2c(char *what) {
0221 register char digit;
0222
0223 digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
0224 digit *= 16;
0225 digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
0226 return(digit);
0227}
0228
0229void unescape_url(char *url) {
0230 register int x,y;
0231
0232 plustospace(url);
0233 for(x=0,y=0;url[y];++x,++y) {
0234 if((url[x] = url[y]) == '%') {
0235 url[x] = x2c(&url[y+1]);
0236 y+=2;
0237 }
0238 }
0239 url[x] = '\0';
0240}
0241
0242void plustospace(char *str) {
0243 register int x;
0244
0245 for(x=0;str[x];x++) if(str[x] == '+') str[x] = ' ';
0246}
0247
0248void sjis2euc(unsigned char *c1,unsigned char *c2)
0249{
0250 if(*c2<0x9f){
0251 if(*c1<0xa0){
0252 *c1-=0x81;
0253 *c1*=2;
0254 *c1+=0xa1;
0255 }
0256 else{
0257 *c1-=0xe0;
0258 *c1*=2;
0259 *c1+=0xdf;
0260 }
0261 if(*c2>0x7f) --*c2;
0262 *c2+=0x61;
0263 }
0264 else{
0265 if(*c1<0xa0){
0266 *c1-=0x81;
0267 *c1*=2;
0268 *c1+=0xa2;
0269 }
0270 else{
0271 *c1-=0xe0;
0272 *c1*=2;
0273 *c1+=0xe0;
0274 }
0275 *c2+=2;
0276 }
0277}
0278
0279void euc2sjis(unsigned char *c1,unsigned char *c2)
0280{
0281 if((*c1%2)==0) *c2-=0x02;
0282 else{
0283 *c2-=0x61;
0284 if(*c2>0x7e) ++*c2;
0285 }
0286 if(*c1<0xdf){
0287 ++*c1;
0288 *c1/=2;
0289 *c1+=0x30;
0290 }
0291 else{
0292 ++*c1;
0293 *c1/=2;
0294 *c1+=0x70;
0295 }
0296}
0297
0298/* returned value 0 : undeermined 1 : sjis 2 : EUC 3 : UTF-8 */
0299int jcode(unsigned char *c)
0300{
0301 if(*c<0xa0) return 1;
0302 if((*c&0xf0)==0xe0&&(*(c+1)&0xc0)==0x80&&(*(c+2)&0xc0)==0x80) return 3;
0303 if(*c>=0xe0&&*c<=0xef){
0304 if(*(c+1)<0xa0) return 1;
0305 else return 0;
0306 }
0307 else return 2;
0308}
0309
0310/* Convert to ECU if sjis */
0311//void cnvifsjis(unsigned char *s)
0312void cnv2utf(unsigned char *s)
0313{
0314 int i,j;
0315 iconv_t cd;
0316 unsigned char *s1;
0317 unsigned char *s2;
0318 unsigned char *s3;
0319 size_t inbytes;
0320 size_t outbytes;
0321
0322 j=0;
0323 for(i=0;s[i]!='\0';i++){
0324 if(s[i]>0x80){
0325 j=jcode(&s[i]);
0326 if(j==3) return;
0327 if(j==2){
0328 cd=iconv_open("UTF-8","EUC-JP");
0329 break;
0330 }
0331 if(j==1){
0332 cd=iconv_open("UTF-8","SJIS");
0333 break;
0334 }
0335 i++;
0336 }
0337 }
0338 if(j==0) return;
0339 /* for(i=0;s[i]!='\0';i++){
0340 if(s[i]>0x80){
0341 sjis2euc(&s[i],&s[i+1]);
0342 i++;
0343 }
0344 }*/
0345 s1=s;
0346 inbytes=strlen((char *)s);
0347 s2=(unsigned char *)malloc(inbytes+1);
0348 strcpy((char *)s2,(char *)s);
0349 s3=s2;
0350 outbytes=inbytes*2;
0351 iconv(cd,(char **)&s3,&inbytes,(char **)&s1,&outbytes);
0352 free(s2);
0353 iconv_close(cd);
0354}
0355
0356void fatal_func()
0357{
0358}
0359
0360int main(int argc, char *argv[]) {
0361 entry entries[50];
0362 int x,mx=0;
0363 int cl;
0364 char *source;
0365 char *inp; /* input c-code cleaned */
0366 int *tmnl; /* input terminals in teminal number (2-86) */
0367 int ninp,ntmnl; /* number of inp[] and tmnl[] */
0368 int comment; /* comment cleaning process status */
0369 char c;
0370 int stk[MAXNMP]; /* stack used at parsing (grammar symbol and state pairs) */
0371 int i,j,k,l,m,n,o,i1,j1,k1,l1,m1,n1,o1;
0372 int i2,i3,i4,i5,i6,i7,i8;
0373 int test;
0374 FILE *fp;
0375 int *gsymbol; /* garmmar symbol */
0376 int *produc; /* production */
0377 int *parent; /* parent index */
0378 int *child; /* left-most child */
0379 int *sibli; /* next sibling */
0380 int *attri1; /* attribute 1 */
0381 void *param;
0382 void *para[22];
0383 int param1[22];
0384 char param2[700];
0385 double param3[20];
0386 int param4[20];
0387 int cb=0; /* callback indicator */
0388 void *shmcb; /* shared memory address used for callback */
0389 char shmbufcb[4096]; /* for saving at callback */
0390 int savecb; /* number of bytes to be saved */
0391 void *paramcb; /* for saving at callback */
0392 void *paracb[22];
0393 int param1cb[22];
0394 char param2cb[400];
0395 double param3cb[20];
0396 int param4cb[20];
0397 int mpstkcb[40];
0398 int ngsymb;
0399 char s[300];
0400 int mpstk[MAXNMP];
0401 double dstk[25];
0402 int nmp;
0403 int njp; /* jump control depth */
0404 int jmpcnt[10]; /* jump control */
0405 double d1,d2;
0406 FILE *fp1;
0407 char *inpchar;
0408 int *chcon;
0409 int nchcon;
0410 int *ident;
0411 int nident;
0412 double *flcon;
0413 int nflcon;
0414 scope *scop;
0415 int nscop;
0416 memory *mem[200]; /* memory stack 0:global 1:main */
0417 int nmem;
0418 int decltype;
0419 int ochar,ostring,odouble,oint,odarr,oiarr,oident;
0420 int odata;
0421
0422 /* ipc */
0423 pid_t child_pid;
0424 /* some declarations moved to global */
0425 char argd[]="/usr/gcs/"; /* directory */
0426 char argf[10]; /* file */
0427 char arg0[40];
0428 char arg1[12];
0429 char arg2[12];
0430 char arg3[12];
0431 int ipc;
0432 void *ipcpt;
0433 int debug=0;
0434 int udir=0; /* if user directory */
0435
0436 int sockdesc;
0437 int len;
0438 char msg[200];
0439 struct sockaddr_un remote;
0440 int socerr;
0441 DIR *dp;
0442 struct dirent *ep;
0443
0444 GDBM_FILE dbf=NULL;
0445 datum dt1;
0446 datum dt2;
0447
0448 note002
0449 int lex1[26]={ /* number of entries for alphabet letter */
0450 1, 1, 4, 3, 3, 2, 1, 0, 2, 0,
0451 0, 1, 0, 0, 0, 0, 0, 2, 7, 1,
0452 2, 2, 1, 0, 0, 0};
0453 int lex2[26]={ /* offset to lex3 */
0454 0, 1, 2, 6, 9, 12, 14, 0, 15, 0,
0455 0, 17, 0, 0, 0, 0, 0, 18, 20, 27,
0456 28, 30, 32, 0, 0, 0};
0457 int lex3[33]={ /* terminal number */
0458 42, 43, 44, 45, 47, 48, 49, 50, 51, 52,
0459 53, 55, 56, 58, 59, 61, 62, 64, 65, 66,
0460 67, 68, 69, 70, 71, 72, 73, 74, 76, 77,
0461 78, 79, 80};
0462 int lex4[33]={ /* no of total characters */
0463 4, 5, 4, 4, 5, 8, 7, 2, 6, 4,
0464 4, 6, 5, 3, 4, 2, 3, 4, 8, 6,
0465 5, 6, 6, 6, 6, 6, 6, 7, 5, 8,
0466 4, 8, 5};
0467 int lex5[33]={ /* offset to character table */
0468 0, 3, 7, 10, 13, 17, 24, 30, 31, 36,
0469 39, 42, 47, 51, 53, 56, 57, 59, 62, 69,
0470 74, 78, 83, 88, 93, 98,103,108,114,118,
0471 125,128,135};
0472 int lex6[139]={ /* character table */
0473 'u','t','o','r','e','a','k','a','s','e','h','a','r','o','n','s','t','o',
0474 'n','t','i','n','u','e','e','f','a','u','l','t','o','o','u','b','l','e',
0475 'l','s','e','n','u','m','x','t','e','r','n','l','o','a','t','o','r','o',
0476 't','o','f','n','t','o','n','g','e','g','i','s','t','e','r','e','t','u',
0477 'r','n','h','o','r','t','i','g','n','e','d','i','z','e','o','f','t','a',
0478 't','i','c','t','r','i','n','g','t','r','u','c','t','w','i','t','c','h',
0479 'y','p','e','d','e','f','n','i','o','n','n','s','i','g','n','e','d','o',
0480 'i','d','o','l','a','t','i','l','e','h','i','l','e'};
0481 int lex7[41]={ /* special character table 23/38/40 */
0482 '!','%','&','(',')','*','+',',','-','.','/',':',';','<','=','>','?','[',
0483 ']','^','{','|','}','~','=','&','=','+','=','-','=','>','.','<','=','=',
0484 '>','=','|','.','='};
0485 int lex8[41]={ /* terminal number 23/38/40 */
0486 2, 4, 6, 9, 10, 11, 13, 16, 17, 22, 23, 25, 26, 27, 31, 33, 37, 38,
0487 39, 40, 81, 82, 85, 86, 1, 1, 2, 1, 2, 1, 2, 3, 0, 1, 3, 1,
0488 2, 1, 2, 1, 1};
0489 int lex9[41]={ /* index for next char 23/38/40 */
0490 24, 24, 25, 0, 0, 24, 27, 0, 29, 32, 24, 0, 0, 33, 24, 35, 0, 0,
0491 0, 24, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0,
0492 40, 0, 0, 0, 0};
0493 int lex10[41]={ /* number if indices 23/38/40 */
0494 1, 1, 2, 0, 0, 1, 2, 0, 3, 1, 1, 0, 0, 2, 1, 2, 0, 0,
0495 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
0496 1, 0, 0, 0, 0};
0497 int lex11[136]={ /* with space or not */
0498 'c','i','t','a','t','s','d','e','n','g','i','s','d','e','n','g','i','s',
0499 'n','u','d','i','o','v','e','l','b','u','o','d','e','l','i','t','a','l',
0500 'o','v','e','s','a','c','e','s','l','e','f','e','d','e','p','y','t','f',
0501 'o','e','z','i','s','g','n','i','r','t','s','g','n','o','l','h','c','t',
0502 'i','w','s','n','o','i','n','u','n','r','e','t','x','e','n','r','u','t',
0503 'e','r','o','t','o','g','o','t','u','a','r','a','h','c','r','e','t','s',
0504 'i','g','e','r','t','a','o','l','f','t','c','u','r','t','s','t','n','i',
0505 't','r','o','h','s','t','s','n','o','c'};
0506 int lex12[25]={ /* offset to lex11 */
0507 0, 6, 12, 20, 24, 30, 38, 42, 46, 53, 59, 65, 69, 75, 80, 86, 92, 96,
0508 100,104,112,117,123,126,131};
0509 int lex13[25]={ /* string length */
0510 6, 6, 8, 4, 6, 8, 4, 4, 7, 6, 6, 4, 6, 5, 6, 6, 4, 4,
0511 4, 8, 5, 6, 3, 5, 5};
0512 int lex14[26]={ /* offset to lex12 and lex13 */
0513 0, 0, 0, 1, 4, 8, 10, 12, 0, 0, 0, 0, 0, 13, 16, 0, 0, 18,
0514 0, 20, 0, 0, 0, 0, 0, 0};
0515 int lex15[26]={ /* number of entries */
0516 0, 0, 1, 3, 4, 2, 2, 1, 0, 0, 0, 0, 0, 3, 2, 0, 0, 2,
0517 0, 5, 0, 0, 0, 0, 0, 0};
0518 note003
0519 /** output of m18 **/
0520 int pars1[2834]={
0521 9, 11, 42, 45, 47, 51, 53, 55, 56, 60,
0522 62, 64, 65, 67, 68, 70, 72, 74, 75, 76,
0523 77, 78, 79, 161, 163, 194, 197, 199, 203, 205,
0524 207, 208, 212, 214, 216, 217, 219, 220, 222, 224,
0525 226, 227, 228, 229, 230, 231, 303, 313, 315, 330,
0526 364, 498, 501, 503, 507, 509, 511, 512, 518, 520,
0527 521, 523, 524, 526, 528, 530, 531, 532, 533, 534,
0528 535, 537, 617, 618, 619, 624, 634, 646, 650, 653,
0529 655, 659, 661, 663, 664, 668, 670, 672, 673, 675,
0530 676, 678, 680, 682, 683, 684, 685, 686, 687, 769,
0531 770, 771, 776, 786, 798, 802, 805, 807, 811, 813,
0532 815, 816, 820, 822, 824, 825, 827, 828, 830, 832,
0533 834, 835, 836, 837, 838, 839, 921, 922, 923, 928,
0534 938, 950, 954, 957, 959, 963, 965, 967, 968, 972,
0535 974, 976, 977, 979, 980, 982, 984, 986, 987, 988,
0536 989, 990, 991, 1073, 1124, 1225, 1226, 1232, 1241, 1242,
0537 1247, 1254, 1258, 1261, 1263, 1267, 1269, 1271, 1272, 1278,
0538 1280, 1281, 1283, 1284, 1286, 1288, 1290, 1291, 1292, 1293,
0539 1294, 1295, 1297, 1377, 1378, 1379, 1384, 1406, 1415, 1428,
0540 1447, 1529, 1531, 1580, 1732, 1753, 1884, 1905, 1992, 2002,
0541 2007, 2018, 2021, 2023, 2027, 2029, 2031, 2032, 2038, 2040,
0542 2041, 2043, 2044, 2046, 2048, 2050, 2051, 2052, 2053, 2054,
0543 2055, 2057, 2144, 2154, 2322, 2325, 2327, 2331, 2333, 2335,
0544 2336, 2342, 2344, 2345, 2347, 2348, 2350, 2352, 2354, 2355,
0545 2356, 2357, 2358, 2359, 2361, 2434, 2438, 2441, 2443, 2445,
0546 2446, 2449, 2450, 2458, 2474, 2475, 2476, 2477, 2478, 2479,
0547 2480, 2481, 2482, 2483, 2485, 2486, 2487, 2488, 2489, 2490,
0548 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500,
0549 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510,
0550 2511, 2512, 2513, 2517, 2518, 2593, 2595, 2610, 2644, 2745,
0551 2746, 2752, 2761, 2762, 2767, 2774, 2778, 2781, 2783, 2787,
0552 2789, 2791, 2792, 2798, 2800, 2801, 2803, 2804, 2806, 2808,
0553 2810, 2811, 2812, 2813, 2814, 2815, 2817, 2890, 2894, 2897,
0554 2899, 2901, 2902, 2905, 2906, 2927, 2934, 2942, 2945, 2948,
0555 2951, 2957, 2959, 2974, 3050, 3082, 3085, 3087, 3091, 3093,
0556 3095, 3096, 3100, 3102, 3104, 3105, 3107, 3108, 3110, 3112,
0557 3114, 3115, 3116, 3117, 3118, 3119, 3201, 3202, 3203, 3208,
0558 3230, 3239, 3252, 3271, 3354, 3505, 3506, 3507, 3512, 3521,
0559 3522, 3534, 3538, 3541, 3543, 3547, 3549, 3551, 3552, 3556,
0560 3558, 3560, 3561, 3563, 3564, 3566, 3568, 3570, 3571, 3572,
0561 3573, 3574, 3575, 3577, 3693, 3695, 3699, 3701, 3704, 3710,
0562 3712, 3715, 3716, 3720, 3723, 3724, 3725, 3726, 3727, 3809,
0563 3810, 3811, 3816, 3825, 3826, 3838, 3842, 3845, 3847, 3851,
0564 3853, 3855, 3856, 3860, 3862, 3864, 3865, 3867, 3868, 3870,
0565 3872, 3874, 3875, 3876, 3877, 3878, 3879, 3881, 4012, 4146,
0566 4149, 4151, 4155, 4157, 4159, 4160, 4166, 4168, 4169, 4171,
0567 4172, 4174, 4176, 4178, 4179, 4180, 4181, 4182, 4183, 4185,
0568 4258, 4262, 4265, 4267, 4269, 4270, 4273, 4274, 4302, 4310,
0569 4313, 4316, 4319, 4325, 4327, 4337, 4342, 4417, 4419, 4468,
0570 4562, 4566, 4569, 4571, 4573, 4574, 4577, 4578, 4586, 4602,
0571 4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4613,
0572 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623,
0573 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633,
0574 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4645, 4646,
0575 4714, 4718, 4721, 4723, 4725, 4726, 4729, 4730, 4738, 4755,
0576 4756, 4758, 4760, 4761, 4762, 4766, 4769, 4770, 4771, 4772,
0577 4773, 4775, 4778, 4781, 4783, 4785, 4792, 4793, 4797, 4798,
0578 4867, 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, 4876,
0579 4877, 4878, 4879, 4880, 4881, 4882, 4883, 4884, 4885, 4887,
0580 4888, 4889, 4890, 4891, 4892, 4893, 4894, 4895, 4896, 4897,
0581 4898, 4899, 4900, 4901, 4902, 4903, 4904, 4905, 4946, 4947,
0582 4948, 4949, 5018, 5022, 5025, 5027, 5029, 5030, 5033, 5034,
0583 5062, 5070, 5073, 5076, 5079, 5085, 5087, 5102, 5193, 5336,
0584 5346, 5481, 5633, 5785, 5930, 5934, 5937, 5939, 5941, 5942,
0585 5945, 5946, 5954, 5971, 5972, 5974, 5976, 5977, 5978, 5982,
0586 5985, 5986, 5987, 5988, 5989, 5991, 5994, 5997, 5999, 6001,
0587 6008, 6009, 6014, 6089, 6292, 6410, 6562, 6690, 6694, 6697,
0588 6699, 6701, 6702, 6705, 6706, 6714, 6734, 6742, 6745, 6748,
0589 6751, 6757, 6759, 6774, 6843, 6844, 6845, 6846, 6847, 6848,
0590 6850, 6851, 6852, 6853, 6855, 6856, 6857, 6859, 6863, 6864,
0591 6865, 6866, 6867, 6868, 6869, 6870, 6871, 6872, 6873, 6874,
0592 6875, 6876, 6877, 6879, 6880, 6881, 6922, 6923, 6924, 6925,
0593 7002, 7008, 7017, 7018, 7029, 7031, 7076, 7077, 7147, 7148,
0594 7149, 7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7158,
0595 7159, 7160, 7161, 7162, 7163, 7164, 7165, 7167, 7168, 7169,
0596 7170, 7171, 7172, 7173, 7174, 7175, 7176, 7177, 7178, 7179,
0597 7180, 7181, 7182, 7183, 7184, 7185, 7226, 7227, 7228, 7229,
0598 7298, 7302, 7305, 7307, 7309, 7310, 7313, 7314, 7342, 7350,
0599 7353, 7356, 7359, 7365, 7367, 7382, 7450, 7454, 7457, 7459,
0600 7461, 7462, 7465, 7466, 7494, 7502, 7505, 7508, 7511, 7517,
0601 7519, 7534, 7602, 7606, 7609, 7611, 7613, 7614, 7617, 7618,
0602 7646, 7654, 7657, 7660, 7663, 7669, 7671, 7686, 7754, 7758,
0603 7761, 7763, 7765, 7766, 7769, 7770, 7798, 7806, 7809, 7812,
0604 7815, 7821, 7823, 7838, 7911, 7914, 7920, 7929, 7930, 7941,
0605 7943, 7988, 7989, 8063, 8066, 8072, 8081, 8082, 8093, 8095,
0606 8138, 8140, 8141, 8210, 8214, 8217, 8219, 8221, 8222, 8225,
0607 8226, 8253, 8254, 8255, 8259, 8261, 8262, 8264, 8265, 8268,
0608 8270, 8271, 8272, 8275, 8276, 8277, 8279, 8280, 8283, 8284,
0609 8285, 8286, 8287, 8294, 8367, 8370, 8376, 8385, 8386, 8397,
0610 8399, 8400, 8442, 8444, 8445, 8518, 8519, 8522, 8528, 8537,
0611 8538, 8549, 8551, 8552, 8594, 8596, 8597, 8667, 8670, 8671,
0612 8674, 8680, 8689, 8690, 8696, 8701, 8703, 8704, 8746, 8748,
0613 8749, 8819, 8822, 8823, 8826, 8832, 8841, 8842, 8843, 8846,
0614 8848, 8849, 8850, 8853, 8855, 8856, 8898, 8900, 8901, 8971,
0615 8974, 8975, 8978, 8984, 8993, 8994, 8995, 8996, 8998, 9000,
0616 9001, 9002, 9003, 9005, 9007, 9008, 9050, 9052, 9053, 9123,
0617 9126, 9127, 9130, 9133, 9136, 9137, 9145, 9146, 9147, 9148,
0618 9150, 9152, 9153, 9154, 9155, 9157, 9159, 9160, 9202, 9204,
0619 9205, 9275, 9276, 9278, 9279, 9282, 9283, 9285, 9288, 9289,
0620 9295, 9297, 9298, 9299, 9300, 9302, 9304, 9305, 9306, 9307,
0621 9309, 9311, 9312, 9354, 9356, 9357, 9440, 9450, 9455, 9615,
0622 9730, 9734, 9737, 9739, 9741, 9742, 9745, 9746, 9773, 9774,
0623 9775, 9779, 9781, 9782, 9784, 9785, 9788, 9790, 9791, 9792,
0624 9795, 9796, 9797, 9799, 9800, 9803, 9804, 9805, 9806, 9807,
0625 9814, 9890, 10042, 10048, 10194, 10200, 10345, 10346, 10347, 10352,
0626 10374, 10396, 10533, 10535, 10539, 10541, 10544, 10550, 10552, 10555,
0627 10556, 10560, 10563, 10564, 10565, 10566, 10567, 10685, 10687, 10691,
0628 10693, 10696, 10702, 10704, 10707, 10708, 10712, 10715, 10716, 10717,
0629 10718, 10719, 10725, 10801, 10803, 10817, 10852, 10953, 10954, 10955,
0630 10969, 10982, 10989, 10991, 10995, 10997, 11000, 11004, 11006, 11008,
0631 11011, 11012, 11016, 11019, 11020, 11021, 11022, 11023, 11105, 11106,
0632 11107, 11121, 11134, 11141, 11143, 11147, 11149, 11152, 11156, 11158,
0633 11160, 11163, 11164, 11168, 11171, 11172, 11173, 11174, 11175, 11308,
0634 11416, 11485, 11568, 11583, 11637, 11706, 11710, 11713, 11715, 11717,
0635 11718, 11721, 11722, 11750, 11758, 11761, 11764, 11767, 11773, 11775,
0636 11785, 11790, 11858, 11862, 11865, 11867, 11869, 11870, 11873, 11874,
0637 11882, 11899, 11900, 11902, 11904, 11905, 11906, 11910, 11913, 11914,
0638 11915, 11916, 11917, 11919, 11922, 11925, 11927, 11929, 11936, 11937,
0639 11941, 11942, 12010, 12014, 12017, 12019, 12021, 12022, 12025, 12026,
0640 12034, 12051, 12052, 12054, 12056, 12057, 12058, 12062, 12065, 12066,
0641 12067, 12068, 12069, 12071, 12074, 12077, 12079, 12081, 12088, 12089,
0642 12094, 12185, 12314, 12318, 12321, 12323, 12325, 12326, 12329, 12330,
0643 12338, 12355, 12356, 12358, 12360, 12361, 12362, 12366, 12369, 12370,
0644 12371, 12372, 12373, 12375, 12378, 12381, 12383, 12385, 12392, 12393,
0645 12398, 12466, 12470, 12473, 12475, 12477, 12478, 12481, 12482, 12510,
0646 12518, 12521, 12524, 12527, 12533, 12535, 12550, 12618, 12622, 12625,
0647 12627, 12629, 12630, 12633, 12634, 12662, 12670, 12673, 12676, 12679,
0648 12685, 12687, 12702, 12770, 12774, 12777, 12779, 12781, 12782, 12785,
0649 12786, 12814, 12822, 12825, 12828, 12831, 12837, 12839, 12854, 12922,
0650 12926, 12929, 12931, 12933, 12934, 12937, 12938, 12966, 12974, 12977,
0651 12980, 12983, 12989, 12991, 13006, 13152, 13226, 13230, 13233, 13235,
0652 13237, 13238, 13241, 13242, 13250, 13270, 13278, 13281, 13284, 13287,
0653 13293, 13295, 13310, 13402, 13544, 13554, 13682, 13686, 13689, 13691,
0654 13693, 13694, 13697, 13698, 13726, 13734, 13737, 13740, 13743, 13749,
0655 13751, 13766, 13834, 13838, 13841, 13843, 13845, 13846, 13849, 13850,
0656 13878, 13886, 13889, 13892, 13895, 13901, 13903, 13918, 13986, 13990,
0657 13993, 13995, 13997, 13998, 14001, 14002, 14030, 14038, 14041, 14044,
0658 14047, 14053, 14055, 14070, 14138, 14142, 14145, 14147, 14149, 14150,
0659 14153, 14154, 14182, 14190, 14193, 14196, 14199, 14205, 14207, 14222,
0660 14290, 14294, 14297, 14298, 14299, 14301, 14302, 14305, 14306, 14334,
0661 14342, 14345, 14348, 14351, 14357, 14359, 14374, 14500, 14652, 14746,
0662 14750, 14753, 14755, 14757, 14758, 14761, 14762, 14789, 14790, 14791,
0663 14795, 14797, 14798, 14800, 14801, 14804, 14806, 14807, 14808, 14811,
0664 14812, 14813, 14815, 14816, 14819, 14820, 14821, 14822, 14823, 14830,
0665 14898, 14902, 14905, 14907, 14909, 14910, 14913, 14914, 14942, 14950,
0666 14953, 14956, 14959, 14965, 14967, 14982, 15050, 15054, 15057, 15059,
0667 15061, 15062, 15065, 15066, 15094, 15102, 15105, 15108, 15111, 15117,
0668 15119, 15134, 15210, 15216, 15362, 15513, 15514, 15515, 15542, 15658,
0669 15662, 15665, 15667, 15669, 15670, 15673, 15674, 15702, 15710, 15713,
0670 15716, 15719, 15725, 15727, 15742, 15810, 15814, 15817, 15819, 15821,
0671 15822, 15825, 15826, 15854, 15862, 15865, 15868, 15871, 15877, 15879,
0672 15894, 15962, 15966, 15969, 15971, 15973, 15974, 15977, 15978, 16006,
0673 16014, 16017, 16020, 16023, 16029, 16031, 16046, 16114, 16118, 16121,
0674 16123, 16125, 16126, 16129, 16130, 16158, 16166, 16169, 16172, 16175,
0675 16181, 16183, 16198, 16266, 16270, 16273, 16275, 16277, 16278, 16281,
0676 16282, 16310, 16318, 16321, 16324, 16327, 16333, 16335, 16350, 16418,
0677 16422, 16425, 16427, 16429, 16430, 16433, 16434, 16462, 16470, 16473,
0678 16476, 16479, 16485, 16487, 16502, 16570, 16574, 16577, 16579, 16581,
0679 16582, 16585, 16586, 16614, 16622, 16625, 16628, 16631, 16637, 16639,
0680 16654, 16722, 16726, 16729, 16731, 16733, 16734, 16737, 16738, 16766,
0681 16774, 16777, 16780, 16783, 16789, 16791, 16806, 16874, 16878, 16881,
0682 16883, 16885, 16886, 16889, 16890, 16918, 16926, 16929, 16932, 16935,
0683 16941, 16943, 16958, 17026, 17030, 17033, 17035, 17037, 17038, 17041,
0684 17042, 17070, 17078, 17081, 17084, 17087, 17093, 17095, 17110, 17178,
0685 17182, 17185, 17187, 17189, 17190, 17193, 17194, 17222, 17230, 17233,
0686 17236, 17239, 17245, 17247, 17262, 17330, 17334, 17337, 17339, 17341,
0687 17342, 17345, 17346, 17374, 17382, 17385, 17388, 17391, 17397, 17399,
0688 17414, 17482, 17486, 17489, 17491, 17493, 17494, 17497, 17498, 17526,
0689 17534, 17537, 17540, 17543, 17549, 17551, 17566, 17634, 17638, 17641,
0690 17643, 17645, 17646, 17649, 17650, 17678, 17686, 17689, 17692, 17695,
0691 17701, 17703, 17718, 17786, 17790, 17793, 17795, 17797, 17798, 17801,
0692 17802, 17830, 17838, 17841, 17844, 17847, 17853, 17855, 17870, 17996,
0693 18110, 18130, 18133, 18135, 18139, 18141, 18143, 18144, 18150, 18152,
0694 18153, 18155, 18156, 18158, 18160, 18162, 18163, 18164, 18165, 18166,
0695 18167, 18249, 18250, 18256, 18278, 18300, 18401, 18402, 18408, 18430,
0696 18553, 18554, 18555, 18582, 18586, 18589, 18591, 18595, 18597, 18599,
0697 18600, 18604, 18606, 18608, 18609, 18611, 18612, 18614, 18616, 18618,
0698 18619, 18620, 18621, 18622, 18623, 18698, 18702, 18705, 18707, 18709,
0699 18710, 18713, 18714, 18735, 18742, 18750, 18753, 18756, 18759, 18765,
0700 18767, 18782, 18893, 18895, 18899, 18901, 18904, 18910, 18912, 18915,
0701 18916, 18920, 18923, 18924, 18925, 18926, 18927, 18933, 19016, 19026,
0702 19168, 19177, 19178, 19306, 19310, 19313, 19315, 19317, 19318, 19321,
0703 19322, 19350, 19358, 19361, 19364, 19367, 19373, 19375, 19390, 19472,
0704 19541, 19668, 19762, 19766, 19769, 19771, 19773, 19774, 19777, 19778,
0705 19806, 19814, 19817, 19820, 19823, 19829, 19831, 19846, 19928, 19997,
0706 20066, 20070, 20073, 20075, 20077, 20078, 20081, 20082, 20090, 20107,
0707 20108, 20110, 20112, 20113, 20114, 20118, 20121, 20122, 20123, 20124,
0708 20125, 20127, 20130, 20133, 20135, 20137, 20144, 20145, 20150, 20226,
0709 20232, 20378, 20384, 20530, 20536, 20681, 20840, 20850, 20978, 20982,
0710 20985, 20987, 20989, 20990, 20993, 20994, 21002, 21022, 21030, 21033,
0711 21036, 21039, 21045, 21047, 21062, 21144, 21153, 21287, 21290, 21296,
0712 21305, 21306, 21317, 21319, 21364, 21365, 21448, 21471, 21594, 21600,
0713 21746, 21895, 21898, 21904, 21913, 21914, 21925, 21927, 21970, 21972,
0714 21973, 22047, 22050, 22056, 22065, 22066, 22077, 22079, 22080, 22122,
0715 22124, 22125, 22194, 22198, 22201, 22203, 22205, 22206, 22209, 22210,
0716 22238, 22246, 22249, 22252, 22255, 22261, 22263, 22278, 22353, 22354,
0717 22360, 22382, 22505, 22506, 22507, 22534, 22538, 22541, 22543, 22547,
0718 22549, 22551, 22552, 22558, 22560, 22561, 22563, 22564, 22566, 22568,
0719 22570, 22571, 22572, 22573, 22574, 22575, 22654, 22655, 22658, 22664,
0720 22673, 22674, 22685, 22687, 22688, 22730, 22732, 22733, 22803, 22806,
0721 22807, 22810, 22816, 22825, 22826, 22832, 22837, 22839, 22840, 22882,
0722 22884, 22885, 22955, 22958, 22959, 22962, 22968, 22977, 22978, 22979,
0723 22982, 22984, 22985, 22986, 22989, 22991, 22992, 23034, 23036, 23037,
0724 23107, 23110, 23111, 23114, 23120, 23129, 23130, 23131, 23134, 23136,
0725 23137, 23138, 23141, 23143, 23144, 23186, 23188, 23189, 23259, 23262,
0726 23263, 23266, 23272, 23281, 23282, 23283, 23284, 23286, 23288, 23289,
0727 23290, 23291, 23293, 23295, 23296, 23338, 23340, 23341, 23411, 23414,
0728 23415, 23418, 23424, 23433, 23434, 23435, 23436, 23438, 23440, 23441,
0729 23442, 23443, 23445, 23447, 23448, 23490, 23492, 23493, 23563, 23566,
0730 23567, 23570, 23576, 23585, 23586, 23587, 23588, 23590, 23592, 23593,
0731 23594, 23595, 23597, 23599, 23600, 23642, 23644, 23645, 23715, 23718,
0732 23719, 23722, 23728, 23737, 23738, 23739, 23740, 23742, 23744, 23745,
0733 23746, 23747, 23749, 23751, 23752, 23794, 23796, 23797, 23867, 23870,
0734 23871, 23874, 23877, 23880, 23881, 23889, 23890, 23891, 23892, 23894,
0735 23896, 23897, 23898, 23899, 23901, 23903, 23904, 23946, 23948, 23949,
0736 24019, 24022, 24023, 24026, 24029, 24032, 24033, 24041, 24042, 24043,
0737 24044, 24046, 24048, 24049, 24050, 24051, 24053, 24055, 24056, 24098,
0738 24100, 24101, 24171, 24172, 24174, 24175, 24178, 24179, 24181, 24184,
0739 24185, 24191, 24193, 24194, 24195, 24196, 24198, 24200, 24201, 24202,
0740 24203, 24205, 24207, 24208, 24250, 24252, 24253, 24323, 24324, 24326,
0741 24327, 24330, 24331, 24333, 24336, 24337, 24343, 24345, 24346, 24347,
0742 24348, 24350, 24352, 24353, 24354, 24355, 24357, 24359, 24360, 24402,
0743 24404, 24405, 24481, 24482, 24488, 24510, 24626, 24630, 24633, 24635,
0744 24637, 24638, 24641, 24642, 24663, 24670, 24678, 24681, 24684, 24687,
0745 24693, 24695, 24710, 24786, 24818, 24821, 24823, 24827, 24829, 24831,
0746 24832, 24838, 24840, 24841, 24843, 24844, 24846, 24848, 24850, 24851,
0747 24852, 24853, 24854, 24855, 24938, 25090, 25271, 25393, 25395, 25409,
0748 25444, 25538, 25542, 25545, 25547, 25549, 25550, 25553, 25554, 25582,
0749 25590, 25593, 25596, 25599, 25605, 25607, 25622, 25690, 25694, 25697,
0750 25699, 25701, 25702, 25705, 25706, 25734, 25742, 25745, 25748, 25751,
0751 25757, 25759, 25769, 25773, 25774, 25842, 25846, 25849, 25851, 25853,
0752 25854, 25857, 25858, 25866, 25883, 25884, 25886, 25888, 25889, 25890,
0753 25894, 25897, 25898, 25899, 25900, 25901, 25903, 25906, 25909, 25911,
0754 25913, 25920, 25921, 25926, 25994, 25998, 26001, 26003, 26005, 26006,
0755 26009, 26010, 26018, 26035, 26036, 26038, 26040, 26041, 26042, 26046,
0756 26049, 26050, 26051, 26052, 26053, 26055, 26058, 26061, 26063, 26065,
0757 26072, 26073, 26078, 26146, 26150, 26153, 26155, 26157, 26158, 26161,
0758 26162, 26170, 26187, 26188, 26190, 26192, 26193, 26194, 26198, 26201,
0759 26202, 26203, 26204, 26205, 26207, 26210, 26213, 26215, 26217, 26224,
0760 26225, 26230, 26298, 26302, 26305, 26307, 26309, 26310, 26313, 26314,
0761 26342, 26350, 26353, 26356, 26359, 26365, 26367, 26382, 26450, 26454,
0762 26457, 26459, 26461, 26462, 26465, 26466, 26474, 26494, 26502, 26505,
0763 26508, 26511, 26517, 26519, 26534, 26616, 26626, 26754, 26758, 26761,
0764 26762, 26763, 26765, 26766, 26769, 26770, 26798, 26806, 26809, 26812,
0765 26815, 26821, 26823, 26838, 26906, 26910, 26913, 26915, 26917, 26918,
0766 26921, 26922, 26950, 26958, 26961, 26964, 26967, 26973, 26975, 26990,
0767 27058, 27062, 27065, 27067, 27069, 27070, 27073, 27074, 27102, 27110,
0768 27113, 27116, 27119, 27125, 27127, 27142, 27247, 27370, 27514, 27518,
0769 27521, 27523, 27525, 27526, 27529, 27530, 27538, 27555, 27556, 27558,
0770 27560, 27561, 27562, 27564, 27566, 27569, 27570, 27571, 27572, 27573,
0771 27575, 27578, 27581, 27583, 27585, 27592, 27593, 27597, 27598, 27674,
0772 27680, 27832, 27842, 27970, 27974, 27977, 27978, 27979, 27981, 27982,
0773 27985, 27986, 28014, 28022, 28025, 28028, 28031, 28037, 28039, 28054,
0774 28122, 28126, 28129, 28130, 28131, 28133, 28134, 28137, 28138, 28166,
0775 28174, 28177, 28180, 28183, 28189, 28191, 28206, 28282, 28288, 28426,
0776 28430, 28433, 28435, 28437, 28438, 28441, 28442, 28450, 28467, 28468,
0777 28470, 28472, 28473, 28474, 28478, 28481, 28482, 28483, 28484, 28485,
0778 28487, 28490, 28493, 28495, 28497, 28504, 28505, 28510, 28578, 28582,
0779 28585, 28587, 28589, 28590, 28593, 28594, 28602, 28619, 28620, 28622,
0780 28624, 28625, 28626, 28630, 28633, 28634, 28635, 28636, 28637, 28639,
0781 28642, 28645, 28647, 28649, 28656, 28657, 28662, 28754, 28882, 28886,
0782 28889, 28890, 28891, 28893, 28894, 28897, 28898, 28926, 28934, 28937,
0783 28940, 28943, 28949, 28951, 28966, 29042, 29048, 29186, 29190, 29193,
0784 29195, 29197, 29198, 29201, 29202, 29210, 29227, 29228, 29230, 29232,
0785 29233, 29234, 29238, 29241, 29242, 29243, 29244, 29245, 29247, 29250,
0786 29253, 29255, 29257, 29264, 29265, 29270, 29346, 29352, 29490, 29494,
0787 29497, 29499, 29501, 29502, 29505, 29506, 29514, 29531, 29532, 29534,
0788 29536, 29537, 29538, 29542, 29545, 29546, 29547, 29548, 29549, 29551,
0789 29554, 29557, 29559, 29561, 29568, 29569, 29574, 29642, 29646, 29649,
0790 29651, 29653, 29654, 29657, 29658, 29666, 29683, 29684, 29686, 29688,
0791 29689, 29690, 29694, 29697, 29698, 29699, 29700, 29701, 29703, 29706,
0792 29709, 29711, 29713, 29720, 29721, 29726, 29802, 29808, 29946, 29950,
0793 29953, 29955, 29957, 29958, 29961, 29962, 29970, 29987, 29988, 29990,
0794 29992, 29993, 29994, 29998, 30001, 30002, 30003, 30004, 30005, 30007,
0795 30010, 30013, 30015, 30017, 30024, 30025, 30030, 30098, 30102, 30105,
0796 30107, 30109, 30110, 30113, 30114, 30122, 30139, 30140, 30142, 30144,
0797 30145, 30146, 30150, 30153, 30154, 30155, 30156, 30157, 30159, 30162,
0798 30165, 30167, 30169, 30176, 30177, 30182, 30250, 30254, 30257, 30259,
0799 30261, 30262, 30265, 30266, 30274, 30291, 30292, 30294, 30296, 30297,
0800 30298, 30302, 30305, 30306, 30307, 30308, 30309, 30311, 30314, 30317,
0801 30319, 30321, 30328, 30329, 30334, 30402, 30406, 30409, 30411, 30413,
0802 30414, 30417, 30418, 30426, 30443, 30444, 30446, 30448, 30449, 30450,
0803 30454, 30457, 30458, 30459, 30460, 30461, 30463, 30466, 30469, 30471,
0804 30473, 30480, 30481, 30486};
0805 int pars2[2834]={
0806 40, 36, 816, 840, 884, 860, 48, 828, 856, 892, 848, 852,
0807 820, 844, 864, 824, 896, 832, 880, 900, 868, 836, 888, 40,
0808 36, 816, 840, 884, 860, 48, 828, 856, 892, 848, 852, 820,
0809 844, 864, 824, 896, 832, 880, 900, 868, 836, 888, 7, 40, // changed manually from 6 to 7
0810 36, 908, 892, 816, 840, 884, 860, 48, 828, 856, 848, 852,
0811 820, 844, 864, 824, 896, 832, 880, 900, 868, 836, 888, 64,
0812 62, 62, 62, 62, 62, 62, 816, 840, 884, 860, 48, 828,
0813 856, 62, 848, 852, 820, 844, 864, 824, 896, 832, 880, 900,
0814 868, 836, 888, 70, 70, 70, 70, 70, 70, 816, 840, 884,
0815 860, 48, 828, 856, 70, 848, 852, 820, 844, 864, 824, 896,
0816 832, 880, 900, 868, 836, 888, 78, 78, 78, 78, 78, 78,
0817 816, 840, 884, 860, 48, 828, 856, 78, 848, 852, 820, 844,
0818 864, 824, 896, 832, 880, 900, 868, 836, 888, 40, 892, 80,
0819 274, 274, 274, 274, 274, 76, 274, 274, 274, 274, 274, 274,
0820 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
0821 274, 274, 274, 310, 310, 36, 310, 310, 884, 310, 888, 40,
0822 36, 892, 92, 96, 100, 104, 194, 194, 112, 816, 840, 884,
0823 860, 48, 828, 856, 848, 852, 820, 844, 864, 824, 896, 832,
0824 880, 900, 868, 836, 888, 64, 116, 948, 816, 840, 884, 860,
0825 48, 828, 856, 848, 852, 820, 844, 864, 824, 896, 832, 880,
0826 900, 868, 836, 888, 64,1028,1008, 216,1012,1016, 192,1020,
0827 196, 992, 816, 172, 132, 840,1044, 884, 168, 136, 156, 860,
0828 48,1052, 828, 856,1048, 160, 164, 128, 144, 848,1040, 852,
0829 820, 176, 844, 864, 204, 824,1036, 896, 148, 832, 880, 900,
0830 868, 836, 888, 152, 64, 960,1024, 40, 36, 908, 892, 80,
0831 270, 270, 270, 270, 270, 76, 270, 270, 270, 270, 270, 270,
0832 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
0833 270, 270, 270,1028,1008, 256,1012,1016, 192,1020, 196,1060,
0834 1044,1052,1048,1072,1040, 204,1036,1024,1076, 816, 840, 884,
0835 860, 48, 828, 856,1080, 848, 852, 820, 844, 864, 824, 896,
0836 832, 880, 900, 868, 836, 888, 306, 306, 36, 306, 306, 884,
0837 306, 888,1096, 166, 166, 166, 166, 166, 166, 166, 166, 166,
0838 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
0839 166, 166, 166, 166, 166, 166, 166, 276, 840, 884, 860, 48,
0840 856, 848, 852, 844, 864, 896, 880, 900, 868, 836, 888, 250,
0841 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
0842 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
0843 250, 250, 250, 296, 304, 816, 840, 884, 860, 48, 828, 856,
0844 848, 852, 820, 844, 864, 824, 896, 832, 880, 900, 868, 836,
0845 888, 64,1028,1008, 216,1012,1016, 192,1020, 196,1044,1052,
0846 1048,1072,1040, 204,1036, 308,1024, 40, 36, 892,1028,1008,
0847 216,1012,1016, 192,1020, 196, 992, 816, 172, 132, 840,1044,
0848 884, 168, 136, 156, 860, 48,1052, 828, 856,1048, 160, 164,
0849 128, 144, 848,1040, 852, 820, 176, 844, 864, 204, 824,1036,
0850 896, 148, 832, 880, 900, 868, 836, 888, 152, 64,1124,1024,
0851 1028,1008, 216,1012,1016, 192,1020, 196, 992, 172, 132,1044,
0852 168, 136, 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,
0853 1036, 148, 152, 64,1128,1024, 854, 854, 854, 854, 854, 854,
0854 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854,
0855 854, 854, 854, 316, 854, 854, 854, 854, 854, 854, 854, 854,
0856 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854,
0857 1028,1008, 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,
0858 1040, 204,1036,1024, 324, 328,1136, 332, 336, 340,1028,1008,
0859 216,1012,1016, 192,1020, 196, 992, 172, 132,1044, 168, 136,
0860 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,1036, 148,
0861 152, 64,1024, 348, 352,1140,1144,1028,1008, 216,1012,1016,
0862 192,1020, 196,1148,1044,1052,1048,1072,1040, 204,1036,1024,
0863 766, 766,1164, 766, 766,1184, 766, 766,1156, 766,1168, 766,
0864 766,1172, 766,1160, 766, 766, 766, 766,1176, 766,1152, 766,
0865 766, 766, 766,1180, 766, 766, 766,1188, 766,1192, 766, 766,
0866 642, 642, 642, 642, 364, 642, 368, 642, 774, 774, 774, 774,
0867 774, 774, 376, 774, 774, 774, 774,1196, 774, 774, 774,1200,
0868 774, 384, 380, 774, 774, 774, 774, 774, 774, 774, 774, 774,
0869 774, 774, 774, 774, 774, 774, 372, 774, 774, 774, 774, 774,
0870 774, 774,1028,1008, 216,1012,1016, 192,1020, 196,1044,1052,
0871 1048,1072,1040, 204,1036,1024,1028,1008, 216,1012,1016, 192,
0872 1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,1008,
0873 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040, 204,
0874 1036,1024,1028,1008, 388,1012,1016, 192,1020, 196,1044,1052,
0875 1048,1072,1040, 204,1036,1024, 392, 654, 654, 654, 654, 654,
0876 654, 654, 654, 662, 662, 662, 662, 662, 662, 662, 396, 662,
0877 662,1028,1008, 216,1012,1016, 192,1020, 196, 840,1044, 884,
0878 860, 48,1052, 856,1048,1072, 848,1040, 852, 844, 864, 204,
0879 1036, 896, 880, 900, 868, 836, 888,1024, 670, 670, 670, 670,
0880 670, 670, 670, 412, 670, 670, 670, 416, 678, 678, 678, 678,
0881 678, 678, 678, 678, 678, 678, 678, 424, 686, 686, 686, 686,
0882 686, 686, 420, 686, 686, 686, 686, 686, 686, 694, 694, 694,
0883 694, 694, 694, 694, 428, 436, 694, 432, 440, 694, 694, 694,
0884 694, 694, 694, 706, 706, 706, 706, 706, 706, 706, 706, 444,
0885 706, 706, 706, 706, 448, 706, 706, 706, 706, 706, 706, 726,
0886 726, 726, 726, 452, 726, 456, 726, 726, 726, 726, 726, 726,
0887 726, 726, 726, 726, 726, 726, 726, 726, 726, 738, 468, 738,
0888 738, 738, 460, 738, 738, 738, 464, 738, 738, 738, 738, 738,
0889 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 194, 194,
0890 112,1220,1028,1008, 216,1012,1016, 192,1020, 196, 840,1044,
0891 884, 860, 48,1052, 856,1048,1072, 848,1040, 852, 844, 864,
0892 204,1036, 896, 880, 900, 868, 836, 888,1024,1224,1228, 472,
0893 330, 476, 488, 350, 36, 350, 492, 892, 840, 884, 860, 48,
0894 856, 848, 852, 844, 864, 896, 880, 900, 868, 836, 888, 840,
0895 884, 860, 48, 856, 848, 852, 844, 864, 896, 880, 900, 868,
0896 836, 888,1240, 40, 36, 508, 892, 210, 210, 210, 210, 210,
0897 840, 884, 860, 48, 856, 210, 848, 852, 844, 864, 896, 880,
0898 900, 868, 836, 888, 218, 218, 218, 218, 218, 840, 884, 860,
0899 48, 856, 218, 848, 852, 844, 864, 896, 880, 900, 868, 836,
0900 888, 304, 516,1260, 262, 520, 262,1028,1008, 216,1012,1016,
0901 192,1020, 196,1044,1052,1048,1072,1040, 204,1036, 308,1024,
0902 1028,1008, 216,1012,1016, 192,1020, 196, 992, 172, 132,1044,
0903 168, 136, 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,
0904 1036, 148, 152, 64,1268,1024,1028,1008, 216,1012,1016, 192,
0905 1020, 196, 992, 172, 132,1044, 168, 136, 156,1052,1048, 160,
0906 164, 128, 144,1040, 176, 204,1036, 148, 152, 64,1024, 528,
0907 1028,1008, 216,1012,1016, 192,1020, 196, 992, 172, 132,1044,
0908 168, 136, 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,
0909 1036, 148, 152, 64,1024,1028,1008, 216,1012,1016, 192,1020,
0910 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,1008, 216,
0911 1012,1016, 192,1020, 196,1044,1052,1048,1072,1040, 204,1036,
0912 1024,1028,1008, 216,1012,1016, 192,1020, 196,1044,1052,1048,
0913 1072,1040, 204,1036,1024,1028,1008, 216,1012,1016, 192,1020,
0914 196,1044,1052,1048,1072,1040, 204,1036,1024, 544,1028,1008,
0915 216,1012,1016, 192,1020, 196, 552,1044,1052,1048,1072,1040,
0916 204,1036,1024,1284, 328,1288,1028,1008, 216,1012,1016, 192,
0917 1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,1008,
0918 216,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040, 204,
0919 1036,1024,1028,1008, 256,1012,1016, 192,1020, 196,1044,1052,
0920 1048,1072,1040, 204,1036,1024,1028,1008, 216,1012,1016, 192,
0921 1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,1008,
0922 216,1296,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040,
0923 204,1036,1024,1304,1308,1028,1008, 216,1012,1016, 192,1020,
0924 196, 840,1044, 884, 860, 48,1052, 856,1048,1072, 848,1040,
0925 852, 844, 864, 204,1036, 896, 880, 900, 868, 836, 888,1024,
0926 1028,1008, 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,
0927 1040, 204,1036,1024,1028,1008, 256,1012,1016, 192,1020, 196,
0928 1044,1052,1048,1072,1040, 204,1036,1024,1312, 328, 584, 592,
0929 390, 36, 492,1028,1008, 256,1012,1016, 192,1020, 196,1044,
0930 1052,1048,1072,1040, 204,1036,1024,1028,1008, 256,1012,1016,
0931 192,1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,
0932 1008, 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040,
0933 204,1036,1024,1028,1008, 256,1012,1016, 192,1020, 196,1044,
0934 1052,1048,1072,1040, 204,1036,1024,1028,1008, 256,1012,1016,
0935 192,1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,
0936 1008, 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040,
0937 204,1036,1024,1028,1008, 256,1012,1016, 192,1020, 196,1044,
0938 1052,1048,1072,1040, 204,1036,1024,1028,1008, 256,1012,1016,
0939 192,1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,
0940 1008, 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040,
0941 204,1036,1024,1028,1008, 256,1012,1016, 192,1020, 196,1044,
0942 1052,1048,1072,1040, 204,1036,1024,1028,1008, 256,1012,1016,
0943 192,1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,
0944 1008, 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040,
0945 204,1036,1024,1028,1008, 256,1012,1016, 192,1020, 196,1044,
0946 1052,1048,1072,1040, 204,1036,1024,1028,1008, 256,1012,1016,
0947 192,1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,
0948 1008, 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040,
0949 204,1036,1024,1332,1336, 816, 840, 884, 860, 48, 828, 856,
0950 848, 852, 820, 844, 864, 824, 896, 832, 880, 900, 868, 836,
0951 888, 488, 394, 394, 492, 892, 652, 402, 402, 648, 488,1344,
0952 36, 492, 816, 840, 884, 860, 48, 828, 856, 892, 848, 852,
0953 820, 844, 864, 824, 896, 832, 880, 900, 868, 836, 888,1028,
0954 1008, 256,1012,1016, 192,1020, 196,1348,1044,1052,1048,1072,
0955 1040, 204,1036,1024, 840, 884, 860, 48, 856, 848, 852, 844,
0956 864, 896, 880, 900, 868, 836, 888,1352, 668,1356, 230, 672,
0957 230,1028,1008, 256,1012,1016, 192,1020, 196,1044,1052,1048,
0958 1072,1040, 204,1036,1024, 516,1364, 304,1028,1008, 256,1012,
0959 1016, 192,1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,
0960 676,1376,1028,1008, 216,1012,1016, 192,1020, 196, 992, 172,
0961 132,1044, 168, 136, 156,1052,1048, 160, 164, 128, 144,1040,
0962 176, 204,1036, 148, 152, 64,1024, 680, 328, 684, 328, 688,
0963 328, 692, 328, 696,1028,1008, 216,1012,1016, 192,1020, 196,
0964 704,1044,1052,1048,1072,1040, 204,1036,1024, 328, 708, 392,
0965 658, 658, 658, 658, 658, 658, 658, 658, 328,1384,1388, 712,
0966 1392, 666, 666, 666, 666, 666, 666, 666, 396, 666, 666, 674,
0967 674, 674, 674, 674, 674, 674, 412, 674, 674, 674,1028,1008,
0968 256,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040, 204,
0969 1036,1024, 592, 394, 394, 492, 592,1344, 36, 492, 816, 840,
0970 884, 860, 48, 828, 856, 848, 852, 820, 844, 864, 824, 896,
0971 832, 880, 900, 868, 836, 888, 416, 682, 682, 682, 682, 682,
0972 682, 682, 682, 682, 682, 682, 424, 690, 690, 690, 690, 690,
0973 690, 420, 690, 690, 690, 690, 690, 690, 698, 698, 698, 698,
0974 698, 698, 698, 428, 436, 698, 432, 440, 698, 698, 698, 698,
0975 698, 698, 702, 702, 702, 702, 702, 702, 702, 428, 436, 702,
0976 432, 440, 702, 702, 702, 702, 702, 702, 710, 710, 710, 710,
0977 710, 710, 710, 710, 444, 710, 710, 710, 710, 448, 710, 710,
0978 710, 710, 710, 710, 714, 714, 714, 714, 714, 714, 714, 714,
0979 444, 714, 714, 714, 714, 448, 714, 714, 714, 714, 714, 714,
0980 718, 718, 718, 718, 718, 718, 718, 718, 444, 718, 718, 718,
0981 718, 448, 718, 718, 718, 718, 718, 718, 722, 722, 722, 722,
0982 722, 722, 722, 722, 444, 722, 722, 722, 722, 448, 722, 722,
0983 722, 722, 722, 722, 730, 730, 730, 730, 452, 730, 456, 730,
0984 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730,
0985 730, 730, 734, 734, 734, 734, 452, 734, 456, 734, 734, 734,
0986 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734,
0987 742, 468, 742, 742, 742, 460, 742, 742, 742, 464, 742, 742,
0988 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742,
0989 742, 746, 468, 746, 746, 746, 460, 746, 746, 746, 464, 746,
0990 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746,
0991 746, 746, 652, 398, 398, 648,1028,1008, 256,1012,1016, 192,
0992 1020, 196,1400,1044,1052,1048,1072,1040, 204,1036,1024,1404,
0993 816, 840, 884, 860, 48, 828, 856, 848, 852, 820, 844, 864,
0994 824, 896, 832, 880, 900, 868, 836, 888,1408,1412,1416, 40,
0995 36, 508, 892,1028,1008, 256,1012,1016, 192,1020, 196,1044,
0996 1052,1048,1072,1040, 204,1036,1024,1028,1008, 216,1012,1016,
0997 192,1020, 196,1044,1052,1048,1072,1040, 204,1036, 308,1428,
0998 1024,1028,1008, 216,1012,1016, 192,1020, 196, 992, 172, 132,
0999 1044, 168, 136, 156,1052,1048, 160, 164, 128, 144,1040, 176,
1000 204,1036, 148, 152, 64,1024,1028,1008, 216,1012,1016, 192,
1001 1020, 196, 992, 172, 132,1044, 168, 136, 156,1052,1048, 160,
1002 164, 128, 144,1040, 176, 204,1036, 148, 152, 64,1024,1028,
1003 1008, 216,1012,1016, 192,1020, 196, 992, 172, 132,1044, 168,
1004 136, 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,1036,
1005 148, 152, 64,1024,1028,1008, 216,1012,1016, 192,1020, 196,
1006 1044,1052,1048,1072,1040, 204,1036,1024,1028,1008, 216,1012,
1007 1016, 192,1020, 196, 736,1044,1052,1048,1072,1040, 204,1036,
1008 1024, 328, 740,1028,1008, 216, 748,1012,1016, 192,1020, 196,
1009 1044,1052,1048,1072,1040, 204,1036,1024,1028,1008, 256,1012,
1010 1016, 192,1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,
1011 1028,1008, 216,1012,1016, 192,1020, 196,1044,1052,1048,1072,
1012 1040, 204,1036,1024,1452,1456, 510, 510, 510, 510, 510, 510,
1013 510, 510, 510, 510, 510, 510, 510, 510, 510, 752, 510, 510,
1014 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
1015 510, 756, 328, 328, 760,1028,1008, 216, 768,1012,1016, 192,
1016 1020, 196,1044,1052,1048,1072,1040, 204,1036,1024,1028,1008,
1017 216, 776,1012,1016, 192,1020, 196,1044,1052,1048,1072,1040,
1018 204,1036,1024, 780, 328,1028,1008, 216,1012,1016, 192,1020,
1019 196, 992, 172, 132,1044, 168, 136, 156,1052,1048, 160, 164,
1020 128, 144,1040, 176, 204,1036, 148, 152, 64,1024,1028,1008,
1021 216,1012,1016, 192,1020, 196, 992, 172, 132,1044, 168, 136,
1022 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,1036, 148,
1023 152, 64,1024,1468,1028,1008, 216, 788,1012,1016, 192,1020,
1024 196,1044,1052,1048,1072,1040, 204,1036,1024, 792, 328,1028,
1025 1008, 216,1012,1016, 192,1020, 196, 992, 172, 132,1044, 168,
1026 136, 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,1036,
1027 148, 152, 64,1024, 796, 328,1028,1008, 216,1012,1016, 192,
1028 1020, 196, 992, 172, 132,1044, 168, 136, 156,1052,1048, 160,
1029 164, 128, 144,1040, 176, 204,1036, 148, 152, 64,1024,1028,
1030 1008, 216,1012,1016, 192,1020, 196, 992, 172, 132,1044, 168,
1031 136, 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,1036,
1032 148, 152, 64,1024, 800, 328,1028,1008, 216,1012,1016, 192,
1033 1020, 196, 992, 172, 132,1044, 168, 136, 156,1052,1048, 160,
1034 164, 128, 144,1040, 176, 204,1036, 148, 152, 64,1024,1028,
1035 1008, 216,1012,1016, 192,1020, 196, 992, 172, 132,1044, 168,
1036 136, 156,1052,1048, 160, 164, 128, 144,1040, 176, 204,1036,
1037 148, 152, 64,1024,1028,1008, 216,1012,1016, 192,1020, 196,
1038 992, 172, 132,1044, 168, 136, 156,1052,1048, 160, 164, 128,
1039 144,1040, 176, 204,1036, 148, 152, 64,1024,1028,1008, 216,
1040 1012,1016, 192,1020, 196, 992, 172, 132,1044, 168, 136, 156,
1041 1052,1048, 160, 164, 128, 144,1040, 176, 204,1036, 148, 152,
1042 64,1024};
1043 int pars3[1587]={
1044 98, 100, 101, 103, 104, 111, 112, 128, 137, 142,
1045 143, 144, 146, 148, 250, 252, 253, 255, 256, 263,
1046 264, 280, 289, 294, 295, 298, 300, 405, 407, 419,
1047 420, 432, 550, 554, 555, 556, 560, 593, 598, 599,
1048 602, 604, 708, 712, 745, 750, 751, 754, 756, 860,
1049 864, 897, 902, 903, 906, 908, 1012, 1016, 1049, 1054,
1050 1055, 1058, 1060, 1167, 1496, 1514, 1515, 1621, 1623, 1648,
1051 2070, 2074, 2075, 2076, 2080, 2113, 2118, 2119, 2122, 2124,
1052 2374, 2378, 2380, 2384, 2417, 2422, 2423, 2426, 2428, 2519,
1053 2521, 2523, 2525, 2526, 2527, 2528, 2530, 2531, 2532, 2536,
1054 2539, 2540, 2541, 2542, 2546, 2551, 2552, 2553, 2554, 2555,
1055 2556, 2561, 2562, 2563, 2564, 2565, 2567, 2568, 2569, 2574,
1056 2575, 2578, 2580, 2581, 2582, 2685, 2687, 2699, 2700, 2712,
1057 2975, 2977, 2981, 2983, 2984, 2985, 2995, 2996, 3002, 3010,
1058 3011, 3012, 3017, 3018, 3019, 3021, 3037, 3038, 3140, 3144,
1059 3153, 3165, 3166, 3167, 3177, 3182, 3183, 3186, 3188, 3320,
1060 3338, 3752, 3782, 3786, 3787, 3790, 3791, 3794, 3796, 4057,
1061 4058, 4198, 4202, 4204, 4208, 4241, 4246, 4247, 4250, 4252,
1062 4343, 4345, 4347, 4349, 4351, 4352, 4363, 4364, 4370, 4373,
1063 4378, 4379, 4380, 4385, 4386, 4387, 4389, 4405, 4406, 4509,
1064 4511, 4523, 4536, 4647, 4649, 4651, 4653, 4654, 4655, 4656,
1065 4658, 4660, 4664, 4667, 4668, 4669, 4670, 4674, 4679, 4680,
1066 4681, 4682, 4683, 4684, 4689, 4690, 4691, 4692, 4693, 4695,
1067 4696, 4697, 4702, 4703, 4706, 4708, 4709, 4710, 4799, 4801,
1068 4803, 4805, 4806, 4807, 4808, 4819, 4820, 4821, 4822, 4826,
1069 4831, 4832, 4833, 4834, 4835, 4836, 4841, 4842, 4843, 4844,
1070 4845, 4847, 4861, 4862, 5103, 5105, 5109, 5111, 5112, 5113,
1071 5123, 5124, 5130, 5138, 5139, 5140, 5145, 5146, 5147, 5149,
1072 5165, 5166, 6015, 6017, 6019, 6021, 6022, 6023, 6024, 6035,
1073 6036, 6037, 6038, 6042, 6047, 6048, 6049, 6050, 6051, 6052,
1074 6057, 6058, 6059, 6060, 6061, 6063, 6077, 6078, 6775, 6777,
1075 6779, 6781, 6783, 6784, 6795, 6796, 6797, 6802, 6810, 6811,
1076 6812, 6817, 6818, 6819, 6821, 6837, 6838, 6932, 7392, 7425,
1077 7426, 7445, 7446, 7544, 7577, 7578, 7597, 7598, 7693, 7696,
1078 7729, 7730, 7749, 7750, 7848, 7881, 7882, 7901, 7902, 8295,
1079 8297, 8299, 8301, 8303, 8304, 8312, 8315, 8316, 8317, 8322,
1080 8330, 8331, 8332, 8337, 8338, 8339, 8341, 8342, 8350, 8351,
1081 8353, 8354, 8356, 8357, 8358, 9815, 9817, 9819, 9821, 9823,
1082 9824, 9832, 9835, 9836, 9837, 9842, 9850, 9851, 9852, 9857,
1083 9858, 9859, 9861, 9862, 9870, 9871, 9873, 9874, 9876, 9877,
1084 9878, 10424, 10437, 10438, 10439, 10464, 10592, 10622, 10626, 10627,
1085 10630, 10631, 10634, 10636, 10744, 10774, 10778, 10782, 10783, 10786,
1086 10788, 10893, 10895, 10920, 10932, 10933, 11048, 11078, 11086, 11087,
1087 11090, 11092, 11200, 11230, 11238, 11239, 11242, 11244, 11353, 11354,
1088 11791, 11793, 11795, 11797, 11799, 11800, 11811, 11812, 11818, 11821,
1089 11822, 11826, 11827, 11828, 11833, 11834, 11835, 11837, 11853, 11854,
1090 11943, 11945, 11947, 11949, 11950, 11951, 11952, 11963, 11964, 11965,
1091 11966, 11970, 11975, 11976, 11977, 11978, 11979, 11980, 11985, 11986,
1092 11987, 11988, 11989, 11991, 12005, 12006, 12095, 12097, 12099, 12101,
1093 12102, 12103, 12104, 12115, 12116, 12117, 12118, 12122, 12127, 12128,
1094 12129, 12130, 12131, 12132, 12137, 12138, 12139, 12140, 12141, 12143,
1095 12157, 12158, 12399, 12401, 12403, 12405, 12406, 12407, 12408, 12419,
1096 12420, 12421, 12422, 12426, 12431, 12432, 12433, 12434, 12435, 12436,
1097 12441, 12442, 12443, 12444, 12445, 12447, 12461, 12462, 12551, 12553,
1098 12555, 12557, 12559, 12560, 12571, 12572, 12578, 12586, 12587, 12588,
1099 12593, 12594, 12595, 12597, 12613, 12614, 12703, 12705, 12707, 12709,
1100 12711, 12712, 12723, 12724, 12725, 12730, 12738, 12739, 12740, 12745,
1101 12746, 12747, 12749, 12765, 12766, 12855, 12857, 12859, 12861, 12863,
1102 12864, 12875, 12876, 12877, 12882, 12890, 12891, 12892, 12897, 12898,
1103 12899, 12901, 12917, 12918, 13007, 13009, 13011, 13013, 13015, 13016,
1104 13027, 13028, 13029, 13034, 13042, 13043, 13044, 13049, 13050, 13051,
1105 13053, 13069, 13070, 13311, 13313, 13315, 13317, 13319, 13320, 13331,
1106 13332, 13333, 13338, 13346, 13347, 13348, 13353, 13354, 13355, 13357,
1107 13373, 13374, 13767, 13769, 13771, 13773, 13775, 13776, 13787, 13788,
1108 13794, 13802, 13803, 13804, 13809, 13810, 13811, 13813, 13829, 13830,
1109 13919, 13921, 13923, 13925, 13927, 13928, 13939, 13940, 13941, 13946,
1110 13954, 13955, 13956, 13961, 13962, 13963, 13965, 13981, 13982, 14071,
1111 14073, 14077, 14080, 14091, 14092, 14098, 14106, 14108, 14113, 14114,
1112 14115, 14117, 14133, 14134, 14223, 14225, 14227, 14229, 14231, 14232,
1113 14243, 14244, 14245, 14250, 14258, 14259, 14260, 14265, 14266, 14267,
1114 14269, 14285, 14286, 14375, 14377, 14378, 14379, 14381, 14383, 14384,
1115 14395, 14396, 14402, 14410, 14411, 14412, 14417, 14418, 14419, 14421,
1116 14437, 14438, 14831, 14833, 14835, 14837, 14839, 14840, 14848, 14851,
1117 14852, 14853, 14858, 14866, 14867, 14868, 14873, 14874, 14875, 14877,
1118 14878, 14886, 14887, 14889, 14890, 14892, 14893, 14894, 14983, 14985,
1119 14989, 14992, 15003, 15004, 15010, 15020, 15025, 15026, 15027, 15029,
1120 15045, 15046, 15135, 15137, 15141, 15144, 15155, 15156, 15172, 15177,
1121 15178, 15179, 15181, 15197, 15198, 15592, 15606, 15632, 15743, 15745,
1122 15749, 15752, 15763, 15780, 15785, 15786, 15787, 15789, 15805, 15806,
1123 15897, 15901, 15904, 15915, 15932, 15937, 15938, 15939, 15941, 15957,
1124 15958, 16049, 16053, 16056, 16084, 16089, 16090, 16091, 16093, 16109,
1125 16110, 16201, 16205, 16208, 16236, 16241, 16242, 16243, 16245, 16261,
1126 16262, 16353, 16357, 16360, 16388, 16393, 16394, 16397, 16413, 16414,
1127 16505, 16509, 16512, 16540, 16545, 16546, 16549, 16565, 16566, 16657,
1128 16661, 16664, 16692, 16697, 16698, 16701, 16717, 16718, 16809, 16813,
1129 16816, 16844, 16849, 16850, 16853, 16869, 16870, 16961, 16965, 16968,
1130 16996, 17001, 17002, 17021, 17022, 17113, 17117, 17120, 17148, 17153,
1131 17154, 17173, 17174, 17269, 17272, 17300, 17305, 17306, 17325, 17326,
1132 17421, 17424, 17452, 17457, 17458, 17477, 17478, 17573, 17576, 17609,
1133 17610, 17629, 17630, 17725, 17728, 17761, 17762, 17781, 17782, 17877,
1134 17880, 17913, 17914, 17933, 17934, 18188, 18192, 18213, 18225, 18230,
1135 18231, 18234, 18236, 18342, 18343, 18632, 18644, 18645, 18646, 18647,
1136 18648, 18669, 18670, 18671, 18672, 18681, 18686, 18687, 18690, 18692,
1137 18783, 18785, 18789, 18791, 18792, 18793, 18803, 18804, 18810, 18818,
1138 18819, 18820, 18825, 18826, 18827, 18829, 18845, 18846, 18952, 18982,
1139 18986, 18990, 18991, 18994, 18996, 19391, 19393, 19397, 19399, 19400,
1140 19401, 19411, 19412, 19418, 19426, 19427, 19428, 19433, 19434, 19435,
1141 19437, 19453, 19454, 19713, 19847, 19849, 19853, 19855, 19856, 19857,
1142 19867, 19868, 19874, 19882, 19883, 19884, 19889, 19890, 19891, 19893,
1143 19909, 19910, 20151, 20153, 20155, 20157, 20158, 20159, 20160, 20171,
1144 20172, 20173, 20174, 20178, 20183, 20184, 20185, 20186, 20187, 20188,
1145 20193, 20194, 20195, 20196, 20197, 20199, 20213, 20214, 21063, 21065,
1146 21067, 21069, 21071, 21072, 21083, 21084, 21085, 21090, 21098, 21099,
1147 21100, 21105, 21106, 21107, 21109, 21125, 21126, 22285, 22288, 22321,
1148 22322, 22341, 22342, 22446, 22584, 22596, 22598, 22600, 22621, 22622,
1149 22623, 22624, 22633, 22638, 22639, 22642, 22644, 24711, 24713, 24717,
1150 24719, 24720, 24721, 24731, 24732, 24738, 24746, 24747, 24748, 24753,
1151 24754, 24755, 24757, 24773, 24774, 24876, 24880, 24901, 24902, 24903,
1152 24913, 24918, 24919, 24922, 24924, 25485, 25487, 25512, 25524, 25623,
1153 25625, 25629, 25631, 25632, 25633, 25643, 25644, 25650, 25658, 25659,
1154 25660, 25665, 25666, 25667, 25669, 25685, 25686, 25775, 25777, 25779,
1155 25781, 25783, 25784, 25795, 25796, 25802, 25805, 25810, 25811, 25812,
1156 25817, 25818, 25819, 25821, 25837, 25838, 25927, 25929, 25931, 25933,
1157 25934, 25935, 25936, 25947, 25948, 25949, 25950, 25954, 25959, 25960,
1158 25961, 25962, 25963, 25964, 25969, 25970, 25971, 25972, 25973, 25975,
1159 25989, 25990, 26079, 26081, 26083, 26085, 26086, 26087, 26088, 26099,
1160 26100, 26101, 26102, 26106, 26111, 26112, 26113, 26114, 26115, 26116,
1161 26121, 26122, 26123, 26124, 26125, 26127, 26141, 26142, 26231, 26233,
1162 26235, 26237, 26238, 26239, 26240, 26251, 26252, 26253, 26254, 26258,
1163 26263, 26264, 26265, 26266, 26267, 26268, 26273, 26274, 26275, 26276,
1164 26277, 26279, 26293, 26294, 26383, 26385, 26387, 26389, 26391, 26392,
1165 26403, 26404, 26405, 26410, 26418, 26419, 26420, 26425, 26426, 26427,
1166 26429, 26445, 26446, 26535, 26537, 26539, 26541, 26543, 26544, 26555,
1167 26556, 26557, 26562, 26570, 26571, 26572, 26577, 26578, 26579, 26581,
1168 26597, 26598, 26839, 26841, 26843, 26845, 26847, 26848, 26859, 26860,
1169 26861, 26866, 26874, 26875, 26876, 26881, 26882, 26883, 26885, 26901,
1170 26902, 26991, 26993, 26997, 26999, 27000, 27011, 27012, 27018, 27026,
1171 27027, 27028, 27033, 27034, 27035, 27037, 27053, 27054, 27143, 27145,
1172 27147, 27149, 27151, 27152, 27163, 27164, 27170, 27178, 27179, 27180,
1173 27185, 27186, 27187, 27189, 27205, 27206, 28055, 28057, 28059, 28061,
1174 28063, 28064, 28075, 28076, 28077, 28082, 28090, 28091, 28092, 28097,
1175 28098, 28099, 28101, 28117, 28118, 28207, 28209, 28211, 28213, 28215,
1176 28216, 28227, 28228, 28229, 28234, 28242, 28243, 28244, 28249, 28250,
1177 28251, 28253, 28269, 28270, 28511, 28513, 28515, 28517, 28518, 28519,
1178 28520, 28531, 28532, 28533, 28534, 28538, 28543, 28544, 28545, 28546,
1179 28547, 28548, 28553, 28554, 28555, 28556, 28557, 28559, 28573, 28574,
1180 28663, 28665, 28667, 28669, 28670, 28671, 28672, 28683, 28684, 28685,
1181 28686, 28690, 28695, 28696, 28697, 28698, 28699, 28700, 28705, 28706,
1182 28707, 28708, 28709, 28711, 28725, 28726, 28967, 28969, 28971, 28973,
1183 28975, 28976, 28987, 28988, 28989, 28994, 29002, 29003, 29004, 29009,
1184 29010, 29011, 29013, 29029, 29030, 29271, 29273, 29275, 29277, 29278,
1185 29279, 29280, 29291, 29292, 29293, 29294, 29298, 29303, 29304, 29305,
1186 29306, 29307, 29308, 29313, 29314, 29315, 29316, 29317, 29319, 29333,
1187 29334, 29575, 29577, 29579, 29581, 29582, 29583, 29584, 29595, 29596,
1188 29597, 29598, 29602, 29607, 29608, 29609, 29610, 29611, 29612, 29617,
1189 29618, 29619, 29620, 29621, 29623, 29637, 29638, 29727, 29729, 29731,
1190 29733, 29734, 29735, 29736, 29747, 29748, 29749, 29750, 29754, 29759,
1191 29760, 29761, 29762, 29763, 29764, 29769, 29770, 29771, 29772, 29773,
1192 29775, 29789, 29790, 30031, 30033, 30035, 30037, 30038, 30039, 30040,
1193 30051, 30052, 30053, 30054, 30058, 30063, 30064, 30065, 30066, 30067,
1194 30068, 30073, 30074, 30075, 30076, 30077, 30079, 30093, 30094, 30183,
1195 30185, 30187, 30189, 30190, 30191, 30192, 30203, 30204, 30205, 30206,
1196 30210, 30215, 30216, 30217, 30218, 30219, 30220, 30225, 30226, 30227,
1197 30228, 30229, 30231, 30245, 30246, 30335, 30337, 30339, 30341, 30342,
1198 30343, 30344, 30355, 30356, 30357, 30358, 30362, 30367, 30368, 30369,
1199 30370, 30371, 30372, 30377, 30378, 30379, 30380, 30381, 30383, 30397,
1200 30398, 30487, 30489, 30491, 30493, 30494, 30495, 30496, 30507, 30508,
1201 30509, 30510, 30514, 30519, 30520, 30521, 30522, 30523, 30524, 30529,
1202 30530, 30531, 30532, 30533, 30535, 30549, 30550};
1203 int pars4[1587]={
1204 203, 2, 3, 8,219,201,202, 7, 4, 11,218, 1, 6, 5,203, 2,
1205 3, 8,219,226,202, 7, 4, 11,218, 6, 5, 13, 8,228, 14, 7,
1206 229,230, 15, 17,219, 4, 11,218, 6, 5,231,219, 4, 11,218, 6,
1207 5,232,219, 4, 11,218, 6, 5,233,219, 4, 11,218, 6, 5, 18,
1208 234,235, 21, 22, 8, 7,236,230, 27, 17,219, 4, 11,218, 6, 5,
1209 238,239, 17,219, 4, 11,218, 6, 5, 56, 60,249,264,244,250,258,
1210 230, 30, 17,219, 57, 55, 35,243, 53,246,247,242, 52, 46, 61, 47,
1211 251, 58,245, 59,241, 31, 4, 11,218, 6, 5, 45, 50, 62, 8,228,
1212 14, 7, 56, 60,264,266,258, 63, 57, 55, 53, 52, 46, 61, 47,251,
1213 58, 59,267, 50, 68,219, 66,271, 67, 65, 4, 11,218, 6, 5,272,
1214 273,219, 71,275, 70, 11,218, 73, 72,276, 75,277,239, 17,219, 4,
1215 11,218, 6, 5, 56, 60,279,264,250,258, 57, 55, 53,278, 52, 46,
1216 61, 47,251, 58, 59, 45, 50, 62, 8,280, 7, 56, 60,249,264,244,
1217 250,258,239, 17,219, 57, 55, 35,243, 53,246,247,242, 52, 46, 61,
1218 47,251, 58,245, 59,241, 78, 4, 11,218, 6, 5, 45, 50, 56, 60,
1219 249,264,244,250,258, 57, 55, 35,243, 53,246,247,242, 52, 46, 61,
1220 47,251, 58,245, 59,283, 45, 50, 56, 60,264,266,258, 80, 57, 55,
1221 53, 52, 46, 61, 47,251, 58, 59,267, 50, 56, 60,249,264,244,250,
1222 258, 57, 55, 35,243, 53,246,247,242, 52, 46, 61, 47,251, 58,245,
1223 59, 86, 45, 50, 56, 60,249,264,250,258, 57, 55, 89, 53, 52, 46,
1224 61, 47,251, 58, 59, 45, 50, 90,258, 47,251,301, 50,258, 47,251,
1225 302, 50,303,258, 47,251,267, 50,258, 47,251,304, 50, 56, 60,249,
1226 264,250,258,219, 57, 55,100, 53, 52, 46, 61, 47,251, 58, 59,102,
1227 11,218,101, 73, 72, 45, 50, 56, 60,249,264,250,258,219, 57, 55,
1228 100, 53, 52, 46, 61, 47,251, 58, 59,102, 11,218,101, 73, 72, 45,
1229 50,309,308,121, 8,120,219, 71,275,124, 11,218, 73, 72,219, 71,
1230 311, 11,218, 73, 72,126, 8, 7,312,125,219,313, 11,218, 73, 72,
1231 219,314, 11,218, 73, 72,276,128, 56, 60,279,264,250,258, 57, 55,
1232 53,316,131, 52, 46, 61, 47,251, 58, 59, 45, 50, 56, 60,249,264,
1233 244,250,258, 57, 55, 35,243, 53,246,247,242, 52, 46, 61, 47,251,
1234 58,245, 59,283, 45, 50, 56, 60,249,264,244,250,258, 57, 55, 35,
1235 243, 53,246,247,242, 52, 46, 61, 47,251, 58,245, 59,318, 45, 50,
1236 56, 60,249,264,244,250,258, 57, 55, 35,243, 53,246,247,242, 52,
1237 46, 61, 47,251, 58,245, 59,319, 45, 50, 56, 60,320,264,250,258,
1238 57, 55, 53, 52, 46, 61, 47,251, 58, 59, 45, 50, 56, 60,249,264,
1239 250,258, 57, 55,133, 53, 52, 46, 61, 47,251, 58, 59, 45, 50, 56,
1240 60,249,264,250,258, 57, 55,134, 53, 52, 46, 61, 47,251, 58, 59,
1241 45, 50, 56, 60,249,264,250,258, 57, 55,135, 53, 52, 46, 61, 47,
1242 251, 58, 59, 45, 50, 56, 60,249,264,250,258, 57, 55,137, 53, 52,
1243 46, 61, 47,251, 58, 59, 45, 50, 56, 60,323,264,250,258, 57, 55,
1244 53, 52, 46, 61, 47,251, 58, 59, 45, 50, 56, 60,249,264,250,258,
1245 57, 55,139, 53, 52, 46, 61, 47,251, 58, 59, 45, 50, 56, 60,264,
1246 258, 57, 55, 53,140, 61, 47,251, 58, 59,267, 50, 56, 60,249,264,
1247 250,258, 57, 55,141, 53, 52, 46, 61, 47,251, 58, 59, 45, 50, 56,
1248 60,142,325,264,250,258, 57, 55, 53, 52, 46, 61, 47,251, 58, 59,
1249 45, 50, 56, 60,249,264,250,258,219, 57, 55,100, 53, 52, 46, 61,
1250 47,251, 58, 59,102, 11,218,143, 73, 72, 45, 50, 56, 60,264,258,
1251 57, 55,144, 61, 47,251, 58, 59,267, 50, 56, 60,264,258, 57,145,
1252 61, 47,251, 58, 59,267, 50,329,121,147,149, 60,264,258, 57, 61,
1253 47,251, 58, 59,267, 50, 60,264,258,150, 61, 47,251, 58, 59,267,
1254 50, 60,264,258, 61, 47,251,151, 59,267, 50, 60,264,258, 61, 47,
1255 251,152, 59,267, 50, 60,264,258, 61, 47,251,153,267, 50, 60,264,
1256 258, 61, 47,251,154,267, 50, 60,264,258, 61, 47,251,155,267, 50,
1257 60,264,258, 61, 47,251,156,267, 50,157,264,258, 61, 47,251,267,
1258 50,158,264,258, 61, 47,251,267, 50,264,258,159, 47,251,267, 50,
1259 264,258,160, 47,251,267, 50,330,258, 47,251,267, 50,331,258, 47,
1260 251,267, 50,332,258, 47,251,267, 50, 68,219,335, 4, 11,218, 6,
1261 5,161, 18,164, 68, 22,121, 8,219,271, 67,165,120, 4, 11,218,
1262 6, 5, 56, 60,264,266,258,166, 57, 55, 53, 52, 46, 61, 47,251,
1263 58, 59,267, 50,219, 71,311, 11,218, 73, 72, 56, 60,264,266,258,
1264 340, 57, 55, 53, 52, 46, 61, 47,251, 58, 59,267, 50,342, 56, 60,
1265 264,266,258,343, 57, 55, 53, 52, 46, 61, 47,251, 58, 59,267, 50,
1266 56, 60,249,264,244,250,258, 57, 55, 35,243, 53,246,247,242, 52,
1267 46, 61, 47,251, 58,245, 59,345, 45, 50, 56, 60,249,264,250,258,
1268 57, 55,175, 53, 52, 46, 61, 47,251, 58, 59, 45, 50,349,258, 47,
1269 251,267, 50,161,164, 68,121,219,271, 67,165,147, 4, 11,218, 6,
1270 5, 56, 60,264,266,258,179, 57, 55, 53, 52, 46, 61, 47,251, 58,
1271 59,267, 50, 68,219,271, 67,180, 4, 11,218, 6, 5,126, 8, 7,
1272 355, 56, 60,264,266,258,356, 57, 55, 53, 52, 46, 61, 47,251, 58,
1273 59,267, 50, 56, 60,279,264,250,258, 57, 55, 53,358, 52, 46, 61,
1274 47,251, 58, 59, 45, 50, 56, 60,249,264,244,250,258, 57, 55, 35,
1275 243, 53,246,247,242, 52, 46, 61, 47,251, 58,245, 59,181, 45, 50,
1276 56, 60,249,264,244,250,258, 57, 55, 35,243, 53,246,247,242, 52,
1277 46, 61, 47,251, 58,245, 59,359, 45, 50, 56, 60,249,264,244,250,
1278 258, 57, 55, 35,243, 53,246,247,242, 52, 46, 61, 47,251, 58,245,
1279 59,360, 45, 50, 56, 60,249,264,250,258, 57, 55,182, 53, 52, 46,
1280 61, 47,251, 58, 59, 45, 50, 56, 60,249,264,250,258, 57, 55,183,
1281 53, 52, 46, 61, 47,251, 58, 59, 45, 50, 56, 60,249,264,250,258,
1282 57, 55,186, 53, 52, 46, 61, 47,251, 58, 59, 45, 50, 56, 60,264,
1283 361,258, 57, 55, 53, 52, 46, 61, 47,251, 58, 59,267, 50, 56, 60,
1284 362,264,250,258, 57, 55, 53, 52, 46, 61, 47,251, 58, 59, 45, 50,
1285 56, 60,249,264,250,258, 57, 55,191, 53, 52, 46, 61, 47,251, 58,
1286 59, 45, 50, 56, 60,249,264,250,258, 57, 55,193, 53, 52, 46, 61,
1287 47,251, 58, 59, 45, 50, 56, 60,249,264,244,250,258, 57, 55, 35,
1288 243, 53,246,247,242, 52, 46, 61, 47,251, 58,245, 59,365, 45, 50,
1289 56, 60,249,264,244,250,258, 57, 55, 35,243, 53,246,247,242, 52,
1290 46, 61, 47,251, 58,245, 59,366, 45, 50, 56, 60,249,264,250,258,
1291 57, 55,196, 53, 52, 46, 61, 47,251, 58, 59, 45, 50, 56, 60,249,
1292 264,244,250,258, 57, 55, 35,243, 53,246,247,242, 52, 46, 61, 47,
1293 251, 58,245, 59,368, 45, 50, 56, 60,249,264,244,250,258, 57, 55,
1294 35,243, 53,246,247,242, 52, 46, 61, 47,251, 58,245, 59,369, 45,
1295 50, 56, 60,249,264,244,250,258, 57, 55, 35,243, 53,246,247,242,
1296 52, 46, 61, 47,251, 58,245, 59,370, 45, 50, 56, 60,249,264,244,
1297 250,258, 57, 55, 35,243, 53,246,247,242, 52, 46, 61, 47,251, 58,
1298 245, 59,371, 45, 50, 56, 60,249,264,244,250,258, 57, 55, 35,243,
1299 53,246,247,242, 52, 46, 61, 47,251, 58,245, 59,372, 45, 50, 56,
1300 60,249,264,244,250,258, 57, 55, 35,243, 53,246,247,242, 52, 46,
1301 61, 47,251, 58,245, 59,373, 45, 50, 56, 60,249,264,244,250,258,
1302 57, 55, 35,243, 53,246,247,242, 52, 46, 61, 47,251, 58,245, 59,
1303 374, 45, 50};
1304 int pars5[174]={
1305 2, 4, 5, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
1306 33, 34, 35, 36, 37, 38, 69, 42, 43, 3, 11, 46, 9, 12, 14, 16,
1307 18, 79, 80, 8, 10, 7, 13,124,125,110,111,112,113,114,115,120,
1308 145,147,205,199,200,201,202,203,204,214,215,219,220,221,222,187,
1309 72,162,191,213, 75, 89, 84, 78, 81, 70, 44, 63, 6, 49, 91, 47,
1310 122,123,126,119,141,142,144,149,150,151,152,153,154,155,156,157,
1311 158,159,211,212,194,195,196,197, 71, 73, 74, 86, 88, 40, 45, 55,
1312 51, 53, 61, 94,121,116,118,146,140,143,148,208,217,209,210,216,
1313 96,188,189,190, 90, 83, 85,109,105, 39, 50, 59, 60, 64, 66, 92,
1314 117,206,207,198,192,103,107,101,108,104, 56, 58, 93, 95,129,130,
1315 161,218,102,106,139,128,131,136,137,138,135,134,133,132};
1316 int pars6[722]={
1317 1,144,144,111,144,144,111,111,112,111, 98,112,100,101, 99, 94,112,101,
1318 99, 94,112,100,101, 94,112,101, 94, 98,100,116, 26, 98,100, 26, 99, 98,
1319 99, 99, 98,100,137,100,100,137,100,148,100,100,148,100,146,100,100,146,
1320 137, 42,137, 65,137, 70,137, 55,137, 74,148, 78,148, 45,148, 67,148, 62,
1321 148, 64,148, 56,148, 51,148, 68,148, 77,148,143,148,104,148, 75,146, 47,
1322 146, 79,143,142, 60, 81,139, 85,143,142, 81,139, 85,143,142, 60,142, 72,
1323 142, 76,139,138,139,139,138,116,115,116,116, 16,115,115,101,115,101, 31,
1324 117,138,134,141, 26,134,148,134,134,148,134,146,134,134,146,141,140,141,
1325 141, 16,140,140,101,140,101, 25, 97,140, 25, 97,104, 53, 60, 81,106, 85,
1326 104, 53, 81,106, 85,104, 53, 60,106,105,106,106, 16,105,105, 60,105, 60,
1327 31, 97,101,128,103,101,103,103, 60,103, 9,101, 10,103,103, 38, 97, 39,
1328 103,103, 38, 39,103,103, 9,127, 10,103,103, 9,113, 10,103,103, 9, 10,
1329 128, 11,147,128, 11,128, 11,147,128,128, 11,128,147,146,147,147,146,127,
1330 126,127,126, 16, 22,126,125,126,126, 16,125,125,100,101,125,100,125,100,
1331 88,113, 60,113,113, 16, 60,117, 91,117, 81,118, 85,117, 81,118, 16, 85,
1332 118,117,118,118, 16,117,145,134, 88,145,134, 88,128, 88,128,102, 88,102,
1333 102, 9, 88, 10,102,102, 38, 97, 39,102,102, 38, 39,102, 38, 97, 39,102,
1334 38, 39,102,102, 9,127, 10,102,102, 9, 10,102, 9,127, 10,102, 9, 10,
1335 135,121,135,110,135, 94,135,132,135,119,135,120,121, 60, 25,135,121, 44,
1336 97, 25,135,121, 49, 25,135,110,109, 26,110, 26, 94, 81, 99,136, 85, 94,
1337 81, 99, 85, 94, 81,136, 85, 94, 81, 85,136,135,136,136,135,132, 61, 9,
1338 109, 10,135,132, 61, 9,109, 10,135, 52,135,132, 73, 9,109, 10,135,119,
1339 80, 9,109, 10,135,119, 50,135, 80, 9,109, 10, 26,119, 58, 9,109, 26,
1340 109, 26,109, 10,135,119, 58, 9, 26,109, 26,109, 10,135,119, 58, 9,109,
1341 26, 26,109, 10,135,119, 58, 9,109, 26,109, 26, 10,135,119, 58, 9,109,
1342 26, 26, 10,135,119, 58, 9, 26,109, 26, 10,135,119, 58, 9, 26, 26,109,
1343 10,135,119, 58, 9, 26, 26, 10,135,120, 59, 60, 26,120, 48, 26,120, 43,
1344 26,120, 66,109, 26,120, 66, 26,109, 91,109,109, 16, 91, 91, 95, 91,149,
1345 92, 91, 92, 31, 92, 12, 92, 24, 92, 5, 92, 15, 92, 19, 92, 29, 92, 36,
1346 92, 8, 92, 41, 92, 83, 95,123, 95,123, 37,109, 25, 95, 97, 95,123,122,
1347 123,123, 84,122,122,114,122,122, 7,114,114,108,114,114, 82,108,108, 87,
1348 108,108, 40, 87, 87,107, 87, 87, 6,107,107,131,107,107, 32,131,107,107,
1349 3,131,131,133,131,131, 27,133,131,131, 33,133,131,131, 30,133,131,131,
1350 34,133,133, 89,133,133, 28, 89,133,133, 35, 89, 89,124, 89, 89, 13,124,
1351 89, 89, 17,124,124, 93,124,124, 11, 93,124,124, 23, 93,124,124, 4, 93,
1352 93,149, 93, 9,145, 10, 93,149,129,149, 14,149,149, 18,149,149,150, 93,
1353 149, 69,149,149, 69, 9,145, 10,150, 6,150, 11,150, 13,150, 17,150, 86,
1354 150, 2,129,130,129,129, 38,109, 39,129,129, 9, 90, 10,129,129, 9, 10,
1355 129,129, 21, 60,129,129, 20, 60,129,129, 14,129,129, 18,130, 60,130, 96,
1356 130, 71,130, 9,109, 10, 90, 91, 90, 90, 16, 91, 96, 63, 96, 46, 96, 57,
1357 96, 54};
1358 int pars7[223]={ /* includes past-the-end index */
1359 0, 2, 4, 7, 9, 11, 16, 20, 24, 27, 31, 34, 36, 39, 42, 44, 47, 49,
1360 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86,
1361 88, 90, 92, 98,103,106,108,110,112,115,117,121,123,127,131,134,136,139,
1362 141,143,147,149,153,156,162,167,170,172,176,178,182,185,187,189,193,198,
1363 202,207,212,216,219,221,225,228,230,233,235,239,241,245,248,250,253,255,
1364 259,261,265,270,272,276,279,281,283,286,288,292,297,301,305,308,313,317,
1365 321,324,326,328,330,332,334,336,340,345,349,352,354,359,363,367,370,372,
1366 375,381,389,395,401,409,419,428,437,446,454,462,470,477,481,484,487,491,
1367 494,496,500,502,506,508,510,512,514,516,518,520,522,524,526,528,530,536,
1368 538,540,544,546,550,552,556,558,562,564,568,570,574,578,580,584,588,592,
1369 596,598,602,606,608,612,616,618,622,626,630,632,637,639,642,645,648,651,
1370 656,658,660,662,664,666,668,670,675,680,684,688,692,695,698,700,702,704,
1371 708,710,714,716,718,720,722};
1372
1373 note004
1374 int numfunc=53; // copied from cbnf16
1375 char prs6[374]={ // functions
1376 'C','l','o','s','e','P','o','l','y','O','\0','D','r','a','w','F',
1377 'N','u','m','O','\0','D','r','a','w','N','u','m','O','\0','D','r',
1378 'a','w','S','t','r','i','n','g','O','\0','F','o','n','t','I','n',
1379 'f','o','O','\0','G','i','f','O','u','t','O','\0','H','o','r','i',
1380 'z','L','o','g','O','\0','H','o','r','i','z','S','c','a','l','e',
1381 'O','\0','H','o','r','i','z','T','i','m','e','O','\0','J','n','\0',
1382 'L','i','n','e','T','o','G','O','\0','L','i','n','e','T','o','O',
1383 '\0','M','a','k','e','G','r','a','p','h','O','\0','M','a','k','e',
1384 'V','i','e','w','O','\0','M','o','v','e','T','o','G','O','\0','M',
1385 'o','v','e','T','o','O','\0','O','p','e','n','P','o','l','y','O',
1386 '\0','P','l','o','t','G','O','\0','P','n','g','O','u','t','O','\0',
1387 'S','e','t','C','o','l','o','r','O','\0','V','e','r','t','L','o',
1388 'g','O','\0','V','e','r','t','S','c','a','l','e','O','\0','Y','n',
1389 '\0','a','c','o','s','\0','a','s','i','n','\0','a','t','a','n','\0',
1390 'a','t','a','n','2','\0','c','e','i','l','\0','c','o','s','\0','c',
1391 'o','s','h','\0','e','r','f','\0','e','x','i','t','\0','e','x','p',
1392 '\0','f','a','b','s','\0','f','l','o','o','r','\0','f','m','o','d',
1393 '\0','h','m','s','d','a','y','\0','l','o','g','\0','l','o','g','1',
1394 '0','\0','m','a','t','i','n','v','\0','m','a','t','m','u','l','\0',
1395 'm','d','y','d','a','y','\0','p','o','w','\0','p','r','i','n','t',
1396 'f','\0','r','e','f','d','a','y','\0','s','i','n','\0','s','i','n',
1397 'h','\0','s','p','r','i','n','t','f','\0','s','q','r','t','\0','s',
1398 't','r','c','m','p','\0','s','t','r','c','p','y','\0','t','a','n',
1399 '\0','t','a','n','h','\0'};
1400 int prs7[53]={ // pointer to prs6
1401 0, 11, 21, 30, 42, 52, 60, 70, 82, 93,
1402 96,105,113,124,134,143,151,161,168,176,
1403 186,195,206,209,214,219,224,230,235,239,
1404 244,248,253,257,262,268,273,280,284,290,
1405 297,304,311,315,322,329,333,338,346,351,
1406 358,365,369};
1407 int prs8[53]={ // function id number
1408 26, 43, 42, 28, 27, 24, 48, 31, 30, 37,
1409 34, 23, 29, 20, 33, 22, 25, 35, 45, 21,
1410 49, 32, 38, 5, 4, 6, 7, 16, 2, 9,
1411 36, 44, 11, 18, 17, 19, 41, 12, 13, 47,
1412 46, 40, 14, 0, 39, 1, 8, 52, 15, 50,
1413 51, 3, 10};
1414 int prs9[131]={ // type ids
1415 4, 1, 6, 2, 2, 2, 2, 2, 2, 2,
1416 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1417 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1418 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1419 2, 2, 2, 2, 4, 4, 4, 4, 4, 4,
1420 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1421 4, 4, 4, 4, 4, 1, 4, 4, 4, 4,
1422 4, 4, 4, 1, 2, 2, 4, 1, 2, 2,
1423 4, 2, 2, 4, 2, 2, 4, 4, 2, 2,
1424 2, 2, 2, 4, 2, 2, 4, 2, 2, 2,
1425 2, 2, 2, 2, 2, 4, 4, 4, 1, 2,
1426 4, 4, 4, 4, 7, 7, 7, 4, 7, 4,
1427 4, 4, 1, 1, 4, 1, 1, 4, 1, 1,
1428 6};
1429 int prs10[53]={ // start indices to prs9
1430 59,107,105, 64, 60, 57,119, 72, 71, 92,
1431 83, 54, 66, 44, 80, 51, 58, 86,112, 47,
1432 120, 76, 95, 11, 9, 13, 15, 35, 5, 20,
1433 90,110, 24, 39, 37, 41,103, 26, 28,117,
1434 113,101, 30, 0, 98, 3, 18,127, 33,121,
1435 124, 7, 22};
1436 int prs11[53]={ // past-the-end indices to prs9
1437 60,110,107, 66, 64, 58,120, 76, 72, 95,
1438 86, 57, 71, 47, 83, 54, 59, 90,113, 51,
1439 121, 80, 98, 13, 11, 15, 18, 37, 7, 22,
1440 92,112, 26, 41, 39, 44,105, 28, 30,119,
1441 117,103, 33, 3,101, 5, 20,131, 35,124,
1442 127, 9, 24};
1443
1444 int numfunc1; // number of IPC functions - assumed to be less than 40
1445 char prs12[600]; // array of function name characters
1446 int prs13[40]; // function name offset in prs12[]
1447 int prs14[40]; // program number ( =5 if the program is f005 )
1448 int prs15[40]; // function number defined in each program
1449 int prs16[240]; // list of type id's
1450 int prs17[40]; // start indices into prs16[]
1451 int prs18[40]; // past-the-end indices into prs16[]
1452
1453 char fnames[501];
1454 int fstatus; // 0 : not cgi-bin/p077
1455 // 1 : cgi-bin/p077 - not using temp files
1456 // 2 : cgi-bin/p077 - using temp files listed in the cookie
1457 // 3 : cgi-bin/p077 - temp files modified
1458 // 4 : cgi-bin/p077 - temp files deleted and empty
1459 char *rquri=getenv("REQUEST_URI");
1460 char *hhost=getenv("HTTP_HOST");
1461 char *hckie=getenv("HTTP_COOKIE");
1462 time_t expires;
1463
1464 int istscop; /* insert scope */
1465
1466 int prs22[40]; // shared object numbers
1467 typedef int sofunc(void **param);
1468 sofunc *prs23[5];
1469 struct sigaction action;
1470 sigset_t sset;
1471
1472 atexit(beforeexit); /* ipc clean-up */
1473 /*sigemptyset(&sset);
1474 sigaddset(&sset,SIGTERM);
1475 sigprocmask(SIG_BLOCK,&sset,NULL);
1476 sigemptyset(&action.sa_mask);
1477 action.sa_handler=sighandl;
1478 action.sa_flags=SA_NOMASK;
1479 sigaction(SIGTERM,&action,NULL);*/
1480 signal(SIGTERM,sighandl);
1481
1482 if(getenv("PATH_INFO")){
1483 source=getenv("PATH_INFO");
1484 if(source[1]=='S'&&source[5]=='K'){ /* STACK */
1485 tweak|=1;
1486 printf("Content-type: text/plain%c%c",10,10);
1487 if(source[6]=='\0'){
1488 outfrom=0;
1489 outto=5000;
1490 }
1491 else{
1492 outfrom=0;
1493 for(i=6;source[i]!='-';i++)
1494 outfrom=outfrom*10+(source[i]-'0');
1495 outto=0;
1496 for(i++;source[i]!='\0';i++)
1497 outto=outto*10+(source[i]-'0');
1498 }
1499 outcnt=0;
1500 }
1501 else if(source[1]=='D'&&source[5]=='G'){ /* DEBUG */
1502 i=source[6]-'0';
1503 if(i==2) tweak|=2; /* output scopes */
1504 if(i==3) tweak|=4; /* output leximes */
1505 if(i==4) tweak|=8; /* output parse process */
1506 printf("Content-type: text/plain%c%c",10,10);
1507 }
1508 }
1509 note005
1510
1511 if(strcmp(getenv("REQUEST_METHOD"),"GET")==0) {
1512 entries[0].name=(char *)malloc(sizeof(char)*7);
1513 strcpy(entries[0].name,"source");
1514 entries[0].val=(char *)malloc(sizeof(char)*8000);
1515 strcpy(entries[0].val,getenv("QUERY_STRING"));
1516 if(entries[0].val[0]=='f'&&entries[0].val[1]=='e'&&entries[0].val[2]=='t'&&entries[0].val[3]=='c')
1517 strcpy(entries[0].val,"main(){\naudbhome();\n");
1518 else strcpy(entries[0].val,"main(){\n");
1519 strcat(entries[0].val,getenv("QUERY_STRING"));
1520 l=strlen(entries[0].val);
1521 for(i=0;i<l;i++) if(entries[0].val[i]=='#') entries[0].val[i]='\0';
1522 strcat(entries[0].val,"\n}\n");
1523 unescape_url(entries[0].val);
1524 mx=1;
1525 }
1526 else{
1527 if(strcmp(getenv("REQUEST_METHOD"),"POST")) {
1528 contype(2);
1529 printf("This CGI should be referenced with a METHOD of GET or POST.\n");
1530 exit(0);
1531 }
1532 strcpy(param2,getenv("CONTENT_TYPE"));
1533 if(strcmp(param2,"application/x-www-form-urlencoded")){
1534 if(param2[0]!='m'){
1535 contype(3);
1536 printf("%s\nThis CGI can only be used to decode form results. \n",param2);
1537 exit(0);
1538 }
1539 /*
1540 contype(0);
1541 */
1542 for(i=0;param2[i]!='=';i++);
1543 i++;
1544 param2[0]='-';
1545 param2[1]='-';
1546 for(o1=2;param2[i]!='\0';o1++,i++) param2[o1]=param2[i];
1547 param2[o1]='\0';
1548 /*
1549 printf("%s",param2);
1550 */
1551 cl = atoi(getenv("CONTENT_LENGTH"));
1552 /*
1553 printf("\ncl=%i\n",cl);
1554 */
1555 inp=(char *)malloc(sizeof(char)*1024);
1556 m1=0;
1557 n1=fread(inp,sizeof(char),1024,stdin);
1558 i1=0; /* entry count */
1559 j1=0; /* boundary match count */
1560 k1=0; /* control */
1561 for(j=0;j<cl;j++,m1++){
1562 if((cl-j>256)&&(m1>767)){
1563 memcpy(inp,&inp[512],512);
1564 n1=fread(&inp[512],sizeof(char),512,stdin);
1565 m1-=512;
1566 }
1567 /*
1568 if(j%16==0) printf("%04X",j/16);
1569 if(j%8==0) printf(" ");
1570 else printf(" ");
1571 sprintf(s,"%02X",inp[m1]);
1572 for(k=2;s[k]!='\0';k++);
1573 printf("%s",&s[k-2]);
1574 if(j%16==15){
1575 printf(" ");
1576 for(k=-15;k<=0;k++){
1577 if(isprint(inp[m1+k])) printf("%c",inp[m1+k]);
1578 else printf("%c",'.');
1579 if(k==-8) printf(" ");
1580 }
1581 printf("\n");
1582 }
1583 */
1584 switch(k1){
1585 case 0: /* boundary search */
1586 if(inp[m1]==param2[j1]) j1++;
1587 if(j1==o1){
1588 if(inp[m1+1]=='-') k1=8;
1589 else k1=1;
1590 j1=0;
1591 }
1592 break;
1593 case 1: /* name search */
1594 if(inp[m1]=='='){
1595 for(i=0;inp[i+m1+2]!='\"';i++);
1596 entries[i1].name=(char *)malloc(sizeof(char)*(i+2));
1597 for(i=0;inp[i+m1+2]!='\"';i++) entries[i1].name[i]=inp[i+m1+2];
1598 entries[i1].name[i]='\0';
1599 if(inp[i+m1+3]==';') o=1; /* file */
1600 else o=0;
1601 if(strcmp(entries[i1].name,"source")==0) o=0;
1602 if(o==1){ /* get file name */
1603 n1=i+m1+4;
1604 for(;inp[n1]!='\"';n1++);
1605 n1++;
1606 for(i=0,n=0;inp[i+n1]!='\"';i++,n++){
1607 if(inp[i+n1]=='/') n=-1;
1608 else s[n]=inp[i+n1];
1609 }
1610 s[n]='\0';
1611 }
1612 k1=2;
1613 }
1614 break;
1615 case 2: /* start of content search */
1616 if(inp[m1]=='\x0a'&&inp[m1-2]=='\x0a'){
1617 /*** abort if macbinary -> changed now ***/
1618 if(inp[m1-7]=='n'&&inp[m1-6]=='a'&&inp[m1-5]=='r'&&inp[m1-4]=='y'){
1619 // contype(0);
1620 // printf("macbinary unacceptable\n");
1621 // exit(0);
1622 strcat(s,"/tmp/gcsXXXXXX");
1623 for(i=0;s[i]!='/';i++);
1624 l1=mkstemp(&s[i]); /* file descriptor */
1625 i3=strlen(s);
1626 entries[i1].val=(char *)malloc(sizeof(char)*(i3+1));
1627 strcpy(entries[i1].val,s);
1628 k1=5;
1629 i8=0;
1630 for(i=0;i<4;i++) *((char *)&i7+i)=inp[m1+87-i];
1631 break;
1632 }
1633 for(i=1;i<20;i++){
1634 c=inp[i+m1];
1635 if(c=='-'&&inp[i+m1+1]=='-'&&inp[i+m1-1]=='\x0a'){ /* short text */
1636 i=20;
1637 break;
1638 }
1639 if(iscntrl(c)&&c!='\x0d'&&c!='\x0a') break;
1640 }
1641 if(i==20&&o==0){ /* text */
1642 k1=3;
1643 i3=200;
1644 entries[i1].val=(char *)malloc(sizeof(char)*i3);
1645 i2=0;
1646 }
1647 else{ /* binary or file */
1648 strcat(s,"/tmp/gcsXXXXXX");
1649 for(i=0;s[i]!='/';i++);
1650 l1=mkstemp(&s[i]); /* file descriptor */
1651 i3=strlen(s);
1652 entries[i1].val=(char *)malloc(sizeof(char)*(i3+1));
1653 strcpy(entries[i1].val,s);
1654 // for(i=strlen(entries[i1].name);i>=0;i--) entries[i1].name[i+1]=entries[i1].name[i];
1655 // entries[i1].name[0]='_';
1656 k1=4;
1657 }
1658 }
1659 break;
1660 case 3: /* val entry */
1661 if(i2>=i3){
1662 i3+=200;
1663 entries[i1].val=(char *)realloc(entries[i1].val,sizeof(char)*i3);
1664 }
1665 if(inp[m1]=='\x0d'&&inp[m1+2]=='-'&&inp[m1+3]=='-'){
1666 entries[i1].val[i2]='\0';
1667 i1++;
1668 k1=0;
1669 }
1670 else{
1671 entries[i1].val[i2]=inp[m1];
1672 i2++;
1673 }
1674 break;
1675 case 4: /* file entry */
1676 if(inp[m1]=='\x0d'&&inp[m1+1]=='\x0a'&&inp[m1+2]=='-'&&inp[m1+3]=='-'){
1677 close(l1);
1678 i1++;
1679 k1=0;
1680 }
1681 else write(l1,&inp[m1],sizeof(char));
1682 break;
1683 case 5: /* skip 128 bytes */
1684 i8++;
1685 if(i8==128){
1686 k1=6;
1687 i8=0;
1688 }
1689 break;
1690 case 6: /* file entry - data fork */
1691 write(l1,&inp[m1],sizeof(char));
1692 i8++;
1693 if(i8==i7) k1=7;
1694 break;
1695 case 7: /* skip resource fork etc */
1696 if(inp[m1]=='\x0d'&&inp[m1+1]=='\x0a'&&inp[m1+2]=='-'&&inp[m1+3]=='-'){
1697 close(l1);
1698 i1++;
1699 k1=0;
1700 }
1701 break;
1702 case 8:
1703 break;
1704 default:
1705 break;
1706 }
1707 } /* for(j=0;j<cl;j++,m1++) */
1708 /*
1709 for(;j%16!=0;j++,m1++){
1710 if(j%8==0) printf(" ");
1711 printf(" ");
1712 if(j%16==15){
1713 printf(" ");
1714 for(k=-15;j+k<cl;k++){
1715 if(isprint(inp[m1+k])) printf("%c",inp[m1+k]);
1716 else printf("%c",'.');
1717 if(k==-8) printf(" ");
1718 }
1719 printf("\n");
1720 }
1721 }
1722 exit(0);
1723 */
1724
1725
1726 free(inp);
1727 mx=i1;
1728 /*
1729 contype(0);
1730 for(i=0;i<mx;i++)
1731 printf("i=%i\n%s\n%s\n",i,entries[i].name,entries[i].val);
1732 exit(0);
1733 */
1734 }
1735 else{
1736 cl = atoi(getenv("CONTENT_LENGTH"));
1737
1738 if(cl>MAXINP){
1739 contype(4);
1740 printf("%i\n",cl);
1741 printf("Input length limit over.");
1742 exit(0);
1743 }
1744 for(x=0;cl && (!feof(stdin));x++) {
1745 if(x>49){
1746 contype(5);
1747 printf("Form field limit over.");
1748 exit(0);
1749 }
1750 mx=x;
1751 entries[x].val = fmakeword(stdin,'&',&cl);
1752 plustospace(entries[x].val);
1753 unescape_url(entries[x].val);
1754 entries[x].name = makeword(entries[x].val,'=');
1755 }
1756 mx++; /* number of entries */
1757 } /* else */
1758 } /* else */
1759 // for(x=0;x<mx;x++) cnvifsjis(entries[x].val);
1760 for(x=0;x<mx;x++) cnv2utf((unsigned char *)entries[x].val);
1761 for(x=0;x<mx;x++) if(strcmp(entries[x].name,"trace")==0) break;
1762 if(x<mx){
1763 outfrom=0;
1764 for(i=0;entries[x].val[i]!='-'&&entries[x].val[i]!='\0';i++)
1765 outfrom=outfrom*10+(entries[x].val[i]-'0');
1766 outto=0;
1767 if(entries[x].val[i]!='\0'){
1768 for(i++;entries[x].val[i]!='\0';i++)
1769 outto=outto*10+(entries[x].val[i]-'0');
1770 tweak|=1;
1771 printf("Content-type: text/plain%c%c",10,10);
1772 outcnt=0;
1773 }
1774 }
1775 /* scan the input file, count characters, deleting comments */
1776 // fp=fopen("test.c","r");
1777 comment=0; /* comment cleaning process status */
1778 ninp=0; /* number of input characters */
1779 for(x=0;x<mx;x++){
1780 if(strcmp(entries[x].name,"source")==0) break;
1781 }
1782 if(x==mx){
1783 contype(6);
1784 printf("Form not standard.");
1785 exit(0);
1786 }
1787 source= (char *) malloc(sizeof(char) * (strlen(entries[x].val) + 1 +50000)); /* allow for substitution */
1788 strcpy(source,entries[x].val);
1789 /* substitute input fields */
1790 for(i=0;i<mx;i++){
1791 if(entries[i].name[0]=='_'){
1792 k=1;
1793 l=strlen(entries[i].val);
1794 if(l>49900){
1795 contype(7);
1796 printf("Code too long.");
1797 exit(0);
1798 }
1799 for(j=0;source[j]!='\0';j++){
1800 if(source[j]==entries[i].name[k]){
1801 if(j!=0&&source[j-1]=='_');
1802 else k++;
1803 }
1804 else if(k!=1){ // at least partially matched
1805 if(entries[i].name[k]=='\0'){ // fully matched
1806 if(l>(k-1)) // val is longer
1807 for(m=strlen(source)+1+l-k+1;m>j;m--)
1808 source[m]=source[m-l+k-1];
1809 else if(l<(k-1)){
1810 o=strlen(source);
1811 for(m=j;m<=o;m++)
1812 source[m+l-k+1]=source[m];
1813 }
1814 for(m=0;entries[i].val[m]!='\0';m++) source[j-k+1+m]=entries[i].val[m];
1815 j=j-k+1+m-1;
1816 k=1;
1817 }
1818 else k=1;
1819 }
1820 }
1821 }
1822 }
1823 /* substitution end */
1824 x=0;
1825 while((c=source[x++])!='\0'){
1826 note006
1827 switch (comment){
1828 case 0: /* expecting new comment */
1829 if(c=='/') comment=1;
1830 else{
1831 if(c==':') comment=5;
1832 ninp++;
1833 }
1834 break;
1835 case 1: /* expecting the second part of comment start mark */
1836 if(c=='/') comment=2;
1837 else if(c=='*') comment=3;
1838 else{
1839 comment=0;
1840 ninp+=2;
1841 }
1842 break;
1843 case 2: /* comment started by two slashes */
1844 if(c=='\n'||c=='\x0d'||c=='\x0a') comment=0;
1845 break;
1846 case 3: /* comment started by slash-asterisk */
1847 if(c=='*') comment=4;
1848 break;
1849 case 4:
1850 if(c=='/') comment=0;
1851 else if(c!='*') comment=3;
1852 break;
1853 case 5:
1854 if(c=='/') comment=6;
1855 else{
1856 comment=0;
1857 ninp++;
1858 }
1859 break;
1860 case 6:
1861 if(c=='*') comment=3;
1862 else{
1863 ninp+=2;
1864 comment=0;
1865 }
1866 break;
1867 default:
1868 printf("\nillegal character %c",c);
1869 } /* switch */
1870 } /* while */
1871 if(comment!=0){
1872 contype(8);
1873 printf("Comment not closed.");
1874 exit(0);
1875 }
1876
1877 /* allocate input buffer and read the input */
1878 inp=(char *)malloc(ninp*sizeof(char));
1879 comment=0;
1880 ninp=0;
1881 x=0;
1882 while((c=source[x++])!='\0'){
1883 switch (comment){
1884 case 0:
1885 if(c=='/') comment=1;
1886 else{
1887 if(c==':') comment=5;
1888 inp[ninp++]=c;
1889 }
1890 break;
1891 case 1:
1892 if(c=='/') comment=2;
1893 else if(c=='*') comment=3;
1894 else{
1895 comment=0;
1896 inp[ninp++]='/';
1897 inp[ninp++]=c;
1898 }
1899 break;
1900 case 2:
1901 if(c=='\n'||c=='\x0d'||c=='\x0a') comment=0;
1902 break;
1903 case 3:
1904 if(c=='*') comment=4;
1905 break;
1906 case 4:
1907 if(c=='/') comment=0;
1908 else if(c!='*') comment=3;
1909 break;
1910 case 5:
1911 if(c=='/') comment=6;
1912 else{
1913 comment=0;
1914 inp[ninp++]=c;
1915 }
1916 break;
1917 case 6:
1918 if(c=='*') comment=3;
1919 else{
1920 inp[ninp++]='/';
1921 inp[ninp++]=c;
1922 comment=0;
1923 }
1924 break;
1925 default:
1926 break;
1927 } /* switch */
1928 } /* while */
1929 /* compact the input buffer */
1930 for(i=0;i<ninp;i++){
1931 if(inp[i]=='\t'||inp[i]=='\n'||inp[i]=='\x0d') inp[i]=' ';
1932 /* if(!isprint(inp[i])){
1933 contype(0);
1934 printf("Only printable ascii characters allowed.");
1935 exit(0);
1936 }*/
1937 }note007
1938 j=0; /* index for compacted chars */
1939 l=0; /* spaces within a character-constant are left as-is */
1940 for(i=0;i<ninp;i++){
1941 c=inp[i];
1942 if(l==0){
1943 if(c=='\"') l=1; // start of character constant
1944 }
1945 else if(l==1){
1946 if(c=='\"'&&inp[i-1]!='\\') l=2; // end of character constant
1947 }
1948 else{ /* l=2 */
1949 while(inp[i]==' ') i++;
1950 c=inp[i];
1951 if(c=='\"'){
1952 j--;
1953 l=1;
1954 c=inp[++i];
1955 }
1956 else l=0;
1957 }
1958 if(c==' '&&l==0){
1959 k=0;
1960 if(inp[j-1]>='c'&&inp[j-1]<='t'){ // if the string that ends with inp[j-1]
1961 i1=inp[j-1]-'a'; // needs space after it
1962 i2=lex15[i1]; // num of entries
1963 for(i3=0;i3<i2;i3++){
1964 i4=lex14[i1]+i3; // offset to lex12 and lex13
1965 i5=lex12[i4];
1966 i6=lex13[i4];
1967 for(i7=0;i7<i6;i7++) if(inp[j-1-i7]!=lex11[i5+i7]) break;
1968 if(i7==i6){
1969 k=1;
1970 break;
1971 }
1972 } // for(i3=0;i3
1973 } // if(inp[j-1]
1974 if(k==1) inp[j++]=' ';
1975 } // if(c==' '&&l==0)
1976 else inp[j++]=c;
1977 }
1978 ninp=j;
1979 note008
1980 /* allocate tmnl[] */
1981 tmnl=(int *)malloc(ninp*2*sizeof(int)); /* string of terminal numbers */
1982 // tmnl[0]=0;
1983 ntmnl=0;
1984 i=0;
1985 while(i<ninp){
1986 c=inp[i];
1987 i1=15; // compare c with lex7[0]-lex7[23]
1988 for(i2=8;i2>0;i2/=2){
1989 if(i1>23){
1990 i1=i1-i2;
1991 }
1992 else{
1993 if(c==lex7[i1]) break;
1994 if(c<lex7[i1]) i1=i1-i2;
1995 else i1=i1+i2;
1996 }
1997 }
1998 if(c==lex7[i1]){ /* if c is in lex7[0]-lex7[23] */
1999 tmnl[ntmnl]=lex8[i1]; // default
2000 i4=1; // number of chars consumed
2001 if(lex10[i1]!=0){ // if there are next chars to be compared
2002 for(i2=0;i2<lex10[i1];i2++){ // do for each second char
2003 if(inp[i+1]==lex7[i2+lex9[i1]]){
2004 i3=i2+lex9[i1];
2005 tmnl[ntmnl]+=lex8[i3];
2006 i4=2; // number of chars consumed
2007 if(lex10[i3]!=0){ // if there are third char to be compared
2008 if(inp[i+2]==lex7[lex9[i3]]){
2009 tmnl[ntmnl]+=lex8[lex9[i3]];
2010 i4=3; // number of chars consumed
2011 }
2012 }
2013 } // if(inp[i+1]
2014 }
2015 }
2016 ntmnl++;
2017 i+=i4;
2018 if(tmnl[ntmnl-1]==17){ // -
2019 if(tmnl[ntmnl-2]!=10&&tmnl[ntmnl-2]!=39&&
2020 tmnl[ntmnl-3]!=57&&tmnl[ntmnl-3]!=60&&
2021 tmnl[ntmnl-3]!=63&&!isalpha(inp[i])&&inp[i]!='(') ntmnl--; // not binary nor unary operator
2022 }
2023 } // if(c==lex7[i1]
2024 else if(c=='\"'){
2025 tmnl[ntmnl++]=46; // in the case of character-constant, offset to the
2026 // character is saved in next to terminal number
2027 tmnl[ntmnl++]=i;
2028 while(inp[++i]!='\"');
2029 while(inp[i-1]=='\\') while(inp[++i]!='\"');
2030 i++;
2031 }
2032 else if(isdigit(c)){
2033 if(inp[i-1]=='.'&&tmnl[ntmnl-1]==21) { // if . followed by digit cancel previous
2034 i--;
2035 ntmnl--;
2036 }
2037 if(inp[i-1]=='-'&&tmnl[ntmnl-1]!=17) tmnl[ntmnl+1]=-(i-1); // offset of data (sign minus)
2038 else tmnl[ntmnl+1]=-i; // offset of data (sign minus so that it does not coincide with a terminal)
2039 while(isdigit(inp[i])) i++;
2040 if(inp[i]=='.'){
2041 tmnl[ntmnl]=57; // floating point constant
2042 i++;
2043 while(isdigit(inp[i])) i++;
2044 if(inp[i]=='E'||inp[i]=='e'){
2045 i+=2; // skip + or -
2046 while(isdigit(inp[i])) i++;
2047 }
2048 }
2049 else{
2050 tmnl[ntmnl]=63; // integer constant
2051 if(inp[i-1]=='0'&&(inp[i]=='x'||inp[i]=='X')){ // hexadecimal dugit
2052 i++;
2053 while(isxdigit(inp[i])) i++;
2054 }
2055 }
2056 ntmnl+=2;
2057 }
2058 else{ // isalpha and _
2059 j=0;
2060 while(isalnum(inp[i+j])||inp[i+j]=='_') j++;
2061 k=0; // if reserved string k=1
2062 if(c>='a'&&c<='w'){ // test if reserved word
2063 i1=c-'a';
2064 i2=lex1[i1];
2065 for(i3=i2-1;i3>=0;i3--){
2066 i4=i3+lex2[i1];
2067 for(i5=0;i5<lex4[i4]-1;i5++)
2068 if(inp[i+1+i5]!=lex6[lex5[i4]+i5]) break;
2069 if(i5==lex4[i4]-1){
2070 tmnl[ntmnl]=lex3[i4];
2071 k=1;
2072 break;
2073 }
2074 }
2075 if(k==1&&j-i5!=1) k=0;
2076 }
2077 if(k==1){
2078 i=i+j;
2079 if(inp[i]==' ') i++; // type is followed by a space
2080 ntmnl++;
2081 }
2082 else{
2083 tmnl[ntmnl]=60; // identifier
2084 tmnl[ntmnl+1]=-i; // offset of data (sign minus)
2085 ntmnl+=2;
2086 i=i+j;
2087 }
2088 } /* else */
2089 } /* while(i<ninp) */
2090 tmnl[ntmnl++]=151; /* end terminal */
2091 for(i=0;i<ntmnl;i++) if(tmnl[i]<0) tmnl[i]=-tmnl[i]; // recover signs
2092 if(tweak&4){
2093 printf("terminal list ninp=%i ntmnl=%i",ninp,ntmnl);
2094 for(i=0;i<ntmnl;i++){
2095 if(i%10==0) printf("\n");
2096 printf("%4i",tmnl[i]);
2097 }
2098 // exit(0);
2099 }
2100 note009
2101 /* move constants and names from inp[] to places for each data */
2102 /* default minimum is one */
2103 i1=1; /* inpchar */
2104 j1=1; /* chcon */
2105 k1=1; /* ident */
2106 l1=1; /* flcon */
2107 // m1=1; /* intcon */
2108 for(i=0;i<ntmnl;i++){
2109 switch(tmnl[i]){
2110 case 46: /* character constant */
2111 j=tmnl[i+1];
2112 while(inp[++j]!='\"');
2113 while(inp[j-1]=='\\') while(inp[++j]!='\"');
2114 i1+=j-tmnl[i+1];
2115 j1++;
2116 i++;
2117 break;
2118 case 57: /* floating constant */
2119 l1++;
2120 i++;
2121 break;
2122 case 60: /* identifier */
2123 j=tmnl[i+1];
2124 while(isalnum(inp[j])||inp[j]=='_') j++;
2125 i1+=j-tmnl[i+1]+1;
2126 k1++;
2127 i++;
2128 break;
2129 case 63: /* integer constant */
2130 // m1++;
2131 i++;
2132 break;
2133 default:
2134 break;
2135 }
2136 }
2137 /* reserve memeory and put constants there */
2138 inpchar=(char *)malloc(sizeof(char)*i1); /* input characters */
2139 chcon=(int *)malloc(sizeof(int)*j1); /* character constants offset to inpchar */
2140 ident=(int *)malloc(sizeof(int)*k1); /* identifier offset to inpchar */
2141 flcon=(double *)malloc(sizeof(double)*l1); /* double constant */
2142 /* move constants and names from inp[] to places for each data */
2143 i1=0; /* inpchar */
2144 nchcon=0; /* chcon */
2145 nident=0; /* ident */
2146 nflcon=0; /* flcon */
2147 for(i=0;i<ntmnl;i++){
2148 switch(tmnl[i]){
2149 case 46: /* character constant */
2150 chcon[nchcon++]=i1;
2151 j=tmnl[i+1];
2152 while(inp[++j]!='\"');
2153 while(inp[j-1]=='\\') while((c=inp[++j])!='\"');
2154 l=0; /* sjis */
2155 for(k=tmnl[i+1]+1;k<j;k++){
2156 if(l==0&&(inp[k]&'\x80')){
2157 l=1;
2158 }
2159 else l=0;
2160 if(inp[k]=='\\'&&(l==0)){ /* unescape */
2161 switch(inp[k+1]){
2162 case 'n':
2163 inpchar[i1++]='\n';
2164 break;
2165 case 't':
2166 inpchar[i1++]='\t';
2167 break;
2168 case '\"':
2169 inpchar[i1++]='\"';
2170 break;
2171 case '\\':
2172 inpchar[i1++]='\\';
2173 break;
2174 case 'x':
2175 m=(inp[k+2]>='a')? inp[k+2]-'a'+10 : inp[k+2]-'0';
2176 m=m*16+((inp[k+3]>='a')? inp[k+3]-'a'+10 : inp[k+3]-'0');
2177 inpchar[i1++]=m;
2178 k+=2;
2179 default:
2180 break;
2181 }
2182 k++;
2183 }
2184 else inpchar[i1++]=inp[k];
2185 }
2186 inpchar[i1++]='\0';
2187 tmnl[i+1]=nchcon-1;
2188 i++;
2189 break;
2190 case 57: /* floating constant */
2191 for(j=tmnl[i+1]+1;isdigit(inp[j])||inp[j]=='.';j++);
2192 if(inp[j]=='E'||inp[j]=='e'){
2193 j+=2;
2194 while(isdigit(inp[j])) j++;
2195 }
2196 j-=tmnl[i+1];
2197 for(k=0;k<j;k++) s[k]=inp[k+tmnl[i+1]];
2198 s[k]='\0';
2199 if(sscanf(s,"%lf",&flcon[nflcon])!=1){
2200 contype(9);
2201 printf("double constant form error.");
2202 exit(0);
2203 }
2204 tmnl[i+1]=nflcon;
2205 nflcon++;
2206 i++;
2207 break;
2208 case 60: /* identifier */
2209 j=tmnl[i+1];
2210 k=0;
2211 while(isalnum(inp[j+k])||inp[j+k]=='_'){
2212 s[k]=inp[j+k];
2213 k++;
2214 }
2215 s[k]='\0';
2216 for(k=0;k<nident;k++) if(strcmp(s,&inpchar[ident[k]])==0) break;
2217 tmnl[i+1]=k;
2218 if(k==nident){
2219 ident[nident++]=i1;
2220 for(k=0;;k++){
2221 inpchar[i1++]=s[k];
2222 if(s[k]=='\0') break;
2223 }
2224 }
2225 i++;
2226 break;
2227 case 63: /* integer constant */
2228 for(j=tmnl[i+1]+1;isdigit(inp[j]);j++);
2229 j-=tmnl[i+1];
2230 if(j==1&&inp[tmnl[i+1]]=='0'){
2231 if(inp[tmnl[i+1]+1]=='x'||inp[tmnl[i+1]+1]=='X'){
2232 for(j=tmnl[i+1]+2;isxdigit(inp[j]);j++);
2233 j-=tmnl[i+1];
2234 }
2235 }
2236 for(k=0;k<j;k++) s[k]=inp[k+tmnl[i+1]];
2237 s[k]='\0';
2238 if(s[1]=='x'||s[1]=='X') j=sscanf(s,"%x",&tmnl[i+1]);
2239 else j=sscanf(s,"%i",&tmnl[i+1]);
2240 if(j!=1){
2241 contype(10);
2242 printf("int constant form error.");
2243 exit(0);
2244 }
2245 i++;
2246 break;
2247 default:
2248 break;
2249 }
2250 }
2251 /* now, inp[] is no more needed */
2252 free(inp);
2253 if(tweak&4){
2254 printf("terminal list ninp=%i ntmnl=%i",ninp,ntmnl);
2255 for(i=0;i<ntmnl;i++){
2256 if(i%10==0) printf("\n");
2257 printf("%4i",tmnl[i]);
2258 }
2259 exit(0);
2260 }
2261 note010
2262 gsymbol=(int *)malloc(ntmnl*2*sizeof(int)); /* garmmar symbol */
2263 produc=(int *)malloc(ntmnl*2*sizeof(int)); /* production */
2264 parent=(int *)malloc(ntmnl*2*sizeof(int)); /* parent index */
2265 child=(int *)malloc(ntmnl*2*sizeof(int)); /* left-most child */
2266 sibli=(int *)malloc(ntmnl*2*sizeof(int)); /* next sibling */
2267 attri1=(int *)malloc(ntmnl*2*sizeof(int)); /* attribute 1 */
2268
2269 gsymbol[0]=0;
2270 produc[0]=0;
2271 parent[0]=0;
2272 child[0]=0;
2273 sibli[0]=0;
2274 attri1[0]=0;
2275 ngsymb=1;
2276 stk[0]=0;
2277 i=0; // pointer for stack stk[]
2278 for(o=1;o<2834;o*=2); /* power of 2 and larger than 2834 */
2279 for(o1=1;o1<1587;o1*=2);
2280 for(j=0;j<ntmnl;j++){ note011
2281 if(stk[i]>=201){ // reduce-only states
2282 k=2; /* reduce */
2283 l=pars5[stk[i]-201]; /* production no */
2284 }
2285 else{
2286 k=stk[i]*152+tmnl[j];
2287 /* binary search of the index where pars1[]=k */
2288 l=-1; /* decrement next */
2289 n=o;
2290 m=n;
2291 for(;n>0;n/=2){
2292 m+=(l*n);
2293 if(m<2834){
2294 if(pars1[m]==k) l=0;
2295 else if(pars1[m]<k) l=1;
2296 else l=-1;
2297 if(l==0) break;
2298 }
2299 else l=-1;
2300 }
2301 if(l!=0){
2302 contype(11);
2303 printf("parse error state=%i terminal=%i\n",stk[i],tmnl[j]);
2304 printf("i=%i j=%i ntmnl=%i\n",i,j,ntmnl);
2305 exit(0);
2306 }
2307 k=pars2[m]%4; /* 0:shift (1:goto) 2:reduce 3:accept*/
2308 l=pars2[m]/4; /* new state or production number */
2309 }
2310 if(tweak&8){
2311 printf("j=%i i=%i stk[i]=%i tmnl[j]=%i k=%i\n",j,i,stk[i],tmnl[j],k);
2312 }
2313 switch (k){
2314 case 0: /* shift */note012
2315 gsymbol[ngsymb]=tmnl[j];
2316 produc[ngsymb]=0;
2317 child[ngsymb]=0;
2318 sibli[ngsymb]=0;
2319 /* attributes that depend on tmnl array are established here */
2320 k1=tmnl[j];
2321 if(k1==46||k1==57||k1==60||k1==63){ // literal input
2322 attri1[ngsymb]=tmnl[j+1]; // chcon[], flcon[], ident[] or int value
2323 }
2324 else attri1[ngsymb]=0; /* no attribute */
2325 stk[++i]=ngsymb;
2326 ngsymb++;
2327 stk[++i]=l;
2328 break;
2329 case 2: /* reduce */note013
2330 i-=2*(pars7[l]-pars7[l-1]-1); /* number of grammer symbols on the right
2331 side of production */
2332 k1=stk[i]*152+pars6[pars7[l-1]];
2333 /* binary search of the index where pars3[]=k1 */
2334 l1=-1; /* decrement next */
2335 n1=o1;
2336 m1=n1;
2337 for(;n1>0;n1/=2){
2338 m1+=(l1*n1);
2339 if(m1<1587){
2340 if(pars3[m1]==k1) l1=0;
2341 else if(pars3[m1]<k1) l1=1;
2342 else l1=-1;
2343 if(l1==0) break;
2344 }
2345 else l1=-1;
2346 }
2347 if(l1!=0){
2348 contype(12);
2349 printf("parse error state=%i non-terminal=%i\n",stk[i],pars6[pars7[l-1]]);
2350 exit(0);
2351 }
2352 gsymbol[ngsymb]=pars6[pars7[l-1]];
2353 produc[ngsymb]=l;
2354 parent[ngsymb]=-1; // tentative
2355 child[ngsymb]=stk[i+1];
2356 for(k1=0;k1<pars7[l]-pars7[l-1]-1;k1++){
2357 l1=stk[i+2*k1+1];
2358 parent[l1]=ngsymb;
2359 if(k1==pars7[l]-pars7[l-1]-2) sibli[l1]=0;
2360 else sibli[l1]=stk[i+2*(k1+1)+1];
2361 }
2362 stk[++i]=ngsymb;
2363 /* prune parse tree. if the preceeding leaf is prunable, delete it */note014
2364 if((pars7[l]-pars7[l-1])==2){ /* if the right-side of production is single */
2365 l1=produc[child[ngsymb]];
2366 if(l1!=0){
2367 gsymbol[ngsymb-1]=gsymbol[ngsymb];
2368 parent[ngsymb-1]=-1;
2369 stk[i]=ngsymb-1; /* child is left as is. attribute assumed to be none */
2370 ngsymb--;
2371 }
2372 else{ /* terminal */
2373 stk[i]=ngsymb-1; /* child is left as is. attribute assumed to be none */
2374 ngsymb--;
2375 }
2376 }
2377 ngsymb++;
2378 stk[++i]=pars4[m1]; // new state
2379 break;
2380 case 3: /* accept */
2381 j=ntmnl; /* force exit */
2382 break;
2383 } /* switch k */
2384 if(k==2) j--; // reduce
2385 else if(tmnl[j]==46||tmnl[j]==57||tmnl[j]==60||tmnl[j]==63) j++; /* skip offset */
2386 } /* for(j=0;j<ntmnl;j++) */
2387 if(tweak&8) exit(0);
2388 // exit(0);
2389 /* get statistical data */note015
2390 nscop=1;
2391 /* search for function declarations */
2392 for(i=0;i<ngsymb;i++) if(produc[i]==73||produc[i]==75) nscop++;
2393 scop=(scope *)malloc(sizeof(scope)*(nscop+1));
2394 strcpy(scop[nscop].name,"callback");
2395 scop[nscop].nchar=0; /* numbr of characters */
2396 scop[nscop].nstring=0; /* number of strings */
2397 scop[nscop].ndouble=0; /* number of doubles */
2398 scop[nscop].nint=0; /* number of ints */
2399 scop[nscop].ndarr=0; /* number of darrays */
2400 scop[nscop].niarr=0; /* number of iarrays */
2401 scop[nscop].nident=0; /* number of identifiers */
2402 scop[nscop].mem.scop=nscop;
2403 scop[nscop].mem.bdouble=(double *)malloc(sizeof(double)*25);
2404 scop[nscop].mem.bint=(int *)malloc(sizeof(int)*25);
2405 scop[nscop].mem.bdarr=(darray *)malloc(sizeof(darray)*4);
2406 scop[nscop].mem.biarr=(iarray *)malloc(sizeof(iarray)*4);
2407 j=0; // global scope
2408 strcpy(scop[j].name,"global");
2409 j++;
2410
2411 for(i=0;i<ngsymb;i++) if(produc[i]==73||produc[i]==75){
2412 k=child[i]; /* identifier */
2413 k=attri1[k]; /* index into ident[] */
2414 k=ident[k]; /* index into inpchar[] */
2415 strcpy(scop[j].name,&inpchar[k]);
2416 scop[j].noderoot=parent[i];
2417 scop[j].nodedecl=sibli[child[sibli[i]]];
2418 l=produc[scop[j].nodedecl];
2419 if(l==119||l==126||l==127||l==128||l==143){ /* no declaration */
2420 scop[j].nodeexec=scop[j].nodedecl;
2421 scop[j].nodedecl=-1;
2422 }
2423 else scop[j].nodeexec=sibli[scop[j].nodedecl];
2424 j++;
2425 }
2426 k=parent[scop[1].noderoot];
2427 if(k==-1){
2428 scop[0].noderoot=-1;
2429 scop[0].nodedecl=-1;
2430 }
2431 else{
2432 scop[0].noderoot=k;
2433 if(child[k]!=scop[1].noderoot) scop[0].nodedecl=child[k];
2434 else scop[0].nodedecl=-1;
2435 }
2436 scop[0].nodeexec=-1;
2437
2438 /* ipc */
2439 numfunc1=0;
2440 prs13[0]=0;
2441 for(i=0;i<ngsymb;i++) if(produc[i]==207||produc[i]==208){
2442 k=child[i]; /* identifier */
2443 k=attri1[k]; /* index into ident[] */
2444 k=ident[k]; /* index into inpchar[] */
2445 strcpy(s,&inpchar[k]);
2446 for(k=1;k<nscop;k++) if(strcmp(s,scop[k].name)==0) break;
2447 if(k==nscop){ /* not in the user-defined functions */
2448 for(k=0;k<numfunc1;k++) if(strcmp(s,&prs12[prs13[k]])==0) break;
2449 if(k==numfunc1){ /* not in the current ipc functions list */
2450 for(k=1;k<numfunc;k*=2);
2451 l=k;
2452 j=-1;
2453 for(;k>0;k/=2){
2454 if(j<0) l-=k;
2455 if(j>0) l+=k;
2456 if(l<numfunc) j=strcmp(s,&prs6[prs7[l]]);
2457 else j=-1;
2458 if(j==0) break;
2459 }
2460 if(j!=0){
2461 for(l=0;s[l]!='\0';l++) prs12[prs13[numfunc1]+l]=s[l];
2462 prs12[prs13[numfunc1]+l]='\0';
2463 prs13[numfunc1+1]=prs13[numfunc1]+l+1;
2464 numfunc1++;
2465 }
2466 }
2467 }
2468 }
2469 if(numfunc1!=0){
2470 strcpy(s,getenv("SCRIPT_FILENAME"));
2471 if(s[1]=='h'&&isdigit(s[7])) udir=100*(s[7]-'0')+10*(s[8]-'0')+(s[9]-'0');
2472
2473#if 0
2474 child_pid=fork();
2475 if(child_pid==0){
2476 shmdt(shmbuf);
2477 // strcpy(arg0,argd);
2478 // strcpy(arg0,"./");
2479 strcpy(arg0,"/usr/gcs/");
2480 strcat(arg0,"fdb");
2481 sprintf(arg1,"%i",semid);
2482 sprintf(arg2,"%i",shmid);
2483 if(execlp(arg0,arg0,arg1,arg2,NULL)==-1){
2484 perror("execlp");
2485 exit(0);
2486 }
2487 exit(0);
2488 }
2489 nprog=0;
2490 for(i=0;i<numfunc1;i++){
2491 strcpy(shmbuf,&prs12[prs13[i]]);
2492 strcpy(s,&prs12[prs13[i]]);
2493 sb.sem_num=1;
2494 sb.sem_op=1;
2495 sb.sem_flg=0;
2496 semop(semid,&sb,1); /* post */
2497 sb.sem_num=0; // semaphore number
2498 sb.sem_op=-1;
2499 sb.sem_flg=0;
2500 semop(semid,&sb,1); /* wait */
2501 if(*(int *)shmbuf==-1){
2502 *shmbuf='\0';
2503 sb.sem_num=1;
2504 sb.sem_op=1;
2505 sb.sem_flg=0;
2506 semop(semid,&sb,1); /* post */
2507 /* added April 18, 03 */
2508 sb.sem_num=0;
2509 sb.sem_op=-1;
2510 sb.sem_flg=0;
2511 semop(semid,&sb,1); /* wait for detach */
2512 waitpid(child_pid,&i,0);
2513 contype(13);
2514 printf("function %s not found.",s);
2515 exit(0);
2516 }
2517 prs14[i]=*(int *)shmbuf; /* program number */
2518 for(j=0;j<nprog;j++) if(prs19[j]==prs14[i]) break;
2519 if(j==nprog){
2520 prs19[nprog]=prs14[i];
2521 nprog++;
2522 }
2523 prs15[i]=*((int *)shmbuf+1); /* function number */
2524 k=*((int *)shmbuf+2);
2525 if(i==0) prs17[i]=0;
2526 else prs17[i]=prs18[i-1];
2527 for(j=0;j<k;j++)
2528 prs16[prs17[i]+j]=*((int *)shmbuf+3+j);
2529 prs18[i]=prs17[i]+k;
2530 }
2531 *shmbuf='\0';
2532 sb.sem_num=1;
2533 sb.sem_op=1;
2534 sb.sem_flg=0;
2535 semop(semid,&sb,1); /* post */
2536 /* added April 18, 03 */
2537 sb.sem_num=0;
2538 sb.sem_op=-1;
2539 sb.sem_flg=0;
2540 semop(semid,&sb,1); /* wait for detach */
2541 waitpid(child_pid,&i,0);
2542#endif
2543#if 1
2544 /* prepare communication with fdbd daemon */
2545 if ((sockdesc = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
2546 contype(0);
2547 printf("socket");
2548 exit(0);
2549 }
2550 // if(!socerr){
2551 remote.sun_family = AF_UNIX;
2552 strcpy(remote.sun_path, SOCK_PATH);
2553 len = strlen(remote.sun_path) + sizeof(remote.sun_family);
2554 if (connect(sockdesc, (struct sockaddr *)&remote, len) == -1) {
2555 contype(0);
2556 printf("connect");
2557 exit(0);
2558 }
2559 // }
2560 nprog=0;
2561 for(i=0;i<numfunc1;i++){
2562 *(int *)msg=1; /* get data */
2563 strcpy((char *)((int *)msg+1),&prs12[prs13[i]]);
2564 len=4+strlen((char *)((int *)msg+1))+1;
2565 if (send(sockdesc,msg,len,0)==-1){
2566 contype(0);
2567 printf("send errno=%i",errno);
2568 exit(0);
2569 }
2570 else{
2571 if((recv(sockdesc,msg,100,0))==-1){
2572 contype(0);
2573 printf("recv");
2574 exit(0);
2575 }
2576 if(*(int *)msg==-1){
2577 *(int *)msg=999;
2578 send(sockdesc,msg,4,0);
2579 close(sockdesc);
2580 contype(13);
2581 printf("function %s not found.",&prs12[prs13[i]]);
2582 nprog=0;
2583 exit(0);
2584 }
2585 else{
2586 prs14[i]=*(int *)msg; /* program number */
2587 if(prs14[i]>10000){
2588 for(j=0;j<nso;j++) if(prs22[j]==(prs14[i]-10000)) break;
2589 if(j==nso){
2590 prs22[nso]=prs14[i]-10000;
2591 nso++;
2592 }
2593 }
2594 else{
2595 for(j=0;j<nprog;j++) if(prs19[j]==prs14[i]) break;
2596 if(j==nprog){
2597 prs19[nprog]=prs14[i];
2598 nprog++;
2599 }
2600 }
2601 prs15[i]=*((int *)msg+1); /* function number */
2602 k=*((int *)msg+2); /* number of type ids */
2603 if(i==0) prs17[i]=0;
2604 else prs17[i]=prs18[i-1];
2605 for(j=0;j<k;j++)
2606 prs16[prs17[i]+j]=*((int *)msg+3+j);
2607 prs18[i]=prs17[i]+k;
2608 } /* else */
2609 } /* else */
2610 } /* for(i=0;i<numfunc1;i++) */
2611 *(int *)msg=999;
2612 send(sockdesc,msg,4,0);
2613 close(sockdesc);
2614#endif
2615#if 0
2616 dbf=gdbm_open("/var/gcs/d036",512,GDBM_WRCREAT,0666,fatal_func);
2617 nprog=0;
2618 for(i=0;i<numfunc1;i++){
2619 dt1.dptr=&prs12[prs13[i]];
2620 dt1.dsize=strlen(dt1.dptr)+1;
2621 dt2=gdbm_fetch(dbf,dt1);
2622 if(dt2.dptr==NULL){
2623 contype(13);
2624 printf("function %s not found.",&prs12[prs13[i]]);
2625 nprog=0;
2626 exit(0);
2627 }
2628 else{
2629 prs14[i]=*(int *)dt2.dptr; /* program number */
2630 for(j=0;j<nprog;j++) if(prs19[j]==prs14[i]) break;
2631 if(j==nprog){
2632 prs19[nprog]=prs14[i];
2633 nprog++;
2634 }
2635 prs15[i]=*((int *)dt2.dptr+1); /* function number */
2636 k=*((int *)dt2.dptr+2); /* number of type ids */
2637 if(i==0) prs17[i]=0;
2638 else prs17[i]=prs18[i-1];
2639 for(j=0;j<k;j++)
2640 prs16[prs17[i]+j]=*((int *)dt2.dptr+3+j);
2641 prs18[i]=prs17[i]+k;
2642 free(dt2.dptr);
2643 } /* else */
2644 } /* for(i=0;i<numfunc1;i++) */
2645 gdbm_close(dbf);
2646#endif
2647 if(nso){
2648 for(i=0;i<nso;i++){
2649 sprintf(arg0,"/usr/gcs/s%03i.so",prs22[i]);
2650 prs24[i]=dlopen(arg0, RTLD_NOW);
2651 sprintf(arg0,"s%03i",prs22[i]);
2652 prs23[i]=dlsym(prs24[i],arg0);
2653 }
2654 }
2655 if(nprog){
2656 semid=semget(IPC_PRIVATE,20,0666);
2657 shmid=shmget(IPC_PRIVATE,4096,0666);
2658 shmbuf=(char *)shmat(shmid,0,0);
2659 *(int *)(shmbuf+4092)=0; /* access permission */
2660 shmcb=(void *)(shmbuf+3712); /* last 384 bytes for callbacks */
2661 j=0;
2662 k=0;
2663 for(i=0;i<nprog;i++){
2664 if(prs19[i]==6||prs19[i]==7||prs19[i]==8) j=1;
2665 if(prs19[i]==9||prs19[i]==10) k=1;
2666 }
2667 if(j==1&&k==1){
2668 contype(14);
2669 printf("Xlib and GL cannot be mixed");
2670 nprog=0;
2671 exit(0);
2672 }
2673 j=0;
2674 k=0;
2675 for(i=0;i<nprog;i++){
2676 if(prs19[i]==6||prs19[i]==7||prs19[i]==8) j=1;
2677 if(prs19[i]==9||prs19[i]==10) j=1;
2678 if(prs19[i]==16||prs19[i]==25||prs19[i]==26||prs19[i]==27||prs19[i]==28||prs19[i]==37) k=1;
2679 }
2680 if(j==1&&k==1){
2681 contype(15);
2682 printf("MakeView and MakeViewX/MakeViewG cannot be mixed");
2683 nprog=0;
2684 exit(0);
2685 }
2686 if(k==1) prs19[nprog++]=24; /* f024 called via draw6.c */
2687 for(i=0;i<nprog;i++) param1[i]=0;
2688 dp = opendir (argd);
2689 while (ep = readdir (dp)){
2690 if(isdigit(ep->d_name[2])){
2691 j=(ep->d_name[1]-'0')*100+(ep->d_name[2]-'0')*10+ep->d_name[3]-'0';
2692 for(i=0;i<nprog;i++){
2693 if(j==prs19[i]){
2694 param1[i]=1;
2695 break;
2696 }
2697 }
2698 }
2699 }
2700 closedir(dp);
2701 for(i=0;i<nprog;i++) if(param1[i]==0&&prs19[i]<600) break;
2702 if(i<nprog){
2703 contype(0);
2704 printf("f%03i not available\n",prs19[i]);
2705 nprog=0;
2706 exit(0);
2707 }
2708 j=8;
2709 for(i=0;i<nprog;i++){
2710 if(prs19[i]>=600&&prs19[i]!=udir){
2711 contype(0);
2712 printf("udir=%i prs19[i]=%i\n",udir,prs19[i]);
2713 nprog=0;
2714 exit(0);
2715 }
2716 }
2717 for(i=0;i<nprog;i++){
2718 if(prs19[i]==6||prs19[i]==9) prs20[i]=4; /* f006 f009 */
2719 else if(prs19[i]==24) prs20[i]=7; /* f024 */
2720 else prs20[i]=j++; /* semaphore number */
2721 child_pid=fork();
2722 if(child_pid==0){
2723 shmdt(shmbuf);
2724 sprintf(argf,"f%03i",prs19[i]);
2725 if(prs19[i]<600){
2726 strcpy(arg0,argd);
2727 strcat(arg0,argf);
2728 }
2729 else{
2730 strcpy(arg0,"./");
2731 strcat(arg0,argf);
2732 }
2733 sprintf(arg1,"%i",semid);
2734 sprintf(arg2,"%i",shmid);
2735 sprintf(arg3,"%i",prs20[i]);
2736 if(execlp(arg0,arg0,arg1,arg2,arg3,NULL)==-1){
2737 perror("execlp");
2738 nprog=0;
2739 exit(0);
2740 }
2741 exit(0);
2742 }
2743 prs21[i]=child_pid;
2744 }
2745 } /* if(nprog){ */
2746 } /* if(numfunc1!=0){ */
2747 //for(n1=0;n1<nscop;n1++) printf("n1=%i root=%i decl=%i exec=%i\n",
2748 // n1,scop[n1].noderoot,scop[n1].nodedecl,scop[n1].nodeexec);
2749
2750 /* process declarations */note016
2751 for(n1=0;n1<nscop;n1++){ /* do for each scope */
2752 scop[n1].nchar=0; /* numbr of characters */
2753 scop[n1].nstring=0; /* number of strings */
2754 scop[n1].ndouble=0; /* number of doubles */
2755 scop[n1].nint=0; /* number of ints */
2756 scop[n1].ndarr=0; /* number of darrays */
2757 scop[n1].niarr=0; /* number of iarrays */
2758 scop[n1].nident=0; /* number of identifiers */
2759 ochar=0;
2760 ostring=0;
2761 odouble=0;
2762 oint=0;
2763 odarr=0;
2764 oiarr=0;
2765 oident=0;
2766
2767 for(m1=0;m1<2;m1++){ /* m1=0 collect the size, m1=1 setup memory and initialize */
2768 if(n1>0){ /* if not global, process function interface */
2769 if(m1==0) scop[n1].nint++; /* number of parameters */
2770 else scop[n1].mem.bint[oint++]=i7;
2771 i7=0; /* number of parameters */
2772 k1=scop[n1].noderoot;
2773 if(produc[k1]==8){
2774 k1=child[k1];
2775 decltype=gsymbol[k1];
2776 switch(decltype){
2777 case 45: // char
2778 if(m1==0) scop[n1].nchar++;
2779 else scop[n1].offs[oident]=ochar++;
2780 break;
2781 case 51: // double
2782 if(m1==0) scop[n1].ndouble++;
2783 else scop[n1].offs[oident]=odouble++;
2784 break;
2785 case 62: // int
2786 case 78: // void
2787 if(m1==0) scop[n1].nint++;
2788 else{
2789 scop[n1].mem.bint[oint]=0;
2790 scop[n1].offs[oident]=oint++;
2791 }
2792 break;
2793 }
2794 k1=child[sibli[k1]]; /* identifier */
2795 } /* if(produc[k1]==8) */
2796 else if(produc[k1]==9){ /* without type */
2797 if(m1==0) scop[n1].nint++;
2798 else{
2799 scop[n1].mem.bint[oint]=0;
2800 scop[n1].offs[oident]=oint++;
2801 }
2802 decltype=62; /* default int */
2803 k1=child[child[k1]]; /* identifier */
2804 }
2805 if(m1==0) scop[n1].nident++; /* function name */
2806 else{
2807 scop[n1].ident[oident]=attri1[k1]; /* offset into ident[], ident in turn is offset to inpchar[] */
2808 switch(decltype){
2809 case 45:
2810 scop[n1].kind[oident]=1;
2811 break;
2812 case 51:
2813 scop[n1].kind[oident]=3;
2814 break;
2815 case 62:
2816 scop[n1].kind[oident]=4;
2817 break;
2818 case 78: /* void */
2819 scop[n1].kind[oident]=4;
2820 break;
2821 }
2822 oident++;
2823 }
2824 i7++;
2825 k1=parent[k1];
2826 if(produc[k1]==73){ /* parameter-type-list to follow */
2827 mpstk[0]=0;
2828 mpstk[1]=0;
2829 nmp=1;
2830 test=100;
2831 while(test--){note017
2832 if(m1==0&&tweak&1){
2833 if(outcnt>=outfrom&&outcnt<=outto){
2834 printf("%02i*%i* %i ",outcnt%100,k1,nmp);
2835 if(nmp>19){
2836 j=(nmp-15)/5;
2837 j*=5;
2838 }
2839 else j=0;
2840 for(i=j;i<nmp;i++) printf("%i-%i ",mpstk[2*i],mpstk[2*i+1]);
2841 printf("\n");
2842 }
2843 outcnt++;
2844 }
2845 if(k1<=0) break;
2846 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0&&mpstk[2*i+1]==k1) break;
2847 if(i==0){ /* not return pass */
2848 if((i=child[k1])!=0){
2849 if(nmp!=1&&(j=sibli[k1])!=0){
2850 mpstk[nmp*2]=1; /* sibling node */
2851 mpstk[nmp*2+1]=j; /* jump node */
2852 nmp++;
2853 mpstk[nmp*2]=0; /* return node */
2854 mpstk[nmp*2+1]=k1; /* jump node */
2855 nmp++;
2856 }
2857 else{
2858 mpstk[nmp*2]=0; /* return node */
2859 mpstk[nmp*2+1]=k1; /* jump node */
2860 nmp++;
2861 }
2862 k1=i; /* jump to child */
2863 } /* if((i=child[k1])!=0) */
2864 else{ /* no child */
2865 j=gsymbol[k1];
2866 if(j==45||j==51||j==62||j==11){ /* char double int * */
2867 mpstk[nmp*2]=3; /* gsymbol */
2868 mpstk[nmp*2+1]=j; /* type */
2869 nmp++;
2870 }
2871 if(j==60){ /* identifier */
2872 mpstk[nmp*2]=7;
2873 mpstk[nmp*2+1]=attri1[k1];
2874 nmp++;
2875 }
2876 if((j=sibli[k1])!=0){
2877 k1=j;
2878 }
2879 else{ /* no child, no sibling */
2880 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
2881 k1=mpstk[2*i+1];
2882 if(mpstk[2*i]==1){ /* if sibling delete that node */
2883 for(j=i+1;i<nmp;i++){
2884 mpstk[(j-1)*2]=mpstk[j*2];
2885 mpstk[(j-1)*2+1]=mpstk[j*2+1];
2886 }
2887 nmp--;
2888 }
2889 } /* else */
2890 } /* else */
2891 } /* if(i==0) */
2892 else{ /* return pass */note018
2893 i1=i; /* remember pointer for return node k1 */
2894 j1=nmp; /* remember stack pointer */
2895 nmp=i; /* new stack pointer */
2896 switch(produc[k1]){
2897 case 67: /* *id */
2898 if(mpstk[(i1+1)*2+1]==11)
2899 mpstk[(nmp-1)*2+1]+=300; /* indicate pointer */
2900 else
2901 mpstk[(nmp-1)*2+1]+=200; /* indicate pointer */
2902 mpstk[nmp*2]=mpstk[(i1+2)*2]; /* * was pushed */
2903 mpstk[nmp*2+1]=mpstk[(i1+2)*2+1];
2904 nmp++;
2905 break;
2906 case 72: /* id[] */
2907 mpstk[(nmp-1)*2+1]+=200; /* indicate pointer */
2908 mpstk[nmp*2]=mpstk[(i1+1)*2];
2909 mpstk[nmp*2+1]=mpstk[(i1+1)*2+1];
2910 nmp++;
2911 break;
2912 case 79: /* ** */
2913 mpstk[nmp*2]=3;
2914 mpstk[nmp*2+1]=12;
2915 nmp++;
2916 break;
2917 case 85:
2918 k1=0; /* force break */
2919 break;
2920 case 86:
2921 /* mpstk[2*i1+1]=return node, mpstk[2*(i1+1)+1]=type, mpstk[2*(i1+2)+1]=identifier */
2922 i=i1+1;
2923 switch(mpstk[2*i+1]){
2924 case 45: // char
2925 if(m1==0){
2926 scop[n1].nchar++;
2927 scop[n1].nident++;
2928 }
2929 else{
2930 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2931 scop[n1].kind[oident]=1;
2932 scop[n1].offs[oident]=ochar++;
2933 oident++;
2934 }
2935 break;
2936 case 51: // double
2937 if(m1==0){
2938 scop[n1].ndouble++;
2939 scop[n1].nident++;
2940 }
2941 else{
2942 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2943 scop[n1].kind[oident]=3;
2944 scop[n1].offs[oident]=odouble++;
2945 oident++;
2946 }
2947 break;
2948 case 62: // int
2949 if(m1==0){
2950 scop[n1].nint++;
2951 scop[n1].nident++;
2952 }
2953 else{
2954 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2955 scop[n1].kind[oident]=4;
2956 scop[n1].offs[oident]=oint++;
2957 oident++;
2958 }
2959 break;
2960 case 245: // char
2961 if(m1==0){
2962 scop[n1].nint++;
2963 scop[n1].nident++;
2964 }
2965 else{
2966 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2967 scop[n1].kind[oident]=7;
2968 scop[n1].offs[oident]=oint++;
2969 oident++;
2970 }
2971 break;
2972 case 251: // double
2973 if(m1==0){
2974 scop[n1].nint++;
2975 scop[n1].nident++;
2976 }
2977 else{
2978 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2979 scop[n1].kind[oident]=11;
2980 scop[n1].offs[oident]=oint++;
2981 oident++;
2982 }
2983 break;
2984 case 262: // int
2985 if(m1==0){
2986 scop[n1].nint++;
2987 scop[n1].nident++;
2988 }
2989 else{
2990 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
2991 scop[n1].kind[oident]=12;
2992 scop[n1].offs[oident]=oint++; /* to be supplied by the calling program */
2993 oident++;
2994 }
2995 break;
2996 case 345: // char
2997 if(m1==0){
2998 scop[n1].nint++;
2999 scop[n1].nident++;
3000 }
3001 else{
3002 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3003 scop[n1].kind[oident]=7;
3004 scop[n1].offs[oident]=oint++;
3005 oident++;
3006 }
3007 break;
3008 case 351: // double
3009 if(m1==0){
3010 scop[n1].nint++;
3011 scop[n1].nident++;
3012 }
3013 else{
3014 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3015 scop[n1].kind[oident]=9;
3016 scop[n1].offs[oident]=oint++;
3017 oident++;
3018 }
3019 break;
3020 case 362: // int
3021 if(m1==0){
3022 scop[n1].nint++;
3023 scop[n1].nident++;
3024 }
3025 else{
3026 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3027 scop[n1].kind[oident]=10;
3028 scop[n1].offs[oident]=oint++; /* to be supplied by the calling program */
3029 oident++;
3030 }
3031 break;
3032 default:
3033 break;
3034 } /* switch(mpstk[2*i+1]) */
3035 i7++;
3036 break;
3037 } /* switch(produc[k1]) */
3038 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
3039 if(i>0){
3040 k1=mpstk[2*i+1];
3041 if(mpstk[2*i]==1||mpstk[2*i]==2){
3042 for(;i<nmp;i++){
3043 mpstk[2*i]=mpstk[2*(i+1)];
3044 mpstk[2*i+1]=mpstk[2*(i+1)+1];
3045 }
3046 nmp--;
3047 }
3048 } /* if(i>0) */
3049 else k1=0;
3050 } /* else */
3051 } /* while(test--) */
3052 } /* if(produc[k1]==73) */
3053 } /* if(n1>0) */
3054 mpstk[0]=0;note019
3055 mpstk[1]=0;
3056 nmp=1;
3057 k1=scop[n1].nodedecl; /* start from declaration node */
3058 if(k1!=-1){
3059 test=10000;
3060 while(test--){
3061 if(m1==0&&tweak&1){
3062 if(outcnt>=outfrom&&outcnt<=outto){
3063 printf("%02i*%i* %i ",outcnt%100,k1,nmp);
3064 if(nmp>19){
3065 j=(nmp-15)/5;
3066 j*=5;
3067 }
3068 else j=0;
3069 for(i=j;i<nmp;i++) printf("%i-%i ",mpstk[2*i],mpstk[2*i+1]);
3070 printf("\n");
3071 }
3072 outcnt++;
3073 }
3074 if(k1<=0) break;
3075 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0&&mpstk[2*i+1]==k1) break;
3076 if(i==0){ /* not return pass */
3077 if((i=child[k1])!=0){ /* if there is a child, depth-first traversal jump to child */
3078 if(nmp!=1&&(j=sibli[k1])!=0){ /* if there is a sibling, push it so that it can be traversed later */
3079 mpstk[nmp*2]=1; /* sibling node */
3080 mpstk[nmp*2+1]=j; /* jmp node */
3081 nmp++;
3082 }
3083 mpstk[nmp*2]=0; /* return node */
3084 mpstk[nmp*2+1]=k1; /* jmp node */
3085 nmp++;
3086 k1=i; /* jmp to child */
3087 }
3088 else{ /* no child */
3089 j=gsymbol[k1];
3090 if(j==45||j==51||j==62){ /* char double or int */
3091 mpstk[nmp*2]=3; /* gsymbol */
3092 mpstk[nmp*2+1]=j; /* type */
3093 nmp++;
3094 decltype=j;
3095 }
3096 else if(j==11||j==13||j==17||j==23||j==4){
3097 mpstk[nmp*2]=3; /* gsymbol */
3098 mpstk[nmp*2+1]=j; /* binary operator */
3099 nmp++;
3100 }
3101 if(j==46){ /* character constant */
3102 mpstk[nmp*2]=4;
3103 mpstk[nmp*2+1]=attri1[k1];
3104 nmp++;
3105 }
3106 if(j==57){ /* floating constant */
3107 mpstk[nmp*2]=5;
3108 mpstk[nmp*2+1]=attri1[k1];
3109 nmp++;
3110 }
3111 if(j==60){ /* identifier */
3112 mpstk[nmp*2]=7;
3113 mpstk[nmp*2+1]=attri1[k1];
3114 nmp++;
3115 }
3116 if(j==63){ /* integer constant */
3117 mpstk[nmp*2]=6;
3118 mpstk[nmp*2+1]=attri1[k1];
3119 nmp++;
3120 }
3121 if((j=sibli[k1])!=0){
3122 k1=j;
3123 }
3124 else{ /* no child, no sibling */
3125 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
3126 k1=mpstk[2*i+1];
3127 if(mpstk[2*i]==1){ /* if sibling delete that node */
3128 for(j=i+1;i<nmp;i++){
3129 mpstk[(j-1)*2]=mpstk[j*2];
3130 mpstk[(j-1)*2+1]=mpstk[j*2+1];
3131 }
3132 nmp--;
3133 }
3134 } /* else */
3135 } /* else */
3136 } /* if(i==0) */
3137 else{ /* return pass - reduction by non-terminal */note020
3138 i1=i;
3139 j1=nmp;
3140 nmp=i;
3141 switch(produc[k1]){
3142 case 10:
3143 if(mpstk[(i1+2)*2]!=11){ /* single declaration */
3144 switch(decltype){
3145 case 45: // char
3146 if(j1-i1==4){
3147 if(mpstk[(i1+3)*2]==4){ /* character-const */
3148 for(j=0;;j++) if(inpchar[chcon[mpstk[(i1+3)*2+1]]+j]=='\0') break;
3149 j++;
3150 if(m1==0){
3151 scop[n1].nchar+=j;
3152 }
3153 else{
3154 for(k=0;k<j;k++)
3155 scop[n1].mem.bchar[ochar++]=inpchar[chcon[mpstk[(i1+3)*2+1]]+k];
3156 scop[n1].mem.mstring[ostring-1]=j;
3157 scop[n1].mem.nstring[ostring-1]=j;
3158 }
3159 }
3160 else{
3161 exit(0);
3162 }
3163 }
3164 else{
3165 if(m1==0){
3166 scop[n1].nchar++;
3167 scop[n1].nident++;
3168 }
3169 else{
3170 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3171 scop[n1].kind[oident]=1;
3172 scop[n1].offs[oident++]=ochar++;
3173 }
3174 }
3175 break;
3176 case 51: // double
3177 if(m1==0){
3178 scop[n1].ndouble++;
3179 scop[n1].nident++;
3180 }
3181 else{
3182 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3183 scop[n1].kind[oident]=3;
3184 scop[n1].offs[oident++]=odouble++;
3185 // if(j1-i1==4){
3186 // if(mpstk[(i1+3)*2]==5)
3187 // scop[n1].mem.bdouble[odouble-1]=flcon[mpstk[(i1+3)*2+1]];
3188 // else if(mpstk[(i1+3)*2]==8)
3189 // scop[n1].mem.bdouble[odouble-1]=dstk[mpstk[(i1+3)*2+1]];
3190 // }
3191 }
3192 break;
3193 case 62: // int
3194 if(m1==0){
3195 scop[n1].nint++;
3196 scop[n1].nident++;
3197 }
3198 else{
3199 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3200 scop[n1].kind[oident]=4;
3201 scop[n1].offs[oident++]=oint++;
3202 // if(j1-i1==4){
3203 // if(mpstk[(i1+3)*2]==6)
3204 // scop[n1].mem.bint[oint-1]=mpstk[(i1+3)*2+1];
3205 // }
3206 }
3207 break;
3208 } /* switch(decltype) */
3209 } /* if(mpstk[(i1+2)*2]!=11) */
3210 break;
3211 case 47:
3212 switch(decltype){
3213 case 45: // char
3214 if(m1==0){
3215 if(mpstk[2*(i1+2)]==11);
3216 else if(mpstk[2*(i1+1)]==11){ /* only second entry */
3217 scop[n1].nchar++;
3218 scop[n1].nident++;
3219 }
3220 else{ /* both entries */
3221 scop[n1].nchar+=2;
3222 scop[n1].nident+=2;
3223 }
3224 mpstk[2*nmp]=11; /* indicate the pocess finished */
3225 mpstk[2*nmp+1]=0; /* does not mean anything */
3226 nmp++;
3227 }
3228 else{
3229 if(mpstk[(i1+1)*2]!=11){
3230 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3231 scop[n1].kind[oident]=1;
3232 scop[n1].offs[oident++]=ochar++;
3233 }
3234 if(mpstk[(i1+2)*2]!=11){
3235 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3236 scop[n1].kind[oident]=1;
3237 scop[n1].offs[oident++]=ochar++;
3238 }
3239 mpstk[2*nmp]=11; /* indicate the pocess finished */
3240 mpstk[2*nmp+1]=0; /* does not mean anything */
3241 nmp++;
3242 }
3243 break;
3244 case 51: // double
3245 if(m1==0){
3246 if(mpstk[2*(i1+2)]==11);
3247 else if(mpstk[2*(i1+1)]==11){ /* only second entry */
3248 scop[n1].ndouble++;
3249 scop[n1].nident++;
3250 }
3251 else{ /* both entries */
3252 scop[n1].ndouble+=2;
3253 scop[n1].nident+=2;
3254 }
3255 mpstk[2*nmp]=11; /* indicate the pocess finished */
3256 mpstk[2*nmp+1]=0; /* does not mean anything */
3257 nmp++;
3258 }
3259 else{
3260 if(mpstk[(i1+1)*2]!=11){
3261 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3262 scop[n1].kind[oident]=3;
3263 scop[n1].offs[oident++]=odouble++;
3264 }
3265 if(mpstk[(i1+2)*2]!=11){
3266 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3267 scop[n1].kind[oident]=3;
3268 scop[n1].offs[oident++]=odouble++;
3269 }
3270 mpstk[2*nmp]=11; /* indicate the pocess finished */
3271 mpstk[2*nmp+1]=0; /* does not mean anything */
3272 nmp++;
3273 }
3274 break;
3275 case 62: // int
3276 if(m1==0){
3277 if(mpstk[(i1+1)*2]!=11){
3278 scop[n1].nint++;
3279 scop[n1].nident++;
3280 }
3281 if(mpstk[(i1+2)*2]!=11){
3282 scop[n1].nint++;
3283 scop[n1].nident++;
3284 }
3285 // if(mpstk[2*(i1+2)]==11);
3286 // else if(mpstk[2*(i1+1)]==11){ /* only second entry */
3287 // scop[n1].nint++;
3288 // scop[n1].nident++;
3289 // }
3290 // else{ /* both entries */
3291 // scop[n1].nint+=2;
3292 // scop[n1].nident+=2;
3293 // }
3294 mpstk[2*nmp]=11; /* indicate the pocess finished */
3295 mpstk[2*nmp+1]=0; /* does not mean anything */
3296 nmp++;
3297 }
3298 else{
3299 if(mpstk[(i1+1)*2]!=11){
3300 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3301 scop[n1].kind[oident]=4;
3302 scop[n1].offs[oident++]=oint++;
3303 }
3304 if(mpstk[(i1+2)*2]!=11){
3305 scop[n1].ident[oident]=mpstk[(i1+2)*2+1];
3306 scop[n1].kind[oident]=4;
3307 scop[n1].offs[oident++]=oint++;
3308 }
3309 mpstk[2*nmp]=11; /* indicate the pocess finished */
3310 mpstk[2*nmp+1]=0; /* does not mean anything */
3311 nmp++;
3312 }
3313 break;
3314 default:
3315 break;
3316 }
3317 break;
3318 case 49:
3319 switch(decltype){
3320 case 45: // char
3321 for(i=i1;i<j1-1;i++){
3322 mpstk[i*2]=mpstk[(i+1)*2];
3323 mpstk[i*2+1]=mpstk[(i+1)*2+1];
3324 }
3325 nmp=j1-1;
3326 break;
3327 case 51: // double
3328 if(mpstk[(i1+1)*2]==11){
3329 for(i=i1;i<j1-1;i++){
3330 mpstk[i*2]=mpstk[(i+1)*2];
3331 mpstk[i*2+1]=mpstk[(i+1)*2+1];
3332 }
3333 nmp=j1-1;
3334 break;
3335 }
3336 if(m1==0);
3337 else{
3338 switch(mpstk[(i1+2)*2]){
3339 case 5: /* flcon */
3340 d1=flcon[mpstk[(i1+2)*2+1]];
3341 break;
3342 case 6: /* int const */
3343 d1=mpstk[(i1+2)*2+1];
3344 break;
3345 case 8: /* dstk[] */
3346 d1=dstk[mpstk[(i1+2)*2+1]];
3347 break;
3348 default:
3349 contype(62);
3350 exit(0);
3351 }
3352 if(mpstk[2*(i1-1)]==1||mpstk[2*(i1-1)]==0||mpstk[2*(i1-1)]==11) i=odouble;
3353 else i=odouble+1;
3354 scop[n1].mem.bdouble[i]=d1;
3355 }
3356 mpstk[2*nmp]=mpstk[(i1+1)*2];
3357 mpstk[2*nmp+1]=mpstk[(i1+1)*2+1];
3358 nmp++;
3359 break;
3360 case 62: // int
3361 if(mpstk[(i1+1)*2]==11){
3362 for(i=i1;i<j1-1;i++){
3363 mpstk[i*2]=mpstk[(i+1)*2];
3364 mpstk[i*2+1]=mpstk[(i+1)*2+1];
3365 }
3366 nmp=j1-1;
3367 break;
3368 }
3369 if(m1==0);
3370 else{
3371 switch(mpstk[(i1+2)*2]){
3372 case 6: /* int const */
3373 j=mpstk[(i1+2)*2+1];
3374 break;
3375 default:
3376 contype(63);
3377 exit(0);
3378 }
3379 if(mpstk[2*(i1-1)]==1||mpstk[2*(i1-1)]==0||mpstk[2*(i1-1)]==11) i=oint;
3380 else i=oint+1;
3381 scop[n1].mem.bint[i]=j;
3382 }
3383 mpstk[2*nmp]=mpstk[(i1+1)*2];
3384 mpstk[2*nmp+1]=mpstk[(i1+1)*2+1];
3385 nmp++;
3386 break;
3387 default:
3388 break;
3389 }
3390 break;
3391 case 71: /* id[i] */
3392 if(decltype==45&&mpstk[(i1-1)*2]==3&&mpstk[(i1-1)*2+1]==11) decltype=145; /* char *a[n] */
3393 switch(decltype){
3394 case 45: // char
3395 if(m1==0){
3396 odata=scop[n1].nchar;
3397 scop[n1].nchar+=mpstk[(i1+2)*2+1];
3398 scop[n1].nstring++;
3399 scop[n1].nident++;
3400 mpstk[2*nmp]=11; /* indicate the pocess finished */
3401 mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
3402 nmp++;
3403 }
3404 else{
3405 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3406 scop[n1].kind[oident]=2; /* to be looked at later */
3407 scop[n1].offs[oident++]=ostring;
3408 scop[n1].mem.mstring[ostring]=mpstk[(i1+2)*2+1];
3409 scop[n1].mem.nstring[ostring]=0;
3410 scop[n1].mem.bstring[ostring++]=ochar;
3411 ochar+=mpstk[(i1+2)*2+1];
3412 mpstk[2*nmp]=11; /* indicate the pocess finished */
3413 mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
3414 nmp++;
3415 }
3416 break;
3417 case 51: // double
3418 if(m1==0){
3419 if(mpstk[2*(i1+1)]==11){ /* multi-dimension */
3420 scop[n1].ndouble-=mpstk[(i1+1)*2+1];
3421 scop[n1].ndouble+=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1];
3422 mpstk[2*nmp]=11; /* indicate the pocess finished */
3423 mpstk[2*nmp+1]=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1]; /* amount added */
3424 nmp++;
3425 }
3426 else{
3427 odata=scop[n1].ndouble;
3428 scop[n1].ndouble+=mpstk[(i1+2)*2+1];
3429 scop[n1].ndarr++;
3430 scop[n1].nident++;
3431 mpstk[2*nmp]=11; /* indicate the process finished */
3432 mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
3433 nmp++;
3434 }
3435 }
3436 else{
3437 if(mpstk[2*(i1+1)]==11){ /* multi-dimension */
3438 scop[n1].mem.bdarr[odarr-1].dimen++;
3439 scop[n1].mem.bdarr[odarr-1].size[scop[n1].mem.bdarr[odarr-1].dimen-1]=mpstk[(i1+2)*2+1];
3440 odouble-=mpstk[(i1+1)*2+1];
3441 odouble+=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1];
3442 mpstk[2*nmp]=11; /* indicate the pocess finished */
3443 mpstk[2*nmp+1]=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1]; /* amount added */
3444 nmp++;
3445 }
3446 else{
3447 scop[n1].mem.bdarr[odarr].dimen=1;
3448 scop[n1].mem.bdarr[odarr].size[0]=mpstk[(i1+2)*2+1];
3449 scop[n1].mem.bdarr[odarr].dat=&scop[n1].mem.bdouble[odouble];
3450 scop[n1].mem.bdarr[odarr++].offs=odouble;
3451 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3452 scop[n1].kind[oident]=5;
3453 scop[n1].offs[oident++]=odarr-1;
3454 odata=odouble; /* used at initialization */
3455 odouble+=mpstk[(i1+2)*2+1];
3456 mpstk[2*nmp]=11; /* indicate the process finished */
3457 mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
3458 nmp++;
3459 }
3460 }
3461 break;
3462 case 62: // int
3463 if(m1==0){
3464 if(mpstk[2*(i1+1)]==11){ /* multi-dimension */
3465 scop[n1].nint-=mpstk[(i1+1)*2+1];
3466 scop[n1].nint+=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1];
3467 mpstk[2*nmp]=11; /* indicate the pocess finished */
3468 mpstk[2*nmp+1]=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1]; /* amount added */
3469 nmp++;
3470 }
3471 else{
3472 odata=scop[n1].nint;
3473 scop[n1].nint+=mpstk[(i1+2)*2+1];
3474 scop[n1].niarr++;
3475 scop[n1].nident++;
3476 mpstk[2*nmp]=11; /* indicate the pocess finished */
3477 mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
3478 nmp++;
3479 }
3480 }
3481 else{
3482 if(mpstk[2*(i1+1)]==11){ /* multi-dimension */
3483 scop[n1].mem.biarr[oiarr-1].dimen++;
3484 scop[n1].mem.biarr[oiarr-1].size[scop[n1].mem.biarr[oiarr-1].dimen-1]=mpstk[(i1+2)*2+1];
3485 oint-=mpstk[(i1+1)*2+1];
3486 oint+=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1];
3487 mpstk[2*nmp]=11; /* indicate the pocess finished */
3488 mpstk[2*nmp+1]=mpstk[(i1+1)*2+1]*mpstk[(i1+2)*2+1]; /* amount added */
3489 nmp++;
3490 }
3491 else{
3492 scop[n1].mem.biarr[oiarr].dimen=1;
3493 scop[n1].mem.biarr[oiarr].size[0]=mpstk[(i1+2)*2+1];
3494 scop[n1].mem.biarr[oiarr].dat=&scop[n1].mem.bint[oint];
3495 scop[n1].mem.biarr[oiarr++].offs=oint;
3496 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3497 scop[n1].kind[oident]=6; /* iarray */
3498 scop[n1].offs[oident++]=oiarr-1;
3499 odata=oint;
3500 oint+=mpstk[(i1+2)*2+1];
3501 mpstk[2*nmp]=11; /* indicate the pocess finished */
3502 mpstk[2*nmp+1]=mpstk[(i1+2)*2+1]; /* amount added */
3503 nmp++;
3504 }
3505 }
3506 break;
3507 case 145:
3508 if(m1==0){
3509 scop[n1].nident++;
3510 scop[n1].nint+=2; // offset to bstring[] and length
3511 }
3512 else{
3513 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3514 scop[n1].kind[oident]=8; // string*
3515 scop[n1].offs[oident++]=oint;
3516 scop[n1].mem.bint[oint++]=ostring;
3517 scop[n1].mem.bint[oint++]=0;
3518 }
3519 break;
3520 default:
3521 break;
3522 }
3523 break;
3524 case 72: /* id[] */
3525 //printf("\ndecltype=%i mpstk[(i1-1)*2]=%i mpstk[(i1-1)*2+1]=%i \n",decltype,mpstk[(i1-1)*2],mpstk[(i1-1)*2+1]);
3526 //exit(0);
3527 if(decltype==45&&mpstk[(i1-1)*2]==3&&mpstk[(i1-1)*2+1]==11) decltype=145; /* char *a[] */
3528 if(m1==0){
3529 scop[n1].nident++;
3530 switch(decltype){
3531 case 45: // char
3532 odata=scop[n1].nchar;
3533 scop[n1].nstring++;
3534 break;
3535 case 51: // double
3536 scop[n1].ndarr++;
3537 odata=scop[n1].ndouble;
3538 break;
3539 case 62: // int
3540 scop[n1].niarr++;
3541 odata=scop[n1].nint;
3542 break;
3543 case 145: // char *
3544 scop[n1].nint+=2; // offset to bstring[] and length
3545 break;
3546 default:
3547 break;
3548 }
3549 }
3550 else{
3551 switch(decltype){
3552 case 45: // char
3553 scop[n1].mem.bstring[ostring]=ochar;
3554 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3555 scop[n1].kind[oident]=2; // string
3556 scop[n1].offs[oident++]=ostring++;
3557 odata=ochar;
3558 break;
3559 case 51: // double
3560 scop[n1].mem.bdarr[odarr].dimen=1;
3561 scop[n1].mem.bdarr[odarr].size[0]=0;
3562 scop[n1].mem.bdarr[odarr].dat=&scop[n1].mem.bdouble[odouble];
3563 scop[n1].mem.bdarr[odarr++].offs=odouble;
3564 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3565 scop[n1].kind[oident]=5; // darray
3566 scop[n1].offs[oident++]=odarr-1;
3567 odata=odouble;
3568 break;
3569 case 62: // int
3570 scop[n1].mem.biarr[oiarr].dimen=1;
3571 scop[n1].mem.biarr[oiarr].size[0]=0;
3572 scop[n1].mem.biarr[oiarr].dat=&scop[n1].mem.bint[oint];
3573 scop[n1].mem.biarr[oiarr++].offs=oint;
3574 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3575 scop[n1].kind[oident]=6;
3576 scop[n1].offs[oident++]=oiarr-1;
3577 odata=oint;
3578 break;
3579 case 145: // char*
3580 scop[n1].ident[oident]=mpstk[(i1+1)*2+1];
3581 scop[n1].kind[oident]=8; // string*
3582 scop[n1].offs[oident++]=oint;
3583 scop[n1].mem.bint[oint++]=ostring;
3584 scop[n1].mem.bint[oint++]=0;
3585 break;
3586 default:
3587 break;
3588 }
3589 }
3590 if(decltype==45){ /* propagate stack in the case of char */
3591 for(i=i1;i<j1-1;i++){
3592 mpstk[i*2]=mpstk[(i+1)*2];
3593 mpstk[i*2+1]=mpstk[(i+1)*2+1];
3594 }
3595 nmp=j1-1;
3596 }
3597 break;
3598 /* case 92: ps */
3599 /* case 93: ps */
3600 case 95:
3601 switch(decltype){
3602 case 45: // char - to be worked later
3603 if(m1==0){
3604 if(mpstk[2*(i1+1)]==11){ /* only second entry */
3605 scop[n1].nchar++;
3606 }
3607 else{ /* both entries */
3608 scop[n1].nchar+=2;
3609 }
3610 mpstk[2*nmp]=11; /* indicate the pocess finished */
3611 mpstk[2*nmp+1]=0; /* does not mean anything */
3612 nmp++;
3613 }
3614 else{
3615 if(mpstk[2*(i1+1)]!=11) /* the first entry */
3616 scop[n1].mem.bchar[ochar++]=chcon[mpstk[(i1+1)*2+1]];
3617 scop[n1].mem.bchar[ochar++]=chcon[mpstk[(i1+2)*2+1]];
3618 mpstk[2*nmp]=11; /* indicate the pocess finished */
3619 mpstk[2*nmp+1]=0; /* does not mean anything */
3620 nmp++;
3621 }
3622 break;
3623 case 51: // double
3624 if(m1==0){
3625 if(mpstk[2*(i1+1)]==11){ /* only second entry */
3626 odata++;
3627 }
3628 else{ /* both entries */
3629 odata+=2;
3630 }
3631 if(scop[n1].ndouble<odata) scop[n1].ndouble=odata;
3632 mpstk[2*nmp]=11; /* indicate the pocess finished */
3633 mpstk[2*nmp+1]=0; /* does not mean anything */
3634 nmp++;
3635 }
3636 else{
3637 if(mpstk[2*(i1+1)]!=11){ /* the first entry */
3638 if(mpstk[(i1+1)*2]==5)
3639 scop[n1].mem.bdouble[odata++]=flcon[mpstk[(i1+1)*2+1]];
3640 else if(mpstk[(i1+1)*2]==8)
3641 scop[n1].mem.bdouble[odata++]=dstk[mpstk[(i1+1)*2+1]];
3642 else if(mpstk[(i1+2)*2]==6)
3643 scop[n1].mem.bdouble[odata++]=mpstk[(i1+1)*2+1];
3644 if(odouble<odata) scop[n1].mem.bdarr[odarr-1].size[0]++;
3645 }
3646 if(mpstk[(i1+2)*2]==5)
3647 scop[n1].mem.bdouble[odata++]=flcon[mpstk[(i1+2)*2+1]];
3648 else if(mpstk[(i1+2)*2]==8)
3649 scop[n1].mem.bdouble[odata++]=dstk[mpstk[(i1+2)*2+1]];
3650 else if(mpstk[(i1+2)*2]==6)
3651 scop[n1].mem.bdouble[odata++]=mpstk[(i1+2)*2+1];
3652 if(odouble<odata) scop[n1].mem.bdarr[odarr-1].size[0]++;
3653 if(odouble<odata) odouble=odata;
3654 mpstk[2*nmp]=11; /* indicate the pocess finished */
3655 mpstk[2*nmp+1]=0; /* does not mean anything */
3656 nmp++;
3657 }
3658 break;
3659 case 62: // int
3660 if(m1==0){
3661 if(mpstk[2*(i1+1)]==11){ /* only second entry */
3662 odata++;
3663 }
3664 else{ /* both entries */
3665 odata+=2;
3666 }
3667 if(scop[n1].nint<odata) scop[n1].nint=odata;
3668 mpstk[2*nmp]=11; /* indicate the pocess finished */
3669 mpstk[2*nmp+1]=0; /* does not mean anything */
3670 nmp++;
3671 }
3672 else{
3673 if(mpstk[2*(i1+1)]!=11){ /* the first entry */
3674 scop[n1].mem.bint[odata++]=mpstk[(i1+1)*2+1];
3675 if(oint<odata) scop[n1].mem.biarr[oiarr-1].size[0]++;
3676 }
3677 scop[n1].mem.bint[odata++]=mpstk[(i1+2)*2+1];
3678 if(oint<odata) scop[n1].mem.biarr[oiarr-1].size[0]++;
3679 if(oint<odata) oint=odata;
3680 mpstk[2*nmp]=11; /* indicate the pocess finished */
3681 mpstk[2*nmp+1]=0; /* does not mean anything */
3682 nmp++;
3683 }
3684 break;
3685 case 145: // char*
3686 if(m1==0){
3687 if(mpstk[2*(i1+1)]!=11){ /* the first entry */
3688 for(j=0;;j++) if(inpchar[chcon[mpstk[(i1+1)*2+1]]+j]=='\0') break;
3689 j++;
3690 scop[n1].nchar+=j;
3691 scop[n1].nstring++;
3692 }
3693 for(j=0;;j++) if(inpchar[chcon[mpstk[(i1+2)*2+1]]+j]=='\0') break;
3694 j++;
3695 scop[n1].nchar+=j;
3696 scop[n1].nstring++;
3697 mpstk[2*nmp]=11; /* indicate the pocess finished */
3698 mpstk[2*nmp+1]=0; /* does not mean anything */
3699 nmp++;
3700 }
3701 else{
3702 if(mpstk[2*(i1+1)]!=11){ /* the first entry */
3703 for(j=0;;j++) if(inpchar[chcon[mpstk[(i1+1)*2+1]]+j]=='\0') break;
3704 j++;
3705 scop[n1].mem.bstring[ostring]=ochar;
3706 for(k=0;k<j;k++)
3707 scop[n1].mem.bchar[ochar++]=inpchar[chcon[mpstk[(i1+1)*2+1]]+k];
3708 scop[n1].mem.mstring[ostring]=j;
3709 scop[n1].mem.nstring[ostring++]=j;
3710 scop[n1].mem.bint[oint-1]++;
3711 }
3712 for(j=0;;j++) if(inpchar[chcon[mpstk[(i1+2)*2+1]]+j]=='\0') break;
3713 j++;
3714 scop[n1].mem.bstring[ostring]=ochar;
3715 for(k=0;k<j;k++)
3716 scop[n1].mem.bchar[ochar++]=inpchar[chcon[mpstk[(i1+2)*2+1]]+k];
3717 scop[n1].mem.mstring[ostring]=j;
3718 scop[n1].mem.nstring[ostring++]=j;
3719 scop[n1].mem.bint[oint-1]++;
3720 mpstk[2*nmp]=11; /* indicate the pocess finished */
3721 mpstk[2*nmp+1]=0; /* does not mean anything */
3722 nmp++;
3723 }
3724 break;
3725 default:
3726 break;
3727 }
3728 break;
3729
3730 case 185: /* + */
3731 case 186: /* - */
3732 case 188: /* multiply */
3733 case 189: /* divide */
3734 case 190: /* % */
3735 i=1; /* int */
3736 switch(mpstk[(j1-3)*2]){
3737 case 5: /* flcon */
3738 d1=flcon[mpstk[(j1-3)*2+1]];
3739 i=0;
3740 break;
3741 case 6: /* int const */
3742 d1=mpstk[(j1-3)*2+1];
3743 break;
3744 case 8: /* double dstk[] */
3745 d1=dstk[mpstk[(j1-3)*2+1]];
3746 i=0;
3747 break;
3748 default:
3749 contype(16);
3750 exit(0);
3751 }
3752 switch(mpstk[(j1-1)*2]){
3753 case 5: /* flcon */
3754 d2=flcon[mpstk[(j1-1)*2+1]];
3755 i=0;
3756 break;
3757 case 6: /* int const */
3758 d2=mpstk[(j1-1)*2+1];
3759 break;
3760 case 8: /* double dstk[] */
3761 d2=dstk[mpstk[(j1-1)*2+1]];
3762 i=0;
3763 break;
3764 default:
3765 contype(17);
3766 exit(0);
3767 }
3768 switch(mpstk[(j1-2)*2+1]){
3769 case 4: // %
3770 i3=d1;
3771 i4=d2;
3772 i3%=i4;
3773 d1=i3;
3774 break;
3775 case 11: /* multiply */
3776 d1*=d2;
3777 break;
3778 case 13: /* plus */
3779 d1+=d2;
3780 break;
3781 case 17: /* minus */
3782 d1-=d2;
3783 break;
3784 case 23: /* divide */
3785 if(d2==0.){
3786 contype(18);
3787 printf("Divide by 0\n");
3788 exit(0);
3789 }
3790 d1/=d2;
3791 break;
3792 }
3793 if(i==1){
3794 i=d1;
3795 mpstk[nmp*2]=6; // integer
3796 mpstk[nmp*2+1]=i;
3797 }
3798 else{
3799 mpstk[nmp*2]=8;
3800 for(j=nmp-1;j>0;j--) if(mpstk[j*2]==8) break;
3801 if(j==0) mpstk[nmp*2+1]=0;
3802 else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
3803 dstk[mpstk[nmp*2+1]]=d1;
3804 }
3805 nmp++;
3806 break;
3807
3808 default:
3809 for(i=i1;i<j1-1;i++){
3810 mpstk[i*2]=mpstk[(i+1)*2];
3811 mpstk[i*2+1]=mpstk[(i+1)*2+1];
3812 }
3813 nmp=j1-1;
3814 break;
3815 }
3816 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
3817 if(i>0){
3818 k1=mpstk[2*i+1];
3819 if(mpstk[2*i]==1||mpstk[2*i]==2){
3820 for(;i<nmp;i++){
3821 mpstk[2*i]=mpstk[2*(i+1)];
3822 mpstk[2*i+1]=mpstk[2*(i+1)+1];
3823 }
3824 nmp--;
3825 }
3826 } /* if(i>0) */
3827 else k1=0;
3828 } /* else */
3829 } /* while(test--) */
3830 } /* if(k1!=-1) */
3831 if(m1==0){
3832 // printf("scop[%i].nchar=%i\n",n1,scop[n1].nchar);
3833 // printf("scop[%i].nstring=%i\n",n1,scop[n1].nstring);
3834 // printf("scop[%i].ndouble=%i\n",n1,scop[n1].ndouble);
3835 // printf("scop[%i].nint=%i\n",n1,scop[n1].nint);
3836 // printf("scop[%i].ndarr=%i\n",n1,scop[n1].ndarr);
3837 // printf("scop[%i].niarr=%i\n",n1,scop[n1].niarr);
3838 // printf("scop[%i].nident=%i\n",n1,scop[n1].nident);
3839
3840 if(scop[n1].nchar==0) scop[n1].mem.bchar=NULL;
3841 else scop[n1].mem.bchar=(char *)malloc(sizeof(char)*scop[n1].nchar);
3842 if(scop[n1].nstring==0){
3843 scop[n1].mem.bstring=NULL;
3844 scop[n1].mem.nstring=NULL;
3845 scop[n1].mem.mstring=NULL;
3846 }
3847 else{
3848 scop[n1].mem.bstring=(int *)malloc(sizeof(int)*scop[n1].nstring);
3849 scop[n1].mem.nstring=(int *)malloc(sizeof(int)*scop[n1].nstring);
3850 scop[n1].mem.mstring=(int *)malloc(sizeof(int)*scop[n1].nstring);
3851 }
3852 if(scop[n1].ndouble==0) scop[n1].mem.bdouble=NULL;
3853 else scop[n1].mem.bdouble=(double *)malloc(sizeof(double)*scop[n1].ndouble);
3854 if(scop[n1].nint==0) scop[n1].mem.bint=NULL;
3855 else scop[n1].mem.bint=(int *)malloc(sizeof(int)*scop[n1].nint);
3856 if(scop[n1].ndarr==0) scop[n1].mem.bdarr=NULL;
3857 else scop[n1].mem.bdarr=(darray *)malloc(sizeof(darray)*scop[n1].ndarr);
3858 if(scop[n1].niarr==0) scop[n1].mem.biarr=NULL;
3859 else scop[n1].mem.biarr=(iarray *)malloc(sizeof(iarray)*scop[n1].niarr);
3860 if(scop[n1].nident==0){
3861 scop[n1].ident=NULL;
3862 scop[n1].kind=NULL;
3863 scop[n1].offs=NULL;
3864 }
3865 else{
3866 scop[n1].ident=(int *)malloc(sizeof(int)*scop[n1].nident);
3867 scop[n1].kind=(int *)malloc(sizeof(int)*scop[n1].nident);
3868 scop[n1].offs=(int *)malloc(sizeof(int)*scop[n1].nident);
3869 }
3870 if(n1==0){
3871 mem[0]=&scop[n1].mem; /* global */
3872 mem[0]->scop=0;
3873 }
3874 if(strcmp(scop[n1].name,"main")==0){
3875 mem[1]=&scop[n1].mem; /* main */
3876 mem[1]->scop=n1;
3877 nmem=2; /* memory stack pointer */
3878 }
3879 } /* if(m1==0) */
3880 } /* for(m1=0;m1<2;m1++) */
3881 } /* for(n1=0;n1<nscop;n1++) */
3882 mem[0]->schar=0;
3883 mem[0]->sstring=0;
3884 mem[0]->sdouble=0;
3885 mem[0]->sint=0;
3886 mem[0]->sdarr=0;
3887 mem[0]->siarr=0;
3888 mem[1]->schar=scop[0].nchar;
3889 mem[1]->sstring=scop[0].nstring;
3890 mem[1]->sdouble=scop[0].ndouble;
3891 mem[1]->sint=scop[0].nint;
3892 mem[1]->sdarr=scop[0].ndarr;
3893 mem[1]->siarr=scop[0].niarr;
3894
3895 if(tweak&2){
3896 for(i=0;i<nscop;i++){
3897 printf("%s\n",scop[i].name);
3898 printf("nchar=%i nstring=%i ndouble=%i nint=%i ndarr=%i niarr=%i\n",scop[i].nchar,
3899 scop[i].nstring,scop[i].ndouble,scop[i].nint,scop[i].ndarr,scop[i].niarr);
3900 for(j=0;j<scop[i].nident;j++){
3901 k=scop[i].ident[j];
3902 printf("ident=%i kind=%i offs=%i %s\n",k,scop[i].kind[j],scop[i].offs[j],&inpchar[ident[k]]);
3903 }
3904 }
3905 exit(0);
3906 }
3907 fstatus=0;
3908 if(strcmp(rquri,"/cgi-bin/p077")==0){
3909 if(hckie==NULL){
3910 fnames[0]='\0';
3911 fstatus=1;
3912 }
3913 else{
3914 strcpy(fnames,&hckie[5]);
3915 fstatus=2;
3916 }
3917 }
3918 note021
3919 mpstk[0]=0; /* 0:return node 1:sibling node 2:loop control node */
3920 mpstk[1]=0; /* terminate marker */
3921 nmp=1; /* the next stack entry begins at nmp*2 */
3922 for(i=0;i<nscop;i++)
3923 if(strcmp(scop[i].name,"main")==0) break;
3924 k1=scop[i].nodeexec; /* start parse tree node - ***EXECUTION STARTS HERE*** */
3925 test=MAXNOD;
3926 for(i=0;i<10;i++) jmpcnt[i]=0;
3927 njp=0; /* jump control depth */
3928 jmpcnt[njp]=0; /* jump control */
3929 while(test--){
3930 if(tweak&1){
3931 if(outcnt>=outfrom){
3932 printf("%03i*%i* %i ",outcnt%1000,k1,nmp);
3933 if(nmp>19){
3934 j=(nmp-15)/5;
3935 j*=5;
3936 }
3937 else j=0;
3938 for(i=j;i<nmp;i++) printf("%i-%i ",mpstk[2*i],mpstk[2*i+1]);
3939 printf("\n");
3940 }
3941 if(outcnt>=outto) exit(0);
3942 outcnt++;
3943 }
3944 if(k1==0) break; /* terminate execution */
3945 if(nmp>(MAXNMP/2-3)){
3946 contype(19);
3947 printf("max stack depth\n");
3948 exit(0);
3949 }
3950 j=0; /* can be new control */
3951 if(k1<0){
3952 k1=-k1;
3953 j=1;
3954 }
3955 for(i=nmp-1;i>0;i--){
3956 if(mpstk[2*i]==10&&mpstk[2*(i-1)+1]!=k1) i=1;
3957 else if(mpstk[2*i]==0&&mpstk[2*i+1]!=k1) i=1;
3958 else if(mpstk[2*i]==0&&mpstk[2*i+1]==k1) break;
3959 }
3960 if(i==0){ /* not return pass */note022
3961 switch (produc[k1]){ /* intercept controls */
3962 case 117: /* case */
3963 if(sibli[k1]!=0){
3964 mpstk[2*nmp]=1;
3965 mpstk[2*nmp+1]=sibli[k1];
3966 nmp++;
3967 }
3968 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==2&&produc[-mpstk[2*i+1]]==129) break;
3969 if(attri1[sibli[child[k1]]]==mpstk[2*(i-1)+1]) k1=sibli[sibli[sibli[child[k1]]]];
3970 else{
3971 for(j=nmp-2;j>i;j--) if(mpstk[2*j]==1&&(produc[mpstk[2*j+1]]==117||produc[mpstk[2*j+1]]==118)) break;
3972 if(j==i){
3973 k1=mpstk[2*i+1];
3974 jmpcnt[njp]=6;
3975 nmp=i+1;
3976 }
3977 else{
3978 k1=mpstk[2*j+1];
3979 nmp=j;
3980 }
3981 }
3982 break;
3983 case 118: /* default */
3984 k1=sibli[sibli[child[k1]]];
3985 break;
3986 case 127: /* if statement */
3987 case 128:
3988 if(j==0) jmpcnt[++njp]=0; /* new entry */
3989 switch(jmpcnt[njp]){
3990 case 0: /* first entry */
3991 mpstk[nmp*2]=2;
3992 mpstk[nmp*2+1]=-k1;
3993 nmp++;
3994 k1=sibli[sibli[child[k1]]]; /* conditional statement */
3995 jmpcnt[njp]=1;
3996 break;
3997 case 1: /* branch test */
3998 nmp--;
3999 if(mpstk[(nmp)*2+1]){ /* execute */
4000 mpstk[nmp*2]=2;
4001 mpstk[nmp*2+1]=-k1;
4002 nmp++;
4003 k1=sibli[sibli[child[k1]]];
4004 k1=sibli[sibli[k1]];
4005 jmpcnt[njp]=2;
4006 }
4007 else if(produc[k1]==127){
4008 if((j=sibli[k1])!=0){
4009 k1=j;
4010 }
4011 else{ /* no child, no sibling */
4012 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
4013 k1=mpstk[2*i+1];
4014 if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
4015 for(;i<nmp;i++){
4016 mpstk[i*2]=mpstk[(i+1)*2];
4017 mpstk[i*2+1]=mpstk[(i+1)*2+1];
4018 }
4019 nmp--;
4020 }
4021 } /* else */
4022 jmpcnt[njp]=0;
4023 njp--;
4024 }
4025 else{
4026 mpstk[nmp*2]=2;
4027 mpstk[nmp*2+1]=-k1;
4028 nmp++;
4029 k1=sibli[sibli[child[k1]]];
4030 k1=sibli[sibli[k1]];
4031 k1=sibli[sibli[k1]];
4032 jmpcnt[njp]=2;
4033 }
4034 break;
4035 case 2: /* get out */
4036 if((j=sibli[k1])!=0){
4037 k1=j;
4038 }
4039 else{ /* no child, no sibling */
4040 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
4041 k1=mpstk[2*i+1];
4042 if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
4043 for(;i<nmp;i++){
4044 mpstk[i*2]=mpstk[(i+1)*2];
4045 mpstk[i*2+1]=mpstk[(i+1)*2+1];
4046 }
4047 nmp--;
4048 }
4049 } /* else */
4050 jmpcnt[njp]=0;
4051 njp--;
4052 break;
4053 default:
4054 k1=0;
4055 break;
4056 }
4057 break;
4058 case 129: /* switch */
4059 if(j==0){
4060 njp++;
4061 jmpcnt[njp]=0;
4062 }
4063 switch(jmpcnt[njp]){
4064 case 0:
4065 mpstk[nmp*2]=2;
4066 mpstk[nmp*2+1]=-k1;
4067 nmp++;
4068 k1=sibli[sibli[child[k1]]]; /* switch arg */
4069 jmpcnt[njp]=1;
4070 break;
4071 case 1:
4072 mpstk[nmp*2]=2;
4073 mpstk[nmp*2+1]=-k1;
4074 nmp++;
4075 k1=sibli[sibli[sibli[child[k1]]]]; /* switch arg */
4076 jmpcnt[njp]=6;
4077 break;
4078 case 6: /* get out */
4079 if((j=sibli[k1])!=0){
4080 k1=j;
4081 }
4082 else{ /* no child, no sibling */
4083 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
4084 k1=mpstk[2*i+1];
4085 if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
4086 for(;i<nmp;i++){
4087 mpstk[i*2]=mpstk[(i+1)*2];
4088 mpstk[i*2+1]=mpstk[(i+1)*2+1];
4089 }
4090 nmp--;
4091 }
4092 } /* else */
4093 jmpcnt[njp]=0;
4094 njp--;
4095 break;
4096 }
4097 break;
4098 case 130: /* while */
4099 case 131: /* do-while */
4100 if(j==0){
4101 njp++;
4102 jmpcnt[njp]=0;
4103 if(produc[k1]==131) jmpcnt[njp]=2;
4104 }
4105 switch(jmpcnt[njp]){
4106 case 0: /* conditional */
4107 mpstk[nmp*2]=2;
4108 mpstk[nmp*2+1]=-k1;
4109 nmp++;
4110 k1=sibli[sibli[child[k1]]]; /* arg */
4111 if(produc[k1]==131) k1=sibli[sibli[k1]];
4112 jmpcnt[njp]=1;
4113 break;
4114 case 1: /* branch test */
4115 nmp--;
4116 if(mpstk[(nmp)*2+1]){ /* execute */
4117 k1=-k1;
4118 jmpcnt[njp]=2;
4119 }
4120 else{
4121 k1=-k1;
4122 jmpcnt[njp]=6;
4123 }
4124 break;
4125 case 2: /* execute */
4126 mpstk[nmp*2]=2;
4127 mpstk[nmp*2+1]=-k1;
4128 nmp++;
4129 if(produc[k1]==130){
4130 k1=sibli[sibli[child[k1]]];
4131 k1=sibli[sibli[k1]];
4132 }
4133 else k1=sibli[child[k1]];
4134 jmpcnt[njp]=0;
4135 break;
4136 case 6: /* get out */
4137 if((j=sibli[k1])!=0){
4138 k1=j;
4139 }
4140 else{ /* no child, no sibling */
4141 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
4142 k1=mpstk[2*i+1];
4143 if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
4144 for(;i<nmp;i++){
4145 mpstk[i*2]=mpstk[(i+1)*2];
4146 mpstk[i*2+1]=mpstk[(i+1)*2+1];
4147 }
4148 nmp--;
4149 }
4150 } /* else */
4151 jmpcnt[njp]=0;
4152 njp--;
4153 break;
4154 default:
4155 break;
4156 }
4157 break;
4158 case 132: /* 0 0 0 iteration-statement for */
4159 case 133: /* X 0 0 */
4160 case 134: /* 0 X 0 */
4161 case 135: /* 0 0 X */
4162 case 136: /* 0 X X */
4163 case 137: /* X 0 X */
4164 case 138: /* X X 0 */
4165 case 139: /* X X X */
4166 if(j==0){
4167 njp++;
4168 jmpcnt[njp]=0;
4169 if(produc[k1]==133||produc[k1]==137) jmpcnt[njp]=1;
4170 if(produc[k1]==138) jmpcnt[njp]=3;
4171 if(produc[k1]==139) jmpcnt[njp]=4;
4172 }
4173 switch(jmpcnt[njp]){
4174 case 0: /* first entry */
4175 mpstk[nmp*2]=2;
4176 mpstk[nmp*2+1]=-k1;
4177 nmp++;
4178 jmpcnt[njp]=1;
4179 if(produc[k1]==134) jmpcnt[njp]=4;
4180 if(produc[k1]==136) jmpcnt[njp]=4;
4181 k1=sibli[sibli[child[k1]]]; /* first arg */
4182 break;
4183 case 1: /* relational condition */
4184 if(mpstk[(nmp-1)*2]==6||mpstk[(nmp-1)*2]==8) nmp--; // erase post-increment
4185 mpstk[nmp*2]=2;
4186 mpstk[nmp*2+1]=-k1;
4187 nmp++;
4188 if(produc[k1]==133||produc[k1]==137){
4189 k1=sibli[sibli[child[k1]]];
4190 k1=sibli[k1]; /* second arg */
4191 }
4192 else{
4193 k1=sibli[sibli[child[k1]]];
4194 k1=sibli[sibli[k1]]; /* second arg */
4195 }
4196 jmpcnt[njp]=2;
4197 break;
4198 case 2: /* branch test */
4199 nmp--;
4200 if(mpstk[(nmp)*2+1]){ /* execute */
4201 k1=-k1;
4202 jmpcnt[njp]=4;
4203 }
4204 else{
4205 k1=-k1;
4206 jmpcnt[njp]=6;
4207 }
4208 break;
4209 case 3: /* increment loop index */
4210 mpstk[nmp*2]=2;
4211 mpstk[nmp*2+1]=-k1;
4212 nmp++;
4213 jmpcnt[njp]=1;
4214 if(produc[k1]==134||produc[k1]==138) jmpcnt[njp]=4;
4215 if(produc[k1]==138){
4216 k1=sibli[sibli[child[k1]]];
4217 k1=sibli[sibli[k1]];
4218 }
4219 else if(produc[k1]==133||produc[k1]==134){
4220 k1=sibli[sibli[child[k1]]];
4221 k1=sibli[sibli[k1]];
4222 k1=sibli[k1];
4223 }
4224 else{
4225 k1=sibli[sibli[child[k1]]];
4226 k1=sibli[sibli[k1]];
4227 k1=sibli[sibli[k1]];
4228 }
4229 break;
4230 case 4: /* execute */
4231 mpstk[nmp*2]=2;
4232 mpstk[nmp*2+1]=-k1;
4233 nmp++;
4234 jmpcnt[njp]=3;
4235 if(produc[k1]==135||produc[k1]==137) jmpcnt[njp]=1;
4236 if(produc[k1]==136||produc[k1]==139) jmpcnt[njp]=4;
4237 if(produc[k1]==139){
4238 k1=sibli[sibli[child[k1]]];
4239 k1=sibli[sibli[k1]];
4240 k1=sibli[k1];
4241 }
4242 else if(produc[k1]==136||produc[k1]==137||produc[k1]==138){
4243 k1=sibli[sibli[child[k1]]];
4244 k1=sibli[sibli[k1]];
4245 k1=sibli[sibli[k1]];
4246 }
4247 else if(produc[k1]==133||produc[k1]==134||produc[k1]==135){
4248 k1=sibli[sibli[child[k1]]];
4249 k1=sibli[sibli[k1]];
4250 k1=sibli[sibli[k1]];
4251 k1=sibli[k1];
4252 }
4253 else{
4254 k1=sibli[sibli[child[k1]]];
4255 k1=sibli[sibli[k1]];
4256 k1=sibli[sibli[k1]];
4257 k1=sibli[sibli[k1]];
4258 }
4259 break;
4260 case 6:
4261 if((j=sibli[k1])!=0){
4262 k1=j;
4263 }
4264 else{ /* no child, no sibling */
4265 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
4266 k1=mpstk[2*i+1];
4267 if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
4268 for(;i<nmp;i++){
4269 mpstk[i*2]=mpstk[(i+1)*2];
4270 mpstk[i*2+1]=mpstk[(i+1)*2+1];
4271 }
4272 nmp--;
4273 }
4274 } /* else */
4275 jmpcnt[njp]=0;
4276 njp--;
4277 break;
4278 default:
4279 k1=0;
4280 break;
4281 }
4282 break;
4283 case 161: /* question and colon */
4284 if(j==0) jmpcnt[++njp]=0; /* new entry */
4285 switch(jmpcnt[njp]){
4286 case 0: /* first entry */
4287 mpstk[nmp*2]=2;
4288 mpstk[nmp*2+1]=-k1;
4289 nmp++;
4290 k1=child[k1]; /* conditional statement */
4291 jmpcnt[njp]=1;
4292 break;
4293 case 1: /* branch test */
4294 nmp--;
4295 if(mpstk[(nmp)*2+1]){ /* first choice */
4296 mpstk[nmp*2]=2;
4297 mpstk[nmp*2+1]=-k1;
4298 nmp++;
4299 k1=sibli[sibli[child[k1]]];
4300 jmpcnt[njp]=2;
4301 }
4302 else{ /* second choice */
4303 mpstk[nmp*2]=2;
4304 mpstk[nmp*2+1]=-k1;
4305 nmp++;
4306 k1=sibli[sibli[child[k1]]];
4307 k1=sibli[sibli[k1]];
4308 jmpcnt[njp]=2;
4309 }
4310 break;
4311 case 2: /* get out */
4312 if((j=sibli[k1])!=0){
4313 k1=j;
4314 }
4315 else{ /* no child, no sibling */
4316 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
4317 k1=mpstk[2*i+1];
4318 if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
4319 for(;i<nmp;i++){
4320 mpstk[i*2]=mpstk[(i+1)*2];
4321 mpstk[i*2+1]=mpstk[(i+1)*2+1];
4322 }
4323 nmp--;
4324 }
4325 } /* else */
4326 jmpcnt[njp]=0;
4327 njp--;
4328 break;
4329 default:
4330 k1=0;
4331 break;
4332 }
4333 break;
4334 default:
4335 i=1;
4336 break;
4337 }
4338 if(i==1){ /* not controls */
4339 if((i=child[k1])!=0){
4340 if((j=sibli[k1])!=0){
4341 mpstk[nmp*2]=1; /* sibling node */
4342 mpstk[nmp*2+1]=j; /* jmp node */
4343 nmp++;
4344 mpstk[nmp*2]=0; /* return node */
4345 mpstk[nmp*2+1]=k1; /* jmp node */
4346 nmp++;
4347 }
4348 else{
4349 mpstk[nmp*2]=0; /* return node */
4350 mpstk[nmp*2+1]=k1; /* jmp node */
4351 nmp++;
4352 }
4353 k1=i; /* jump to child */
4354 } /* if((i=child[k1])!=0) */
4355 else{ /* no child */
4356 j=gsymbol[k1];
4357 if(j==45||j==51||j==62){ /* char double int */
4358 mpstk[nmp*2]=3; /* gsymbol */
4359 mpstk[nmp*2+1]=j; /* type */
4360 nmp++;
4361 }
4362 /* != % * + - / < << <= == > >= >> ^ | */
4363 else if(j==3||j==4||j==11||j==13||j==17||j==23||j==27||j==28||j==30||j==32||j==33||j==34||j==35||j==40||j==82){
4364 mpstk[nmp*2]=3; /* gsymbol */
4365 mpstk[nmp*2+1]=j; /* binary operator */
4366 nmp++;
4367 }
4368 /* ! & ~ */
4369 else if(j==2||j==6||j==86){
4370 mpstk[nmp*2]=3; /* gsymbol */
4371 mpstk[nmp*2+1]=j; /* unary operator */
4372 nmp++;
4373 }
4374 /* %= &= *= += -= /= <<= = >>= ^= |= */
4375 else if(j==5||j==8||j==12||j==15||j==19||j==24||j==29||j==31||j==36||j==41||j==83){
4376 mpstk[nmp*2]=3; /* gsymbol */
4377 mpstk[nmp*2+1]=j; /* assignment operator */
4378 nmp++;
4379 }
4380 else if(j==46){ /* character constant */
4381 mpstk[nmp*2]=4; /* attri1[node] */
4382 mpstk[nmp*2+1]=attri1[k1]; /* offset into chcon could this be changed to offset into inpchar? */
4383 nmp++;
4384 }
4385 if(j==57){ /* floating constant */
4386 mpstk[nmp*2]=5; /* double */
4387 mpstk[nmp*2+1]=attri1[k1]; /* index into flcon[] */
4388 nmp++;
4389 }
4390 if(j==60){ /* identifier */
4391 k=attri1[k1]; /* attribute for k1 */
4392 /* convert identifier to mpstk information */
4393 m1=nmem-1;
4394 l=mem[m1]->scop;
4395 for(l1=1;l1<scop[l].nident;l1++) if(scop[l].ident[l1]==k) break; /* excl fname */
4396 if(l1==scop[l].nident){
4397 m1=0;
4398 l=mem[m1]->scop;
4399 for(l1=0;l1<scop[l].nident;l1++) if(scop[l].ident[l1]==k) break;
4400 if(l1==scop[l].nident) l1=-1;
4401 }
4402 if(l1==-1){ // function name
4403 mpstk[nmp*2]=7;
4404 mpstk[nmp*2+1]=k;
4405 }
4406 else{
4407 mpstk[nmp*2]=scop[l].kind[l1];
4408 if(m1==0) mpstk[nmp*2]+=40; /* global */
4409 else mpstk[nmp*2]+=20; /* current scope */
4410 mpstk[nmp*2+1]=scop[l].offs[l1];
4411 if(mpstk[nmp*2]==29||mpstk[nmp*2]==30||mpstk[nmp*2]==31||mpstk[nmp*2]==32)
4412 mpstk[nmp*2+1]=mem[m1]->bint[scop[l].offs[l1]]; /* to be expanded some time */
4413 }
4414 nmp++;
4415 }
4416 if(j==63){ /* integer constant */
4417 mpstk[nmp*2]=6; /* int */
4418 mpstk[nmp*2+1]=attri1[k1]; /* integer value */
4419 nmp++;
4420 }
4421 if((j=sibli[k1])!=0){
4422 if((gsymbol[j]==10||gsymbol[j]==37||gsymbol[j]==25)&&mpstk[(nmp-2)*2]==2){ /* ) ? : and flow control */
4423 k1=mpstk[(nmp-2)*2+1];
4424 if(mpstk[(nmp-1)*2]==6){
4425 mpstk[(nmp-2)*2]=mpstk[(nmp-1)*2];
4426 mpstk[(nmp-2)*2+1]=mpstk[(nmp-1)*2+1];
4427 }
4428 else if(mpstk[(nmp-1)*2]==24){
4429 mpstk[(nmp-2)*2]=6;
4430 mpstk[(nmp-2)*2+1]=mem[nmem-1]->bint[mpstk[(nmp-1)*2+1]];
4431 }
4432 else{
4433 mpstk[(nmp-2)*2]=mpstk[(nmp-1)*2];
4434 mpstk[(nmp-2)*2+1]=mpstk[(nmp-1)*2+1];
4435 // contype(20);
4436 // exit(0);
4437 }
4438 nmp--;
4439 }
4440 else k1=j;
4441 }
4442 else{ /* no child, no sibling */
4443 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
4444 k1=mpstk[2*i+1];
4445 if(mpstk[2*i]==1||mpstk[2*i]==2){ /* if sibling delete that node */
4446 for(;i<nmp;i++){
4447 mpstk[i*2]=mpstk[(i+1)*2];
4448 mpstk[i*2+1]=mpstk[(i+1)*2+1];
4449 }
4450 nmp--;
4451 }
4452 } /* else */
4453 } /* else */
4454 } /* if(i==1) not jump control */
4455 } /* if(i==0) */
4456 else{ /* return pass - reduction by non-terminal */note023
4457 /* this return node is on the i-th stack. */
4458 /* as the data is no more needed, nmp is tentatively */
4459 /* set to i. */
4460 /* if data propagated on to this pass are to be accessed, */
4461 /* old stack pointer which is saved in j1 may be used. */
4462 /* data to be propagated should be put into stack and */
4463 /* increment nmp as needed */
4464 i1=i; /* remember pointer for return node k1 */
4465 j1=nmp; /* remember stack pointer */
4466 nmp=i; /* new stack pointer */
4467 switch (produc[k1]){
4468 case 1: /* */
4469 break;
4470 case 2: /* */
4471 break;
4472 case 3: /* */
4473 break;
4474 case 4: /* */
4475 break;
4476 case 5: /* */
4477 break;
4478 case 6: /* */
4479 break;
4480 case 7: /* */
4481 break;
4482 case 9: /* */
4483 break;
4484 case 11: /* */
4485 break;
4486 case 12: /* */
4487 break;
4488 case 14: /* */
4489 break;
4490 case 15: /* */
4491 break;
4492 case 16: /* */
4493 break;
4494 case 17: /* */
4495 break;
4496 case 18: /* */
4497 break;
4498 case 19: /* */
4499 break;
4500 case 20: /* */
4501 break;
4502 case 34: /* */
4503 break;
4504 case 35: /* */
4505 break;
4506 case 39: /* */
4507 break;
4508 case 40: /* */
4509 break;
4510 case 41: /* */
4511 break;
4512 case 44: /* */
4513 break;
4514 case 45: /* */
4515 break;
4516 case 46: /* */
4517 break;
4518 case 48: /* */
4519 break;
4520 case 50: /* */
4521 break;
4522 case 51: /* */
4523 break;
4524 case 52: /* */
4525 break;
4526 case 53: /* */
4527 break;
4528 case 54: /* */
4529 break;
4530 case 55: /* */
4531 break;
4532 case 56: /* */
4533 break;
4534 case 57: /* */
4535 break;
4536 case 58: /* */
4537 break;
4538 case 59: /* */
4539 break;
4540 case 60: /* */
4541 break;
4542 case 61: /* */
4543 break;
4544 case 62: /* */
4545 break;
4546 case 63: /* */
4547 break;
4548 case 64: /* */
4549 break;
4550 case 66: /* */
4551 break;
4552 case 67: /* */
4553 break;
4554 case 68: /* */
4555 break;
4556 case 70: /* */
4557 break;
4558 case 71: /* */
4559 break;
4560 case 74: /* */
4561 break;
4562 case 75: /* */
4563 break;
4564 case 76: /* */
4565 break;
4566 case 78: /* */
4567 break;
4568 case 79: /* */
4569 break;
4570 case 80: /* */
4571 break;
4572 case 81: /* */
4573 break;
4574 case 82: /* */
4575 break;
4576 case 83: /* */
4577 break;
4578 case 84: /* */
4579 break;
4580 case 87: /* */
4581 break;
4582 case 88: /* */
4583 break;
4584 case 90: /* */
4585 break;
4586 case 91: /* */
4587 break;
4588 case 93: /* */
4589 break;
4590 case 94: /* */
4591 break;
4592 case 96: /* */
4593 break;
4594 case 97: /* */
4595 break;
4596 case 98: /* */
4597 break;
4598 case 99: /* */
4599 break;
4600 case 100: /* */
4601 break;
4602 case 101: /* */
4603 break;
4604 case 102: /* */
4605 break;
4606 case 103: /* */
4607 break;
4608 case 104: /* */
4609 break;
4610 case 105: /* */
4611 break;
4612 case 106: /* */
4613 break;
4614 case 107: /* */
4615 break;
4616 case 108: /* */
4617 break;
4618 case 109: /* */
4619 break;
4620 case 110: /* */
4621 break;
4622 case 111: /* */
4623 break;
4624 case 112: /* */
4625 break;
4626 case 113: /* */
4627 break;
4628 case 114: /* */
4629 break;
4630 case 115: /* */
4631 break;
4632 case 116: /* */
4633 break;
4634 case 117: /* */
4635 break;
4636 case 118: /* */
4637 break;
4638 case 119: /* */
4639 break;
4640 case 121: /* */
4641 break;
4642 case 122: /* */
4643 break;
4644 case 123: /* */
4645 break;
4646 case 124: /* */
4647 break;
4648 case 125: /* */
4649 break;
4650 case 126: /* */
4651 break;
4652 case 140: /* */
4653 break;
4654 case 141: /* continue */
4655 for(i=nmp-1;i>0;i--){
4656 if(mpstk[2*i]==2){
4657 if(produc[-mpstk[2*i+1]]>128) break;
4658 njp--;
4659 }
4660 }
4661 j=produc[-mpstk[2*i+1]];
4662 if(j==130||j==131||j==135||j==137) jmpcnt[njp]=1;
4663 else if(j==132||j==133||j==134||j==138) jmpcnt[njp]=3;
4664 else jmpcnt[njp]=4; /* 136,139 */
4665 nmp=i+1;
4666 break;
4667 case 142: /* break */
4668 for(i=nmp-1;i>0;i--){
4669 if(mpstk[2*i]==2){
4670 if(produc[-mpstk[2*i+1]]>128) break;
4671 njp--;
4672 }
4673 }
4674 jmpcnt[njp]=6;
4675 nmp=i+1;
4676 // printf("njp=%i mpstk[2*i]=%i mpstk[2*i+1]=%i\n",njp,mpstk[2*i],mpstk[2*i+1]);
4677 break;
4678 case 143: /* */
4679 if(scop[mem[nmem-1]->scop].kind[0]==3){ /* return double */
4680 switch(mpstk[(i1+1)*2]){
4681 case 5: /* flcon */
4682 mem[nmem-1]->bdouble[0]=flcon[mpstk[(i1+1)*2+1]];
4683 break;
4684 case 8: /* double dstk[] */
4685 mem[nmem-1]->bdouble[0]=dstk[mpstk[(i1+1)*2+1]];
4686 break;
4687 case 23: /* current memory.bdouble */
4688 mem[nmem-1]->bdouble[0]=mem[nmem-1]->bdouble[mpstk[(i1+1)*2+1]];
4689 break;
4690 case 43: /* global memory.bdouble */
4691 mem[nmem-1]->bdouble[0]=mem[0]->bdouble[mpstk[(i1+1)*2+1]];
4692 break;
4693 default:
4694 contype(21);
4695 exit(0);
4696 }
4697 }
4698 else{ /* return int */
4699 switch(mpstk[(i1+1)*2]){
4700 case 6: /* int const */
4701 mem[nmem-1]->bint[1]=mpstk[(i1+1)*2+1]; /* bint[0] is number of parameters */
4702 break;
4703 case 24: /* current memory.bint */
4704 mem[nmem-1]->bint[1]=mem[nmem-1]->bint[mpstk[(i1+1)*2+1]];
4705 break;
4706 case 44: /* global memory.bint */
4707 for(i=nmem-1;i>=0;i--)
4708 if(mem[i]->sint<=mpstk[(i1+1)*2+1]) break;
4709 mem[nmem-1]->bint[1]=mem[i]->bint[mpstk[(i1+1)*2+1]-mem[i]->sint];
4710 break;
4711 default:
4712 contype(22);
4713 exit(0);
4714 }
4715 }
4716 for(i=nmp-1;i>0;i--){
4717 if(mpstk[2*i]==2) njp--;
4718 if(mpstk[2*i]==10) break;
4719 }
4720 nmp=i+1;
4721 break;
4722 case 144: /* return */
4723 mem[nmem-1]->bint[1]=0;
4724 for(i=nmp-1;i>0;i--){
4725 if(mpstk[2*i]==2) njp--;
4726 if(mpstk[2*i]==10) break;
4727 }
4728 nmp=i+1;
4729 break;
4730 case 145: /* */
4731 break;
4732 case 146: /* */
4733 break;
4734 case 147: /* */
4735 break;
4736 case 148: /* */note024
4737 switch(mpstk[(i1+3)*2]){ /* right-hand side */
4738 case 5: /* flcon */
4739 i5=0; // double
4740 d1=flcon[mpstk[(i1+3)*2+1]];
4741 break;
4742 case 6: /* int const */
4743 i5=1; // int
4744 i6=mpstk[(i1+3)*2+1];
4745 d1=i6;
4746 break;
4747 case 8: /* double dstk[] */
4748 i5=0;
4749 d1=dstk[mpstk[(i1+3)*2+1]];
4750 break;
4751 case 23: /* current memory.bdouble */
4752 i5=0;
4753 d1=mem[nmem-1]->bdouble[mpstk[(i1+3)*2+1]];
4754 break;
4755 case 24: /* current memory.bint */
4756 i5=1;
4757 i6=mem[nmem-1]->bint[mpstk[(i1+3)*2+1]];
4758 d1=i6;
4759 break;
4760 case 29:
4761 case 43: /* global memory.bdouble */
4762 for(i=nmem-1;i>=0;i--)
4763 if(mem[i]->sdouble<=mpstk[(i1+3)*2+1]) break;
4764 i5=0;
4765 d1=mem[i]->bdouble[mpstk[(i1+3)*2+1]-mem[i]->sdouble];
4766 break;
4767 case 30:
4768 case 44: /* global memory.bint */
4769 for(i=nmem-1;i>=0;i--)
4770 if(mem[i]->sint<=mpstk[(i1+3)*2+1]) break;
4771 i5=1;
4772 i6=mem[i]->bint[mpstk[(i1+3)*2+1]-mem[i]->sint];
4773 d1=i6;
4774 break;
4775 /* to be added later */
4776 default:
4777 contype(23);
4778 exit(0);
4779 }
4780 if(mpstk[(i1+2)*2+1]==31){ /* = */
4781 switch(mpstk[(i1+1)*2]){ /* left-hand side */
4782 case 8: /* double dstk[] */
4783 dstk[mpstk[(i1+1)*2+1]]=d1;
4784 break;
4785 case 23: /* current memory.bdouble */
4786 mem[nmem-1]->bdouble[mpstk[(i1+1)*2+1]]=d1;
4787 break;
4788 case 24: /* current memory.bint */
4789 if(i5==1) mem[nmem-1]->bint[mpstk[(i1+1)*2+1]]=i6;
4790 else mem[nmem-1]->bint[mpstk[(i1+1)*2+1]]=d1;
4791 break;
4792 case 29: /* universal memory.bdouble */
4793 for(i=nmem-1;i>=0;i--)
4794 if(mem[i]->sdouble<=mpstk[(i1+1)*2+1]) break;
4795 mem[i]->bdouble[mpstk[(i1+1)*2+1]-mem[i]->sdouble]=d1;
4796 break;
4797 case 43: /* global memory.bdouble */
4798 for(i=nmem-1;i>0;i--) if(mem[i]->sdouble<=mpstk[(i1+1)*2+1]) break;
4799 mem[i]->bdouble[mpstk[(i1+1)*2+1]-mem[i]->sdouble]=d1;
4800 break;
4801 case 30:
4802 case 44: /* global memory.bint */
4803 for(i=nmem-1;i>=0;i--)
4804 if(mem[i]->sint<=mpstk[(i1+1)*2+1]) break;
4805 if(i5==1) mem[i]->bint[mpstk[(i1+1)*2+1]-mem[i]->sint]=i6;
4806 else mem[i]->bint[mpstk[(i1+1)*2+1]-mem[i]->sint]=d1;
4807 break;
4808 /* to be added later */
4809 default:
4810 contype(24);
4811 exit(0);
4812 }
4813 if(i5==1){
4814 mpstk[nmp*2]=6; // integer
4815 mpstk[nmp*2+1]=i6;
4816 }
4817 else{
4818 mpstk[nmp*2]=8;
4819 for(j=nmp-1;j>0;j--) if(mpstk[j*2]==8) break;
4820 if(j==0) mpstk[nmp*2+1]=0;
4821 else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
4822 dstk[mpstk[nmp*2+1]]=d1;
4823 }
4824 nmp++;
4825 }
4826 else {
4827 switch(mpstk[(i1+1)*2]){ /* left-hand side */
4828 case 8: /* double dstk[] */
4829 i7=0;
4830 d2=dstk[mpstk[(i1+1)*2+1]];
4831 break;
4832 case 23: /* current memory.bdouble */
4833 i7=0;
4834 d2=mem[nmem-1]->bdouble[mpstk[(i1+1)*2+1]];
4835 break;
4836 case 24: /* current memory.bint */
4837 i7=1;
4838 i8=mem[nmem-1]->bint[mpstk[(i1+1)*2+1]];
4839 d2=i8;
4840 break;
4841 case 43: /* global memory.bdouble */
4842 i7=0;
4843 for(i=nmem-1;i>0;i--) if(mem[i]->sdouble<=mpstk[(i1+1)*2+1]) break;
4844 d2=mem[i]->bdouble[mpstk[(i1+1)*2+1]-mem[i]->sdouble];
4845 break;
4846 case 30:
4847 case 44: /* global memory.bint */
4848 i7=1;
4849 for(i=nmem-1;i>=0;i--)
4850 if(mem[i]->sint<=mpstk[(i1+1)*2+1]) break;
4851 i8=mem[i]->bint[mpstk[(i1+1)*2+1]-mem[i]->sint];
4852 d2=i8;
4853 break;
4854 /* to be added later */
4855 default:
4856 contype(25);
4857 exit(0);
4858 }
4859 switch(mpstk[(i1+2)*2+1]){ /* operator */
4860 case 12: // *=
4861 if(i7==0) d2*=d1;
4862 else{
4863 if(i5==1){
4864 i8*=i6;
4865 d2=i8;
4866 }
4867 else d2*=d1;
4868 }
4869 break;
4870 case 24: // /=
4871 if(i7==0) d2/=d1;
4872 else{
4873 if(i5==1){
4874 i8/=i6;
4875 d2=i8;
4876 }
4877 else d2/=d1;
4878 }
4879 break;
4880 case 5: // %=
4881 i8%=i6;
4882 d2=i8;
4883 break;
4884 case 15: // +=
4885 if(i7==0) d2+=d1;
4886 else{
4887 if(i5==1){
4888 i8+=i6;
4889 d2=i8;
4890 }
4891 else d2+=d1;
4892 }
4893 break;
4894 case 19: // -=
4895 if(i7==0) d2-=d1;
4896 else{
4897 if(i5==1){
4898 i8-=i6;
4899 d2=i8;
4900 }
4901 else d2-=d1;
4902 }
4903 break;
4904 case 29: // <<=
4905 i8<<=i6;
4906 d2=i8;
4907 break;
4908 case 36: // >>=
4909 i8>>=i6;
4910 d2=i8;
4911 break;
4912 case 8: // &=
4913 i8&=i6;
4914 d2=i8;
4915 break;
4916 case 41: // ^=
4917 i8^=i6;
4918 d2=i8;
4919 break;
4920 case 83: // |=
4921 i8|=i6;
4922 d2=i8;
4923 break;
4924 }
4925 switch(mpstk[(i1+1)*2]){ /* left-hand side */
4926 case 8: /* double dstk[] */
4927 dstk[mpstk[(i1+1)*2+1]]=d2;
4928 i5=0;
4929 break;
4930 case 23: /* current memory.bdouble */
4931 mem[nmem-1]->bdouble[mpstk[(i1+1)*2+1]]=d2;
4932 i5=0;
4933 break;
4934 case 24: /* current memory.bint */
4935 if(i7==1) mem[nmem-1]->bint[mpstk[(j1-3)*2+1]]=i8;
4936 else mem[nmem-1]->bint[mpstk[(j1-3)*2+1]]=d2;
4937 i5=1;
4938 break;
4939 case 43: /* global memory.bdouble */
4940 for(i=nmem-1;i>0;i--) if(mem[i]->sdouble<=mpstk[(i1+1)*2+1]) break;
4941 mem[i]->bdouble[mpstk[(i1+1)*2+1]-mem[i]->sdouble]=d2;
4942 i5=0;
4943 break;
4944 case 30:
4945 case 44: /* global memory.bint */
4946 for(i=nmem-1;i>=0;i--)
4947 if(mem[i]->sint<=mpstk[(j1-3)*2+1]) break;
4948 if(i7==1) mem[i]->bint[mpstk[(j1-3)*2+1]-mem[i]->sint]=i8;
4949 else mem[i]->bint[mpstk[(j1-3)*2+1]-mem[i]->sint]=d2;
4950 i5=1;
4951 break;
4952 /* to be added later */
4953 }
4954 if(i5==1){
4955 mpstk[nmp*2]=6; // integer
4956 mpstk[nmp*2+1]=d2;
4957 }
4958 else{
4959 mpstk[nmp*2]=8;
4960 for(j=nmp-1;j>0;j--) if(mpstk[j*2]==8) break;
4961 if(j==0) mpstk[nmp*2+1]=0;
4962 else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
4963 dstk[mpstk[nmp*2+1]]=d2;
4964 }
4965 nmp++;
4966 }
4967 break;
4968 /* case 161:
4969 if(mpstk[(i1+1)*2+1]){
4970 mpstk[nmp*2]=mpstk[(i1+2)*2];
4971 mpstk[nmp*2+1]=mpstk[(i1+2)*2+1];
4972 }
4973 else{
4974 mpstk[nmp*2]=mpstk[(i1+3)*2];
4975 mpstk[nmp*2+1]=mpstk[(i1+3)*2+1];
4976 }
4977 nmp++;
4978 break;*/
4979 case 164: /* || */
4980 case 166: /* && */
4981 switch(mpstk[(i1+1)*2]){
4982 case 6: /* int const */
4983 i3=mpstk[(i1+1)*2+1];
4984 break;
4985 case 24: /* current memory.bint */
4986 i3=mem[nmem-1]->bint[mpstk[(i1+1)*2+1]];
4987 break;
4988 default:
4989 contype(26);
4990 exit(0);
4991 }
4992 switch(mpstk[(i1+2)*2]){
4993 case 6: /* int const */
4994 i4=mpstk[(i1+2)*2+1];
4995 break;
4996 case 24: /* current memory.bint */
4997 i4=mem[nmem-1]->bint[mpstk[(i1+2)*2+1]];
4998 break;
4999 default:
5000 contype(27);
5001 exit(0);
5002 }
5003 mpstk[nmp*2]=6;
5004 if(produc[k1]==164) mpstk[nmp*2+1]=i3||i4;
5005 else mpstk[nmp*2+1]=i3&&i4;
5006 nmp++;
5007 break;
5008 case 168: /* | */
5009 case 170: /* ^ */
5010 case 172: /* & */
5011 case 182: /* << */
5012 case 183: /* >> */
5013 switch(mpstk[(i1+1)*2]){
5014 case 6: /* int const */
5015 i3=mpstk[(i1+1)*2+1];
5016 break;
5017 case 24: /* current memory.bint */
5018 i3=mem[nmem-1]->bint[mpstk[(i1+1)*2+1]];
5019 break;
5020 default:
5021 contype(26);
5022 exit(0);
5023 }
5024 switch(mpstk[(i1+3)*2]){
5025 case 6: /* int const */
5026 i4=mpstk[(i1+3)*2+1];
5027 break;
5028 case 24: /* current memory.bint */
5029 i4=mem[nmem-1]->bint[mpstk[(i1+3)*2+1]];
5030 break;
5031 default:
5032 contype(27);
5033 exit(0);
5034 }
5035 switch(mpstk[(i1+2)*2+1]){
5036 case 82:
5037 i3|=i4;
5038 break;
5039 case 40:
5040 i3^=i4;
5041 break;
5042 case 6:
5043 i3&=i4;
5044 break;
5045 case 28:
5046 i3<<=i4;
5047 break;
5048 case 35:
5049 i3>>=i4;
5050 break;
5051 }
5052 mpstk[nmp*2]=6;
5053 mpstk[nmp*2+1]=i3;
5054 nmp++;
5055 break;
5056 case 174: /* == */
5057 case 175: /* != */
5058 case 177: /* < */
5059 case 178: /* > */
5060 case 179: /* <= */
5061 case 180: /* >= */note025
5062 switch(mpstk[(j1-3)*2]){
5063 case 5: /* flcon */
5064 d1=flcon[mpstk[(j1-3)*2+1]];
5065 break;
5066 case 6: /* int const */
5067 d1=mpstk[(j1-3)*2+1];
5068 break;
5069 case 8: /* double dstk[] */
5070 d1=dstk[mpstk[(j1-3)*2+1]];
5071 break;
5072 case 23: /* current memory.bdouble */
5073 d1=mem[nmem-1]->bdouble[mpstk[(j1-3)*2+1]];
5074 break;
5075 case 24: /* current memory.bint */
5076 d1=mem[nmem-1]->bint[mpstk[(j1-3)*2+1]];
5077 break;
5078 case 43: /* global memory.bdouble */
5079 d1=mem[0]->bdouble[mpstk[(j1-3)*2+1]];
5080 break;
5081 case 44: /* global memory.bint */
5082 for(i=nmem-1;i>=0;i--)
5083 if(mem[i]->sint<=mpstk[(j1-3)*2+1]) break;
5084 d1=mem[i]->bint[mpstk[(j1-3)*2+1]-mem[i]->sint];
5085 break;
5086 /* to be added later */
5087 default:
5088 contype(28);
5089 exit(0);
5090 }
5091 switch(mpstk[(j1-1)*2]){
5092 case 5: /* flcon */
5093 d2=flcon[mpstk[(j1-1)*2+1]];
5094 break;
5095 case 6: /* int const */
5096 d2=mpstk[(j1-1)*2+1];
5097 break;
5098 case 8: /* double dstk[] */
5099 d2=dstk[mpstk[(j1-1)*2+1]];
5100 break;
5101 case 23: /* current memory.bdouble */
5102 d2=mem[nmem-1]->bdouble[mpstk[(j1-1)*2+1]];
5103 break;
5104 case 24: /* current memory.bint */
5105 d2=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
5106 break;
5107 case 43: /* global memory.bdouble */
5108 d2=mem[0]->bdouble[mpstk[(j1-1)*2+1]];
5109 break;
5110 case 44: /* global memory.bint */
5111 for(i=nmem-1;i>=0;i--)
5112 if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
5113 d2=mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint];
5114 break;
5115 /* to be added later */
5116 default:
5117 contype(29);
5118 printf("%i\n",mpstk[(j1-1)*2]);
5119 exit(0);
5120 }
5121 i=0; /* FALSE */
5122 switch(mpstk[(j1-2)*2+1]){
5123 case 3:
5124 if(d1!=d2) i=1;
5125 break;
5126 case 27:
5127 if(d1<d2) i=1;
5128 break;
5129 case 30:
5130 if(d1<=d2) i=1;
5131 break;
5132 case 32:
5133 if(d1==d2) i=1;
5134 break;
5135 case 33:
5136 if(d1>d2) i=1;
5137 break;
5138 case 34:
5139 if(d1>=d2) i=1;
5140 break;
5141 }
5142 mpstk[nmp*2]=6;
5143 mpstk[nmp*2+1]=i;
5144 nmp++;
5145 break;
5146 /* moved after 172
5147 case 182: <<
5148 break;
5149 case 183: >>
5150 break;
5151 */
5152 case 185: /* + */
5153 case 186: /* - */
5154 case 188: /* multiply */
5155 case 189: /* divide */
5156 case 190: /* % */note026
5157 i=1; /* int */
5158 switch(mpstk[(j1-3)*2]){
5159 case 5: /* flcon */
5160 d1=flcon[mpstk[(j1-3)*2+1]];
5161 i=0;
5162 break;
5163 case 6: /* int const */
5164 d1=mpstk[(j1-3)*2+1];
5165 break;
5166 case 8: /* double dstk[] */
5167 d1=dstk[mpstk[(j1-3)*2+1]];
5168 i=0;
5169 break;
5170 case 23: /* current memory.bdouble */
5171 d1=mem[nmem-1]->bdouble[mpstk[(j1-3)*2+1]];
5172 i=0;
5173 break;
5174 case 24: /* current memory.bint */
5175 d1=mem[nmem-1]->bint[mpstk[(j1-3)*2+1]];
5176 break;
5177 case 29:
5178 case 43: /* global memory.bdouble */
5179 for(j=nmem-1;j>=0;j--)
5180 if(mem[j]->sdouble<=mpstk[(j1-3)*2+1]) break;
5181 d1=mem[j]->bdouble[mpstk[(j1-3)*2+1]-mem[j]->sdouble];
5182 i=0;
5183 break;
5184 case 30:
5185 case 44: /* global memory.bint */
5186 for(j=nmem-1;j>=0;j--)
5187 if(mem[j]->sint<=mpstk[(j1-3)*2+1]) break;
5188 d1=mem[j]->bint[mpstk[(j1-3)*2+1]-mem[j]->sint];
5189 break;
5190 /* to be added later */
5191 default:
5192 contype(30);
5193 exit(0);
5194 }
5195 switch(mpstk[(j1-1)*2]){
5196 case 5: /* flcon */
5197 d2=flcon[mpstk[(j1-1)*2+1]];
5198 i=0;
5199 break;
5200 case 6: /* int const */
5201 d2=mpstk[(j1-1)*2+1];
5202 break;
5203 case 8: /* double dstk[] */
5204 d2=dstk[mpstk[(j1-1)*2+1]];
5205 i=0;
5206 break;
5207 case 23: /* current memory.bdouble */
5208 d2=mem[nmem-1]->bdouble[mpstk[(j1-1)*2+1]];
5209 i=0;
5210 break;
5211 case 24: /* current memory.bint */
5212 d2=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
5213 break;
5214 case 29:
5215 case 43: /* global memory.bdouble */
5216 for(j=nmem-1;j>=0;j--)
5217 if(mem[j]->sdouble<=mpstk[(j1-1)*2+1]) break;
5218 d2=mem[j]->bdouble[mpstk[(j1-1)*2+1]-mem[j]->sdouble];
5219 i=0;
5220 break;
5221 case 30:
5222 case 44: /* global memory.bint */
5223 for(j=nmem-1;j>=0;j--)
5224 if(mem[j]->sint<=mpstk[(j1-1)*2+1]) break;
5225 d2=mem[j]->bint[mpstk[(j1-1)*2+1]-mem[j]->sint];
5226 break;
5227 /* to be added later */
5228 default:
5229 contype(31);
5230 exit(0);
5231 }
5232 switch(mpstk[(j1-2)*2+1]){
5233 case 4: // %
5234 i3=d1;
5235 i4=d2;
5236 i3%=i4;
5237 d1=i3;
5238 break;
5239 case 11: /* multiply */
5240 d1*=d2;
5241 break;
5242 case 13: /* plus */
5243 d1+=d2;
5244 break;
5245 case 17: /* minus */
5246 d1-=d2;
5247 break;
5248 case 23: /* divide */
5249 if(d2==0.){
5250 contype(32);
5251 printf("Divide by 0\n");
5252 exit(0);
5253 }
5254 d1/=d2;
5255 break;
5256 }
5257 if(i==1){
5258 i=d1;
5259 mpstk[nmp*2]=6; // integer
5260 mpstk[nmp*2+1]=i;
5261 }
5262 else{
5263 mpstk[nmp*2]=8;
5264 for(j=nmp-1;j>0;j--) if(mpstk[j*2]==8) break;
5265 if(j==0) mpstk[nmp*2+1]=0;
5266 else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
5267 dstk[mpstk[nmp*2+1]]=d1;
5268 }
5269 nmp++;
5270 break;
5271 case 192: /* type cast */
5272 if(mpstk[(i1+1)*2+1]==51){ /* double */
5273 if(mpstk[(i1+2)*2]==6){
5274 mpstk[nmp*2]=8;
5275 for(j=nmp-1;j>0;j--) if(mpstk[j*2]==8) break;
5276 if(j==0) mpstk[nmp*2+1]=0;
5277 else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
5278 dstk[mpstk[nmp*2+1]]=mpstk[(i1+2)*2+1];
5279 }
5280 else{
5281 contype(33);
5282 exit(0);
5283 }
5284 }
5285 else{ /* int */
5286 if(mpstk[(i1+2)*2]==5)
5287 i3=flcon[mpstk[(i1+2)*2+1]];
5288 else if(mpstk[(i1+2)*2]==8)
5289 i3=dstk[mpstk[(i1+2)*2+1]];
5290 else{
5291 contype(33);
5292 exit(0);
5293 }
5294 mpstk[nmp*2]=6;
5295 mpstk[nmp*2+1]=i3;
5296 }
5297 nmp++;
5298 break;
5299 case 194: /* pre-increment */
5300 case 195: /* pre-decrement */
5301 switch(mpstk[(j1-1)*2]){
5302 case 24: /* current memory.bint */
5303 i3=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
5304 break;
5305 case 44: /* global memory.bint */
5306 for(i=nmem-1;i>=0;i--)
5307 if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
5308 i3=mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint];
5309 break;
5310 /* to be added later */
5311 default:
5312 contype(33);
5313 exit(0);
5314 }
5315 if(produc[k1]==194) i3++;
5316 else i3--;
5317 switch(mpstk[(j1-1)*2]){
5318 case 24: /* current memory.bint */
5319 mem[nmem-1]->bint[mpstk[(j1-1)*2+1]]=i3;
5320 break;
5321 case 44: /* global memory.bint */
5322 for(i=nmem-1;i>=0;i--)
5323 if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
5324 mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint]=i3;
5325 break;
5326 /* to be added later */
5327 }
5328 mpstk[2*nmp]=6;
5329 mpstk[2*nmp+1]=i3;
5330 nmp++;
5331 break;
5332 case 196: /* unary processing */note027
5333 if(mpstk[(j1-2)*2+1]==6){ /* & */
5334 switch(mpstk[(j1-1)*2]){
5335 case 23: /* current memory.bdouble */
5336 mpstk[nmp*2]=29;
5337 mpstk[nmp*2+1]=mpstk[(j1-1)*2+1]+mem[nmem-1]->sdouble;
5338 nmp++;
5339 break;
5340 case 24: /* current memory.bint */
5341 mpstk[nmp*2]=30;
5342 mpstk[nmp*2+1]=mpstk[(j1-1)*2+1]+mem[nmem-1]->sint;
5343 nmp++;
5344 break;
5345 case 43: /* global memory.bdouble */
5346 mpstk[nmp*2]=29;
5347 mpstk[nmp*2+1]=mpstk[(j1-1)*2+1];
5348 nmp++;
5349 break;
5350 case 44: /* global memory.bint */
5351 mpstk[nmp*2]=30;
5352 mpstk[nmp*2+1]=mpstk[(j1-1)*2+1];
5353 nmp++;
5354 break;
5355 }
5356 }
5357 else if(mpstk[(j1-2)*2+1]==11){ /* * */
5358 switch(mpstk[(j1-1)*2]){
5359 case 29: /* global memory.bdouble */
5360 mpstk[nmp*2]=43;
5361 mpstk[nmp*2+1]=mpstk[(j1-1)*2+1];
5362 nmp++;
5363 break;
5364 case 30: /* global memory.bint */
5365 mpstk[nmp*2]=44;
5366 mpstk[nmp*2+1]=mpstk[(j1-1)*2+1];
5367 nmp++;
5368 break;
5369 }
5370 }
5371 else{
5372 i=1; // int
5373 switch(mpstk[(j1-1)*2]){
5374 case 6: /* int */
5375 i6=mpstk[(j1-1)*2+1];
5376 d2=i6;
5377 break;
5378 case 5: /* double flcon[] */
5379 d2=flcon[mpstk[(j1-1)*2+1]];
5380 i=0;
5381 break;
5382 case 8: /* double dstk[] */
5383 d2=dstk[mpstk[(j1-1)*2+1]];
5384 i=0;
5385 break;
5386 case 23: /* current memory.bdouble */
5387 d2=mem[nmem-1]->bdouble[mpstk[(j1-1)*2+1]];
5388 i=0;
5389 break;
5390 case 24: /* current memory.bint */
5391 i6=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
5392 d2=i6;
5393 break;
5394 case 43: /* global memory.bdouble */
5395 for(i=nmem-1;i>0;i--) if(mem[i]->sdouble<=mpstk[(j1-1)*2+1]) break;
5396 d2=mem[i]->bdouble[mpstk[(j1-1)*2+1]-mem[i]->sdouble];
5397 i=0;
5398 break;
5399 case 44: /* global memory.bint */
5400 for(i=nmem-1;i>=0;i--)
5401 if(mem[i]->sint<=mpstk[(j1-1)*2+1]) break;
5402 i6=mem[i]->bint[mpstk[(j1-1)*2+1]-mem[i]->sint];
5403 d2=i6;
5404 break;
5405 }
5406 switch(mpstk[(j1-2)*2+1]){
5407 case 13: /* + */
5408 if(i==1) i5=i6;
5409 else d1=d2;
5410 break;
5411 case 17: /* - */
5412 if(i==1) i5=-i6;
5413 else d1=-d2;
5414 break;
5415 case 2: /* ! */
5416 if(i==1){
5417 if(i6==0) i5=1;
5418 else i5=0;
5419 }
5420 else{
5421 j=d2;
5422 if(j==0) j=1;
5423 else j=0;
5424 d1=j;
5425 }
5426 break;
5427 case 86: /* ~ */
5428 i5=~i6;
5429 break;
5430 }
5431 if(i==1){
5432 mpstk[nmp*2]=6;
5433 mpstk[nmp*2+1]=i5;
5434 }
5435 else{
5436 mpstk[nmp*2]=8;
5437 for(j=nmp-1;j>0;j--) if(mpstk[j*2]==8) break;
5438 if(j==0) mpstk[nmp*2+1]=0;
5439 else mpstk[nmp*2+1]=mpstk[j*2+1]+1;
5440 dstk[mpstk[nmp*2+1]]=d1;
5441 }
5442 nmp++;
5443 }
5444 break;
5445 case 197: /* sizeof */
5446 break;
5447 case 198: /* sizeof */
5448 break;
5449 case 206: /* subscript - to be worked later */
5450 switch(mpstk[(i1+2)*2]){ /* subscript */
5451 case 6: /* value */
5452 i3=mpstk[(i1+2)*2+1];
5453 break;
5454 case 24: /* offset into current memory.bint */
5455 i3=mem[nmem-1]->bint[mpstk[(i1+2)*2+1]];
5456 break;
5457 case 44: /* offset into global memory.bint */
5458 for(i=nmem-1;i>=0;i--)
5459 if(mem[i]->sint<=mpstk[(i1+2)*2+1]) break;
5460 i3=mem[i]->bint[mpstk[(i1+2)*2+1]-mem[i]->sint];
5461 break;
5462 }
5463 switch(mpstk[(i1+1)*2]){ /* identifier */
5464 case 25: /* current memery.bdarr */
5465 i4=mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].offs;
5466 if(mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].dimen==2){
5467 i3*=mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[1];
5468 mpstk[nmp*2]=61;
5469 }
5470 else mpstk[nmp*2]=23;
5471 /*
5472 printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].dimen=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].dimen);
5473 printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[0]=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[0]);
5474 printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[1]=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[1]);
5475 printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[2]=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[2]);
5476 printf("mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[3]=%i\n",mem[nmem-1]->bdarr[mpstk[(i1+1)*2+1]].size[3]);
5477 printf("i3=%ii4=%i\n",i3,i4);
5478 exit(0);*/
5479 break;
5480 case 26: /* current memory.biarr */
5481 i4=mem[nmem-1]->biarr[mpstk[(i1+1)*2+1]].offs;
5482 if(mem[nmem-1]->biarr[mpstk[(i1+1)*2+1]].dimen==2){
5483 i3*=mem[nmem-1]->biarr[mpstk[(i1+1)*2+1]].size[1];
5484 mpstk[nmp*2]=64;
5485 }
5486 else mpstk[nmp*2]=24;
5487 break;
5488 case 28: /* string array */
5489 i4=mem[nmem-1]->bint[mpstk[(i1+1)*2+1]];
5490 mpstk[nmp*2]=22;
5491 break;
5492 case 31: /* universal memory.bdarr */
5493 // i4=mem[nmem-1]->bint[mpstk[(i1+1)*2+1]];
5494 i4=mpstk[(i1+1)*2+1];
5495 for(i=nmem-1;i>=0;i--)
5496 if(mem[i]->sdarr<=i4) break;
5497 if(mem[i]->bdarr[i4-mem[i]->sdarr].dimen==2){
5498 i3*=mem[i]->bdarr[i4-mem[i]->sdarr].size[1];
5499 i3+=mem[i]->bdarr[i4-mem[i]->sdarr].offs+mem[i]->sdouble;
5500 i4=0;
5501 mpstk[nmp*2]=63;
5502 }
5503 else{
5504 i4=mem[i]->bdarr[i4-mem[i]->sdarr].offs+mem[i]->sdouble;
5505 mpstk[nmp*2]=43;
5506 }
5507 break;
5508 case 32: /* biarr */
5509 i4=mpstk[(i1+1)*2+1];
5510 for(i=nmem-1;i>=0;i--)
5511 if(mem[i]->siarr<=i4) break;
5512 if(mem[i]->biarr[i4-mem[i]->sdarr].dimen==2){
5513 i3*=mem[i]->biarr[i4-mem[i]->siarr].size[1];
5514 i3+=mem[i]->biarr[i4-mem[i]->siarr].offs+mem[i]->sint;
5515 i4=0;
5516 mpstk[nmp*2]=66;
5517 }
5518 else{
5519 i4=mem[i]->biarr[i4-mem[i]->siarr].offs+mem[i]->sint;
5520 mpstk[nmp*2]=44;
5521 }
5522 break;
5523 case 45: /* global memory.bdarr */
5524 i4=mem[0]->bdarr[mpstk[(i1+1)*2+1]].offs;
5525 if(mem[0]->bdarr[mpstk[(i1+1)*2+1]].dimen==2){
5526 i3*=mem[0]->bdarr[mpstk[(i1+1)*2+1]].size[1];
5527 mpstk[nmp*2]=62;
5528 }
5529 else mpstk[nmp*2]=43;
5530 break;
5531 case 46: /* global memory.biarr */
5532 i4=mem[0]->biarr[mpstk[(i1+1)*2+1]].offs;
5533 if(mem[0]->biarr[mpstk[(i1+1)*2+1]].dimen==2){
5534 i3*=mem[0]->biarr[mpstk[(i1+1)*2+1]].size[1];
5535 mpstk[nmp*2]=65;
5536 }
5537 else mpstk[nmp*2]=44;
5538 break;
5539 case 48: /* string array */
5540 i4=mem[0]->bint[mpstk[(i1+1)*2+1]];
5541 mpstk[nmp*2]=42;
5542 break;
5543 case 61:
5544 i4=mpstk[(i1+1)*2+1];
5545 mpstk[nmp*2]=23;
5546 break;
5547 case 62:
5548 i4=mpstk[(i1+1)*2+1];
5549 mpstk[nmp*2]=43;
5550 break;
5551 case 63:
5552 i4=mpstk[(i1+1)*2+1];
5553 mpstk[nmp*2]=29;
5554 break;
5555 case 64:
5556 i4=mpstk[(i1+1)*2+1];
5557 mpstk[nmp*2]=24;
5558 break;
5559 case 65:
5560 i4=mpstk[(i1+1)*2+1];
5561 mpstk[nmp*2]=44;
5562 break;
5563 case 66:
5564 i4=mpstk[(i1+1)*2+1];
5565 mpstk[nmp*2]=30;
5566 break;
5567 }
5568 mpstk[nmp*2+1]=i3+i4;
5569 nmp++;
5570 break;
5571 case 207: /* o*/
5572 case 208: /* */note028
5573 if(mpstk[(i1+1)*2]==10){ /* return from user function */
5574 /* enter the returned value to the proper place */
5575 if(scop[mem[nmem-1]->scop].kind[0]==3){ /* return double */
5576 mpstk[2*nmp]=8;
5577 for(j=nmp-1;j>0;j--) if(mpstk[2*j]==8) break;
5578 if(j==0) mpstk[2*nmp+1]=0;
5579 else mpstk[2*nmp+1]=mpstk[2*j+1]+1;
5580 dstk[mpstk[2*nmp+1]]=mem[nmem-1]->bdouble[0];
5581 nmp++;
5582 }
5583 else{ /* return int */
5584 mpstk[2*nmp]=6;
5585 mpstk[2*nmp+1]=mem[nmem-1]->bint[1];
5586 nmp++;
5587 }
5588 nmem--;
5589 k=mem[nmem]->scop;
5590 if(scop[k].nchar!=0) free(mem[nmem]->bchar);
5591 if(scop[k].nstring!=0){
5592 free(mem[nmem]->bstring);
5593 free(mem[nmem]->nstring);
5594 free(mem[nmem]->mstring);
5595 }
5596 if(scop[k].ndouble!=0) free(mem[nmem]->bdouble);
5597 if(scop[k].nint!=0) free(mem[nmem]->bint);
5598 if(scop[k].ndarr!=0) free(mem[nmem]->bdarr);
5599 if(scop[k].niarr!=0) free(mem[nmem]->biarr);
5600 free(mem[nmem]);
5601 } /* if(mpstk[(i1+1)*2]==10) */
5602 else{
5603 if(mpstk[(i1+1)*2]==9){ /* return from user callback function */
5604 cb=1;
5605 }
5606 else{ /* not return from user callback function */
5607 l1=mpstk[(i1+1)*2+1]; /* function name */
5608 l1=ident[l1];
5609 for(i=0;inpchar[l1+i]!='\0';i++) s[i]=inpchar[l1+i];
5610 s[i]='\0';
5611 for(k=1;k<nscop;k++) if(strcmp(s,scop[k].name)==0) break;
5612 }
5613 if(cb==0&&k<nscop){
5614 mem[nmem]=(memory *)malloc(sizeof(memory));
5615 mem[nmem]->scop=k;
5616 if(scop[k].nchar!=0){
5617 mem[nmem]->bchar=(char *)malloc(sizeof(char)*scop[k].nchar);
5618 for(i=0;i<scop[k].nchar;i++) mem[nmem]->bchar[i]=scop[k].mem.bchar[i];
5619 }
5620 if(scop[k].nstring!=0){
5621 mem[nmem]->bstring=(int *)malloc(sizeof(int)*scop[k].nstring);
5622 for(i=0;i<scop[k].nstring;i++) mem[nmem]->bstring[i]=scop[k].mem.bstring[i];
5623 mem[nmem]->nstring=(int *)malloc(sizeof(int)*scop[k].nstring);
5624 for(i=0;i<scop[k].nstring;i++) mem[nmem]->nstring[i]=scop[k].mem.nstring[i];
5625 mem[nmem]->mstring=(int *)malloc(sizeof(int)*scop[k].nstring);
5626 for(i=0;i<scop[k].nstring;i++) mem[nmem]->mstring[i]=scop[k].mem.mstring[i];
5627 }
5628 if(scop[k].ndouble!=0){
5629 mem[nmem]->bdouble=(double *)malloc(sizeof(double)*scop[k].ndouble);
5630 for(i=0;i<scop[k].ndouble;i++) mem[nmem]->bdouble[i]=scop[k].mem.bdouble[i];
5631 }
5632 if(scop[k].nint!=0){
5633 mem[nmem]->bint=(int *)malloc(sizeof(int)*scop[k].nint);
5634 for(i=0;i<scop[k].nint;i++) mem[nmem]->bint[i]=scop[k].mem.bint[i];
5635 }
5636 if(scop[k].ndarr!=0){
5637 mem[nmem]->bdarr=(darray *)malloc(sizeof(darray)*scop[k].ndarr);
5638 for(i=0;i<scop[k].ndarr;i++){
5639 mem[nmem]->bdarr[i].dimen=scop[k].mem.bdarr[i].dimen;
5640 for(j=0;j<scop[k].mem.bdarr[i].dimen;j++)
5641 mem[nmem]->bdarr[i].size[j]=scop[k].mem.bdarr[i].size[j];
5642 mem[nmem]->bdarr[i].dat=&mem[nmem]->bdouble[scop[k].mem.bdarr[i].offs];
5643 mem[nmem]->bdarr[i].offs=scop[k].mem.bdarr[i].offs;
5644 }
5645 }
5646 if(scop[k].niarr!=0){
5647 mem[nmem]->biarr=(iarray *)malloc(sizeof(iarray)*scop[k].niarr);
5648 for(i=0;i<scop[k].niarr;i++){
5649 mem[nmem]->biarr[i].dimen=scop[k].mem.biarr[i].dimen;
5650 for(j=0;j<scop[k].mem.biarr[i].dimen;j++)
5651 mem[nmem]->biarr[i].size[j]=scop[k].mem.biarr[i].size[j];
5652 mem[nmem]->biarr[i].dat=&mem[nmem]->bint[scop[k].mem.biarr[i].offs];
5653 mem[nmem]->biarr[i].offs=scop[k].mem.biarr[i].offs;
5654 }
5655 }
5656 mem[nmem]->schar=mem[nmem-1]->schar+scop[mem[nmem-1]->scop].nchar;
5657 mem[nmem]->sstring=mem[nmem-1]->sstring+scop[mem[nmem-1]->scop].nstring;
5658 mem[nmem]->sdouble=mem[nmem-1]->sdouble+scop[mem[nmem-1]->scop].ndouble;
5659 mem[nmem]->sint=mem[nmem-1]->sint+scop[mem[nmem-1]->scop].nint;
5660 mem[nmem]->sdarr=mem[nmem-1]->sdarr+scop[mem[nmem-1]->scop].ndarr;
5661 mem[nmem]->siarr=mem[nmem-1]->siarr+scop[mem[nmem-1]->scop].niarr;
5662 nmem++;
5663 /* pass the parameters here */
5664 // printf("mem[nmem-1]->bint[0]=%i\n",mem[nmem-1]->bint[0]);
5665 for(i=1;i<mem[nmem-1]->bint[0];i++){
5666 // printf("i=%i scop[k].ident[i]=%i scop[k].kind[i]=%i scop[k].offs[i]=%i\n",
5667 // i,scop[k].ident[i],scop[k].kind[i],scop[k].offs[i]);
5668 switch(scop[k].kind[i]){
5669 case 3: /* double */
5670 switch(mpstk[(i1+i+1)*2]){
5671 case 5: /* floating const */
5672 mem[nmem-1]->bdouble[scop[k].offs[i]]=flcon[mpstk[(i1+i+1)*2+1]];
5673 break;
5674 case 8: /* dstk[] */
5675 mem[nmem-1]->bdouble[scop[k].offs[i]]=dstk[mpstk[(i1+i+1)*2+1]];
5676 break;
5677 case 23:
5678 mem[nmem-1]->bdouble[scop[k].offs[i]]= mem[nmem-2]->bdouble[mpstk[(i1+i+1)*2+1]];
5679 break;
5680 case 43:
5681 for(j=nmem-2;j>0;j--) if(mem[j]->sdouble<=mpstk[(i1+i+1)*2+1]) break;
5682 mem[nmem-1]->bdouble[scop[k].offs[i]]=mem[j]->bdouble[mpstk[(i1+i+1)*2+1]-mem[j]->sdouble];
5683 break;
5684 case 6:
5685 mem[nmem-1]->bdouble[scop[k].offs[i]]=mpstk[(i1+i+1)*2+1];
5686 break;
5687 case 24:
5688 mem[nmem-1]->bdouble[scop[k].offs[i]]= mem[nmem-2]->bint[mpstk[(i1+i+1)*2+1]];
5689 break;
5690 case 44:
5691 for(j=nmem-2;j>0;j--) if(mem[j]->sint<=mpstk[(i1+i+1)*2+1]) break;
5692 mem[nmem-1]->bdouble[scop[k].offs[i]]=mem[j]->bint[mpstk[(i1+i+1)*2+1]-mem[j]->sint];
5693 break;
5694 default:
5695 contype(34);
5696 exit(0);
5697 }
5698 break;
5699 case 4: /* int */
5700 switch(mpstk[(i1+i+1)*2]){
5701 case 6:
5702 mem[nmem-1]->bint[scop[k].offs[i]]=mpstk[(i1+i+1)*2+1];
5703 break;
5704 case 24:
5705 mem[nmem-1]->bint[scop[k].offs[i]]= mem[nmem-2]->bint[mpstk[(i1+i+1)*2+1]];
5706 break;
5707 case 44:
5708 for(j=nmem-2;j>0;j--) if(mem[j]->sint<=mpstk[(i1+i+1)*2+1]) break;
5709 mem[nmem-1]->bint[scop[k].offs[i]]=mem[j]->bint[mpstk[(i1+i+1)*2+1]-mem[j]->sint];
5710 break;
5711 default:
5712 contype(35);
5713 printf("%i %i\n",mpstk[(i1+i+1)*2],mpstk[(i1+i+1)*2+1]);
5714 exit(0);
5715 }
5716 break;
5717 case 7: /* char* */
5718 switch(mpstk[(i1+i+1)*2]){
5719 case 4: /* immediate string */
5720 mem[nmem-1]->bint[scop[k].offs[i]]=mpstk[(i1+i+1)*2+1];
5721 break;
5722 case 22: /* one lower level scope */
5723 mem[nmem-1]->bint[scop[k].offs[i]]= mpstk[(i1+i+1)*2+1]+mem[nmem-2]->sstring+5000;
5724 break;
5725 case 27: /* global subscipt */
5726 l=mem[nmem-2]->bint[mpstk[(i1+i+1)*2+1]];
5727 mem[nmem-1]->bint[scop[k].offs[i]]= l;
5728 break;
5729 case 42: /* global subscipt */
5730 mem[nmem-1]->bint[scop[k].offs[i]]= mpstk[(i1+i+1)*2+1]+5000;
5731 break;
5732 default:
5733 contype(36);
5734 printf("%i\n",mpstk[(i1+i+1)*2]);
5735 exit(0);
5736 }
5737 break;
5738 case 9: /* double * */
5739 mem[nmem-1]->bint[scop[k].offs[i]]=
5740 mpstk[(i1+i+1)*2+1];
5741 break;
5742 case 10: /* int * */
5743 mem[nmem-1]->bint[scop[k].offs[i]]=
5744 mpstk[(i1+i+1)*2+1];
5745 break;
5746 case 11: /* darray * */
5747 switch(mpstk[(i1+i+1)*2]){
5748 case 25: /* darray */
5749 mem[nmem-1]->bint[scop[k].offs[i]]=
5750 mpstk[(i1+i+1)*2+1]+mem[nmem-2]->sdarr;
5751 break;
5752 case 31:
5753 mem[nmem-1]->bint[scop[k].offs[i]]=mpstk[(i1+i+1)*2+1];
5754 // mem[nmem-2]->bint[mpstk[(i1+i+1)*2+1]];
5755 break;
5756 case 45:
5757 mem[nmem-1]->bint[scop[k].offs[i]]=mpstk[(i1+i+1)*2+1];
5758 break;
5759 default:
5760 contype(37);
5761 exit(0);
5762 }
5763 break;
5764 case 12: /* iarray * */
5765 switch(mpstk[(i1+i+1)*2]){
5766 case 26: /* iarray */
5767 mem[nmem-1]->bint[scop[k].offs[i]]=
5768 mpstk[(i1+i+1)*2+1]+mem[nmem-2]->siarr;
5769 break;
5770 case 32:
5771 mem[nmem-1]->bint[scop[k].offs[i]]=mpstk[(i1+i+1)*2+1];
5772 // mem[nmem-2]->bint[mpstk[(i1+i+1)*2+1]];
5773 break;
5774 case 46:
5775 mem[nmem-1]->bint[scop[k].offs[i]]=mpstk[(i1+i+1)*2+1];
5776 // mem[0]->bint[mpstk[(i1+i+1)*2+1]];
5777 break;
5778 default:
5779 contype(38);
5780 exit(0);
5781 }
5782 break;
5783 default:
5784 contype(39);
5785 exit(0);
5786 }
5787 }
5788 mpstk[2*nmp]=0;
5789 mpstk[2*nmp+1]=k1;
5790 nmp++;
5791 mpstk[2*nmp]=10;
5792 mpstk[2*nmp+1]=nmem;
5793 nmp++;
5794 mpstk[2*nmp]=1;
5795 mpstk[2*nmp+1]=scop[k].nodeexec;
5796 nmp++;
5797 } /* if(cb==0&&k<nscop){ */
5798 else{ /* library function & return from callback */
5799 if(cb==0){
5800 for(k=1;k<numfunc;k*=2); /* power of 2 larger than number of functions */
5801 i=k;
5802 j=-1;
5803 for(;k>0;k/=2){
5804 if(j<0) i-=k;
5805 if(j>0) i+=k;
5806 if(i<numfunc) j=strcmp(s,&prs6[prs7[i]]);
5807 else j=-1;
5808 if(j==0) break;
5809 }
5810 if(j!=0){ /* so or ipc */
5811 for(i=0;i<numfunc1;i++) if(strcmp(s,&prs12[prs13[i]])==0) break;
5812 param1[0]=prs15[i]; /* function number */
5813 param1[1]=prs18[i]-prs17[i]; /* number of parameters */
5814 for(j=0;j<param1[1];j++) param1[2+j]=prs16[prs17[i]+j]; /* types */
5815 if(prs14[i]>10000){
5816 for(j=0;j<nso;j++) if((prs14[i]-10000)==prs22[j]) break;
5817 ipc=-prs22[j]; /* so number with minus sign */
5818 }
5819 else{
5820 for(j=0;j<nprog;j++) if(prs14[i]==prs19[j]) break;
5821 ipc=prs20[j]; /* semaphore number */
5822 }
5823 }
5824 else{
5825 param1[0]=prs8[i]; /* function number */
5826 param1[1]=prs11[i]-prs10[i]; /* number of parameters */
5827 for(j=0;j<param1[1];j++) param1[2+j]=prs9[prs10[i]+j]; /* types */
5828 ipc=0;
5829 }
5830 m1=0; /* past-the-end index to char param2[] */
5831 n1=0; /* past-the-end index to double param3[] */
5832 o1=0; /* past-the-end index to int param4[] */
5833 switch(param1[2]){ /* type of return value */
5834 case 2: /* double */
5835 para[1]=(void *)¶m3[n1++];
5836 break;
5837 case 4: /* int */
5838 para[1]=(void *)¶m4[o1++];
5839 break;
5840 default:
5841 contype(40);
5842 printf("return type not supported\n");
5843 exit(0);
5844 break;
5845 }
5846 k=0; /* index to argument */
5847 for(l1=i1+2;l1<j1;l1++){
5848 switch(mpstk[l1*2]){
5849 case 4: /* character constant */
5850 l=mpstk[l1*2+1];
5851 l=chcon[l];
5852 for(i=0;inpchar[l+i]!='\0';i++) param2[m1+i]=inpchar[l+i];
5853 param2[m1+i]='\0';
5854 if(param1[k+3]!=1){
5855 contype(41);
5856 printf("argument type incompatible\n");
5857 printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
5858 exit(0);
5859 }
5860 para[k+2]=(void *)¶m2[m1];
5861 if((param1[0]==0&&ipc==0&&k==0)||(param1[0]==52&&ipc==0&&k==1)){ /* printf - type infered from format */
5862 j=m1; /* scan index */
5863 l=0; /* 0:seek for % or \ 1:seek for f or i 2:seek for n */
5864 if(param1[0]==0) k=4; /* index into param1[] - to be restored later */
5865 else k=5;
5866 while((c=param2[j++])!='\0'){
5867 switch (c){
5868 case '%' :
5869 if(l==1) l=0;
5870 else l=1;
5871 break;
5872 case 'c' :
5873 if(l==1){
5874 param1[k++]=0;
5875 l=0;
5876 }
5877 break;
5878 case 's' :
5879 if(l==1){
5880 param1[k++]=1;
5881 l=0;
5882 }
5883 break;
5884 case 'f' :
5885 case 'g' :
5886 case 'e' :
5887 if(l==1){
5888 param1[k++]=2; /* type double */
5889 l=0;
5890 }
5891 break;
5892 case 'i' :
5893 case 'd' :
5894 case 'x' :
5895 case 'X' :
5896 if(l==1){
5897 param1[k++]=4; /* type int */
5898 l=0;
5899 }
5900 break;
5901 /*
5902 case '\\' :
5903 l=2;
5904 break;
5905 case 'n' :
5906 if(l==2){
5907 for(l=j-1;l<m1+i;l++) param2[l]=param2[l+1];
5908 param2[j-2]='\x0a';
5909 i--;
5910 l=0;
5911 }
5912 break;
5913 */
5914 default:
5915 break;
5916 } /* switch (c) */
5917 } /* while((c=param2[j++])!='\0') */
5918 param1[1]=k-2; /* number of parameters */
5919 if(param1[0]==0) k=0;
5920 else k=1;
5921 } /* if(param1[0]==0) */
5922 m1=m1+i+1;
5923 k++;
5924 break;
5925 case 6: /* int */
5926 if(param1[k+3]!=4){
5927 param3[n1]=mpstk[l1*2+1];
5928 para[k+2]=(void *)¶m3[n1];
5929 n1++;
5930 k++;
5931 }
5932 else{
5933 // printf("o1=%i l1=%i mpstk[l1*2+1]=%i\n",o1,l1,mpstk[l1*2+1]);
5934 param4[o1]=mpstk[l1*2+1];
5935 para[k+2]=(void *)¶m4[o1];
5936 o1++;
5937 k++;
5938 }
5939 break;
5940 case 5: /* double (floating const) flcon[] */
5941 param3[n1]=flcon[mpstk[l1*2+1]];
5942 if(param1[k+3]!=2){
5943 contype(42);
5944 printf("argument type incompatible\n");
5945 printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
5946 exit(0);
5947 }
5948 para[k+2]=(void *)¶m3[n1];
5949 n1++;
5950 k++;
5951 break;
5952 case 7: /* identifier */
5953 if(param1[k+3]!=1){
5954 contype(43);
5955 printf("argument type incompatible in %s\n",s);
5956 printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
5957 exit(0);
5958 }
5959 l=mpstk[l1*2+1]; /* should be callback function name */
5960 l=ident[l];
5961 for(i=0;inpchar[l+i]!='\0';i++) param2[m1+i]=inpchar[l+i];
5962 param2[m1+i]='\0';
5963 para[k+2]=(void *)¶m2[m1];
5964 m1=m1+i+1;
5965 k++;
5966 break;
5967 case 8: /* double dstk[] */
5968 if(param1[k+3]==2){
5969 param3[n1]=dstk[mpstk[l1*2+1]];
5970 para[k+2]=(void *)¶m3[n1];
5971 n1++;
5972 k++;
5973 }
5974 else if(param1[k+3]==4){
5975 param4[o1]=dstk[mpstk[l1*2+1]];
5976 para[k+2]=(void *)¶m4[o1];
5977 o1++;
5978 k++;
5979 }
5980 else{
5981 contype(44);
5982 printf("argument type incompatible\n");
5983 printf("mpstk=%i param1=%i\n",mpstk[l1*2],param1[k+3]);
5984 exit(0);
5985 }
5986 break;
5987 case 22: /* mem[nmem-1]->bstring[mpstk[l1*2+1]] */
5988 if(ipc>0){
5989 param4[o1]=mpstk[l1*2+1]+mem[nmem-1]->sstring;
5990 para[k+2]=(void *)¶m4[o1];
5991 o1++;
5992 k++;
5993 }
5994 else{
5995 para[k+2]=(void *)&mem[nmem-1]->bchar[ mem[nmem-1]->bstring[mpstk[l1*2+1]] ];
5996 k++;
5997 }
5998 break;
5999 case 23: /* mem[nmem-1]->bdouble[mpstk[l1*2+1]] */
6000 param3[n1]=mem[nmem-1]->bdouble[mpstk[l1*2+1]];
6001 para[k+2]=(void *)¶m3[n1];
6002 n1++;
6003 k++;
6004 break;
6005 case 24: /* mem[nmem-1]->bint[mpstk[l1*2+1]] */
6006 if(param1[k+3]!=4){ // double
6007 param3[n1]=mem[nmem-1]->bint[mpstk[l1*2+1]];
6008 para[k+2]=(void *)¶m3[n1];
6009 n1++;
6010 k++;
6011 }
6012 else{
6013 param4[o1]=mem[nmem-1]->bint[mpstk[l1*2+1]];
6014 para[k+2]=(void *)¶m4[o1];
6015 o1++;
6016 k++;
6017 }
6018 break;
6019 case 25: /* mem[nmem-1]->bdarr[mpstk[l1*2+1]] */
6020 if(ipc>0){
6021 param4[o1]=mpstk[l1*2+1]+mem[nmem-1]->sdarr;
6022 para[k+2]=(void *)¶m4[o1];
6023 o1++;
6024 }
6025 else para[k+2]=(void *)&mem[nmem-1]->bdarr[mpstk[l1*2+1]];
6026 k++;
6027 break;
6028 case 26: /* mem[nmem-1]->biarr[mpstk[l1*2+1]] */
6029 if(ipc>0){
6030 param4[o1]=mpstk[l1*2+1]+mem[nmem-1]->siarr;
6031 para[k+2]=(void *)¶m4[o1];
6032 o1++;
6033 }
6034 else para[k+2]=(void *)&mem[nmem-1]->biarr[mpstk[l1*2+1]];
6035 k++;
6036 break;
6037 case 27: /* char* */
6038 l=mem[nmem-1]->bint[mpstk[l1*2+1]];
6039 // printf("\nl=%i\n",l);
6040 //exit(0);
6041 if(l<5000){
6042 l=chcon[l];
6043 for(i=0;inpchar[l+i]!='\0';i++) param2[m1+i]=inpchar[l+i];
6044 }
6045 else{ /* mem[nmem-2]->bstring[mem[nmem-1]->bint[mpstk[l1*2+1]]-5000] */
6046 l=l-5000;
6047 for(j=nmem-1;j>0;j--) if(l>=mem[j]->sstring) break;
6048 l=l-mem[j]->sstring;
6049 for(i=0;mem[j]->bchar[ mem[j]->bstring[l]+i ]!='\0';i++)
6050 param2[m1+i]=mem[j]->bchar[ mem[j]->bstring[l]+i ];
6051 }
6052 param2[m1+i]='\0';
6053 para[k+2]=(void *)¶m2[m1];
6054 m1=m1+i+1;
6055 k++;
6056 //printf("m1=%i i=%i k=%i\n",m1,i,k);
6057 // exit(0);
6058 break;
6059 case 29: /* universal index to double */
6060 if(ipc<=0){
6061 l=mpstk[l1*2+1];
6062 for(j=nmem-1;j>0;j--) if(l>=mem[j]->sdouble) break;
6063 l-=mem[j]->sdouble;
6064 param3[n1]=mem[j]->bdouble[l];
6065 para[k+2]=(void *)¶m3[n1];
6066 n1++;
6067 }
6068 else{
6069 param4[o1]=mpstk[l1*2+1];
6070 para[k+2]=(void *)¶m4[o1];
6071 o1++;
6072 }
6073 k++;
6074 break;
6075 case 30: /* universal index to int */
6076 if(ipc<=0){
6077 l=mpstk[l1*2+1];
6078 for(j=nmem-1;j>0;j--) if(l>=mem[j]->sint) break;
6079 l-=mem[j]->sint;
6080 param4[o1]=mem[j]->bint[l];
6081 }
6082 else param4[o1]=mpstk[l1*2+1];
6083 para[k+2]=(void *)¶m4[o1];
6084 o1++;
6085 k++;
6086 break;
6087 case 31: /* universal index to bdarr */
6088 param4[o1]=mpstk[l1*2+1];
6089 para[k+2]=(void *)¶m4[o1];
6090 o1++;
6091 k++;
6092 break;
6093 case 32: /* universal index to biarr */
6094 param4[o1]=mpstk[l1*2+1];
6095 para[k+2]=(void *)¶m4[o1];
6096 o1++;
6097 k++;
6098 break;
6099 case 42: /* mem[0]->bstring[mpstk[l1*2+1]] */
6100 if(ipc>0){ /* needs check! */
6101 param4[o1]=mpstk[l1*2+1];
6102 para[k+2]=(void *)¶m4[o1];
6103 o1++;
6104 k++;
6105 }
6106 else{
6107 para[k+2]=(void *)&mem[0]->bchar[ mem[0]->bstring[mpstk[l1*2+1]] ];
6108 k++;
6109 }
6110 break;
6111 case 43: /* mem[0]->bdouble[mpstk[l1*2+1]] */
6112 for(i=nmem-1;i>0;i--) if(mem[i]->sdouble<=mpstk[l1*2+1]) break;
6113 param3[n1]=mem[i]->bdouble[mpstk[l1*2+1]-mem[i]->sdouble];
6114 para[k+2]=(void *)¶m3[n1];
6115 n1++;
6116 k++;
6117 break;
6118 case 44: /* mem[0]->bint[mpstk[l1*2+1]] */
6119 for(i=nmem-1;i>=0;i--) if(mem[i]->sint<=mpstk[l1*2+1]) break;
6120 if(param1[k+3]!=4){ // double
6121 param3[n1]=mem[i]->bint[mpstk[l1*2+1]-mem[i]->sint];
6122 para[k+2]=(void *)¶m3[n1];
6123 n1++;
6124 k++;
6125 }
6126 else{
6127 param4[o1]=mem[i]->bint[mpstk[l1*2+1]-mem[i]->sint];
6128 para[k+2]=(void *)¶m4[o1];
6129 o1++;
6130 k++;
6131 }
6132 break;
6133 case 45: /* mem[0]->bdarr[mpstk[l1*2+1]] */
6134 if(ipc>0){
6135 param4[o1]=mpstk[l1*2+1];
6136 para[k+2]=(void *)¶m4[o1];
6137 o1++;
6138 }
6139 else para[k+2]=(void *)&mem[0]->bdarr[mpstk[l1*2+1]];
6140 k++;
6141 break;
6142 case 46: /* mem[0]->biarr[mpstk[l1*2+1]] */
6143 if(ipc>0){
6144 param4[o1]=mpstk[l1*2+1];
6145 para[k+2]=(void *)¶m4[o1];
6146 o1++;
6147 }
6148 else para[k+2]=(void *)&mem[0]->biarr[mpstk[l1*2+1]];
6149 k++;
6150 break;
6151 default:
6152 contype(45);
6153 printf("%i %i\n",l1-i1-2,mpstk[l1*2]);
6154 exit(0);
6155 } /* switch(mpstk[l1*2]) */
6156 } /* for(l1=i1+2;l1<j1;l1++) */
6157 para[0]=(void *)¶m1[0];
6158 param=(void *)¶[0];
6159 } /* if(cb==0){ */
6160 if(cb==1||ipc>0){
6161 if(cb==0){
6162 k=param1[1]; /* number of parameters */
6163 for(j=0;j<k+2;j++) *((int *)shmbuf+j)=param1[j];
6164 ipcpt=(void *)( (void **)((int *)shmbuf+2*k+3)+k+2);
6165 for(j=0;j<k;j++){
6166 *((int*)shmbuf+k+2+j)=(int)((char *)ipcpt-shmbuf);
6167 switch(param1[j+2]){
6168 case 0: /* char */
6169 break;
6170 case 1: /* char* */
6171 //printf("\n%i\n",mpstk[(i1+1+j)*2]);
6172 //printf("%s\n",(char *)((void **)param)[1+j]);
6173 //exit(0);
6174 if(mpstk[(i1+1+j)*2]==4||mpstk[(i1+1+j)*2]==7||mpstk[(i1+1+j)*2]==27){
6175 for(m=0;((char *)((void **)param)[1+j])[m]!='\0';m++);
6176 m++;
6177 *(int *)ipcpt=m;
6178 ipcpt=(void *)((int *)ipcpt+1);
6179 for(n=0;n<m;n++){
6180 *(char *)ipcpt=((char *)((void **)param)[1+j])[n];
6181 ipcpt=(void *)((char *)ipcpt+1);
6182 }
6183 }
6184 else{
6185 //contype(0);
6186 //printf("mpstk[(i1+1+j)*2]=%i nmem=%i *((int **)param)[j+1]=%i\n",mpstk[(i1+1+j)*2],nmem,*((int **)param)[j+1]);
6187 //printf("mem[0]->sstring=%i\n",mem[0]->sstring);
6188 //printf("mem[1]->sstring=%i\n",mem[1]->sstring);
6189 //printf("mem[2]->sstring=%i\n",mem[2]->sstring);
6190 for(l=nmem-1;l>=0;l--)
6191 if(mem[l]->sstring<=*((int **)param)[j+1]) break;
6192 //printf("l=%i\n",l);
6193 //printf("mem[l]->scop=%i\n",mem[l]->scop);
6194 //printf("scop[0].nstring=%i\n",scop[0].nstring);
6195 //printf("scop[1].nstring=%i\n",scop[1].nstring);
6196 //printf("scop[2].nstring=%i\n",scop[2].nstring);
6197
6198 m=mem[l]->mstring[*((int **)param)[j+1]-mem[l]->sstring];
6199 //printf("m=%i\n",m);
6200 //exit(0);
6201 *(int *)ipcpt=m;
6202 ipcpt=(void *)((int *)ipcpt+1);
6203 for(n=0;n<m;n++){
6204 *(char *)ipcpt=mem[l]->bchar[ mem[l]->bstring[*((int **)param)[j+1]-mem[l]->sstring] +n];
6205 ipcpt=(void *)((char *)ipcpt+1);
6206 }
6207 }
6208 break;
6209 case 2: /* double */
6210 *(double *)ipcpt=*((double **)param)[j+1];
6211 ipcpt=(void *)((double *)ipcpt+1);
6212 break;
6213 case 3: /* double* */
6214 for(l=nmem-1;l>=0;l--)
6215 if(mem[l]->sdouble<=*((int **)param)[j+1]) break;
6216 *(double *)ipcpt=mem[l]->bdouble[*((int **)param)[j+1]-mem[l]->sdouble];
6217 ipcpt=(void *)((double *)ipcpt+1);
6218 break;
6219 case 4: /* int */
6220 *(int *)ipcpt=*((int **)param)[j+1];
6221 ipcpt=(void *)((int *)ipcpt+1);
6222 break;
6223 case 5: /* int* */
6224 for(l=nmem-1;l>=0;l--)
6225 if(mem[l]->sint<=*((int **)param)[j+1]) break;
6226 *(int *)ipcpt=mem[l]->bint[*((int **)param)[j+1]-mem[l]->sint];
6227 ipcpt=(void *)((int *)ipcpt +1);
6228 break;
6229 case 6: /* ... */
6230 break;
6231 case 7: /* darray* */
6232 for(l=nmem-1;l>=0;l--)
6233 if(mem[l]->sdarr<=*((int **)param)[j+1]) break;
6234 *(int *)ipcpt=mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].dimen;
6235 ipcpt=(void *)((int *)ipcpt+1);
6236 for(m=0;m<4;m++){
6237 *(int *)ipcpt=mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].size[m];
6238 ipcpt=(void *)((int *)ipcpt+1);
6239 }
6240 ipcpt=(void *)((void **)ipcpt+1); /* double *dat */
6241 n=1;
6242 for(m=0;m<mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].dimen;m++)
6243 n=n*mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].size[m];
6244 *(int *)ipcpt=(int)((char *)((int *)ipcpt+2)-shmbuf); /* offs */
6245 ipcpt=(void *)((int *)ipcpt+1);
6246 *(int *)ipcpt=n;
6247 ipcpt=(void *)((int *)ipcpt+1);
6248 for(m=0;m<n;m++){
6249 *(double *)ipcpt=mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].dat[m];
6250 ipcpt=(void *)((double *)ipcpt+1);
6251 }
6252 break;
6253 case 8: /* iarray* */
6254 for(l=nmem-1;l>=0;l--)
6255 if(mem[l]->siarr<=*((int **)param)[j+1]) break;
6256 *(int *)ipcpt=mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].dimen;
6257 ipcpt=(void *)((int *)ipcpt+1);
6258 for(m=0;m<4;m++){
6259 *(int *)ipcpt=mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].size[m];
6260 ipcpt=(void *)((int *)ipcpt+1);
6261 }
6262 ipcpt=(void *)((void **)ipcpt+1); /* int *dat */
6263 n=1;
6264 for(m=0;m<mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].dimen;m++)
6265 n=n*mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].size[m];
6266 *(int *)ipcpt=(int)((char *)((int *)ipcpt+2)-shmbuf); /* offs */
6267 ipcpt=(void *)((int *)ipcpt+1);
6268 *(int *)ipcpt=n;
6269 ipcpt=(void *)((int *)ipcpt+1);
6270 for(m=0;m<n;m++){
6271 //i=mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].dat[m];
6272 //printf("\n%i",i);
6273 *(int *)ipcpt=mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].dat[m];
6274 ipcpt=(void *)((int *)ipcpt+1);
6275 }
6276 //printf("\nl=%i m=%i",l,m);
6277 //printf("\n");
6278 //exit(0);
6279 break;
6280 }
6281 } /* for(j=0;j<k;j++) */
6282 *((int*)shmbuf+k+2+j)=(int)((char *)ipcpt-shmbuf); /* Byte data offset */
6283 sb.sem_num=ipc;
6284 sb.sem_op=1;
6285 sb.sem_flg=0;
6286 semop(semid,&sb,1); /* post */
6287 sb.sem_num=0; // semaphore number
6288 sb.sem_op=-1;
6289 sb.sem_flg=0;
6290 semop(semid,&sb,1); /* wait */
6291 sb.sem_num=1; // semaphore number
6292 sb.sem_op=0;
6293 sb.sem_flg=IPC_NOWAIT;
6294 if(semop(semid,&sb,1)!=0){
6295 contype(46);
6296 l1=mpstk[(i1+1)*2+1]; /* function name */
6297 l1=ident[l1];
6298 printf("error in %s\n",&inpchar[l1]);
6299 exit(0);
6300 }
6301 sb.sem_num=5; // semaphore number form data xfer
6302 sb.sem_op=0;
6303 sb.sem_flg=IPC_NOWAIT;
6304 if(semop(semid,&sb,1)!=0){
6305 sb.sem_num=5;
6306 sb.sem_op=-1;
6307 sb.sem_flg=0;
6308 semop(semid,&sb,1); /* wait */
6309 k=param1[1]; /* number of parameters */
6310 ipcpt=(void *)(shmbuf+*((int*)shmbuf+2*k+2));
6311 i7=4096-256-10-*((int*)shmbuf+2*k+2); /* max number of bytes to be sent */
6312 while(1){
6313 i8=*(int *)ipcpt;
6314 if(i8==1){
6315 for(i6=0;i6<mx;i6++) if(strcmp(entries[i6].name,(char *)((int *)ipcpt+1))==0) break;
6316 if(i6==mx){
6317 contype(47);
6318 printf("name mismatch\n");
6319 exit(0);
6320 }
6321 }
6322 else i6=0; /* index to entries[] */
6323 i5=0; /* 0 : index, numbers of characters 1 : name 2 : value */
6324 i4=0; /* remaining bytes */
6325 i3=0; /* start byte */
6326 i2=0; /* bytes to be sent */
6327 k=0;
6328 while(1){
6329 /*contype(0);
6330 printf("\ni8=%i i6=%i",i8,i6);*/
6331 if(i6==mx){
6332 *(int *)ipcpt=999;
6333 i6++;
6334 }
6335 else{
6336 switch(i5){
6337 case 0:
6338 *(int *)ipcpt=i6;
6339 *((int *)ipcpt+1)=strlen(entries[i6].name);
6340 *((int *)ipcpt+2)=strlen(entries[i6].val);
6341 i5=1;
6342 i4=strlen(entries[i6].name)+1;
6343 i3=0;
6344 break;
6345 case 1:
6346 if(i4<i7){
6347 i2=i4;
6348 i5=2;
6349 *(int *)ipcpt=i2;
6350 }
6351 else{
6352 i4=i4-i7;
6353 i2=i7;
6354 *(int *)ipcpt=-i2; /* continued */
6355 }
6356 for(i=0;i<i2;i++) *((char *)((int *)ipcpt+1)+i)=entries[i6].name[i3+i];
6357 if(i5==1) i3=i3+i7;
6358 else{
6359 i4=strlen(entries[i6].val)+1;
6360 i3=0;
6361 }
6362 break;
6363 case 2:
6364 if(i4<i7){
6365 i2=i4;
6366 i5=0;
6367 *(int *)ipcpt=i2;
6368 }
6369 else{
6370 i4=i4-i7;
6371 i2=i7;
6372 *(int *)ipcpt=-i2;
6373 }
6374 for(i=0;i<i2;i++) *((char *)((int *)ipcpt+1)+i)=entries[i6].val[i3+i];
6375 if(i5==2) i3=i3+i7;
6376 else{
6377 i6++;
6378 if(i8==1) i6=mx; /* wouldnt be needed */
6379 }
6380 break;
6381 } /* switch(i5) */
6382 } /* else */
6383 sb.sem_num=6;
6384 sb.sem_op=1;
6385 sb.sem_flg=0;
6386 semop(semid,&sb,1); /* post */
6387 sb.sem_num=0; // semaphore number
6388 sb.sem_op=-1;
6389 sb.sem_flg=0;
6390 semop(semid,&sb,1); /* wait */
6391 sb.sem_num=5; // semaphore number form data xfer
6392 sb.sem_op=0;
6393 sb.sem_flg=IPC_NOWAIT;
6394 if(semop(semid,&sb,1)==0){
6395 i8=9999;
6396 break;
6397 }
6398 sb.sem_num=5;
6399 sb.sem_op=-1;
6400 sb.sem_flg=0;
6401 semop(semid,&sb,1); /* wait */
6402 if(i6>mx) break; /* a new request */
6403 } /* while(1) */
6404 if(i8==9999) break;
6405
6406 } /* while(1) */
6407 } /* if(semop(semid,&sb,1)!=0) */
6408 sb.sem_num=3; // semaphore number callback
6409 sb.sem_op=0;
6410 sb.sem_flg=IPC_NOWAIT;
6411 if(semop(semid,&sb,1)==0) cb=3; /* not callback */
6412 } /* if(cb==0) */
6413 if(cb==1||cb==0){ /* return from callback and the first callback */
6414 // printf("callback cb=%i\n",cb);
6415 label1:
6416 if(cb==0){ /* start callback */
6417 sb.sem_num=3;
6418 sb.sem_op=-1;
6419 sb.sem_flg=0;
6420 semop(semid,&sb,1); /* wait */
6421 callfrom=ipc;
6422 /* prepare user-defined function call */
6423 savecb=*(int *)shmcb;
6424 if(savecb!=0){
6425 for(i=0;i<4096;i++) *(shmbufcb+i)=*(shmbuf+i);
6426 }
6427 paramcb=param;
6428 for(i=0;i<22;i++) paracb[i]=para[i];
6429 for(i=0;i<22;i++) param1cb[i]=param1[i];
6430 for(i=0;i<400;i++) param2cb[i]=param2[i];
6431 for(i=0;i<20;i++) param3cb[i]=param3[i];
6432 for(i=0;i<20;i++) param4cb[i]=param4[i];
6433 for(i=0;i<40;i++) mpstkcb[i]=mpstk[i1*2+i];
6434 i7=nmp;
6435 i8=nmem;
6436 strcpy(s,(char *)((int *)shmcb+1));
6437 for(k=1;k<nscop;k++) if(strcmp(s,scop[k].name)==0) break;
6438 if(k==nscop){
6439 *(int *)shmcb=-1; /* error */
6440 contype(48);
6441 printf("%s\n",s);
6442 goto label2;
6443 }
6444 for(i=0;i<nident;i++) if(strcmp(s,&inpchar[ident[i]])==0) break;
6445 mpstk[2*nmp]=0;
6446 mpstk[2*nmp+1]=k1;
6447 //contype(1);
6448 //printf("callback nmp=%i\n",nmp);
6449 //goto label2;
6450 nmp++;
6451 mpstk[2*nmp]=9;
6452 mpstk[2*nmp+1]=0; /* can be used for some purpose */
6453 nmp++;
6454 mpstk[2*nmp]=0;
6455 mpstk[2*nmp+1]=k1;
6456 nmp++;
6457 mpstk[2*nmp]=7;
6458 mpstk[2*nmp+1]=i; /* index into ident[] */
6459 nmp++;
6460 //contype(1);
6461 //printf("callback scop[k].mem.bint[0]=%i\n",scop[k].mem.bint[0]);
6462 //nmp=i7;
6463 //goto label3;
6464 if(*(int *)((char *)shmcb+14)!=scop[k].mem.bint[0]){ /* number of parameters incl ret value */
6465 *(int *)shmcb=-1; /* error */
6466 contype(49);
6467 printf("%i %i\n",*(int *)((char *)shmcb+14),scop[k].mem.bint[0]);
6468 goto label2;
6469 }
6470 istscop=0; /* insert a scope */
6471 for(j=1;j<scop[k].mem.bint[0];j++){
6472 if(scop[k].kind[j]==9||scop[k].kind[j]==11||scop[k].kind[j]==12){
6473 istscop=1;
6474 break;
6475 }
6476 }
6477 //contype(1);
6478 //printf("callback istscop=%i\n",istscop);
6479 //nmp=i7;
6480 //goto label3;
6481 if(istscop){
6482 scop[nscop].mem.schar=mem[nmem-1]->schar+scop[mem[nmem-1]->scop].nchar;
6483 scop[nscop].mem.sstring=mem[nmem-1]->sstring+scop[mem[nmem-1]->scop].nstring;
6484 scop[nscop].mem.sdouble=mem[nmem-1]->sdouble+scop[mem[nmem-1]->scop].ndouble;
6485 scop[nscop].mem.sint=mem[nmem-1]->sint+scop[mem[nmem-1]->scop].nint;
6486 scop[nscop].mem.sdarr=mem[nmem-1]->sdarr+scop[mem[nmem-1]->scop].ndarr;
6487 scop[nscop].mem.siarr=mem[nmem-1]->siarr+scop[mem[nmem-1]->scop].niarr;
6488 mem[nmem]=&scop[nscop].mem;
6489 nmem++;
6490 }
6491 //contype(1);
6492 //printf("callback scop[k].mem.bint[0]=%i\n",scop[k].mem.bint[0]);
6493 //nmp=i7;
6494 //nmem=i8;
6495 //goto label3;
6496 for(j=1;j<scop[k].mem.bint[0];j++){
6497 switch(scop[k].kind[j]){
6498 case 3: /* double */
6499 if(*(int *)((char *)shmcb+18+j*8)!=3){
6500 *(int *)shmcb=-1; /* error */
6501 contype(50);
6502 nmp=i7;
6503 nmem=i8;
6504 goto label3;
6505 }
6506 mpstk[nmp*2]=8;
6507 for(l=nmp-1;l>0;l--) if(mpstk[l*2]==8) break;
6508 if(l==0) mpstk[nmp*2+1]=0;
6509 else mpstk[nmp*2+1]=mpstk[l*2+1]+1;
6510 dstk[mpstk[nmp*2+1]]=*(double *)((char *)shmcb+*(int *)((char *)shmcb+18+j*8+4));
6511 nmp++;
6512 break;
6513 case 4: /* int */
6514 if(*(int *)((char *)shmcb+18+j*8)!=4){
6515 *(int *)shmcb=-1; /* error */
6516 contype(51);
6517 nmp=i7;
6518 nmem=i8;
6519 goto label3;
6520 }
6521 mpstk[nmp*2]=6;
6522 mpstk[nmp*2+1]=*(int *)((char *)shmcb+*(int *)((char *)shmcb+18+j*8+4));
6523 nmp++;
6524 break;
6525 case 9: /* double* */
6526 if(*(int *)((char *)shmcb+18+j*8)!=9){
6527 *(int *)shmcb=-1; /* error */
6528 contype(51);
6529 nmp=i7;
6530 nmem=i8;
6531 goto label3;
6532 }
6533 l=scop[nscop].ndouble;
6534 mpstk[nmp*2]=29;
6535 mpstk[nmp*2+1]=l+mem[nmem-1]->sdouble;
6536 nmp++;
6537 scop[nscop].mem.bdouble[l]=*(double *)((char *)shmcb+*(int *)((char *)shmcb+18+j*8+4));
6538 scop[nscop].ndouble++;
6539 break;
6540 case 11: /* darray* */
6541 if(*(int *)((char *)shmcb+18+j*8)!=11){
6542 *(int *)shmcb=-1; /* error */
6543 contype(51);
6544 nmp=i7;
6545 nmem=i8;
6546 goto label3;
6547 }
6548 l=scop[nscop].ndarr;
6549 // mpstk[nmp*2]=31;
6550 // mpstk[nmp*2+1]=l+mem[nmem-1]->sdarr;
6551 mpstk[nmp*2]=25;
6552 mpstk[nmp*2+1]=l;
6553 nmp++;
6554 m=*(int *)((char *)shmcb+18+j*8+4);
6555 scop[nscop].mem.bdarr[l].dimen=*(int *)((char *)shmcb+m);
6556 scop[nscop].mem.bdarr[l].size[0]=n=*(int *)((char *)shmcb+m+4);
6557 if(scop[nscop].mem.bdarr[l].dimen==2){
6558 scop[nscop].mem.bdarr[l].size[1]=*(int *)((char *)shmcb+m+8);
6559 n*=*(int *)((char *)shmcb+m+8);
6560 m+=4;
6561 }
6562 scop[nscop].mem.bdarr[l].dat=&scop[nscop].mem.bdouble[scop[nscop].ndouble];
6563 scop[nscop].mem.bdarr[l].offs=scop[nscop].ndouble;
6564 scop[nscop].mem.bdarr[l].mem=nmem-1;
6565 for(o=0;o<n;o++) scop[nscop].mem.bdouble[scop[nscop].ndouble++]
6566 =*((double *)((char *)shmcb+m+8)+o);
6567 scop[nscop].ndarr++;
6568 break;
6569 case 12: /* iarray* */
6570 if(*(int *)((char *)shmcb+18+j*8)!=12){
6571 *(int *)shmcb=-1; /* error */
6572 contype(51);
6573 nmp=i7;
6574 nmem=i8;
6575 goto label3;
6576 }
6577 l=scop[nscop].niarr;
6578 mpstk[nmp*2]=32;
6579 mpstk[nmp*2+1]=l+mem[nmem-1]->siarr;
6580 nmp++;
6581 m=*(int *)((char *)shmcb+18+j*8+4);
6582 scop[nscop].mem.biarr[l].dimen=*(int *)((char *)shmcb+m);
6583 scop[nscop].mem.biarr[l].size[0]=n=*(int *)((char *)shmcb+m+4);
6584 if(scop[nscop].mem.biarr[l].dimen==2){
6585 scop[nscop].mem.biarr[l].size[1]=*(int *)((char *)shmcb+m+8);
6586 n*=*(int *)((char *)shmcb+m+8);
6587 m+=4;
6588 }
6589 scop[nscop].mem.biarr[l].dat=&scop[nscop].mem.bint[scop[nscop].nint];
6590 scop[nscop].mem.biarr[l].offs=scop[nscop].nint;
6591 scop[nscop].mem.biarr[l].mem=nmem-1;
6592 for(o=0;o<n;o++) scop[nscop].mem.bint[scop[nscop].nint++]
6593 =*((int *)((char *)shmcb+m+8)+o);
6594 scop[nscop].niarr++;
6595 break;
6596 default:
6597 *(int *)shmcb=-1; /* error */
6598 contype(52);
6599 nmp=i7;
6600 nmem=i8;
6601 goto label3;
6602 }
6603 }
6604 cb=1;
6605 }
6606 else{ /* finish callback */
6607 /* prepare sending the result of callback */
6608 if(savecb!=0){
6609 for(i=0;i<4096;i++) *(shmbuf+i)=*(shmbufcb+i);
6610 }
6611 param=paramcb;
6612 for(i=0;i<22;i++) para[i]=paracb[i];
6613 for(i=0;i<22;i++) param1[i]=param1cb[i];
6614 for(i=0;i<400;i++) param2[i]=param2cb[i];
6615 for(i=0;i<20;i++) param3[i]=param3cb[i];
6616 for(i=0;i<20;i++) param4[i]=param4cb[i];
6617 // printf("*(int *)((char *)shmcb+18)=%i %i mpstk[(i1+2)*2+1]=%i\n",*(int *)((char *)shmcb+18),*(int *)((char *)shmcb+22),mpstk[(i1+2)*2+1]);
6618 switch(*(int *)((char *)shmcb+18)){ /* return parameter type */
6619 case 3: /* double */
6620 *(double *)( (char *)shmcb+*(int *)((char *)shmcb+22) )=dstk[mpstk[(i1+2)*2+1]];
6621 break;
6622 case 4: /* int */
6623 *(int *)( (char *)shmcb+*(int *)((char *)shmcb+22) )=mpstk[(i1+2)*2+1];
6624 break;
6625 }
6626 if(istscop){
6627 istscop=0;
6628 l=0;
6629 l1=0;
6630 j=*(int *)((char *)shmcb+14); /* number of return parameter and arguments */
6631 for(i=1;i<j;i++){
6632 switch(*(int *)((char *)shmcb+18+i*8)){
6633 case 9: /* double* */
6634 *(double *)((char *)shmcb+*(int *)((char *)shmcb+18+i*8+4))=scop[nscop].mem.bdouble[l++];
6635 break;
6636 case 11: /* darray* */
6637 m=*(int *)((char *)shmcb+18+i*8+4); /* offset */
6638 n=*(int *)((char *)shmcb+m+4); /* size */
6639 if(*(int *)((char *)shmcb+m)==2){
6640 n*=*(int *)((char *)shmcb+m+8);
6641 m+=4;
6642 }
6643 for(o=0;o<n;o++) *((double *)((char *)shmcb+m+8)+o)=
6644 scop[nscop].mem.bdouble[l++];
6645 break;
6646 case 12: /* iarray* */
6647 m=*(int *)((char *)shmcb+18+i*8+4); /* offset */
6648 n=*(int *)((char *)shmcb+m+4); /* size */
6649 if(*(int *)((char *)shmcb+m)==2){
6650 n*=*(int *)((char *)shmcb+m+8);
6651 m+=4;
6652 }
6653 for(o=0;o<n;o++) *((int *)((char *)shmcb+m+8)+o)=
6654 scop[nscop].mem.bint[l1++];
6655 break;
6656 default:
6657 break;
6658 }
6659 }
6660 nmem--;
6661 scop[nscop].ndouble=0;
6662 scop[nscop].nint=0;
6663 scop[nscop].ndarr=0;
6664 scop[nscop].niarr=0;
6665 }
6666
6667 //nmp=i7;
6668 //nmem=i8;
6669 label3:
6670 for(i=0;i<40;i++) mpstk[i1*2+i]=mpstkcb[i];
6671 label2:
6672 callfrom=0;
6673 sb.sem_num=2;
6674 sb.sem_op=1;
6675 sb.sem_flg=0;
6676 semop(semid,&sb,1); /* post */
6677 sb.sem_num=0;
6678 sb.sem_op=-1;
6679 sb.sem_flg=0;
6680 semop(semid,&sb,1); /* wait */
6681 sb.sem_num=3;
6682 sb.sem_op=0;
6683 sb.sem_flg=IPC_NOWAIT;
6684 if(semop(semid,&sb,1)==0) cb=3; /* no more callbacks */
6685 else cb=0; /* callback */
6686 } /* else */
6687 if(cb==0) goto label1;
6688 } /* if(mpstk[(i1+1)*2]==9||semop(semid,&sb,1)!=0){ */
6689 if(cb==3) cb=0; /* not a callback */
6690 if(cb==0){
6691 sb.sem_num=2; // semaphore number print output
6692 sb.sem_op=0;
6693 sb.sem_flg=IPC_NOWAIT;
6694 if(semop(semid,&sb,1)!=0){
6695 sb.sem_num=2;
6696 sb.sem_op=-1;
6697 sb.sem_flg=0;
6698 semop(semid,&sb,1); /* wait */
6699 k=param1[1]; /* number of parameters */
6700 ipcpt=(void *)(shmbuf+*((int*)shmbuf+2*k+2));
6701 k=0;
6702 while(1){
6703 if(firstTime){
6704 if(k==2) k=0;
6705 if(*((char *)((int *)ipcpt+1)+0)=='a'&&
6706 *((char *)((int *)ipcpt+1)+1)=='d'&&
6707 *((char *)((int *)ipcpt+1)+2)=='d'){
6708 for(j=0;j<490;j+=10) if(fnames[j]=='\0') break;
6709 for(i=0;i<10;i++) fnames[j+i]=*((char *)((int *)ipcpt+1)+3+i);
6710 fnames[j+i]='\0';
6711 k=2;
6712 fstatus=3;
6713 }
6714 if(*((char *)((int *)ipcpt+1)+0)=='d'&&
6715 *((char *)((int *)ipcpt+1)+1)=='e'&&
6716 *((char *)((int *)ipcpt+1)+2)=='l'){
6717 for(j=0;j<500;j+=10){
6718 for(i=0;i<4;i++) if(fnames[j+i]!=*((char *)((int *)ipcpt+1)+3+i)) break;
6719 if(i==4) for(;j<491;j++) fnames[j]=fnames[j+10];
6720 }
6721 k=2;
6722 fstatus=3;
6723 if(fnames[0]=='\0') fstatus=4;
6724 }
6725 if(k==2);
6726 else{
6727 if(*((char *)((int *)ipcpt+1)+0)=='S'&&
6728 *((char *)((int *)ipcpt+1)+1)=='e'&&
6729 *((char *)((int *)ipcpt+1)+2)=='t'&&
6730 *((char *)((int *)ipcpt+1)+3)=='-'); /* Cookie */
6731 else{
6732 if(fstatus==3){
6733 expires=time(NULL)+3600*2400; /* 100 days */
6734 strftime(s, 200, "%a, %d-%b-%Y %H:%M:%S %Z",gmtime(&expires));
6735 printf("Set-Cookie: p077=%s; expires=%s; domain=%s; path=%s\n",fnames,s,hhost,rquri);
6736 }
6737 if(fstatus==4){
6738 expires=time(NULL)-3600*2400; /* 100 days ago */
6739 strftime(s, 200, "%a, %d-%b-%Y %H:%M:%S %Z",gmtime(&expires));
6740 printf("Set-Cookie: p077=NULL; expires=%s; domain=%s; path=%s\n",s,hhost,rquri);
6741 }
6742 /* test for graphic output */
6743 if(*((char *)((int *)ipcpt+1)+0)=='\x89'&&
6744 *((char *)((int *)ipcpt+1)+1)=='P'&&
6745 *((char *)((int *)ipcpt+1)+2)=='N'&&
6746 *((char *)((int *)ipcpt+1)+3)=='G'){
6747 printf("Content-type: image/png%c%c",10,10);
6748 }
6749 else if(*((char *)((int *)ipcpt+1)+0)=='G'&&
6750 *((char *)((int *)ipcpt+1)+1)=='I'&&
6751 *((char *)((int *)ipcpt+1)+2)=='F'&&
6752 *((char *)((int *)ipcpt+1)+3)=='8'){
6753 // printf("Expires: 0%cContent-type: image/gif%c%c",10,10,10);
6754 printf("Content-type: image/gif%c%c",10,10);
6755 }
6756 else if(*((char *)((int *)ipcpt+1)+6)=='J'&&
6757 *((char *)((int *)ipcpt+1)+7)=='F'&&
6758 *((char *)((int *)ipcpt+1)+8)=='I'&&
6759 *((char *)((int *)ipcpt+1)+9)=='F'){
6760
6761 printf("Content-type: image/jpeg%c%c",10,10);
6762 }
6763 else if(*((char *)((int *)ipcpt+1)+0)=='<')
6764 printf("Content-type: text/html%c%c",10,10);
6765 else if(*((char *)((int *)ipcpt+1)+0)=='%'){
6766 if(*((char *)((int *)ipcpt+1)+1)=='!')
6767 printf("Content-type: application/postscript%c%c",10,10);
6768 else if(*((char *)((int *)ipcpt+1)+1)=='P')
6769 printf("Content-type: application/pdf%c%c",10,10);
6770 else printf("Content-type: text/plain%c%c",10,10);
6771 }
6772 else if(*((char *)((int *)ipcpt+1))=='L'&&
6773 *((char *)((int *)ipcpt+1)+1)=='o'&&
6774 *((char *)((int *)ipcpt+1)+2)=='c'&&
6775 *((char *)((int *)ipcpt+1)+3)=='a');
6776 else printf("Content-type: text/plain%c%c",10,10);
6777 firstTime=0;
6778 } /* else cookie */
6779 } /* else file */
6780 } /* if(firstTime){ */
6781 if(k!=2) fwrite((char *)((int *)ipcpt+1),sizeof(char),*(int *)ipcpt,stdout);
6782 sb.sem_num=3;
6783 sb.sem_op=1;
6784 sb.sem_flg=0;
6785 semop(semid,&sb,1); /* post */
6786 sb.sem_num=0; // semaphore number
6787 sb.sem_op=-1;
6788 sb.sem_flg=0;
6789 semop(semid,&sb,1); /* wait */
6790 sb.sem_num=2; // semaphore number print output
6791 sb.sem_op=0;
6792 sb.sem_flg=IPC_NOWAIT;
6793 if(semop(semid,&sb,1)==0){
6794 sb.sem_num=1; // semaphore number
6795 sb.sem_op=0;
6796 sb.sem_flg=IPC_NOWAIT;
6797 if(semop(semid,&sb,1)!=0){
6798 l1=mpstk[(i1+1)*2+1]; /* function name */
6799 l1=ident[l1];
6800 printf("error in %s\n",&inpchar[l1]);
6801 exit(0);
6802 }
6803 break;
6804 }
6805 sb.sem_num=2;
6806 sb.sem_op=-1;
6807 sb.sem_flg=0;
6808 semop(semid,&sb,1); /* wait */
6809 }
6810 } /*if(semop(semid,&sb,1)!=0) */
6811 k=param1[1]; /* number of parameters */
6812 for(j=0;j<k;j++){
6813 ipcpt=(void *)(shmbuf+*((int*)shmbuf+k+2+j));
6814 switch(param1[j+2]){
6815 case 0: /* char */
6816 break;
6817 case 1: /* char* */
6818 if(mpstk[(i1+1+j)*2]!=4&&mpstk[(i1+1+j)*2]!=7&&mpstk[(i1+1+j)*2]!=27){
6819 for(l=nmem-1;l>=0;l--)
6820 if(mem[l]->sstring<=*((int **)param)[j+1]) break;
6821 mem[l]->nstring[*((int **)param)[j+1]-mem[l]->sstring]=*(int *)ipcpt;
6822 ipcpt=(void *)((int *)ipcpt+1);
6823 m=mem[l]->mstring[*((int **)param)[j+1]-mem[l]->sstring];
6824 for(n=0;n<m;n++){
6825 mem[l]->bchar[ mem[l]->bstring[*((int **)param)[j+1]-mem[l]->sstring] +n]=*(char *)ipcpt;
6826 ipcpt=(void *)((char *)ipcpt+1);
6827 }
6828 }
6829 break;
6830 case 2: /* double */
6831 *((double **)param)[j+1]=*(double *)ipcpt;
6832 break;
6833 case 3: /* double* */
6834 d1=*(double *)ipcpt;
6835 for(l=nmem-1;l>=0;l--)
6836 if(mem[l]->sdouble<=*((int **)param)[j+1]) break;
6837 mem[l]->bdouble[*((int **)param)[j+1]-mem[l]->sdouble]=d1;
6838 break;
6839 case 4: /* int */
6840 *((int **)param)[j+1]=*(int *)ipcpt;
6841 break;
6842 case 5: /* int* */
6843 m=*(int *)ipcpt;
6844 for(l=nmem-1;l>=0;l--)
6845 if(mem[l]->sint<=*((int **)param)[j+1]) break;
6846 mem[l]->bint[*((int **)param)[j+1]-mem[l]->sint]=m;
6847 break;
6848 case 6: /* ... */
6849 break;
6850 case 7: /* darray* */
6851 for(l=nmem-1;l>=0;l--)
6852 if(mem[l]->sdarr<=*((int **)param)[j+1]) break;
6853 if(((darray *)ipcpt)->dimen>0)
6854 mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].dimen=((darray *)ipcpt)->dimen;
6855 else
6856 mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].dimen=-((darray *)ipcpt)->dimen;
6857 /* the following restoration will be changed to be done only if dimen is negative */
6858 for(m=0;m<4;m++){
6859 mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].size[m]=((darray *)ipcpt)->size[m];
6860 }
6861 n=((darray *)ipcpt)->mem;
6862 o=((darray *)ipcpt)->offs;
6863 ipcpt=(void *)(shmbuf+o);
6864 for(m=0;m<n;m++)
6865 mem[l]->bdarr[*((int **)param)[j+1]-mem[l]->sdarr].dat[m]=((double *)ipcpt)[m];
6866 break;
6867 case 8: /* iarray* */
6868 for(l=nmem-1;l>=0;l--)
6869 if(mem[l]->siarr<=*((int **)param)[j+1]) break;
6870 if(((iarray *)ipcpt)->dimen>0)
6871 mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].dimen=((iarray *)ipcpt)->dimen;
6872 else
6873 mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].dimen=-((iarray *)ipcpt)->dimen;
6874 /* the following restoration will be changed to be done only if dimen is negative */
6875 for(m=0;m<4;m++){
6876 mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].size[m]=((iarray *)ipcpt)->size[m];
6877 }
6878 n=((iarray *)ipcpt)->mem;
6879 o=((iarray *)ipcpt)->offs;
6880 ipcpt=(void *)(shmbuf+o);
6881 for(m=0;m<n;m++)
6882 mem[l]->biarr[*((int **)param)[j+1]-mem[l]->siarr].dat[m]=((int *)ipcpt)[m];
6883 break;
6884 } /* switch */
6885 } /* for */
6886 } /* if(cb==0) */
6887 } /* if(cb==1||ipc>0){ */
6888 else if(ipc==0) func(param);
6889 else{
6890 for(j=0;j<nso;j++) if(prs22[j]==-ipc) break;
6891 (*prs23[j])(param);
6892 }
6893 if(cb==0){
6894 if(param1[2]==2){ /* double */
6895 mpstk[2*nmp]=8;
6896 for(j=nmp-1;j>0;j--) if(mpstk[2*j]==8) break;
6897 if(j==0) mpstk[2*nmp+1]=0;
6898 else mpstk[2*nmp+1]=mpstk[2*j+1]+1;
6899 dstk[mpstk[2*nmp+1]]=*(double *)para[1];
6900 // printf("return value=%lf\n",dstk[mpstk[2*nmp+1]]);
6901 nmp++;
6902 }
6903 else{ /* int */
6904 mpstk[2*nmp]=6;
6905 mpstk[2*nmp+1]=*(int *)para[1];
6906 // printf("return value=%i\n",mpstk[2*nmp+1]);
6907 nmp++;
6908 }
6909 } /* if(cb==0) */
6910 else cb=0;
6911 } /* else */
6912 } /* else */
6913 break;
6914 case 209: /* struct */
6915 break;
6916 case 210: /* struct */
6917 break;
6918 case 211: /* post-increment */
6919 case 212: /* post-decrement */
6920 switch(mpstk[(j1-1)*2]){
6921 case 24: /* current memory.bint */
6922 i3=mem[nmem-1]->bint[mpstk[(j1-1)*2+1]];
6923 break;
6924 case 44: /* global memory.bint */
6925 i3=mem[0]->bint[mpstk[(j1-1)*2+1]];
6926 break;
6927 /* to be added later */
6928 default:
6929 contype(53);
6930 exit(0);
6931 }
6932 if(produc[k1]==211) i4=i3+1;
6933 else i4=i3-1;
6934 switch(mpstk[(j1-1)*2]){
6935 case 24: /* current memory.bint */
6936 mem[nmem-1]->bint[mpstk[(j1-1)*2+1]]=i4;
6937 break;
6938 case 44: /* global memory.bint */
6939 mem[0]->bint[mpstk[(j1-1)*2+1]]=i4;
6940 break;
6941 /* to be added later */
6942 }
6943 mpstk[2*nmp]=6;
6944 mpstk[2*nmp+1]=i3;
6945 nmp++;
6946 break;
6947 default:note029
6948 for(i=i1;i<j1-1;i++){
6949 mpstk[i*2]=mpstk[(i+1)*2];
6950 mpstk[i*2+1]=mpstk[(i+1)*2+1];
6951 }
6952 nmp=j1-1;
6953 break;
6954 } /* switch (produc[k1]) */
6955 for(i=nmp-1;i>0;i--) if(mpstk[2*i]==0||mpstk[2*i]==1||mpstk[2*i]==2) break;
6956 if(i>0){
6957 if(mpstk[2*i]==1&&mpstk[2*(i-1)]==2){
6958 i--;
6959 k1=mpstk[2*i+1];
6960 for(;i<nmp-1;i++){
6961 mpstk[2*i]=mpstk[2*(i+2)];
6962 mpstk[2*i+1]=mpstk[2*(i+2)+1];
6963 }
6964 nmp-=2;
6965 }
6966 else{
6967 k1=mpstk[2*i+1];
6968 if(mpstk[2*i]==1||mpstk[2*i]==2){
6969 for(;i<nmp;i++){
6970 mpstk[2*i]=mpstk[2*(i+1)];
6971 mpstk[2*i+1]=mpstk[2*(i+1)+1];
6972 }
6973 nmp--;
6974 }
6975 }
6976 }
6977 else k1=0;
6978 } /* else */
6979 } /* while(test--) */
6980 exit(0);
6981}
6982
6983/**************************************************************************
6984 functions
6985 passed parameter
6986 param[0] : int**param1 param1[0]:function number
6987 param1[1]:number of parameters
6988 param1[2]:type of return value
6989 param1[3]:type of the first parameter in parentheses
6990 param1[4]:type of the second parameter in parentheses
6991 param[1] : param1[2]*
6992 param[2] : param1[3]* format
6993 param[3] : param1[4]*
6994
6995
6996**************************************************************************/
6997int func(void *param)
6998{
6999 int *param1;
7000 int i,j,k,l,m;
7001 // double d=3.14159265;
7002 char f[300];
7003 char *fmt;
7004 char *sp;
7005 double a,b;
7006 int tab;
7007 char s[200];
7008
7009 param1=*(int **)param;note030
7010 // printf("param1[0]=%i [1]=%i ",param1[0],param1[1]);
7011 // for(i=0;i<param1[1];i++) printf("[%i]=%i ",i+2,param1[i+2]);
7012 // printf("\n");
7013 switch (param1[0]){
7014 /*000printf
7015 *@00Formatted output to the client.
7016 *@01unused
7017 *@02format string
7018 *@03parameter list
7019 */
7020 case 0: /* printf */
7021 if(firstTime){
7022 sp=(char *)((void **)param)[2];
7023 if(sp[0]=='L'&&sp[1]=='o'&&sp[2]=='c'&&sp[3]=='a');
7024 else if(*(char *)(((void **)param)[2])=='<')
7025 printf("Content-type: text/html%c%c",10,10);
7026 else printf("Content-type: text/plain%c%c",10,10);
7027 firstTime=0;
7028 }
7029 /*052sprintf
7030 *@00Formatted output to a string
7031 *@01unused
7032 *@02output string
7033 *@03format string
7034 *@04parameter list
7035 */
7036 case 52: /* sprintf */
7037 j=0;
7038 if(param1[0]==0) fmt=(char *)((void **)param)[2];
7039 else{
7040 sp=(char *)((void **)param)[2];
7041 fmt=(char *)((void **)param)[3];
7042 }
7043 tab=-1;
7044 for(i=0;fmt[i]!='\0';i++){
7045 if(fmt[i]=='\t'){
7046 tab=0;
7047 break;
7048 }
7049 }
7050 i=0;
7051 for(j=0;;j++){
7052 if(fmt[i]=='\0') break;
7053 if(fmt[i]=='%'){
7054 if(fmt[i+1]=='%'){
7055 f[j++]='%';
7056 i++;
7057 }
7058 else break;
7059 }
7060 f[j]=fmt[i];
7061 i++;
7062 }
7063 f[j]='\0';
7064 if(tab==-1){
7065 if(param1[0]==0) printf(f);
7066 else{
7067 sprintf(sp,f);
7068 // sp+=strlen(f); /* strlen of f is not the same as strlen of sp if %% is included */
7069 sp+=strlen(sp);
7070 }
7071 }
7072 else{
7073 sprintf(s,f);
7074 for(m=0;s[m]!='\0';m++){
7075 if(s[m]=='\t'){
7076 if(param1[0]==0) printf("%c",' ');
7077 else{
7078 sprintf(sp,"%c",' ');
7079 sp++;
7080 }
7081 tab++;
7082 while(tab%8!=0){
7083 if(param1[0]==0) printf("%c",' ');
7084 else{
7085 sprintf(sp,"%c",' ');
7086 sp++;
7087 }
7088 tab++;
7089 }
7090 }
7091 else{
7092 if(param1[0]==0) printf("%c",s[m]);
7093 else{
7094 sprintf(sp,"%c",s[m]);
7095 sp++;
7096 }
7097 if(s[m]=='\n') tab=0;
7098 else tab++;
7099 }
7100 }
7101 }
7102 if(param1[0]==0) k=2;
7103 else k=3;
7104 for(;k<param1[1];k++){ /* do for number of parameters */
7105 for(j=0;;j++){
7106 f[j]=fmt[i];
7107 if(fmt[i]=='c'){
7108 f[j+1]='\0';
7109 if(tab==-1){
7110 if(param1[0]==0) printf(f,*(char *)((void **)param)[k+1]);
7111 else{
7112 sprintf(s,f,*(char *)((void **)param)[k+1]);
7113 sprintf(sp,"%s",s);
7114 sp+=strlen(s);
7115 }
7116 }
7117 else sprintf(s,f,*(char *)((void **)param)[k+1]);
7118 i++;
7119 break;
7120 }
7121 if(fmt[i]=='s'){
7122 f[j+1]='\0';
7123 if(tab==-1){
7124 if(param1[0]==0) printf(f,(char *)((void **)param)[k+1]);
7125 else{
7126 sprintf(s,f,(char *)((void **)param)[k+1]);
7127 sprintf(sp,"%s",s);
7128 sp+=strlen(s);
7129 }
7130 }
7131 else sprintf(s,f,(char *)((void **)param)[k+1]);
7132 i++;
7133 break;
7134 }
7135 if(fmt[i]=='i'||fmt[i]=='d'||fmt[i]=='x'||fmt[i]=='X'){
7136 f[j+1]='\0';
7137 if(tab==-1){
7138 if(param1[0]==0) printf(f,*(int *)((void **)param)[k+1]);
7139 else{
7140 sprintf(s,f,*(int *)((void **)param)[k+1]);
7141 sprintf(sp,"%s",s);
7142 sp+=strlen(s);
7143 }
7144 }
7145 else sprintf(s,f,*(int *)((void **)param)[k+1]);
7146 i++;
7147 break;
7148 }
7149 if(fmt[i]=='f'||fmt[i]=='e'||fmt[i]=='g'){
7150 f[j+1]='\0';
7151 if(tab==-1){
7152 if(param1[0]==0) printf(f,*(double *)((void **)param)[k+1]);
7153 else{
7154 sprintf(s,f,*(double *)((void **)param)[k+1]);
7155 sprintf(sp,"%s",s);
7156 sp+=strlen(s);
7157 }
7158 }
7159 else sprintf(s,f,*(double *)((void **)param)[k+1]);
7160 i++;
7161 break;
7162 }
7163 i++;
7164 } /* for(j=0;;j++){ */
7165 if(tab!=-1){
7166 tab+=strlen(s);
7167 if(param1[0]==0) printf("%s",s);
7168 else{
7169 sprintf(sp,"%s",s);
7170 sp+=strlen(s);
7171 }
7172 }
7173 for(j=0;;j++){
7174 if(fmt[i]=='\0') break;
7175 if(fmt[i]=='%'){
7176 if(fmt[i+1]=='%'){
7177 f[j++]='%';
7178 i++;
7179 }
7180 else break;
7181 }
7182 f[j]=fmt[i];
7183 i++;
7184 }
7185 f[j]='\0';
7186 if(tab==-1){
7187 if(param1[0]==0) printf(f);
7188 else{
7189 sprintf(s,f);
7190 strcat(sp,s);
7191 sp+=strlen(s);
7192 }
7193 }
7194 else{
7195 sprintf(s,f);
7196 for(l=0;s[l]!='\0';l++){
7197 if(s[l]=='\t'){
7198 if(param1[0]==0) printf("%c",' ');
7199 else{
7200 sprintf(sp,"%c",' ');
7201 sp++;
7202 }
7203 tab++;
7204 while(tab%8!=0){
7205 if(param1[0]==0) printf("%c",' ');
7206 else{
7207 sprintf(sp,"%c",' ');
7208 sp++;
7209 }
7210 tab++;
7211 }
7212 }
7213 else{
7214 if(param1[0]==0) printf("%c",s[l]);
7215 else{
7216 sprintf(sp,"%c",s[l]);
7217 sp++;
7218 }
7219 if(s[l]=='\n') tab=0;
7220 else tab++;
7221 }
7222 } /* for(l=0;s[l]!='\0';l++) */
7223 } /* else{ */
7224 } /* for(k=2;k<param1[1];k++) */
7225 *(int *)((void **)param)[1]=0;
7226 break;
7227 /*001sin
7228 *@00sine function
7229 *@01sine value
7230 *@02parameter (rad)
7231 */
7232 case 1: /* sin */
7233 *(double *)((void **)param)[1]=sin(*(double *)((void **)param)[2]);
7234 break;
7235 /*002cos
7236 *@00cosine function
7237 *@01cosine value
7238 *@02parameter (rad)
7239 */
7240 case 2: /* cos */
7241 *(double *)((void **)param)[1]=cos(*(double *)((void **)param)[2]);
7242 break;
7243 /*003tan
7244 *@00tangent function
7245 *@01tan value
7246 *@02parameter (rad)
7247 */
7248 case 3: /* tan */
7249 *(double *)((void **)param)[1]=tan(*(double *)((void **)param)[2]);
7250 break;
7251 /*004asin
7252 *@00arc sine function
7253 *@01asin value (rad)
7254 *@02parameter
7255 */
7256 case 4: /* asin */
7257 a=*(double *)((void **)param)[2];
7258 if(a<1.||a>1.){
7259 contype(54);
7260 printf("asin arg\n");
7261 exit(0);
7262 }
7263 *(double *)((void **)param)[1]=asin(a);
7264 break;
7265 /*005acos
7266 *@00arc cosine function
7267 *@01acos value (rad)
7268 *@02parameter
7269 */
7270 case 5: /* acos */
7271 a=*(double *)((void **)param)[2];
7272 if(a<1.||a>1.){
7273 contype(55);
7274 printf("acos arg\n");
7275 exit(0);
7276 }
7277 *(double *)((void **)param)[1]=acos(a);
7278 break;
7279 /*006atan
7280 *@00arc tangent function
7281 *@01atan value (rad)
7282 *@02parameter
7283 */
7284 case 6: /* atan */
7285 *(double *)((void **)param)[1]=atan(*(double *)((void **)param)[2]);
7286 break;
7287 /*007atan2
7288 *@00arc tangent fubction
7289 *@01atan(y/x) (rad)
7290 *@02y
7291 *@03x
7292 */
7293 case 7: /* atan2 */
7294 *(double *)((void **)param)[1]=atan2(*(double *)((void **)param)[2],*(double *)((void **)param)[3]);
7295 break;
7296 /*008sinh
7297 *@00hyperbolic sine function
7298 *@01sinh value
7299 *@02parameter (rad)
7300 */
7301 case 8: /* sinh */
7302 *(double *)((void **)param)[1]=sinh(*(double *)((void **)param)[2]);
7303 break;
7304 /*009cosh
7305 *@00hyperbolic coine function
7306 *@01cosh value
7307 *@02parameter (rad)
7308 */
7309 case 9: /* cosh */
7310 *(double *)((void **)param)[1]=cosh(*(double *)((void **)param)[2]);
7311 break;
7312 /*010tanh
7313 *@00hyperbolic tangent function
7314 *@01tanh value
7315 *@02parameter (rad)
7316 */
7317 case 10: /* tanh */
7318 *(double *)((void **)param)[1]=tanh(*(double *)((void **)param)[2]);
7319 break;
7320 /*011exp
7321 *@00exponential function
7322 *@01e raised to the power of the parameter
7323 *@02parameter
7324 */
7325 case 11: /* exp */
7326 *(double *)((void **)param)[1]=exp(*(double *)((void **)param)[2]);
7327 break;
7328 /*012log
7329 *@00natural logarithm function
7330 *@01log value
7331 *@02parameter
7332 */
7333 case 12: /* log */
7334 a=*(double *)((void **)param)[2];
7335 if(a<=0.){
7336 contype(56);
7337 printf("log arg\n");
7338 exit(0);
7339 }
7340 *(double *)((void **)param)[1]=log(a);
7341 break;
7342 /*013log10
7343 *@00base-10 logarithm function
7344 *@01log10 value
7345 *@02parameter
7346 */
7347 case 13: /* log10 */
7348 a=*(double *)((void **)param)[2];
7349 if(a<=0.){
7350 contype(57);
7351 printf("log10 arg\n");
7352 exit(0);
7353 }
7354 *(double *)((void **)param)[1]=log10(a);
7355 break;
7356 /*014pow
7357 *@00x rased to the power of y
7358 *@01x**y value
7359 *@02x
7360 *@03y
7361 */
7362 case 14: /* pow */
7363 a=*(double *)((void **)param)[2];
7364 b=*(double *)((void **)param)[3];
7365 if((a==0.&&b<=0.)||(a<0.&&fmod(b,1.)!=0.)){
7366 contype(58);
7367 printf("pow arg\n");
7368 exit(0);
7369 }
7370 *(double *)((void **)param)[1]=pow(a,b);
7371 break;
7372 /*015sqrt
7373 *@00square root function
7374 *@01sqrt value
7375 *@02parameter (positive)
7376 */
7377 case 15: /* sqrt */
7378 a=*(double *)((void **)param)[2];
7379 if(a<0.){
7380 contype(59);
7381 printf("sqrt arg negative\n");
7382 exit(0);
7383 }
7384 *(double *)((void **)param)[1]=sqrt(a);
7385 break;
7386 /*016ceil
7387 *@00smallest integer not less than x
7388 *@01ceil value
7389 *@02parameter x
7390 */
7391 case 16: /* ceil */
7392 *(double *)((void **)param)[1]=ceil(*(double *)((void **)param)[2]);
7393 break;
7394 /*017floor
7395 *@00largest integer not greater than x
7396 *@01floor value
7397 *@02parameter x
7398 */
7399 case 17: /* floor */
7400 *(double *)((void **)param)[1]=floor(*(double *)((void **)param)[2]);
7401 break;
7402 /*018fabs
7403 *@00labsolute value of x
7404 *@01fabs value
7405 *@02parameter x
7406 */
7407 case 18: /* fabs */
7408 *(double *)((void **)param)[1]=fabs(*(double *)((void **)param)[2]);
7409 break;
7410 /*019fmod
7411 *@00floating-point remainder of x/y
7412 *@01fmod value
7413 *@02parameter x
7414 *@03parameter y
7415 */
7416 case 19: /* fmod */