home *** CD-ROM | disk | FTP | other *** search
- #include "all.h"
- #include "regtabext.h"
-
- ForCommand() /*procedure for loop*/
- {
- int i, j, k;
-
- SToI( command.cmdWord[2], &i);
- SToI( command.cmdWord[3], &j);
- if (strlen(command.cmdWord[4])==0) {
- strcpy(command.cmdWord[4],"1");
- }
- SToI( command.cmdWord[4], &k);
- if ( (k==0) || ( (i<j) && (k<0) ) || ( (i>j) && (k>0) ) ) {
- ErrMsg("bad parameters in for");
- }
- if (!SetVar( command.cmdWord[1], command.cmdWord[2] ) ) {
- ErrMsg("couldnt create variable in for statement");
- }
- if (loops.numLoops < maxLoops) {
- loops.lineNum[loops.numLoops] = mem.stack[mem.stackPtr];
- strcpy( loops.varName[loops.numLoops], command.cmdWord[1] );
- loops.endValue[loops.numLoops] = j;
- loops.increment[loops.numLoops] = k;
- loops.numLoops++;
- }
- else {
- ErrMsg("too many levels of for loops");
- }
- }
-
- NextCommand()
- {
- int i, j, match;
- char vVal[80], vNam[80];
-
- match = FALSE;
- for( i=0; i<maxLoops; i++ ) {
- if( strcmp(command.cmdWord[1],loops.varName[i])==0) {
- match = TRUE;
- break;
- }
- }
- if (!match) {
- ErrMsg("next has no corresponding for");
- }
- strcpy( vNam, "@" );
- strcat( vNam, command.cmdWord[1] );
- match = GetVar( vNam, vVal );
- if (!match) {
- ErrMsg("couldnt find for loop variable");
- }
- SToI( vVal, &j );
- j=j + loops.increment[i];
- IToS( j, vVal );
- if ( !SetVar(command.cmdWord[1], vVal) ) {
- ErrMsg("couldnt set for loop variable");
- }
- if( ((loops.increment[i]>0) && (loops.endValue[i]<j)) ||
- ((loops.increment[i]<0) && (loops.endValue[i]>j)) ) {
- DelVar(command.cmdWord[1]);
- if (i<(loops.numLoops-1)) {
- for (j=i+1; j<loops.numLoops; j++ ) {
- loops.lineNum[j-1]=loops.lineNum[j];
- strcpy(loops.varName[j-1],loops.varName[j]);
- loops.endValue[j-1] =loops.endValue[j];
- loops.increment[j-1] = loops.increment[j];
- } /*end for*/
- } /*end if*/
- loops.numLoops--;
- }
- else {
- if (loops.lineNum[i] < (*prText)->nLines) {
- mem.stack[ mem.stackPtr ] = loops.lineNum[i];
- }
- else {
- ErrMsg("attempt to jump off end of procedure memory");
- }
- }
- }
-
- ReturnCommand()
- {
- int i, tempBoolean;
- if (!mem.active) {
- ErrMsg("cant return from console");
- }
- else if (mem.stackPtr==0) { /*return to console*/
- NoPendingInput();
- mem.active = FALSE;
- mem.stackPtr = -1;
- for (i=0; i<loops.numLoops; i++ ) { /*delete any loop variables*/
- tempBoolean = DelVar(loops.varName[i]);
- }
- loops.numLoops = 0;
- }
- else { /*return to next level of subroutines*/
- mem.stackPtr--;
- }
- }
-