Hi, Bill! Hi, everybody!
According to Bill Currie:
Isn't. That is: the function is provided in rts-file.c (_p_getfile), but it's not supported by the compiler.
You can write `Function GetFile: Pointer; AsmName `_p_getfile';' into your program and just use it, but I see, you want more than this. :-)
How do I go about adding this (or others) function? I'ld rather get instructions on how to do it myself rather than a patch (though I can study the patch) so I can learn how do to it to add more functions later on (such as Lo, Hi etc).
That would be great!
Here is a recipe how to introduce a new built-in function into GPC. If it looks like French for you, feel free to ask me - I can speak French (more or less).
* Edit `util.c', go into the `KItable[]' and add this identifier with the appropriate flags (`GNU_PASCAL' since it is not part of any other standard). (Perhaps after `DefineSize' is a nice place?) (First Letter Capitalized.)
* Edit `parse.y' and add `gpc_GETFILE' (my suggested name for it) to the list of tokens (= constant definitions), perhaps after `p_DEFINESIZE'.
* In `parse.y', look how something similar is implemented (e.g., again, `p_DEFINESIZE') and do it similarly. This means:
- Give it a return type: "%type <ttype> gpc_GETFILE".
- Add it to `new_identifier_1', so the name remains redefinable.
- Add it to `rts_fun_onepar', so the parser will take it into account.
In case you are not familiar with Bison (I was not when I found GPC): This language essentially is a machine-readable form of syntax diagrams. The `bison' program translates this into a C file not intened to be read by humans. The C stuff indented with two tabs is the "action" to be taken if the pascal parser reads this syntax.
* Again in `util.c', function `build_rts_call', write a handler for `gpc_GETFILE'. This is where the real work is done; all the above is administrative stuff.
But in this case, it's quite simple: Do the same as `case p_DEFINESIZE' does, i.e. warn about ISO violation, check for errors (hmm ... these functions don't count their arguments ... looks like a bug in GPC ... we should check it ...), and pass the argument to the other parts of `build_rts_call' which will do the work.
* Don't forget to follow the GNU coding style guidelines.
* Don't forget to send me a patch, so I can study it. ;-)
* What about doing the same for `ParamCount' and `ParamStr'? The RTL functions do *almost* the same as their BP equivalents do. Perhaps we should make them truly compatible and built-in? (One problem: `ParamStr' must return a String of unknown length. Where to allocate it?)
Welcome to the GNU Pascal development team!
Yours,
Peter
Dipl.-Phys. Peter Gerwinski, Essen, Germany, free physicist and programmer peter.gerwinski@uni-essen.de - http://home.pages.de/~peter.gerwinski/ [970201] maintainer GNU Pascal [970714] - http://home.pages.de/~gnu-pascal/ [970125]