File Coverage

blib/lib/oEdtk/Spool.pm
Criterion Covered Total %
statement 9 61 14.7
branch 0 24 0.0
condition 0 3 0.0
subroutine 3 6 50.0
pod 3 3 100.0
total 15 97 15.4


line stmt bran cond sub pod time code
1             package oEdtk::Spool;
2              
3 1     1   847 use strict;
  1         4  
  1         44  
4 1     1   5 use warnings;
  1         2  
  1         37  
5              
6 1     1   7 use oEdtk::Main 0.42;
  1         35  
  1         2395  
7              
8             our $VERSION = 0.019;
9              
10             # Le nombre maximal de caractères que l'on emet avant d'insérer
11             # un saut de ligne.
12             my $LINE_CUTOFF = 85;
13              
14             sub new {
15 0     0 1   my ($class, $in, $out) = @_;
16              
17 0 0         my $self = {
    0          
18             input => ref($in) eq 'GLOB' ? $in : \*STDIN,
19             output => ref($out) eq 'GLOB' ? $out : \*STDOUT,
20             emitted => 0
21             };
22 0           bless $self, $class;
23 0           return $self;
24             }
25              
26             # Format du flux d'entrée ligne par ligne.
27             #
28             # Les 4 premiers caractères de la ligne déterminent le cas.
29             #
30             # cas n°1:
31             # /^(\d{3}) (.*)$/
32             #
33             # $1 = resource
34             # $2 = data
35             #
36             # cas n°2, dans une ressource:
37             # /^ (\d)(.*)$/
38             #
39             # $1 = saut canal
40             # $2 = data
41             sub parse {
42 0     0 1   my $self = shift;
43 0           my $processfn = shift;
44 0           my $fh = $self->{'input'};
45              
46 0           $self->{'XCORP'} = oe_corporation_get();
47             # Lecture du fichier d'entrée ligne par ligne.
48 0           while (my $line=<$fh>) {
49 0           chomp ($line);
50              
51 0 0         if (length $line == 0) {
52 0           warn "INFO : line $. is empty\n";
53 0           next;
54             }
55              
56             # Récupération des 4 premiers caractères.
57 0 0         die "ERROR: unexpected line format: \"$line\" at line $.\n"
58             unless $line =~ /^(.{3})([0-9+\- ]?)(.*)$/;
59 0           my ($header, $jump, $data) = ($1, $2, $3);
60             # PROBLEME, sur 2 lignes comme ci-dessous
61             #026 *** LAURIANE 20/09/1984 01 REFERENCES DECOMPTE: 07/01/2009RO181 0002*
62             # 2 *** MAELENN 02/12/1993 11 REFERENCES DECOMPTE: 30/12/2008RO422 0002*
63             # jump ne doit pas être vide dans le premier cas sinon $data contient 1 caractère de plus la première fois, dans le second cas il contient un caractère de moins
64             # ce qui décale le découpage dans l'appli pricipale
65              
66             # Mise en place d'une ligne de préfixe technique, utilisée uniquement pour alimenter des state
67             #004 EDT XCORP M0001
68              
69 0 0         if ($header =~ /^[0-9a-zA-Z]{3}$/) { # Cas numéro 1.
    0          
70 0           $self->{'prev_inres'} = $self->{'inres'};
71 0           $self->{'inres'} = $header;
72 0           $self->{'jump'} = $jump;
73              
74 0 0         if ($data =~ /^\s{1,13}EDT XCORP/) {
75             # warn "EDT XCORP >$data<\n";
76             # Réinitialisation de la state. > EDT XCORP M0001<
77 0           $self->{'numln'} = 0;
78 0           $self->{'jumpln'}= 0;
79             # reste à faire, gérer des states par paire :
80             # EDT XCORP VALUE STATE2 VALUE2 STATE3 VALUE3 etc.
81 0           $data =~ s/^(\s{1,13}EDT\s)(.*)/$2/;
82 0           while ($data) {
83 0           $data =~ s/^([\w\d]+)\s([\w\d]+)\s*(.*)/$3/;
84 0           $self->{$1} = $2;
85             }
86             # warn "EDT XCORP >$data<\n " . $self->{'XCORP'}. "\n";
87 0           next;
88            
89             } else {
90             # Réinitialisation de la state.
91 0           $self->{'numln'} = 1;
92 0           $self->{'jumpln'}= 1;
93             }
94             # Réinitialisation de la state.
95 0           $self->{'state'} = {};
96 0           $processfn->($self, $data);
97              
98             } elsif ($header eq ' ') {
99 0           $self->{'jump'} = $jump;
100 0 0         if (!defined $self->{'inres'}) {
101 0           die "ERROR: got seal while not in a resource at line $.\n";
102             }
103 0           $self->{'numln'}++;
104 0 0 0       if (defined($jump) && $jump =~ /\d/) {
105 0           $self->{'jumpln'} += $self->{'jump'};
106             }
107 0           $processfn->($self, $data);
108             } else {
109 0           die "ERROR: unexpected line header: \"$header$jump\" at line $.\n";
110             }
111             }
112             }
113              
114             # Emission d'un tag Compuset.
115             sub emit {
116 0     0 1   my ($self, $name, $val) = @_;
117 0           my $fh = $self->{'output'};
118              
119 0           my $tag;
120 0 0         if (defined $val) {
121 0           $val =~ s/\s+/ /g;
122 0           $tag = "<#$name=$val>";
123             } else {
124 0           $tag = "<$name>";
125             }
126              
127 0           my $taglen = length $tag;
128 0 0         if ($self->{'emitted'} + $taglen > $LINE_CUTOFF) {
129 0 0         print $fh "\n" if $self->{'emitted'} > 0;
130 0           $self->{'emitted'} = 0;
131             }
132 0           $self->{'emitted'} += $taglen;
133 0           print $fh $tag;
134             }
135              
136             1;
137              
138             __END__