00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <stdlib.h>
00021 #include <stdio.h>
00022
00023 #include "../command.h"
00024
00025
00026
00027
00028
00029
00030 static int IsTrue(VARIABLE v){
00031
00032 if( memory_IsUndef(v) )return 0;
00033 switch( TYPE(v) ){
00034 case VTYPE_LONG:
00035 if( LONGVALUE(v) )return 1; else return 0;
00036 case VTYPE_DOUBLE:
00037 if( DOUBLEVALUE(v) )return 1; else return 0;
00038 case VTYPE_STRING:
00039 if( * STRINGVALUE(v) == (char)0 )return 0; else return 1;
00040 case VTYPE_ARRAY:
00041 return 0;
00042 }
00043 return 0;
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00112 COMMAND(SLIF)
00113 #if NOTIMP_WHEN
00114 NOTIMPLEMENTED;
00115 #else
00116 NODE nGoForward;
00117 VARIABLE ItemResult;
00118
00119 ItemResult = EVALUATEEXPRESSION(PARAMETERNODE);
00120 ASSERTOKE;
00121
00122
00123 nGoForward = pEo->CommandArray[pEo->ProgramCounter-1].Parameter.NodeList.rest;
00124
00125 if( nGoForward ){
00126 nGoForward = pEo->CommandArray[nGoForward-1].Parameter.NodeList.rest;
00127 }
00128
00129 if( ! IsTrue(ItemResult) ){
00130 SETPROGRAMCOUNTER(nGoForward);
00131 RETURN;
00132 }
00133 #endif
00134 END
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 COMMAND(IF)
00148 #if NOTIMP_IF
00149 NOTIMPLEMENTED;
00150 #else
00151 NODE nItem;
00152 NODE nGoForward;
00153 NODE nCode;
00154 VARIABLE ItemResult;
00155
00156 while(1){
00157 nItem = PARAMETERNODE;
00158 ItemResult = EVALUATEEXPRESSION(nItem);
00159 ASSERTOKE;
00160 NEXTPARAMETER;
00161
00162 nGoForward = PARAMETERNODE;
00163 nCode = CAR(nGoForward);
00164
00165 switch( OPCODE(nCode) ){
00166 case CMD_ELSE:
00167 case CMD_ENDIF:
00168
00169 nGoForward = CDR(nGoForward);
00170 break;
00171 case CMD_ELSIF:
00172 break;
00173 default:;
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 if( IsTrue(ItemResult) ){
00186 SETPROGRAMCOUNTER(pEo->CommandArray[pEo->ProgramCounter-1].Parameter.NodeList.rest);
00187 RETURN;
00188 }else{
00189 if( OPCODE(nCode) == CMD_ELSIF ){
00190 pEo->ProgramCounter = nGoForward;
00191 _ActualNode=PROGRAMCOUNTER;
00192 }else{
00193 SETPROGRAMCOUNTER(nGoForward);
00194 RETURN;
00195 }
00196 }
00197 }
00198 #endif
00199 END
00200
00201 COMMAND(ELSE)
00202 #if NOTIMP_ELSE
00203 NOTIMPLEMENTED;
00204 #else
00205
00206
00207 SETPROGRAMCOUNTER(PARAMETERNODE);
00208
00209 #endif
00210 END
00211
00212 COMMAND(ENDIF)
00213 #if NOTIMP_ENDIF
00214 NOTIMPLEMENTED;
00215 #else
00216
00217
00218 #endif
00219 END
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 COMMAND(ELSIF)
00233 #if NOTIMP_ELSIF
00234 NOTIMPLEMENTED;
00235 #else
00236
00237 NEXTPARAMETER;
00238 SETPROGRAMCOUNTER(PARAMETERNODE);
00239
00240 #endif
00241 END