Contributor: RICHARD KOENIG
program wildcards;
{***************************************************************************=
*
 * Ren=82 Schwietzke Richard-Koenig-Str. 08 D-04916 Herzberg GERMANY =
 *
 * =
 *
 * Internet: rs@informatik.tu-cottbus.de =
 *
=
 ***************************************************************************=
*
 * This is my implementation of a simple wildcard recognizer. =
 *
 * Try it ! =
 *
 * Please check the correctness, report all bugs and say your opinion. =
 *
 * =
 *
 * written in Borland Pascal 7.0 with using of exit, break and continue =
 *
=
 ***************************************************************************=
*
}
uses crt; {only for this demo}
{ * :>= 0 letters
 for example:
 *A : words with>= 1 letters and A at the end
 A*A : words with>= 2 letters and A at the begin and end=20
 A* : words with>= 1 letters and A at the begin
 =20
 ? : one letter
 Combine it !
 See the examples at the end.}
{********** this function returns true if input_word= wilds=
 ****************}
Function Wild(input_word,wilds:String;upcase_wish:boolean):Boolean;
 {looking for next *, returns position and string until position}
 function search_next(var wilds:string):word;
 var position,position2:word;
 begin
 position:=pos('*',wilds); {looks for *}
 if position0 then wilds:= copy(wilds,1,position-1);
 {returns the string}
 search_next:= position;
 end;
 {compares a string with '?' and another,
 returns the position of helpwilds in input_word}
 function find_part(helpwilds,input_word:string):word;
 var q,q2,q3,between:word;
 diff:integer;
 begin
 q:= pos('?',helpwilds);
 if q= 0 then
 begin
 {if no '?' in helpwilds}
 find_part:= pos(helpwilds,input_word);
 exit;
 end;
 {'?' in helpwilds}
 diff:= length(input_word)-length(helpwilds);
 if diff<0 then begin find_part:= 0;exit;end; between:= 0; {now move helpwilds over input_word} for q:= 0 to diff do begin for q2:= 1 to length(helpwilds) do begin if (input_word[q+q2]= helpwilds[q2]) or (helpwilds[q2]= '?') then begin if q2= length(helpwilds) then begin find_part:= q+1;exit;end;end else break; end; end; find_part:= 0; end; {************************** MAIN ******************************************} { this is the mainpart of wild } var cwild,cinput_word:word;{counter for positions} q,lengthhelpwilds:word; maxinput_word,maxwilds:word;{length of input_word and wilds} helpwilds:string; begin wild:= false; {uncomment this for often use with 'wildcardless' wilds} {if wilds= input_word then begin wild:= true;exit;end;} {delete '**', because '**'= '*'} repeat q:= pos('**',wilds); if q0 then
 wilds:= copy(wilds,1,q-1)+'*'+copy(wilds,q+2,255);
 until q= 0;
 {for fast end, if wilds only '*'}
 if wilds= '*' then begin wild:= true;exit;end;
 maxinput_word:= length(input_word);
 maxwilds := length(wilds);
 {upcase all letters}
 if upcase_wish then
 begin
 for q:= 1 to maxinput_word do input_word[q]:= upcase(input_word[q]);
 for q:= 1 to maxwilds do wilds[q]:= upcase(wilds[q]);
 end;
 {set initialization}
 cinput_word:= 1;cwild:= 1;
 wild:= true;
 repeat
 {equal letters}
 if input_word[cinput_word]= wilds[cwild] then
 begin
 {goto next letter}
 inc(cwild);
 inc(cinput_word);
 continue;
 end;
 {equal to '?'}
 if wilds[cwild]= '?' then
 begin
 {goto next letter}
 inc(cwild);
 inc(cinput_word);
 continue;
 end;
 {handling of '*'}
 if wilds[cwild]= '*' then
 begin
 helpwilds:= copy(wilds,cwild+1,maxwilds);{takes the rest of wilds}
 q:= search_next(helpwilds);{search the next '*'}
 lengthhelpwilds:= length(helpwilds);
 if q= 0 then
 begin
 {no '*' in the rest}
 {compare the ends}
 if helpwilds= '' then exit;{'*' is the last letter}
 {check the rest for equal length and no '?'}
 for q:= 0 to lengthhelpwilds-1 do
 if (helpwilds[lengthhelpwilds-q]input_word[maxinput_word-q]) and
 (helpwilds[lengthhelpwilds-q]'?') then
 begin wild:= false;exit;end;
 exit;
 end;
 {handle all to the next '*'}
 inc(cwild,1+lengthhelpwilds);
 q:= find_part(helpwilds,copy(input_word,cinput_word,255));
 if q= 0 then begin wild:= false;exit;end;
 cinput_word:= q+lengthhelpwilds;
 continue;
 end;
 wild:= false;exit;
 until (cinput_word>maxinput_word) or (cwild>maxwilds);
 {no completed evaluation}
 if cinput_word<= maxinput_word then wild:= false;
 if cwild<= maxwilds then wild:= false;
end;
begin
 clrscr;
 {examples with the right result 'T' or 'F'}
 writeln(wild('Gebauer','G?bauer',false),' T');
 writeln(wild('Heiter','*r*s',false),' F');
 writeln(wild('L=94ffler','*r*s',false),' F');
 writeln(wild('Trinks','*r*s',false),' T');
 writeln(wild('Schwietzke','*e*e*',false),' T');
 writeln(wild('Endemann','*e*e*',false),' F');
 writeln(wild('Schwietzke','Schwietzke',false),' T');
 writeln(wild('Schwietzke','*',false),' T');
 writeln(wild('Schwietzke','Schwi*',false),' T');
 writeln(wild('Schwietzke','*tzke',false),' T');
 writeln(wild('Schwietzke','S?hwie*e',false),' T');
 writeln(wild('Schwietzke','S*??*e',false),' T');
 writeln(wild('Schwietzke','S*e',false),' T');
 writeln(wild('Schwietzke','*e',false),' T');
 writeln(wild('Schwietzke','S*k*',false),' T');
 writeln(wild('Schwietzke','S??w??tzke',false),' T');
 writeln(wild('Schwietzke','Sch*?t*ke',false),' T');
 writeln(wild('Schwietzke','Sch*k',false),' F');
 writeln(wild('Schwietzke','Sch*i?t*k?',false),' T');
 writeln(wild('Physik in =9Abersichten','?*',false),' T');
 writeln(wild('Physik in =9Abersichten','P*??*en',false),' T');
 writeln(wild('Alle Physik in =9Abersichten Physik in Ablagen',
 '*n Physik*',false),' T');
 {Thank's for testing and using.}
 {Ren=82 Schwietzke 01-16-1995}
end.


AltStyle によって変換されたページ (->オリジナル) /