External, C, AsmName, ...
Sat, 7 Sep 1996 15:00:07 +0200 (MET DST)
Hello folks,
(* This mail is somehow long. In short: I want to take
the directives `Extern', `C', and `AsmName' *out* of GPC
and extend the syntax of `External' instead. Okay? :*)
as you know (?;-), we have the directives `External', `Extern'
(same as `External'), `C', and `AsmName' in GPC for specifying
external procedures. This is especially useful when using
libraries written in C, for example:
Procedure Foo; External; (* yields "Foo" *)
Procedure ioCtl ( FilDes, Cmd: Integer; ... ); C; (* yields "ioctl" *)
Procedure XOpenDisplay ( Name: __CString__ );
AsmName 'XOpenDisplay';
This turned out not to be enough; we need the same for variables.
Actually we already have
Var
Foo: __external__ Integer; (* yields "foo", not "Foo"! *)
but this does not cover cases where the external variable needs a
name with a capital letter.
As an intermediate solution, I implemented
Var
Foo: __asmname__ 'foO' Integer;
(patched source is available on demand), but I think it is not the best
way to implement these things.
Now I am looking out for reasonable ideas.
Does somebody know what the ISO/ANSI Standards say about this?
My own thoughts follow.
I would suggest to define as few directives as possible and to
drop everything but `External' but extend its syntax to meet our
requirements. A first approach could be
Procedure foo; external; (* yields "Foo" *)
Var
x: Integer; external; (* yields "X" *)
and
Procedure foo; external 'foO';
Var
x: Integer; external 'my_x';
but it would crash with Borland Pascal's use of `External' where
the latter declaration would mean that Procedure foo is contained
in a shared library named `foO'.
Okay, so let's stay for the moment at Borland's syntax. In the
same context they also define
Procedure foo; external 'MySharedLib' index 42;
and
Procedure foo; external 'MySharedLib' name 'foO';
where `foO' would be the external name as defined in the shared
library.
My current idea now would be to define
Procedure foo; external; (* yields "Foo" *)
Var
x: Integer; external; (* yields "X" *)
plus
Procedure foo; external name 'foO';
Var
x: Integer; external name 'my_x';
to replace "AsmName 'foO'". Later we can extend this to allow a
name of a shared library between `external' and `name'.
Once doing this, it could also be nice to make directives out of
the other C-style storage qualifiers, too. I mean I'd like to
replace
Var
x: __static__ Integer; by x: Integer; static;
y: __volatile__ Integer; by y: Integer; volatile;
etc.. My plan is to do it in a way that things like
Var
static: Integer;
would still work.
I think it would *not* be a good idea to make
Procedure foO; external;
yield "foO", because (i) it would be difficult to implement and
(ii) Pascal is a case-insensitive language, so everything outside
string constants *must not* depend on casing at all.
Please tell me your opinion about this.
Yours,
Peter
e-mail: peter.gerwinski@uni-essen.de
home address: D\"usseldorfer Str. 35, 45145 Essen, Germany
WWW: http://agnes.dida.physik.uni-essen.de/~peter
Peter Gerwinski (peter@agnes.dida.physik.uni-essen.de)
HTML conversion by Lluís de Yzaguirre i Maura
Institut de Lingüística Aplicada -
Universitat "Pompeu Fabra"
e-mail: de_yza@upf.es