📄 int_variable.c
字号:
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 + -