Что-то намудрил ночью...

Проще можно - ищем первое несовпадение или конец URI, а потом разбираемся с этим местом и его соответствием шаблону.

## Код:
```
PROCEDURE CompareUri (IN pattern, uri: ARRAY OF SHORTCHAR; OUT ok: BOOLEAN; OUT generic: BOOLEAN);
   VAR eqLen: INTEGER;
BEGIN
   eqLen := 0;
   WHILE (uri[eqLen] # 0X) & (pattern[eqLen] = uri[eqLen]) DO
      INC(eqLen)
   END;
   ok := (uri[eqLen] = 0X) & (pattern[eqLen] = 0X) OR (pattern[eqLen] = "*") & (pattern[eqLen+1] = 0X)
END CompareUri;
```
