/* Z3func02 - Zcpr3 access functions for C */ #include #include "z3env.h" #ifndef BDSC struct env *envadr; #endif /* Shell manipulation */ /* Push command onto shell stack. Returns TRUE if successful. */ int shpush(cl) char *cl; { char *p; int i,j,size; #ifdef BDSC struct env *zenv(), *envadr; envadr = zenv(); #endif p = envadr->shstk; size = envadr->shsize; /* used a lot so remove a bit of indirection */ if(p) { if(strlen(cl) > size) return(FALSE); /* gag if entry is too large */ for(i=j=0;i < envadr->shstks-1;++i) j+=size; /* faster than a multiply */ if(*(p+j) != '\0') /* test that stack is not full */ return(FALSE); /* gag if it is */ movmem(p,p+size,j); /* push all entries down 1 */ setmem(p,size,0); /* clear out entire entry */ strncpy(p,cl,size); /* copy onto stack */ return(TRUE); } else return(FALSE); } /* Pop shell stack. Returns TRUE if successful. */ int shpop() { char *p, *q; int i,j,size; #ifdef BDSC struct env *zenv(), *envadr; envadr = zenv(); #endif p = envadr->shstk; size = envadr->shsize; if(p && *p) { if(envadr->shstks > 1) { for(i=j=0;i < envadr->shstks-1;++i) j+=size; /* faster than a multiply */ if(j) movmem(p+size,p,j); /* all remaining entries down 1 */ p+=j; /* point to empty entry at end of stack */ } setmem(p,size,0); /* clear out entire empty entry */ return(TRUE); } else return(FALSE); } /* Test for shell stack empty */ int shempty() { #ifdef BDSC struct env *zenv(); return(*(zenv().shstk) ? FALSE : TRUE); #else return(*(envadr->shstk) ? FALSE : TRUE); #endif } /* Test for shell stack full */ int shfull() { int i,j; #ifdef BDSC struct env *zenv(), *envadr; envadr = zenv(); #endif for(i=j=0;i < envadr->shstks-1;++i) j+=envadr->shsize; /* faster than a multiply */ return(*(envadr->shstk+j) != '\0'); }