# # $Header: /cvsroot/devicetool/Solaris-DeviceTree/lib/Solaris/DeviceTree/Libdevinfo/PromProperty.pm,v 1.6 2003/12/09 13:04:47 honkbude Exp $ # package Solaris::DeviceTree::Libdevinfo::PromProperty; use 5.006; use strict; use warnings; use Solaris::DeviceTree::Libdevinfo::Impl; our $VERSION = do { my @r = (q$Revision: 1.6 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker =pod =head1 NAME Solaris::DeviceTree::Libdevinfo::PromProperty - PROM property of a node of the Solaris devicetree =head1 SYNOPSIS use Solaris::DeviceTree::Libdevinfo; $tree = new Solaris::DeviceTree::Libdevinfo; %pprops = %{$tree->prom_props}; =head1 DESCRIPTION This class allows access to PROM properties of a node in various output formats. The value of the property is returned as a reference to a scalar containing the binary values of the property. =head1 METHODS The constructor is considered internal and should not be used. The following methods are available: =cut # The constructor takes a packed binary scalar # with the value. Instances of this class are usually created from # L. sub new { my ($pkg, $data) = @_; my $this = bless \$data, $pkg; return $this; } =pod =head3 $promprop->string Returns the value of the property as human readable string where the value is returned as ASCII string or hex depending of the contents. =cut sub iaToString { my @intArray = @_; return "" if( @intArray == 0 ); # according to di_prom_prop_lookup_bytes(3DEVINFO) a property of type 'string' # can be a concatenation of several strings separated by '0'. # NOTE: We assume here that each of the strings must not be empty. # does the string contain unprintable characters? pop @intArray if( $intArray[ -1 ] == 0 ); # strip possible trailing zero my $isString = 1; # check for single string foreach my $v (@intArray) { if( $v < 32 || ($v > 126 && $v < 161) || $v > 254) { $isString = 0; } } # if it is not a simple string it might be a string array my $isStringArray = 1; if( $isString == 0 ) { my $newStringEmpty = 0; foreach my $v (@intArray) { if( $v == 0 ) { $isStringArray = 0 if( $newStringEmpty == 1 ); # Empty element in array } $newStringEmpty = ( $v == 0 ? 1 : 0 ); if( ($v > 0 && $v < 32) || ($v > 126 && $v < 161) || $v > 254) { $isStringArray = 0; } } } # if it is an integer array, the length is dividable by 4 my $isIntArray = 0; my @propInts; if( @intArray % 4 == 0 ) { $isIntArray = 1; my @a = @intArray; while( @a > 0 ) { my $val = 0; for (0..3) { $val = $val * 256 + (shift @a); } push @propInts, $val; } } # convert the array to a printable string my $string; if( $isString ) { $string = join "", map { chr( $_ ) } @intArray; # convert to characters } elsif( $isStringArray ) { $string = join "", map { $_ == 0 ? "\n" : chr( $_ ) } @intArray; # convert to characters } elsif( $isIntArray ) { $string = join " ", @propInts; } else { $string = join " ", @intArray; # Use unmodified array here and print ascii values } return $string; } sub string { my ($this, %options) = @_; return iaToString( unpack( "C*", $$this ) ); } =pod =head1 AUTHOR Copyright 1999-2003 Dagobert Michelsen. =head1 SEE ALSO L, C, C, C, C. =cut 1;