File Coverage

lib/POSIX/1003.pm
Criterion Covered Total %
statement 81 113 71.6
branch 25 42 59.5
condition 3 6 50.0
subroutine 13 16 81.2
pod 3 3 100.0
total 125 180 69.4


line stmt bran cond sub pod time code
1             # Copyrights 2011-2015 by [Mark Overmeer].
2             # For other contributors see ChangeLog.
3             # See the manual pages for details on the licensing terms.
4             # Pod stripped from pm file by OODoc 2.01.
5 2     2   18444 use warnings;
  2         4  
  2         79  
6 2     2   11 use strict;
  2         2  
  2         86  
7              
8             package POSIX::1003;
9 2     2   9 use vars '$VERSION';
  2         3  
  2         109  
10             $VERSION = '0.99_06';
11              
12              
13 2     2   13 use Carp qw/croak/;
  2         2  
  2         107  
14 2     2   226 use POSIX::1003::Module (); # preload
  2         3  
  2         800  
15              
16             my %own_functions = map +($_ => 1), qw/
17             posix_1003_modules
18             posix_1003_names
19             show_posix_names
20             /;
21              
22             our (%EXPORT_TAGS, %IMPORT_FROM, %SUBSET);
23              
24              
25             my %tags =
26             ( confstr => 'POSIX::1003::Confstr'
27             , cs => 'POSIX::1003::Confstr'
28             , errno => 'POSIX::1003::Errno'
29             , errors => 'POSIX::1003::Errno'
30             , events => 'POSIX::1003::Events'
31             , ev => 'POSIX::1003::Events'
32             , fcntl => 'POSIX::1003::Fcntl'
33             , fdio => 'POSIX::1003::FdIO'
34             , fd => 'POSIX::1003::FdIO'
35             , filesystem => 'POSIX::1003::FS'
36             , fs => 'POSIX::1003::FS'
37             , limit => 'POSIX::1003::Limit'
38             , limits => 'POSIX::1003::Limit'
39             , locale => 'POSIX::1003::Locale'
40             , math => 'POSIX::1003::Math'
41             , os => 'POSIX::1003::OS'
42             , opsys => 'POSIX::1003::OS'
43             , pathconf => 'POSIX::1003::Pathconf'
44             , pc => 'POSIX::1003::Pathconf'
45             , processes => 'POSIX::1003::Proc'
46             , proc => 'POSIX::1003::Proc'
47             , properties => 'POSIX::1003::Properties'
48             , property => 'POSIX::1003::Properties'
49             , props => 'POSIX::1003::Properties'
50             , posix => 'POSIX::1003::Properties'
51             , sc => 'POSIX::1003::Sysconf'
52             , sigaction => 'POSIX::SigAction'
53             , signals => [qw/POSIX::1003::Signals POSIX::SigSet POSIX::SigAction/]
54             , sigset => 'POSIX::SigSet'
55             , socket => 'POSIX::1003::Socket'
56             , sysconf => 'POSIX::1003::Sysconf'
57             , termio => 'POSIX::1003::Termios'
58             , termios => 'POSIX::1003::Termios'
59             , time => 'POSIX::1003::Time'
60             , user => 'POSIX::1003::User'
61             );
62              
63             my %mod_tag;
64             while(my ($tag, $pkg) = each %tags)
65             { $pkg = $pkg->[0] if ref $pkg eq 'ARRAY';
66             $mod_tag{$pkg} = $tag
67             if !$mod_tag{$pkg}
68             || length $mod_tag{$pkg} < length $tag;
69             }
70              
71             { eval "require POSIX::1003::Symbols";
72             die $@ if $@;
73             }
74              
75             while(my ($pkg, $tag) = each %mod_tag) # unique modules
76             { $IMPORT_FROM{$_} = $tag for @{$EXPORT_TAGS{$tag}};
77             }
78              
79             sub _tag2mods($)
80 4     4   6 { my $tag = shift;
81 4 50       10 my $r = $tags{$tag} or croak "unknown tag '$tag'";
82 4 50       17 ref $r eq 'ARRAY' ? @$r : $r;
83             }
84              
85 0     0   0 sub _mod2tag($) { $mod_tag{$_[0]} }
86 0     0   0 sub _tags() { keys %tags}
87              
88             sub import(@)
89 4     4   19 { my $class = shift;
90 4         4 my (%mods, %modset, %from);
91              
92 4 50 33     16 my $level = @_ && $_[0] =~ /^\+(\d+)$/ ? shift : 0;
93 4 100 66     39 return if @_==1 && $_[0] eq ':none';
94 3 50       5 @_ = ':all' if !@_;
95              
96 2     2   10 no strict 'refs';
  2         2  
  2         59  
97 2     2   8 no warnings 'once';
  2         3  
  2         1582  
98 3         10 my $to = (caller $level)[0];
99              
100 3         6 foreach (@_)
101 3 50       9 { if($_ eq ':all')
    100          
    100          
102 0         0 { $mods{$_}++ for values %mod_tag;
103 0         0 *{$to.'::'.$_} = \&$_ for keys %own_functions;
  0         0  
104             }
105             elsif(m/^\:(.*)/)
106 1 50       4 { if(exists $tags{$1})
    0          
107             { # module by longest alias
108 1         2 $mods{$_}++ for map $mod_tag{$_}, _tag2mods $1;
109             }
110             elsif(my $subset = $SUBSET{$1})
111 0         0 { push @{$modset{$subset}}, $1;
  0         0  
112             }
113 0         0 else { croak "unknown tag '$_'" };
114             }
115             elsif($own_functions{$_})
116 1         2 { *{$to.'::'.$_} = \&$_;
  1         5  
117             }
118             else
119 1 50       4 { my $mod = $IMPORT_FROM{$_} or croak "unknown symbol '$_'";
120 1         1 push @{$from{$mod}}, $_;
  1         3  
121             }
122             }
123              
124             # no need for separate symbols when we need all
125 3         6 delete $from{$_} for keys %mods;
126              
127             # print "from $_ all\n" for keys %mods;
128             # print "from $_ @{$from{$_}}\n" for keys %from;
129              
130 3         6 my $up = '+' . ($level+1);
131 3         3 foreach my $tag (keys %mods) # whole tags
132 1         27 { delete $modset{$tag};
133 1         2 delete $from{$tag};
134 1         2 foreach my $pkg (_tag2mods($tag))
135 1 50       39 { eval "require $pkg"; die $@ if $@;
  1         5  
136 1         5 $pkg->import($up, ':all');
137             }
138             }
139 3         5 foreach my $tag (keys %modset)
140 0         0 { foreach my $pkg (_tag2mods($tag))
141 0 0       0 { eval "require $pkg"; die $@ if $@;
  0         0  
142 0         0 my @subsets = @{$modset{$tag}};
  0         0  
143 0         0 my $et = \%{"$pkg\::EXPORT_TAGS"};
  0         0  
144 0         0 $pkg->import($up, @{$et->{$_}})
145 0         0 for @subsets;
146             }
147             }
148 3         1264 foreach my $tag (keys %from) # separate symbols
149 1         2 { foreach my $pkg (_tag2mods($tag))
150 1 50       43 { eval "require $pkg"; die $@ if $@;
  1         4  
151 1         1 $pkg->import($up, @{$from{$tag}});
  1         6  
152             }
153             }
154             }
155              
156              
157             sub posix_1003_modules()
158 1     1 1 1 { my %mods;
159 1         6 foreach my $mods (values %tags)
160 35 100       69 { $mods{$_}++ for ref $mods eq 'ARRAY' ? @$mods : $mods;
161             }
162 1         8 keys %mods;
163             }
164              
165              
166             sub posix_1003_names(@)
167 3     3 1 972 { my %names;
168             my @modules;
169 3 100       8 if(@_)
170 2         4 { my %mods;
171 2         4 foreach my $sel (@_)
172 2 100       13 { $mods{$_}++ for $sel =~ m/^:(\w+)/ ? _tag2mods($1) : $sel;
173             }
174 2         6 @modules = keys %mods;
175             }
176             else
177 1         4 { @modules = posix_1003_modules;
178             }
179              
180 3         5 foreach my $pkg (@modules)
181 23         814 { eval "require $pkg";
182 23 50       70 $@ && next; # die?
183 23 100       187 $pkg->can('import') or next;
184 21         40 $pkg->import(':none'); # create %EXPORT_OK
185              
186 2     2   9 no strict 'refs';
  2         4  
  2         344  
187 21         16 my $exports = \%{"${pkg}::EXPORT_OK"};
  21         38  
188 21         714 $names{$_} = $pkg for keys %$exports;
189             }
190              
191 3 50       364 wantarray ? keys %names : \%names;
192             }
193              
194              
195             sub show_posix_names(@)
196 0     0 1   { my $pkg_of = posix_1003_names @_;
197 0           my %order = map {(my $n = lc $_) =~ s/[^A-Za-z0-9]//g; ($n => $_)}
  0            
  0            
198             keys %$pkg_of; # Swartzian transform
199              
200 2     2   11 no strict 'refs';
  2         2  
  2         419  
201 0           foreach (sort keys %order)
202 0           { my $name = $order{$_};
203 0           my $pkg = $pkg_of->{$name};
204 0           $pkg->import($name);
205 0           my $val = $pkg->exampleValue($name);
206 0           (my $abbrev = $pkg) =~ s/^POSIX\:\:1003\:\:/::/;
207 0           my $mod = $mod_tag{$pkg};
208 0 0         if(defined $val)
209 0           { printf "%-12s :%-10s %-30s %s\n", $abbrev, $mod, $name, $val;
210             }
211             else
212 0           { printf "%-12s :%-10s %s\n", $abbrev, $mod, $name;
213             }
214             }
215 0           print "*** ".(keys %$pkg_of)." symbols in total\n";
216             }
217              
218             #------------
219              
220             1;