<?php
function fread_string( $fp )
{
  $buf = "";
  $c = '';

  do
  {
    if (feof($fp))
    die( "fread_string: EOF encountered on read." );
    $c = fgetc($fp);
  }
  while ( ctype_space($c) );

  if ( $c == '~' )
    return "";

  while( !feof($fp) )
  {
    switch( $c )
    {
    case '~':
      return $buf;
    break;
    default:
      $buf .= $c;
    break;
     }
     $c = fgetc($fp);
  }
  return $buf;
}
function fread_word($fp)
{
   $buf = "";
   $c = '';
   $cEnd = ' ';
   do
   {
     if (feof($fp))
       die( "fread_word: EOF encountered on read." );
     $c = fgetc($fp);
   }
   while ( ctype_space($c) );

   if ( $c == ' ' || $c == '\'' || $c == '"' )
    $cEnd = $c;

   while( !feof($fp) )
   {
     if ( ctype_cntrl($c) )
    break;
     if ( $c == $cEnd )
    break;
     $buf .= $c;
     $c = fgetc( $fp );
   }
   if ( !strcmp($buf,"") )
    return NULL;
   return $buf;
}
function fread_number( $fp )
{
   $number = 0;
   $c = '';
   $sign = false;
   $pos = 0;
   do
   {
    if ( feof($fp) )
        die( "fread_number: EOF encoutered on read." );
    $c = fgetc($fp);
   } while ( ctype_space($c) );

   if ( $c == '-' )
   {
    $sign = TRUE;
    $c = fgetc($fp);
   }
   else if ( $c == '+' )
    $c = fgetc($fp);
   if ( !ctype_digit($c) )
    die( "fread_number: bad format '$c'" );
   $pos = ftell($fp);
   while ( ctype_digit($c) )
   {
    if ( feof($fp) )
        die( "fread_number: eof encoutered on read." );
    $number = $number * 10 + $c - '0';
    $c = fgetc( $fp );
    $pos = ftell($fp);
   }
   if ( $sign )
    $number = 0 - $number;

   if ( $c == '|' )
    $number += fread_number($fp);
   else if ( $c != ' ' )
    fseek( $fp, $pos );
   return $number;
}
function fread_letter( $fp )
{
    $c = ' ';
    while( ctype_space($c) )
        if ( feof($fp) )
            die( "Fread_letter: EOF encountered on read." );
        else
            $c = fgetc( $fp );
    return $c;
}

?>