The following ALGOL library, compiled as OBJECT/SAMPLE/DYNAMICLIB, illustrates dynamic and indirect library linkage. This library references the library OBJECT/SAMPLE/LIBRARY previously described.
BEGIN
TASK LIB1TASK,LIB2TASK;
LIBRARY SAMLIB(TITLE="OBJECT/SAMPLE/LIBRARY.");
% ENTRY POINT PROVIDED INDIRECTLY
INTEGER PROCEDURE FACT(N);
INTEGER N;
LIBRARY SAMLIB;
% POSSIBLY CALLED BY THE SELECTION PROCEDURE
PROCEDURE DYNLIB1;
BEGIN % PRINTS DATE WITH TIME
LIBRARY SAMLIB(TITLE="OBJECT/SAMPLE/LIBRARY.");
% ENTRY POINT PROVIDED INDIRECTLY
PROCEDURE DAYTIME(TOARRAY,WHERE);
ARRAY TOARRAY[*];
INTEGER WHERE;
LIBRARY SAMLIB;
EXPORT DAYTIME;
FREEZE(TEMPORARY);
END; % OF DYNLIB1
% POSSIBLY CALLED BY THE SELECTION PROCEDURE
PROCEDURE DYNLIB2;
BEGIN % PRINTS DATE WITHOUT TIME.
% ENTRY POINT PROVIDED DIRECTLY
PROCEDURE DAYTIME(TOARRAY,WHERE);
ARRAY TOARRAY[*];
INTEGER WHERE;
BEGIN
REAL T;
T := TIME(7);
REPLACE POINTER(TOARRAY,8) + WHERE
BY T.[35:6] FOR 2 DIGITS, "-",
T.[29:6] FOR 2 DIGITS, "-",
T.[47:12] FOR 4 DIGITS;
END; % OF DAYTIME
EXPORT DAYTIME;
FREEZE(TEMPORARY);
END; % OF DYNLIB2
% THE SELECTION PROCEDURE
PROCEDURE THESELECTIONPROC(LIBPARSTR,NAMINGPROC);
VALUE LIBPARSTR;
EBCDIC STRING LIBPARSTR;
PROCEDURE NAMINGPROC(LIBTASK); TASK LIBTASK; FORMAL;
BEGIN
IF LIBPARSTR EQL "WITH TIME" THEN
BEGIN
IF LIB1TASK.STATUS NEQ VALUE(FROZEN) THEN
PROCESS DYNLIB1 [LIB1TASK];
NAMINGPROC(LIB1TASK);
DISPLAY(" *** CALLING DYNLIB1 ");
END
ELSE
BEGIN
IF LIB2TASK.STATUS NEQ VALUE(FROZEN) THEN
PROCESS DYNLIB2 [LIB2TASK];
NAMINGPROC(LIB2TASK);
DISPLAY(" *** CALLING DYNLIB2 ");
END;
END; % OF THE SELECTION PROCEDURE
% ENTRY POINT PROVIDED DYNAMICALLY
PROCEDURE DAYTIME(TOARRAY,WHERE);
ARRAY TOARRAY[*];
INTEGER WHERE;
BY CALLING THESELECTIONPROC;
EXPORT FACT, % PROVIDED INDIRECTLY
DAYTIME; % PROVIDED DYNAMICALLY
FREEZE(TEMPORARY);
END.
