Trapping I/O runtime errors in GPC_(re)
Thu, 23 Oct 1997 02:42:26 +0200
Jesper Lund wrote:
> Is there a (simple) way of trapping runtime I/O errors in GPC, like the {$I-}
> compiler directive in Borland Pascal? Right now, the program
>
> var
> x : real;
>
> begin
> Readln (x);
> end.
>
> abort with a run-time error if the user enters something that is not a
> number. The same applies to ReadStr, BTW, so unless there is such a switch
> (hidden) in GPC, we have to call C functions like 'sscanf' or 'atof' to
> emulate the Borland 'Val' procedure.
There will be a built-in Val procedure in the next beta! :-)
> However, ReadStr + trapping runtime I/O
> errors would be simpler, IMHO.
AFAIK, Bill is working on the {$I+-} switch. (Bill, if you're reading this:
The places to trap this particular error are the calls to _p_generic() in
rts/rts-rdinc.c -- if you haven't done so already.)
>From another mail:
> I haven't found any bugs, but I have a suggestion which -- IMHO -- would
> improve ValReal (the same applies to ValInteger, etc).
Not necessary any more. I just completed the RTS part of the Val procedure,
and Peter will build it into GPC.
> [code snipped]
>
> COMMENTS:
>
> 1) The C library function converting the null-terminated string into a double
> checks for errors itself (sscanf returns 0 if the string cannot be converted
> to a double; meaning 0 values read from the string), so there is no need to
> parse the string (to find the position where the error occurs), unless there
> is an error in the string. BTW, this speedup is not possible with atof
> because atof returns 0.0 if the string cannot be converted to a double.
> That's why I use sscanf instead (sscanf is ANSI C, and must be in any C
> library, so no concerns about portability between Linux, DJGPP, etc).
>
> As an aside, the string '1.1e3', is now converted to 1100.0, which is the
> correct behavior. The code checking for errors should really be rewritten to
> handle this. For example, the error position for '1.0ef3' is not at position
> 4, but the 'f' at position 5. Adding 'e' to the list of admissible chars
> would improve things a bit, but still not totally correct.
In the built-in version (to come), I hope I've made all the checks at the
right places. When it's released, please do as extensive tests as you can,
and report any bugs you might find.
> 2) The formal parameter S is declared as a string[255], instead of the schema
> type 'string' (which has a different meaning than in Borland Pascal, where it
> means string[255]). As you add a #0 to the string variable 's', it should be
> large enough not to overflow (length gets out of range).
>
> I don't think the original version would work if called with a string
> constant, because S would be a string with the same length as the string
> constant, and adding #0 would (should) cause an exception.
Yes, we discussed this topic recently. We plan to build in some functions
for converting Pascal strings into CStrings easily.
> 3) Unless GPC is really good at optimizing string expressions, the "hack"
>
> s[Length(s)+1] := chr ( 0 )
>
> is faster than adding chr(0) to the string variable.
Yes, it's faster. GPC is not that good yet, but I hope we'll make it that
good (but not until version 2.1)...
--
Frank Heckenbach, Erlangen, Germany
heckenb@mi.uni-erlangen.de
http://home.pages.de/~fjf/links.htm
Frank Heckenbach (heckenb@mi.uni-erlangen.de)
HTML conversion by Lluís de Yzaguirre i Maura
Institut de Lingüística Aplicada -
Universitat "Pompeu Fabra"
e-mail: de_yza@upf.es