Ejemplo n.º 1
0
StateMachinePtr construct_asm(BindingsPtr bindings, NodePtr root,
      const AbstractStateMachineTable& asmt) {
   assert(root && root->get_op() == Op::abstract_state_machine);
   assert(root->size() == 4 || root->size() == 5);
   int argi = 0;
   std::string name = root->get_operand(argi++)->get_token().get_text();
   std::string base_sm;
   if (root->size() == 5) {
      base_sm = root->get_operand(argi++)->get_token().get_text();
   }
   NodePtr vars = root->get_operand(argi++);
   NodePtr funcs = root->get_operand(argi++);
   NodePtr rules = root->get_operand(argi++);
   StateMachinePtr sm = std::make_shared<StateMachine>(bindings, name);
   if (base_sm != "") {
      AbstractStateMachineTable::const_iterator it = asmt.find(base_sm);
      if (it == asmt.end()) {
	 throw Exception(root->get_operand(1)->get_location(),
	    "no such abstract state machine");
      }
      sm->import_asm(it->second);
   }
   assert(vars->get_op() == Op::sm_vars);
   if (vars->size() > 0) {
      add_vars(sm, vars->get_operand(0));
   }
   assert(funcs->get_op() == Op::sm_functions);
   if (funcs->size() > 0) {
      add_functions(sm, funcs->get_operand(0));
   }
   add_rules(sm, bindings, rules);
   return sm;
}
Ejemplo n.º 2
0
static void add_vars(StateMachinePtr sm, NodePtr root) {
   if (root->get_op() == Op::sm_var_declarations) {
      add_vars(sm, root->get_operand(0));
      root = root->get_operand(1);
   }
   assert(root->get_op() == Op::sm_var_declaration);
   StateMachine::VarKind varkind;
   if (root->get_operand(0)->get_op() == Op::SHARED) {
      varkind = StateMachine::sharedVar;
   } else {
      varkind = StateMachine::privateVar;
   }
   std::string varname = root->get_operand(1)->get_token().get_text();
   if (root->size() == 2) {
      sm->add_var(varkind, varname, root->get_location());
   } else {
      sm->add_var(varkind, varname, root->get_operand(2), root->get_location());
   }
}
Ejemplo n.º 3
0
void value_set_analysis_fivrt::initialize(
  const goto_functionst &goto_functions)
{
  baset::initialize(goto_functions);
  add_vars(goto_functions);
}
Ejemplo n.º 4
0
void value_set_analysis_fivrt::initialize(
  const goto_programt &goto_program)
{
  baset::initialize(goto_program);
  add_vars(goto_program);
}
Ejemplo n.º 5
0
int main(int argc, char **argv)
{
	int i, j;
	struct kvvec *kvv, *kvv2, *kvv3;
	struct kvvec_buf *kvvb, *kvvb2;
	struct kvvec k = KVVEC_INITIALIZER;

	t_set_colors(0);

	t_start("key/value vector tests");
	kvv = kvvec_create(1);
	kvv2 = kvvec_create(1);
	kvv3 = kvvec_create(1);
	add_vars(kvv, test_data, 1239819);
	add_vars(kvv, (const char **)argv + 1, argc - 1);

	kvvec_sort(kvv);
	kvvec_foreach(kvv, NULL, walker);

	/* kvvec2buf -> buf2kvvec -> kvvec2buf -> buf2kvvec conversion */
	kvvb = kvvec2buf(kvv, KVSEP, PAIRSEP, OVERALLOC);
	kvv3 = buf2kvvec(kvvb->buf, kvvb->buflen, KVSEP, PAIRSEP, KVVEC_COPY);
	kvvb2 = kvvec2buf(kvv3, KVSEP, PAIRSEP, OVERALLOC);

	buf2kvvec_prealloc(kvv2, kvvb->buf, kvvb->buflen, KVSEP, PAIRSEP, KVVEC_ASSIGN);
	kvvec_foreach(kvv2, kvv, walker);

	kvvb = kvvec2buf(kvv, KVSEP, PAIRSEP, OVERALLOC);

	test(kvv->kv_pairs == kvv2->kv_pairs, "pairs should be identical");

	for (i = 0; i < kvv->kv_pairs; i++) {
		struct key_value *kv1, *kv2;
		kv1 = &kvv->kv[i];
		if (i >= kvv2->kv_pairs) {
			t_fail("missing var %d in kvv2", i);
			printf("[%s=%s] (%d+%d)\n", kv1->key, kv1->value, kv1->key_len, kv1->value_len);
			continue;
		}
		kv2 = &kvv2->kv[i];
		if (!test(!kv_compare(kv1, kv2), "kv pair %d must match", i)) {
			printf("%d failed: [%s=%s] (%d+%d) != [%s=%s (%d+%d)]\n",
				   i,
				   kv1->key, kv1->value, kv1->key_len, kv1->value_len,
				   kv2->key, kv2->value, kv2->key_len, kv2->value_len);
		}
	}

	test(kvvb2->buflen == kvvb->buflen, "buflens must match");
	test(kvvb2->bufsize == kvvb->bufsize, "bufsizes must match");

	if (kvvb2->buflen == kvvb->buflen && kvvb2->bufsize == kvvb->bufsize &&
		!memcmp(kvvb2->buf, kvvb->buf, kvvb->bufsize))
	{
		t_pass("kvvec -> buf -> kvvec conversion works flawlessly");
	} else {
		t_fail("kvvec -> buf -> kvvec conversion failed :'(");
	}

	free(kvvb->buf);
	free(kvvb);
	free(kvvb2->buf);
	free(kvvb2);
	kvvec_destroy(kvv, 1);
	kvvec_destroy(kvv3, KVVEC_FREE_ALL);

	for (j = 0; pair_term_missing[j]; j++) {
		buf2kvvec_prealloc(&k, strdup(pair_term_missing[j]), strlen(pair_term_missing[j]), '=', ';', KVVEC_COPY);
		for (i = 0; i < k.kv_pairs; i++) {
			struct key_value *kv = &k.kv[i];
			test(kv->key_len == kv->value_len, "%d.%d; key_len=%d; value_len=%d (%s = %s)",
				 j, i, kv->key_len, kv->value_len, kv->key, kv->value);
			test(kv->value_len == strlen(kv->value),
				 "%d.%d; kv->value_len(%d) == strlen(%s)(%d)",
				 j, i, kv->value_len, kv->value, (int)strlen(kv->value));
		}
	}

	t_end();
	return 0;
}