⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int_controls.c

📁 LastWave
💻 C
字号:
/*..........................................................................*//*                                                                          *//*      L a s t W a v e   K e r n e l   3 . 0                               *//*                                                                          *//*      Copyright (C) 1998-2002 Emmanuel Bacry.                             *//*      email : lastwave@cmap.polytechnique.fr                              *//*                                                                          *//*..........................................................................*//*                                                                          *//*      This program is a free software, you can redistribute it and/or     *//*      modify it under the terms of the GNU General Public License as      *//*      published by the Free Software Foundation; either version 2 of the  *//*      License, or (at your option) any later version                      *//*                                                                          *//*      This program is distributed in the hope that it will be useful,     *//*      but WITHOUT ANY WARRANTY; without even the implied warranty of      *//*      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *//*      GNU General Public License for more details.                        *//*                                                                          *//*      You should have received a copy of the GNU General Public License   *//*      along with this program (in a file named COPYRIGHT);                *//*      if not, write to the Free Software Foundation, Inc.,                *//*      59 Temple Place, Suite 330, Boston, MA  02111-1307  USA             *//*                                                                          *//*..........................................................................*/#include "lastwave.h"#include "signals.h"#include "images.h"#include "int_fsilist.h"void C_Break(char **argv){  NoMoreArgs(argv);    if (!IsLoop()) Errorf("'break' command cannot be called outside of the body of a loop");    SetBreakFlag();}void C_Continue(char **argv){  NoMoreArgs(argv);    if (!IsLoop()) Errorf("'continue' command cannot be called outside of the body of a loop");    SetContinueFlag();}void C_Return(char **argv){  char *result;  char flag;  LWFLOAT f;    argv = ParseArgv(argv,tWORD_,NULL,&result,0);  SetReturnFlag();  if (result) {    flag = toplevelCur->flagStoreResult;    toplevelCur->flagStoreResult = YES;    /* Conversion automatique ?????? A ENLEVER faire return = returnv */    if (ParseFloat_(result,0,&f)) SetResultFloat(f);    else SetResultStr(result);          toplevelCur->flagStoreResult = flag;    toplevelCur->flagReturn = YES;  }   else toplevelCur->flagReturn = NO;}void C_Returnv(char **argv){  char *expr,*type;  LWFLOAT f;  VALUE val;  char flag;      if (*argv == NULL) {     SetReturnFlag();    toplevelCur->flagReturn = NO;    return;  }      argv = ParseArgv(argv,tWORD,&expr,-1);    if (*argv != NULL) {    if (argv[1] != NULL) ErrorUsage();    if (strcmp(argv[0],"-e")) ErrorUsage();    type = NULL;  }  else {        type = ParseFloatValLevel_(levelCur,expr,&f,&val,AnyType,AnyType,YES);    if (type == NULL) Errorf1("");  }  SetReturnFlag();  flag = toplevelCur->flagStoreResult;  toplevelCur->flagStoreResult = YES;    if (type == NULL) SetResultStr(expr);  else if (val != NULL) SetResultValue(val);  else SetResultFloat(f);  toplevelCur->flagStoreResult = flag;  toplevelCur->flagReturn = YES;}/* * The 'for' loop * *    for {beginScript} {whileExpr} {nextScript} {bodyScript} */ void C_For(char **argv){  SCRIPT beginScript,nextScript,bodyScript;  char *whileExpr;  LWFLOAT result;     argv = ParseArgv(argv,tSCRIPT,&beginScript,tWORD,&whileExpr,tSCRIPT,&nextScript,tSCRIPT,&bodyScript,0);    EvalScript(beginScript,NO);    StartLoop();    while (1) {      if (!ParseNumLevel_(levelCur,whileExpr,&result,YES,YES,YES)) {      if (*whileExpr == '{') Errorf("The test of an 'for' clause should not be within {}");       Errorf1("");      }        if (result == 0) break;    EvalScript(bodyScript,NO);    if (IsReturnFlag() || IsBreakFlag()) break;    if (IsContinueFlag()) ClearStopFlag();    EvalScript(nextScript,NO);  }       EndLoop();}/* * The 'foreach' loop * *    foreach var {list} {body} */ void C_Foreach(char **argv){  char *var;  VALUE val;  char *type;  LISTV lv;  char **list;  LWFLOAT f;  SIGNAL sig;  RANGE rg;  SCRIPT bodyScript;  int i;  LWFLOAT x;   /* Parse the variable name */  argv = ParseArgv(argv,tVNAME,&var,-1);    /* Parse the value */  if (ParseVal_(*argv,NULL,&val) == NO) Errorf1("");  type = GetTrueTypeValue(val);  argv++;  /* Parse the script */  argv = ParseArgv(argv,tSCRIPT,&bodyScript,0);    /* Start the loop */  StartLoop();    /*    * Case of a listv    */  if (type == listvType) {    lv = CastValue(val,LISTV);        for (i=0;i<lv->length;i++) {      if (lv->values[i] == NULL) SetNumVariable(var,lv->f[i]);      else SetVariable(var,lv->values[i]);                EvalScript(bodyScript,NO);            SetVariable(var,nullValue);      if (IsReturnFlag() || IsBreakFlag()) break;      if (IsContinueFlag()) ClearStopFlag();    }  }       /*    * Case of a list    */  else if (type == strType) {    list = GetListFromStrValue(CastValue(val,STRVALUE));        while (1) {      if (*list == NULL) break;      SetStrVariable(var,*list);      list++;      EvalScript(bodyScript,NO);      if (IsReturnFlag() || IsBreakFlag()) break;      if (IsContinueFlag()) ClearStopFlag();    }  }  /*    * Case of a number    */  else if (type == numType) {    f = CastValue(val,NUMVALUE)->f;    SetNumVariable(var,f);    EvalScript(bodyScript,NO);    if (IsContinueFlag()) ClearStopFlag();  }  /*    * Case of a signal    */  else if (type == signalType) {    sig = CastValue(val,SIGNAL);    for (i=0;i<sig->size;i++) {      SetNumVariable(var,sig->Y[i]);                EvalScript(bodyScript,NO);      if (IsReturnFlag() || IsBreakFlag()) break;      if (IsContinueFlag()) ClearStopFlag();    }  }  /*    * Case of a range    */  else if (type == rangeType) {    rg = CastValue(val,RANGE);        for (x=RangeFirst(rg),i=0;i<rg->size;i++,x+=rg->step) {      SetNumVariable(var,x);                EvalScript(bodyScript,NO);      if (IsReturnFlag() || IsBreakFlag()) break;      if (IsContinueFlag()) ClearStopFlag();    }  }    /* Error */  else Errorf("Bad type '%s' to perform a foreach loop on (only &listv,&list,&signal,&num,&range)",type);       EndLoop();}/* * The 'while' loop * *    while {test} {bodyScript} */ void C_While(char **argv){  SCRIPT bodyScript;  char *whileExpr;  LWFLOAT result;     argv = ParseArgv(argv,tWORD,&whileExpr,-1);    StartLoop();  bodyScript = NULL;  while (1) {    if (!ParseNumLevel_(levelCur,whileExpr,&result,YES,YES,YES)) {      if (*whileExpr == '{') Errorf("The test of a 'while' clause should not be within {}");       Errorf1("");      }    if (result == 0) break;    if (bodyScript == NULL) {     argv = ParseArgv(argv,tSCRIPT,&bodyScript,0);    }        EvalScript(bodyScript,NO);    if (IsReturnFlag() || IsBreakFlag()) break;    if (IsContinueFlag()) ClearStopFlag();  }       EndLoop();}/* * The 'do' loop * *    do {bodyScript} {test}  */ void C_Do(char **argv){  SCRIPT bodyScript;  char *whileExpr;  LWFLOAT result;     argv = ParseArgv(argv,tSCRIPT,&bodyScript,tWORD,&whileExpr,0);  StartLoop();  while (1) {    EvalScript(bodyScript,NO);    if (IsReturnFlag() || IsBreakFlag()) break;    if (IsContinueFlag()) ClearStopFlag();    if (!ParseNumLevel_(levelCur,whileExpr,&result,YES,YES,YES)) {      if (*whileExpr == '{') Errorf("The test of a 'do' clause should not be within {}");       Errorf1("");      }    if (result == 0) break;  }       EndLoop();}/* * if {expr} {body1} elseif {expr} {body2} .... else {bodyn} * */ void C_If(char **argv){  char *test;  SCRIPT bodyScript;  LWFLOAT result;       while (1) {       argv = ParseArgv(argv,tWORD,&test,-1);    if (!ParseNumLevel_(levelCur,test,&result,NO,YES,YES)) {      if (*test == '{') Errorf("The test of an 'if' clause should not be within {}");       Errorf1("");    }            if (*argv == NULL) Errorf("BodyScript is missing (Check that the '{' is not misplaced)");    /* Test is successful */    if (result) {      argv = ParseArgv(argv,tSCRIPT,&bodyScript,-1);      EvalScript(bodyScript,toplevelCur->flagStoreResult);      return;    }    argv++;    if (*argv == NULL) return;        /* Case of an else */    if (!strcmp(*argv,"else")) {      argv++;      argv = ParseArgv(argv,tSCRIPT,&bodyScript,0);      EvalScript(bodyScript,toplevelCur->flagStoreResult);      return;    }        /* case of an elseif */    if (!strcmp(*argv,"elseif")) {      argv++;      continue;    }        Errorf("If : Too many arguments");  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -