Rot/deity/
Rot/player/
Rot/src/utils/pfiles/
Rot/src/utils/www/
#!/usr/local/bin/perl

# Usages:
#	whitespace = space, tab, newline, carriage return, tilde;
#   fread_letter:	Reads a single letter from FILE, ignoring whitespace,
#			returns one character.
#
#   fread_number:	Reads a number from FILE, ignoring any LEADING
#			whitescape.  Terminates at the first
#			non-number found. Returns a signed integer.
#
#   fread_length:	Reads the length of file FILE.
#			Returns a signed integer.
#
#   fread_flag:		Reads a single block of characters, ignoring
#			leading whitespace, and terminating at trailing
#			whitespace.  Will read three different formats:
#				Alphabetic flags:  AGP
#				Numeric flags:     32833
#				Split Num flags:   1|64|32768
#			Returns a string containing Alphabetic flags.
#
#   fread_word:		Reads a single block of characters, ignoring
#			leading whitespace, and terminating at trailing
#			whitespace.  Returns a string containing the word.
#
#   fread_string:	Reads from current position (ignoring leading
#			whitespace except tilde) to the first tilde.
#			Returns a string.
#
#   fread_levels:	Reads from the first left bracket found till
#			the next right bracket found. Returns a string.
#
#   fread_to_eol:	Reads from current position to the end of the
#			current line.  Returns nothing.
#
#   fread_to_next:	Reads from current position to the start of
#			the next item.  Returns a string containing
#			a space, or the word "EOF" if the end of file
#			was encountered.
#
# All routines require the following global variables:
#		FILE		The open filehandle.
#		$pointer	Keeps track of the current position
#				in the file, should be set to 0 when
#				FILE is first opened.
#

sub fread_letter {
    local($var,$a);
    $a = 0;
    while ($a == 0)
    {
	$var = "";
	seek(FILE, $pointer, 0);
	if (sysread(FILE, $var, 1) == 0)
	{
	    print "\nBUG: fread_letter: EOF reached. $pointer\n";
	    exit;
	}
	$pointer++;
print "\t\t$pointer X\n";
	if (($var gt " ")&&($var lt "~"))
	{
	    $a++;
	}
    }
    return $var;
}


sub fread_number {
    local($num,$text,$var,$a);
    $a = 0;
    $num = 0;
    undef $text;
    while ($a == 0)
    {
	$var = "";
	seek(FILE, $pointer, 0);
	if (sysread(FILE, $var, 1) == 0)
	{
	    print "\nBUG: fread_number: EOF reached. $pointer\n";
	    exit;
	}
	if (($var eq "+")&&(!defined($text)))
	{
	    $var = " ";
	}
	if ((($var lt "0") || ($var gt "9")) && ($var ne "-"))
	{
	    if (($var le " ")&&(!defined($text)))
	    {
		$pointer++;
	    } else {
		$a++;
	    }
	} else {
	    if (($var eq "-") && (defined($text)))
	    {
		$a++;
	    } else {
		$pointer++;
		if (!defined($text))
		{
		    $text = $var;
		} else {
		    $text .= $var;
		}
print $text, "\n";
	    }
	}
    }
    if (!defined($text))
    {
	print "\nBUG: fread_number: Expected a number. $pointer\n";
	exit;
    }
    $num = $text;
    $num++;
    $num--;
    return $num;
}

sub fread_length {
    local($var,$a,$leng);
    $a = 0;
    $leng = 0;
    while ($a == 0)
    {
	$var = "";
	seek(FILE, $leng, 0);
	if (sysread(FILE, $var, 1) == 0)
	{
	    return $leng;
	}
	$leng++;
    }
    return $leng;
}

