In the single segment environment, you can call a routine written in the B programming language from your Pascal program. To do this, put
extern b;
immediately after the declaration of the subprogram in the calling program. For example, suppose you wished to call the B library routine DATEV (see "expl b lib datev"). This would be declared with the following statements.
type daterec = record year, month, day, hour, minute, second, pulse : integer end; var d : daterec; procedure datev(var res:daterec); extern b; begin {various steps} datev(d); {and so on} end;
The Pascal compiler takes care of adjusting pointers to var arguments. When the B routine receives its arguments from the Pascal program, pointer arguments will be in the lower half of the machine word, just as B expects them to be.
Some B library routines contain the "." character in their names (e.g. ".ABBRV"). Unfortunately, the dot is not a legal character for Pascal identifiers, and therefore a statement like
procedure .abbrv
would result in an error. Pascal solves this problem by allowing you to specify a SYMREF of one to six characters on the "extern" statement. For example,
procedure abbrev({declarations}):integer; extern b '.abbrv';
declares a procedure that the Pascal program will call "abbrev". However, when the loader searches for the procedure among the B library routines, it will look for a routine named ".abbrv". In this way, a legal Pascal name is associated with a routine whose name is illegal. (Note that the "symref" construction on the "extern" statement is also valid when referencing Fortran and Pascal routines.)
When calling B routines that perform I/O, it is necessary to associate the Pascal program's file variables with the B language's concept of unit numbers. This is done by using the Pascal library routine named IOUNIT. IOUNIT is a pre-declared function that accepts a file variable as an argument and returns a B unit number. For further information, see "expl pasc lib iounit".
expl pascal manua
Copyright © 1996, Thinkage Ltd.