using memset withing a pure function
D_Learner via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Aug 14 18:09:13 PDT 2015
When writting a pure fucntion involving C non pure functions like
memcpy() and memset() , what could be the way around? Should I
re-write these and make them pure?
The code am converting is as below :-
int ag_cmatch(const string pattern, const string text,
int[char] bmBc , int[size] bmGs ) pure { //Start of AG search
algorithm
int i,j,k , s, shift;
int[size] skip;
int[size] suff;
int m = to!int(pattern.length);
int n = to!int(text.length);
int position = -1;
/* Preprocessing */
memset(&skip[0], 0, m* int.sizeof); // Initialise skip table
/* searching */
j = 0;
while(j<=n-m){
i=m-1;
while( i >= 0){ // Start inner while
k = skip[i];
s = suff[i];
if( k > 0)
if( k > s){
//writeln(" Int Size 3 ", int.sizeof);
if(i+1 == s)
i = (-1);
else {
i -=s;
//writeln("Innner while loop .....Found............... ");
break;
}
}
else{
i-=k;
if( k < s ){
// writeln("Innner while loop .....Found<<<<<< 1
>>>>>>............... ");
//getchar();
break;
}
}
else {
if ( pattern[i] == text[i+j]){
--i;
//writeln("Innner while loop .....Found<<<<<< 2 >>>>>> ");
}
else
break;
}
}// End inner while
if ( i< 0){
//writeln(" AG Pattern found at :", j);
position = j;//Added for display / reporting
//getchar();
// Manually added to cause a pattern found stop(Not in
documentation)
skip[m-1] = m;
shift = bmGs[0];
break;
}
else{
skip[ m-1 ] = m -1 -i;
shift = bmGs[i] > (bmBc[text[i+j]] - m + 1 + i) ? bmGs[i] :
(bmBc[text[i+j]] - m + 1 + i ) ;
}
j+=shift;
// writeln(" j Before memcpy== : ", j);
memcpy(&skip[0], &skip[0]+shift, (m-shift)*(int.sizeof));
memset(&skip[0]+(m-shift),0, shift*(int.sizeof));
}//End outer while
return position ;
}//End AG search
More information about the Digitalmars-d-learn
mailing list