fredo2906 has asked for the wisdom of the Perl Monks concerning the following question:

Coming back with a new question. I am not a pro with C, so forgive me if the code is ugly. I would like to pass an array of string to a C function, loop into it and compare each string in that array if it matches a substring. Something I am pretty sure it is very easy to accomplish, but i am having issues. I google for an example, but what I found was related to numbers. Any help, clue would be nice.
my @a = ("AAAA", "BBBB", "CCCCC"); my $size = $#a; my $p1 = pack "(A*)*", @a; print array_search($size,$p1,"B"); __END__ __C__ #include <stdio.h> void hello_world() { printf ("Hello CDRs checkers!\n"); } //s1 is the substring, s2 is the string int fastcmp ( char *p1, char *p2 ) { int i; for( i = 0; i < sizeof(p1); ++i ) { if( p1[i] != p2[i] ) { return 0; } } return 1; } int array_search(int size,char *a1, SV *s1){ STRLEN bytes1; char *p1; char *p2 = (char *) a1; long a1_size,i; p1 = SvPV(s1,bytes1); for(i=0;i<size;++i){ if (fastcmp(p1,p2[i])){ return 1; } } return 0; }

Replies are listed 'Best First'.
Re: Inline C discovery
by fredo2906 (Acolyte) on Feb 20, 2014 at 06:55 UTC
    Finally after looking deeper I found another way to handle arrays and not using pack. Update: fastcmp optimized.
    my @a = ("AAAA", "BBBB", "CCCCC"); print array_search(\@a,"B"); __END__ __C__ #include <stdio.h> void hello_world() { printf ("Hello CDRs checkers!\n"); } //s1 is the substring, s2 is the string int fastcmp ( char *p1, char *p2 ) { int count = 0; while( *p1 ){ char *a = p1, *b = p2; while( *a && *a == *b ) {a++;b++;} count += !*b; ++p1; } return count; } int array_search(AV *a1, SV *s1){ STRLEN bytes1; char *p1; long a1_size,i; a1_size = av_len(a1); //printf ("%d\n",a1_size); //printf ("%s\n",SvPV_nolen (*elem)); p1 = SvPV(s1,bytes1); for(i=0;i<=a1_size;++i){ SV** elem = av_fetch(a1, i, 0); printf("%s %s\n",p1, SvPV_nolen (*elem)); if (fastcmp(p1,SvPV_nolen (*elem)) > 0){ return 1; } } return 0; }

    This will produce :

    B AAAA String size: 1 Char at 0 is B = A B BBBB String size: 1 Char at 0 is B = B 1