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

📄 executor.cpp

📁 基于单片机的 snmp协议解析的一些原代码 给有用的 同行
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	//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 + -