File Coverage

const-xs.inc
Criterion Covered Total %
statement 16 34 47.0
branch 10 28 35.7
condition n/a
subroutine n/a
pod n/a
total 26 62 41.9


line stmt bran cond sub pod time code
1             BOOT:
2             {
3             #ifdef dTHX
4             dTHX;
5             #endif
6 5           HV *symbol_table = get_hv("POSIX::2008::", GV_ADD);
7              
8             static const struct iv_s values_for_iv[] =
9             {
10             #ifdef AT_EACCESS
11             { "AT_EACCESS", 10, AT_EACCESS },
12             #endif
13             #ifdef AT_EMPTY_PATH
14             { "AT_EMPTY_PATH", 13, AT_EMPTY_PATH },
15             #endif
16             #ifdef AT_FDCWD
17             { "AT_FDCWD", 8, AT_FDCWD },
18             #endif
19             #ifdef AT_NO_AUTOMOUNT
20             { "AT_NO_AUTOMOUNT", 15, AT_NO_AUTOMOUNT },
21             #endif
22             #ifdef AT_REMOVEDIR
23             { "AT_REMOVEDIR", 12, AT_REMOVEDIR },
24             #endif
25             #ifdef AT_SYMLINK_FOLLOW
26             { "AT_SYMLINK_FOLLOW", 17, AT_SYMLINK_FOLLOW },
27             #endif
28             #ifdef AT_SYMLINK_NOFOLLOW
29             { "AT_SYMLINK_NOFOLLOW", 19, AT_SYMLINK_NOFOLLOW },
30             #endif
31             #ifdef BOOT_TIME
32             { "BOOT_TIME", 9, BOOT_TIME },
33             #endif
34             #ifdef CLOCK_BOOTTIME
35             { "CLOCK_BOOTTIME", 14, CLOCK_BOOTTIME },
36             #endif
37             #ifdef CLOCK_HIGHRES
38             { "CLOCK_HIGHRES", 13, CLOCK_HIGHRES },
39             #endif
40             #ifdef CLOCK_MONOTONIC
41             { "CLOCK_MONOTONIC", 15, CLOCK_MONOTONIC },
42             #endif
43             #ifdef CLOCK_MONOTONIC_COARSE
44             { "CLOCK_MONOTONIC_COARSE", 22, CLOCK_MONOTONIC_COARSE },
45             #endif
46             #ifdef CLOCK_MONOTONIC_FAST
47             { "CLOCK_MONOTONIC_FAST", 20, CLOCK_MONOTONIC_FAST },
48             #endif
49             #ifdef CLOCK_MONOTONIC_PRECISE
50             { "CLOCK_MONOTONIC_PRECISE", 23, CLOCK_MONOTONIC_PRECISE },
51             #endif
52             #ifdef CLOCK_MONOTONIC_RAW
53             { "CLOCK_MONOTONIC_RAW", 19, CLOCK_MONOTONIC_RAW },
54             #endif
55             #ifdef CLOCK_PROCESS_CPUTIME_ID
56             { "CLOCK_PROCESS_CPUTIME_ID", 24, CLOCK_PROCESS_CPUTIME_ID },
57             #endif
58             #ifdef CLOCK_REALTIME
59             { "CLOCK_REALTIME", 14, CLOCK_REALTIME },
60             #endif
61             #ifdef CLOCK_REALTIME_COARSE
62             { "CLOCK_REALTIME_COARSE", 21, CLOCK_REALTIME_COARSE },
63             #endif
64             #ifdef CLOCK_REALTIME_FAST
65             { "CLOCK_REALTIME_FAST", 19, CLOCK_REALTIME_FAST },
66             #endif
67             #ifdef CLOCK_REALTIME_PRECISE
68             { "CLOCK_REALTIME_PRECISE", 22, CLOCK_REALTIME_PRECISE },
69             #endif
70             #ifdef CLOCK_SOFTTIME
71             { "CLOCK_SOFTTIME", 14, CLOCK_SOFTTIME },
72             #endif
73             #ifdef CLOCK_THREAD_CPUTIME_ID
74             { "CLOCK_THREAD_CPUTIME_ID", 23, CLOCK_THREAD_CPUTIME_ID },
75             #endif
76             #ifdef CLOCK_UPTIME
77             { "CLOCK_UPTIME", 12, CLOCK_UPTIME },
78             #endif
79             #ifdef CLOCK_UPTIME_FAST
80             { "CLOCK_UPTIME_FAST", 17, CLOCK_UPTIME_FAST },
81             #endif
82             #ifdef CLOCK_UPTIME_PRECISE
83             { "CLOCK_UPTIME_PRECISE", 20, CLOCK_UPTIME_PRECISE },
84             #endif
85             #ifdef _CS_GNU_LIBC_VERSION
86             { "_CS_GNU_LIBC_VERSION", 20, _CS_GNU_LIBC_VERSION },
87             #endif
88             #ifdef _CS_GNU_LIBPTHREAD_VERSION
89             { "_CS_GNU_LIBPTHREAD_VERSION", 26, _CS_GNU_LIBPTHREAD_VERSION },
90             #endif
91             #ifdef _CS_PATH
92             { "_CS_PATH", 8, _CS_PATH },
93             #endif
94             #ifdef DEAD_PROCESS
95             { "DEAD_PROCESS", 12, DEAD_PROCESS },
96             #endif
97             #ifdef F_DUPFD
98             { "F_DUPFD", 7, F_DUPFD },
99             #endif
100             #ifdef F_DUPFD_CLOEXEC
101             { "F_DUPFD_CLOEXEC", 15, F_DUPFD_CLOEXEC },
102             #endif
103             #ifdef F_GETFD
104             { "F_GETFD", 7, F_GETFD },
105             #endif
106             #ifdef F_SETFD
107             { "F_SETFD", 7, F_SETFD },
108             #endif
109             #ifdef F_GETFL
110             { "F_GETFL", 7, F_GETFL },
111             #endif
112             #ifdef F_SETFL
113             { "F_SETFL", 7, F_SETFL },
114             #endif
115             #ifdef F_GETLK
116             { "F_GETLK", 7, F_GETLK },
117             #endif
118             #ifdef F_SETLK
119             { "F_SETLK", 7, F_SETLK },
120             #endif
121             #ifdef F_SETLKW
122             { "F_SETLKW", 8, F_SETLKW },
123             #endif
124             #ifdef F_GETOWN
125             { "F_GETOWN", 8, F_GETOWN },
126             #endif
127             #ifdef F_SETOWN
128             { "F_SETOWN", 8, F_SETOWN },
129             #endif
130             #ifdef F_RDLCK
131             { "F_RDLCK", 7, F_RDLCK },
132             #endif
133             #ifdef F_UNLCK
134             { "F_UNLCK", 7, F_UNLCK },
135             #endif
136             #ifdef F_WRLCK
137             { "F_WRLCK", 7, F_WRLCK },
138             #endif
139             #ifdef FD_CLOEXEC
140             { "FD_CLOEXEC", 10, FD_CLOEXEC },
141             #endif
142             #ifdef FE_TONEAREST
143             { "FE_TONEAREST", 12, FE_TONEAREST },
144             #endif
145             #ifdef FE_TOWARDZERO
146             { "FE_TOWARDZERO", 13, FE_TOWARDZERO },
147             #endif
148             #ifdef FE_UPWARD
149             { "FE_UPWARD", 9, FE_UPWARD },
150             #endif
151             #ifdef FE_DOWNWARD
152             { "FE_DOWNWARD", 11, FE_DOWNWARD },
153             #endif
154             #ifdef FE_DIVBYZERO
155             { "FE_DIVBYZERO", 12, FE_DIVBYZERO },
156             #endif
157             #ifdef FE_INEXACT
158             { "FE_INEXACT", 10, FE_INEXACT },
159             #endif
160             #ifdef FE_INVALID
161             { "FE_INVALID", 10, FE_INVALID },
162             #endif
163             #ifdef FE_OVERFLOW
164             { "FE_OVERFLOW", 11, FE_OVERFLOW },
165             #endif
166             #ifdef FE_UNDERFLOW
167             { "FE_UNDERFLOW", 12, FE_UNDERFLOW },
168             #endif
169             #ifdef FE_ALL_EXCEPT
170             { "FE_ALL_EXCEPT", 13, FE_ALL_EXCEPT },
171             #endif
172             #ifdef FNM_CASEFOLD
173             { "FNM_CASEFOLD", 12, FNM_CASEFOLD },
174             #endif
175             #ifdef FNM_FILE_NAME
176             { "FNM_FILE_NAME", 13, FNM_FILE_NAME },
177             #endif
178             #ifdef FNM_LEADING_DIR
179             { "FNM_LEADING_DIR", 15, FNM_LEADING_DIR },
180             #endif
181             #ifdef FNM_NOESCAPE
182             { "FNM_NOESCAPE", 12, FNM_NOESCAPE },
183             #endif
184             #ifdef FNM_NOMATCH
185             { "FNM_NOMATCH", 11, FNM_NOMATCH },
186             #endif
187             #ifdef FNM_PATHNAME
188             { "FNM_PATHNAME", 12, FNM_PATHNAME },
189             #endif
190             #ifdef FNM_PERIOD
191             { "FNM_PERIOD", 10, FNM_PERIOD },
192             #endif
193             #ifdef FP_INFINITE
194             { "FP_INFINITE", 11, FP_INFINITE },
195             #endif
196             #ifdef FP_NAN
197             { "FP_NAN", 6, FP_NAN },
198             #endif
199             #ifdef FP_NORMAL
200             { "FP_NORMAL", 9, FP_NORMAL },
201             #endif
202             #ifdef FP_SUBNORMAL
203             { "FP_SUBNORMAL", 12, FP_SUBNORMAL },
204             #endif
205             #ifdef FP_ZERO
206             { "FP_ZERO", 7, FP_ZERO },
207             #endif
208             #ifdef INIT_PROCESS
209             { "INIT_PROCESS", 12, INIT_PROCESS },
210             #endif
211             #ifdef ITIMER_PROF
212             { "ITIMER_PROF", 11, ITIMER_PROF },
213             #endif
214             #ifdef ITIMER_REAL
215             { "ITIMER_REAL", 11, ITIMER_REAL },
216             #endif
217             #ifdef ITIMER_VIRTUAL
218             { "ITIMER_VIRTUAL", 14, ITIMER_VIRTUAL },
219             #endif
220             #ifdef LOGIN_PROCESS
221             { "LOGIN_PROCESS", 13, LOGIN_PROCESS },
222             #endif
223             #ifdef NEW_TIME
224             { "NEW_TIME", 8, NEW_TIME },
225             #endif
226             #ifdef O_ACCMODE
227             { "O_ACCMODE", 9, O_ACCMODE },
228             #endif
229             #ifdef O_APPEND
230             { "O_APPEND", 8, O_APPEND },
231             #endif
232             #ifdef O_CLOEXEC
233             { "O_CLOEXEC", 9, O_CLOEXEC },
234             #endif
235             #ifdef O_CREAT
236             { "O_CREAT", 7, O_CREAT },
237             #endif
238             #ifdef O_DIRECTORY
239             { "O_DIRECTORY", 11, O_DIRECTORY },
240             #endif
241             #ifdef O_DSYNC
242             { "O_DSYNC", 7, O_DSYNC },
243             #endif
244             #ifdef O_EXEC
245             { "O_EXEC", 6, O_EXEC },
246             #endif
247             #ifdef O_NOCTTY
248             { "O_NOCTTY", 8, O_NOCTTY },
249             #endif
250             #ifdef O_NOFOLLOW
251             { "O_NOFOLLOW", 10, O_NOFOLLOW },
252             #endif
253             #ifdef O_NONBLOCK
254             { "O_NONBLOCK", 10, O_NONBLOCK },
255             #endif
256             #ifdef O_RDONLY
257             { "O_RDONLY", 8, O_RDONLY },
258             #endif
259             #ifdef O_RDWR
260             { "O_RDWR", 6, O_RDWR },
261             #endif
262             #ifdef O_RSYNC
263             { "O_RSYNC", 7, O_RSYNC },
264             #endif
265             #ifdef O_SEARCH
266             { "O_SEARCH", 8, O_SEARCH },
267             #endif
268             #ifdef O_SYNC
269             { "O_SYNC", 6, O_SYNC },
270             #endif
271             #ifdef O_TMPFILE
272             { "O_TMPFILE", 9, O_TMPFILE },
273             #endif
274             #ifdef O_TRUNC
275             { "O_TRUNC", 7, O_TRUNC },
276             #endif
277             #ifdef O_TTY_INIT
278             { "O_TTY_INIT", 10, O_TTY_INIT },
279             #endif
280             #ifdef O_WRONLY
281             { "O_WRONLY", 8, O_WRONLY },
282             #endif
283             #ifdef OLD_TIME
284             { "OLD_TIME", 8, OLD_TIME },
285             #endif
286             #ifdef POSIX_FADV_NORMAL
287             { "POSIX_FADV_NORMAL", 17, POSIX_FADV_NORMAL },
288             #endif
289             #ifdef POSIX_FADV_SEQUENTIAL
290             { "POSIX_FADV_SEQUENTIAL", 21, POSIX_FADV_SEQUENTIAL },
291             #endif
292             #ifdef POSIX_FADV_RANDOM
293             { "POSIX_FADV_RANDOM", 17, POSIX_FADV_RANDOM },
294             #endif
295             #ifdef POSIX_FADV_NOREUSE
296             { "POSIX_FADV_NOREUSE", 18, POSIX_FADV_NOREUSE },
297             #endif
298             #ifdef POSIX_FADV_WILLNEED
299             { "POSIX_FADV_WILLNEED", 19, POSIX_FADV_WILLNEED },
300             #endif
301             #ifdef POSIX_FADV_DONTNEED
302             { "POSIX_FADV_DONTNEED", 19, POSIX_FADV_DONTNEED },
303             #endif
304             #ifdef PRIO_PROCESS
305             { "PRIO_PROCESS", 12, PRIO_PROCESS },
306             #endif
307             #ifdef PRIO_PGRP
308             { "PRIO_PGRP", 9, PRIO_PGRP },
309             #endif
310             #ifdef PRIO_USER
311             { "PRIO_USER", 9, PRIO_USER },
312             #endif
313             #ifdef RESOLVE_BENEATH
314             { "RESOLVE_BENEATH", 15, RESOLVE_BENEATH },
315             #endif
316             #ifdef RESOLVE_IN_ROOT
317             { "RESOLVE_IN_ROOT", 15, RESOLVE_IN_ROOT },
318             #endif
319             #ifdef RESOLVE_NO_MAGICLINKS
320             { "RESOLVE_NO_MAGICLINKS", 21, RESOLVE_NO_MAGICLINKS },
321             #endif
322             #ifdef RESOLVE_NO_SYMLINKS
323             { "RESOLVE_NO_SYMLINKS", 19, RESOLVE_NO_SYMLINKS },
324             #endif
325             #ifdef RESOLVE_NO_XDEV
326             { "RESOLVE_NO_XDEV", 15, RESOLVE_NO_XDEV },
327             #endif
328             #ifdef RESOLVE_CACHED
329             { "RESOLVE_CACHED", 14, RESOLVE_CACHED },
330             #endif
331             #ifdef RTLD_GLOBAL
332             { "RTLD_GLOBAL", 11, RTLD_GLOBAL },
333             #endif
334             #ifdef RTLD_LAZY
335             { "RTLD_LAZY", 9, RTLD_LAZY },
336             #endif
337             #ifdef RTLD_LOCAL
338             { "RTLD_LOCAL", 10, RTLD_LOCAL },
339             #endif
340             #ifdef RTLD_NOW
341             { "RTLD_NOW", 8, RTLD_NOW },
342             #endif
343             #ifdef RUN_LVL
344             { "RUN_LVL", 7, RUN_LVL },
345             #endif
346             #ifdef S_IFMT
347             { "S_IFMT", 6, S_IFMT },
348             #endif
349             #ifdef S_IFBLK
350             { "S_IFBLK", 7, S_IFBLK },
351             #endif
352             #ifdef S_IFCHR
353             { "S_IFCHR", 7, S_IFCHR },
354             #endif
355             #ifdef S_IFIFO
356             { "S_IFIFO", 7, S_IFIFO },
357             #endif
358             #ifdef S_IFREG
359             { "S_IFREG", 7, S_IFREG },
360             #endif
361             #ifdef S_IFDIR
362             { "S_IFDIR", 7, S_IFDIR },
363             #endif
364             #ifdef S_IFLNK
365             { "S_IFLNK", 7, S_IFLNK },
366             #endif
367             #ifdef S_IFSOCK
368             { "S_IFSOCK", 8, S_IFSOCK },
369             #endif
370             #ifdef S_ISUID
371             { "S_ISUID", 7, S_ISUID },
372             #endif
373             #ifdef S_ISGID
374             { "S_ISGID", 7, S_ISGID },
375             #endif
376             #ifdef S_IRWXU
377             { "S_IRWXU", 7, S_IRWXU },
378             #endif
379             #ifdef S_IRUSR
380             { "S_IRUSR", 7, S_IRUSR },
381             #endif
382             #ifdef S_IWUSR
383             { "S_IWUSR", 7, S_IWUSR },
384             #endif
385             #ifdef S_IXUSR
386             { "S_IXUSR", 7, S_IXUSR },
387             #endif
388             #ifdef S_IRWXG
389             { "S_IRWXG", 7, S_IRWXG },
390             #endif
391             #ifdef S_IRGRP
392             { "S_IRGRP", 7, S_IRGRP },
393             #endif
394             #ifdef S_IWGRP
395             { "S_IWGRP", 7, S_IWGRP },
396             #endif
397             #ifdef S_IXGRP
398             { "S_IXGRP", 7, S_IXGRP },
399             #endif
400             #ifdef S_IRWXO
401             { "S_IRWXO", 7, S_IRWXO },
402             #endif
403             #ifdef S_IROTH
404             { "S_IROTH", 7, S_IROTH },
405             #endif
406             #ifdef S_IWOTH
407             { "S_IWOTH", 7, S_IWOTH },
408             #endif
409             #ifdef S_IXOTH
410             { "S_IXOTH", 7, S_IXOTH },
411             #endif
412             #ifdef S_ISVTX
413             { "S_ISVTX", 7, S_ISVTX },
414             #endif
415             #ifdef SEEK_SET
416             { "SEEK_SET", 8, SEEK_SET },
417             #endif
418             #ifdef SEEK_CUR
419             { "SEEK_CUR", 8, SEEK_CUR },
420             #endif
421             #ifdef SEEK_END
422             { "SEEK_END", 8, SEEK_END },
423             #endif
424             #ifdef TIMER_ABSTIME
425             { "TIMER_ABSTIME", 13, TIMER_ABSTIME },
426             #endif
427             #ifdef USER_PROCESS
428             { "USER_PROCESS", 12, USER_PROCESS },
429             #endif
430             #ifdef UTIME_NOW
431             { "UTIME_NOW", 9, UTIME_NOW },
432             #endif
433             #ifdef UTIME_OMIT
434             { "UTIME_OMIT", 10, UTIME_OMIT },
435             #endif
436             #ifdef F_OK
437             { "F_OK", 4, F_OK },
438             #endif
439             #ifdef R_OK
440             { "R_OK", 4, R_OK },
441             #endif
442             #ifdef W_OK
443             { "W_OK", 4, W_OK },
444             #endif
445             #ifdef X_OK
446             { "X_OK", 4, X_OK },
447             #endif
448             { NULL, 0, 0 } };
449 5           const struct iv_s *value_for_iv = values_for_iv;
450 645 100         while (value_for_iv->name) {
451 640           constant_add_symbol(aTHX_ symbol_table, value_for_iv->name,
452             value_for_iv->namelen, newSViv(value_for_iv->value));
453 640           ++value_for_iv;
454             }
455             if (C_ARRAY_LENGTH(values_for_notfound) > 1) {
456             #ifndef SYMBIAN
457 5           HV *const constant_missing = get_missing_hash(aTHX);
458             #endif
459 5           const struct notfound_s *value_for_notfound = values_for_notfound;
460             do {
461              
462             /* Need to add prototypes, else parsing will vary by platform. */
463 90           HE *he = (HE*) hv_common_key_len(symbol_table,
464             value_for_notfound->name,
465             value_for_notfound->namelen,
466             HV_FETCH_LVALUE, NULL, 0);
467             SV *sv;
468             #ifndef SYMBIAN
469             HEK *hek;
470             #endif
471 90 50         if (!he) {
472 0           Perl_croak(aTHX_
473             "Couldn't add key '%s' to %%POSIX::2008::",
474             value_for_notfound->name);
475             }
476 90           sv = HeVAL(he);
477 90 50         if (!SvOK(sv) && SvTYPE(sv) != SVt_PVGV) {
    50          
    50          
    50          
478             /* Nothing was here before, so mark a prototype of "" */
479 90           sv_setpvn(sv, "", 0);
480 0 0         } else if (SvPOK(sv) && SvCUR(sv) == 0) {
    0          
481             /* There is already a prototype of "" - do nothing */
482             } else {
483             /* Someone has been here before us - have to make a real
484             typeglob. */
485             /* It turns out to be incredibly hard to deal with all the
486             corner cases of sub foo (); and reporting errors correctly,
487             so lets cheat a bit. Start with a constant subroutine */
488 0           CV *cv = newCONSTSUB(symbol_table,
489             value_for_notfound->name,
490             &PL_sv_yes);
491             /* and then turn it into a non constant declaration only. */
492 0           SvREFCNT_dec(CvXSUBANY(cv).any_ptr);
493 0           CvCONST_off(cv);
494 0           CvXSUB(cv) = NULL;
495 0           CvXSUBANY(cv).any_ptr = NULL;
496             }
497             #ifndef SYMBIAN
498 90           hek = HeKEY_hek(he);
499 90 50         if (!hv_common(constant_missing, NULL, HEK_KEY(hek),
500             HEK_LEN(hek), HEK_FLAGS(hek), HV_FETCH_ISSTORE,
501             &PL_sv_yes, HEK_HASH(hek)))
502 0           Perl_croak(aTHX_ "Couldn't add key '%s' to missing_hash",
503             value_for_notfound->name);
504             #endif
505 90 100         } while ((++value_for_notfound)->name);
506             }
507             /* As we've been creating subroutines, we better invalidate any cached
508             methods */
509 5           mro_method_changed_in(symbol_table);
510             }
511              
512             void
513             constant(sv)
514             INPUT:
515             SV * sv;
516             PREINIT:
517 0           const PERL_CONTEXT *cx = caller_cx(0, NULL);
518             /* cx is NULL if we've been called from the top level. PL_curcop isn't
519             ideal, but it's much cheaper than other ways of not going SEGV. */
520 0 0         const COP *cop = cx ? cx->blk_oldcop : PL_curcop;
521             PPCODE:
522             #ifndef SYMBIAN
523             /* It's not obvious how to calculate this at C pre-processor time.
524             However, any compiler optimiser worth its salt should be able to
525             remove the dead code, and hopefully the now-obviously-unused static
526             function too. */
527 0           HV *constant_missing = (C_ARRAY_LENGTH(values_for_notfound) > 1)
528             ? get_missing_hash(aTHX) : NULL;
529 0 0         if ((C_ARRAY_LENGTH(values_for_notfound) > 1)
530 0           ? hv_exists_ent(constant_missing, sv, 0) : 0) {
531 0 0         sv = newSVpvf("Your vendor has not defined POSIX::2008 macro %" SVf
532             ", used at %" COP_FILE_F " line %d\n", sv,
533 0           COP_FILE(cop), CopLINE(cop));
534             } else
535             #endif
536             {
537 0 0         sv = newSVpvf("%"SVf" is not a valid POSIX::2008 macro at %"
538 0           COP_FILE_F " line %d\n", sv, COP_FILE(cop), CopLINE(cop));
539             }
540 0           croak_sv(sv_2mortal(sv));