#******************************************************************************* #* Pure perl implementations of the stuff that really we want to do in C. #* These functions only exist to make sure that people without a C compiler #* can still use this module albeit at a greatly reduced speed. #******************************************************************************* package P4::JournalRec; #******************************************************************************* # Return the fields of the record as a cooked array. All '@' # encoding is removed. #******************************************************************************* sub Fields() { my $self = shift; if ( defined ( $self->{'fields'} ) ) { return @{$self->{'fields'}}; } # Otherwise, work it out. my $rec = $self->{'record'}; my @infields = split(/ /, $rec); my @outfields; # Now need to rejoin some of the fields which contained embedded spaces while (@infields) { my $buf = shift( @infields ); if ( $buf =~ /^[0-9a-fA-F]+$/ ) { # Numeric field. push(@outfields, $buf); } elsif ( $buf =~ /^\@\@$/ ) { # It's an empty string push(@outfields, ""); } elsif ( $buf =~ /^\@([^\@]|\@\@)+\@$/ ) { # The field is properly terminated $buf =~ s/^\@((?:[^\@]|\@\@)+)\@$/$1/; $buf =~ s/\@\@/\@/g; push(@outfields, $buf); } elsif ( $buf =~ /^\@([^@]|\@\@)*$/ ) { # Has been split too early and is not terminated. my $t; while( 1 ) { croak("Premature end of data!") if ( ! scalar( @infields ) ); $t = shift( @infields ); $buf .= " $t"; last if ( $t =~ /^([^\@]|\@\@)*\@$/ ); } $buf =~ s/^\@//; $buf =~ s/\@$//; $buf =~ s/\@\@/\@/g; push(@outfields, $buf); } else { push(@outfields, $buf); } } $self->{'fields'} = [ @outfields ]; @outfields; } #******************************************************************************* # Set the record based on an array #******************************************************************************* sub Set( \@ ) { my $self = shift; my $rec = ""; $self->{'fields'} = undef; foreach my $field( @_ ) { if ( $field =~ /^\-?[0-9]+$/ ) { # Nothing } elsif ( $field =~ /^([0-9A-F][0-9A-F])+$/ ) { # Nothing } else { $field =~ s/\@/\@\@/g; $field =~ s/^((?:.|\n)*)$/\@$1\@/; } $rec .= "$field "; } $self->{'record'} = $rec; } package P4::Journal; #****************************************************************************** # Function to determine whether or not the journal record we have is # complete, or whether it ends in the middle of a multi-line field. #****************************************************************************** sub CompleteRecord( $$ ) { my $self = shift; my $rec = shift; my $instr = 0; my @fields = split( " ", $rec ); foreach my $field ( @fields ) { if ( $instr == 0 ) { $instr = 1 if ( $field =~ /^\@([^\@]|\@\@)*$/ ); } else { $instr = 0 if ( $field =~ /^([^\@]|\@\@)*\@$/ ); } } return ! $instr; } 1;