Codebase list libconfig-properties-perl-upstream / 72d6a86
accept any end of line terminator in any operating system Salvador Fandino 8 years ago
1 changed file(s) with 54 addition(s) and 24 deletion(s). Raw diff Collapse all Expand all
66
77 use IO::Handle;
88 use Carp;
9 use PerlIO;
9 use PerlIO qw();
10 use Errno qw();
1011
1112 {
1213 no warnings;
7576 my $file = delete $opts{file};
7677 my $encoding = delete $opts{encoding} || 'latin1';
7778 _t_encoding($encoding);
79 my $eol_re = delete $opts{eol_re};
80 $eol_re = qr/\r\n|\n|\r/ unless defined $eol_re;
81 my $line_re = qr/^(.*?)(?:$eol_re)/s;
7882
7983 %opts and croak "invalid option(s) '" . join("', '", keys %opts) . "'";
8084
96100 wrap => $wrap,
97101 order => $order,
98102 properties => {},
99 next_line_number => 1,
103 last_line_number => 0,
100104 property_line_numbers => {},
101105 file => $file,
102 encoding => $encoding };
106 encoding => $encoding,
107 line_re => $line_re };
103108 bless $self, $class;
104109
105110 if (defined $file) {
146151 defined(wantarray) and
147152 carp "warning: setProperty doesn't return the old value anymore";
148153
149 $self->{property_line_numbers}{$key} ||= $self->{next_line_number}++;
154 $self->{property_line_numbers}{$key} ||= ++$self->{last_line_number};
150155 $self->{properties}{$key} = $value;
151156 }
152157
248253 or croak "Unable to set file encoding layer: $!";
249254 }
250255 }
251 $self->{properties}={};
252 $self->{property_line_numbers}={};
253 $self->{next_line_number}=1;
256 $self->{properties} = {};
257 $self->{property_line_numbers} = {};
258 my $ln = $file->input_line_number;
259 $self->{last_line_number} = ($ln > 0 ? $ln : 0);
260 $self->{buffer_in} = '';
254261 1 while $self->process_line($file);
262 $self->{last_line_number};
255263 }
256264
257265
285293 defined $1 ? $unesc{$1}||$1 : chr hex $2 /ge;
286294 }
287295
296 sub read_line {
297 my ($self, $file) = @_;
298 my $bin = \$self->{buffer_in};
299 my $line_re = $self->{line_re};
300 while (1) {
301 if ($$bin =~ s/$line_re//) {
302 $self->{last_line_number}++;
303 return $1;
304 }
305 else {
306 my $bytes = read($file, $$bin, 8192, length $$bin);
307 last unless $bytes or (not defined $bytes and
308 ($! == Errno::EGAIN() or
309 $! == Errno::EWOULDBLOCK() or
310 $! == Errno::EINTR()));
311 }
312 }
313
314 if (length $$bin) {
315 $self->{last_line_number}++;
316 my $line = $$bin;
317 $$bin = '';
318 return $line
319 }
320 undef;
321 }
322
288323
289324 # process_line() - read and parse a line from the properties file.
290325
293328
294329 sub process_line {
295330 my ($self, $file) = @_;
296 my $line=<$file>;
331 my $line = $self->read_line($file);
297332 defined $line or return undef;
298 $line =~ s/\r\n/\n/g;
299 my $ln = $self->{line_number} = $file->input_line_number;
300 if ($ln == 1) {
301 # remove utf8 byte order mark
302 $line =~ s/$bomre//;
303 }
333
334 # remove utf8 byte order mark
335 my $ln = $self->{last_line_number};
336 $line =~ s/$bomre// if $ln < 2;
337
304338 # ignore comments
305339 $line =~ /^\s*(\#|\!|$)/ and return 1;
306
307 $line =~ s/\x0D*\x0A$//;
308340
309341 # handle continuation lines
310342 my @lines;
311343 while ($line =~ /(\\+)$/ and length($1) & 1) {
312344 $line =~ s/\\$//;
313345 push @lines, $line;
314 $line = <$file>;
315 $line =~ s/\x0D*\x0A$//;
346 $line = $self->read_line($file);
347 $line = '' unless defined $line;
316348 $line =~ s/^\s+//;
317349 }
318 $line=join('', @lines, $line) if @lines;
350 $line = join('', @lines, $line) if @lines;
319351
320352 my ($key, $value) = $line =~ /^
321353 \s*
327359 $
328360 /x
329361 or $self->fail("invalid property line '$line'");
330
362
331363 unescape $key;
332364 unescape $value;
333365
334366 $self->validate($key, $value);
335367
336368 $self->{property_line_numbers}{$key} = $ln;
337 $self->{next_line_number}=$ln+1;
338
339369 $self->{properties}{$key} = $value;
340370
341371 return 1;
351381
352382
353383 # line_number() - number for the last line read from the configuration file
354 sub line_number { shift->{line_number} }
384 sub line_number { shift->{last_line_number} }
355385
356386
357387 # fail(error) - report errors in the configuration file while reading.
854884
855885 loads properties from the open file C<$file>.
856886
857 Old properties on the object are forgotten.
887 Old properties on the object are discarded.
858888
859889 =item $p-E<gt>save($file)
860890