File Coverage

web/cgi-bin/yatt.lib/YATT/Util.pm
Criterion Covered Total %
statement 2158 2184 98.8
branch 306 590 51.8
condition 22 38 57.8
subroutine 385 385 100.0
pod 0 23 0.0
total 2871 3220 89.1


line stmt bran cond sub pod time code
1             # -*- mode: perl; coding: utf-8 -*-
2             package YATT::Util;
3 15     15   23211 use base qw(Exporter);
  15         27  
  15         1139  
4 15     15   1127 use strict;
  15         1091  
  15         452  
5 15     15   72 use warnings qw(FATAL all NONFATAL misc);
  15         28  
  15         800  
6              
7 14     14   66 use Carp;
  14         23  
  14         780  
8 14     14   68 use File::Basename;
  14         28  
  14         2086  
9              
10 14     14   8347 use YATT::Util::Taint;
  14         35  
  14         2222  
11              
12             BEGIN {
13             our @EXPORT_OK
14 14     14   76 = qw(&catch
15             &rootname
16             &optional
17             &try_can
18              
19             &require_and
20             &call_type
21             &load_type
22              
23             &default
24             &defined_fmt
25             &coalesce
26             &numeric
27              
28             &lsearch
29             &escape
30             &decode_args
31             &named_attr
32             &attr
33             &resume
34              
35             &checked
36             &checked_eval
37             &terse_dump
38              
39             &add_arg_order_in
40              
41             ©_array
42              
43             &line_info
44             &needs_line_info
45             );
46 14         20227 our @EXPORT = @EXPORT_OK;
47             }
48              
49             sub catch (&@) {
50 13     13 0 38 my ($sub, $errorVar) = @_;
51 13         27 eval { $sub->() };
  13         113  
52 13         123657 $$errorVar = $@;
53             }
54              
55             sub rootname {
56 3 50   3 0 32 push @_, qr{\.\w+$} unless @_ > 1;
57 3         496 my ($basename, $dirname, $suffix) = fileparse(@_);
58 3         31 join "", $dirname, $basename;
59             }
60              
61             sub optional {
62 1     1 0 2 my ($hash, $member, $key) = @_;
63 1 0       37 defined (my $value = $hash->{$member}) or return;
64 1         5 ($key, $value);
65             }
66              
67             sub try_can {
68 1     1 0 2 my ($obj, $method) = splice @_, 0, 2;
69 1 0       50 my $sub = $obj->can($method) or return;
70 1         5 $sub->($obj, @_);
71             }
72              
73             sub load_type {
74 740     740 0 1329 my ($self, $typealias, $method) = @_;
75 740         2639 my $realclass = $self->$typealias();
76 740 100 50     5743 unless ($realclass->can($method || 'new')) {
77 9         614 eval "require $realclass";
78 9 50       85 die $@ if $@;
79 9 50       138 if (my $break = YATT->can("break_\l$typealias")) {
80 9         41 $break->();
81             }
82             }
83 740         1900 $realclass;
84             }
85              
86             sub call_type {
87 740     740 0 1743 my ($self, $typealias, $method) = splice @_, 0, 3;
88 740         1757 my $realclass = load_type($self, $typealias, $method);
89 740         3758 $realclass->$method(@_);
90             }
91              
92             sub require_and {
93 26     26 0 71 my ($class) = shift;
94 26         52 my $method = shift;
95 26 50       264 unless ($class->can($method)) {
96 1         6 eval "require $class";
97 1 0       2 die $@ if $@;
98             }
99 26         178 $class->$method(@_);
100             }
101              
102             sub coalesce {
103 254     254 0 2506 foreach my $item (@_) {
104 429 100       2297 return $item if defined $item;
105             }
106             }
107             *default = *coalesce; *default = *coalesce;
108             sub numeric {
109 1     1 0 212 default(@_, 0);
110             }
111              
112             sub defined_fmt ($$$) {
113 163     163 0 538 my ($fmt, $value, $default) = @_;
114 163 100       420 unless (defined $value) {
115 140         701 $default;
116             } else {
117 24         176 sprintf $fmt, $value;
118             }
119             }
120              
121             sub lsearch (&$;$) {
122 722     722 0 2212 my ($cmp, $list, $i) = @_;
123 722 100       1970 $i = 0 unless defined $i;
124 722         1519 foreach (@{$list}[$i .. $#$list]) {
  722         2025  
125 1504 100       3750 return $i if $cmp->();
126             } continue {
127 969         2054 $i++;
128             }
129             return
130 187         708 }
131              
132             my %escape = (qw(< <
133             > >
134             " "
135             & &)
136             , "\'", "'");
137              
138             our $ESCAPE_UNDEF = '';
139              
140             sub escape {
141 177 100 100 177 0 1134 return if wantarray && !@_;
142 176         443 my @result;
143 176         391 foreach my $str (@_) {
144 198         326 push @result, do {
145 198 50       848 unless (defined $str) {
    100          
    100          
146 1         2 $ESCAPE_UNDEF;
147             } elsif (ref $str eq 'SCALAR') {
148             # PASS Thru. (Already escaped)
149 6         265 $$str;
150             } elsif (ref($str) =~ /^YATT::Util::/) {
151             # Yet another PASS Thru. (Already escaped)
152 3         46 $$str;
153             } else {
154 191         317 my $copy = $str;
155 191         525 $copy =~ s{([<>&\"\'])}{$escape{$1}}g;
156 191         649 $copy;
157             }
158             };
159             }
160 176 100       3451 wantarray ? @result : $result[0];
161             }
162              
163             sub _handle_arg_desc {
164 1     1   43 my ($desc) = shift;
165 1 0       4 unless (defined $desc->[2]) {
    0          
    0          
    0          
166             # '?' case.
167 1 0 0     2 defined $_[0] && $_[0] ne '' ? $_[0] : $desc->[1];
168             } elsif (ref $desc->[2]) {
169             # extension.
170 1         234 $desc->[2]->($desc->[1], $_[0]);
171             } elsif ($desc->[2] eq '/') {
172 1 0       8 defined $_[0] ? $_[0] : $desc->[1];
173             } elsif ($desc->[2] eq '|') {
174 1 0       2 $_[0] ? $_[0] : $desc->[1];
175             } else {
176 1         37 confess "Invalid arg spec $desc->[2] for $desc->[0]";
177             }
178             }
179              
180             sub decode_args {
181 1     1 0 5 my ($args) = shift;
182 1 0       2 unless (defined $args) {
    0          
183             map {
184 1 0       48 ref $_[$_] eq 'ARRAY' ? $_[$_]->[1] : undef;
  1         5  
185             } 0 .. $#_;
186             } elsif (ref $args eq 'ARRAY') {
187             map {
188 1 0       2 unless (ref $_[$_]) {
  1         275  
189 1         8 $args->[$_];
190             } else {
191 1         2 _handle_arg_desc($_[$_], $args->[$_]);
192             }
193             } 0 .. $#_;
194             } else {
195 1         34 my @args;
196 1         5 foreach my $desc (@_) {
197 1         2 push @args, do {
198 1 0       45 unless (ref $desc) {
199 1         5 delete $args->{$desc};
200             } else {
201 1         2 _handle_arg_desc($desc, delete $args->{$desc->[0]});
202             }
203             };
204             }
205 1 0       199 if (%$args) {
206 1         8 my ($pkg, $file, $line) = caller(0);
207 1         2 die "Invalid args at $file line $line: "
208             . join(", ", sort keys %$args) . "\n";
209             }
210 1         35 @args;
211             }
212             }
213              
214             sub attr {
215 3     3 0 10 my ($attname) = shift;
216 3 100       7 my @result = grep {defined $_ && $_ ne ''} @_;
  7         77  
217 3 50       12 return '' unless @result;
218 3         20 bless \(sprintf q{ %s="%s"}, $attname, join ' ', @result)
219             , __PACKAGE__ . '::attr';
220             }
221              
222             sub named_attr {
223 6     6 0 405 my ($attname, $value, $spc) = @_;
224 6 100 66     44 return '' unless defined $value && $value ne '';
225 5 50       20 sprintf('%s%s="%s"', defined $spc ? $spc : ' '
226             , $attname, YATT::escape($value));
227             }
228              
229             {
230             package YATT::Util::attr;
231 14     14   3249 use overload qw("" stringify);
  14         2314  
  14         158  
232             sub stringify {
233 1     1   38 ${$_[0]}
  1         6  
234             }
235             }
236              
237             sub resume {
238 1     1 0 3 my ($CGI, $name, $value, $type) = @_;
239 1 0       46 unless (defined $type) {
    0          
    0          
240 1         4 ""
241             } elsif ($type =~ /^(?:radio|checkbox)$/i) {
242 1   0     2 my $cache = $CGI->{'.RESUME_CACHE'}->{$name} ||= do {
243 1         362 my %cache;
244 1         7 $cache{$_} = 1 for $CGI->param($name);
245 1         2 \%cache;
246             };
247 1 0       35 $cache->{$value} ? "checked" : "";
248             } elsif ($type =~ /^(?:|text|password)$/i) {
249 1         5 named_attr(value => scalar $CGI->param($name), ' ');
250             } else {
251             # textarea と select option の selected. (multi もあるでよ)
252             }
253             }
254              
255             sub checked {
256 55     55 0 133 my ($pack, $method, $fmt, $obj) = splice @_, 0, 4;
257 55         124 my $result = eval {$obj->$method(@_)};
  55         220  
258 55 50       137 if ($@) {
259 1         331 sprintf $fmt, $@;
260             } else {
261 55         171 $result;
262             }
263             }
264              
265             sub checked_eval {
266             # $_[0] is ignored.
267             # XXX: local @_ = do { eval $_[1] }; を使えないか?
268 439 50   439 0 1453 die "Undefined expression" unless defined $_[1];
269 439 50       1728 croak "Tainted expression" if is_tainted($_[1]);
270 439         532 my @___result;
271 439         1443 &YATT::break_eval;
272 439 50       905 if (wantarray) {
273 1         5 @___result = eval $_[1];
274             } else {
275 439 50 100 5   25974 $___result[0] = eval $_[1];
  6 50 100 5   84  
  5 50 33 5   13  
  5 50 33 5   381  
  5 50 33 5   365  
  5 50 66 5   18  
  5 50   5   266  
  5 50   5   56  
  5 50   7   18  
  5 50   2   284  
  5 50   2   69  
  7 50   2   15  
  7 50   2   276  
  7 50   2   351  
  5 50   4   16  
  5 50   2   1939  
  5 50   2   56  
  5 50   2   14  
  5 50   2   271  
  5 50   3   67  
  5 50   3   15  
  5 50   2   19  
  5 50   2   354  
  5 50   2   26  
  5 50   3   289  
  5 50   2   62  
  5 50   2   13  
  5 50   2   28  
  2 50   2   55  
  2 50   4   11  
  2 50   2   5  
  2 100   2   344  
  2 50   2   11  
  2 50   2   4  
  2 50   2   43  
  2 50   2   11  
  3 50   2   10  
  3 50   2   57  
  3 50   2   11  
  3 50   2   9  
  3 50   2   374  
  3 50   2   20  
  3 50   2   12  
  3 50   2   47  
  3 50   2   13  
  1 50   2   2  
  1 50   2   55  
  1 50   2   4  
  1 50   2   3  
  1 50   2   379  
  1 50   3   8  
  1 50   2   4  
  1 50   2   41  
  1 50   2   5  
  1 50   2   2  
  1 50   2   50  
  2 50   2   7  
  2 50   2   5  
  2 50   3   512  
  2 50   2   9  
  2 50   4   4  
  2 50   2   31  
  2 50   2   8  
  2 50   2   4  
  2 50   2   144  
  2 50   2   8  
  2 50   2   5  
  2 50   2   15  
  2 50   2   12  
  2 50   2   5  
  2 50   2   41  
  2 50   2   7  
  2 50   2   4  
  2 50   2   54  
  2 50   2   8  
  2 50   2   6  
  2 50   2   455  
  2 50   2   11  
  2 50   2   4  
  2 50   2   42  
  2 50   3   8  
  2 50   4   4  
  2 50   4   55  
  1 50   2   5  
  2 50   2   5  
  2 100   2   566  
  2 100   3   10  
  2 50   2   5  
  2 100   2   43  
  2 100   3   9  
  2 50   2   6  
  2 50   3   52  
  2 50   4   8  
  2 50   2   6  
  2 50   2   698  
  2 50   2   12  
  2 50   3   4  
  2 50   2   45  
  2 50   2   10  
  2 50   2   7  
  2 50   2   53  
  2 100   3   7  
  2 100   2   5  
  2 50   2   402  
  2 50   2   9  
  2 50   2   4  
  2 50   2   30  
  2 50   2   8  
  2 50   2   6  
  2 50   2   143  
  2 50   2   8  
  2 50   2   5  
  2 50   1   11  
  2 50   2   11  
  2 50   2   4  
  2 50   2   43  
  2 50   2   9  
  2 50   2   5  
  2 50   1   52  
  2 50   2   8  
  2 50   2   4  
  2 50   2   367  
  2 50   2   9  
  2 50   2   45  
  2 0   2   41  
  2 50   2   7  
  2 50   2   5  
  2 50   2   48  
  2 50   2   7  
  2 50   2   3  
  2 0   2   357  
  2 50   2   11  
  2 50   2   8  
  4 50   2   50  
  4 50   2   13  
  4 50   2   7  
  4 50   2   57  
  4 50   2   9  
  4 50   2   14  
  4 50   2   373  
  4 50   2   19  
  2 50   2   4  
  2 50   2   44  
  2 50   4   8  
  2 50   2   5  
  2 50   2   51  
  2 50   3   10  
  2 50   2   6  
  2 50   2   354  
  2 50   2   12  
  2 50   2   8  
  2 50   2   39  
  2 50   2   12  
  2 50   2   10  
  2 50   2   55  
  1 50   2   5  
  2 50   2   4  
  2 50   4   353  
  2 50   2   11  
  2 50   2   3  
  2 50   2   37  
  2 50   2   11  
  2 50   2   5  
  2 50   4   48  
  2 50   2   7  
  2 50   2   4  
  2 50   2   396  
  2 50   2   15  
  2 50   2   5  
  2 50   2   45  
  2 50   2   8  
  2 50   2   7  
  2 50   3   60  
  2 50   2   12  
  4 50   2   10  
  4 50   2   402  
  4 50   2   15  
  4 50   2   10  
  4 50   2   42  
  4 50   2   24  
  4 50   2   13  
  4 50   2   58  
  4 50   2   15  
  4 50   2   11  
  4 50   2   365  
  2 50   2   11  
  2 50   2   5  
  2 100   2   39  
  2 100   3   8  
  2 50   2   5  
  2 50   2   52  
  2 50   4   7  
  2 100   3   4  
  2 100   2   359  
  2 50   3   11  
  2 50   2   5  
  2 50   2   46  
  2 50   3   9  
  2 50   2   5  
  2 50   2   55  
  2 50   3   8  
  2 50   2   4  
  2 50   2   390  
  2 100   2   11  
  2 50   2   5  
  2 100   2   44  
  1 50   2   5  
  1 50   2   4  
  2 50   2   49  
  2 50   2   6  
  2 100   3   5  
  2 100   2   331  
  2 100   2   8  
  2 50   2   7  
  2 50   2   38  
  2 50   2   8  
  3 50   2   5  
  3 50   2   49  
  3 50   2   7  
  3 50   2   7  
  3 50   2   336  
  3 50   3   16  
  3 50   2   7  
  3 50   2   42  
  3 50   2   9  
  3 50   2   5  
  3 50   2   51  
  3 50   2   9  
  3 50   3   6  
  3 50   2   337  
  3 50   2   15  
  3 100   2   7  
  2 100   2   37  
  2 50   2   8  
  2 50   2   4  
  2 50   1   48  
  2 50   2   5  
  2 50   2   7  
  2 50   2   357  
  2 50   2   11  
  2 100   2   4  
  2 100   2   43  
  2 50   2   8  
  2 50   2   8  
  2 50   2   52  
  2     2   9  
  2     2   5  
  2     2   339  
  2     2   12  
  2     2   3  
  2     2   42  
  2     3   8  
  2     4   7  
  2     2   52  
  2     2   9  
  3     4   6  
  3     2   425  
  3     2   12  
  3     2   5  
  3     2   46  
  3     3   14  
  3     2   9  
  3     2   58  
  2     4   8  
  2     2   3  
  2     2   539  
  2     2   11  
  2     2   4  
  2     2   44  
  2     2   8  
  2     2   4  
  2     2   55  
  2     2   7  
  2     2   4  
  2     2   442  
  2     4   11  
  2     3   7  
  2     2   41  
  2     2   8  
  2     4   5  
  2     2   53  
  2     4   7  
  2     2   4  
  2     2   573  
  2     2   18  
  2     2   7  
  2     2   63  
  2     2   13  
  2     1   7  
  2     2   73  
  2     2   11  
  2     2   9  
  2     2   916  
  2     2   13  
  2     2   5  
  4     2   49  
  4     2   11  
  4     2   7  
  4     2   67  
  4     2   10  
  4     2   13  
  4     2   275  
  4     2   26  
  4     2   9  
  2     2   37  
  2     2   13  
  2     2   5  
  2     2   47  
  2     2   6  
  2     2   8  
  2     2   243  
  2     2   15  
  2     2   5  
  2     2   39  
  2     2   9  
  2     2   7  
  2     2   57  
  2     2   11  
  2     2   7  
  2     1   282  
  2     1   13  
  2     1   5  
  2     1   39  
  2     1   9  
  2     1   5  
  2     1   52  
  2     1   7  
  2     1   7  
  1     1   254  
  2     1   10  
  2     3   5  
  2     1   41  
  2     1   8  
  2     2   5  
  2     1   59  
  2     1   7  
  2     1   5  
  2     1   202  
  2     3   11  
  2     1   5  
  2     3   43  
  2     1   9  
  2     1   5  
  2     1   52  
  2     1   7  
  2     1   5  
  2     1   195  
  2     1   11  
  2     1   6  
  2         44  
  2         7  
  2         4  
  2         54  
  2         8  
  2         6  
  2         285  
  2         12  
  2         5  
  2         42  
  2         9  
  2         4  
  2         54  
  2         6  
  2         5  
  2         271  
  2         15  
  2         5  
  2         41  
  2         8  
  2         5  
  2         54  
  2         8  
  2         5  
  2         575  
  1         9  
  2         5  
  2         44  
  2         6  
  2         5  
  2         52  
  2         9  
  1         3  
  2         808  
  2         12  
  2         4  
  2         42  
  2         8  
  2         7  
  2         51  
  2         8  
  2         4  
  2         265  
  2         10  
  2         8  
  2         38  
  2         8  
  2         5  
  2         48  
  2         7  
  2         4  
  2         265  
  2         11  
  2         7  
  2         37  
  2         8  
  2         4  
  2         50  
  2         7  
  2         7  
  2         271  
  2         12  
  2         6  
  2         40  
  2         9  
  2         5  
  2         52  
  2         7  
  2         8  
  2         221  
  2         13  
  2         4  
  2         41  
  2         13  
  2         4  
  2         52  
  2         7  
  2         5  
  2         219  
  2         13  
  2         6  
  2         40  
  2         9  
  2         4  
  2         52  
  2         11  
  2         7  
  2         246  
  2         12  
  2         5  
  2         43  
  2         7  
  2         5  
  2         56  
  2         8  
  2         5  
  2         207  
  2         13  
  2         6  
  2         59  
  2         10  
  2         4  
  2         55  
  2         6  
  2         8  
  3         362  
  3         14  
  3         8  
  3         43  
  3         9  
  3         9  
  3         57  
  3         9  
  2         6  
  2         267  
  2         10  
  2         5  
  2         41  
  2         10  
  2         4  
  2         52  
  2         6  
  2         4  
  2         226  
  2         12  
  1         2  
  2         40  
  2         9  
  2         4  
  2         52  
  2         7  
  2         6  
  2         219  
  2         13  
  2         6  
  2         41  
  2         8  
  2         5  
  2         53  
  2         8  
  2         7  
  2         279  
  2         12  
  2         5  
  2         47  
  2         10  
  2         9  
  2         58  
  2         9  
  2         6  
  2         306  
  2         11  
  2         7  
  1         39  
  2         8  
  2         6  
  2         60  
  2         9  
  2         4  
  2         405  
  2         13  
  2         5  
  2         41  
  2         8  
  2         4  
  3         53  
  3         8  
  3         6  
  3         357  
  3         11  
  3         10  
  3         43  
  3         11  
  2         4  
  2         52  
  2         8  
  2         5  
  2         523  
  2         15  
  2         4  
  2         41  
  4         10  
  4         8  
  4         55  
  4         13  
  4         7  
  4         377  
  4         18  
  4         11  
  2         39  
  2         8  
  2         4  
  2         52  
  2         6  
  2         7  
  2         370  
  2         12  
  2         4  
  2         44  
  2         8  
  2         7  
  2         52  
  2         7  
  2         4  
  2         386  
  2         12  
  2         6  
  2         48  
  2         10  
  2         4  
  2         57  
  2         6  
  2         5  
  2         393  
  2         12  
  2         5  
  2         42  
  2         8  
  2         4  
  2         58  
  2         7  
  2         4  
  2         478  
  2         18  
  2         5  
  2         41  
  2         9  
  2         4  
  2         51  
  2         7  
  2         5  
  2         565  
  2         10  
  2         5  
  2         39  
  2         8  
  2         4  
  2         53  
  2         8  
  2         5  
  2         209  
  2         11  
  2         5  
  2         50  
  2         7  
  2         5  
  2         159  
  2         9  
  2         5  
  2         596  
  2         10  
  2         6  
  2         42  
  2         8  
  2         6  
  2         59  
  2         8  
  2         7  
  2         260  
  2         13  
  2         3  
  2         38  
  2         7  
  2         9  
  2         47  
  2         8  
  2         3  
  2         258  
  2         9  
  2         7  
  2         39  
  2         8  
  2         5  
  2         46  
  2         9  
  2         4  
  2         226  
  2         10  
  2         6  
  2         37  
  2         9  
  2         5  
  2         48  
  2         9  
  2         4  
  2         233  
  2         11  
  2         6  
  2         42  
  2         12  
  2         6  
  2         61  
  2         7  
  2         7  
  2         236  
  2         13  
  2         4  
  2         37  
  2         8  
  2         5  
  2         46  
  2         8  
  2         4  
  2         265  
  2         12  
  2         5  
  2         34  
  2         9  
  2         4  
  2         46  
  2         7  
  2         8  
  2         188  
  2         12  
  2         4  
  2         50  
  2         10  
  2         6  
  2         56  
  2         12  
  2         5  
  2         228  
  2         10  
  2         5  
  2         34  
  2         8  
  2         4  
  2         52  
  2         8  
  2         5  
  2         220  
  2         12  
  2         4  
  2         39  
  3         9  
  3         7  
  3         48  
  3         9  
  3         5  
  3         1797  
  3         14  
  3         8  
  3         39  
  4         12  
  4         6  
  4         50  
  4         10  
  4         6  
  4         236  
  4         25  
  4         17  
  3         36  
  4         12  
  4         7  
  4         47  
  4         10  
  4         8  
  4         200  
  4         18  
  4         34  
  4         49  
  2         8  
  4         10  
  2         46  
  2         7  
  2         5  
  2         245  
  2         11  
  2         6  
  2         38  
  2         8  
  2         5  
  2         49  
  2         7  
  2         9  
  2         373  
  2         12  
  2         7  
  2         41  
  2         9  
  2         4  
  2         45  
  2         8  
  2         8  
  1         349  
  3         11  
  3         8  
  3         39  
  3         10  
  3         6  
  3         50  
  3         11  
  3         8  
  2         191  
  2         9  
  2         6  
  2         37  
  2         7  
  2         8  
  2         45  
  2         8  
  2         6  
  2         270  
  2         11  
  2         4  
  2         36  
  2         7  
  2         6  
  1         39  
  3         8  
  3         7  
  3         236  
  3         11  
  3         4  
  3         41  
  3         9  
  2         4  
  2         47  
  2         7  
  2         4  
  2         348  
  2         12  
  2         16  
  1         34  
  3         8  
  3         6  
  3         49  
  3         9  
  3         5  
  3         372  
  3         14  
  3         7  
  4         40  
  4         11  
  4         10  
  4         46  
  4         11  
  4         11  
  4         395  
  4         18  
  3         6  
  4         42  
  2         8  
  2         5  
  2         45  
  2         7  
  2         5  
  2         211  
  2         10  
  2         4  
  2         38  
  2         7  
  2         5  
  2         45  
  2         8  
  2         5  
  2         227  
  1         8  
  2         4  
  2         41  
  2         7  
  2         5  
  2         50  
  2         10  
  2         6  
  2         583  
  3         13  
  3         6  
  3         41  
  3         10  
  3         6  
  3         54  
  3         12  
  3         11  
  2         466  
  2         10  
  2         5  
  2         39  
  2         8  
  2         7  
  2         48  
  2         7  
  2         4  
  2         601  
  2         11  
  2         8  
  2         39  
  2         8  
  2         4  
  2         49  
  2         7  
  2         4  
  2         759  
  2         12  
  2         5  
  2         38  
  2         9  
  2         5  
  2         47  
  2         8  
  2         4  
  2         618  
  2         11  
  2         4  
  2         40  
  2         9  
  3         8  
  3         49  
  3         8  
  3         8  
  3         460  
  3         16  
  3         7  
  3         41  
  3         10  
  3         9  
  2         45  
  2         9  
  2         4  
  2         230  
  2         9  
  2         7  
  1         38  
  2         8  
  2         5  
  2         46  
  2         9  
  2         6  
  2         562  
  2         7  
  2         5  
  2         31  
  2         8  
  2         4  
  2         38  
  2         7  
  2         7  
  2         50  
  2         7  
  2         4  
  2         9  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         4  
  1         5  
  1         3  
  1         3  
  1         3  
  1         2  
  1         1  
  1         2  
  1         5  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         2  
  1         6  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         4  
  1         2  
  1         44  
  1         4  
  1         3  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         4  
  1         3  
  1         3  
  1         2  
  1         3  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         5  
  1         3  
  1         2  
  1         2  
  1         2  
  1         5  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         1  
  1         5  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         5  
  1         3  
  1         3  
  1         3  
  1         2  
  1         3  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         4  
  1         4  
  1         3  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         17  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         2  
  1         1  
  1         3  
  1         2  
  1         5  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         5  
  1         2  
  1         4  
  1         3  
  1         2  
  1         2  
  1         3  
  1         1  
  1         5  
  1         2  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         5  
  1         3  
  1         3  
  1         2  
  1         1  
  1         2  
  1         3  
  1         1  
  1         5  
  1         2  
  1         3  
  1         2  
  1         3  
  1         1  
  1         3  
  1         2  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         5  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         4  
  1         2  
  1         8  
  1         2  
  1         3  
  1         2  
  1         4  
  1         1  
  1         3  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         6  
  1         8  
  1         4  
  1         6  
  1         5  
  1         14  
  1         7  
  1         7  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         3  
  1         1  
  1         2  
  1         3  
  1         4  
  1         2  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         1  
  1         5  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         4  
  1         4  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         4  
  1         6  
  1         3  
  1         6  
  1         4  
  1         8  
  1         6  
  1         5  
  1         6  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         2  
  1         3  
  1         4  
  3         5  
  3         6  
  3         4  
  3         5  
  3         6  
  3         8  
  3         7  
  1         2  
  1         2  
  1         2  
  1         3  
  1         1  
  1         5  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  1         3  
  2         3  
  2         4  
  2         4  
  2         3  
  2         4  
  2         7  
  2         6  
  1         5  
  1         3  
  1         5  
  1         5  
  1         3  
  1         11  
  1         9  
  1         3  
  1         6  
  1         3  
  1         3  
  1         2  
  1         3  
  1         2  
  1         34  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         1  
  1         5  
  1         2  
  1         3  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         5  
  1         3  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         5  
  1         3  
  1         5  
  1         2  
  1         1  
  1         4  
  1         2  
  1         4  
  1         4  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         4  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         5  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         3  
  3         4  
  3         7  
  3         4  
  3         6  
  3         6  
  3         9  
  3         6  
  3         5  
  3         7  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         2  
  1         3  
  1         3  
  1         8  
  1         1  
  1         2  
  1         2  
  1         5  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         4  
  1         3  
  1         4  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         4  
  1         2  
  1         3  
  1         3  
  1         3  
  1         2  
  1         3  
  1         2  
  1         5  
  1         3  
  1         2  
  1         3  
  3         6  
  3         9  
  3         6  
  3         7  
  3         10  
  3         13  
  3         8  
  3         9  
  3         9  
  3         9  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         2  
  1         2  
  1         1  
  1         3  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         5  
  1         3  
  1         796  
  1         5  
  1         2  
  1         3  
  1         2  
  1         2  
  1         1  
  1         4  
  1         3  
  1         2  
  1         3  
  1         4  
  1         3  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         5  
  1         3  
  1         3  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         4  
  1         3  
  2         14  
  2         34  
  1         5  
  1         6  
  1         5  
  1         5  
  1         9  
  1         4  
  1         3  
  1         5  
  1         5  
  1         4  
  1         4  
  1         5  
  1         4  
  1         4  
  1         4  
  1         4  
  1         4  
  1         5  
  1         5  
  1         7  
  1         5  
  1         3  
  1         3  
  1         3  
  1         5  
  1         5  
  1         5  
  1         5  
  1         31  
  1         22  
  1         11  
  1         9  
  1         4  
  1         3  
  1         3  
  1         7  
  1         5  
  1         4  
  1         5  
  1         5  
  1         5  
  1         5  
  1         5  
  1         6  
  1         2  
  1         33  
  1         12  
  2         8  
  2         11  
  1         5  
  1         31  
  1         5  
  1         5  
  1         5  
  3         10  
  3         12  
  2         8  
  2         10  
  2         69  
  2         11  
  1         5  
  1         6  
  2         8  
  2         8  
  1         4  
  2         10  
  1         5  
  1         2  
  1         2  
  1         4  
  1         1  
  1         3  
  1         4  
  1         6  
  1         7  
  2         6  
  2         5  
  2         9  
  2         6  
  1         5  
  1         32  
  1         6  
  1         4  
  1         7  
  3         15  
  1         5  
  2         7  
  2         7  
  1         5  
  1         5  
  1         5  
  1         5  
  1         6  
  1         4  
  1         5  
  1         5  
  1         6  
  1         5  
  0         0  
  1         4  
  1         3  
  1         3  
  1         31  
  1         6  
  1         3  
  1         4  
  1         4  
  1         4  
  1         5  
  1         3  
  1         5  
  2         8  
  2         10  
  1         4  
  1         2  
  1         4  
  1         5  
  1         5  
  1         14  
  1         5  
  1         5  
  1         5  
  1         7  
  1         5  
  1         2  
  1         4  
  1         4  
  1         5  
  1         6  
  1         6  
  1         5  
  1         5  
  1         6  
  1         5  
  1         4  
  1         4  
  1         6  
  1         7  
  1         4  
  1         3  
  1         5  
  1         5  
  1         7  
  1         3  
  1         5  
  1         4  
  1         5  
  2         10  
  2         8  
  1         7  
  2         12  
  1         4  
  1         2  
  1         3  
  1         4  
  1         5  
  1         5  
  1         4  
  1         6  
  1         6  
  1         5  
  1         31  
  1         5  
  1         4  
  1         4  
  1         4  
  1         1  
  1         5  
  2         9  
  2         9  
  1         6  
  2         11  
  1         9  
  1         4  
  1         4  
  1         5  
  1         6  
  1         4  
  1         5  
  1         6  
  1         5  
  1         3  
  1         3  
  1         5  
  1         5  
  1         8  
  1         6  
  1         4  
  1         7  
  1         4  
  1         9  
  1         4  
  1         2  
  1         5  
  1         4  
  0         0  
  0         0  
  1         5  
  1         9  
  1         5  
  1         6  
  1         5  
  1         8  
  1         7  
  1         4  
  1         4  
  1         5  
  1         5  
  1         7  
  1         5  
  1         5  
  1         5  
  1         4  
  1         6  
  1         6  
  1         6  
  1         6  
  1         3  
  1         3  
  3         15  
  1         6  
  1         5  
  1         249  
  1         5  
  1         4  
  1         5  
  1         4  
  1         4  
  1         5  
  1         3  
  1         5  
  1         7  
  1         6  
  1         15  
  1         10  
  1         10  
  1         5  
  1         6  
  1         7  
  1         4  
  1         3  
  3         10  
  1         5  
  1         5  
  1         4  
  1         4  
  2         8  
  2         8  
  1         6  
  1         6  
  2         12  
  3         10  
  3         11  
  1         5  
  1         4  
  1         4  
  1         6  
  1         3  
  1         8  
  3         11  
  1         6  
  3         10  
  3         10  
  1         5  
  1         4  
  1         5  
  1         5  
  1         7  
  1         5  
  1         7  
  1         7  
  1         5  
  1         5  
  1         6  
  2         9  
  2         9  
  1         4  
  2         11  
  1         5  
  1         6  
  1         5  
  1         5  
  3         10  
  3         11  
  1         366  
  1         50  
  1         7  
  1         6  
  1         6  
  1         6  
  1         5  
  1         4  
  1         5  
  1         5  
  1         13  
  1         5  
  1         6  
  1         6  
  1         5  
  1         4  
  1         5  
  1         4  
  1         3  
  1         5  
  1         6  
  1         7  
  1         4  
  1         5  
  1         2  
  1         6  
  1         5  
  1         4  
  1         8  
  1         5  
  1         4  
  1         5  
  3         18  
  3         11  
  3         16  
  3         12  
  3         17  
  3         27  
  2         10  
  2         7  
  2         9  
  1         5  
  1         3  
  2         9  
  1         5  
  1         6  
  1         5  
  1         4  
  1         5  
  3         11  
  3         11  
  1         6  
  1         7  
  1         6  
  3         15  
  1         4  
  1         9  
  3         11  
  3         23  
  3         19  
  1         3  
  1         5  
  1         4  
  1         4  
  1         6  
  1         4  
  1         5  
  1         3  
  1         5  
  1         4  
  1         5  
  1         4  
  1         3  
  1         4  
  1         5  
  0         0  
  0         0  
  1         3  
  1         6  
  1         4  
  1         4  
  1         3  
  1         4  
  1         7  
  1         4  
  1         4  
  1         4  
  1         4  
  1         4  
  1         4  
  1         6  
  1         5  
  1         4  
  1         5  
  1         6  
  1         4  
  1         4  
  1         5  
  1         14  
  1         16  
  1         3  
  1         5  
  1         3  
  1         3  
  1         4  
  1         4  
  1         4  
  1         5  
  1         3  
  1         5  
  1         4  
  1         5  
  1         4  
  1         5  
  1         3  
  1         6  
  1         3  
  1         3  
  1         4  
  1         5  
  1         3  
  1         2  
  1         7  
  1         4  
  1         5  
  1         3  
  1         5  
  1         4  
  1         5  
  1         4  
  1         5  
  1         6  
  1         2  
  1         4  
  1         7  
  1         2  
  1         5  
  1         4  
  1         4  
  1         5  
  1         6  
  1         2  
  1         6  
  1         7  
  1         3  
  1         5  
  1         4  
  1         4  
  1         5  
  1         4  
  1         4  
  1         4  
  1         5  
  1         4  
  1         5  
  1         3  
  1         5  
  1         3  
  1         5  
  1         10  
  1         10  
  1         4  
  1         4  
  1         5  
  1         2  
  1         5  
  1         6  
  1         9  
  1         12  
  1         6  
  1         4  
  1         4  
  1         9  
  1         4  
  1         2  
  1         6  
  1         3  
  1         3  
  1         8  
  1         4  
  1         5  
  1         7  
  1         9  
  1         4  
  1         4  
  1         3  
  1         3  
  1         5  
  1         6  
  1         4  
  1         5  
  3         10  
  3         13  
  1         9  
  1         6  
  1         8  
  3         13  
  1         4  
  1         8  
  1         4  
  1         8  
  2         6  
  2         5  
  2         9  
  2         6  
  1         5  
  1         8  
  1         4  
  1         5  
  1         4  
  1         3  
  1         7  
  1         2  
  1         5  
  1         6  
  1         3  
  1         3  
  1         4  
  1         6  
  3         9  
  3         9  
  3         11  
  3         9  
  1         6  
  1         4  
  3         15  
  3         25  
  1         8  
  1         6  
  1         3  
  3         14  
  1         3  
  1         2  
  1         7  
  1         4  
  1         4  
  1         3  
  1         4  
  1         3  
  1         4  
  1         3  
  1         3  
  1         4  
  1         6  
  1         4  
  1         6  
  1         6  
  1         4  
  1         3  
  1         6  
  3         8  
  3         9  
  3         8  
  1         5  
  1         5  
  1         29  
  1         4  
  1         7  
  1         4  
276             }
277 439 100       2088 die $@ if $@;
278 438 50       15089 wantarray ? @___result : $___result[0];
279             }
280              
281             sub terse_dump {
282 69     69 0 1408 require Data::Dumper;
283             join ", ", map {
284 69         6835 Data::Dumper->new([$_])->Terse(1)->Indent(0)->Dump;
  377         17029  
285             } @_;
286             }
287              
288             sub copy_array {
289 493     493 0 744 my $arg = shift;
290 493 100       1311 unless (ref $arg) {
    50          
291 347         1237 return $arg
292             } elsif (ref $arg eq 'ARRAY') {
293 148         300 [map {copy_array($_)} @$arg]
  346         1066  
294             } else {
295 4         14 croak "Not an array ref: $arg";
296             }
297             }
298              
299             sub add_arg_order_in {
300 433   100 431 0 1364 my $argDict = $_[0] ||= {};
301 431   66     1934 my $argOrder = $_[1] ||= [];
302 431         1075 my ($name, $arg) = splice @_, 2;
303              
304             croak "Duplicate argument definition: '$name'"
305 431 50       1079 if defined $argDict->{$name};
306              
307 431         1920 $arg->configure(argno => scalar keys %$argDict, varname => $name);
308 431         1240 push @$argOrder, $name;
309 431         1042 $argDict->{$name} = $arg;
310              
311 431         1544 $arg;
312             }
313              
314             sub is_debug {
315 28     29 0 131 my $db = $main::{"DB::"};
316 28 50       146 defined $db and defined ${*{$db}{HASH}}{sub};
  28         88  
  28         463  
317             }
318              
319             sub no_lineinfo {
320 28 50   27 0 99 is_debug() and not $ENV{DEBUG_DETAIL};
321             }
322              
323             BEGIN {
324             # check if DB::sub exists.
325 14 50   14   14939 if (no_lineinfo()) {
326 14         52 *needs_line_info = sub () { 0 };
327 14     2   61 *line_info = sub {""};
  1         400  
328 14         83 require Scalar::Util;
329             *put_debuginfo = sub {
330 1     2   35 my ($pack, $fn) = splice @_, 0, 2;
331 1         2 @{$main::{"_<$fn"}} = (undef, map {
332 1         5 Scalar::Util::dualvar(1, $_);
  1         44  
333             } split /(?<=\n)/, $_[0]);
334 14         468 };
335             } else {
336 1         4 *needs_line_info = sub () { 1 };
337             *line_info = sub {
338 1         425 my ($offset) = @_;
339 1         9 my ($pack, $file, $line) = caller;
340 1         2 sprintf(qq|#line %d "%s"\n|, $line + $offset, $file)
341 1         3 };
342 1         37 *put_debuginfo = sub () {};
343             }
344             }
345              
346             1;