home *** CD-ROM | disk | FTP | other *** search
- ************************
- *** Pattern-matching ***
- ************************
- *** Einsprung: a0 = Zeiger auf Namen
- *** a1 = Zeiger auf Pattern
- *** d0 = 0 => Groß/Kleinschreibung ignorieren
- *** <> 0 => Groß/Kleinschreibung beachten
- ***
- *** Rückkehr: d0 = 1 => Pattern fehlerhaft
- *** = 0 => Übereinstimmung
- *** = -1 => Kein Übereinstimmung
- **+
- PatternMatch: move.b (a1)+,d7 ; Zeichen aus Pattern lesen
- beq.s EndMatch ; = 0 ? => Ende erreicht
- cmp.b #"?",d7 ; Einfacher Joker gefunden ?
- beq.s SingleLetter
- cmp.b #"#",d7
- beq.s MultiLetter ; "#?" gefunden ?
- move.b (a0)+,d6 ; Zeichen aus Namen lesen
- bsr.s TestChar
- tst.b d1
- beq.s PatternMatch
- bra.s NoMatch
- SingleLetter: tst.b (a0)+ ; Wegen Joker einen Buchstaben weiter
- bne.s PatternMatch ; Ende noch nicht erreicht -> weitertesten
- bra.s NoMatch ; Name zu Ende, ab Pattern enthält nach "?"
- EndMatch: tst.b (a0) ; Bei Name und Pattern am Ende ?
- beq.s TheyMatch ; Ja -> Übereinstimmung
- NoMatch: moveq #-1,d0
- rts
- TheyMatch: moveq #0,d0
- rts
- PatternError: moveq #1,d0
- rts
-
- TestChar: tst.b d0 ; Groß/Kleinschreibung ignorieren ?
- beq.s NoCase
- cmp.b d6,d7 ; Ja
- beq.s CharMatch ; Beide gleich => weitertesten
- bra.s NoCharMatch
- NoCase: or.b #32,d6 ; Bit 5 setzen => entspricht Addition
- or.b #32,d7 ; von 32, von Groß- auf Kleinbuchstaben
- cmp.b d6,d7
- beq.s CharMatch
- NoCharMatch: moveq #-1,d1
- rts
- CharMatch: moveq #0,d1
- rts
-
- MultiLetter: cmp.b #"?",(a1)+ ; Nächstes Zeichen MUß "?" sein
- bne.s PatternError
- move.b (a1)+,d7 ; Nächstes Zeichen holen
- cmp.b #"?",d7 ; Auch "?" ?
- beq.s SpecialCase ; Ja => Spezialfall
- tst.b d7 ; Ende des Pattern-String ?
- beq.s TheyMatch ; Ja => Übereinstimmung
- MultiTest: move.b (a0)+,d6
- beq.s NoMatch ; Ende des Namens ?
- bsr.s TestChar
- tst.b d1 ; Stimmen Zeichen überein ?
- beq.s RealMatch ; Ja => weitertesten
- bra.s MultiTest ; Nein => weiter Übereinstimmung suchen
- RealMatch: tst.b (a1) ; Pattern zu Ende => Zeichen MUß am Ende
- bne.s PatternMatch ; des Namens stehen
- tst.b (a0) ; Name zu Ende
- bne.s MultiTest ; Nein => weitertesten
- bra.s TheyMatch
-
- SpecialCase: moveq #1,d2 ; Zähler für Anzahl der "?"
- moveq #0,d3 ; Wird nachher benötigt
- 1$: move.b (a1)+,d7
- beq.s TheyMatch ; Patternende => Übereinstimmung
- cmp.b #"?",d7 ; Auch "?" ?
- bne.s SpecialTest ; Nein => Übereinstimmung suchen
- addq.b #1,d2
- bra.s 1$
- SpecialTest: move.b (a0)+,d6 ; Namen auf Zeichen nach den "?"
- beq.s NoMatch ; durchsuchen
- bsr.s TestChar ; Stimmen Zeichen überein ?
- tst.b d1 ; Ja => weitertesten
- beq.s LengthTest
- addq.b #1,d3 ; Anzahl der übersprungenen Zeichen merken
- bra.s SpecialTest
- LengthTest: cmp.b d2,d3 ; Anzahl der Übersprungenen Zeichen im
- blo.s NoMatch ; im Namen => Anzahl der "?" im Pattern ?
- bra.w PatternMatch ; Ja => weitertesten
-