int CMessageEditorDlg::find_event()
{
	char *str;
	int i, formula, node;
	CComboBox *box;

	for (i=0; i<Num_mission_events; i++) {
		node = Mission_events[i].formula;
		if (find_operator(CTEXT(node)) == OP_WHEN) {
			node = CDR(node);
			formula = CAR(node);  // bool conditional
			if (CDR(CDR(node)) == -1) {  // only 1 action
				node = CADR(node);
				if ((find_operator(CTEXT(node)) == OP_SEND_MESSAGE) && !stricmp(CTEXT(CDR(CDR(CDR(node)))), m_message_name)) {
					box = (CComboBox *) GetDlgItem(IDC_SENDER);
					str = CTEXT(CDR(node));
					m_sender = box->FindStringExact(-1, str);
					if (m_sender == CB_ERR)
						m_sender = 0;

					box = (CComboBox *) GetDlgItem(IDC_PRIORITY);
					str = CTEXT(CDR(CDR(node)));
					m_priority = box->FindStringExact(-1, str);
					if (m_priority == CB_ERR)
						m_priority = 0;

					return i;
				}
			}
		}
	}

	m_sender = m_priority = 0;
	return -1;
}
Exemple #2
0
svalue_t evaluate_function(int start, int stop)
{
  svariable_t *func = NULL;
  int startpoint, endpoint;

  // the arguments need to be built locally in case of
  // function returns as function arguments eg
  // print("here is a random number: ", rnd() );
  
  int argc;
  svalue_t argv[MAXARGS];

  if (tokens[start].type != TO_function || tokens[stop].type != TO_oper || tokens[stop].v[0] != ')')
    script_error("misplaced closing bracket\n");
  // all the functions are stored in the global script
  else if (!(func = global_script.variableforname(tokens[start].v)))
    script_error("no such function: '%s'\n", tokens[start].v);
  else if (func->type != svt_function)
    script_error("'%s' not a function\n", tokens[start].v);

  if (killscript) return nullvar; // one of the above errors occurred

  // build the argument list
  // use a C command-line style system rather than
  // a system using a fixed length list

  argc = 0;
  endpoint = start + 2;   // ignore the function name and first bracket
  
  while (endpoint < stop)
    {
      startpoint = endpoint;
      endpoint = find_operator(startpoint, stop-1, ",");
      
      // check for -1: no more ','s 
      if (endpoint == -1)
	endpoint = stop; // evaluate the last expression

      if (endpoint-1 < startpoint)
	break;
      
      argv[argc] = evaluate_expression(startpoint, endpoint-1);
      endpoint++;    // skip the ','
      argc++;
    }

  // store the arguments in the global arglist
  t_argc = argc;
  t_argv = argv;

  if(killscript) return nullvar;
  
  // now run the function
  func->value.handler();
  
  // return the returned value
  return t_return;
}
Exemple #3
0
void Dag::construct_dag(InsCtrl*& ins)
{
	InsCtrl* new_ins=new InsCtrl(ins->sstab);	//get the stack symbol table
	last_oper=0;
	std::vector<FBlock*> ins_fblk=ins->get_all_func_block();
	for(int i=0;i<ins_fblk.size();i++)
	{
		FBlock* fblk=ins_fblk[i];
		for(int j=0;j<fblk->all_blocks.size();j++)
		{
			BBlock* bblk=fblk->all_blocks[j];
			if(!bblk->has_array())	//we currently do not consider arraies, migh
			{
				for(int k=0;k<bblk->all_ins.size();k++)
				{
					Quadcode* q=bblk->all_ins[k];
				
					Quadcode* code=NULL;
					Quadcode::Quad_type oper=q->get_quad_type();
 					symbol* src_arg1=NULL;
 					symbol* src_arg2=NULL;
 					symbol* obj_arg=NULL;
					unsigned int index1;
					unsigned int index2;
					unsigned int index3;
					switch(oper)
					{
					case  Quadcode::ASSIGN:
						src_arg1=q->get_src_arg()[0];
						obj_arg=q->get_obj_arg();
						if(!find_sym(src_arg1,symbol_nodeNum,index1))	//cannot find the src node in the dag tree
						{
							index1=dag_nodes.size();
							dag_nodes.push_back(new DNode(src_arg1));	//src first leave node
							update_node(src_arg1,index1);	//update the src symbol index
						}
						update_node(obj_arg,index1);	//update the obj arg, and the index num is the tree node index obj was assigned to
						assignment[last_oper].push_back(std::pair<symbol*, unsigned int>(obj_arg,index1));	//assign information, the index begin with 0
						break;
					case Quadcode::ADD:
					case Quadcode::SUB:
					case Quadcode::MUL:
					case Quadcode::DIV:
						src_arg1=q->get_src_arg()[0];
						src_arg2=q->get_src_arg()[1];
						obj_arg=q->get_obj_arg();
						if(!find_sym(src_arg1,symbol_nodeNum,index1))	//cannot find the src node in dag tree
						{
							index1=dag_nodes.size();
							dag_nodes.push_back(new DNode(src_arg1));
							update_node(src_arg1,index1);
						}
						if(!find_sym(src_arg2,symbol_nodeNum,index2))
						{
							index2=dag_nodes.size();
							dag_nodes.push_back(new DNode(src_arg2));
							update_node(src_arg2,index2);
						}
						if(!find_operator(oper,operators,dag_nodes,index1,index2,index3))
						{
							index3=dag_nodes.size();
							dag_nodes.push_back(new DNode(oper,index1,index2));
							operators[oper].insert(index3);
							last_oper=dag_nodes.size();
						}
						update_node(obj_arg,index3);
						assignment[last_oper].push_back(std::pair<symbol*,unsigned int>(obj_arg,index3));
						break;
					case Quadcode::INV:
						src_arg1=q->get_src_arg()[0];
						obj_arg=q->get_obj_arg();
						if(!find_sym(src_arg1,symbol_nodeNum,index1))
						{
							index1=dag_nodes.size();
							dag_nodes.push_back(new DNode(src_arg1));
							update_node(src_arg1,index1);
						}
						if(!find_operator(oper,operators,dag_nodes,index1,index2))
						{
							index2=dag_nodes.size();
							dag_nodes.push_back(new DNode(oper,index1));
							operators[oper].insert(index2);
							last_oper=dag_nodes.size();
						}
						update_node(obj_arg,index2);
						assignment[last_oper].push_back(std::pair<symbol*,unsigned int>(obj_arg,index2));
						break;
					case Quadcode::CALL:
					case Quadcode::SIND:
						output_quadcode(*new_ins);
						src_arg1=q->get_src_arg()[0];
						obj_arg=q->get_obj_arg();
						if(obj_arg==NULL)
							code=Quadcode::new_Quad_code(oper,src_arg1);
						else code=Quadcode::new_Quad_code(oper,obj_arg,src_arg1);
						new_ins->new_instruction(code);
						break;

					case Quadcode::JMP:
					case Quadcode::LABEL:
//					case Quadcode::READ:
					case Quadcode::WRITE:
					case Quadcode::PUSH:
					case Quadcode::SREF:
						output_quadcode(*new_ins);
						src_arg1=q->get_src_arg()[0];
						code=Quadcode::new_Quad_code(oper,src_arg1);
						new_ins->new_instruction(code);
						break;
					case Quadcode::FUNC:
					case Quadcode::MAIN:
					case Quadcode::ENDF:
					case Quadcode::ENDM:
					case Quadcode::PARAM:
					case Quadcode::READ:
						output_quadcode(*new_ins);
						obj_arg=q->get_obj_arg();
						code=Quadcode::new_Quad_code(oper,obj_arg);
						new_ins->new_instruction(code);
						break;
					case Quadcode::JEQ:
					case Quadcode::JGE:
					case Quadcode::JGT:
					case Quadcode::JLE:
					case Quadcode::JLT:
					case Quadcode::JNE:
						output_quadcode(*new_ins);
						src_arg1=q->get_src_arg()[0];
						src_arg2=q->get_src_arg()[1];
						obj_arg=q->get_src_arg()[2];
						code=Quadcode::new_Quad_code(oper,obj_arg,src_arg1,src_arg2);
						new_ins->new_instruction(code);
						break;
					case Quadcode::LINE:
						output_quadcode(*new_ins);
						code=Quadcode::new_Quad_code(oper);
						new_ins->new_instruction(code);
						break;
					default:
						assert(0);
					}
				
//					std::cout<<"y  "<<*q;
					q->disable();
					}
					output_quadcode(*new_ins);
				}
				else
				{
					for(int m=0;m<bblk->all_ins.size();m++)
					{//	std::cout<<"s  "<<*bblk->all_ins[m];
						new_ins->new_instruction(bblk->all_ins[m]);
					}
					output_quadcode(*new_ins);
				}				
			}
			output_quadcode(*new_ins);
	}

	delete ins;
	new_ins->reorder_all_ins();
	std::ofstream file("block_dag.txt",std::ios::out);
	std::vector<FBlock*> blo=new_ins->get_all_func_block();
	for(int i1=0;i1<blo.size();i1++)
	{
		file<<*blo[i1];
	}
	ins=new_ins;
}
Exemple #4
0
svalue_t OPstructure(int start, int n, int stop)
{
  svariable_t *func = NULL;
  
  // the arguments need to be built locally in case of
  // function returns as function arguments eg
  // print("here is a random number: ", rnd() );
  
  int argc;
  svalue_t argv[MAXARGS];

  // all the functions are stored in the global script
  if( !(func = variableforname(&global_script, tokens[n+1]))  )
    script_error("no such function: '%s'\n",tokens[n+1]);
  
  else if(func->type != svt_function)
    script_error("'%s' not a function\n", tokens[n+1]);

  if(killscript) return nullvar; // one of the above errors occurred
  
  // build the argument list

  // add the left part as first arg

  argv[0] = evaluate_expression(start, n-1);
  argc = 1; // start on second argv

  if(stop != n+1)         // can be a.b not a.b()
    {
      int startpoint, endpoint;

      // ignore the function name and first bracket
      endpoint = n + 3;
      
      while(endpoint < stop)
	{
	  startpoint = endpoint;
	  endpoint = find_operator(startpoint, stop-1, ",");
	  
	  // check for -1: no more ','s 
	  if(endpoint == -1)
	    {               // evaluate the last expression
	      endpoint = stop;
	    }
	  if(endpoint-1 < startpoint)
	    break;
	  
	  argv[argc] = evaluate_expression(startpoint, endpoint-1);
	  endpoint++;    // skip the ','
	  argc++;
	}
    }

  // store the arguments in the global arglist
  t_argc = argc;
  t_argv = argv;
  
  if(killscript) return nullvar;
  
  // now run the function
  func->value.handler();
  
  // return the returned value
  return t_return;
}