home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / hypertext / latex2html_1 / !Perl_riscos_pm_RDBM_File < prev    next >
Encoding:
Text File  |  1996-07-17  |  4.6 KB  |  153 lines

  1. #By S.W.Ellacott@brighton.ac.uk
  2. #This is version 2: Wed 17th July 1996
  3.  
  4. package RDBM_File;
  5. use Carp;
  6. use RiscosLib;
  7.  
  8. $debug = 0;
  9.  
  10. printf "RDBM Loading\n" if $debug;
  11.  
  12. %lastkey = ();
  13. $buffer = ' 'x255;
  14. $buflen = length($buffer);
  15.  
  16. system('rmensure gdbm 0 rmload system:modules.gdbm');
  17.  
  18. # Get the SWI numbers
  19. $str="Gdbm_Open"; $Gdbm_Open = SWINumberFromString($str);
  20. $str="Gdbm_Store";$Gdbm_Store = SWINumberFromString($str);
  21. $str="Gdbm_Fetch";$Gdbm_Fetch = SWINumberFromString($str);
  22. $str="Gdbm_Exists";$Gdbm_Exists = SWINumberFromString($str);
  23. $str="Gdbm_Delete";$Gdbm_Delete = SWINumberFromString($str);
  24. $str="Gdbm_FirstKey";$Gdbm_FirstKey = SWINumberFromString($str);
  25. $str="Gdbm_NextKey";$Gdbm_NextKey = SWINumberFromString($str);
  26. $str="Gdbm_Clear";$Gdbm_Clear = SWINumberFromString($str);
  27. $str="Gdbm_Close";$Gdbm_Close = SWINumberFromString($str);
  28.  
  29. #Set up some register masks
  30. @in = (0);@out = ();$ocmask = ®mask(\@in,\@out);
  31. @in = (0..4);@out = ();$sfmask = ®mask(\@in,\@out);
  32. @in = (0..2);@out = ();$edmask = ®mask(\@in,\@out);
  33.  
  34. #Set up a default work directory
  35. $workdir = '<PerlArchLib$Dir>.work.rdbm.'; # Directory used if no pathname for the database
  36.  
  37. print "RDBM initialisation completed\n" if $debug;
  38.  
  39. sub TIEHASH  {
  40.     print "In TIEHASH, package is $_[0], database is $_[1]\n" if $debug;
  41.     my $file = $_[1];
  42.     my $pathname;
  43.     my @path = split( m@\.@, $file);
  44.     $file = pop(@path);
  45.     if ( @path ) {
  46.         $pathname = join('.', @path ).'.';
  47.     } else {
  48.         $pathname = $workdir;
  49.     }
  50.     $file = $pathname.$file;
  51.         my $handle = syscall($Gdbm_Open,$ocmask,$file) || croak ("Can't open database $file");
  52.     my $self = \$handle;
  53.     bless $self;
  54. }
  55.  
  56. sub STORE    {
  57.     print "In STORE, storing in database ${$_[0]}:\-   $_[1] : $_[2]\n" if $debug;
  58.     my $handle = ${$_[0]};
  59.     my $key = $_[1]; my $keylen = length($key);
  60.     my $value = $_[2];
  61.     $value = "$value"; # Force it to be a string
  62.     my $vallen = length($value);
  63.     syscall($Gdbm_Store,$sfmask,$handle,$key,$keylen,$value,$vallen);
  64. }
  65.  
  66. sub FETCH    {
  67.     print "In FETCH, finding value for $_[1] in database ${$_[0]}\n " if $debug;
  68.     my $handle = ${$_[0]};
  69.     my $key = $_[1]; my $keylen = length($key);
  70.     my $itemlen = syscall($Gdbm_Fetch,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  71. #    carp("No such item") if ($itemlen == -1); #This is the old version
  72.     return undef if ($itemlen == -1);
  73. #    return 0 if ($itemlen == -1);
  74.     if ( $itemlen > $buflen ) {
  75.         warn "Buffer extended" if $debug;
  76.         $buffer = ' ' x $itemlen;
  77.         $buflen = $itemlen;
  78.         $itemlen = syscall($Gdbm_Fetch,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  79.     }
  80.     substr($buffer, 0, $itemlen);
  81. }
  82.  
  83. sub EXISTS   {
  84.     print "In EXISTS, finding value for $_[1] in database ${$_[0]}\n " if $debug;
  85.     my $handle = ${$_[0]};
  86.     my $key = $_[1]; my $keylen = length($key);
  87.     syscall($Gdbm_Exists,$edmask,$handle,$key,$keylen);
  88. }
  89.  
  90. sub DELETE   {
  91.     print "In DELETE, deleting value for $_[1] in database ${$_[0]}\n " if $debug;
  92.     my $handle = ${$_[0]};
  93.     my $key = $_[1]; my $keylen = length($key);
  94.     # DELETE should return deleted value, so we have to fetch it
  95.     my $itemlen = syscall($Gdbm_Fetch,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  96.     carp("No such item") if ($itemlen == -1);
  97.     if ( $itemlen > $buflen ) {
  98.         warn "Buffer extended" if $debug;
  99.         $buffer = ' ' x $itemlen;
  100.         $buflen = $itemlen;
  101.         $itemlen = syscall($Gdbm_Fetch,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  102.     }
  103.     syscall($Gdbm_Delete,$edmask,$handle,$key,$keylen);
  104.     substr($buffer, 0, $itemlen);
  105. }
  106.  
  107. sub FIRSTKEY {
  108.     print "In FIRSTKEY, database ${$_[0]}\n " if $debug;
  109.     my $handle = ${$_[0]};
  110.     $itemlen = syscall($Gdbm_FirstKey,$edmask,$handle,$buffer,$buflen);
  111.     return undef if ($itemlen == -1);
  112.     if ( $itemlen > $buflen ) {
  113.         warn "Buffer extended" if $debug;
  114.         $buffer = ' ' x $itemlen;
  115.         $buflen = $itemlen;
  116.         $itemlen = syscall($Gdbm_FirstKey,$edmask,$handle,$buffer,$buflen);
  117.     }
  118.     $lastkey{$handle} = substr($buffer, 0, $itemlen);
  119. }
  120.  
  121. sub NEXTKEY  {
  122.     print "In NEXTTKEY, database ${$_[0]}\n " if $debug;
  123.     my $handle = ${$_[0]};
  124.     my $key = $lastkey{$handle}; my $keylen = length($key);
  125.     $itemlen = syscall($Gdbm_NextKey,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  126.     return undef if ($itemlen == -1);
  127.     if ( $itemlen > $buflen ) {
  128.         warn "Buffer extended" if $debug;
  129.         $buffer = ' ' x $itemlen;
  130.         $buflen = $itemlen;
  131.         $itemlen = syscall($Gdbm_NextKey,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  132.     }
  133.     $lastkey{$handle} = substr($buffer, 0, $itemlen);
  134. }
  135.  
  136. sub CLEAR    {
  137.     print "In CLEAR, database ${$_[0]}\n " if $debug;
  138.     my $handle = ${$_[0]};
  139.     syscall($Gdbm_Clear,$ocmask,$handle);
  140. }
  141.  
  142. sub DESTROY    {
  143.     print "DESTROY called for ${$_[0]}\n" if $debug;
  144.     my $handle = ${$_[0]};
  145.     # I don't think we want actually to delete the database, just close it
  146.     syscall($Gdbm_Close,$ocmask,$handle);
  147. }
  148.  
  149. 1;
  150.  
  151. __END__
  152.  
  153.