Viewing File: /usr/local/cpanel/3rdparty/perl/536/cpanel-lib/x86_64-linux/B/C/Save/Hek.pm

package B::C::Save::Hek;

use B::C::Std;

use B::C::File    qw(sharedhe sharedhestructs);
use B::C::Helpers qw/strlen_flags/;

use Exporter ();
our @ISA = qw(Exporter);

our @EXPORT_OK = qw/save_shared_he get_sHe_HEK/;

my %saved_shared_hash;

sub save_shared_he ($key) {

    return ( 'NULL', 0 ) unless defined $key;
    return @{ $saved_shared_hash{$key} } if $saved_shared_hash{$key};

    my $utf8 = 0;
    my ( $cur, $cstring ) = try_latin1($key);

    if ( !$cur ) {
        ( $cstring, $cur, $utf8 ) = strlen_flags($key);
    }

    _define_once($cur);

    my $index = sharedhe()->index() + 1;
    sharedhe()->sadd( "ALLOC_sHe(%d, %d, %s, %d); /* sHe%d */", $index, $cur, $cstring, $utf8 ? 1 : 0, $index );

    # cannot use sHe$ix directly as sharedhe_list is used in by init_pl_strtab and init_assign
    $saved_shared_hash{$key} = [ sprintf( q{sharedhe_list[%d]}, $index ), $cur ];

    return @{ $saved_shared_hash{$key} };
}

sub _define_once ($len) {

    sharedhestructs()->{_defined_once} //= {};

    return if sharedhestructs()->{_defined_once}->{$len};

    sharedhestructs->sadd( q{DEFINE_STATIC_SHARED_HE_STRUCT(%d);}, $len );
    sharedhestructs()->{_defined_once}->{$len} = 1;
}

sub try_latin1 ($pv) {

    my @chars = map { ord $_ } split( '', $pv );

    # Can't be converted to utf8 because one of the chars can't fit in a byte.
    return if ( grep { $_ > 255 } @chars );

    my $cstring = '';
    foreach my $char (@chars) {
        if ( $char >= 32 and $char < 128 and $char != 92 and $char != 34 ) {
            $cstring .= chr($char);
        }
        else {
            $cstring .= sprintf( '\\%03o', $char );
        }
    }

    return ( scalar @chars, qq{"$cstring"} );
}

sub get_sHe_HEK ($shared_he) {

    return q{NULL} if !defined $shared_he or $shared_he eq 'NULL';

    my $sharedhe_ix;
    if ( $shared_he =~ qr{^sharedhe_list\[([0-9]+)\]$} ) {
        $sharedhe_ix = $1;
    }

    die unless defined $sharedhe_ix;
    my $se = q{sHe} . $sharedhe_ix;

    return sprintf( q{get_sHe_HEK(%s)}, $se );
}

1;
Back to Directory File Manager