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 RWF_DSYNC
347             { "RWF_DSYNC", 9, RWF_DSYNC },
348             #endif
349             #ifdef RWF_HIPRI
350             { "RWF_HIPRI", 9, RWF_HIPRI },
351             #endif
352             #ifdef RWF_SYNC
353             { "RWF_SYNC", 8, RWF_SYNC },
354             #endif
355             #ifdef RWF_NOWAIT
356             { "RWF_NOWAIT", 10, RWF_NOWAIT },
357             #endif
358             #ifdef RWF_APPEND
359             { "RWF_APPEND", 10, RWF_APPEND },
360             #endif
361             #ifdef S_IFMT
362             { "S_IFMT", 6, S_IFMT },
363             #endif
364             #ifdef S_IFBLK
365             { "S_IFBLK", 7, S_IFBLK },
366             #endif
367             #ifdef S_IFCHR
368             { "S_IFCHR", 7, S_IFCHR },
369             #endif
370             #ifdef S_IFIFO
371             { "S_IFIFO", 7, S_IFIFO },
372             #endif
373             #ifdef S_IFREG
374             { "S_IFREG", 7, S_IFREG },
375             #endif
376             #ifdef S_IFDIR
377             { "S_IFDIR", 7, S_IFDIR },
378             #endif
379             #ifdef S_IFLNK
380             { "S_IFLNK", 7, S_IFLNK },
381             #endif
382             #ifdef S_IFSOCK
383             { "S_IFSOCK", 8, S_IFSOCK },
384             #endif
385             #ifdef S_ISUID
386             { "S_ISUID", 7, S_ISUID },
387             #endif
388             #ifdef S_ISGID
389             { "S_ISGID", 7, S_ISGID },
390             #endif
391             #ifdef S_IRWXU
392             { "S_IRWXU", 7, S_IRWXU },
393             #endif
394             #ifdef S_IRUSR
395             { "S_IRUSR", 7, S_IRUSR },
396             #endif
397             #ifdef S_IWUSR
398             { "S_IWUSR", 7, S_IWUSR },
399             #endif
400             #ifdef S_IXUSR
401             { "S_IXUSR", 7, S_IXUSR },
402             #endif
403             #ifdef S_IRWXG
404             { "S_IRWXG", 7, S_IRWXG },
405             #endif
406             #ifdef S_IRGRP
407             { "S_IRGRP", 7, S_IRGRP },
408             #endif
409             #ifdef S_IWGRP
410             { "S_IWGRP", 7, S_IWGRP },
411             #endif
412             #ifdef S_IXGRP
413             { "S_IXGRP", 7, S_IXGRP },
414             #endif
415             #ifdef S_IRWXO
416             { "S_IRWXO", 7, S_IRWXO },
417             #endif
418             #ifdef S_IROTH
419             { "S_IROTH", 7, S_IROTH },
420             #endif
421             #ifdef S_IWOTH
422             { "S_IWOTH", 7, S_IWOTH },
423             #endif
424             #ifdef S_IXOTH
425             { "S_IXOTH", 7, S_IXOTH },
426             #endif
427             #ifdef S_ISVTX
428             { "S_ISVTX", 7, S_ISVTX },
429             #endif
430             #ifdef SEEK_SET
431             { "SEEK_SET", 8, SEEK_SET },
432             #endif
433             #ifdef SEEK_CUR
434             { "SEEK_CUR", 8, SEEK_CUR },
435             #endif
436             #ifdef SEEK_END
437             { "SEEK_END", 8, SEEK_END },
438             #endif
439             #ifdef SEEK_DATA
440             { "SEEK_DATA", 9, SEEK_DATA },
441             #endif
442             #ifdef SEEK_HOLE
443             { "SEEK_HOLE", 9, SEEK_HOLE },
444             #endif
445             #ifdef TIMER_ABSTIME
446             { "TIMER_ABSTIME", 13, TIMER_ABSTIME },
447             #endif
448             #ifdef USER_PROCESS
449             { "USER_PROCESS", 12, USER_PROCESS },
450             #endif
451             #ifdef UTIME_NOW
452             { "UTIME_NOW", 9, UTIME_NOW },
453             #endif
454             #ifdef UTIME_OMIT
455             { "UTIME_OMIT", 10, UTIME_OMIT },
456             #endif
457             #ifdef F_OK
458             { "F_OK", 4, F_OK },
459             #endif
460             #ifdef R_OK
461             { "R_OK", 4, R_OK },
462             #endif
463             #ifdef W_OK
464             { "W_OK", 4, W_OK },
465             #endif
466             #ifdef X_OK
467             { "X_OK", 4, X_OK },
468             #endif
469             { NULL, 0, 0 } };
470 5           const struct iv_s *value_for_iv = values_for_iv;
471 655 100         while (value_for_iv->name) {
472 650           constant_add_symbol(aTHX_ symbol_table, value_for_iv->name,
473             value_for_iv->namelen, newSViv(value_for_iv->value));
474 650           ++value_for_iv;
475             }
476             if (C_ARRAY_LENGTH(values_for_notfound) > 1) {
477             #ifndef SYMBIAN
478 5           HV *const constant_missing = get_missing_hash(aTHX);
479             #endif
480 5           const struct notfound_s *value_for_notfound = values_for_notfound;
481             do {
482              
483             /* Need to add prototypes, else parsing will vary by platform. */
484 115           HE *he = (HE*) hv_common_key_len(symbol_table,
485             value_for_notfound->name,
486             value_for_notfound->namelen,
487             HV_FETCH_LVALUE, NULL, 0);
488             SV *sv;
489             #ifndef SYMBIAN
490             HEK *hek;
491             #endif
492 115 50         if (!he) {
493 0           Perl_croak(aTHX_
494             "Couldn't add key '%s' to %%POSIX::2008::",
495             value_for_notfound->name);
496             }
497 115           sv = HeVAL(he);
498 115 50         if (!SvOK(sv) && SvTYPE(sv) != SVt_PVGV) {
    50          
    50          
    50          
499             /* Nothing was here before, so mark a prototype of "" */
500 115           sv_setpvn(sv, "", 0);
501 0 0         } else if (SvPOK(sv) && SvCUR(sv) == 0) {
    0          
502             /* There is already a prototype of "" - do nothing */
503             } else {
504             /* Someone has been here before us - have to make a real
505             typeglob. */
506             /* It turns out to be incredibly hard to deal with all the
507             corner cases of sub foo (); and reporting errors correctly,
508             so lets cheat a bit. Start with a constant subroutine */
509 0           CV *cv = newCONSTSUB(symbol_table,
510             value_for_notfound->name,
511             &PL_sv_yes);
512             /* and then turn it into a non constant declaration only. */
513 0           SvREFCNT_dec(CvXSUBANY(cv).any_ptr);
514 0           CvCONST_off(cv);
515 0           CvXSUB(cv) = NULL;
516 0           CvXSUBANY(cv).any_ptr = NULL;
517             }
518             #ifndef SYMBIAN
519 115           hek = HeKEY_hek(he);
520 115 50         if (!hv_common(constant_missing, NULL, HEK_KEY(hek),
521             HEK_LEN(hek), HEK_FLAGS(hek), HV_FETCH_ISSTORE,
522             &PL_sv_yes, HEK_HASH(hek)))
523 0           Perl_croak(aTHX_ "Couldn't add key '%s' to missing_hash",
524             value_for_notfound->name);
525             #endif
526 115 100         } while ((++value_for_notfound)->name);
527             }
528             /* As we've been creating subroutines, we better invalidate any cached
529             methods */
530 5           mro_method_changed_in(symbol_table);
531             }
532              
533             void
534             constant(sv)
535             INPUT:
536             SV * sv;
537             PREINIT:
538 0           const PERL_CONTEXT *cx = caller_cx(0, NULL);
539             /* cx is NULL if we've been called from the top level. PL_curcop isn't
540             ideal, but it's much cheaper than other ways of not going SEGV. */
541 0 0         const COP *cop = cx ? cx->blk_oldcop : PL_curcop;
542             PPCODE:
543             #ifndef SYMBIAN
544             /* It's not obvious how to calculate this at C pre-processor time.
545             However, any compiler optimiser worth its salt should be able to
546             remove the dead code, and hopefully the now-obviously-unused static
547             function too. */
548 0           HV *constant_missing = (C_ARRAY_LENGTH(values_for_notfound) > 1)
549             ? get_missing_hash(aTHX) : NULL;
550 0 0         if ((C_ARRAY_LENGTH(values_for_notfound) > 1)
551 0           ? hv_exists_ent(constant_missing, sv, 0) : 0) {
552 0 0         sv = newSVpvf("Your vendor has not defined POSIX::2008 macro %" SVf
553             ", used at %" COP_FILE_F " line %d\n", sv,
554 0           COP_FILE(cop), CopLINE(cop));
555             } else
556             #endif
557             {
558 0 0         sv = newSVpvf("%"SVf" is not a valid POSIX::2008 macro at %"
559 0           COP_FILE_F " line %d\n", sv, COP_FILE(cop), CopLINE(cop));
560             }
561 0           croak_sv(sv_2mortal(sv));