home *** CD-ROM | disk | FTP | other *** search
- FUNCTION dig2integer(input_character : CHAR;
- VAR output_number : INTEGER) : BOOLEAN;
-
- BEGIN
- dig2integer := TRUE;
- IF input_character IN ['0'..'9']
- THEN output_number := ORD(input_character) - ORD('0')
- ELSE dig2integer := FALSE;
- END; { of : FUNCTION dig2integer }
-
- FUNCTION Str2Integer(InputString : string255;
- VAR output#,
- error# : INTEGER ) : BOOLEAN;
- { COMMENT:
- This function takes as input any PASCAL/Z string and , if the
- string is acceptable , returns the integer value equivalent in output#.
- Errors are reported in two ways :
- If the function returns TRUE then no errors were detected.
- If the function returns FALSE :
- error# will = 1 if the string was too long to convert,
- or would have resulted in a number greater than MAXINT
- error# will = 2 if the string contained nonconvertable
- characters.
- N.B.The input string may be signed (i.e. first character = '+' or '-' )
- and may contain leading zeroes.
- }
- CONST str2long = 1;
- toobig = str2long;
- bad_character = 2;
- VAR stillvalid,
- overflow,
- negative : BOOLEAN;
- value,
- multiplier,
- last_character,
- first_character,
- next_character : INTEGER;
- FUNCTION StringTooLong(instring : STRING255) : BOOLEAN;
- {COMMENT:
- Checks the string's length for Str2Integer.
- Allows first character to be '0','+',or'-'.
- Allows leading zeroes.
- Returns true if more than 5 significant characters in string.
- Does not check completely for inappropriate characters or
- possibility of potential overflow.
- }
- CONST ok = TRUE;
- VAR leading_zeros,
- str_length : BOOLEAN;
- string_length,
- char# : INTEGER;
- BEGIN
- leading_zeros := TRUE;
- string_length := length(instring);
- IF string_length < 5 THEN StringTooLong := FALSE
- ELSE BEGIN
- FOR char# := 2 TO (string_length - 5) DO BEGIN
- leading_zeros := leading_zeros AND (instring[char#] = '0')
- END;
- leading_zeros := leading_zeros AND (instring[1] IN ['+','-','0']);
- StringTooLong := NOT leading_zeros;
- END;
- END; { of : FUNCTION StringTooLong }
-
- BEGIN { FUNCTION Str2Integer }
- Str2Integer := TRUE;
- stillvalid := TRUE;
- last_character := length(InputString);
- IF last_character = 0 THEN output# := 0 ELSE BEGIN
- IF StringTooLong(InputString) THEN BEGIN
- Str2Integer := false;
- error# := str2long;
- END
- ELSE BEGIN
- negative := InputString[1] = '-';
- IF last_character > 4 THEN first_character:= last_character - 4
- ELSE first_character := 1;
- output# := 0;
- multiplier := 1;
- FOR next_character := last_character DOWNTO first_character DO BEGIN
- overflow := NOT(
- (multiplier < 10000) OR
- ((multiplier = 10000) AND
- ((InputString[next_character] IN ['0'..'2']) OR
- ((InputString[next_character] = '3') AND (output# < 2767)))));
- IF (next_character > first_character) OR
- (InputString[first_character] IN ['0'..'9']) THEN BEGIN
- stillvalid := stillvalid AND
- Dig2Integer(InputString[next_character],value);
- IF stillvalid AND NOT overflow THEN BEGIN
- output# := multiplier * value + output#;
- multiplier := multiplier * 10;
- END; { of : IF stillvalid AND ... }
- END; { of : IF (next_character... }
- END; { of : FOR next_character }
- IF stillvalid THEN BEGIN
- IF negative THEN output# := -output#;
- END
- ELSE BEGIN { i.e. at least one character was non-numeric }
- Str2Integer := FALSE;
- error# := bad_character;
- END; { of : IF stillvalid }
- IF overflow THEN BEGIN
- Str2Integer := FALSE;
- error# := toobig;
- END;
- END; { of : IF StringTooLong .. ELSE BEGIN... }
- END; { of : IF last_character = 0 ...ELSE BEGIN...}
- END; { of : FUNCTION Str2Integer }
-