home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1992 / 10 / 02 / tips.ampk / Pattern Matching / PatternMatch.asm < prev    next >
Encoding:
Assembly Source File  |  1995-06-01  |  2.8 KB  |  87 lines

  1. ************************
  2. *** Pattern-matching ***
  3. ************************
  4. *** Einsprung:    a0 = Zeiger auf Namen
  5. ***        a1 = Zeiger auf Pattern
  6. ***        d0 =  0 => Groß/Kleinschreibung ignorieren
  7. ***           <> 0 => Groß/Kleinschreibung beachten
  8. ***
  9. *** Rückkehr:    d0 =  1 => Pattern fehlerhaft
  10. ***           =  0 => Übereinstimmung
  11. ***           = -1 => Kein Übereinstimmung
  12. **+
  13. PatternMatch:    move.b    (a1)+,d7    ; Zeichen aus Pattern lesen
  14.         beq.s    EndMatch    ; = 0 ? => Ende erreicht
  15.         cmp.b    #"?",d7        ; Einfacher Joker gefunden ?
  16.         beq.s    SingleLetter
  17.         cmp.b    #"#",d7
  18.         beq.s    MultiLetter    ; "#?" gefunden ?
  19.         move.b    (a0)+,d6    ; Zeichen aus Namen lesen
  20.         bsr.s    TestChar
  21.         tst.b    d1
  22.         beq.s    PatternMatch
  23.         bra.s    NoMatch
  24. SingleLetter:    tst.b    (a0)+        ; Wegen Joker einen Buchstaben weiter
  25.         bne.s    PatternMatch    ; Ende noch nicht erreicht -> weitertesten
  26.         bra.s    NoMatch        ; Name zu Ende, ab Pattern enthält nach "?"
  27. EndMatch:    tst.b    (a0)        ; Bei Name und Pattern am Ende ?
  28.         beq.s    TheyMatch    ; Ja -> Übereinstimmung
  29. NoMatch:    moveq    #-1,d0
  30.         rts
  31. TheyMatch:    moveq    #0,d0
  32.         rts
  33. PatternError:    moveq    #1,d0
  34.         rts
  35.  
  36. TestChar:    tst.b    d0        ; Groß/Kleinschreibung ignorieren ?
  37.         beq.s    NoCase
  38.         cmp.b    d6,d7        ; Ja
  39.         beq.s    CharMatch    ; Beide gleich => weitertesten
  40.         bra.s    NoCharMatch
  41. NoCase:        or.b    #32,d6        ; Bit 5 setzen => entspricht Addition
  42.         or.b    #32,d7        ;  von 32, von Groß- auf Kleinbuchstaben
  43.         cmp.b    d6,d7
  44.         beq.s    CharMatch
  45. NoCharMatch:    moveq    #-1,d1
  46.         rts
  47. CharMatch:    moveq    #0,d1
  48.         rts
  49.  
  50. MultiLetter:    cmp.b    #"?",(a1)+    ; Nächstes Zeichen MUß "?" sein
  51.         bne.s    PatternError
  52.         move.b    (a1)+,d7    ; Nächstes Zeichen holen
  53.         cmp.b    #"?",d7        ; Auch "?" ?
  54.         beq.s    SpecialCase    ; Ja => Spezialfall
  55.         tst.b    d7        ; Ende des Pattern-String ?
  56.         beq.s    TheyMatch    ; Ja => Übereinstimmung
  57. MultiTest:    move.b    (a0)+,d6
  58.         beq.s    NoMatch        ; Ende des Namens ?
  59.         bsr.s    TestChar
  60.         tst.b    d1        ; Stimmen Zeichen überein ?
  61.         beq.s    RealMatch    ; Ja => weitertesten
  62.         bra.s    MultiTest    ; Nein => weiter Übereinstimmung suchen
  63. RealMatch:    tst.b    (a1)        ; Pattern zu Ende => Zeichen MUß am Ende
  64.         bne.s    PatternMatch    ;  des Namens stehen
  65.         tst.b    (a0)        ; Name zu Ende
  66.         bne.s    MultiTest    ; Nein => weitertesten
  67.         bra.s    TheyMatch
  68.  
  69. SpecialCase:    moveq    #1,d2        ; Zähler für Anzahl der "?"
  70.         moveq    #0,d3        ; Wird nachher benötigt
  71. 1$:        move.b    (a1)+,d7
  72.         beq.s    TheyMatch    ; Patternende => Übereinstimmung
  73.         cmp.b    #"?",d7        ; Auch "?" ?
  74.         bne.s    SpecialTest    ; Nein => Übereinstimmung suchen
  75.         addq.b    #1,d2
  76.         bra.s    1$
  77. SpecialTest:    move.b    (a0)+,d6    ; Namen auf Zeichen nach den "?"
  78.         beq.s    NoMatch        ;   durchsuchen
  79.         bsr.s    TestChar    ; Stimmen Zeichen überein ?
  80.         tst.b    d1        ; Ja => weitertesten
  81.         beq.s    LengthTest
  82.         addq.b    #1,d3        ; Anzahl der übersprungenen Zeichen merken
  83.         bra.s    SpecialTest
  84. LengthTest:    cmp.b    d2,d3        ; Anzahl der Übersprungenen Zeichen im
  85.         blo.s    NoMatch        ;  im Namen => Anzahl der "?" im Pattern ?
  86.         bra.w    PatternMatch    ; Ja => weitertesten
  87.