Library: OBJECT/SAMPLE/DYNAMICLIB

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.