📄 executor.cpp
字号:
//fp points to function name
//read fname
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
fname = (char *)safe_alloc(strlen(token)+1,sizeof(char));
strcpy(fname,token);
memset(token,'\0',strlen(token));
//consume "("
token = get_next_token(fp,token);
memset(token,'\0',strlen(token));
//parse argument list
arghead = NULL;
argtail = NULL;
argcount = 0;
fpos = ftell(fp);
token = get_next_token(fp,token);
//1 is list empty? that is... token == ')' ?
// yes -> goto 5
// no -> goto 2
while(strcmp(token,")")!=0)
{
//2 is first argument a string?
argcount++;
if(strcmp(token,"\"")==0)
{
// yes -> read in string value -> goto 4
memset(token,'\0',strlen(token));
token[0] = (char)fgetc(fp);
stringval = (char *)safe_alloc(1024,sizeof(char));
strcpy(stringval,"");
//consume input until a quote is found
while(strcmp(token,"\"")!=0)
{
//in here I need to look for escape sequence characters
if(strcmp(token,"\\")==0)
{
memset(token,'\0',strlen(token));
token[0] = (char)fgetc(fp);
if(strcmp(token,"n")==0)
{
token[0] = '\n';
strcat(stringval,token);
}
else if (strcmp(token,"t")==0)
{
token[0] = '\t';
strcat(stringval,token);
}
else if (strcmp(token,"r")==0)
{
token[0] = '\r';
strcat(stringval,token);
}
else if (strcmp(token,"f")==0)
{
token[0] = '\f';
strcat(stringval,token);
}
else if (strcmp(token,"0")==0)
{
token[0] = '\0';
strcat(stringval,token);
}
else if (strcmp(token,"'")==0)
{
token[0] = '\'';
strcat(stringval,token);
}
else if (strcmp(token,"\"")==0)
{
token[0] = '\"';
strcat(stringval,token);
}
else if (strcmp(token,"\\")==0)
{
token[0] = '\\';
strcat(stringval,token);
}
else
{
strcat(stringval,"\\");
strcat(stringval,token);
}
}
else
strcat(stringval,token);
memset(token,'\0',strlen(token));
token[0] = (char)fgetc(fp);
}
//create new argument record and append to list
curr = (struct ARGUMENT *)safe_alloc(1,sizeof(struct ARGUMENT));
curr->arg_type = SY_STRING_TYPE;
curr->sval = (char *)safe_alloc(strlen(stringval)+1,sizeof(char));
strcpy(curr->sval,stringval);
safe_free(stringval);
if(argtail == NULL)
{
//add first node
arghead = curr;
argtail = curr;
arghead->next = NULL;
}
else
{
//append node
argtail->next = curr;
argtail = curr;
argtail->next = NULL;
}
}
else
{
fseek(fp,fpos,SEEK_SET);
//Check for pass by reference parameters
//if so then set val_type to SY_SYMBOL_TYPE and
//pass the symbol index in the ival slot.
//otherwise it is a pass by value parameter so...
if((argcount == 1 && strcmp(fname,"copy")==0) ||
(argcount == 1 && strcmp(fname,"concat")==0) ||
(argcount == 1 && strcmp(fname,"invar")==0) ||
(argcount == 1 && strcmp(fname,"getError")==0) ||
(argcount == 3 && strcmp(fname,"getError")==0) ||
(argcount == 4 && strcmp(fname,"getError")==0) ||
(argcount == 2 && strcmp(fname,"getResponseValue")==0))
{
val_type = SY_SYMBOL_TYPE;
}
else
{
//3 evaluate expression as an argument -> goto 4
val_type = evaluate_expression(fp, &intval, &floatval,
&stringval);
}
//create new arglist node
curr = (struct ARGUMENT *)safe_alloc(1,sizeof(struct ARGUMENT));
curr->arg_type = val_type;
if(val_type == SY_STRING_TYPE)
{
curr->sval = (char *)safe_alloc(strlen(stringval)+1,sizeof(char));
strcpy(curr->sval,stringval);
safe_free(stringval);
}
if(val_type == SY_FLOAT_TYPE)
{
curr->fval = floatval;
}
if(val_type == SY_INT_TYPE)
{
curr->ival = intval;
}
if(val_type == SY_SYMBOL_TYPE)
{
//read token
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
//get index of identifier in symtab
curr->ival = symbol_table_lookup(*sym_tab,token);
}
//append record to arglist
if(argtail == NULL)
{
//add first node
arghead = argtail = curr;
arghead->next = NULL;
}
else
{
//append node
argtail->next = curr;
argtail = curr;
argtail->next = NULL;
}
}
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
//4 is there a comma following?
if(strcmp(token,",")==0)
{
// yes -> goto 1
fpos = ftell(fp);
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
}
// no -> goto 5 if not a comma, it must be a close paren.
}
//5 done arglist.
safe_free(token);
//call appropriate function with appropriate arglist and fname
if(strcmp(fname,"outfile")==0)
{
retval = fh_outfile(arghead, *sym_tab);
}
if(strcmp(fname,"out")==0)
{
retval = fh_out(arghead, *sym_tab);
}
if(strcmp(fname,"infile")==0)
{
retval = fh_infile(arghead, *sym_tab);
}
if(strcmp(fname,"inuser")==0)
{
retval = fh_inuser(arghead);
}
if(strcmp(fname,"invar")==0)
{
retval = fh_invar(arghead, *sym_tab);
}
if(strcmp(fname,"randomInt")==0)
{
retval = fh_randomInt(arghead);
}
if(strcmp(fname,"randomFloat")==0)
{
retval = fh_randomFloat();
}
if(strcmp(fname,"sleep")==0)
{
retval = fh_sleep(arghead);
}
if(strcmp(fname,"intToFloat")==0)
{
retval = fh_intToFloat(arghead);
}
if(strcmp(fname,"intToString")==0)
{
retval = fh_intToString(arghead);
}
if(strcmp(fname,"stringToInt")==0)
{
retval = fh_stringToInt(arghead);
}
if(strcmp(fname,"floatToString")==0)
{
retval = fh_floatToString(arghead);
}
if(strcmp(fname,"ceiling")==0)
{
retval = fh_ceiling(arghead);
}
if(strcmp(fname,"floor")==0)
{
retval = fh_floor(arghead);
}
if(strcmp(fname,"compare")==0)
{
retval = fh_compare(arghead);
}
if(strcmp(fname,"copy")==0)
{
retval = fh_copy(arghead,*sym_tab);
}
if(strcmp(fname,"concat")==0)
{
retval = fh_concat(arghead,*sym_tab);
}
if(strcmp(fname,"beep")==0)
{
retval = fh_beep(arghead);
}
if(strcmp(fname,"getError")==0)
{
retval = fh_getError(arghead,*sym_tab);
}
if(strcmp(fname,"getResponseValue")==0)
{
retval = fh_getResponseValue(arghead,*sym_tab);
}
if(strcmp(fname,"calcCRC")==0)
{
retval = fh_calcCRC(arghead);
}
if(strcmp(fname,"getNodeInfo")==0)
{
retval = fh_getNodeInfo(arghead,nodePtr,last_node_name);
}
if(strcmp(fname,"getNodeObjects")==0)
{
retval = fh_getNodeObjects(arghead, &object_list_ptr);
}
if(strcmp(fname,"getInstance")==0)
{
retval = fh_getInstance(arghead, &object_list_ptr);
}
if(strcmp(fname,"getNextInstance")==0)
{
retval = fh_getNextInstance(arghead);
}
if(strcmp(fname,"getNodeName")==0)
{
retval = fh_getNodeName(nodePtr);
}
if(strcmp(fname,"getNodeSyntax")==0)
{
retval = fh_getNodeSyntax(nodePtr);
}
if(strcmp(fname,"getNodeAccess")==0)
{
retval = fh_getNodeAccess(nodePtr);
}
if(strcmp(fname,"getNodeStatus")==0)
{
retval = fh_getNodeStatus(nodePtr);
}
if(strcmp(fname,"getNodeDescription")==0)
{
retval = fh_getNodeDescription(nodePtr);
}
if(strcmp(fname,"getNodeOID")==0)
{
retval = fh_getNodeOID(nodePtr);
}
if(strcmp(fname,"getNodeValue")==0)
{
retval = fh_getNodeValue(nodePtr);
}
if(strcmp(fname,"getNodeMin")==0)
{
retval = fh_getNodeMin(nodePtr);
}
if(strcmp(fname,"getNodeMax")==0)
{
retval = fh_getNodeMax(nodePtr);
}
if(strcmp(fname,"getNodeTimestamp")==0)
{
retval = fh_getNodeTimestamp(nodePtr);
}
if(strcmp(fname,"setNodeAsn1Syntax")==0)
{
retval = fh_setNodeAsn1Syntax(arghead,nodePtr);
}
if(strcmp(fname,"setField_pdu")==0)
{
retval = fh_setField_pdu(arghead,sendStruct);
}
if(strcmp(fname,"setField_classtype")==0)
{
retval = fh_setField_classtype(arghead,sendStruct);
}
if(strcmp(fname,"setField_community")==0)
{
retval = fh_setField_community(arghead,sendStruct);
}
if(strcmp(fname,"setField_AddressDrop")==0)
{
retval = fh_setField_AddressDrop(arghead,sendStruct);
}
if(strcmp(fname,"setField_GroupAddress")==0)
{
retval = fh_setField_GroupAddress(arghead,sendStruct);
}
if(strcmp(fname,"setField_SizeOfTheArray")==0)
{
retval = fh_setField_SizeOfTheArray(arghead,sendStruct);
}
if(strcmp(fname,"setField_arraylist")==0)
{
retval = fh_setField_arraylist(arghead,sendStruct);
}
if(strcmp(fname,"setField_valuelist")==0)
{
retval = fh_setField_valuelist(arghead,sendStruct);
}
if(strcmp(fname,"setField_asn1syntax")==0)
{
retval = fh_setField_asn1syntax(arghead,sendStruct);
}
if(strcmp(fname,"getField_pdu")==0)
{
retval = fh_getField_pdu(recvStruct);
}
if(strcmp(fname,"getField_classtype")==0)
{
retval = fh_getField_classtype(recvStruct);
}
if(strcmp(fname,"getField_community")==0)
{
retval = fh_getField_community(recvStruct);
}
if(strcmp(fname,"getField_AddressDrop")==0)
{
retval = fh_getField_AddressDrop(recvStruct);
}
if(strcmp(fname,"getField_GroupAddress")==0)
{
retval = fh_getField_GroupAddress(recvStruct);
}
if(strcmp(fname,"getField_SizeOfTheArray")==0)
{
retval = fh_getField_SizeOfTheArray(recvStruct);
}
if(strcmp(fname,"getField_arraylist")==0)
{
retval = fh_getField_arraylist(arghead,recvStruct);
}
if(strcmp(fname,"getField_valuelist")==0)
{
retval = fh_getField_valuelist(arghead,recvStruct);
}
if(strcmp(fname,"getField_asn1syntax")==0)
{
retval = fh_getField_asn1syntax(arghead,recvStruct);
}
if(strcmp(fname,"sendStructGet")==0) //don't know if this is right, but leaving it here. Adding
{ // the following rule for "sengGet".
retval = fh_sendGet(sendStruct, // 2/10/00 CTL
LineActivityPtr,EditByteStreamPtr);
}
if(strcmp(fname,"sendGet")==0) // 2/10/00 CTL
{ // 2/10/00 CTL
retval = fh_sendGet(sendStruct, // 2/10/00 CTL
LineActivityPtr,EditByteStreamPtr);
}
if(strcmp(fname,"sendGetNext")==0)
{
retval = fh_sendGetNext(sendStruct,
LineActivityPtr,EditByteStreamPtr);
}
if(strcmp(fname,"sendSetDec")==0)
{
retval = fh_sendSetDec(sendStruct,
LineActivityPtr,EditByteStreamPtr);
}
if(strcmp(fname,"sendSetNoDec")==0)
{
retval = fh_sendSetNoDec(sendStruct,
LineActivityPtr,EditByteStreamPtr);
}
if(strcmp(fname,"sendSetAsc")==0)
{
retval = fh_sendSetAsc(sendStruct,
LineActivityPtr,EditByteStreamPtr);
}
if(strcmp(fname,"sendSetNoAsc")==0)
{
retval = fh_sendSetNoAsc(sendStruct,
LineActivityPtr,EditByteStreamPtr);
}
if(strcmp(fname,"checkProtocolMismatch")==0)
{
retval = fh_checkProtocolMismatch(arghead);
}
if(strcmp(fname,"checkInvalidResponse")==0)
{
retval = fh_checkInvalidResponse(arghead);
}
if(strcmp(fname,"checkNoResponse")==0)
{
retval = fh_checkNoResponse(arghead);
}
if(strcmp(fname,"checkEncodingStyle")==0)
{
retval = fh_checkEncodingStyle(arghead);
}
if(strcmp(fname,"checkNoInstance")==0)
{
retval = fh_checkNoInstance(arghead);
}
if(strcmp(fname,"checkObjectMismatch")==0)
{
retval = fh_checkObjectMismatch(arghead);
}
if(strcmp(fname,"checkInvalidSequence")==0)
{
retval = fh_checkInvalidSequence(arghead);
}
if(strcmp(fname,"checkInvalidLength")==0)
{
retval = fh_checkInvalidLength(arghead);
}
if(strcmp(fname,"checkScrambled")==0)
{
retval = fh_checkScrambled(arghead);
}
if(strcmp(fname,"checkInvalidAddress")==0)
{
retval = fh_checkInvalidAddress(arghead);
}
if(strcmp(fname,"checkInvalidControl")==0)
{
retval = fh_checkInvalidControl(arghead);
}
if(strcmp(fname,"checkInvalidCRC")==0)
{
retval = fh_checkInvalidCRC(arghead);
}
if(strcmp(fname,"checkInvalidIPI")==0)
{
retval = fh_checkInvalidIPI(arghead);
}
if(strcmp(fname,"clearErrorState")==0)
{
retval = fh_clearErrorState(arghead);
}
safe_free(fname);
//return result
//translate retval struct back to passed parms
if(retval && retval->arg_type == SY_STRING_TYPE)
{
*sval = (char *)safe_alloc(strlen(retval->sval)+1,sizeof(char));
strcpy(*sval,retval->sval);
safe_free(retval->sval);
}
if(retval && retval->arg_type == SY_FLOAT_TYPE)
{
*fval = retval->fval;
}
if(retval && retval->arg_type == SY_INT_TYPE)
{
*ival = retval->ival;
}
if(retval)
{
rtype = retval->arg_type;
safe_free(retval);
}
while(arghead != NULL)
{
curr = arghead;
arghead = arghead->next;
if(curr->arg_type == SY_STRING_TYPE)
safe_free(curr->sval);
safe_free(curr);
}
return(rtype);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -