Contributor: ARNE DE.BRUIJN { JS> I'm looking for some sort of function to return that: JS> SOMEFILE.TXT = SOM*.TX? I've written that once. Sorry for the lack of comments. -------------- { Unit with universal wildcard search function, Arne de Bruijn, 1994, PD } unit find4dos; interface function FindName(SearchStr,NameStr:string):boolean; implementation function FindName(SearchStr,NameStr:string):boolean; assembler; { Compare SearchStr with NameStr, and allow wildcards in SearchStr. The following wildcards are allowed: *ABC* matches everything which contains ABC [A-C]* matches everything that starts with either A,B or C [ADEF-JW-Z] matches A,D,E,F,G,H,I,J,W,V,X,Y or Z ABC? matches ABC, ABC1, ABC2, ABCA, ABCB etc. ABC[?] matches ABC1, ABC2, ABCA, ABCB etc. (but not ABC) ABC* matches everything starting with ABC (for using with DOS filenames like DOS (and 4DOS), you must split the filename in the extention and the filename, and compare them seperately) } var LastW:word; asm cld push ds lds si,SearchStr les di,NameStr xor ah,ah lodsb mov cx,ax mov al,es:[di] inc di mov bx,ax or cx,cx jnz @ChkChr or bx,bx jz @ChrAOk jmp @ChrNOk xor dh,dh @ChkChr: lodsb cmp al,'*' jne @ChkQues dec cx jz @ChrAOk mov dh,1 mov LastW,cx jmp @ChkChr @ChkQues: cmp al,'?' jnz @NormChr inc di or bx,bx je @ChrOk dec bx jmp @ChrOk @NormChr: or bx,bx je @ChrNOk {From here to @No4DosChr is used for [0-9]/[?]/[!0-9] 4DOS wildcards...} cmp al,'[' jne @No4DosChr cmp word ptr [si],']?' je @SkipRange mov ah,byte ptr es:[di] xor dl,dl cmp byte ptr [si],'!' jnz @ChkRange inc si dec cx jz @ChrNOk inc dx @ChkRange: lodsb dec cx jz @ChrNOk cmp al,']' je @NChrNOk cmp ah,al je @NChrOk cmp byte ptr [si],'-' jne @ChkRange inc si dec cx jz @ChrNOk cmp ah,al jae @ChkR2 inc si {Throw a-Z < away} dec cx jz @ChrNOk jmp @ChkRange @ChkR2: lodsb dec cx jz @ChrNOk cmp ah,al ja @ChkRange {= jbe @NChrOk; jmp @ChkRange} @NChrOk: or dl,dl jnz @ChrNOk inc dx @NChrNOk: or dl,dl jz @ChrNOk @NNChrOk: cmp al,']' je @NNNChrOk @SkipRange: lodsb cmp al,']' loopne @SkipRange jne @ChrNOk @NNNChrOk: dec bx inc di jmp @ChrOk @No4DosChr: cmp es:[di],al jne @ChrNOk inc di dec bx @ChrOk: xor dh,dh dec cx jnz @ChkChr { Can't use loop, distance >128 bytes } or bx,bx jnz @ChrNOk @ChrAOk: mov al,1 jmp @EndR @ChrNOk: or dh,dh jz @IChrNOk jcxz @IChrNOk or bx,bx jz @IChrNOk inc di dec bx jz @IChrNOk mov ax,[LastW] sub ax,cx add cx,ax sub si,ax dec si jmp @ChkChr @IChrNOk: mov al,0 @EndR: pop ds end; end.