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 *)&param3[n1++];
5836               break;
5837              case 4: /* int */
5838               para[1]=(void *)&param4[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 *)&param2[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 *)&param3[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 *)&param4[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 *)&param3[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 *)&param2[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 *)&param3[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 *)&param4[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 *)&param4[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 *)&param3[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 *)&param3[n1];
6009                   n1++;
6010                   k++;
6011                 }
6012                 else{
6013                   param4[o1]=mem[nmem-1]->bint[mpstk[l1*2+1]];
6014                   para[k+2]=(void *)&param4[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 *)&param4[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 *)&param4[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 *)&param2[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 *)&param3[n1];
6066                   n1++;
6067                 }
6068                 else{
6069                   param4[o1]=mpstk[l1*2+1];
6070                   para[k+2]=(void *)&param4[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 *)&param4[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 *)&param4[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 *)&param4[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 *)&param4[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 *)&param3[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 *)&param3[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 *)&param4[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 *)&param4[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 *)&param4[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 *)&param1[0];
6158              param=(void *)&para[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 */