コード例 #1
0
ファイル: mathops.c プロジェクト: ScriptBasic/ScriptBasic
COMMAND(MULT)
#if NOTIMP_MULT
NOTIMPLEMENTED;
#else

  NODE nItem;
  VARIABLE Op1,Op2;
  double dResult;
  long lResult,lop1,lop2;

  /* this is an operator and not a command, therefore we do not have our own mortal list */
  USE_CALLER_MORTALS;

  /* evaluate the parameters */
  nItem = PARAMETERLIST;
  Op1 = EVALUATEEXPRESSION(CAR(nItem));
  NONULOP(Op1)

  nItem = CDR(nItem);
  Op2 = EVALUATEEXPRESSION(CAR(nItem));
  NONULOP(Op2)

  /* if any of the arguments is double then the result is double */
  if( ! ISINTEGER(Op1) || ! ISINTEGER(Op2) ){
    RETURN_DOUBLE_VALUE_OR_LONG( GETDOUBLEVALUE(Op1) * GETDOUBLEVALUE(Op2) )
    }
  lop1 = GETLONGVALUE(Op1);
  lop2 = GETLONGVALUE(Op2);
  lResult = lop1 * lop2;
  if( 0 == lop1 ){
    RETURN_LONG_VALUE( lResult );
コード例 #2
0
ファイル: while.c プロジェクト: VlaBst6/ScriptBasic_Control
In case some condition makes it necessary to exit the loop from its middle then the command R<GOTO> can be used.

ScriptBasic implements several looping constructs to be compatible with different BASIC language dialects. Some constructs are even totally interchangeable to let programmers with different BASIC experience use the one that fit they the best. See also R<WHILE>, R<DOUNTIL>, R<DOWHILE>, R<REPEAT>, R<DO> and R<FOR>.
*/
COMMAND(WHILE)
#if NOTIMP_WHILE
NOTIMPLEMENTED;
#else

  NODE nItem;
  NODE nGoForward;
  VARIABLE ItemResult;

  nItem = PARAMETERNODE;
  ItemResult = EVALUATEEXPRESSION(nItem);
  ASSERTOKE;
  NEXTPARAMETER;
  /* we step forward to the node AFTER the while statement */
  nGoForward = CDR(PARAMETERNODE);
  if( memory_IsUndef(ItemResult) ){
    SETPROGRAMCOUNTER(nGoForward);
    RETURN;
    }

  switch( TYPE(ItemResult) ){
    case VTYPE_LONG:
      if( ! LONGVALUE(ItemResult) ){
        SETPROGRAMCOUNTER(nGoForward);
        RETURN;
        }