fis-gtm/sr_port/mur_do_wildcard.c

148 lines
4.2 KiB
C

/****************************************************************
* *
* Copyright 2001, 2004 Sanchez Computer Associates, Inc. *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#include "gdsroot.h"
#include "gdsblk.h"
#include "gdsbt.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "jnl.h"
#include "buddy_list.h"
#include "hashtab_int4.h" /* needed for muprec.h */
#include "hashtab_int8.h" /* needed for muprec.h */
#include "hashtab_mname.h" /* needed for muprec.h */
#include "muprec.h"
boolean_t mur_do_wildcard(char *jnl_str, char *pat_str, int jnl_len, int pat_len)
{
bool asterisk_not_seen=TRUE;
int pat_counter=0,count=0,jnl_counter=0,i,j=0,k=0,p,q,index1,count1=0,index2;
int sav_jnl=0,pcount=0,jcount=0;
/* correcting the length inconsistencies in padded arrays from $getjpi */
for (q = jnl_len - 1; q > 0; q--)
{
if ( (*(jnl_str + q) == ' ') || (*(jnl_str + q ) == 0))
jnl_len-- ;
else
break;
}
while ((jnl_counter < jnl_len) && (pat_counter < pat_len)) /* main loop */
{
while (( *(pat_str + pat_counter) != '*') && ( *(pat_str + pat_counter) != '%') &&
(jnl_counter < jnl_len) && (pat_counter < pat_len))
{
asterisk_not_seen = TRUE;
if ( *(jnl_str + jnl_counter) != *(pat_str + pat_counter) )
return(FALSE); /* characters do not match */
else /* go to next char */
{
jnl_counter++;
pat_counter++;
}
}
/* break out of loop if wildcard seen */
if (( *(pat_str + pat_counter) == '%') && (pat_counter < pat_len) && (jnl_counter < jnl_len))
{ /* simple case of percent: increment pointers and continue */
jnl_counter++;
pat_counter++;
} else if ( *(pat_str + pat_counter) == '*') /* gets rough ,fasten seat belts */
{
pat_counter++;
i = pat_counter;
while ((asterisk_not_seen) && (i < pat_len)) /* find the next occurrence of asterisk to memcmp */
{
if (*(pat_str + i) == '*')
asterisk_not_seen= FALSE;
else
i++;
}
if (i == pat_len) /* no asterisk found after the current one */
{
if (!memcmp(jnl_str + (jnl_len - (i - pat_counter)),pat_str + pat_counter,i - pat_counter))
return(TRUE);
else /* maybe they do not match or else it contains percent character */
{
index1 = i - pat_counter;
count = pat_counter;
while (count1 < index1)
{
if (( *(pat_str + count) == '%') ||
( *(pat_str + count) == *(jnl_str + (jnl_len - index1) + count1 )))
{
pat_counter++;
count++;
count1++;
} else
{
count1++;
count++;
}
}
if (pat_counter == pat_len)
return(TRUE);
else
return(FALSE);
}
} else if (i < pat_len) /* another asterisk seen before end of string */
{
sav_jnl = jnl_counter;
while (memcmp(jnl_str + jnl_counter, pat_str + pat_counter, i - pat_counter)
&& (jnl_counter < jnl_len))
jnl_counter++;
if (jnl_counter == jnl_len)
{
jcount = i - pat_counter;
index2 = pat_counter;
while (index2 <= (jnl_len - jcount)+1)
{
if (( *(pat_str + pat_counter) == '%') ||
( *(pat_str + pat_counter) == *(jnl_str + sav_jnl)))
{
pat_counter++;
sav_jnl++;
pcount++;
if (pcount == jcount)
break;
} else
{
sav_jnl++;
index2++;
}
}
if (jcount == pcount)
return(TRUE);
else
return(FALSE);
}
/* synchronize the character pointers after processing an asterisk */
if (i < (pat_len-1))
pat_counter = i + 1;
while ((* (jnl_str + jnl_counter) != *(pat_str + pat_counter)) &&
(jnl_counter < jnl_len) && (*(pat_str + pat_counter) != '%'))
jnl_counter++;
if (jnl_counter == jnl_len) /* if unable to synchronize */
return(FALSE);
}
}
}
if ((jnl_counter == jnl_len) && (pat_counter == pat_len))
return TRUE;
else
return FALSE;
}