maint.mk: Update system header list for #include syntax checks.
[gnulib.git] / tests / test-fnmatch-w32.c
blob7f1585553591b2c7ad0949e1d477a259ddf8aaf2
1 /* Test of fnmatch string matching function.
2 Copyright (C) 2008-2024 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 #include <config.h>
19 #include <fnmatch.h>
21 #include <locale.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <wchar.h>
27 #include "localcharset.h"
28 #include "macros.h"
30 #if defined _WIN32 && !defined __CYGWIN__
32 static int
33 test_one_locale (const char *name, int codepage)
35 # if 1
36 /* Portable code to set the locale. */
38 char name_with_codepage[1024];
40 sprintf (name_with_codepage, "%s.%d", name, codepage);
42 /* Set the locale. */
43 if (setlocale (LC_ALL, name_with_codepage) == NULL)
44 return 77;
46 # else
47 /* Hacky way to set a locale.codepage combination that setlocale() refuses
48 to set. */
50 /* Codepage of the current locale, set with setlocale().
51 Not necessarily the same as GetACP(). */
52 extern __declspec(dllimport) unsigned int __lc_codepage;
54 /* Set the locale. */
55 if (setlocale (LC_ALL, name) == NULL)
56 return 77;
58 /* Clobber the codepage and MB_CUR_MAX, both set by setlocale(). */
59 __lc_codepage = codepage;
60 switch (codepage)
62 case 1252:
63 case 1256:
64 MB_CUR_MAX = 1;
65 break;
66 case 932:
67 case 950:
68 case 936:
69 MB_CUR_MAX = 2;
70 break;
71 case 54936:
72 case 65001:
73 MB_CUR_MAX = 4;
74 break;
77 /* Test whether the codepage is really available. */
78 mbstate_t state;
79 wchar_t wc;
80 memset (&state, '\0', sizeof (mbstate_t));
81 if (mbrtowc (&wc, " ", 1, &state) == (size_t)(-1))
82 return 77;
84 # endif
86 switch (codepage)
88 case 1252:
89 /* Locale encoding is CP1252, an extension of ISO-8859-1. */
91 ASSERT (fnmatch ("x?y", "x\374y", 0) == 0); /* "xüy" */
92 ASSERT (fnmatch ("x?y", "x\337y", 0) == 0); /* "xßy" */
93 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
94 ASSERT (fnmatch ("x[[:alnum:]]y", "x\330y", 0) == 0);
95 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
96 ASSERT (fnmatch ("x[[:alpha:]]y", "x\330y", 0) == 0);
97 /* U+00B8 CEDILLA */
98 ASSERT (fnmatch ("x[[:graph:]]y", "x\270y", 0) == 0);
99 /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
100 ASSERT (fnmatch ("x[[:lower:]]y", "x\377y", 0) == 0);
101 /* U+00B8 CEDILLA */
102 ASSERT (fnmatch ("x[[:print:]]y", "x\270y", 0) == 0);
103 /* U+00BF INVERTED QUESTION MARK */
104 ASSERT (fnmatch ("x[[:punct:]]y", "x\277y", 0) == 0);
105 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
106 ASSERT (fnmatch ("x[[:upper:]]y", "x\311y", 0) == 0);
107 /* U+00D7 MULTIPLICATION SIGN */
108 ASSERT (fnmatch ("x[[:alnum:]]y", "x\327y", 0) == FNM_NOMATCH);
109 /* U+00D7 MULTIPLICATION SIGN */
110 ASSERT (fnmatch ("x[[:alpha:]]y", "x\327y", 0) == FNM_NOMATCH);
111 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
112 ASSERT (fnmatch ("x[[:blank:]]y", "x\330y", 0) == FNM_NOMATCH);
113 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
114 ASSERT (fnmatch ("x[[:cntrl:]]y", "x\330y", 0) == FNM_NOMATCH);
115 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
116 ASSERT (fnmatch ("x[[:digit:]]y", "x\330y", 0) == FNM_NOMATCH);
117 /* U+00B2 SUPERSCRIPT TWO */
118 ASSERT (fnmatch ("x[[:lower:]]y", "x\262y", 0) == FNM_NOMATCH);
119 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
120 ASSERT (fnmatch ("x[[:punct:]]y", "x\330y", 0) == FNM_NOMATCH);
121 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
122 ASSERT (fnmatch ("x[[:space:]]y", "x\330y", 0) == FNM_NOMATCH);
123 /* U+00B2 SUPERSCRIPT TWO */
124 ASSERT (fnmatch ("x[[:upper:]]y", "x\262y", 0) == FNM_NOMATCH);
125 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
126 ASSERT (fnmatch ("x[[:xdigit:]]y", "x\330y", 0) == FNM_NOMATCH);
128 #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
129 /* "Höhle" */
130 ASSERT (fnmatch ("H\366hle", "H\326hLe", FNM_CASEFOLD) == 0);
131 ASSERT (fnmatch ("H\326hLe", "H\366hle", FNM_CASEFOLD) == 0);
132 ASSERT (fnmatch ("H\326hle", "H\366hLe", FNM_CASEFOLD) == 0);
133 ASSERT (fnmatch ("H\366hLe", "H\326hle", FNM_CASEFOLD) == 0);
134 #endif
136 return 0;
138 case 1256:
139 /* Locale encoding is CP1256, not the same as ISO-8859-6. */
141 ASSERT (fnmatch ("x?y", "x\302y", 0) == 0); /* "xآy" */
142 ASSERT (fnmatch ("x?y", "x\341y", 0) == 0); /* "xلy" */
143 ASSERT (fnmatch ("x?y", "x\346y", 0) == 0); /* "xوy" */
145 return 0;
147 case 65001:
148 /* Locale encoding is CP65001 = UTF-8. */
149 if (strcmp (locale_charset (), "UTF-8") != 0)
150 return 77;
152 ASSERT (fnmatch ("x?y", "x\303\274y", 0) == 0); /* "xüy" */
153 ASSERT (fnmatch ("x?y", "x\303\237y", 0) == 0); /* "xßy" */
154 ASSERT (fnmatch ("x?y", "x\360\237\230\213y", 0) == 0); /* "x😋y" */
155 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
156 ASSERT (fnmatch ("x[[:alnum:]]y", "x\305\201y", 0) == 0);
157 /* U+10330 GOTHIC LETTER AHSA */
158 ASSERT (fnmatch ("x[[:alnum:]]y", "x\360\220\214\260y", 0) == 0);
159 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
160 ASSERT (fnmatch ("x[[:alpha:]]y", "x\305\201y", 0) == 0);
161 /* U+10330 GOTHIC LETTER AHSA */
162 ASSERT (fnmatch ("x[[:alpha:]]y", "x\360\220\214\260y", 0) == 0);
163 /* U+00B8 CEDILLA */
164 ASSERT (fnmatch ("x[[:graph:]]y", "x\302\270y", 0) == 0);
165 /* U+20000 <CJK Ideograph> */
166 ASSERT (fnmatch ("x[[:graph:]]y", "x\360\240\200\200y", 0) == 0);
167 /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
168 ASSERT (fnmatch ("x[[:lower:]]y", "x\303\277y", 0) == 0);
169 /* U+10441 DESERET SMALL LETTER EF */
170 ASSERT (fnmatch ("x[[:lower:]]y", "x\360\220\221\201y", 0) == 0);
171 /* U+00B8 CEDILLA */
172 ASSERT (fnmatch ("x[[:print:]]y", "x\302\270y", 0) == 0);
173 /* U+20000 <CJK Ideograph> */
174 ASSERT (fnmatch ("x[[:print:]]y", "x\360\240\200\200y", 0) == 0);
175 /* U+00BF INVERTED QUESTION MARK */
176 ASSERT (fnmatch ("x[[:punct:]]y", "x\302\277y", 0) == 0);
177 /* U+1D100 MUSICAL SYMBOL SINGLE BARLINE */
178 ASSERT (fnmatch ("x[[:punct:]]y", "x\360\235\204\200y", 0) == 0);
179 /* U+3000 IDEOGRAPHIC SPACE */
180 ASSERT (fnmatch ("x[[:space:]]y", "x\343\200\200y", 0) == 0);
181 /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
182 ASSERT (fnmatch ("x[[:upper:]]y", "x\320\251y", 0) == 0);
183 /* U+10419 DESERET CAPITAL LETTER EF */
184 ASSERT (fnmatch ("x[[:upper:]]y", "x\360\220\220\231y", 0) == 0);
185 /* U+00D7 MULTIPLICATION SIGN */
186 ASSERT (fnmatch ("x[[:alnum:]]y", "x\303\227y", 0) == FNM_NOMATCH);
187 /* U+00D7 MULTIPLICATION SIGN */
188 ASSERT (fnmatch ("x[[:alpha:]]y", "x\303\227y", 0) == FNM_NOMATCH);
189 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
190 ASSERT (fnmatch ("x[[:blank:]]y", "x\305\201y", 0) == FNM_NOMATCH);
191 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
192 ASSERT (fnmatch ("x[[:cntrl:]]y", "x\305\201y", 0) == FNM_NOMATCH);
193 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
194 ASSERT (fnmatch ("x[[:digit:]]y", "x\305\201y", 0) == FNM_NOMATCH);
195 /* U+2002 EN SPACE */
196 ASSERT (fnmatch ("x[[:graph:]]y", "x\342\200\202y", 0) == FNM_NOMATCH);
197 /* U+00B2 SUPERSCRIPT TWO */
198 ASSERT (fnmatch ("x[[:lower:]]y", "x\302\262y", 0) == FNM_NOMATCH);
199 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
200 ASSERT (fnmatch ("x[[:punct:]]y", "x\305\201y", 0) == FNM_NOMATCH);
201 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
202 ASSERT (fnmatch ("x[[:space:]]y", "x\305\201y", 0) == FNM_NOMATCH);
203 /* U+00B2 SUPERSCRIPT TWO */
204 ASSERT (fnmatch ("x[[:upper:]]y", "x\302\262y", 0) == FNM_NOMATCH);
205 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
206 ASSERT (fnmatch ("x[[:xdigit:]]y", "x\305\201y", 0) == FNM_NOMATCH);
208 #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
209 /* "özgür" */
211 /* Some platforms, e.g. MSVC 14, lack the upper/lower mappings for
212 these wide characters in the *.65001 locales. */
213 mbstate_t state;
214 wchar_t wc;
215 memset (&state, 0, sizeof (mbstate_t));
216 if (mbrtowc (&wc, "\303\274", 2, &state) == 2
217 && towupper (wc) != wc)
219 ASSERT (fnmatch ("\303\266zg\303\274r", "\303\226ZG\303\234R", FNM_CASEFOLD) == 0);
220 ASSERT (fnmatch ("\303\226ZG\303\234R", "\303\266zg\303\274r", FNM_CASEFOLD) == 0);
221 ASSERT (fnmatch ("\303\266Zg\303\234r", "\303\226zG\303\274R", FNM_CASEFOLD) == 0);
222 ASSERT (fnmatch ("\303\226zG\303\274R", "\303\266Zg\303\234r", FNM_CASEFOLD) == 0);
225 #endif
227 return 0;
229 case 932:
230 /* Locale encoding is CP932, similar to Shift_JIS. */
232 ASSERT (fnmatch ("x?y", "x\223\372y", 0) == 0); /* "x日y" */
233 ASSERT (fnmatch ("x?y", "x\226\173y", 0) == 0); /* "x本y" */
234 ASSERT (fnmatch ("x?y", "x\214\352y", 0) == 0); /* "x語y" */
236 return 0;
238 case 950:
239 /* Locale encoding is CP950, similar to Big5. */
241 ASSERT (fnmatch ("x?y", "x\244\351y", 0) == 0); /* "x日y" */
242 ASSERT (fnmatch ("x?y", "x\245\273y", 0) == 0); /* "x本y" */
243 ASSERT (fnmatch ("x?y", "x\273\171y", 0) == 0); /* "x語y" */
245 /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
246 ASSERT (fnmatch ("x[[:alnum:]]y", "x\242\365y", 0) == 0);
247 /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
248 ASSERT (fnmatch ("x[[:alpha:]]y", "x\242\365y", 0) == 0);
249 /* U+3001 IDEOGRAPHIC COMMA */
250 ASSERT (fnmatch ("x[[:graph:]]y", "x\241\102y", 0) == 0);
251 /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
252 ASSERT (fnmatch ("x[[:lower:]]y", "x\242\365y", 0) == 0);
253 /* U+3001 IDEOGRAPHIC COMMA */
254 ASSERT (fnmatch ("x[[:print:]]y", "x\241\102y", 0) == 0);
255 /* U+00D7 MULTIPLICATION SIGN */
256 ASSERT (fnmatch ("x[[:punct:]]y", "x\241\321y", 0) == 0);
257 /* U+3000 IDEOGRAPHIC SPACE */
258 ASSERT (fnmatch ("x[[:space:]]y", "x\241\100y", 0) == 0);
259 /* U+FF2D FULLWIDTH LATIN CAPITAL LETTER M */
260 ASSERT (fnmatch ("x[[:upper:]]y", "x\242\333y", 0) == 0);
262 #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
263 /* "α-ω" */
264 ASSERT (fnmatch ("\243\134-\243\163", "\243\104-\243\133", FNM_CASEFOLD) == 0);
265 ASSERT (fnmatch ("\243\104-\243\133", "\243\134-\243\163", FNM_CASEFOLD) == 0);
266 ASSERT (fnmatch ("\243\134-\243\133", "\243\104-\243\163", FNM_CASEFOLD) == 0);
267 ASSERT (fnmatch ("\243\104-\243\163", "\243\134-\243\133", FNM_CASEFOLD) == 0);
268 #endif
270 return 0;
272 case 936:
273 /* Locale encoding is CP936 = GBK, an extension of GB2312. */
275 ASSERT (fnmatch ("x?y", "x\310\325y", 0) == 0); /* "x日y" */
276 ASSERT (fnmatch ("x?y", "x\261\276y", 0) == 0); /* "x本y" */
277 ASSERT (fnmatch ("x?y", "x\325\132y", 0) == 0); /* "x語y" */
279 /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
280 ASSERT (fnmatch ("x[[:alnum:]]y", "x\243\355y", 0) == 0);
281 /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
282 ASSERT (fnmatch ("x[[:alpha:]]y", "x\243\355y", 0) == 0);
283 /* U+3001 IDEOGRAPHIC COMMA */
284 ASSERT (fnmatch ("x[[:graph:]]y", "x\241\242y", 0) == 0);
285 /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
286 ASSERT (fnmatch ("x[[:lower:]]y", "x\243\355y", 0) == 0);
287 /* U+3001 IDEOGRAPHIC COMMA */
288 ASSERT (fnmatch ("x[[:print:]]y", "x\241\242y", 0) == 0);
289 /* U+00D7 MULTIPLICATION SIGN */
290 ASSERT (fnmatch ("x[[:punct:]]y", "x\241\301y", 0) == 0);
291 /* U+3000 IDEOGRAPHIC SPACE */
292 ASSERT (fnmatch ("x[[:space:]]y", "x\241\241y", 0) == 0);
293 /* U+FF2D FULLWIDTH LATIN CAPITAL LETTER M */
294 ASSERT (fnmatch ("x[[:upper:]]y", "x\243\315y", 0) == 0);
296 #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
297 /* "α-ω" */
298 ASSERT (fnmatch ("\246\301-\246\330", "\246\241-\246\270", FNM_CASEFOLD) == 0);
299 ASSERT (fnmatch ("\246\241-\246\270", "\246\301-\246\330", FNM_CASEFOLD) == 0);
300 ASSERT (fnmatch ("\246\301-\246\270", "\246\241-\246\330", FNM_CASEFOLD) == 0);
301 ASSERT (fnmatch ("\246\241-\246\330", "\246\301-\246\270", FNM_CASEFOLD) == 0);
302 #endif
304 return 0;
306 case 54936:
307 /* Locale encoding is CP54936 = GB18030. */
308 if (strcmp (locale_charset (), "GB18030") != 0)
309 return 77;
311 ASSERT (fnmatch ("x?y", "x\250\271y", 0) == 0); /* "xüy" */
312 ASSERT (fnmatch ("x?y", "x\201\060\211\070y", 0) == 0); /* "xßy" */
313 ASSERT (fnmatch ("x?y", "x\224\071\375\067y", 0) == 0); /* "x😋y" */
314 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
315 ASSERT (fnmatch ("x[[:alnum:]]y", "x\201\060\221\071y", 0) == 0);
316 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
317 ASSERT (fnmatch ("x[[:alpha:]]y", "x\201\060\221\071y", 0) == 0);
318 /* U+00B8 CEDILLA */
319 ASSERT (fnmatch ("x[[:graph:]]y", "x\201\060\206\060y", 0) == 0);
320 /* U+20000 <CJK Ideograph> */
321 ASSERT (fnmatch ("x[[:graph:]]y", "x\225\062\202\066y", 0) == 0);
322 /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
323 ASSERT (fnmatch ("x[[:lower:]]y", "x\201\060\213\067y", 0) == 0);
324 /* U+10441 DESERET SMALL LETTER EF */
325 ASSERT (fnmatch ("x[[:lower:]]y", "x\220\060\355\071y", 0) == 0);
326 /* U+00B8 CEDILLA */
327 ASSERT (fnmatch ("x[[:print:]]y", "x\201\060\206\060y", 0) == 0);
328 /* U+20000 <CJK Ideograph> */
329 ASSERT (fnmatch ("x[[:print:]]y", "x\225\062\202\066y", 0) == 0);
330 /* U+00D7 MULTIPLICATION SIGN */
331 ASSERT (fnmatch ("x[[:punct:]]y", "x\241\301y", 0) == 0);
332 /* U+1D100 MUSICAL SYMBOL SINGLE BARLINE */
333 ASSERT (fnmatch ("x[[:punct:]]y", "x\224\062\273\064y", 0) == 0);
334 /* U+3000 IDEOGRAPHIC SPACE */
335 ASSERT (fnmatch ("x[[:space:]]y", "x\241\241y", 0) == 0);
336 /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
337 ASSERT (fnmatch ("x[[:upper:]]y", "x\247\273y", 0) == 0);
338 /* U+10419 DESERET CAPITAL LETTER EF */
339 ASSERT (fnmatch ("x[[:upper:]]y", "x\220\060\351\071y", 0) == 0);
340 /* U+3001 IDEOGRAPHIC COMMA */
341 ASSERT (fnmatch ("x[[:alnum:]]y", "x\241\242y", 0) == FNM_NOMATCH);
342 /* U+3001 IDEOGRAPHIC COMMA */
343 ASSERT (fnmatch ("x[[:alpha:]]y", "x\241\242y", 0) == FNM_NOMATCH);
344 /* U+3001 IDEOGRAPHIC COMMA */
345 ASSERT (fnmatch ("x[[:blank:]]y", "x\241\242y", 0) == FNM_NOMATCH);
346 /* U+3001 IDEOGRAPHIC COMMA */
347 ASSERT (fnmatch ("x[[:cntrl:]]y", "x\241\242y", 0) == FNM_NOMATCH);
348 /* U+3001 IDEOGRAPHIC COMMA */
349 ASSERT (fnmatch ("x[[:digit:]]y", "x\241\242y", 0) == FNM_NOMATCH);
350 /* U+3000 IDEOGRAPHIC SPACE */
351 ASSERT (fnmatch ("x[[:graph:]]y", "x\241\241y", 0) == FNM_NOMATCH);
352 /* U+3001 IDEOGRAPHIC COMMA */
353 ASSERT (fnmatch ("x[[:lower:]]y", "x\241\242y", 0) == FNM_NOMATCH);
354 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
355 ASSERT (fnmatch ("x[[:punct:]]y", "x\201\060\211\061y", 0) == FNM_NOMATCH);
356 /* U+3001 IDEOGRAPHIC COMMA */
357 ASSERT (fnmatch ("x[[:space:]]y", "x\241\242y", 0) == FNM_NOMATCH);
358 /* U+3001 IDEOGRAPHIC COMMA */
359 ASSERT (fnmatch ("x[[:upper:]]y", "x\241\242y", 0) == FNM_NOMATCH);
360 /* U+3001 IDEOGRAPHIC COMMA */
361 ASSERT (fnmatch ("x[[:xdigit:]]y", "x\241\242y", 0) == FNM_NOMATCH);
363 #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
364 /* "özgür" */
365 ASSERT (fnmatch ("\201\060\213\062zg\250\271r", "\201\060\211\060ZG\201\060\211\065R", FNM_CASEFOLD) == 0);
366 ASSERT (fnmatch ("\201\060\211\060ZG\201\060\211\065R", "\201\060\213\062zg\250\271r", FNM_CASEFOLD) == 0);
367 ASSERT (fnmatch ("\201\060\213\062Zg\201\060\211\065r", "\201\060\211\060zG\250\271R", FNM_CASEFOLD) == 0);
368 ASSERT (fnmatch ("\201\060\211\060zG\250\271R", "\201\060\213\062Zg\201\060\211\065r", FNM_CASEFOLD) == 0);
369 #endif
371 return 0;
373 default:
374 return 1;
379 main (int argc, char *argv[])
381 int codepage = atoi (argv[argc - 1]);
382 int result;
383 int i;
385 result = 77;
386 for (i = 1; i < argc - 1; i++)
388 int ret = test_one_locale (argv[i], codepage);
390 if (ret != 77)
391 result = ret;
394 if (result == 77)
396 if (test_exit_status != EXIT_SUCCESS)
397 return test_exit_status;
398 fprintf (stderr, "Skipping test: found no locale with codepage %d\n",
399 codepage);
401 return (result ? result : test_exit_status);
404 #else
407 main (int argc, char *argv[])
409 fputs ("Skipping test: not a native Windows system\n", stderr);
410 return 77;
413 #endif