(defmacro case-it (keyform &body cases)
`(let ((it ,keyform))
(case it ,@cases)))
(defun match% (pattern string start end)
(macrolet ((match%% (i)
`(match% pattern string ,i end))
(next-pattern ()
`(or (pop pattern) (error "Pattern is incorrect"))))
(cond ((null pattern) (= start end))
((= start end) nil)
(t
(case-it (next-pattern)
(#\? (match%% (1+ start)))
(#\\ (and (eql (aref string start)
(next-pattern))
(match%% (1+ start))))
(#\* (loop :for i :from start :to end
:for match-p := (match%% i) :until match-p
:finally (return match-p)))
(t (and (eql it (aref string start))
(match%% (1+ start)))))))))
(defun match (pattern string &key (start 0) (end (length string)))
(match% (coerce pattern 'list) string start end))
(format t "~:[Not matched~;Matched~]"
(match "as*d*?qwe*qwe" "as123dssqwe12345678qwe"))
KGRlZm1hY3JvIGNhc2UtaXQgKGtleWZvcm0gJmJvZHkgY2FzZXMpCiAgYChsZXQgKChpdCAsa2V5Zm9ybSkpCiAgICAgKGNhc2UgaXQgLEBjYXNlcykpKQoKKGRlZnVuIG1hdGNoJSAocGF0dGVybiBzdHJpbmcgc3RhcnQgZW5kKQogIChtYWNyb2xldCAoKG1hdGNoJSUgKGkpCiAgICAgICAgICAgICAgIGAobWF0Y2glIHBhdHRlcm4gc3RyaW5nICxpIGVuZCkpCiAgICAgICAgICAgICAobmV4dC1wYXR0ZXJuICgpCiAgICAgICAgICAgICAgIGAob3IgKHBvcCBwYXR0ZXJuKSAoZXJyb3IgIlBhdHRlcm4gaXMgaW5jb3JyZWN0IikpKSkKICAgIChjb25kICgobnVsbCBwYXR0ZXJuKSAoPSBzdGFydCBlbmQpKQogICAgICAgICAgKCg9IHN0YXJ0IGVuZCkgIG5pbCkKICAgICAgICAgICh0CiAgICAgICAgICAgKGNhc2UtaXQgKG5leHQtcGF0dGVybikKICAgICAgICAgICAgICgjXD8gKG1hdGNoJSUgKDErIHN0YXJ0KSkpCiAgICAgICAgICAgICAoI1xcIChhbmQgKGVxbCAoYXJlZiBzdHJpbmcgc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dC1wYXR0ZXJuKSkKICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2glJSAoMSsgc3RhcnQpKSkpCiAgICAgICAgICAgICAoI1wqIChsb29wIDpmb3IgaSA6ZnJvbSBzdGFydCA6dG8gZW5kCiAgICAgICAgICAgICAgICAgICAgICAgIDpmb3IgbWF0Y2gtcCA6PSAobWF0Y2glJSBpKSA6dW50aWwgbWF0Y2gtcAogICAgICAgICAgICAgICAgICAgICAgICA6ZmluYWxseSAocmV0dXJuIG1hdGNoLXApKSkKICAgICAgICAgICAgICh0ICAgKGFuZCAoZXFsIGl0IChhcmVmIHN0cmluZyBzdGFydCkpCiAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoJSUgKDErIHN0YXJ0KSkpKSkpKSkpCgooZGVmdW4gbWF0Y2ggKHBhdHRlcm4gc3RyaW5nICZrZXkgKHN0YXJ0IDApIChlbmQgKGxlbmd0aCBzdHJpbmcpKSkKICAobWF0Y2glIChjb2VyY2UgcGF0dGVybiAnbGlzdCkgc3RyaW5nIHN0YXJ0IGVuZCkpCgooZm9ybWF0IHQgIn46W05vdCBtYXRjaGVkfjtNYXRjaGVkfl0iIAogIChtYXRjaCAiYXMqZCo/cXdlKnF3ZSIgImFzMTIzZHNzcXdlMTIzNDU2Nzhxd2UiKSk=