Esempio n. 1
0
File: symtable.c Progetto: pfq/PFQ
static int
__pfq_lang_symtable_register_function(struct symtable *table, const char *symbol, void *fun,
				 init_ptr_t init, fini_ptr_t fini, const char *signature)
{
	struct symtable_entry * elem;

	if (__pfq_lang_symtable_search(table, symbol) != NULL) {
		printk(KERN_INFO "[PFQ] symtable error: symbol '%s' already in use!\n", symbol);
		return -EPERM;
	}

	if (!pfq_lang_signature_check(make_string_view(signature))) {
		printk(KERN_INFO "[PFQ] symtable error: symbol '%s' bad signature '%s'!\n", symbol, signature);
		return -EFAULT;
	}

	elem = __pfq_lang_get_free_entry(table);
	if (!elem) {
		return -ENOMEM;
	}

	strncpy(elem->symbol, symbol, Q_FUN_SYMB_LEN-1);
        elem->symbol[Q_FUN_SYMB_LEN-1] = '\0';

	strncpy(elem->signature, signature, Q_FUN_SIGN_LEN-1);
        elem->signature[Q_FUN_SIGN_LEN-1] = '\0';

	elem->function = fun;
        elem->init     = init;
        elem->fini     = fini;
	return 0;
}
Esempio n. 2
0
static bool
function_signature_match(struct pfq_functional_descr const *fun, string_view_t fullsig, size_t index)
{
	const char *signature = pfq_signature_by_user_symbol(fun->symbol);
	string_view_t sig;
	size_t nargs;

	if (!signature) {
		pr_devel("[PFQ] %zu: signature_matches: strdup_user error!\n", index);
		return false;
	}

	nargs = pfq_number_of_arguments(fun);

	sig = pfq_signature_bind(make_string_view(signature), nargs);

	if (!pfq_signature_equal(sig, fullsig)) {

		pr_devel("[PFQ] %zu: invalid function: %s (%zu args bound)!\n", index, signature, nargs);
		return false;
	}

	return true;
}
Esempio n. 3
0
int main()
{
	{
		string_view_t f0 =  string_view();
		string_view_t f1 =  make_string_view("");
		string_view_t f2 =  make_string_view("CInt");
		string_view_t f3 =  make_string_view("  CInt   ");
		string_view_t f4 =  make_string_view("CInt   ");
		string_view_t f5 =  make_string_view("   CInt   ");
		string_view_t f6 =  make_string_view("Action SkBuff");
		string_view_t f7 =  make_string_view("   Action   SkBuff");
		string_view_t f8 =  make_string_view("   Action   SkBuff    ");
		string_view_t f9 =  make_string_view("Action   SkBuff    ");

		assert(compare_argument(f0, f0) == true);
		assert(compare_argument(f1, f0) == true);
		assert(compare_argument(f0, f1) == true);

		assert(compare_argument(f2, f2) == true);
		assert(compare_argument(f2, f3) == true);
		assert(compare_argument(f2, f4) == true);
		assert(compare_argument(f2, f5) == true);

		assert(compare_argument(f3, f3) == true);
		assert(compare_argument(f3, f4) == true);
		assert(compare_argument(f3, f5) == true);

		assert(compare_argument(f4, f4) == true);
		assert(compare_argument(f4, f5) == true);

		assert(compare_argument(f5, f5) == true);

		assert(compare_argument(f6, f6) == true);
		assert(compare_argument(f6, f7) == true);
		assert(compare_argument(f6, f8) == true);
		assert(compare_argument(f6, f9) == true);

		assert(compare_argument(f7, f7) == true);
		assert(compare_argument(f7, f8) == true);
		assert(compare_argument(f7, f9) == true);

		assert(compare_argument(f8, f8) == true);
		assert(compare_argument(f8, f9) == true);

		assert(compare_argument(f9, f9) == true);

		assert(compare_argument(f0, f2) == false);
		assert(compare_argument(f0, f3) == false);
		assert(compare_argument(f0, f4) == false);
		assert(compare_argument(f0, f5) == false);
		assert(compare_argument(f0, f6) == false);
		assert(compare_argument(f0, f7) == false);
		assert(compare_argument(f0, f8) == false);
		assert(compare_argument(f0, f9) == false);

	}

	{
		string_view_t f0 =  string_view();
		string_view_t f1 =  make_string_view("");
		string_view_t f2 =  make_string_view("CInt");
		string_view_t f3 =  make_string_view("  CInt   ");
		string_view_t f4 =  make_string_view("CInt   ");
		string_view_t f5 =  make_string_view("   CInt   ");
		string_view_t f6 =  make_string_view("Action SkBuff");
		string_view_t f7 =  make_string_view("   Action   SkBuff");
		string_view_t f8 =  make_string_view("   Action   SkBuff    ");
		string_view_t f9 =  make_string_view("Action   SkBuff    ");

		string_view_t f10 =  string_view();
		string_view_t f11 =  make_string_view("");
		string_view_t f12 =  make_string_view("CInt");
		string_view_t f13 =  make_string_view("  CInt  -> CInt  ");
		string_view_t f14 =  make_string_view("CInt -> (CInt)  ");
		string_view_t f15 =  make_string_view("   CInt   ");
		string_view_t f16 =  make_string_view("Action SkBuff -> ( (CInt ) )");
		string_view_t f17 =  make_string_view("   Action   SkBuff");
		string_view_t f18 =  make_string_view("   Action   SkBuff    ");
		string_view_t f19 =  make_string_view("Action   SkBuff    ");

		assert(count_outmost_brackets(f0) == 0);
		assert(count_outmost_brackets(f1) == 0);
		assert(count_outmost_brackets(f2) == 0);
		assert(count_outmost_brackets(f3) == 0);
		assert(count_outmost_brackets(f4) == 0);
		assert(count_outmost_brackets(f5) == 0);
		assert(count_outmost_brackets(f6) == 0);
		assert(count_outmost_brackets(f7) == 0);
		assert(count_outmost_brackets(f8) == 0);
		assert(count_outmost_brackets(f9) == 0);

		assert(count_outmost_brackets(f10) == 0);
		assert(count_outmost_brackets(f11) == 0);
		assert(count_outmost_brackets(f12) == 0);
		assert(count_outmost_brackets(f13) == 0);
		assert(count_outmost_brackets(f14) == 0);
		assert(count_outmost_brackets(f15) == 0);
		assert(count_outmost_brackets(f16) == 0);
		assert(count_outmost_brackets(f17) == 0);
		assert(count_outmost_brackets(f18) == 0);
		assert(count_outmost_brackets(f19) == 0);

	}

	{
		string_view_t g1 =  make_string_view("()");
		string_view_t g2 =  make_string_view("(CInt)");
		string_view_t g3 =  make_string_view("(  CInt   )");
		string_view_t g4 =  make_string_view("(CInt  )");
		string_view_t g5 =  make_string_view("(   CInt )  ");
		string_view_t g6 =  make_string_view("(Action SkBuff)");
		string_view_t g7 =  make_string_view("(  Action   SkBuff)");
		string_view_t g8 =  make_string_view("(   Action   SkBuff    )");
		string_view_t g9 =  make_string_view("(Action   SkBuff    )");

		assert(count_outmost_brackets(g1) == 1);
		assert(count_outmost_brackets(g2) == 1);
		assert(count_outmost_brackets(g3) == 1);
		assert(count_outmost_brackets(g4) == 1);
		assert(count_outmost_brackets(g5) == 1);
		assert(count_outmost_brackets(g6) == 1);
		assert(count_outmost_brackets(g7) == 1);
		assert(count_outmost_brackets(g8) == 1);
		assert(count_outmost_brackets(g9) == 1);
	}

	{
		string_view_t g1 =  make_string_view("(CInt) -> Bool");
		string_view_t g2 =  make_string_view("(  CInt   )-> Char");
		string_view_t g3 =  make_string_view("(CInt  ) ->Char");
		string_view_t g4 =  make_string_view("(   CInt )  ->(Char)");
		string_view_t g5 =  make_string_view("(Action SkBuff) ->   ( (Char))");
		string_view_t g6 =  make_string_view("(  Action   SkBuff)-> Char");
		string_view_t g7 =  make_string_view("(   Action   SkBuff    ) ->(Char)");
		string_view_t g8 =  make_string_view("(Action   SkBuff    )    -> ((  Char ))");

		assert(count_outmost_brackets(g1) == 0);
		assert(count_outmost_brackets(g2) == 0);
		assert(count_outmost_brackets(g3) == 0);
		assert(count_outmost_brackets(g4) == 0);
		assert(count_outmost_brackets(g5) == 0);
		assert(count_outmost_brackets(g6) == 0);
		assert(count_outmost_brackets(g7) == 0);
		assert(count_outmost_brackets(g8) == 0);
	}


	{
		string_view_t g1 =  make_string_view("((CInt) -> Bool)");
		string_view_t g2 =  make_string_view("((  CInt   )-> Char)");
		string_view_t g3 =  make_string_view("((CInt  ) ->Char  )");
		string_view_t g4 =  make_string_view("((   CInt )  ->(Char))");
		string_view_t g5 =  make_string_view("((Action SkBuff) ->   ( (Char)))");
		string_view_t g6 =  make_string_view("((  Action   SkBuff)-> Char)");
		string_view_t g7 =  make_string_view("((   Action   SkBuff    ) ->(Char))");
		string_view_t g8 =  make_string_view("((Action   SkBuff    )    -> ((  Char )))");

		assert(count_outmost_brackets(g1) == 1);
		assert(count_outmost_brackets(g2) == 1);
		assert(count_outmost_brackets(g3) == 1);
		assert(count_outmost_brackets(g4) == 1);
		assert(count_outmost_brackets(g5) == 1);
		assert(count_outmost_brackets(g6) == 1);
		assert(count_outmost_brackets(g7) == 1);
		assert(count_outmost_brackets(g8) == 1);
	}

	{
		string_view_t g1 =  make_string_view("(((CInt) -> Bool))");
		string_view_t g2 =  make_string_view("( ((  CInt   )-> Char) )");
		string_view_t g3 =  make_string_view("(  ((CInt  ) ->Char  ))");
		string_view_t g4 =  make_string_view("(( (   CInt )  ->(Char)) )");
		string_view_t g5 =  make_string_view("( ((Action SkBuff) ->   ( (Char))))");
		string_view_t g6 =  make_string_view("(((  Action   SkBuff)-> Char))");
		string_view_t g7 =  make_string_view("((  (   Action   SkBuff    ) ->(Char)) )");
		string_view_t g8 =  make_string_view("( ((Action   SkBuff    )    -> ((  Char ) )) )");

		assert(count_outmost_brackets(g1) == 2);
		assert(count_outmost_brackets(g2) == 2);
		assert(count_outmost_brackets(g3) == 2);
		assert(count_outmost_brackets(g4) == 2);
		assert(count_outmost_brackets(g5) == 2);
		assert(count_outmost_brackets(g6) == 2);
		assert(count_outmost_brackets(g7) == 2);
		assert(count_outmost_brackets(g8) == 2);
	}

	{
		string_view_t f0 =  string_view();
		string_view_t f1 =  make_string_view("");
		string_view_t f2 =  make_string_view("CInt");
		string_view_t f3 =  make_string_view("  CInt   ");
		string_view_t f4 =  make_string_view("CInt   ");
		string_view_t f5 =  make_string_view("   CInt   ");
		string_view_t f6 =  make_string_view("Action SkBuff");
		string_view_t f7 =  make_string_view("   Action   SkBuff");
		string_view_t f8 =  make_string_view("   Action   SkBuff    ");
		string_view_t f9 =  make_string_view("Action   SkBuff    ");
		string_view_t f10 =  make_string_view("(CInt) -> Bool");
		string_view_t f11 =  make_string_view("(  CInt   )-> Char");
		string_view_t f12 =  make_string_view("(CInt  ) ->Char");
		string_view_t f13 =  make_string_view("(   CInt )  ->(Char)");
		string_view_t f14 =  make_string_view("(Action SkBuff) ->   ( (Char))");
		string_view_t f15 =  make_string_view("(  Action   SkBuff)-> Char");
		string_view_t f16 =  make_string_view("(   Action   SkBuff    ) ->(Char)");
		string_view_t f17 =  make_string_view("(Action   SkBuff    )    -> ((  Char ))");


		assert(find_next_arrow(f0) == NULL);
		assert(find_next_arrow(f1) == NULL);
		assert(find_next_arrow(f2) == NULL);
		assert(find_next_arrow(f3) == NULL);
		assert(find_next_arrow(f4) == NULL);
		assert(find_next_arrow(f5) == NULL);
		assert(find_next_arrow(f6) == NULL);
		assert(find_next_arrow(f7) == NULL);
		assert(find_next_arrow(f8) == NULL);
		assert(find_next_arrow(f9) == NULL);
		assert(find_next_arrow(f10) != NULL);
		assert(find_next_arrow(f11) != NULL);
		assert(find_next_arrow(f12) != NULL);
		assert(find_next_arrow(f13) != NULL);
		assert(find_next_arrow(f14) != NULL);
		assert(find_next_arrow(f15) != NULL);
		assert(find_next_arrow(f16) != NULL);
		assert(find_next_arrow(f17) != NULL);
	}

	printf("All test passed.\n");
	return 0;
}
Esempio n. 4
0
int
pfq_check_computation_descr(struct pfq_computation_descr const *descr)
{
        size_t entry_point = descr->entry_point, n;

	if (entry_point >= descr->size) {
		printk(KERN_INFO "[PFQ] %zu: entry_point: invalid function!\n", entry_point);
		return -EPERM;
	}

	/* check if functions are valid */

        pr_devel("[PFQ] validating computation (%zu functions)\n", descr->size);

	for(n = 0; n < descr->size; n++)
	{
		struct pfq_functional_descr const * fun = &descr->fun[n];
		const char *signature;
		size_t nargs;
		int i;

		if (fun->symbol == NULL) {
			printk(KERN_INFO "[PFQ] %zu: NULL symbol!\n", n);
			return -EPERM;
		}

		nargs = pfq_number_of_arguments(fun);

		/* get the signature */

		signature = pfq_signature_by_user_symbol(fun->symbol);
		if (!signature) {
			printk(KERN_INFO "[PFQ] resolve_signature_by_symbol: '%s' no such function!\n", fun->symbol);
			return -EPERM;
		}

		/* check for valid signature/entry_point */

		if (n == entry_point || fun->next != -1 ) {  /* next != -1 means monadic function! */

			if (!function_signature_match(fun, make_string_view("SkBuff -> Action SkBuff"), n)) {
				printk(KERN_INFO "[PFQ] %zu: %s: invalid signature!\n", n, signature);
				return -EPERM;
			}
		}

		/* check for valid function arguments */

		for(i = 0; i < nargs; i++)
		{
			string_view_t sarg = pfq_signature_arg(make_string_view(signature), i);

			if (fun->arg[i].nelem > 65536 &&
			    fun->arg[i].nelem != -1) {
				printk(KERN_INFO "[PFQ] %zu: invalid argument (%d): number of array elements is %zu!\n",
				       n, i, fun->arg[i].nelem);
				return -EPERM;
			}

			if (is_arg_function(&fun->arg[i])) {
				size_t x = fun->arg[i].size;

				if (x >= descr->size) {
					printk(KERN_INFO "[PFQ] %zu: %s: invalid argument(%d): %zu!\n",
					       n, signature, i, x);
					return -EPERM;
				}

				if (!function_signature_match(&descr->fun[x], sarg, x)) {
					printk(KERN_INFO "[PFQ] %zu: %s: invalid argument(%d): expected signature "
					       SVIEW_FMT "!\n", n, signature, i, SVIEW_ARG(sarg));
					return -EPERM;
				}
				continue;
			}

			if (check_argument_descr(&fun->arg[i], sarg) != 0) {
				printk(KERN_INFO "[PFQ] %zu: invalid argument %d!\n", n, i);
				return -EPERM;
			}
		}
	}

	return 0;
}
Esempio n. 5
0
constexpr std::array<ossia::string_view, sizeof...(Args)>
make_string_array(Args&&... args) noexcept
{
  return std::array<ossia::string_view, sizeof...(Args)>{
      make_string_view(args)...};
}
Esempio n. 6
0
int main()
{
	char buffer0[64];
	char buffer1[64];
	char buffer2[64];
	char buffer3[64];

	string_view_t s0 = make_string_view("");
	string_view_t s1 = make_string_view(" ");
	string_view_t s2 = make_string_view("(CInt )");
	string_view_t s3 = make_string_view("  (CInt )  ");

	string_view_sprintf(buffer0, string_view_trim(s0));
	string_view_sprintf(buffer1, string_view_trim(s1));
	string_view_sprintf(buffer2, string_view_trim(s2));
	string_view_sprintf(buffer3, string_view_trim(s3));

	printf("'%s'\n", buffer0);
	printf("'%s'\n", buffer1);
	printf("'%s'\n", buffer2);
	printf("'%s'\n", buffer3);

	printf("'" SVIEW_FMT "'\n", SVIEW_ARG(string_view_trim(s0)));
	printf("'" SVIEW_FMT "'\n", SVIEW_ARG(string_view_trim(s1)));
	printf("'" SVIEW_FMT "'\n", SVIEW_ARG(string_view_trim(s2)));
	printf("'" SVIEW_FMT "'\n", SVIEW_ARG(string_view_trim(s3)));


	assert( string_view_compare(string_view(), "")   == 0);
	assert( string_view_compare(make_string_view(""), "") == 0);

	assert( string_view_compare(string_view(), "1")   != 0);
	assert( string_view_compare(make_string_view(""), "1") != 0);

	assert( string_view_compare(make_string_view("test"), "") != 0);
	assert( string_view_compare(make_string_view("test"), "1") != 0);
	assert( string_view_compare(make_string_view("test"), "12") != 0);
	assert( string_view_compare(make_string_view("test"), "123") != 0);
	assert( string_view_compare(make_string_view("test"), "1234") != 0);
	assert( string_view_compare(make_string_view("test"), "12345") != 0);

	assert( string_view_compare(make_string_view("test"), "") != 0);
	assert( string_view_compare(make_string_view("test"), "t") != 0);
	assert( string_view_compare(make_string_view("test"), "te") != 0);
	assert( string_view_compare(make_string_view("test"), "tes") != 0);
	assert( string_view_compare(make_string_view("test"), "test") == 0);
	assert( string_view_compare(make_string_view("test"), "test!") != 0);

}