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   22163 use base qw(Exporter);
  15         27  
  15         1181  
4 15     15   1158 use strict;
  15         1194  
  15         507  
5 15     15   70 use warnings qw(FATAL all NONFATAL misc);
  15         23  
  15         855  
6              
7 14     14   72 use Carp;
  14         25  
  14         798  
8 14     14   73 use File::Basename;
  14         25  
  14         2012  
9              
10 14     14   8203 use YATT::Util::Taint;
  14         33  
  14         2174  
11              
12             BEGIN {
13             our @EXPORT_OK
14 14     14   77 = 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         19536 our @EXPORT = @EXPORT_OK;
47             }
48              
49             sub catch (&@) {
50 13     13 0 38 my ($sub, $errorVar) = @_;
51 13         30 eval { $sub->() };
  13         118  
52 13         117436 $$errorVar = $@;
53             }
54              
55             sub rootname {
56 3 50   3 0 32 push @_, qr{\.\w+$} unless @_ > 1;
57 3         512 my ($basename, $dirname, $suffix) = fileparse(@_);
58 3         31 join "", $dirname, $basename;
59             }
60              
61             sub optional {
62 1     1 0 3 my ($hash, $member, $key) = @_;
63 1 0       38 defined (my $value = $hash->{$member}) or return;
64 1         7 ($key, $value);
65             }
66              
67             sub try_can {
68 1     1 0 2 my ($obj, $method) = splice @_, 0, 2;
69 1 0       51 my $sub = $obj->can($method) or return;
70 1         5 $sub->($obj, @_);
71             }
72              
73             sub load_type {
74 740     740 0 1270 my ($self, $typealias, $method) = @_;
75 740         2615 my $realclass = $self->$typealias();
76 740 100 50     5920 unless ($realclass->can($method || 'new')) {
77 9         644 eval "require $realclass";
78 9 50       89 die $@ if $@;
79 9 50       155 if (my $break = YATT->can("break_\l$typealias")) {
80 9         48 $break->();
81             }
82             }
83 740         1918 $realclass;
84             }
85              
86             sub call_type {
87 740     740 0 1640 my ($self, $typealias, $method) = splice @_, 0, 3;
88 740         1618 my $realclass = load_type($self, $typealias, $method);
89 740         3645 $realclass->$method(@_);
90             }
91              
92             sub require_and {
93 26     26 0 85 my ($class) = shift;
94 26         58 my $method = shift;
95 26 50       294 unless ($class->can($method)) {
96 1         7 eval "require $class";
97 1 0       2 die $@ if $@;
98             }
99 26         208 $class->$method(@_);
100             }
101              
102             sub coalesce {
103 253     253 0 647 foreach my $item (@_) {
104 427 100       2185 return $item if defined $item;
105             }
106             }
107             *default = *coalesce; *default = *coalesce;
108             sub numeric {
109 1     1 0 250 default(@_, 0);
110             }
111              
112             sub defined_fmt ($$$) {
113 163     163 0 463 my ($fmt, $value, $default) = @_;
114 163 100       453 unless (defined $value) {
115 140         696 $default;
116             } else {
117 24         177 sprintf $fmt, $value;
118             }
119             }
120              
121             sub lsearch (&$;$) {
122 722     722 0 1956 my ($cmp, $list, $i) = @_;
123 722 100       2084 $i = 0 unless defined $i;
124 722         1556 foreach (@{$list}[$i .. $#$list]) {
  722         1999  
125 1504 100       3789 return $i if $cmp->();
126             } continue {
127 969         1794 $i++;
128             }
129             return
130 187         685 }
131              
132             my %escape = (qw(< <
133             > >
134             " "
135             & &)
136             , "\'", "'");
137              
138             our $ESCAPE_UNDEF = '';
139              
140             sub escape {
141 177 100 100 177 0 1081 return if wantarray && !@_;
142 176         247 my @result;
143 176         356 foreach my $str (@_) {
144 198         344 push @result, do {
145 198 50       865 unless (defined $str) {
    100          
    100          
146 1         2 $ESCAPE_UNDEF;
147             } elsif (ref $str eq 'SCALAR') {
148             # PASS Thru. (Already escaped)
149 6         276 $$str;
150             } elsif (ref($str) =~ /^YATT::Util::/) {
151             # Yet another PASS Thru. (Already escaped)
152 3         57 $$str;
153             } else {
154 191         316 my $copy = $str;
155 191         541 $copy =~ s{([<>&\"\'])}{$escape{$1}}g;
156 191         593 $copy;
157             }
158             };
159             }
160 176 100       3310 wantarray ? @result : $result[0];
161             }
162              
163             sub _handle_arg_desc {
164 1     1   46 my ($desc) = shift;
165 1 0       5 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         232 $desc->[2]->($desc->[1], $_[0]);
171             } elsif ($desc->[2] eq '/') {
172 1 0       10 defined $_[0] ? $_[0] : $desc->[1];
173             } elsif ($desc->[2] eq '|') {
174 1 0       2 $_[0] ? $_[0] : $desc->[1];
175             } else {
176 1         34 confess "Invalid arg spec $desc->[2] for $desc->[0]";
177             }
178             }
179              
180             sub decode_args {
181 1     1 0 6 my ($args) = shift;
182 1 0       2 unless (defined $args) {
    0          
183             map {
184 1 0       46 ref $_[$_] eq 'ARRAY' ? $_[$_]->[1] : undef;
  1         5  
185             } 0 .. $#_;
186             } elsif (ref $args eq 'ARRAY') {
187             map {
188 1 0       2 unless (ref $_[$_]) {
  1         255  
189 1         9 $args->[$_];
190             } else {
191 1         2 _handle_arg_desc($_[$_], $args->[$_]);
192             }
193             } 0 .. $#_;
194             } else {
195 1         33 my @args;
196 1         5 foreach my $desc (@_) {
197 1         2 push @args, do {
198 1 0       43 unless (ref $desc) {
199 1         4 delete $args->{$desc};
200             } else {
201 1         3 _handle_arg_desc($desc, delete $args->{$desc->[0]});
202             }
203             };
204             }
205 1 0       185 if (%$args) {
206 1         10 my ($pkg, $file, $line) = caller(0);
207 1         3 die "Invalid args at $file line $line: "
208             . join(", ", sort keys %$args) . "\n";
209             }
210 1         33 @args;
211             }
212             }
213              
214             sub attr {
215 3     3 0 12 my ($attname) = shift;
216 3 100       7 my @result = grep {defined $_ && $_ ne ''} @_;
  7         74  
217 3 50       12 return '' unless @result;
218 3         23 bless \(sprintf q{ %s="%s"}, $attname, join ' ', @result)
219             , __PACKAGE__ . '::attr';
220             }
221              
222             sub named_attr {
223 6     6 0 406 my ($attname, $value, $spc) = @_;
224 6 100 66     46 return '' unless defined $value && $value ne '';
225 5 50       19 sprintf('%s%s="%s"', defined $spc ? $spc : ' '
226             , $attname, YATT::escape($value));
227             }
228              
229             {
230             package YATT::Util::attr;
231 14     14   3290 use overload qw("" stringify);
  14         2248  
  14         99  
232             sub stringify {
233 1     1   33 ${$_[0]}
  1         6  
234             }
235             }
236              
237             sub resume {
238 1     1 0 3 my ($CGI, $name, $value, $type) = @_;
239 1 0       47 unless (defined $type) {
    0          
    0          
240 1         5 ""
241             } elsif ($type =~ /^(?:radio|checkbox)$/i) {
242 1   0     1 my $cache = $CGI->{'.RESUME_CACHE'}->{$name} ||= do {
243 1         349 my %cache;
244 1         10 $cache{$_} = 1 for $CGI->param($name);
245 1         2 \%cache;
246             };
247 1 0       34 $cache->{$value} ? "checked" : "";
248             } elsif ($type =~ /^(?:|text|password)$/i) {
249 1         6 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 138 my ($pack, $method, $fmt, $obj) = splice @_, 0, 4;
257 55         125 my $result = eval {$obj->$method(@_)};
  55         261  
258 55 50       135 if ($@) {
259 1         320 sprintf $fmt, $@;
260             } else {
261 55         163 $result;
262             }
263             }
264              
265             sub checked_eval {
266             # $_[0] is ignored.
267             # XXX: local @_ = do { eval $_[1] }; を使えないか?
268 427 50   427 0 1263 die "Undefined expression" unless defined $_[1];
269 427 50       1628 croak "Tainted expression" if is_tainted($_[1]);
270 427         489 my @___result;
271 427         1217 &YATT::break_eval;
272 427 50       916 if (wantarray) {
273 1         6 @___result = eval $_[1];
274             } else {
275 427 50 100 6   24856 $___result[0] = eval $_[1];
  5 50 100 5   62  
  5 50 33 5   22  
  5 50 33 5   350  
  5 50 33 6   408  
  5 50 66 5   16  
  5 50   5   270  
  5 50   5   56  
  5 50   7   13  
  7 50   2   279  
  7 100   2   70  
  7 100   2   21  
  5 50   2   282  
  5 50   4   334  
  5 50   2   18  
  5 50   4   1684  
  5 50   2   50  
  5 100   2   15  
  5 50   2   293  
  5 50   2   61  
  5 50   2   16  
  5 100   2   21  
  5 100   2   326  
  5 50   3   16  
  5 50   2   277  
  5 50   2   51  
  5 50   2   15  
  5 50   3   24  
  2 50   2   45  
  2 50   2   7  
  2 50   4   4  
  2 50   2   316  
  2 50   3   10  
  2 50   2   5  
  2 50   2   35  
  2 50   2   11  
  2 50   4   6  
  2 50   2   50  
  2 50   3   8  
  2 50   3   4  
  2 50   3   340  
  2 50   2   14  
  2 50   2   4  
  2 50   2   40  
  2 50   2   8  
  2 50   2   8  
  2 50   2   50  
  2 50   2   8  
  2 50   2   4  
  2 50   2   356  
  2 50   2   13  
  2 50   2   5  
  2 50   1   42  
  2 50   2   7  
  2 50   2   6  
  2 50   2   54  
  2 50   2   9  
  2 50   2   5  
  2 50   2   475  
  2 50   2   9  
  2 50   2   4  
  2 0   2   28  
  2 50   2   8  
  2 50   2   6  
  2 50   3   138  
  2 50   2   12  
  2 50   2   5  
  2 50   2   11  
  2 50   2   12  
  2 50   2   7  
  2 50   2   42  
  2 50   2   9  
  3 50   2   7  
  3 50   2   59  
  3 50   2   8  
  3 50   4   7  
  3 50   2   437  
  3 50   2   20  
  3 50   4   10  
  3 50   2   53  
  2 50   2   9  
  2 50   2   5  
  2 50   2   60  
  2 50   2   8  
  2 50   2   5  
  2 50   2   527  
  2 50   2   13  
  2 100   2   5  
  2 100   3   43  
  2 50   2   8  
  2 50   2   5  
  2 50   2   64  
  2 50   2   8  
  2 50   2   5  
  2 50   2   652  
  2 50   2   12  
  2 50   2   5  
  2 50   3   39  
  2 50   2   8  
  2 50   2   4  
  2 50   2   54  
  2 50   2   8  
  2 50   3   5  
  3 50   2   364  
  3 50   2   11  
  3 50   2   6  
  3 50   2   31  
  3 50   2   7  
  3 50   2   12  
  3 50   2   139  
  3 50   1   11  
  2 50   2   5  
  2 50   2   15  
  2 50   2   11  
  2 50   2   5  
  2 50   2   39  
  2 50   2   12  
  2 50   1   6  
  2 50   2   50  
  2 50   2   9  
  2 50   2   6  
  2 50   2   415  
  2 0   2   14  
  2 50   2   4  
  2 50   2   49  
  2 50   2   10  
  2 50   2   7  
  2 50   2   52  
  2 50   2   9  
  2 0   2   4  
  2 50   2   390  
  2 50   2   13  
  2 50   2   6  
  2 50   2   39  
  2 50   2   9  
  4 50   2   10  
  4 50   2   54  
  4 50   2   12  
  4 50   2   9  
  4 50   2   398  
  4 50   2   23  
  4 50   2   13  
  4 50   2   48  
  3 50   2   13  
  4 50   2   10  
  2 50   2   139  
  2 50   2   8  
  2 50   2   4  
  2 50   2   370  
  2 50   2   15  
  2 50   4   7  
  2 50   2   48  
  2 50   2   9  
  2 50   2   6  
  2 50   2   51  
  2 50   3   8  
  2 50   2   4  
  2 50   2   350  
  2 50   2   13  
  2 50   2   5  
  2 50   4   38  
  2 50   2   11  
  2 50   2   5  
  2 50   4   64  
  2 50   2   9  
  2 50   2   6  
  2 50   2   425  
  2 50   2   17  
  2 50   2   5  
  2 50   2   41  
  2 50   2   11  
  2 50   2   5  
  2 50   2   51  
  2 50   3   8  
  2 50   2   4  
  2 50   2   404  
  2 50   2   14  
  2 50   2   4  
  4 50   2   43  
  4 50   2   12  
  4 50   1   7  
  4 50   3   56  
  4 50   2   10  
  4 50   2   11  
  4 50   2   473  
  4 50   2   26  
  4 100   2   9  
  2 50   2   40  
  2 50   2   8  
  2 50   2   4  
  2 50   2   50  
  2 50   2   6  
  2 50   4   8  
  2 50   2   354  
  2 100   2   12  
  2 50   2   6  
  4 100   2   41  
  4 100   2   12  
  4 50   2   7  
  4 50   4   52  
  4 50   2   10  
  4 100   2   10  
  4 100   2   370  
  4 100   2   30  
  3 50   2   6  
  4 50   2   46  
  2 50   2   9  
  2 100   2   5  
  2 50   2   51  
  2 100   2   8  
  2 50   2   3  
  2 50   2   335  
  2 50   3   12  
  2 50   2   6  
  2 50   2   39  
  2 50   2   8  
  2 50   2   6  
  2 50   2   48  
  2 50   3   8  
  2 50   2   6  
  1 50   2   337  
  2 50   2   14  
  2 50   2   8  
  2 50   3   44  
  2 50   3   12  
  2 50   2   6  
  2 50   2   66  
  2 50   2   8  
  2 50   2   6  
  2 100   2   392  
  2 100   2   12  
  2 50   2   2  
  2 50   2   40  
  1 50   2   6  
  2 50   2   3  
  2 50   3   51  
  2 50   2   6  
  2 50   2   4  
  2 50   3   350  
  2 50   2   15  
  2 100   2   5  
  2 100   2   39  
  2 50   2   8  
  2 50   2   3  
  2 50   2   51  
  2     2   7  
  2     2   5  
  2     2   366  
  2     2   15  
  2     2   4  
  2     4   39  
  2     3   11  
  2     3   4  
  2     2   50  
  2     4   12  
  2     2   7  
  2     2   372  
  2     2   13  
  2     4   4  
  2     2   44  
  3     2   10  
  3     2   7  
  3     4   52  
  3     2   10  
  3     3   5  
  3     4   567  
  3     2   15  
  3     2   8  
  2     2   43  
  2     2   8  
  2     2   5  
  2     2   50  
  2     2   7  
  2     2   7  
  1     2   426  
  2     2   12  
  2     3   5  
  2     2   40  
  2     2   11  
  2     2   5  
  2     2   53  
  2     2   9  
  2     2   5  
  2     2   483  
  2     2   12  
  2     2   6  
  2     2   40  
  2     2   8  
  2     2   5  
  2     1   52  
  2     2   9  
  2     2   5  
  2     2   516  
  3     2   15  
  3     2   7  
  3     2   42  
  3     2   10  
  3     2   5  
  3     2   56  
  3     2   10  
  3     2   8  
  2     2   282  
  2     2   11  
  2     2   5  
  2     2   42  
  2     2   9  
  2     2   7  
  1     2   45  
  2     2   7  
  2     2   6  
  2     2   227  
  2     2   12  
  2     2   4  
  2     2   41  
  4     2   12  
  4     2   9  
  4     2   50  
  4     2   10  
  4     2   6  
  4     2   236  
  4     1   17  
  4     1   13  
  2     1   39  
  2     1   7  
  2     1   5  
  2     3   50  
  2     1   6  
  2     1   9  
  2     1   252  
  2     3   12  
  2     1   6  
  2     1   37  
  2     1   8  
  3     1   7  
  3     1   57  
  3     1   11  
  3     1   9  
  3     1   219  
  3     1   22  
  3     1   10  
  3     3   45  
  2     1   8  
  2     1   6  
  2     1   49  
  2     1   8  
  2     1   4  
  2     1   192  
  2     1   15  
  2     1   4  
  2         44  
  2         8  
  2         5  
  2         53  
  2         12  
  2         6  
  2         277  
  2         13  
  2         6  
  2         39  
  2         9  
  2         4  
  2         54  
  2         5  
  2         9  
  2         264  
  2         15  
  4         7  
  4         47  
  4         12  
  4         7  
  4         56  
  4         13  
  4         11  
  4         584  
  2         14  
  2         5  
  2         48  
  2         9  
  2         6  
  2         64  
  2         9  
  2         6  
  2         991  
  3         15  
  3         6  
  3         42  
  3         11  
  3         5  
  3         57  
  3         11  
  3         8  
  3         281  
  3         16  
  3         6  
  3         43  
  3         9  
  3         11  
  3         53  
  3         9  
  3         5  
  3         266  
  3         13  
  3         6  
  3         40  
  3         14  
  3         9  
  3         51  
  2         8  
  2         5  
  2         264  
  2         13  
  2         5  
  2         42  
  2         9  
  2         5  
  2         51  
  2         8  
  2         8  
  2         286  
  2         12  
  2         6  
  2         40  
  2         9  
  2         4  
  2         48  
  2         8  
  2         6  
  2         211  
  2         13  
  2         4  
  2         37  
  2         8  
  2         8  
  2         60  
  1         5  
  2         5  
  2         224  
  2         13  
  2         4  
  2         38  
  2         11  
  2         5  
  2         52  
  2         7  
  2         4  
  2         191  
  2         13  
  2         4  
  2         47  
  2         8  
  2         4  
  2         55  
  2         9  
  2         3  
  2         292  
  2         11  
  2         5  
  2         41  
  2         8  
  2         4  
  2         48  
  2         7  
  2         6  
  2         233  
  2         11  
  2         5  
  2         35  
  2         8  
  2         6  
  2         44  
  2         8  
  2         4  
  2         200  
  2         10  
  2         7  
  2         35  
  2         9  
  2         4  
  2         45  
  2         8  
  2         7  
  2         192  
  2         13  
  2         5  
  1         34  
  1         6  
  1         1  
  1         45  
  1         5  
  1         2  
  1         247  
  1         11  
  1         3  
  1         37  
  1         6  
  2         6  
  2         51  
  2         7  
  2         8  
  2         216  
  2         15  
  1         2  
  2         42  
  2         12  
  2         4  
  2         52  
  2         8  
  2         15  
  2         321  
  2         16  
  2         4  
  2         43  
  2         8  
  2         7  
  2         52  
  2         8  
  2         5  
  2         370  
  2         13  
  2         4  
  2         42  
  2         8  
  2         4  
  2         52  
  2         9  
  1         2  
  1         527  
  2         13  
  2         4  
  2         41  
  2         10  
  2         5  
  2         53  
  2         9  
  2         6  
  2         360  
  2         13  
  2         4  
  2         44  
  2         10  
  2         5  
  2         54  
  2         8  
  2         4  
  2         404  
  2         13  
  2         7  
  2         43  
  2         9  
  2         4  
  2         51  
  2         9  
  2         8  
  2         359  
  2         14  
  2         3  
  2         41  
  2         8  
  2         8  
  2         53  
  2         7  
  2         5  
  2         383  
  2         11  
  2         6  
  2         40  
  2         9  
  2         4  
  2         54  
  2         8  
  2         7  
  2         486  
  2         15  
  3         6  
  3         43  
  3         8  
  3         6  
  3         56  
  3         13  
  3         9  
  3         519  
  3         15  
  3         8  
  2         40  
  2         11  
  2         4  
  2         63  
  2         8  
  2         7  
  2         207  
  2         15  
  2         4  
  2         41  
  2         8  
  2         6  
  1         47  
  2         8  
  2         6  
  2         362  
  2         12  
  2         4  
  2         41  
  2         10  
  2         4  
  2         51  
  2         8  
  2         5  
  2         243  
  2         12  
  2         6  
  1         40  
  2         9  
  2         5  
  2         51  
  2         8  
  2         4  
  2         247  
  2         12  
  2         5  
  2         40  
  2         9  
  2         4  
  2         57  
  2         8  
  2         4  
  2         230  
  2         13  
  2         4  
  2         43  
  2         9  
  2         5  
  2         51  
  2         9  
  2         4  
  2         242  
  2         12  
  2         8  
  1         38  
  2         8  
  2         5  
  2         50  
  2         8  
  2         4  
  2         236  
  2         13  
  2         5  
  2         41  
  2         9  
  2         4  
  2         51  
  2         5  
  2         7  
  4         253  
  4         21  
  4         7  
  4         46  
  4         12  
  4         17  
  4         60  
  4         11  
  4         13  
  4         210  
  4         19  
  2         5  
  2         41  
  2         9  
  2         4  
  2         51  
  2         9  
  2         6  
  2         199  
  2         14  
  2         6  
  2         44  
  2         12  
  2         4  
  2         54  
  2         10  
  4         8  
  4         246  
  4         14  
  4         8  
  4         42  
  4         30  
  4         37  
  4         59  
  2         9  
  4         9  
  2         233  
  2         13  
  2         5  
  2         1675  
  2         10  
  2         6  
  2         59  
  2         10  
  2         6  
  2         300  
  2         12  
  2         4  
  2         40  
  2         7  
  2         7  
  2         50  
  2         9  
  2         9  
  2         210  
  2         14  
  2         5  
  2         46  
  2         8  
  2         6  
  2         53  
  2         8  
  2         4  
  2         223  
  2         13  
  2         7  
  2         43  
  2         10  
  2         4  
  2         55  
  2         8  
  2         5  
  2         382  
  2         15  
  2         5  
  2         44  
  2         10  
  2         6  
  2         89  
  2         8  
  2         5  
  2         372  
  2         14  
  2         7  
  2         41  
  2         10  
  2         4  
  2         51  
  2         7  
  2         8  
  2         238  
  2         15  
  2         5  
  2         37  
  2         9  
  2         4  
  2         48  
  2         7  
  2         7  
  2         248  
  2         14  
  2         6  
  2         35  
  2         10  
  2         7  
  2         51  
  2         7  
  3         6  
  3         241  
  3         13  
  3         7  
  3         38  
  3         14  
  3         7  
  3         56  
  3         10  
  2         6  
  2         339  
  2         13  
  2         5  
  2         35  
  2         12  
  2         5  
  2         49  
  2         7  
  2         5  
  2         364  
  2         13  
  2         5  
  2         42  
  2         9  
  2         4  
  2         53  
  2         7  
  2         5  
  2         499  
  2         13  
  2         7  
  2         142  
  2         10  
  2         6  
  2         56  
  2         12  
  2         7  
  2         199  
  2         15  
  2         14  
  1         33  
  2         8  
  2         5  
  2         47  
  2         8  
  2         4  
  2         220  
  1         11  
  2         5  
  2         44  
  2         9  
  2         6  
  2         52  
  2         10  
  2         6  
  2         636  
  2         13  
  2         6  
  2         39  
  2         12  
  2         7  
  2         53  
  2         8  
  2         5  
  2         417  
  2         14  
  2         4  
  2         45  
  3         14  
  3         9  
  3         55  
  3         12  
  3         8  
  3         606  
  3         21  
  2         5  
  2         41  
  2         9  
  2         5  
  2         51  
  2         10  
  2         6  
  2         636  
  2         13  
  2         8  
  2         41  
  2         11  
  1         2  
  2         51  
  2         9  
  2         4  
  2         583  
  2         13  
  2         9  
  2         42  
  2         9  
  2         4  
  2         50  
  2         7  
  2         4  
  2         462  
  2         16  
  2         5  
  2         40  
  3         11  
  3         6  
  3         50  
  3         11  
  3         5  
  3         240  
  3         19  
  3         6  
  3         53  
  2         10  
  2         4  
  2         64  
  2         9  
  2         5  
  2         587  
  2         9  
  2         4  
  2         31  
  2         10  
  2         5  
  2         40  
  2         7  
  2         5  
  2         49  
  2         9  
  2         4  
  2         10  
  1         4  
  1         3  
  1         6  
  1         5  
  1         3  
  1         3  
  1         4  
  1         8  
  1         4  
  1         5  
  1         2  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         4  
  1         2  
  1         8  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         3  
  1         2  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         3  
  1         3  
  1         1  
  1         3  
  1         2  
  1         3  
  1         3  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         3  
  1         3  
  1         4  
  1         3  
  1         2  
  1         3  
  1         4  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         4  
  1         3  
  1         2  
  1         2  
  1         3  
  1         5  
  1         5  
  1         3  
  1         4  
  1         4  
  1         7  
  1         5  
  1         4  
  1         2  
  1         1  
  1         2  
  1         2  
  1         2  
  1         4  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         3  
  1         4  
  1         3  
  1         2  
  1         3  
  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         3  
  1         2  
  1         3  
  1         2  
  1         5  
  1         3  
  1         3  
  1         3  
  1         1  
  1         5  
  1         3  
  1         2  
  1         1  
  1         3  
  1         1  
  1         5  
  1         4  
  1         2  
  1         3  
  1         2  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         6  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         3  
  1         1  
  1         4  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         4  
  1         3  
  1         4  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         3  
  1         4  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         4  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         5  
  1         2  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         1  
  1         4  
  1         3  
  1         3  
  1         3  
  1         3  
  1         2  
  1         1  
  1         3  
  1         1  
  1         4  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  1         4  
  1         2  
  1         5  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         4  
  1         2  
  1         3  
  1         5  
  1         5  
  1         4  
  1         4  
  1         3  
  1         10  
  1         6  
  1         5  
  1         2  
  1         3  
  1         2  
  1         3  
  1         1  
  1         5  
  1         4  
  1         4  
  1         2  
  1         3  
  1         2  
  1         2  
  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         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         2  
  1         2  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         5  
  1         2  
  1         3  
  1         3  
  1         3  
  1         2  
  1         4  
  1         2  
  1         5  
  1         4  
  1         4  
  1         2  
  1         3  
  1         3  
  1         3  
  1         1  
  1         4  
  1         2  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         4  
  1         3  
  1         3  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         5  
  1         3  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         5  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         1  
  1         5  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         2  
  1         3  
  1         5  
  1         5  
  1         4  
  1         6  
  1         4  
  1         8  
  1         5  
  1         2  
  1         2  
  1         1  
  1         2  
  1         2  
  1         4  
  1         3  
  1         2  
  1         4  
  1         2  
  1         2  
  1         2  
  1         2  
  1         3  
  1         4  
  1         3  
  1         2  
  1         4  
  1         5  
  1         7  
  1         5  
  1         3  
  1         11  
  1         7  
  1         5  
  1         6  
  3         18  
  3         6  
  3         4  
  3         7  
  3         3  
  3         10  
  3         6  
  3         6  
  3         6  
  1         2  
  1         3  
  1         1  
  1         2  
  1         2  
  1         4  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         4  
  1         3  
  1         2  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         5  
  1         3  
  1         2  
  1         3  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  2         4  
  2         3  
  2         3  
  2         4  
  2         4  
  2         6  
  2         6  
  1         2  
  1         3  
  1         6  
  1         3  
  1         2  
  1         6  
  1         2  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         2  
  1         2  
  1         4  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         2  
  1         3  
  3         6  
  3         5  
  3         4  
  3         6  
  3         5  
  3         8  
  3         7  
  1         2  
  1         3  
  1         3  
  1         2  
  1         3  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         2  
  3         10  
  3         6  
  3         5  
  3         6  
  3         6  
  3         9  
  3         7  
  3         6  
  3         9  
  3         10  
  1         2  
  1         3  
  1         2  
  1         2  
  1         3  
  1         4  
  1         3  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         5  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         2  
  1         4  
  1         3  
  1         3  
  1         2  
  1         2  
  1         2  
  1         2  
  1         5  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         2  
  1         3  
  1         2  
  1         5  
  1         4  
  1         828  
  1         5  
  1         5  
  1         4  
  1         4  
  1         4  
  1         3  
  1         8  
  1         4  
  1         4  
  1         2  
  1         2  
  1         2  
  1         3  
  1         2  
  1         4  
  1         4  
  1         2  
  1         3  
  1         7  
  1         4  
  1         4  
  1         4  
  1         8  
  1         5  
  1         6  
  1         5  
  1         5  
  2         10  
  2         8  
  1         4  
  2         8  
  1         5  
  1         14  
  1         5  
  1         5  
  1         3  
  1         8  
  3         11  
  1         5  
  1         4  
  1         8  
  1         4  
  1         9  
  1         5  
  1         296  
  1         5  
  1         10  
  1         5  
  1         5  
  1         6  
  0         0  
  0         0  
  2         8  
  2         7  
  1         7  
  1         6  
  2         12  
  1         4  
  1         6  
  1         5  
  1         7  
  1         6  
  1         5  
  1         4  
  1         6  
  1         2  
  1         3  
  1         6  
  1         4  
  1         4  
  1         5  
  1         4  
  1         8  
  1         6  
  1         6  
  1         32  
  1         5  
  1         4  
  1         4  
  1         5  
  1         4  
  1         8  
  3         12  
  1         6  
  1         4  
  1         4  
  3         12  
  3         12  
  1         5  
  1         33  
  1         5  
  1         3  
  1         3  
  3         10  
  1         6  
  1         9  
  1         12  
  1         9  
  1         5  
  1         7  
  1         9  
  1         6  
  1         8  
  1         11  
  1         12  
  1         17  
  3         11  
  3         12  
  1         6  
  1         6  
  1         8  
  3         16  
  1         5  
  1         4  
  1         5  
  1         4  
  1         3  
  1         5  
  1         5  
  1         6  
  1         4  
  1         6  
  1         2  
  1         4  
  1         4  
  1         4  
  1         3  
  1         7  
  1         4  
  1         3  
  1         5  
  1         4  
  1         6  
  1         4  
  1         5  
  1         6  
  1         5  
  1         32  
  1         6  
  1         7  
  1         6  
  1         5  
  1         7  
  1         5  
  1         2  
  1         4  
  1         5  
  1         5  
  1         7  
  1         6  
  1         5  
  1         6  
  1         6  
  2         8  
  2         8  
  1         6  
  1         8  
  1         7  
  1         6  
  1         6  
  1         6  
  1         2  
  1         5  
  1         5  
  1         5  
  1         2  
  1         33  
  1         12  
  1         4  
  1         3  
  1         7  
  1         4  
  1         8  
  1         5  
  2         13  
  2         13  
  1         14  
  2         15  
  1         6  
  1         4  
  1         4  
  1         6  
  1         6  
  1         6  
  1         4  
  1         6  
  1         6  
  1         4  
  1         7  
  1         7  
  2         9  
  2         11  
  2         8  
  2         8  
  1         4  
  2         8  
  1         5  
  1         6  
  1         6  
  1         3  
  1         4  
  1         5  
  1         8  
  1         5  
  1         9  
  1         10  
  1         4  
  1         2  
  1         6  
  1         5  
  1         7  
  1         5  
  1         4  
  1         5  
  1         5  
  1         4  
  1         1  
  1         5  
  1         5  
  1         4  
  1         4  
  1         6  
  1         5  
  1         4  
  1         5  
  2         9  
  2         20  
  1         6  
  1         6  
  1         6  
  1         40  
  2         10  
  2         9  
  2         8  
  2         11  
  1         6  
  1         9  
  1         6  
  1         5  
  1         4  
  1         6  
  1         4  
  1         5  
  1         5  
  1         6  
  1         5  
  1         6  
  1         5  
  1         6  
  1         6  
  1         3  
  1         3  
  1         5  
  1         5  
  1         4  
  1         6  
  1         5  
  1         4  
  1         5  
  1         3  
  1         4  
  1         6  
  1         3  
  1         6  
  1         4  
  1         7  
  1         6  
  3         10  
  3         23  
  3         18  
  2         7  
  2         9  
  1         5  
  2         10  
  2         23  
  2         9  
  2         20  
  2         10  
  1         4  
  1         5  
  3         17  
  3         12  
  3         15  
  3         10  
  3         15  
  3         24  
  1         5  
  1         5  
  1         5  
  1         6  
  1         6  
  1         5  
  1         3  
  1         2  
  1         3  
  1         3  
  1         2  
  1         4  
  3         12  
  3         11  
  1         6  
  1         7  
  1         5  
  1         4  
  1         5  
  1         5  
  1         5  
  1         6  
  3         11  
  3         12  
  1         5  
  1         3  
  1         3  
  3         10  
  1         5  
  2         8  
  2         6  
  2         8  
  1         3  
  1         3  
  2         9  
  3         26  
  3         12  
  1         5  
  1         6  
  1         12  
  1         12  
  1         13  
  1         4  
  1         2  
  1         3  
  1         3  
  1         6  
  1         4  
  1         3  
  1         4  
  1         5  
  1         7  
  1         5  
  1         5  
  1         6  
  1         4  
  1         5  
  1         6  
  1         34  
  1         5  
  1         4  
  1         5  
  1         5  
  1         13  
  1         5  
  2         8  
  2         8  
  1         4  
  1         3  
  1         3  
  1         33  
  1         5  
  1         6  
  1         4  
  0         0  
  1         4  
  1         4  
  1         5  
  1         5  
  1         6  
  1         4  
  1         10  
  1         5  
  1         5  
  1         13  
  1         5  
  1         3  
  1         3  
  1         5  
  1         4  
  1         4  
  1         4  
  1         3  
  1         5  
  1         4  
  1         10  
  1         11  
  1         3  
  1         5  
  1         3  
  1         5  
  0         0  
  0         0  
  1         4  
  1         5  
  1         6  
  1         4  
  1         5  
  1         5  
  1         8  
  1         6  
  1         5  
  1         5  
  1         4  
  1         4  
  1         4  
  1         4  
  1         5  
  1         5  
  1         5  
  1         5  
  1         5  
  1         4  
  1         4  
  1         5  
  1         4  
  1         5  
  1         5  
  1         3  
  1         1  
  1         8  
  1         4  
  1         5  
  1         5  
  1         5  
  1         6  
  1         3  
  1         3  
  1         6  
  1         2  
  1         6  
  1         4  
  1         5  
  1         5  
  1         4  
  1         6  
  1         4  
  1         5  
  1         3  
  1         5  
  1         3  
  1         5  
  1         5  
  1         2  
  1         3  
  1         5  
  1         2  
  1         4  
  1         3  
  1         4  
  1         6  
  1         4  
  1         5  
  1         5  
  1         5  
  1         5  
  1         6  
  1         5  
  1         4  
  1         9  
  1         9  
  1         3  
  1         5  
  1         4  
  1         4  
  1         4  
  1         4  
  1         4  
  1         5  
  1         4  
  1         4  
  1         3  
  1         4  
  1         5  
  1         4  
  2         6  
  2         6  
  2         9  
  2         4  
  1         3  
  1         3  
  1         9  
  1         4  
  1         3  
  1         3  
  1         6  
  1         2  
  1         5  
  1         6  
  1         5  
  1         5  
  1         5  
  1         9  
  1         4  
  1         5  
  3         10  
  3         11  
  1         9  
  1         7  
  1         7  
  3         13  
  1         8  
  1         5  
  1         15  
  1         5  
  1         4  
  1         9  
  1         4  
  1         5  
  3         8  
  3         10  
  3         12  
  3         8  
  1         4  
  1         9  
  1         5  
  1         6  
  1         3  
  1         5  
  1         4  
  1         4  
  1         5  
  1         10  
  1         4  
  1         6  
  1         9  
  1         19  
  1         5  
  1         4  
  1         8  
  1         6  
  1         4  
  1         3  
  1         6  
  1         3  
  1         5  
  1         7  
  1         4  
  1         8  
  3         11  
  3         18  
  1         5  
  1         3  
  1         5  
  3         15  
  1         4  
  1         2  
  1         5  
  1         3  
  1         4  
  1         3  
  1         4  
  1         3  
  1         4  
  1         3  
  1         4  
  1         5  
  1         6  
  1         3  
  1         5  
  1         7  
  1         7  
  1         5  
  1         13  
  3         9  
  3         22  
  3         15  
  1         11  
  1         6  
  1         28  
  1         9  
  1         11  
  1         10  
276             }
277 427 100       2284 die $@ if $@;
278 426 50       14607 wantarray ? @___result : $___result[0];
279             }
280              
281             sub terse_dump {
282 69     69 0 1301 require Data::Dumper;
283             join ", ", map {
284 69         6537 Data::Dumper->new([$_])->Terse(1)->Indent(0)->Dump;
  377         16935  
285             } @_;
286             }
287              
288             sub copy_array {
289 494     493 0 821 my $arg = shift;
290 493 100       1262 unless (ref $arg) {
    50          
291 347         1187 return $arg
292             } elsif (ref $arg eq 'ARRAY') {
293 148         279 [map {copy_array($_)} @$arg]
  346         1182  
294             } else {
295 4         18 croak "Not an array ref: $arg";
296             }
297             }
298              
299             sub add_arg_order_in {
300 433   100 431 0 1270 my $argDict = $_[0] ||= {};
301 431   66     1971 my $argOrder = $_[1] ||= [];
302 431         995 my ($name, $arg) = splice @_, 2;
303              
304             croak "Duplicate argument definition: '$name'"
305 431 100       1151 if defined $argDict->{$name};
306              
307 431         1805 $arg->configure(argno => scalar keys %$argDict, varname => $name);
308 431         1187 push @$argOrder, $name;
309 431         980 $argDict->{$name} = $arg;
310              
311 431         1495 $arg;
312             }
313              
314             sub is_debug {
315 28     28 0 126 my $db = $main::{"DB::"};
316 28 50       149 defined $db and defined ${*{$db}{HASH}}{sub};
  28         85  
  28         438  
317             }
318              
319             sub no_lineinfo {
320 28 50   28 0 104 is_debug() and not $ENV{DEBUG_DETAIL};
321             }
322              
323             BEGIN {
324             # check if DB::sub exists.
325 14 50   14   14291 if (no_lineinfo()) {
326 14         79 *needs_line_info = sub () { 0 };
327 14     2   64 *line_info = sub {""};
  1         384  
328 14         93 require Scalar::Util;
329             *put_debuginfo = sub {
330 1     2   45 my ($pack, $fn) = splice @_, 0, 2;
331 1         2 @{$main::{"_<$fn"}} = (undef, map {
332 1         8 Scalar::Util::dualvar(1, $_);
  1         57  
333             } split /(?<=\n)/, $_[0]);
334 14         447 };
335             } else {
336 1         6 *needs_line_info = sub () { 1 };
337             *line_info = sub {
338 1         419 my ($offset) = @_;
339 1         11 my ($pack, $file, $line) = caller;
340 1         2 sprintf(qq|#line %d "%s"\n|, $line + $offset, $file)
341 1         2 };
342 1         37 *put_debuginfo = sub () {};
343             }
344             }
345              
346             1;