/* 03Jul24: Beispiel für die Verwendung von fnmatch. Es handelt sich * dabei um die Logik, welche auch in einer Shell benutzt wird um * Ausdrücke wie *.c oder .??? zu erweitern. In glob(7) findet man * mehr Informationen über diese Art von Muster. * * Achtung, es ist oft notwendig Muster wie *.c in Anführungszeichen * anzugeben, damit es nicht von der Shell expandiert wird. */ #include #include #include int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s [pattern] [string to match...]\n", argv[0]); return EXIT_FAILURE; } char *pattern = argv[1]; for (int i = 2; i < argc; i++) { /* Wie anzunehmen, ist fnmatch(3) eine Art Prädikat, welches * prüft ob eine Zeichenkette zu einem Muster passt. Was * genau gematch't wird, kann man dann noch mit weiteren * Optionen im Dritten Argument verändern. Für die * Default-Einstellungen würde man 0 benutzen, und ansonsten * mehere weitere Optionen mit Bit-Weiser Ver-oder'ung * anfügen. Bspw. `FNM_PERIOD' bewirkt, dass ein Dateinamen * welches mit "." anfängt, nur dann match't, wenn der * Pattern auch explizit mit einem Punkt Anfängt. Damit * will man vermeiden "versteckte Dateien" (die mit einem * Punkt im Namen anfangen) Standard-mäßig zu Treffen, wenn * man ein Muster wie "*.c" übergibt. */ if (0 == fnmatch(pattern, argv[i], FNM_PERIOD)) { printf("'%s'\tdoes match\n", argv[i]); } else { printf("'%s'\tdoes not match\n", argv[i]); } } return 0; }