File Coverage

web/cgi-bin/yatt.lib/YATT/Util.pm
Criterion Covered Total %
statement 2160 2186 98.8
branch 305 590 51.6
condition 22 38 57.8
subroutine 385 385 100.0
pod 0 23 0.0
total 2872 3222 89.1


line stmt bran cond sub pod time code
1             # -*- mode: perl; coding: utf-8 -*-
2             package YATT::Util;
3 15     15   13696 use base qw(Exporter);
  15         20  
  15         998  
4 15     15   52 use strict;
  15         21  
  15         382  
5 15     15   53 use warnings FATAL => qw(all);
  15         15  
  15         568  
6              
7 14     14   58 use Carp;
  14         16  
  14         606  
8 14     14   62 use File::Basename;
  14         16  
  14         590  
9              
10 14     14   3934 use YATT::Util::Taint;
  14         18  
  14         1649  
11              
12             BEGIN {
13             our @EXPORT_OK
14 14     14   58 = 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         12497 our @EXPORT = @EXPORT_OK;
47             }
48              
49             sub catch (&@) {
50 13     13 0 20 my ($sub, $errorVar) = @_;
51 13         91 eval { $sub->() };
  13         52  
52 13         68408 $$errorVar = $@;
53             }
54              
55             sub rootname {
56 3 50   3 0 274 push @_, qr{\.\w+$} unless @_ > 1;
57 3         131 my ($basename, $dirname, $suffix) = fileparse(@_);
58 3         18 join "", $dirname, $basename;
59             }
60              
61             sub optional {
62 1     1 0 32 my ($hash, $member, $key) = @_;
63 1 0       4 defined (my $value = $hash->{$member}) or return;
64 1         1 ($key, $value);
65             }
66              
67             sub try_can {
68 1     1 0 38 my ($obj, $method) = splice @_, 0, 2;
69 1 0       3 my $sub = $obj->can($method) or return;
70 1         1 $sub->($obj, @_);
71             }
72              
73             sub load_type {
74 740     740 0 991 my ($self, $typealias, $method) = @_;
75 740         1707 my $realclass = $self->$typealias();
76 740 100 50     4438 unless ($realclass->can($method || 'new')) {
77 9         523 eval "require $realclass";
78 9 50       39 die $@ if $@;
79 9 50       105 if (my $break = YATT->can("break_\l$typealias")) {
80 9         61 $break->();
81             }
82             }
83 740         1234 $realclass;
84             }
85              
86             sub call_type {
87 740     740 0 1441 my ($self, $typealias, $method) = splice @_, 0, 3;
88 740         1560 my $realclass = load_type($self, $typealias, $method);
89 740         2143 $realclass->$method(@_);
90             }
91              
92             sub require_and {
93 26     26 0 42 my ($class) = shift;
94 26         73 my $method = shift;
95 26 50       196 unless ($class->can($method)) {
96 1         1 eval "require $class";
97 1 0       41 die $@ if $@;
98             }
99 26         111 $class->$method(@_);
100             }
101              
102             sub coalesce {
103 254     254 0 1126 foreach my $item (@_) {
104 429 100       1962 return $item if defined $item;
105             }
106             }
107             *default = *coalesce; *default = *coalesce;
108             sub numeric {
109 1     1 0 8 default(@_, 0);
110             }
111              
112             sub defined_fmt ($$$) {
113 163     163 0 406 my ($fmt, $value, $default) = @_;
114 163 100       546 unless (defined $value) {
115 140         511 $default;
116             } else {
117 24         115 sprintf $fmt, $value;
118             }
119             }
120              
121             sub lsearch (&$;$) {
122 722     722 0 1334 my ($cmp, $list, $i) = @_;
123 722 100       1219 $i = 0 unless defined $i;
124 722         1062 foreach (@{$list}[$i .. $#$list]) {
  722         1517  
125 1504 100       2033 return $i if $cmp->();
126             } continue {
127 969         972 $i++;
128             }
129             return
130 187         567 }
131              
132             my %escape = (qw(< <
133             > >
134             " "
135             & &)
136             , "\'", "'");
137              
138             our $ESCAPE_UNDEF = '';
139              
140             sub escape {
141 177 100 100 177 0 1064 return if wantarray && !@_;
142 176         158 my @result;
143 176         329 foreach my $str (@_) {
144 198         169 push @result, do {
145 198 50       667 unless (defined $str) {
    100          
    100          
146 1         177 $ESCAPE_UNDEF;
147             } elsif (ref $str eq 'SCALAR') {
148             # PASS Thru. (Already escaped)
149 6         19 $$str;
150             } elsif (ref($str) =~ /^YATT::Util::/) {
151             # Yet another PASS Thru. (Already escaped)
152 3         33 $$str;
153             } else {
154 191         248 my $copy = $str;
155 191         349 $copy =~ s{([<>&\"\'])}{$escape{$1}}g;
156 191         416 $copy;
157             }
158             };
159             }
160 176 100       2354 wantarray ? @result : $result[0];
161             }
162              
163             sub _handle_arg_desc {
164 1     1   4 my ($desc) = shift;
165 1 0       1 unless (defined $desc->[2]) {
    0          
    0          
    0          
166             # '?' case.
167 1 0 0     167 defined $_[0] && $_[0] ne '' ? $_[0] : $desc->[1];
168             } elsif (ref $desc->[2]) {
169             # extension.
170 1         7 $desc->[2]->($desc->[1], $_[0]);
171             } elsif ($desc->[2] eq '/') {
172 1 0       1 defined $_[0] ? $_[0] : $desc->[1];
173             } elsif ($desc->[2] eq '|') {
174 1 0       32 $_[0] ? $_[0] : $desc->[1];
175             } else {
176 1         4 confess "Invalid arg spec $desc->[2] for $desc->[0]";
177             }
178             }
179              
180             sub decode_args {
181 1     1 0 2 my ($args) = shift;
182 1 0       37 unless (defined $args) {
    0          
183 1 0       2 map {
184 1         3 ref $_[$_] eq 'ARRAY' ? $_[$_]->[1] : undef;
185             } 0 .. $#_;
186             } elsif (ref $args eq 'ARRAY') {
187             map {
188 1 0       193 unless (ref $_[$_]) {
  1         6  
189 1         1 $args->[$_];
190             } else {
191 1         35 _handle_arg_desc($_[$_], $args->[$_]);
192             }
193             } 0 .. $#_;
194             } else {
195 1         4 my @args;
196 1         0 foreach my $desc (@_) {
197 1         40 push @args, do {
198 1 0       3 unless (ref $desc) {
199 1         1 delete $args->{$desc};
200             } else {
201 1         138 _handle_arg_desc($desc, delete $args->{$desc->[0]});
202             }
203             };
204             }
205 1 0       6 if (%$args) {
206 1         2 my ($pkg, $file, $line) = caller(0);
207 1         35 die "Invalid args at $file line $line: "
208             . join(", ", sort keys %$args) . "\n";
209             }
210 1         4 @args;
211             }
212             }
213              
214             sub attr {
215 3     3 0 5 my ($attname) = shift;
216 3 100       41 my @result = grep {defined $_ && $_ ne ''} @_;
  7         21  
217 3 50       7 return '' unless @result;
218 3         259 bless \(sprintf q{ %s="%s"}, $attname, join ' ', @result)
219             , __PACKAGE__ . '::attr';
220             }
221              
222             sub named_attr {
223 6     6 0 15 my ($attname, $value, $spc) = @_;
224 6 100 66     24 return '' unless defined $value && $value ne '';
225 5 50       45 sprintf('%s%s="%s"', defined $spc ? $spc : ' '
226             , $attname, YATT::escape($value));
227             }
228              
229             {
230             package YATT::Util::attr;
231 14     14   1815 use overload qw("" stringify);
  14         1594  
  14         75  
232             sub stringify {
233 1     1   3 ${$_[0]}
  1         1  
234             }
235             }
236              
237             sub resume {
238 1     1 0 37 my ($CGI, $name, $value, $type) = @_;
239 1 0       3 unless (defined $type) {
    0          
    0          
240 1         1 ""
241             } elsif ($type =~ /^(?:radio|checkbox)$/i) {
242 1   0     228 my $cache = $CGI->{'.RESUME_CACHE'}->{$name} ||= do {
243 1         7 my %cache;
244 1         1 $cache{$_} = 1 for $CGI->param($name);
245 1         39 \%cache;
246             };
247 1 0       4 $cache->{$value} ? "checked" : "";
248             } elsif ($type =~ /^(?:|text|password)$/i) {
249 1         2 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         56 my $result = eval {$obj->$method(@_)};
  55         167  
258 55 50       387 if ($@) {
259 1         8 sprintf $fmt, $@;
260             } else {
261 55         99 $result;
262             }
263             }
264              
265             sub checked_eval {
266             # $_[0] is ignored.
267             # XXX: local @_ = do { eval $_[1] }; を使えないか?
268 427 50   427 0 892 die "Undefined expression" unless defined $_[1];
269 427 50       1271 croak "Tainted expression" if is_tainted($_[1]);
270 427         387 my @___result;
271 427         892 &YATT::break_eval;
272 427 50       626 if (wantarray) {
273 1         1 @___result = eval $_[1];
274             } else {
275 427 50 100 5   22202 $___result[0] = eval $_[1];
  5 50 100 6   20  
  5 50 33 5   7  
  5 50 33 5   665  
  5 50 33 7   24  
  5 50 66 5   7  
  4 100   5   254  
  5 100   5   18  
  5 50   5   11  
  5 50   2   275  
  5 50   3   21  
  5 50   2   13  
  5 50   2   665  
  6 50   2   24  
  5 50   2   12  
  7 50   2   1061  
  7 50   2   28  
  7 50   2   10  
  5 50   2   246  
  5 50   2   22  
  5 50   2   7  
  5 50   2   259  
  5 50   2   20  
  5 50   2   7  
  5 50   2   257  
  5 50   2   19  
  5 50   2   8  
  5 50   2   66  
  2 50   2   8  
  2 50   2   4  
  2 50   2   359  
  2 50   2   9  
  2 50   2   2  
  2 50   2   41  
  2 50   2   7  
  2 50   3   3  
  2 50   2   46  
  1 50   2   3  
  1 50   2   1  
  2 50   2   223  
  2 50   2   11  
  2 50   2   4  
  2 50   2   59  
  2 50   2   7  
  2 50   2   5  
  2 50   2   68  
  2 50   2   7  
  3 50   2   4  
  3 50   3   352  
  3 50   2   10  
  3 50   2   5  
  3 50   4   42  
  3 50   3   10  
  3 50   2   5  
  3 50   2   48  
  3 50   2   7  
  2 100   4   3  
  2 100   3   356  
  2 50   2   7  
  2 50   2   3  
  2 50   2   34  
  2 50   2   9  
  2 50   2   4  
  2 50   2   218  
  2 50   1   8  
  2 50   2   4  
  2 50   2   12  
  2 50   2   11  
  2 50   2   2  
  2 50   2   46  
  2 50   4   6  
  2 0   2   5  
  2 50   2   47  
  2 50   2   7  
  2 50   2   3  
  2 50   2   283  
  3 50   2   10  
  3 100   2   4  
  3 50   2   45  
  3 50   4   7  
  3 50   2   2  
  3 50   3   50  
  3 50   2   9  
  3 50   2   3  
  2 50   2   341  
  2 50   2   10  
  2 50   2   3  
  2 50   2   44  
  2 50   2   5  
  2 50   2   5  
  2 50   4   48  
  2 50   3   5  
  2 50   3   3  
  2 50   2   441  
  2 50   4   9  
  2 50   2   4  
  2 50   2   43  
  2 50   2   4  
  2 50   2   3  
  2 50   3   46  
  2 50   3   5  
  4 50   2   6  
  4 50   2   243  
  4 100   2   8  
  4 100   2   5  
  4 50   2   24  
  4 50   2   10  
  4 50   2   30  
  4 50   2   123  
  2 50   2   6  
  4 50   2   6  
  2 50   2   10  
  2 50   1   11  
  2 50   2   3  
  2 50   2   55  
  2 50   2   6  
  2 50   2   5  
  2 50   2   60  
  2 50   2   6  
  2 50   1   4  
  2 50   2   364  
  2 50   2   23  
  2 50   2   3  
  2 50   2   46  
  2 0   2   5  
  2 50   2   6  
  2 50   2   49  
  2 50   2   5  
  2 50   2   3  
  2 50   2   263  
  2 50   2   13  
  2 0   2   3  
  2 50   2   68  
  2 50   2   7  
  2 50   2   4  
  2 50   2   72  
  2 50   2   7  
  2 50   2   4  
  2 50   2   406  
  2 50   2   8  
  2 50   2   3  
  2 50   2   43  
  2 50   2   7  
  2 50   4   4  
  2 50   2   49  
  2 50   2   4  
  2 50   2   4  
  2 50   2   241  
  2 50   2   12  
  2 50   2   4  
  2 50   3   61  
  2 50   2   8  
  2 50   2   5  
  2 50   2   73  
  1 50   2   3  
  3 50   2   5  
  3 50   2   263  
  3 50   4   11  
  3 50   2   5  
  3 50   2   63  
  3 50   2   12  
  3 50   2   6  
  3 50   2   71  
  2 50   4   10  
  2 50   2   4  
  2 50   2   432  
  2 50   2   9  
  2 50   2   3  
  2 50   2   44  
  2 50   2   5  
  2 50   2   3  
  2 50   2   47  
  2 50   2   5  
  2 50   2   2  
  2 50   2   255  
  1 50   2   7  
  2 50   2   3  
  2 50   2   43  
  2 50   2   5  
  2 50   2   2  
  2 50   2   47  
  2 50   3   6  
  2 50   4   4  
  2 50   2   243  
  2 50   2   9  
  2 50   4   4  
  2 50   2   44  
  2 100   2   9  
  2 50   2   3  
  2 50   2   48  
  2 50   2   4  
  2 100   2   2  
  2 50   2   241  
  2 100   2   10  
  2 50   3   4  
  2 50   2   44  
  2 100   2   6  
  2 50   2   4  
  2 50   2   45  
  2 50   1   5  
  2 50   2   3  
  2 50   2   235  
  2 100   2   10  
  2 100   2   3  
  2 100   2   46  
  2 50   2   6  
  2 50   2   3  
  2 100   2   48  
  2 50   2   5  
  2 50   2   3  
  2 50   2   223  
  2 50   4   7  
  2 100   2   5  
  2 50   2   42  
  2 50   4   6  
  2 50   2   2  
  2 50   2   44  
  2 50   2   5  
  2 50   2   5  
  2 50   3   225  
  2 50   2   8  
  2 50   3   3  
  2 50   2   38  
  2 50   2   5  
  2 50   2   2  
  2 50   2   45  
  2 50   2   5  
  2 100   2   3  
  2 100   2   213  
  2 50   2   8  
  2 50   2   2  
  2 50   2   65  
  1 50   2   4  
  2 50   2   2  
  2 50   4   43  
  2 50   2   4  
  2 50   3   4  
  2 50   3   225  
  2 50   2   11  
  2 50   4   2  
  2 100   2   42  
  2 100   2   5  
  2 50   2   4  
  2 50   2   45  
  2 50   2   6  
  2     2   4  
  2     3   236  
  2     2   9  
  2     3   3  
  2     4   39  
  2     2   5  
  2     2   2  
  2     3   44  
  2     2   6  
  2     2   4  
  2     2   241  
  2     2   10  
  2     2   3  
  2     2   46  
  2     2   5  
  2     2   2  
  2     2   44  
  2     2   7  
  2     2   4  
  2     3   365  
  2     2   10  
  2     2   3  
  2     2   48  
  2     2   8  
  1     2   2  
  2     2   50  
  2     2   6  
  2     3   3  
  2     3   286  
  2     2   10  
  2     2   6  
  2     2   46  
  2     2   5  
  2     2   3  
  2     2   48  
  2     2   4  
  2     2   4  
  2     2   307  
  2     2   8  
  2     2   3  
  2     2   42  
  2     2   6  
  2     2   3  
  2     2   45  
  2     1   4  
  2     2   4  
  2     2   318  
  2     2   10  
  2     2   2  
  2     2   46  
  2     2   4  
  2     2   4  
  2     2   45  
  2     2   6  
  2     2   3  
  2     2   178  
  2     2   7  
  2     2   3  
  2     2   38  
  2     2   7  
  2     2   2  
  2     2   45  
  2     2   6  
  2     2   2  
  2     2   160  
  2     2   10  
  2     2   5  
  2     2   40  
  2     2   6  
  2     2   4  
  2     2   45  
  2     2   5  
  2     2   4  
  2     2   161  
  2     1   8  
  2     1   4  
  2     2   36  
  2     3   6  
  2     1   2  
  2     1   40  
  2     3   5  
  2     1   2  
  2     1   152  
  2     1   7  
  2     1   3  
  2     1   35  
  2     1   6  
  2     1   3  
  2     1   36  
  2     1   5  
  2     1   3  
  2     1   121  
  2     1   7  
  2     1   4  
  3     1   35  
  3     3   6  
  3     1   2  
  3     1   43  
  3     1   5  
  3     1   7  
  3     1   121  
  3     1   10  
  2     1   2  
  2     1   34  
  2         4  
  2         4  
  2         34  
  2         6  
  2         3  
  2         154  
  2         6  
  2         3  
  2         33  
  2         7  
  2         3  
  2         38  
  2         5  
  2         2  
  2         157  
  2         11  
  2         3  
  2         39  
  2         8  
  2         5  
  2         42  
  2         6  
  2         3  
  2         330  
  2         9  
  2         2  
  2         44  
  2         6  
  2         3  
  2         48  
  2         4  
  2         3  
  2         531  
  2         8  
  2         2  
  2         41  
  2         6  
  2         4  
  2         42  
  2         5  
  2         2  
  2         159  
  2         7  
  2         4  
  2         38  
  2         6  
  2         3  
  2         40  
  2         4  
  2         2  
  2         167  
  2         6  
  2         5  
  2         35  
  2         5  
  2         3  
  2         36  
  2         5  
  2         3  
  2         161  
  2         7  
  2         5  
  2         37  
  2         5  
  2         3  
  2         40  
  2         5  
  2         3  
  2         138  
  2         9  
  2         3  
  2         38  
  2         6  
  2         2  
  2         36  
  2         4  
  2         2  
  2         132  
  2         9  
  2         4  
  2         35  
  2         5  
  2         2  
  2         43  
  2         6  
  2         5  
  2         146  
  2         7  
  2         4  
  2         37  
  1         3  
  3         3  
  3         39  
  3         4  
  3         4  
  3         122  
  3         7  
  3         5  
  3         34  
  2         4  
  2         4  
  2         35  
  2         5  
  2         2  
  2         197  
  1         6  
  2         3  
  2         34  
  2         5  
  2         3  
  2         70  
  2         8  
  4         5  
  4         145  
  4         9  
  4         5  
  4         31  
  4         10  
  4         10  
  4         36  
  3         5  
  4         5  
  3         123  
  3         8  
  3         3  
  3         34  
  3         4  
  3         7  
  3         38  
  3         5  
  3         4  
  3         124  
  2         8  
  2         3  
  2         36  
  2         5  
  2         3  
  2         56  
  2         8  
  2         3  
  2         165  
  2         9  
  2         4  
  2         43  
  2         6  
  2         3  
  2         46  
  2         11  
  2         2  
  2         154  
  2         8  
  2         3  
  2         39  
  2         5  
  4         6  
  4         48  
  4         6  
  4         4  
  4         221  
  4         14  
  4         6  
  4         44  
  3         6  
  3         4  
  3         46  
  3         5  
  3         3  
  3         239  
  3         10  
  3         4  
  2         42  
  2         5  
  2         2  
  2         49  
  2         4  
  2         4  
  2         325  
  2         10  
  2         3  
  2         45  
  2         5  
  2         3  
  2         49  
  2         8  
  2         3  
  2         240  
  2         7  
  2         3  
  2         42  
  2         4  
  2         3  
  2         46  
  2         6  
  2         3  
  2         238  
  2         9  
  2         2  
  2         41  
  2         5  
  2         2  
  2         46  
  2         5  
  2         2  
  2         232  
  2         10  
  2         3  
  2         41  
  2         5  
  2         4  
  2         48  
  2         5  
  2         3  
  2         234  
  2         11  
  2         4  
  2         39  
  1         4  
  1         1  
  1         42  
  1         4  
  1         1  
  1         293  
  1         7  
  1         2  
  1         39  
  1         3  
  1         3  
  2         46  
  2         5  
  2         4  
  2         309  
  2         5  
  2         5  
  2         27  
  2         5  
  2         3  
  2         31  
  2         4  
  2         5  
  2         114  
  2         8  
  2         8  
  1         30  
  2         6  
  2         4  
  2         34  
  2         5  
  2         2  
  2         210  
  2         8  
  2         5  
  2         27  
  2         4  
  2         2  
  2         31  
  2         4  
  2         5  
  2         114  
  2         8  
  2         3  
  2         35  
  2         8  
  2         2  
  2         35  
  2         5  
  2         3  
  2         141  
  4         12  
  4         11  
  4         33  
  4         11  
  4         8  
  4         44  
  4         30  
  4         26  
  4         140  
  2         8  
  2         2  
  2         34  
  2         5  
  2         3  
  2         37  
  2         4  
  2         3  
  2         135  
  2         7  
  2         3  
  2         42  
  2         6  
  2         3  
  2         44  
  2         4  
  2         3  
  2         151  
  2         8  
  2         2  
  2         42  
  2         5  
  2         3  
  2         46  
  2         5  
  2         3  
  2         160  
  2         9  
  2         3  
  2         41  
  2         4  
  2         3  
  2         45  
  2         3  
  2         4  
  2         143  
  2         8  
  2         2  
  2         41  
  2         5  
  2         4  
  2         44  
  2         7  
  2         3  
  2         140  
  2         8  
  2         2  
  2         42  
  2         6  
  2         4  
  2         47  
  2         6  
  2         5  
  2         163  
  1         6  
  4         6  
  4         88  
  4         8  
  4         5  
  4         50  
  4         10  
  4         7  
  4         153  
  2         8  
  2         4  
  2         41  
  2         6  
  2         3  
  2         47  
  1         3  
  3         3  
  3         156  
  3         9  
  3         3  
  3         41  
  3         9  
  3         4  
  3         46  
  2         5  
  2         2  
  2         142  
  2         8  
  2         3  
  2         42  
  2         7  
  2         4  
  2         44  
  2         5  
  2         2  
  2         142  
  2         8  
  2         5  
  2         42  
  2         6  
  2         2  
  2         48  
  2         4  
  2         5  
  1         241  
  2         10  
  2         4  
  2         43  
  2         5  
  2         3  
  2         49  
  2         6  
  2         3  
  2         250  
  2         9  
  2         3  
  2         42  
  2         5  
  2         4  
  2         45  
  2         4  
  2         3  
  2         132  
  2         7  
  2         3  
  2         37  
  2         4  
  2         5  
  2         45  
  2         4  
  2         2  
  2         161  
  2         8  
  2         4  
  2         39  
  2         6  
  2         2  
  2         42  
  2         5  
  2         5  
  2         161  
  2         10  
  4         5  
  4         43  
  4         7  
  4         6  
  4         47  
  4         8  
  4         7  
  4         226  
  4         11  
  4         4  
  4         44  
  3         6  
  3         5  
  3         45  
  3         5  
  3         4  
  3         238  
  3         10  
  3         5  
  3         43  
  3         6  
  3         4  
  3         47  
  3         4  
  3         4  
  3         241  
  3         10  
  3         4  
  2         41  
  2         5  
  2         2  
  2         41  
  2         5  
  2         4  
  2         136  
  2         7  
  4         5  
  4         41  
  4         7  
  4         5  
  4         46  
  4         10  
  4         16  
  4         157  
  3         11  
  4         7  
  2         46  
  2         6  
  2         3  
  2         48  
  2         3  
  2         5  
  2         351  
  2         10  
  2         4  
  2         43  
  2         5  
  2         3  
  2         45  
  2         4  
  2         3  
  2         249  
  2         10  
  2         3  
  2         42  
  2         5  
  2         4  
  2         44  
  2         5  
  2         2  
  2         342  
  2         10  
  2         4  
  2         42  
  2         6  
  2         3  
  2         48  
  2         4  
  2         3  
  2         375  
  2         10  
  1         2  
  3         41  
  3         6  
  3         4  
  3         44  
  3         5  
  3         4  
  3         336  
  3         11  
  3         4  
  3         45  
  3         6  
  3         2  
  3         55  
  3         7  
  3         4  
  2         264  
  2         9  
  2         2  
  2         38  
  2         5  
  2         4  
  2         46  
  2         5  
  2         4  
  2         168  
  2         10  
  2         4  
  2         41  
  2         11  
  1         1  
  2         45  
  2         5  
  2         2  
  2         331  
  2         5  
  2         4  
  2         24  
  2         5  
  2         2  
  2         24  
  2         5  
  2         4  
  2         34  
  2         5  
  2         2  
  2         4  
  1         2  
  1         1  
  1         1  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         1  
  1         7  
  1         2  
  1         1  
  1         2  
  1         1  
  1         1  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         3  
  1         1  
  1         2  
  1         1  
  1         1  
  1         2  
  1         1  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         1  
  1         3  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         1  
  1         3  
  1         2  
  1         2  
  1         3  
  1         1  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         2  
  1         2  
  1         1  
  1         1  
  1         1  
  1         5  
  1         1  
  1         2  
  1         2  
  1         3  
  1         2  
  1         1  
  1         1  
  1         4  
  1         2  
  1         2  
  1         1  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         3  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         3  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         2  
  1         3  
  1         2  
  1         1  
  1         2  
  1         2  
  1         2  
  1         1  
  1         1  
  1         2  
  1         1  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         2  
  1         2  
  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         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         1  
  1         1  
  1         1  
  1         2  
  1         4  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         3  
  1         1  
  1         3  
  1         2  
  1         4  
  1         4  
  1         2  
  1         1  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         2  
  1         2  
  1         3  
  1         3  
  1         16  
  1         2  
  1         2  
  1         1  
  1         2  
  1         4  
  1         1  
  1         2  
  1         1  
  1         2  
  1         2  
  1         2  
  1         1  
  1         2  
  1         1  
  1         1  
  1         4  
  1         1  
  1         3  
  1         1  
  1         2  
  1         1  
  1         1  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         1  
  1         2  
  1         3  
  1         2  
  1         5  
  1         2  
  1         2  
  1         2  
  1         1  
  1         1  
  1         1  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         2  
  1         2  
  1         2  
  1         1  
  1         4  
  1         3  
  1         3  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         4  
  1         2  
  1         1  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         1  
  1         1  
  1         2  
  1         1  
  1         3  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         2  
  1         1  
  1         3  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         1  
  1         2  
  1         3  
  1         2  
  1         2  
  1         1  
  1         1  
  1         1  
  1         1  
  1         1  
  1         3  
  1         2  
  1         1  
  1         3  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         1  
  1         2  
  1         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         2  
  1         4  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         1  
  1         3  
  1         3  
  1         3  
  1         2  
  1         1  
  1         1  
  1         1  
  1         1  
  1         3  
  1         2  
  1         1  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         5  
  1         3  
  1         3  
  1         3  
  3         3  
  3         2  
  3         4  
  3         2  
  3         4  
  3         5  
  3         3  
  3         3  
  3         5  
  1         3  
  1         1  
  1         2  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         1  
  1         1  
  1         2  
  1         1  
  1         4  
  1         2  
  1         2  
  1         1  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         4  
  1         5  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         3  
  1         1  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         2  
  2         2  
  2         2  
  2         2  
  2         2  
  2         1  
  2         6  
  2         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         4  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  1         1  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         1  
  1         2  
  1         1  
  1         1  
  1         1  
  1         3  
  1         1  
  1         1  
  1         3  
  1         1  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         3  
  1         1  
  1         3  
  1         2  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  3         4  
  3         3  
  3         4  
  3         3  
  3         3  
  3         5  
  3         4  
  1         2  
  1         2  
  1         1  
  1         2  
  1         1  
  1         3  
  1         1  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         3  
  1         1  
  1         2  
  1         2  
  1         1  
  1         1  
  1         1  
  1         4  
  1         1  
  1         2  
  1         1  
  1         1  
  1         2  
  1         3  
  1         1  
  1         2  
  1         3  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         1  
  1         1  
  1         3  
  1         2  
  1         2  
  3         3  
  3         3  
  3         3  
  3         3  
  3         2  
  3         5  
  3         4  
  3         2  
  3         4  
  3         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         1  
  1         5  
  1         2  
  1         2  
  1         2  
  1         2  
  1         1  
  1         2  
  1         3  
  1         3  
  1         1  
  1         1  
  1         1  
  1         1  
  1         1  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         4  
  1         874  
  1         6  
  1         3  
  1         2  
  1         1  
  1         2  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         3  
  1         1  
  1         2  
  1         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         1  
  1         2  
  1         1  
  1         2  
  1         1  
  1         1  
  1         2  
  1         2  
  1         2  
  1         1  
  1         1  
  1         1  
  1         2  
  1         1  
  1         2  
  1         3  
  1         4  
  1         4  
  1         4  
  1         2  
  1         4  
  1         3  
  1         3  
  1         4  
  1         3  
  1         2  
  3         6  
  1         4  
  1         4  
  1         5  
  1         3  
  1         1  
  1         3  
  1         4  
  1         3  
  1         5  
  1         5  
  1         4  
  1         5  
  1         6  
  1         4  
  2         5  
  2         5  
  1         3  
  2         5  
  3         8  
  3         5  
  3         11  
  3         5  
  3         7  
  3         12  
  1         4  
  1         2  
  1         1  
  1         3  
  1         3  
  1         4  
  1         5  
  3         7  
  3         14  
  3         10  
  1         5  
  1         2  
  1         3  
  1         5  
  1         2  
  1         3  
  1         4  
  1         3  
  1         5  
  1         2  
  1         4  
  1         4  
  1         4  
  1         3  
  1         8  
  1         3  
  1         3  
  1         18  
  1         3  
  1         3  
  1         3  
  1         2  
  1         3  
  1         3  
  1         23  
  2         6  
  2         6  
  1         5  
  1         5  
  1         6  
  1         5  
  1         2  
  1         5  
  1         6  
  1         3  
  1         4  
  1         4  
  1         4  
  1         4  
  0         0  
  0         0  
  1         3  
  1         3  
  1         3  
  1         4  
  1         4  
  1         4  
  1         4  
  1         2  
  1         3  
  1         4  
  1         3  
  1         4  
  1         4  
  1         3  
  1         5  
  1         3  
  1         3  
  1         1  
  1         2  
  1         2  
  1         3  
  1         6  
  1         4  
  1         4  
  1         4  
  1         3  
  1         4  
  1         3  
  1         3  
  1         1  
  1         2  
  1         2  
  1         2  
  1         1  
  1         3  
  1         5  
  1         4  
  3         7  
  3         6  
  1         3  
  1         1  
  1         5  
  1         3  
  1         3  
  1         5  
  3         9  
  3         7  
  1         3  
  1         2  
  1         3  
  1         5  
  1         2  
  1         3  
  1         3  
  1         5  
  1         5  
  1         5  
  1         5  
  2         5  
  2         3  
  2         6  
  2         4  
  1         6  
  1         4  
  1         4  
  2         6  
  2         7  
  1         2  
  2         6  
  1         3  
  1         3  
  1         4  
  1         4  
  1         3  
  1         4  
  1         3  
  1         5  
  1         4  
  1         4  
  1         3  
  1         4  
  3         6  
  1         4  
  1         3  
  1         2  
  1         4  
  1         3  
  1         4  
  1         2  
  1         3  
  1         3  
  1         3  
  1         3  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         21  
  1         3  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  3         6  
  1         4  
  1         3  
  1         8  
  1         3  
  3         8  
  3         6  
  1         4  
  1         2  
  1         2  
  1         3  
  2         6  
  2         6  
  1         4  
  2         7  
  2         5  
  2         5  
  1         4  
  1         4  
  3         16  
  3         15  
  1         3  
  1         2  
  1         6  
  3         7  
  1         4  
  1         3  
  1         4  
  1         3  
  1         5  
  1         3  
  1         3  
  1         3  
  1         4  
  1         3  
  1         3  
  1         5  
  1         3  
  2         5  
  2         5  
  2         5  
  2         6  
  1         4  
  1         1  
  1         19  
  1         7  
  2         6  
  2         3  
  3         8  
  3         10  
  1         5  
  1         5  
  1         3  
  3         11  
  1         4  
  1         3  
  1         4  
  1         4  
  1         2  
  2         5  
  2         5  
  1         5  
  1         5  
  2         7  
  1         3  
  1         4  
  1         3  
  1         6  
  1         5  
  1         3  
  1         3  
  1         3  
  1         3  
  1         4  
  1         3  
  1         4  
  1         3  
  1         5  
  1         3  
  1         5  
  1         3  
  1         4  
  1         4  
  1         5  
  1         5  
  1         4  
  0         0  
  1         5  
  1         4  
  1         5  
  1         3  
  1         4  
  1         3  
  1         6  
  1         4  
  2         7  
  2         6  
  1         2  
  2         6  
  1         3  
  1         3  
  1         4  
  1         2  
  1         4  
  1         2  
  1         2  
  1         2  
  1         3  
  1         3  
  1         4  
  1         2  
  1         4  
  1         2  
  1         2  
  1         3  
  1         7  
  1         4  
  1         6  
  1         3  
  1         6  
  1         3  
  1         5  
  1         4  
  1         7  
  2         6  
  2         4  
  2         4  
  1         2  
  1         2  
  2         4  
  2         5  
  2         12  
  1         3  
  1         18  
  1         4  
  1         3  
  1         3  
  1         18  
  1         5  
  1         10  
  1         6  
  1         3  
  1         2  
  1         3  
  1         1  
  1         2  
  1         2  
  1         3  
  1         3  
  1         19  
  1         5  
  1         5  
  1         5  
  1         3  
  1         4  
  1         4  
  1         3  
  1         2  
  1         4  
  1         1  
  1         3  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         5  
  1         5  
  1         3  
  1         3  
  1         2  
  1         3  
  0         0  
  0         0  
  1         2  
  1         2  
  1         2  
  1         4  
  1         5  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         3  
  1         4  
  1         4  
  1         2  
  1         2  
  1         3  
  1         2  
  1         3  
  1         3  
  1         3  
  1         3  
  1         4  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         3  
  1         3  
  1         3  
  1         3  
  1         1  
  1         2  
  1         4  
  1         1  
  1         3  
  1         2  
  1         2  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         2  
  1         7  
  1         4  
  1         4  
  1         2  
  1         2  
  1         2  
  1         3  
  1         3  
  1         4  
  1         2  
  1         3  
  1         4  
  1         6  
  1         3  
  1         4  
  1         5  
  1         4  
  1         3  
  1         4  
  1         5  
  1         1  
  1         2  
  1         5  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         4  
  1         5  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         1  
  1         4  
  1         4  
  1         2  
  1         3  
  1         4  
  1         2  
  2         4  
  2         5  
  2         5  
  2         3  
  3         7  
  3         9  
  1         5  
  1         5  
  1         4  
  3         8  
  1         3  
  1         3  
  1         3  
  1         5  
  3         7  
  3         7  
  3         30  
  3         5  
  1         4  
  1         5  
  1         3  
  1         3  
  1         5  
  1         4  
  1         3  
  1         3  
  1         3  
  1         6  
  1         3  
  1         2  
  1         4  
  1         4  
  1         3  
  1         2  
  1         4  
  1         1  
  1         3  
  1         6  
  1         2  
  1         3  
  1         3  
  1         4  
  1         2  
  1         5  
  1         4  
  1         9  
  1         4  
  1         8  
  1         2  
  1         3  
  1         4  
  1         1  
  1         3  
  1         5  
  3         6  
  3         10  
  1         3  
  1         3  
  1         2  
  3         4  
  1         4  
  1         2  
  1         5  
  1         4  
  1         4  
  1         3  
  1         4  
  1         3  
  1         2  
  1         1  
  1         4  
  1         7  
  1         6  
  1         4  
  1         4  
  1         7  
  1         2  
  1         3  
  1         3  
  3         2  
  3         8  
  3         5  
  1         3  
  1         3  
  1         17  
  1         3  
  1         3  
  1         3  
276             }
277 427 100       1160 die $@ if $@;
278 426 50       9927 wantarray ? @___result : $___result[0];
279             }
280              
281             sub terse_dump {
282 69     69 0 849 require Data::Dumper;
283 379         9817 join ", ", map {
284 69         4068 Data::Dumper->new([$_])->Terse(1)->Indent(0)->Dump;
285             } @_;
286             }
287              
288             sub copy_array {
289 495     493 0 529 my $arg = shift;
290 493 100       899 unless (ref $arg) {
    50          
291 347         871 return $arg
292             } elsif (ref $arg eq 'ARRAY') {
293 148         531 [map {copy_array($_)} @$arg]
  346         512  
294             } else {
295 2         4 croak "Not an array ref: $arg";
296             }
297             }
298              
299             sub add_arg_order_in {
300 431   100 431 0 932 my $argDict = $_[0] ||= {};
301 431   66     1351 my $argOrder = $_[1] ||= [];
302 431         701 my ($name, $arg) = splice @_, 2;
303              
304 431 50       969 croak "Duplicate argument definition: '$name'"
305             if defined $argDict->{$name};
306              
307 431         1216 $arg->configure(argno => scalar keys %$argDict, varname => $name);
308 431         607 push @$argOrder, $name;
309 431         1180 $argDict->{$name} = $arg;
310              
311 431         601 $arg;
312             }
313              
314             sub is_debug {
315 28     28 0 92 my $db = $main::{"DB::"};
316 28 50       159 defined $db and defined ${*{$db}{HASH}}{sub};
  28         44  
  28         298  
317             }
318              
319             sub no_lineinfo {
320 28 50   29 0 135 is_debug() and not $ENV{DEBUG_DETAIL};
321             }
322              
323             BEGIN {
324             # check if DB::sub exists.
325 14 50   14   9121 if (no_lineinfo()) {
326 14         24 *needs_line_info = sub () { 0 };
327 14     2   44 *line_info = sub {""};
  1         260  
328 14         58 require Scalar::Util;
329             *put_debuginfo = sub {
330 1     2   39 my ($pack, $fn) = splice @_, 0, 2;
331 1         1 @{$main::{"_<$fn"}} = (undef, map {
  1         43  
332 1         3 Scalar::Util::dualvar(1, $_);
333             } split /(?<=\n)/, $_[0]);
334 14         355 };
335             } else {
336 1         3 *needs_line_info = sub () { 1 };
337             *line_info = sub {
338 1         276 my ($offset) = @_;
339 1         7 my ($pack, $file, $line) = caller;
340 1         2 sprintf(qq|#line %d "%s"\n|, $line + $offset, $file)
341 1         1 };
342 1         39 *put_debuginfo = sub () {};
  1         4  
343             }
344             }
345              
346             1;