148 lines
4.2 KiB
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;
|
|
}
|