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); }
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; }
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; }