Exemplo n.º 1
0
Arquivo: err.c Projeto: pfoubet/Nife
void IF_showError(void)
{
   if (ERROR) 
      printf("%s : %s !!\n",InExec,TabErr[ERROR]);
   else
      printf("%s : %s.\n",codByAddr(ADDRERR),TabErr[LASTERR]);
}
Exemplo n.º 2
0
void IF_show_Tasks(void)
{
int i;
   for (i=0;i<MAX_TASK;i++) {
      if (TASKp[i] != 0) {
         printf(" %.2d  :  %s  (",i+1,codByAddr(TASKf[i]));
         if (kill(TASKp[i],SIGUSR1) ==0) printf("running");
         else printf("stopped");
         printf(")\n");
      }
   }
   printf("<end of tasks list>\n");
}
Exemplo n.º 3
0
void execCod(void *A)
{
int i,n, ea, Ea, *ai, InDo=0, OnErr=0, mFCTP;
long L, P;
char * C, *D, *F, *W, *S, *ADo_Next, *ADo_Leave;
void * T, *T2;
void (*f)(void);
struct Fct * FR;

    /* printf("pid = %d ITASK=%d FctInTask=%d\n",getpid(),ITASK,FctInTask);*/
    if (FctInTask) {
        if (ITASK==0) {
           if (FctInTask==-1) {
              FctInTask=0; return;
           }
           if (MakeTask(A)) return;
        }
        if (ITASK!=FctInTask) return;
    }
    D_Cod++;
    ai = (int*)A;
    i = *ai++;
    ea = *ai++;
    Ea = *ai;
    if (ea) tellOnErr(A);
    C = (char*)A+(3*sizeof(int));
    D = C;
    F = C+i;
    n = sizeof(T);
    while (C <= F) {
       /* printf("execCod : %s %d - %x : %ld\n",
              codByAddr(A),(int)(C-D),*C,(long)*(C+1));
       */
       if (noErr() && ((C==F) || ((Code)*C != T_ONER)) ) { /* to find onerr: */
          if (ea && (OnErr==0)) {
             C = D+ea;
          }  else {
             printf("Called in %s err=%d i=%d/%d cod=<%x>\n",
                    codByAddr(A),noErr(),(int)(C-D),i,*C);
             break; /* end of while */
          }
       }
       if (C==F) break; /* end of code */
       switch((Code)*C) {
       case T_ONER :
           if (noErr()==0) { /* jmp end: */
               if (Ea) C = D+Ea;
               else C = F; /* to break */
           } else {
             if (OnErr==0) {
                OnErr=1;
                majLastErr(A);
                razErr();
             } else C = F;
           }
           break;
       case T_RET :
           C = F; /* to break */
           break;
       case T_END :
           break; /* nothing */
       case T_JEND :
           if (Ea) C = D+Ea;
           else C = F; /* to break */
           break;
       case T_NUM :
           bcopy((void*)(C+1),(void*)&T,n);
           insertVal(T);
           break;
       case T_CHA :
           bcopy((void*)(C+1),(void*)&W,n);
           putString(W);
           break;
       case T_LIB :
           if (InstallOn) {
              if (InstallOn < 3) {
                 bcopy((void*)(C+1),(void*)&T,n);
                 _MODIF_FCT_INST_(T);
                 _MODIF_FCT_TYP_(1);
              } else {
                 _MODIF_FCT_INST_(VIDE);
                 _MODIF_FCT_TYP_(0);
              }
              InstallOn=0;
           } else {
              bcopy((void*)(C+1),(void*)&f,n);
              f();
              /* free context loops */
              if (Do_Evts) { /* quit or cut */
                 /*printf("execCod T_LIB : Evts %d\n",Do_Evts);*/
                 if (InDo) {
                    if (Do_Evts>0) {
                       C=ADo_Leave;
                       I_DO--;
                       InDo = 0;
                       Do_Evts--;
                    } else {
                       C=ADo_Next;
                       Do_Evts=0;
                    }
                 } else { /* quit */
                    C = F;
                 }
              }
           }
           break;
       case T_FCT :
           if (InstallOn) {
              if (InstallOn < 3) {
                 bcopy((void*)(C+1),(void*)&T,n);
                 T2=fctByCode(T);
                 _MODIF_FCT_INST_(T2);
                 _MODIF_FCT_TYP_(2);
              } else {
                 _MODIF_FCT_INST_(VIDE);
                 _MODIF_FCT_TYP_(0);
              }
              InstallOn=0;
           } else {
              bcopy((void*)(C+1),(void*)&T,n);
              execCod(T);
              /* free context loops */
              if (Do_Evts) { /* quit or cut */
                 /*printf("execCod T_FCT : Evts %d\n",Do_Evts);*/
                 if (InDo) {
                    if (Do_Evts>0) {
                       C=ADo_Leave;
                       I_DO--;
                       InDo = 0;
                       Do_Evts--;
                    } else {
                       C=ADo_Next;
                       Do_Evts=0;
                    }
                 } else { /* quit */
                    C = F;
                 }
              }
           }
           break;
       case T_FCTDS :
       case T_EXEKS :
           if ((S = getString()) != NULL)
              free((void*)S); /* remove the string */
           break;
       case T_FCTD :
           if ((S = getString()) != NULL)
              free((void*)S); /* remove the string */
           if (noErr()) break;
       case T_FCTDW :
       case T_FCTP :
              bcopy((void*)(C+1),(void*)&T,n);
              FR = (struct Fct *)T;
              execCod(FR->c);
              /* free context loops */
              if (Do_Evts) { /* quit or cut */
                 /*printf("execCod T_FCTD : Evts %d\n",Do_Evts);*/
                 if (InDo) {
                    if (Do_Evts>0) {
                       C=ADo_Leave;
                       I_DO--;
                       InDo = 0;
                       Do_Evts--;
                    } else {
                       C=ADo_Next;
                       Do_Evts=0;
                    }
                 } else { /* quit */
                    C = F;
                 }
              }
           if (*C == T_FCTP) {
              if (mFCTP) *C = T_FCTDW;
              else *C = T_FCTD;
           }
           break;
       case T_EXEK :
           if ((S = getString()) != NULL) {
              if (strlen(S)>0) { /* to do with T_FCTD */
                 mFCTP=0;
                 T = makeFunction(S);
                 if (T != VIDE) {
                    bcopy((void*)&T, (void*)(C+1),n);
                    *C = T_FCTP;
                    C -= (n+1);
                    unlinkLastFct();
                    /* upgrading precedent code ? not always ! */
                    if (C >= D) {
                       if (*C == T_CHA) { /* case of a string */
                          *C = T_CHAS;
                          mFCTP=1;
                       }
                       if (*C == T_VAR) { /* case of a variable string */
                          bcopy((void*)(C+1),(void*)&W,n);
                          if (isVarChar(W)) {
                             *C = T_VARS;
                             mFCTP=1;
                          }
                       }
                    }
                 } else /* error in compilation */
                    *C = T_EXEKS;
              }
              free((void*)S); 
           }
           break;
       case T_IF :
           if (!getBool()) {
               bcopy((void*)(C+1),(void*)&L,n);
               C += L;
           }
           break;
       case T_IFN :
           if (getBool()) {
               bcopy((void*)(C+1),(void*)&L,n);
               C += L;
           }
           break;
       case T_DO :
           I_DO++;
           InDo=1;
           /* maj do_adresses */
           W = C + (2*(n+1));
           bcopy((void*)(W+1),(void*)&L,n);
           ADo_Leave=D+L-n-1;
           ADo_Next=ADo_Leave-(2*(n+1));
           /* printf("execCod T_DO : AL= %d AN=%d\n",
                (int)(ADo_Leave-D), (int)(ADo_Next-D));*/
           getParLong(&P);
           D_DO[I_DO] = P;
           getParLong(&P);
           L_DO[I_DO] = P;
           if (P > D_DO[I_DO]) S_DO[I_DO]=0;
           else S_DO[I_DO]=1;
           break;
       case T_DO_I :
           IF_getIndDo(0);
           break;
       case T_DO_J :
           IF_getIndDo(1);
           break;
       case T_DO_K :
           IF_getIndDo(2);
           break;
       case T_IFD :
           if (S_DO[I_DO]) {
             if (D_DO[I_DO] > L_DO[I_DO]) {
               bcopy((void*)(C+1),(void*)&L,n);
               C += L;
             } else {
               I_DO--;
               InDo=0;
             }
           } else {
             if (D_DO[I_DO] < L_DO[I_DO]) {
               bcopy((void*)(C+1),(void*)&L,n);
               C += L;
             } else {
               I_DO--;
               InDo=0;
             }
           }
           break;
       case T_LOOP :
           if (S_DO[I_DO]) D_DO[I_DO]--;
           else D_DO[I_DO]++;
           break;
       case T_PLOO :
           getParLong(&P);
           D_DO[I_DO]+=P;
           break;
       case T_JMP :
           bcopy((void*)(C+1),(void*)&L,n);
           C += L;
           break;
       case T_GOTO :
           bcopy((void*)(C+1),(void*)&L,n);
           C = D + L - n-1;
           break;
       case T_VAR  :
           if (InstallOn) {
              if (InstallOn  == 3) {
                 bcopy((void*)(C+1),(void*)&T,n);
                 _MODIF_FCT_INST_(T);
                 _MODIF_FCT_TYP_(3);
              } else {
                 _MODIF_FCT_INST_(VIDE);
                 _MODIF_FCT_TYP_(0);
              }
              InstallOn=0;
           } else {
              bcopy((void*)(C+1),(void*)&W,n);
              executeVar(W);
              /* free context loops */
              if (Do_Evts) { /* quit or cut */
                 /*printf("execCod T_VAR : Evts %d\n",Do_Evts);*/
                 if (InDo) {
                    if (Do_Evts>0) {
                       C=ADo_Leave;
                       I_DO--;
                       InDo = 0;
                       Do_Evts--;
                    } else {
                       C=ADo_Next;
                       Do_Evts=0;
                    }
                 } else { /* quit */
                    C = F;
                 }
              }
           }
           break;
       case T_BKC :
           bcopy((void*)(C+1),(void*)&W,n);
           execLib(W);
           break;
       case T_BKC1 : /* like makeFct */
           bcopy((void*)(C+1),(void*)&W,n);
           /* try to modify the code */
           if (VARS==2) { /* VARS UP */
              if ((T = varByName(W)) != VIDE) {
                 *C = T_VAR;
              } else {
                 if ((T = fctByName(W)) != VIDE) {
                    *C = T_FCT;
                    FR = (struct Fct *)T;
                    T = FR->c;
                 }
              }
           } else {
              if ((T = fctByName(W)) != VIDE) {
                 *C = T_FCT;
                 FR = (struct Fct *)T;
                 T = FR->c;
              } else {
                 if ((VARS==1) && ((T = varByName(W)) != VIDE)) {
                    *C = T_VAR;
                 }
              }
           }
           if ((Code)*C != T_BKC1) { /* code is updated */
              bcopy((void*)&T, (void*)(C+1),n);
              C-=(n+1);       /* it must be executed */
           }
           break;
       case T_NOP :
       case T_CHAS :
       case T_VARS :
       case T_FCTDWS :
           break;
       default :
           messErr(11);
       }
       C+= n+1;
    }
    D_Cod--;
    if (ea) tellOnErr(VIDE);
}
Exemplo n.º 4
0
static void scanFoncI(void * AdF, int marge)
{
void *A, *W;
struct Fct * N;
int i,n, ea, Ea, *ai;
long L;
char * C, *F, *D, lm[6];
    N = (struct Fct *)AdF;
    *lm = '\0';
    A = N->c;
    ai = (int*)A;
    i = *ai++;
    ea = *ai++;
    Ea = *ai;
    C = (char*)A+(3*sizeof(int));
    D = C;
    F = C+i;
    n = sizeof(A);
    if (marge) prMarge(marge);
    if (N->typ) printf ("System ");
    printf("Fonction : %s (%d) : 0x%lx\n", N->l, i, (unsigned long)A );
    if (ea+Ea) {
       if (ea) printf("Catching error at %d",ea);
       if (Ea) {
          if (ea) printf(" - ");
          printf("End label at %d",Ea);
       }
       printf("\n");
    }
    while (C < F) {
       if (marge) prMarge(marge);
       printf(" %.4d : ",(int)(C-D));
       switch((Code)*C) {
       case T_NOP :
       case T_CHAS :
       case T_VARS :
       case T_FCTDWS :
         printf("NOP\n");
         break;
       case T_FCTDS :
       case T_EXEKS :
         printf("\"drop\n");
         break;
       case T_RET :
         printf("RETURN\n");
         break;
       case T_ONER :
         printf("onerr: label\n");
         break;
       case T_END :
         printf("end: label\n");
         break;
       case T_JEND :
         printf("goto end:\n");
         break;
       case T_NUM :
         bcopy((void*)(C+1),(void*)&W,n);
         printf("Number value : ");
         printNumber(W);
         printf("\n");
         break;
       case T_CHA :
         bcopy((void*)(C+1),(void*)&W,n);
         printf("Character String \"%s\"\n",(char*)W);
         break;
       case T_LIB :
         bcopy((void*)(C+1),(void*)&W,n);
         printf("Call to library : %s\n", libByAddr(W));
         break;
       case T_FCT :
         bcopy((void*)(C+1),(void*)&W,n);
         printf("Function : %s\n", codByAddr(W));
         break;
       case T_FCTD :
         printf("\"drop + ");
       case T_FCTDW :
         bcopy((void*)(C+1),(void*)&W,n);
         N = (struct Fct *)W;
         printf("Dynamic Function at 0x%lx\n", (long)W);
         scanFoncI(W,marge+1);
         break;
       case T_IF :
         bcopy((void*)(C+1),(void*)&L,n);
         printf("IF false goto %ld\n",(C-D)+L+n+1);
         break;
       case T_DO :
         printf("DO [ LIMIT I -- ]\n");
         break;
       case T_DO_I :
         printf("GET I [ -- I ]\n");
         break;
       case T_DO_J :
         printf("GET J [ -- J ]\n");
         break;
       case T_DO_K :
         printf("GET K [ -- K ]\n");
         break;
       case T_LOOP :
         printf("I=+/-1\n");
         break;
       case T_PLOO :
         printf("I += V [ V -- ]\n");
         break;
       case T_IFN :
         bcopy((void*)(C+1),(void*)&L,n);
         printf("IF true goto %ld\n",(C-D)+L+n+1);
         break;
       case T_IFD :
         bcopy((void*)(C+1),(void*)&L,n);
         printf("IF (LIMIT NOT REACHED) goto %ld\n",(C-D)+L+n+1);
         break;
       case T_JMP :
         bcopy((void*)(C+1),(void*)&L,n);
         printf("JMP $+%ld\n",L);
         break;
       case T_GOTO :
         bcopy((void*)(C+1),(void*)&L,n);
         printf("GOTO %ld\n",L);
         break;
       case T_EXEK  :
         printf("Dynamic Compile (\"execk) !\n");
         break;
       case T_VAR  :
         bcopy((void*)(C+1),(void*)&W,n);
         printf("Call variable : %s\n", varByAddr(W));
         break;
       case T_BKC1 :
         strcpy(lm,"1st ");
       case T_BKC :
         bcopy((void*)(C+1),(void*)&W,n);
         printf("Back Compile %s: \"%s\"\n",lm, (char*)W);
         break;
       default :
           printf("0x%x : code inconnu !!\n",(int)*C);
       }
       C+= n+1;
    }
}