amiga-bootcamp/07_dos/pattern_matching.md

78 lines
2 KiB
Markdown
Raw Permalink Normal View History

[← Home](../README.md) · [AmigaDOS](README.md)
# Pattern Matching — ParsePattern, MatchPattern
## Overview
AmigaDOS provides built-in wildcard/pattern matching for file operations. Patterns are compiled into token streams via `ParsePattern` and matched via `MatchPattern`.
---
## Wildcard Syntax
| Pattern | Meaning | Example |
|---|---|---|
| `?` | Match exactly one character | `file?.txt` matches `file1.txt` |
| `#` | Match zero or more of the following | `#?.info` matches anything ending in `.info` |
| `#?` | Match any string (equivalent to `*`) | `#?` matches everything |
| `(a\|b)` | Alternation — match a or b | `(read\|write)` |
| `~` | Negation — match if NOT | `~(#?.info)` matches non-info files |
| `[abc]` | Character class | `[abc]` matches a, b, or c |
| `[a-z]` | Character range | `[0-9]` matches digits |
| `'` | Quote next character literally | `'#` matches literal `#` |
---
## API
```c
/* dos/dos.h — NDK39 */
/* Compile a pattern into tokenised form: */
LONG ParsePattern(STRPTR pat, STRPTR buf, LONG buflen);
/* Returns: 1 = pattern has wildcards, 0 = plain string, -1 = error */
/* Test a name against a compiled pattern: */
BOOL MatchPattern(STRPTR pat_compiled, STRPTR name);
/* Case-insensitive variants: */
LONG ParsePatternNoCase(STRPTR pat, STRPTR buf, LONG buflen);
BOOL MatchPatternNoCase(STRPTR pat_compiled, STRPTR name);
```
---
## Usage Example
```c
char pat[256], buf[256];
LONG is_wild;
is_wild = ParsePatternNoCase("#?.txt", pat, sizeof(pat));
if (is_wild >= 0) {
if (MatchPatternNoCase(pat, "readme.txt"))
Printf("Match!\n");
if (!MatchPatternNoCase(pat, "readme.doc"))
Printf("No match\n");
}
```
---
## Common Patterns
| Pattern | Matches |
|---|---|
| `#?` | Everything (wildcard all) |
| `#?.info` | All `.info` icon files |
| `~(#?.info)` | Everything except `.info` files |
| `(#?.c\|#?.h)` | All C source and header files |
| `file[0-9]` | `file0` through `file9` |
---
## References
- NDK39: `dos/dos.h`
- ADCD 2.1: `ParsePattern`, `MatchPattern`