Esempio n. 1
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);

}
Esempio n. 2
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. 3
0
static int
check_argument_descr(struct pfq_functional_arg_descr const *arg, string_view_t expected)
{
	if (is_arg_data(arg)) {
		ptrdiff_t size = pfq_signature_sizeof(expected);
		if (size != -1) {
			if (size != arg->size) {
				pr_devel("[PFQ] invalid argument: expected " SVIEW_FMT ", pod size = %zu (size mismatch)!\n", SVIEW_ARG(expected), arg->size);
				return -EPERM;
			}
		}
		return 0;
	}

	if (is_arg_vector(arg)) {

		string_view_t type;
		ptrdiff_t size;

		if (string_view_at(expected, 0) != '[') {
			pr_devel("[PFQ] invalid argument: expected " SVIEW_FMT ", got a vector!\n", SVIEW_ARG(expected));
			return -EPERM;
		}

		type = pfq_signature_remove_extent(expected);
                if(string_view_empty(type)) {
			pr_devel("[PFQ] invalid argument: expected a non empty vector!\n");
			return -EPERM;
		}

		size = pfq_signature_sizeof(type);
		if (size != -1) {
			if (size != arg->size) {
				pr_devel("[PFQ] invalid argument: expected " SVIEW_FMT ", pod size = %zu (size mismatch)!\n", SVIEW_ARG(type), arg->size);
				return -EPERM;
			}
		}

		return 0;
	}

	if (is_arg_string(arg)) {
		if (string_view_compare(expected, "String") != 0) {
			pr_devel("[PFQ] invalid argument: expected " SVIEW_FMT ", got String!\n", SVIEW_ARG(expected));
			return -EPERM;
		}

		return 0;
	}

	if (is_arg_vector_str(arg)) {
		if (string_view_compare(expected, "[String]") != 0) {
			pr_devel("[PFQ] invalid argument: expected " SVIEW_FMT ", got [String]!\n", SVIEW_ARG(expected));
			return -EPERM;
		}

		return 0;
	}

	return -EPERM;
}