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