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

📄 executor.cpp

📁 基于单片机的 snmp协议解析的一些原代码 给有用的 同行
💻 CPP
📖 第 1 页 / 共 4 页
字号:
      }
   }
   //if it starts with a numeric, get the next token
	numeric_val = atol(token);
   fpos = ftell(fp);
   memset(token,'\0',strlen(token));
   token = get_next_token(fp,token);
   //		if next is a '.' then get fractional part of a float and
   //		return a float value
   if(strcmp(token,".")==0)
   {
      memset(token,'\0',strlen(token));
   	token = get_next_token(fp,token);
      *fres =  (float)(numeric_val) +
      				 (float)(atol(token)/pow10(strlen(token)));
      safe_free(token);
      return(SY_FLOAT_TYPE);
   }
   else
   {
	   //if token is not a '.' then push back input and return integer value.
   	fseek(fp,fpos,SEEK_SET);
      *ires = numeric_val;
      safe_free(token);
      return(SY_INT_TYPE);
   }
}

int  evaluate_logic_expression(FILE *fp)
{
	int value;
   struct PEND_OP *list;
   struct PEND_OP *tmp;

   value = evaluate_bool2(fp);
   list = evaluate_bool1(fp);
   while(list)
   {
   	if(list->bval == 1 || value == 1)
      	value = 1;
      else
      	value = 0;

   	tmp = list;
   	list = list->next;
      safe_free(tmp);
   }
   return(value);
}

struct PEND_OP *evaluate_bool1(FILE *fp)
{
	char *token;
   long fpos;
   int value;
   struct PEND_OP *tail;
   struct PEND_OP *curr;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp,token);
   if(strcmp(token,"||")==0)
   {
   	value = evaluate_bool2(fp);
      tail = evaluate_bool1(fp);
      curr = (struct PEND_OP *)safe_alloc(1,sizeof(struct PEND_OP));
      curr->next = tail;
		curr->op_type = OR_OP;
      curr->val_type = SY_BOOLEAN_TYPE;
      curr->bval = value;
      safe_free(token);
      return(curr);
   }
   //produce an empty bool1
   fseek(fp,fpos,SEEK_SET);
   safe_free(token);
   return(NULL);
}

int  evaluate_bool2(FILE *fp)
{
	int value;
   struct PEND_OP *list;
   struct PEND_OP *tmp;

   value = evaluate_bool4(fp);
   list = evaluate_bool3(fp);
   while(list)
   {
   	if(list->bval == 1 && value == 1)
      	value = 1;
      else
      	value = 0;

   	tmp = list;
   	list = list->next;
      safe_free(tmp);
   }
   return(value);
}

struct PEND_OP *evaluate_bool3(FILE *fp)
{
	char *token;
   long fpos;
   int value;
   struct PEND_OP *tail;
   struct PEND_OP *curr;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp,token);
   if(strcmp(token,"&&")==0)
   {
   	value = evaluate_bool4(fp);
      tail = evaluate_bool3(fp);
      curr = (struct PEND_OP *)safe_alloc(1,sizeof(struct PEND_OP));
      curr->next = tail;
		curr->op_type = AND_OP;
      curr->val_type = SY_BOOLEAN_TYPE;
      curr->bval = value;
      safe_free(token);
      return(curr);
   }
   //produce an empty bool3
   fseek(fp,fpos,SEEK_SET);
   safe_free(token);
   return(NULL);
}