sub fread_flag {
    local($text,$var,$a,@text,$len,$num,$tmp,$flg,%done);
    $a = 0;
    $text = "";
    while ($a == 0)
    {
	$var = "";
	seek(FILE, $pointer, 0);
	if (sysread(FILE, $var, 1) == 0)
	{
	    print "\nBUG: fread_flag: EOF reached. $pointer\n";
	    exit;
	}
	if ((($var le ' ')||($var ge '~'))&&($text ne ""))
	{
	    $a++;
	} else {
	    if (($var ge '!')&&($var le '}'))
	    {
		$text .= $var;
	    }
	    $pointer++;
	}
    }
    $num = 0;
    if ($text eq "0")
    {
	return $text;
    }
    @text = split(/\|/, $text);
    $len = @text;
    if ($len > 1)
    {
	foreach $tmp (@text)
	{
	    $num += $tmp;
	}
	$text = $num;
    }
    @text = split('', $text);
    if (($text[0] ge '0') && ($text[0] le '9'))
    {
	$num = $text;
    } else
    {
	undef %done;
	foreach $tmp (@text)
	{
	    if (!defined($done{$tmp}))
	    {
		$num += $flag{$tmp};
		$done{$tmp} = "yes";
	    }
	}
	undef %done;
    }
    $num++;
    $num--;
    if ($num >= 1099511627776)
    {
	print "\nBUG: fread_flag: flag number out of range. $pointer\n";
	exit;
    }
    $flg = "";
    foreach $tmp (reverse(sort(keys(%flag))))
    {
	if ($flag{$tmp} <= $num)
	{
	    $flg .= $tmp;
	    $num -= $flag{$tmp};
	}
    }
    $flg = join('', sort(split('', $flg)));
print "\t\t\t\t\t$flg\n";
    return $flg;
}


sub fread_word {
    local($text,$var,$a,$quote);
    $a = 0;
    $quote = 0;
    $text = "";
    while ($a == 0)
    {
	$var = "";
	seek(FILE, $pointer, 0);
	if (sysread(FILE, $var, 1) == 0)
	{
	    print "\nBUG: fread_word: EOF reached. $pointer\n";
	    exit;
	}
	if ((($var le " ")||($var ge "~"))&&($text ne "")&&($quote == 0))
	{
	    $a++;
	} else {
	    if (($var ge "!")&&($var le "}"))
	    {
		if (($var eq "\'") && ($quote == 0))
		{
		    $quote = 1;
		    $text .= $var;
		} elsif ($var eq "\'")
		{
		    $quote = 0;
		    $text .= $var;
		} else
		{
		    $text .= $var;
		}
	    } elsif (($quote == 1) && ($var ge " ") && ($var le "}"))
	    {
		$text .= $var;
	    }
	    $pointer++;
	}
    }
print "\t\t\t\t\t$text\n";
    return $text;
}


sub fread_string {
    local($text,$var,$a);
    $a = 0;
    $text = "";
    while ($a == 0)
    {
	$var = "";
	seek(FILE, $pointer, 0);
	if (sysread(FILE, $var, 1) == 0)
	{
	    print "\nBUG: fread_string: EOF reached. $pointer\n";
	    exit;
	}
	if (($var le " ")&&($text eq ""))
	{
	    $pointer++;
	} elsif ($var eq "~")
	{
	    $pointer++;
	    $a++;
	} else
	{
	    $text .= $var;
	    $pointer++;
	}
    }
print "\t\t\t\t$text\n";
    return $text;
}

sub fread_levels {
    local($text,$var,$a,$vala,$valb);
    $a = 0;
    $text = "";
    while ($a == 0)
    {
        $var = "";
        seek(FILE, $pointer, 0);
        if (sysread(FILE, $var, 1) == 0)
        {
            print "\nBUG: fread_string: EOF reached. $pointer\n";
            exit;
        }
        if (($var ne '{')&&($var ne '<')&&($text eq ""))
        {
            $pointer++;
        } elsif (($var eq '}')||($var eq '>'))
        {
	    $text .= $var;
            $pointer++;
            $a++;
        } else
        {
            $text .= $var;
            $pointer++;
        }
    }
    return $text;
}


sub fread_to_eol {
    local($var,$a);
    $a = 0;
    while ($a == 0)
    {
	$var = "";
	seek(FILE, $pointer, 0);
	if (sysread(FILE, $var, 1) == 0)
	{
	    print "\nBUG: fread_to_eol: EOF reached. $pointer\n";
	    exit;
	}
	if (($var eq "\n") || ($var eq "\r"))
	{
	    $a++;
	}
	$pointer++;
    }
    return;
}

sub fread_to_next {
    local($text,$var,$a);
    $a = 0;
    $text = "";
    while ($a == 0)
    {
        $var = "";
        seek(FILE, $pointer, 0);
        if (sysread(FILE, $var, 1) == 0)
        {
            return "EOF";
        }
        if ($var eq '#')
        {
            $a++;
        } else
        {
            $pointer++;
        }
    }    
    return " ";
}



1;