ALGOL Library: OBJECT/SAMPLE/DYNAMICLIB

The following ALGOL library, compiled as OBJECT/SAMPLE/DYNAMICLIB, uses dynamic and indirect provision. This library references the library OBJECT/SAMPLE/LIBRARY in the preceding example:

BEGIN
 TASK LIB1TASK, LIB2TASK;
 LIBRARY SAMLIB(TITLE= “OBJECT/SAMPLE/LIBRARY.”);
 INTEGER PROCEDURE FACT(N);
      INTEGER N;
      LIBRARY SAMLIB;
 PROCEDURE DYNLIB1;
 % LIBRARY PROVIDED DYNAMICALLY AND INDIRECTLY
      BEGIN % PRINTS DATE WITH TIME.
      LIBRARY SAMLIB (TITLE=“OBJECT/SAMPLE/LIBRARY.”);
      PROCEDURE DAYTIME(TOARRAY, WHERE);
           ARRAY TOARRAY[*];
           INTEGER WHERE;
           LIBRARY SAMLIB;
      EXPORT DAYTIME;
      FREEZE(TEMPORARY);
      END; % OF DYNLIB1.

 PROCEDURE DYNLIB2;
 % LIBRARY PROVIDED DYNAMICALLY
      BEGIN % PRINTS DATE WITHOUT TIME.
      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

 PROCEDURE DAYTIME(TOARRAY, WHERE);
      ARRAY TOARRAY[*];
      INTEGER WHERE;
      BY CALLING THESELECTIONPROC;

 EXPORT  FACT     % PROVIDED INDIRECTLY.
       ,DAYTIME; % PROVIDED DYNAMICALLY
 FREEZE(TEMPORARY);
 END.