int  evaluate_bool4(FILE *fp)
{
	char *token;
   long fpos;
   int  val1_type;
   int  val2_type;
   long ival1;
   long ival2;
   float fval1;
   float fval2;
   char *sval1;
   char *sval2;
   int  ret_val;

  	token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   ret_val = 0;
   fpos = ftell(fp);

   //determine if this is a relational based production
   //or if it is a bool4::bool5 production
   if(parse_expr(fp))
   {
      token = get_next_token(fp,token);
      if(strcmp(token,"<")==0 || strcmp(token,">")==0 ||
      	strcmp(token,"<=")==0 || strcmp(token,">=")==0 ||
         strcmp(token,"==")==0 || strcmp(token,"!=")==0)
      {
      	if(parse_expr(fp))
         {
         	ret_val = 1;
         }
      }
   }
   //reset input pointer
   fseek(fp,fpos,SEEK_SET);

	if(ret_val)
   {
   	//expr op expr  based evaluation
      //get first expression value and type
      val1_type = evaluate_expression(fp,&ival1,&fval1,&sval1);
      //re-read the relational operator
      memset(token,'\0',strlen(token));
      token = get_next_token(fp,token);
      //get second expression value and type
      val2_type = evaluate_expression(fp,&ival2,&fval2,&sval2);
      //calculate resulting boolean value
      if(val1_type == SY_STRING_TYPE && val2_type == SY_STRING_TYPE)
      {
      	//handle all string comparisons
         ret_val = strcmp(sval1,sval2);
         if(strcmp(token,"==")==0)
         {
         	safe_free(token);
            if(ret_val == 0)
	            return(1);
            else
            	return(0);
         }
         if(strcmp(token,"!=")==0)
         {
         	safe_free(token);
            if(ret_val == 0)
            	return(0);
            else
            	return(1);
         }
         if(strcmp(token,"<")==0)
         {
         	safe_free(token);
            if(ret_val < 0)
            	return(1);
            else
            	return(0);
         }
         if(strcmp(token,">")==0)
         {
         	safe_free(token);
            if(ret_val > 0)
            	return(1);
            else
            	return(0);
         }
         if(strcmp(token,"<=")==0)
         {
         	safe_free(token);
            if(ret_val <= 0)
            	return(1);
            else
            	return(0);
         }
         if(strcmp(token,">=")==0)
         {
         	safe_free(token);
            if(ret_val >= 0)
            	return(1);
            else
            	return(0);
         }
         safe_free(token);
         return(0);
      	//no drop through allowed...
      }
      if(val1_type == SY_STRING_TYPE || val2_type == SY_STRING_TYPE)
      {
      	//invalid type matching
			info_message("Cannot compare string and numeric.\n");
         safe_free(token);
         return(0);
      	//no drop through allowed...
      }
      //valid math comparisons follow
      if(val1_type == SY_INT_TYPE)
      {
      	if(val2_type == SY_INT_TYPE)
         {
         	//int int
				if(strcmp(token,"==")==0)
            {
            	safe_free(token);
            	if(ival1 == ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"!=")==0)
            {
            	safe_free(token);
               if(ival1 != ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"<")==0)
            {
            	safe_free(token);
               if(ival1 < ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,">")==0)
            {
            	safe_free(token);
               if(ival1 > ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"<=")==0)
            {
            	safe_free(token);
               if(ival1 <= ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,">=")==0)
            {
            	safe_free(token);
               if(ival1 >= ival2)
               	return(1);
               else
               	return(0);
            }
	         safe_free(token);
   	      return(0);
      		//no drop through allowed...
         }
         else
         {
         	//int float
				if(strcmp(token,"==")==0)
            {
            	safe_free(token);
            	if(ival1 == fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"!=")==0)
            {
            	safe_free(token);
            	if(ival1 != fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"<")==0)
            {
            	safe_free(token);
            	if(ival1 < fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,">")==0)
            {
            	safe_free(token);
            	if(ival1 > fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"<=")==0)
            {
            	safe_free(token);
            	if(ival1 <= fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,">=")==0)
            {
            	safe_free(token);
            	if(ival1 >= fval2)
               	return(1);
               else
               	return(0);
            }
	         safe_free(token);
   	      return(0);
      		//no drop through allowed...
         }
      }
      else
      {
      	if(val2_type == SY_INT_TYPE)
         {
         	//float int
				if(strcmp(token,"==")==0)
            {
            	safe_free(token);
            	if(fval1 == ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"!=")==0)
            {
            	safe_free(token);
            	if(fval1 != ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"<")==0)
            {
            	safe_free(token);
            	if(fval1 < ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,">")==0)
            {
            	safe_free(token);
            	if(fval1 > ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"<=")==0)
            {
            	safe_free(token);
            	if(fval1 <= ival2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,">=")==0)
            {
            	safe_free(token);
            	if(fval1 >= ival2)
               	return(1);
               else
               	return(0);
            }
	         safe_free(token);
   	      return(0);
      		//no drop through allowed...
         }
         else
         {
         	//float float
				if(strcmp(token,"==")==0)
            {
            	safe_free(token);
            	if(fval1 == fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"!=")==0)
            {
            	safe_free(token);
            	if(fval1 != fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"<")==0)
            {
            	safe_free(token);
            	if(fval1 < fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,">")==0)
            {
            	safe_free(token);
            	if(fval1 > fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,"<=")==0)
            {
            	safe_free(token);
            	if(fval1 <= fval2)
               	return(1);
               else
               	return(0);
            }
            if(strcmp(token,">=")==0)
            {
            	safe_free(token);
            	if(fval1 >= fval2)
               	return(1);
               else
               	return(0);
            }
	         safe_free(token);
   	      return(0);
      		//no drop through allowed...
         }
      }
   }
   else
   {
   	//bool5 based evaluation
      safe_free(token);
      return(evaluate_bool5(fp));
   }
}

int  evaluate_bool5(FILE *fp)
{
	int value;
   char *token;
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   long fpos;

   fpos = ftell(fp);
   token = get_next_token(fp,token);

   if(strcmp(token,"!")==0)
   {
	   safe_free(token);
   	value = evaluate_bool6(fp);
      if(value)
      	return(0);
      else
      	return(1);
   }
   else
   {
   	fseek(fp,fpos,SEEK_SET);
	   safe_free(token);
   	return(evaluate_bool6(fp));
   }
}

int  evaluate_bool6(FILE *fp)
{
	int value;
	char *token;
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));

   //read and discard '('
   token = get_next_token(fp,token);
   memset(token,'\0',strlen(token));

   value = evaluate_logic_expression(fp);

   //read ')'
   token = get_next_token(fp,token);
   safe_free(token);
   return(value);
}

int  function_wrapper(FILE *fp, long *ival, float *fval, char **sval)
//int  function_wrapper(HANDLE fp, long *ival, float *fval, char **sval)
{
	char *token;
   char *fname;
	long fpos;
   int  val_type;
   int  rtype;
   int  argcount;
   long intval;
   float floatval;
   char *stringval;
   struct ARGUMENT *arghead;
   struct ARGUMENT *argtail;
   struct ARGUMENT *curr;
   struct ARGUMENT *retval;

⌨️ 快捷键说明

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