home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / nsfast / root.9 / usr / ns-home / install / Magnus.pm / Magnus
Text File  |  1998-08-19  |  2KB  |  120 lines

  1. package Magnus;
  2.  
  3. sub new {
  4.     my    $header = shift;
  5.     my    $self = {};
  6.     my    $source;
  7.     my    $line;
  8.  
  9.     $self->{'sourceDeleted'} = {};
  10.     $self->{'file'} = shift;
  11.     if ( ! open( FILE, $self->{'file'} ) ) {
  12.     $@ = $!;
  13.     return undef;
  14.     }
  15.     while ( <FILE> ) {
  16.     $source = $_;
  17.     while ( /\\$/ ) {    # continuation
  18.         $line = <FILE>;
  19.         $_ = $` . $line;
  20.         $source .= $line;
  21.         last if $_ eq $`;    # in case of EOF
  22.     }
  23.     push( @{$self->{'source'}}, $source );
  24.     next if /^\s*$/;
  25.     next if /^#/;
  26.     chomp( $_ );
  27.     ( $var, $val ) = /(\w+)\s+(.*)/;
  28.     $var = "\L$var";
  29.     if ( $var eq 'init' ) {
  30.         push( @{$self->{'inits'}}, $val );
  31.         push( @{$self->{'initIndex'}}, $#{$self->{'source'}} );
  32.     } else {
  33.         warn "Duplicate $var: $self->{'file'}: $.\n"
  34.         if $self->{'vars'}->{$var};
  35.         $self->{'vars'}->{$var} = $val;
  36.         $self->{'index'}->{"\L$var"} = $#{$self->{'source'}};
  37.     }
  38.     }
  39.     close( FILE );
  40.     bless $self;
  41. }
  42.  
  43. sub set {
  44.     my    $self = shift;
  45.     my    $var = shift;
  46.     my    $val = shift;
  47.     my    $index = defined( $self->{'vars'}->{"\L$var"} ) ?
  48.     $self->{'index'}->{"\L$var"} : scalar( @{$self->{'source'}} );
  49.  
  50.     $self->{'vars'}->{"\L$var"} = $val;
  51.     $self->{'source'}->[$index] = "$var $val\n";
  52.     $self->{'index'}->{"\L$var"} = $index;
  53.     $self->{'modified'} = 1;
  54. }
  55.  
  56. sub value {
  57.     my    $self = shift;
  58.     my    $var = shift;
  59.  
  60.     return $self->{'vars'}->{"\L$var"};
  61. }
  62.  
  63. sub deleteVar {
  64.     my    $self = shift;
  65.     my    $var = shift;
  66.  
  67.     $self->{'sourceDeleted'}->{$self->{'index'}->{"\L$var"}} = 1;
  68.     $self->{'modified'} = 1;
  69. }
  70.  
  71. sub numInits {
  72.     my    $self = shift;
  73.  
  74.     return scalar( @{$self->{'inits'}} );
  75. }
  76.  
  77. sub getInit {
  78.     my    $self = shift;
  79.     my    $index = shift;
  80.  
  81.     return $self->{'inits'}->[$index];
  82. }
  83.  
  84. sub addInit {
  85.     my    $self = shift;
  86.     my    $init = shift;
  87.  
  88.     push( @{$self->{'inits'}}, $init );
  89.     push( @{$self->{'source'}}, "Init $init\n" );
  90.     push( @{$self->{'initIndex'}}, $#{$self->{'source'}} );
  91.     $self->{'modified'} = 1;
  92. }
  93.  
  94. sub deleteInit {
  95.     my    $self = shift;
  96.     my    $index = shift;
  97.  
  98.     $self->{'sourceDeleted'}->{$self->{'initIndex'}->[$index]} = 1;
  99.     $self->{'modified'} = 1;
  100. }
  101.  
  102. sub flush {
  103.     my    $self = shift;
  104.  
  105.     if ( $self->{'modified'} ) {
  106.     my    $i;
  107.  
  108.     open( FILE, ">$self->{'file'}" ) ||
  109.         die "Can't write to $self->{'file'}: $!\n";
  110.     for ( $i = 0 ; $i < scalar( @{$self->{'source'}} ) ; ++$i ) {
  111.         print FILE $self->{'source'}->[$i]
  112.         unless $self->{'sourceDeleted'}->{$i};
  113.     }
  114.     close( FILE );
  115.     }
  116.     $self->{'modified'} = 0;
  117. }
  118.  
  119. 1;
  120.