home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / netz / actigram.pas
Pascal/Delphi Source File  |  1989-03-19  |  27KB  |  835 lines

  1. PROGRAM ACTIGRAM;
  2. {$V-}
  3. { Program to manage an activity network }
  4. { Copyright (c) by Namir C. Shammas, 1984 }
  5.  
  6. CONST Max_Tasks = 50; { Maximum number of tasks }
  7.       Max_Gen_Func_List = 5; { Maximum number of generic Functions }
  8.  
  9. TYPE
  10.  
  11.     STRING50 = STRING[50];
  12.  
  13.     { Record defining the structre of a task }
  14.     Job = RECORD
  15.                 Task_Name : STRING[10];
  16.                 Func_Name : STRING50;
  17.                 Gen_Func, Level : INTEGER;
  18.                 N_Calls, N_Responses : INTEGER;
  19.                 Calls, Responses : ARRAY [1..Max_Tasks] OF INTEGER;
  20.           END;
  21.  
  22.     { Record defining the entire data base }
  23.     Job_array = RECORD
  24.                     Title : STRING[80];
  25.                     N_Tasks : INTEGER;
  26.                     Tasks : ARRAY [1..Max_Tasks] OF Job;
  27.                 END;
  28.  
  29.     Filed_Data = FILE OF Job_array; { Data type to enable file I/O }
  30.  
  31.  
  32.  
  33. VAR
  34.     Task_array : Job_array;
  35.     Gen_Func_List : ARRAY [0..Max_Gen_Func_List] OF STRING50;
  36.     Name : STRING50;
  37.     Data_File : Filed_Data;
  38.     Lock_on_Task : BOOLEAN;
  39.     Choice, Copy_Task, Insert_Loc, Task_Num, Line,
  40.     Level, Max_Line, Page_Num : INTEGER;
  41.     Dev_Num : 1..3 ;
  42.     Filename : STRING[12];
  43.     Dev_Out :  TEXT;
  44.  
  45. {---------------------------------------------------------------------}
  46. PROCEDURE INC(VAR I : INTEGER);
  47.  
  48. BEGIN
  49.     I := I + 1
  50. END;
  51. {---------------------------------------------------------------------}
  52. PROCEDURE DINC(VAR I : INTEGER; J : INTEGER);
  53.  
  54. BEGIN
  55.     I := I + J
  56. END;
  57. {---------------------------------------------------------------------}
  58. PROCEDURE DEC(VAR I : INTEGER);
  59.  
  60. BEGIN
  61.     I := I - 1
  62. END;
  63. {---------------------------------------------------------------------}
  64. PROCEDURE DDEC(VAR I : INTEGER; J : INTEGER);
  65.  
  66. BEGIN
  67.     I := I - J
  68. END;
  69. {---------------------------------------------------------------------}
  70. PROCEDURE Message( S : STRING50);
  71. { Procedure to display a message then wait for the user to press any }
  72. { before resuming execution.                                         }
  73. BEGIN
  74.      WRITELN;
  75.      WRITELN(S);
  76.      WRITELN; WRITELN('Press any key to continue');
  77.      WHILE NOT Keypressed DO;
  78. END; { Message }
  79. {---------------------------------------------------------------------}
  80. PROCEDURE Load_Gen_Func;
  81. { Procedure to load the generic Functions array }
  82. BEGIN
  83.     Gen_Func_List[1] := 'MAIN';
  84.     Gen_Func_List[2] := 'I/O';
  85.     Gen_Func_List[3] := 'CALCULATIONS';
  86.     Gen_Func_List[4] := 'DATA MANAGEMENT';
  87.     Gen_Func_List[5] := 'MENU';
  88. END; { Load_Gen_Func }
  89. {---------------------------------------------------------------------}
  90. PROCEDURE OUTWRITELN(S : STRING50);
  91. { Procedure to send output text, followed by a CR }
  92. BEGIN
  93.     CASE Dev_Num OF
  94.         1 : WRITELN(S);
  95.         2 : WRITELN(Lst,S);
  96.         3 : WRITELN(Dev_Out,S);
  97.     END; { CASE }
  98. END; { OUTWRITELN }
  99. {---------------------------------------------------------------------}
  100. PROCEDURE OUTWRITE(S : STRING50);
  101. { Procedure to to send output text }
  102. BEGIN
  103.     CASE Dev_Num OF
  104.         1 : WRITE(S);
  105.         2 : WRITE(Lst,S);
  106.         3 : WRITE(Dev_Out,S);
  107.     END; { CASE }
  108. END; { OUTWRITE }
  109. {---------------------------------------------------------------------}
  110. PROCEDURE Load(VAR Filename : Filed_Data; VAR Task_array : Job_array);
  111. { Procedure to load an actigram save on file }
  112. VAR Name : STRING[12];
  113.  
  114. BEGIN
  115.     WRITE('Enter filename '); READLN(Name);
  116.     Assign(Filename,Name);
  117.     Reset(Filename);
  118.     READ(Filename,Task_array);
  119.     Close(Filename);
  120.     WRITELN;
  121.     WRITELN('Loaded actigram : ',Task_array.Title);
  122.     Message('  ');
  123. END;{ Load }
  124. {---------------------------------------------------------------------}
  125. PROCEDURE Save(VAR Filename : Filed_Data; VAR Task_array : Job_array);
  126. { Procedure to save an actigram on file }
  127. VAR Name : STRING[12];
  128.  
  129. BEGIN
  130.     WRITE('Enter filename '); READLN(Name);
  131.     Assign(Filename,Name);
  132.     Rewrite(Filename);
  133.     WRITE(Filename,Task_array);
  134.     Close(Filename);
  135.     WRITELN;
  136. END;{ Save }
  137.  
  138. {---------------------------------------------------------------------}
  139. PROCEDURE New_File;
  140. { Procedure to initialize a new actigram }
  141. BEGIN
  142.     WITH Task_array DO
  143.       BEGIN
  144.         N_Tasks  := 1;
  145.         Tasks[1].Task_Name := 'M A I N';
  146.         Tasks[1].Func_Name  := 'ROOT';
  147.         Tasks[1].Level := 0;
  148.         Tasks[1].Gen_Func := 0;
  149.         Tasks[1].N_Calls := 0;
  150.         Tasks[1].N_Responses := 0;
  151.         WRITE('Enter Title for new actigram ');
  152.         READLN(Title);
  153.     END;
  154. END;{ New_File }
  155. {---------------------------------------------------------------------}
  156. PROCEDURE Center_Text(S : STRING50; Line_No : INTEGER);
  157. { Procedure to center text }
  158. VAR i : INTEGER;
  159.  
  160. BEGIN
  161.     i := 40 - Length(S) DIV 2;
  162.     GotoXY(1,Line_No); ClrEol;
  163.     GotoXY(i,Line_No);
  164.     WRITELN(S);
  165. END;{ Center_Text }
  166. {---------------------------------------------------------------------}
  167. PROCEDURE List_Links(Index : INTEGER);
  168. { Procedure to list all links to a particular task }
  169.  
  170. CONST Remark = 'Press return to continue, or q<cr> to exit';
  171.  
  172. VAR i, j, N, First, Last : INTEGER;
  173.     Answer : CHAR;
  174.  
  175. BEGIN
  176.     WITH Task_array DO
  177.       BEGIN
  178.         ClrScr;
  179.         N := Tasks[Index].N_Calls;
  180.         IF N > 0 THEN
  181.         BEGIN
  182.            WRITELN('  ',Tasks[Index].Task_Name); WRITELN;
  183.            First := 1;
  184.            IF  N > 22 THEN Last := 22 ELSE Last := N;
  185.            REPEAT
  186.              FOR i := First TO Last DO
  187.              BEGIN
  188.                j := Tasks[Index].Calls[i];
  189.                WRITELN(i,' |--->  ',Tasks[j].Task_Name,' : ',
  190.                                                 Tasks[j].Func_Name);
  191.                DINC(First,22);
  192.                DINC(Last,22);
  193.                IF Last <= N
  194.                     THEN
  195.                         BEGIN { Ask user to continue or quit }
  196.                            WRITELN;
  197.                            WRITELN(Remark);
  198.                            READLN(Answer);
  199.                            IF Answer IN ['Q','q'] THEN Last := N;
  200.                         END; { IF }
  201.              END; { FOR }
  202.            UNTIL Last > N;
  203.            Message('  ');
  204.       END; { IF N > 0 }
  205.     END;{ WITH }
  206. END; {List_Links }
  207. {---------------------------------------------------------------------}
  208. PROCEDURE List_Atoms;
  209. { Procedure to list all tasks and allow the user to choose a particular }
  210. { task for a desired action.                                            }
  211.  
  212. CONST Remark = 'Press return to continue, or q<cr> to exit';
  213.  
  214. VAR i, First, Last, Lines_in_Page : INTEGER;
  215.     Answer : CHAR;
  216. BEGIN
  217.     Lines_in_Page  := 22;
  218.  
  219.     WITH Task_array DO
  220.       BEGIN
  221.     First := 1;
  222.         IF N_Tasks > Lines_in_Page THEN Last := Lines_in_Page 
  223.                                    ELSE Last := N_Tasks;
  224.     REPEAT { Loop to display tasks }
  225.             ClrScr;
  226.             WRITELN('###         Task Name');
  227.             FOR i := First TO Last DO
  228.                 WRITELN(i,'   ',Tasks[i].Task_Name);
  229.             DINC(First,Lines_in_Page);
  230.             DINC(Last,Lines_in_Page);
  231.             IF Last <= N_Tasks
  232.                     THEN
  233.                         BEGIN { Ask user to continue or quit }
  234.                            WRITELN;
  235.                            WRITELN(Remark);
  236.                            READLN(Answer);
  237.                            IF Answer IN ['Q','q'] THEN Last := N_Tasks;
  238.                         END; { IF }
  239.         UNTIL Last > N_Tasks;
  240.         REPEAT
  241.             WRITELN;
  242.             WRITE('Enter selected task number  '); READLN(Task_Num);
  243.         UNTIL Task_Num IN [1..N_Tasks];
  244.         List_Links(Task_Num);
  245.     END; { WITH }
  246. END;{ List_Atoms }
  247. {------------------------------------------------------------}
  248. FUNCTION Search(T : STRING50; VAR Index : INTEGER): BOOLEAN;
  249. { Procedure to search for a task name }
  250. VAR i : INTEGER;
  251.     Found : BOOLEAN;
  252. BEGIN
  253.     Found := FALSE;
  254.     WITH Task_array DO
  255.       BEGIN
  256.         i := 1; Index := 0;
  257.         WHILE (i <= N_Tasks) AND (Found = FALSE) DO
  258.          BEGIN
  259.             IF T = Tasks[i].Task_Name { Task already exists }
  260.                 THEN
  261.                    BEGIN
  262.                      Found := TRUE;
  263.                      Index := i;
  264.                     END 
  265.              ELSE IF T <  Tasks[i].Task_Name { New task is to be inserted }
  266.                 THEN
  267.                    BEGIN
  268.                     Index := i;
  269.                     i := N_Tasks;
  270.                     END; { IF }
  271.             INC(i);
  272.         END; { WHILE }
  273.     END; { WITH }
  274.     Search := Found;
  275. END; { Search }
  276. {---------------------------------------------------------------------}
  277. PROCEDURE Input_Task(Index : INTEGER);
  278. { Procedure to input a task }
  279. VAR i : INTEGER;
  280.  
  281. BEGIN
  282.     WITH Task_array DO
  283.       BEGIN
  284.         WRITELN;
  285.         WRITE('Enter  Function of task  ');
  286.         READLN(Tasks[Index].Func_Name); WRITELN;
  287.         WRITELN('Generic Function list');
  288.         FOR i := 1 TO Max_Gen_Func_List DO
  289.             WRITELN('# ',i,' ::= ',Gen_Func_List[i]);
  290.         WRITELN;
  291.         REPEAT
  292.             WRITE('Enter generic Function number ');
  293.             READLN(Tasks[Index].Gen_Func);
  294.         UNTIL Tasks[Index].Gen_Func IN [1..Max_Gen_Func_List];
  295.         WRITELN;
  296.     END; { WITH }
  297. END;{ Input_Task }
  298. {---------------------------------------------------------------------}
  299. PROCEDURE Append_Task(T_Name : STRING50; Index : INTEGER);
  300. { Procedure to append an existsing task to the call/response lists }
  301. VAR i : INTEGER;
  302.  
  303. BEGIN
  304.     WITH Task_array DO
  305.       BEGIN
  306.         IF (Tasks[Task_Num].N_Calls = Max_Tasks) OR
  307.            (Tasks[Index].N_Responses = Max_Tasks)
  308.         THEN 
  309.           Message('Overloading in call/response list')
  310.  
  311.         ELSE
  312.          BEGIN 
  313.             INC(Tasks[Task_Num].N_Calls);
  314.             i := Tasks[Task_Num].N_Calls;
  315.             Tasks[Task_Num].Calls[i] := Index;
  316.             INC(Tasks[Index].N_Responses);
  317.             i := Tasks[Index].N_Responses;
  318.             Tasks[Index].Responses[i] := Task_Num;
  319.             IF Tasks[Index].Level <= Tasks[Task_Num].Level
  320.                 THEN
  321.                     Tasks[Index].Level  := Tasks[Task_Num].Level + 1;
  322.         END; { IF }
  323.     END; { WITH }
  324. END;{ Append_Task }
  325. {---------------------------------------------------------------------}
  326. PROCEDURE Add_New_Task(T_Name : STRING50; Index : INTEGER);
  327. { Procedure to add a new task }
  328. VAR i,j : INTEGER;
  329.  
  330. BEGIN
  331.     WITH Task_array DO
  332.       BEGIN
  333.         IF Index > 0
  334.             THEN { Insert new task  }
  335.                 BEGIN
  336.                     IF Task_Num >= Index THEN INC(Task_Num);
  337.                     FOR i := 1 TO N_Tasks DO
  338.                     BEGIN
  339.                         IF Tasks[i].N_Calls > 0 THEN 
  340.                         BEGIN
  341.                             FOR j := 1 TO Tasks[i].N_Calls DO
  342.                                 IF Tasks[i].Calls[j] >= Index THEN 
  343.                                         INC(Tasks[i].Calls[j]);
  344.                         END; { IF }
  345.                         IF Tasks[i].N_Responses > 0 THEN 
  346.                         BEGIN
  347.                             FOR j := 1 TO Tasks[i].N_Responses DO
  348.                                 IF Tasks[i].Responses[j] >= Index THEN 
  349.                                         INC(Tasks[i].Responses[j]);
  350.                         END; { IF }
  351.                     END; { FOR }
  352.  
  353.                     FOR i := N_Tasks DOWNTO Index DO
  354.                         Tasks[i+1] := Tasks[i];
  355.                     INC(N_Tasks);
  356.                 END
  357.             ELSE  { Append new task }
  358.                 BEGIN
  359.                     INC(N_Tasks);
  360.                     Index := N_Tasks;
  361.                 END; { IF }
  362.         Tasks[Index].N_Calls := 0;
  363.         Tasks[Index].N_Responses := 0;
  364.         Tasks[Index].Task_Name := T_Name;
  365.         Input_Task(Index);
  366.         Tasks[Index].Level := Tasks[Task_Num].Level + 1;
  367.         Append_Task(T_Name,Index);
  368.     END; { WITH }
  369. END;{ Add_New_Task }
  370. {---------------------------------------------------------------------}
  371. PROCEDURE Add_Task;
  372. { Procedure to add a task.  AT this stage it is not known if the task }
  373. { is a new one.                                                       }
  374. BEGIN
  375.     IF NOT Lock_on_Task THEN List_Atoms;
  376.     ClrScr;
  377.     Center_Text('-------- A  D  D  I  N  G      T  A  S  K --------',2);
  378.     WRITELN; WRITELN; WRITELN;
  379.     WITH Task_array DO
  380.       BEGIN
  381.         WRITELN('Linking a task to ',Tasks[Task_Num].Task_Name); WRITELN;
  382.         WRITE('Enter task name  '); READLN(Name);
  383.         IF NOT Search(Name,Insert_Loc)
  384.             THEN
  385.              BEGIN
  386.                 IF Task_array.N_Tasks = Max_Tasks
  387.                   THEN
  388.                     Message('Cannot add new tasks')
  389.                   ELSE
  390.                     Add_New_Task(Name,Insert_Loc);
  391.              END
  392.             ELSE
  393.               Append_Task(Name,Insert_Loc); { END IF }
  394.     END; { WITH }
  395. END;{ Add_Task }
  396. {---------------------------------------------------------------------}
  397. PROCEDURE Delete_Task;
  398. { Procedure to delete a task, remove its pointers from the call/response }
  399. { lists and "renumber" all other pointers.                               }
  400. VAR i,j,k,m : INTEGER;
  401.     Found : BOOLEAN;
  402.  
  403. BEGIN
  404.   IF NOT Lock_on_Task THEN List_Atoms;
  405.   IF Task_array.Tasks[Task_Num].Task_Name ='M A I N'
  406.   THEN 
  407.         Message('You cannot delete the MAIN activity ')
  408.   ELSE
  409.    BEGIN { Proceed with deletion }
  410.     Lock_on_Task := FALSE;
  411.     ClrScr;
  412.     Center_Text('-------- D  E  L  E  T  I  N  G      T  A  S  K --------',2);
  413.     GOTOXY(1,5);
  414.     WITH Task_array DO
  415.       BEGIN
  416.         WRITELN('Deleting task ',Tasks[Task_Num].Task_Name); 
  417.  
  418.         FOR i := 1 TO N_Tasks DO
  419.         BEGIN
  420.             IF Tasks[i].N_Calls > 0 THEN
  421.                 FOR j := 1 TO Tasks[i].N_Calls DO
  422.                   IF Tasks[i].Calls[j] >= Task_Num THEN DEC(Tasks[i].Calls[j]);
  423.  
  424.             IF Tasks[i].N_Responses > 0 THEN 
  425.                 FOR j := 1 TO Tasks[i].N_Responses DO
  426.                   IF Tasks[i].Responses[j] >= Task_Num THEN 
  427.                                                    DEC(Tasks[i].Responses[j]);
  428.         END; { FOR }
  429.  
  430.             IF Tasks[Task_Num].N_Calls > 0 THEN 
  431.             BEGIN
  432.                 FOR i := 1 TO Tasks[Task_Num].N_Calls DO
  433.                 BEGIN
  434.                        m := Tasks[Task_Num].Calls[i] + 1;
  435.                        Found := FALSE; j := 1;
  436.                        WHILE (j <= Tasks[m].N_Responses) AND (NOT Found) DO
  437.                             IF (Task_Num-1) = Tasks[m].Responses[j]
  438.                                 THEN Found := TRUE
  439.                                 ELSE INC(j);
  440.                        k := j;
  441.  
  442.                        FOR j := k TO Tasks[m].N_Responses-1 DO
  443.                               Tasks[m].Responses[j] := Tasks[m].Responses[j+1];
  444.             
  445.                        DEC(Tasks[m].N_Responses)
  446.                     END; { FOR }
  447.               END; { IF }
  448.         { Remove the task number from calling tasks' lists }
  449.         IF Tasks[Task_Num].N_Responses > 0
  450.             THEN
  451.               BEGIN
  452.                 FOR i := 1 TO Tasks[Task_Num].N_Responses DO
  453.                    BEGIN
  454.                        m := Tasks[Task_Num].Responses[i] + 1;
  455.                        Found := FALSE; j := 1;
  456.                        WHILE (j <= Tasks[m].N_Calls) AND (NOT Found) DO
  457.                             IF (Task_Num-1) = Tasks[m].Calls[j]
  458.                                 THEN Found := TRUE
  459.                                 ELSE INC(j);
  460.                        k := j;
  461.  
  462.                        FOR j := k TO Tasks[m].N_Calls - 1 DO
  463.                             Tasks[m].Calls[j] := Tasks[m].Calls[j+1];
  464.  
  465.                         DEC(Tasks[m].N_Calls)
  466.                   END; { FOR }
  467.               END; { IF }
  468.         IF Task_Num < N_Tasks
  469.              THEN
  470.                 FOR i := Task_Num TO N_Tasks-1 DO
  471.                     Tasks[i] := Tasks[i+1];
  472.         DEC(N_Tasks);
  473.         Message('  ');
  474.     END; { WITH }
  475.   END; { IF statement to check for valid deletion }
  476. END; {Delete_Tasks }
  477. {---------------------------------------------------------------------}
  478. PROCEDURE Change_Task;
  479. { Procedure to change task description and generic Function number }
  480. VAR i : INTEGER;
  481.  
  482. BEGIN
  483.     IF NOT Lock_on_Task THEN List_Atoms;
  484.     ClrScr;
  485.     Center_Text('-------- C  H  A  N  G  I  N  G      T  A  S  K --------',2);
  486.     WRITELN;
  487.     WITH Task_array DO
  488.       BEGIN
  489.         WRITELN('Changing task ',Tasks[Task_Num].Task_Name); WRITELN;
  490.         Input_Task(Task_Num);
  491.     END; { WITH }
  492. END;{ Change_Task }
  493. {---------------------------------------------------------------------}
  494. PROCEDURE Page;
  495. { Monitors the page/screen limits.                    }
  496. {   Variables :                                       }
  497. {               Line, Max_Line for line control       }
  498. {               Dev_Out : for output device.          }
  499.  
  500.  
  501. VAR C : CHAR;
  502.  
  503. BEGIN
  504.     INC(Line);
  505.     IF Line > Max_Line THEN
  506.       BEGIN
  507.         Line := 1;
  508.         CASE Dev_Num OF
  509.               1  : Message('  ');
  510.               2  : BEGIN
  511.                         WRITELN(Lst,^L);
  512.                         INC(Page_Num);
  513.                         WRITE(Lst,'Page ',Page_Num);
  514.                         WRITELN(Lst,'   '); INC(Line)
  515.                    END;
  516.              ELSE  ;
  517.         END; { CASE }
  518.       END; { IF }
  519.  
  520. END; { Page }
  521. {---------------------------------------------------------------------}
  522. PROCEDURE List_Gen_Func(Index : INTEGER);
  523. { Procedure to list tasks according to their generic Functions }
  524. VAR i,j : INTEGER;
  525.     Strr : STRING50;
  526. BEGIN
  527.  WITH Task_array DO
  528.  BEGIN
  529.   Line := 2;
  530.   OUTWRITE('List of tasks with generic Function : ');
  531.   OUTWRITELN(Gen_Func_List[Index]);
  532.   OUTWRITELN('    ');
  533.         FOR i := 1 to N_Tasks DO
  534.             IF Tasks[i].Gen_Func = Index THEN 
  535.                BEGIN
  536.                   OUTWRITE(Tasks[i].Task_Name);
  537.                   OUTWRITE(' : '); OUTWRITELN(Tasks[i].Func_Name);
  538.                   Page
  539.                 END; { IF }
  540.  END; { WITH }
  541. END; { List_Gen_Func }
  542. {---------------------------------------------------------------------}
  543. PROCEDURE List_Level;
  544. { Procedure to produce a histogram showing the tasks and thier levels }
  545. VAR i,j : INTEGER;
  546.     Strr : STRING50;
  547.  
  548. PROCEDURE Histogram(X : INTEGER);
  549.  
  550. VAR Skip : INTEGER;
  551.  
  552. BEGIN
  553.     Skip := 30 - Length(Task_array.Tasks[i].Task_Name);
  554.     WHILE (Skip > 0) DO
  555.     BEGIN { Fill in the blanks }
  556.         OUTWRITE(' ');
  557.         DEC(Skip);
  558.     END; { WHILE }
  559.     WHILE X > 0 DO
  560.     BEGIN
  561.         OUTWRITE('*');
  562.         DEC(X);
  563.     END; { WHILE }
  564.     OUTWRITELN('  ');
  565. END; {Histogram }
  566.  
  567. BEGIN { List_Level }
  568.  WITH Task_array DO
  569.   BEGIN
  570.    Line := 2;
  571.    OUTWRITELN('  ');
  572.    FOR i := 1 TO N_Tasks DO
  573.      BEGIN
  574.          OUTWRITE(Tasks[i].Task_Name); OUTWRITE(' : ');
  575.          Histogram(Tasks[i].Level); Page
  576.      END; { FOR }
  577.   END; { WITH }
  578. END; { List_Level }
  579. {---------------------------------------------------------------------}
  580. PROCEDURE List_Task(Index : INTEGER);
  581. { Procedure to list the connection with a particular task }
  582. VAR i,j : INTEGER;
  583.  
  584. BEGIN
  585.  WITH Task_array DO
  586.  BEGIN
  587.   Line := 2;
  588.   OUTWRITE('List all links with task  ');
  589.   OUTWRITELN(Tasks[Index].Task_Name);
  590.   OUTWRITELN('  ');
  591.   IF Tasks[Index].N_Calls > 0
  592.     THEN 
  593.       BEGIN
  594.         OUTWRITELN('  '); Page;
  595.         OUTWRITELN('The following are the responding tasks'); Page;
  596.         FOR i := 1 TO Tasks[Index].N_Calls DO
  597.           BEGIN
  598.             j := Tasks[Index].Calls[i];
  599.             OUTWRITELN(Tasks[j].Task_Name); Page;
  600.           END; { FOR }
  601.       END; { IF }
  602.    OUTWRITELN('  '); Page;
  603.    IF Tasks[Index].N_Responses > 0
  604.      THEN 
  605.        BEGIN
  606.          OUTWRITELN('  '); Page;
  607.          OUTWRITELN('The following are the calling tasks'); Page;
  608.          FOR i := 1 TO Tasks[Index].N_Responses DO
  609.            BEGIN
  610.              j := Tasks[Index].Responses[i];
  611.              OUTWRITELN(Tasks[j].Task_Name); Page;
  612.            END; { FOR }
  613.        END; { IF }
  614.     END; { WITH }
  615. END; { List_Tasks }
  616. {---------------------------------------------------------------------}
  617. PROCEDURE List_All;
  618. { Procedure to list all tasks }
  619. VAR i,j,k : INTEGER;
  620.     Strr : STRING50;
  621. BEGIN
  622.  WITH Task_array DO
  623.   BEGIN
  624.   Line := 2;
  625.   OUTWRITE('List of all tasks for actigram ');
  626.   OUTWRITELN(Title);
  627.   OUTWRITELN('  ');
  628.   FOR i := 1 TO N_Tasks DO
  629.     BEGIN
  630.         OUTWRITE('# ');
  631.         Str(i,Strr);  OUTWRITE(Strr);
  632.         OUTWRITE('  '); OUTWRITE(Tasks[i].Task_Name);
  633.         OUTWRITE(' : '); OUTWRITELN(Tasks[i].Func_Name);
  634.         Page;
  635.     END; { FOR }
  636.   OUTWRITELN('  '); Page;
  637.   FOR i := 1 TO N_Tasks DO
  638.   BEGIN  
  639.     IF Tasks[i].N_Calls > 0
  640.       THEN
  641.         BEGIN
  642.           OUTWRITELN('  '); Page;
  643.           OUTWRITE('The following are the tasks responding to ');
  644.           OUTWRITELN(Tasks[i].Task_Name); Page;
  645.           FOR k := 1 TO Tasks[i].N_Calls DO
  646.             BEGIN
  647.               j := Tasks[i].Calls[k];
  648.               OUTWRITELN(Tasks[j].Task_Name); Page;
  649.             END; { FOR }
  650.         END; { IF }
  651.     OUTWRITELN('  '); Page;
  652.     IF Tasks[i].N_Responses > 0
  653.       THEN
  654.         BEGIN
  655.            OUTWRITELN('  '); Page;
  656.            OUTWRITE('The following are the tasks calling ');
  657.            OUTWRITELN(Tasks[i].Task_Name); Page;
  658.  
  659.            FOR k := 1 TO Tasks[i].N_Responses DO
  660.              BEGIN
  661.                j := Tasks[i].Responses[k];
  662.                OUTWRITELN(Tasks[j].Task_Name); Page;
  663.              END; { FOR }
  664.          END; { IF }
  665.     END; { FOR }
  666.   END; { WITH }
  667. END; { List_all }
  668. {-------------------------------------------------------------------}
  669. PROCEDURE List_Menu;
  670. { Procedure to list the output menu }
  671. VAR IsFile : BOOLEAN;
  672.     Select, i : INTEGER;
  673.     OutFile : STRING50;
  674.  
  675. BEGIN
  676.     ClrScr;
  677.     Center_Text('------------ LIST / VIEW MENU ------------',1);
  678.     Center_Text('***** OUTPUT OPTIONS *****',2);
  679.     WRITELN; WRITELN;
  680.     WRITELN('0) Exit');                WRITELN;
  681.     WRITELN('1) Send to screen');      WRITELN;
  682.     WRITELN('2) Send to printer');     WRITELN;
  683.     WRITELN('3) Send to file');        WRITELN;
  684.     WRITELN; 
  685.     REPEAT
  686.         WRITELN;
  687.         WRITE('Enter choice by number ');
  688.         READLN(Select);
  689.     UNTIL Select IN [0..3];
  690.  
  691.     IsFile := FALSE;
  692.  
  693.     CASE Select OF
  694.  
  695.         1 : BEGIN { Set screen parameters }
  696.                 Dev_Num := 1;
  697.                 Max_Line := 20;
  698.             END;
  699.         2 : BEGIN { Set printer paramters }
  700.                 Dev_Num := 2;
  701.                 Max_Line := 60;
  702.                 WRITELN(Lst,'Page 1');
  703.                 Page_Num := 1;
  704.             END;
  705.         3 : BEGIN
  706.                 Dev_Num := 3;
  707.                 Max_Line := 32000;
  708.                 WRITELN;
  709.                 WRITE('Enter filename ');
  710.                 READLN(OutFile);
  711.                 Assign(Dev_Out,OutFile);                
  712.                 Rewrite(Dev_Out);
  713.             END;
  714.         ELSE  ;
  715.      END; { CASE }
  716.  
  717.     IF Select > 0 THEN 
  718.     BEGIN
  719.         ClrScr;
  720.         Center_Text('------------ LIST / VIEW MENU ------------',1);
  721.         WRITELN; WRITELN;
  722.         WRITELN('0) Exit');                       WRITELN;
  723.         WRITELN('1) List All');                   WRITELN;
  724.         WRITELN('2) List a particular task');     WRITELN;
  725.         WRITELN('3) List by level ');             WRITELN;
  726.         WRITELN('4) List by generic Function');   WRITELN;
  727.         WRITELN;
  728.         REPEAT
  729.             WRITELN;
  730.             WRITE('Enter choice by number ');
  731.             READLN(Select);
  732.         UNTIL Select IN [0..4];
  733.  
  734.         IF Dev_Num = 1 THEN 
  735.         BEGIN
  736.             ClrScr;
  737.             GOTOXY(1,1);
  738.         END;
  739.  
  740.         CASE Select OF
  741.  
  742.             1 : List_All;
  743.             2 : BEGIN
  744.                     IF Lock_on_Task THEN Copy_Task := Task_Num;
  745.                     List_Atoms;
  746.                     List_Task(Task_Num);
  747.                     IF Lock_on_Task THEN Task_Num := Copy_Task;
  748.                 END;
  749.  
  750.             3 : List_Level;
  751.             4 : BEGIN
  752.                     WRITELN('Generic Function list');
  753.                     FOR i := 1 TO Max_Gen_Func_List DO
  754.                         WRITELN('# ',i,' ::= ',Gen_Func_List[i]);
  755.                     WRITELN;
  756.                     WRITE('Enter generic Function number ');
  757.                     READLN(Level);
  758.                     List_Gen_Func(Level);
  759.                 END;
  760.             ELSE  ;
  761.         END; { CASE }
  762.  
  763.         CASE Dev_Num OF
  764.            1 : Message('  ');
  765.            2 : WRITELN(Lst,^L);
  766.            3 : Close(Dev_Out);
  767.         END; { CASE }
  768.     END;        
  769.  
  770. END; { List_Menu }
  771.  
  772. {---------------------------------------------------------------------}
  773. {         M   M        AAA       IIIII      N   N                     }   
  774. {         MM MM       A   A        I        NN  N                     }
  775. {         M M M       AAAAA        I        N N N                     }
  776. {         M   M       A   A        I        N N N                     }
  777. {         M   M       A   A      IIIII      N  NN                     }
  778. {---------------------------------------------------------------------}
  779.  
  780. BEGIN { M A I N }
  781.     ClrScr;
  782.     Lock_on_Task := FALSE;
  783.     Center_Text('<<<<<<<<<< A C T I G R A M >>>>>>>>>>',1); WRITELN; WRITELN;
  784.     WRITELN('1) Start a new actigram'); WRITELN;
  785.     WRITELN('2) Load an actigram from file'); WRITELN;
  786.     REPEAT
  787.         WRITELN;
  788.         WRITE('Enter your choice by number ');
  789.         READLN(Choice);
  790.     UNTIL Choice IN [1..2];
  791.     WRITELN;
  792.     IF Choice = 1 THEN New_File 
  793.                   ELSE Load(Data_File,Task_Array);
  794.  
  795.     REPEAT
  796.         Load_Gen_Func;
  797.         ClrScr;
  798.         Center_Text('----------<<< M A I N   M E N U >>>----------',1);
  799.         WRITELN;
  800.         IF Lock_on_Task THEN
  801.              WRITELN('Locked on task : ',Task_array.Tasks[Task_Num].Task_Name);
  802.         WRITELN;
  803.         WRITELN('0) Quit');                   WRITELN;
  804.         WRITELN('1) Add Task');               WRITELN;
  805.         WRITELN('2) Change Task');            WRITELN;
  806.         WRITELN('3) Delete Task');            WRITELN;
  807.         WRITELN('4) Access List/View Menu');  WRITELN;
  808.         WRITELN('5) Lock on a task');         WRITELN;
  809.         WRITELN('6) Unlock task');            WRITELN;
  810.         WRITELN;
  811.         REPEAT
  812.             WRITELN;
  813.             WRITE('Enter choice by number ');
  814.             READLN(Choice);
  815.         UNTIL Choice IN [0..6];
  816.  
  817.         WRITELN;
  818.  
  819.         CASE Choice OF
  820.  
  821.             0 : Save(Data_File,Task_Array);
  822.             1 : Add_Task;
  823.             2 : Change_Task;
  824.             3 : Delete_Task;
  825.             4 : List_Menu;
  826.             5 : BEGIN
  827.                     List_Atoms;
  828.                     Lock_on_Task := TRUE;
  829.                 END;
  830.             6 : Lock_on_Task := FALSE;
  831.         END; { CASE }
  832.  
  833.         UNTIL Choice = 0;
  834.  
  835. END. { ACTIGRAM }