File Coverage

blib/lib/Text/CSV.pm
Criterion Covered Total %
statement 54 58 93.1
branch 11 14 78.5
condition 9 11 81.8
subroutine 14 18 77.7
pod 4 7 57.1
total 92 108 85.1


line stmt bran cond sub pod time code
1             package Text::CSV;
2              
3 38     38   4651248 use strict;
  38         90  
  38         1736  
4 38     38   351 use Exporter;
  38         98  
  38         1919  
5 38     38   273 use Carp ();
  38         92  
  38         1471  
6 38     38   244 use vars qw( $VERSION $DEBUG @ISA @EXPORT_OK %EXPORT_TAGS );
  38         108  
  38         4649  
7             @ISA = qw( Exporter );
8              
9             BEGIN {
10 38     38   143 $VERSION = '2.06';
11 38         21898 $DEBUG = 0;
12             }
13              
14             # if use CSV_XS, requires version
15             my $Module_XS = 'Text::CSV_XS';
16             my $Module_PP = 'Text::CSV_PP';
17             my $XS_Version = '1.60';
18              
19             my $Is_Dynamic = 0;
20              
21             my @PublicMethods = qw/
22             version error_diag error_input
23             known_attributes
24             PV IV NV CSV_TYPE_PV CSV_TYPE_IV CSV_TYPE_NV
25             CSV_FLAGS_IS_QUOTED CSV_FLAGS_IS_BINARY CSV_FLAGS_ERROR_IN_FIELD CSV_FLAGS_IS_MISSING
26             /;
27              
28             %EXPORT_TAGS = (
29             CONSTANTS => [qw(
30             CSV_FLAGS_IS_QUOTED
31             CSV_FLAGS_IS_BINARY
32             CSV_FLAGS_ERROR_IN_FIELD
33             CSV_FLAGS_IS_MISSING
34             CSV_TYPE_PV
35             CSV_TYPE_IV
36             CSV_TYPE_NV
37             )],
38             );
39             @EXPORT_OK = (qw(csv PV IV NV), @{$EXPORT_TAGS{CONSTANTS}});
40              
41             #
42              
43             # Check the environment variable to decide worker module.
44              
45             unless ($Text::CSV::Worker) {
46             $Text::CSV::DEBUG and Carp::carp("Check used worker module...");
47              
48             if (exists $ENV{PERL_TEXT_CSV}) {
49             if ($ENV{PERL_TEXT_CSV} eq '0' or $ENV{PERL_TEXT_CSV} eq 'Text::CSV_PP') {
50             _load_pp() or Carp::croak $@;
51             }
52             elsif ($ENV{PERL_TEXT_CSV} eq '1' or $ENV{PERL_TEXT_CSV} =~ /Text::CSV_XS\s*,\s*Text::CSV_PP/) {
53             _load_xs() or _load_pp() or Carp::croak $@;
54             }
55             elsif ($ENV{PERL_TEXT_CSV} eq '2' or $ENV{PERL_TEXT_CSV} eq 'Text::CSV_XS') {
56             _load_xs() or Carp::croak $@;
57             }
58             else {
59             Carp::croak "The value of environmental variable 'PERL_TEXT_CSV' is invalid.";
60             }
61             }
62             else {
63             _load_xs() or _load_pp() or Carp::croak $@;
64             }
65              
66             }
67              
68             sub new { # normal mode
69 702     702 1 7311904 my $proto = shift;
70 702   100     5100 my $class = ref($proto) || $proto;
71              
72 702 100       2538 unless ($proto) { # for Text::CSV_XS/PP::new(0);
73 1         78 return eval qq| $Text::CSV::Worker\::new( \$proto ) |;
74             }
75              
76             #if (ref $_[0] and $_[0]->{module}) {
77             # Carp::croak("Can't set 'module' in non dynamic mode.");
78             #}
79              
80 701 100       4263 if (my $obj = $Text::CSV::Worker->new(@_)) {
81 650         2598 $obj->{_MODULE} = $Text::CSV::Worker;
82 650         1446 bless $obj, $class;
83 650         7657 return $obj;
84             }
85             else {
86 50         192 return;
87             }
88              
89             }
90              
91             sub csv {
92 345 100 100 345 1 1063660 if (@_ && ref $_[0] eq __PACKAGE__ or ref $_[0] eq __PACKAGE__->backend) {
      66        
93 15         58 splice @_, 0, 0, "csv";
94             }
95 345         873 my $backend = __PACKAGE__->backend;
96 38     38   362 no strict 'refs';
  38         71  
  38         15638  
97 345         755 &{"$backend\::csv"}(@_);
  345         2020  
98             }
99              
100 0     0 0 0 sub require_xs_version { $XS_Version; }
101              
102             sub module {
103 679     679 0 138870 my $proto = shift;
104             return !ref($proto) ? $Text::CSV::Worker
105 679 50       2396 : ref($proto->{_MODULE}) ? ref($proto->{_MODULE}) : $proto->{_MODULE};
    100          
106             }
107              
108             *backend = *module;
109              
110             sub is_xs {
111 0     0 1 0 return $_[0]->module eq $Module_XS;
112             }
113              
114             sub is_pp {
115 2     2 1 2173 return $_[0]->module eq $Module_PP;
116             }
117              
118 0     0 0 0 sub is_dynamic { $Is_Dynamic; }
119              
120 0     0   0 sub _load_xs { _load($Module_XS, $XS_Version) }
121              
122 38     38   108 sub _load_pp { _load($Module_PP) }
123              
124             sub _load {
125 38     38   95 my ($module, $version) = @_;
126 38   50     979 $version ||= '';
127              
128 38 50       122 $Text::CSV::DEBUG and Carp::carp "Load $module.";
129              
130 38     38   47039 eval qq| use $module $version |;
  38         198  
  38         2325  
  38         3574  
131              
132 38 50       237 return if $@;
133              
134 38         602 push @Text::CSV::ISA, $module;
135 38         184 $Text::CSV::Worker = $module;
136              
137 38         174 local $^W;
138 38     38   271 no strict qw(refs);
  38         88  
  38         6401  
139              
140 38         120 for my $method (@PublicMethods) {
141 532         720 *{"Text::CSV::$method"} = \&{"$module\::$method"};
  532         1883  
  532         1498  
142             }
143 38         316 return 1;
144             }
145              
146             1;
147             __END__