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

📄 int_variable.c

📁 LastWave
💻 C
📖 第 1 页 / 共 5 页
字号:
void SetVariableLevel(LEVEL level,char *name,VALUE content){  VARIABLE v;  HASHTABLE t;  char *left,flag,*type;  VALUE *pcont;    while (level->levelVar != level) level = level->levelVar;  t = level->theVariables;    /* Get the variable (eventually creates it) */  v = GetVariableHT(&t, YES, name, &left, &flag);  if (v==NULL || flag != 0 || *left != '\0') Errorf1("");  /* Get a pointer to the content and the type */  pcont =  GetVariablePContent(v, NO);  type = GetTypeValue(*pcont);    /* Check overwriting */  if (!DoesTypeOverwrite(type,GetTypeValue(content)))     Errorf("SetVariableLevel() : Cannot overwrite variable '%s' of type '%s' with '%s' typed value",name,type,GetTypeValue(content));  /* Delete the content */  DeleteValue(*pcont);    /* And sets it */  *pcont = content;  AddRefValue(content);}   void SetVariable(char *name,VALUE content){  SetVariableLevel(levelCur,name,content);}/*  * Send a SetField message to the content 'value' with the field 'field' the FSIList 'fsiList' and put the result * It returns what the message returned */void *SetFieldArg(VALUE value, void **arg){  Field *f;  if (value->ts == NULL) return((*(value->sendMessage))(value,SetFieldMsge,arg));  if (IsVariable(value)) return(SetFieldVar(value,arg));  if (GetTrueTypeValue(value) == arrayType) Errorf("SetField() : weird");      f = FindField(value->ts->fields,arg[0]);  if (f == NULL) {    SetErrorf("Bad field name '%s'",arg[0]);    return(NULL);  }  if (f->Set == NULL) {    SetErrorf("Read only field '%s'",arg[0]);    return(NULL);  }  return(SetFieldValue(*f,value,arg));}static void *SetField(VALUE value, char *field, FSIList *fsiList,char *type, LWFLOAT fltSet, VALUE vcSet, char *equal, VALUE *pValueRes, LWFLOAT *pfltRes, char **pstrRes){  void *arg[9];    arg[0] = field;  arg[1] = fsiList;  arg[2] = type;  arg[3] = &fltSet;  arg[4] = &vcSet;    arg[5] = equal;  arg[6] = pValueRes;  arg[7] = pfltRes;  arg[8] = pstrRes;  return(SetFieldArg(value,arg));  }/* * Subroutine to set the content of a variable * */static unsigned char SetVariableLevelExpr_(char *equal, LEVEL level, VALUE value, char *begin, char **left, char *type, LWFLOAT fltSet, VALUE vcSet, ExprDefParam *defParam, VALUE *pValueRes, LWFLOAT *pfltRes, char **pstrRes){  static STRVALUE sc = NULL;  char *field, *begin1;  char *type1;  char name[MaxNameLength];  LWFLOAT f1;  VALUE vc1;  char *str1;  void *arg[7];  ExtractInfo *ei,extractInfo;  unsigned long optionFlag;  FSIList *list;  void *answer;  char **options;  char flagNull;/*  * Main loop  */ while (1) {  begin1 = begin;    /* Get the type of the current content */  type1 = GetTypeValue(value);    /*    * case 'value[]'   */  if (*begin == '[') {      /* must get the extract options */    begin++;    ParamSkipSpace(begin);        /* We must get the extract info */    arg[0] = NULL;    options = GetExtractOptionsValue(value,arg);    if (options == NULL) {      SetErrorf("No extraction possible on '%s'",type1);      return(0);    }    if (*begin == '*') Errorf("Sorry no *options yet for setting variables");    optionFlag = 0;    arg[1] = &optionFlag;    ei = GetExtractInfoValue(value,arg);    if (ei == NULL) {      if (!IsErrorMsge()) SetErrorf("No extraction possible");      return(0);    }        /* Copy the info */    extractInfo = *ei;          /* Extract list */    ParamSkipSpace(begin);    flagNull = NO;    if (*begin != ']') {      list = SFIListExpr(begin, left, &extractInfo,defParam);      if (list == NULL || list->nx == 0) flagNull = YES;    }    else list = SFIListExpr(begin, left, &extractInfo,defParam);    if (list==NULL) return(0);    list->options = optionFlag;    /* Read the matching bracket */       if ((**left)!=']') {      SetErrorf("Cannot find the matching bracket");       DeleteFSIList(list);      *left = begin;      return(0);    }    begin = *left;    begin++;    ParamSkipSpace(begin);    /* If no '.' or no '[' after then send a SetField message */    if (*begin != '.' && *begin != '[') {      if (flagNull == YES) {        *pValueRes = value;        DeleteFSIList(list);        return(1);      }      answer = SetField(value,NULL,list,type,fltSet,vcSet,equal,pValueRes,pfltRes,pstrRes);      if (answer == NULL) *left = NULL;          DeleteFSIList(list);      return(answer!=NULL);    }        /* Case of value[]. or value[][] */    else {      if (flagNull == YES) {        *pValueRes = nullValue;        type1 = nullType;      }      else type1 = GetField(value,NULL,list,pfltRes,pstrRes,pValueRes);      if (*pstrRes == NULL && *pValueRes == NULL) {        DeleteFSIList(list);        *left = begin;        SetErrorf("No extraction or field allowed to numbers");        return(0);      }      if (*pstrRes != NULL) {        DeleteFSIList(list);        *left = begin;        SetErrorf("Sorry, cannot manage this case of extraction (as left value)");        return(0);      }      value = *pValueRes;      *pValueRes = NULL;      DeleteFSIList(list);      continue;    }      }    /*    * case 'value.'   */  if (*begin == '.') {    begin++;        /*      * Get the field name      */    field = begin;    while (IsValidSymbolChar(*begin)) begin++;        /*      * Case value.field[]     */    if (*begin == '[') {      begin1 = begin;      /* Get the name of the field in the variable 'name' */      if (begin-field+1 > MaxNameLength) Errorf("SetVariableLevelExpr() : field name is too long");      strncpy(name,field,begin-field);      name[begin-field] = '\0';      /* must get the extract options */      begin++;      ParamSkipSpace(begin);      arg[0] = name;      options = GetExtractOptionsValue(value,arg);      if (*begin == '*') Errorf("Sorry no *options yet for setting variables");          /* We must get the extract info : we have to understand who to send the message to */      arg[0] = name;      optionFlag = 0;      arg[1] = &optionFlag;      /* If no options then it means we have to get the field itself and the corresponding extractInfo */      if (options == NULL) {        if((type1 = GetField(value,name,NULL,&f1,&str1,&vc1)) == NULL) return(0);        if (vc1 == NULL && str1 == NULL) {          SetErrorf("No extraction for a number");          return(0);        }                /* Get the extract info of the field */        if (vc1 == NULL) {          if (sc == NULL) sc = NewNullStrValue();          sc->str = str1;          vc1 = (VALUE) sc;          arg[0] = NULL;          ei = GetExtractInfoValue(vc1,arg);          field = name;          value = vc1;        }        else {          arg[0] = NULL;          field = NULL;          value = vc1;          options = GetExtractOptionsValue(value,arg);          if (options == NULL) {            SetErrorf("No extraction for '%s'",GetTypeValue(value));            return(0);          }          ei = GetExtractInfoValue(vc1,arg);        }      }      /* Otherwise we get the extract info directly */      else {        ei = GetExtractInfoValue(value,arg);        field = name;      }      if (ei == NULL) {        if (!IsErrorMsge()) SetErrorf("No extraction possible");        return(0);      }      extractInfo = *ei;              /* Build the corresponding fsiList */      ParamSkipSpace(begin);      flagNull = NO;      if (*begin != ']') {        list = SFIListExpr(begin, left, &extractInfo,defParam);        if (list == NULL || list->nx == 0) flagNull = YES;      }      else list = SFIListExpr(begin, left, &extractInfo,defParam);       if (list==NULL) return(0);      list->options = optionFlag;      /* Skip the ']' */      if (**left != ']') {        *left = begin1;        DeleteFSIList(list);        SetErrorf("Missing the corresponding ']'");        return(0);      }      *left +=1;            /* If there is a [ or a . after --> performs a get and continue */      if (**left == '[' || **left == '.') {        if (value == (VALUE) sc) {          DeleteFSIList(list);          SetErrorf("Syntax error");          return(0);        }        if (flagNull) {          vc1 = nullValue;          type1 = nullType;        }        else if ((type1 = GetField(value,field,list,&f1,&str1,&vc1)) == NULL) return(0);        if (vc1 == NULL && str1 == NULL) {          DeleteFSIList(list);          SetErrorf("No extraction or field for a number");          return(0);        }        if (str1 != NULL) {          DeleteFSIList(list);          SetErrorf("Case not implemented yet");          return(0);        }        value = vc1;        begin = *left;        DeleteFSIList(list);        continue;      }              /* It should be the end of the expression */      if (**left != '\0') {        DeleteFSIList(list);        SetErrorf("End of right handside expression expected");        return(0);      }              /* We have to send the set message */      if (flagNull) {        DeleteFSIList(list);        *pValueRes = value;        return(1);      }       answer = SetField(value,field,list,type,fltSet,vcSet,equal,pValueRes,pfltRes,pstrRes);      if (answer == NULL) *left = NULL;      DeleteFSIList(list);      return(answer!=NULL);    }       /*      * Case value.field     */        else if (*begin == '\0') {          /*       * case value is an array       */      if (type1 == arrayType) {        /* We get the element named 'field' in the array 'value' */        value = (VALUE) GetSimpleVariableHT((HASHTABLE) value,field,*equal=='=');        if (value == NULL) {          *left = field;          SetErrorf("field does not exist");          return(0);        }        /* And then we set it with the value --> RETURN */        answer = SetField(value,NULL,NULL,type,fltSet,vcSet,equal,pValueRes,pfltRes,pstrRes);        if (answer == NULL) *left = NULL;        return(answer!=NULL);      }            /*       * case value is not an array --> we just send a setfield message --> RETURN        */            else {        answer = SetField(value,field,NULL,type,fltSet,vcSet,equal,pValueRes,pfltRes,pstrRes);        if (answer == NULL) *left = NULL;        return(answer!=NULL);      }    }        /*     * Case value.field.     */    else if (*begin == '.') {      /* Get the name of the field in the variable 'name' */      if (begin-field+1 > MaxNameLength) Errorf("SetVariableLevelExpr() : field name is too long");      strncpy(name,field,begin-field);      name[begin-field] = '\0';            /*       * Case 'value' is an array        */      if (type1 == arrayType) {                /* Get the element named 'field' in the array 'value' and creates an array if it does not exist */        value = (VALUE) GetSimpleVariableHT(((HASHTABLE) value),name, 2*(*equal=='='));        if (value == NULL) {          *left = field;          SetErrorf("Field does not exist");          return(0);        }                /* Set the new value --> LOOP */        value = ValueOf(value);        continue;      }            /*       * Case 'value' is not an array        */      else {        /* Get the field 'field' of 'value' and its type */        if((type1 = GetField(value,name,NULL,&f1,&str1,&vc1)) == NULL) return(0);        /*         * We must set the new 'value' wit hthe value of the field          */                 /* Case we need to create a numcontent  */        if (type1 == numType && vc1 == NULL) {          value = (VALUE) TNewNumValue();          SetNumValue((NUMVALUE) value,f1);        }        /* Case we need to create a strcontent  */        else if (type1 == strType && vc1 == NULL) {          value = (VALUE) TNewStrValue();          SetStrValue((STRVALUE) value,str1);        }                /* Othercases */        else value = vc1;                /* --> LOOP */        continue;      }    }    else {      *left = begin;      SetErrorf("Syntax error");      return(0);    }  }}   }/* * Function to set the content of a variable */unsigned char SetVariableLevelExpr(char *equal, LEVEL level, char *begin, char **left, char *type, LWFLOAT fltSet, VALUE vcSet, ExprDefParam *defParam, VALUE *pValueRes, LWFLOAT *pfltRes, char **pstrRes){  VARIABLE var;  char *begin1;  char name[MaxNameLength];  void *res;  LWFLOAT f;  unsigned char answer;  VALUE val;    /* skip space */  while (*begin==' ') begin++;  begin1 = begin;  /* Case of number extraction 10a */  if (*begin == '.' || isdigit(*begin)) {    val = NULL;    answer = GetNumberExtraction(begin, left, &f, &val,defParam);    if (answer == NO) return(NO);    begin = *left;    if (*begin == '\0') {      res=SetField(val,NULL,NULL,type,fltSet,vcSet,equal,pValueRes,pfltRes,pstrRes);      if (res == NULL) {*left = NULL; return(NO);} else return(YES);       }    if (*begin != '.' && *begin != '[') {      SetErrorf("Syntax error");      return(NO);    }    return(SetVariableLevelExpr_(equal,level,val,begin,left,type,fltSet,vcSet,defParam,pValueRes,pfltRes,ps

⌨️ 快捷键说明

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