summaryrefslogtreecommitdiff
path: root/system/setup/3.1/src/setup eumel 4: dienstprogramme
blob: 9ce9ca363727494fa91d752cbd0190a0a5762c28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
 
(**************************************************************************)
(***** Dienstprogramme für Modulprogrammierer             *****************)
(***** Copyright (c) 1987, 1988                           *****************)
(***** Lutz Prechelt, Karlsruhe                           *****************)
(**************************************************************************)

PACKET setup eumel dienstprogramme            (* Copyright (c) 1987 by    *)
DEFINES                                       (* Lutz Prechelt, Karlsruhe *)
   file as one text,                          (* Stand : 07.05.88   1.4   *)
   ich schreibe jetzt ein neues shard modul,  (* Eumel 1.8.1              *)
   link shard module,
   all modules:

(* Dies sind Dienstprogramme, die der Modul-Programmierer braucht *) 

(* Das Format der Refinementdateien für den dtcb- und ccb-Setupdialog ist wie
   folgt:
   1. Zeile: INT-Denoter für die Anzahl von Abfragerefinements, die drin sind
             Rest der Zeile muß leer sein.
   Danach  : lauter ELAN-Refinements mit den Namen r1, r2 usw.
             evtl. weitere Refinements zur Hilfe mit beliebigen Namen (es
             gibt ein paar Ausnahmen, über die man beim ersten Test dann aber
             stolpert.)
   In den Refinements dürfen Variablen vereinbart werden. Vor dem ersten
   refinement der Datei darf KEIN Punkt sein (es ist sowieso schlechter
   Stil, die Punkte nicht hinter die vorherige Zeile zu setzen, sondern
   vor den refinementnamen.), hingegen MUSS nach dem letzten Refinement der
   Datei ein Punkt stehen.
   Wer das für nötig hält, kann auch Prozeduren definieren und verwenden,
   was allerdings nicht geht, sind Pakete.
   Wenn man mit Kommentaren und sonstigen Bytefressern sparsam
   umgeht, läuft der Dialog beim Setup später etwas schneller an.
*)

LET modul namentyp         = "SHardmodul *";

DATASPACE VAR ds;

(***************************************************************************)

THESAURUS PROC all modules (THESAURUS CONST th):
  (* Hier wird schlabberig nach Namen ausgewählt, während der Setup Eumel
     im Betrieb die Datenraumtypen als Auswahlkriterium verwendet.
     Die Schwierigkeiten, die bei Nichteinhalten der Namenskonventionen
     entstehen, veranlassen hoffentlich jeden zur nötigen Disziplin...
  *)
  (th LIKE "SHardmodul *") - (th LIKE "SHardmodul *.ccb")
  - (th LIKE "SHardmodul *.dtcb") - (th LIKE "SHardmodul *.info")
END PROC all modules;

(*****THESAURUS PROC all modules:        wird sauber in Teil 2 realisiert
  all modules (all)
END PROC all modules;
*****)

(********************* link shard module *********************************) 

PROC link shard module:
  TEXT VAR module :: std;
  REPEAT 
    page; 
    putline ("          L I N K   S H A R D - M O D U L E"); line (2);
    put ("Modulname:"); editget (module); line (2); 
    link shard module (module); line;
  UNTIL NOT yes ("noch ein Modul linken", FALSE)  PER 
END PROC link shard module;

PROC link shard module (THESAURUS CONST th):
   do (PROC (TEXT CONST) link shard module, th);
END PROC link shard module;

PROC link shard module (TEXT CONST module): 
  (* Ruft link shard module (modul, dtcb, ccb, info) unter Anwendung von
     Namenskonventionen (nämlich entsprechende Suffixe ".dtcb" etc.) auf.
  *)
  TEXT VAR dtcb, ccb, info;
  BOOL VAR elan neu;
  dtcb := module + ".dtcb"; 
  ccb  := module + ".ccb"; 
  info := module + ".info"; 
  perhaps change filenames;
  elan neu := yes (module + ": neue Elan Teile machen", FALSE);
  IF elan neu THEN neue elan teile machen  FI;
  link shard module (module, dtcb, ccb, info);
  IF elan neu THEN check syntax FI.

neue elan teile machen:
  edit (dtcb); line (2);
  edit (ccb);  line (2);
  edit (info); page.

perhaps change filenames:
(*put ("Datei mit dtcb-refinements :"); editget (dtcb); line;
  put ("Datei mit  ccb-refinements :"); editget (ccb);  line;
  put ("Datei mit Infotext         :"); editget (info); line (2)*) .

check syntax :
  line (2); put (module); putline (": Syntax-Check");
  forget (ds);
  ds := nilspace;
  BOUND MODUL VAR m :: old (module), old shard :: ds, new shard :: ds;
  INT VAR  offset dtcb table  :: int (m, 0),
           dtcb table entries :: int (m, offset dtcb table),
           offset ccb table   :: int (m, 2),
           ccb  table entries :: int (m, offset ccb table);
  (* Jetzt einen total verkrüppelten automatischen "perform dialogue" für
     die Probeübersetzung der .dtcb und .ccb refinements aufrufen.
  *)
  perform dtcb dialogue (m, real (offset dtcb table+2), dtcb table entries,
                         new shard, 0.0,
                         old shard, 0.0,
                         FALSE, FALSE,
                         dtcb refinements (m), dtcb abfragen (m),
                         TRUE, FALSE);
  putline ("dtcb refinements O.K.");
  ROW 40 REAL VAR x :: ROW 40 REAL : (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
   0.0, 0.0);
  perform ccb dialogue (m, real (offset ccb table+2), ccb table entries,
                        new shard, x,
                        old shard, x,
                        1,
                        FALSE, FALSE,
                        ccb refinements (m), ccb abfragen (m),
                        TRUE, FALSE);
  putline ("ccb refinements O.K.");
  forget (ds).
END PROC link shard module;

PROC link shard module (TEXT CONST module, dtcb, ccb, infofile) : 
  IF type (old (module)) <> datenraumtyp modul CAND NOT typ aendern 
  THEN LEAVE link shard module
  ELSE type (old (module), datenraumtyp modul)  FI;
  IF NOT (module LIKE modul namentyp)
  THEN errorstop ("Module MÜSSEN Namen der Art """ + modul namentyp +
                   """ haben")
  FI;
  line;
  BOUND MODUL VAR m :: old (module); 
  TEXT VAR dtcb ref :: file as one text (dtcb, FALSE), 
           ccb  ref :: file as one text (ccb,  FALSE),
           info text:: file as one text (infofile, TRUE); 
  INT CONST pos dtcb :: pos (dtcb ref, " "), (* Ende der ersten Zeile, die *)
            pos ccb  :: pos (ccb ref,  " "); (* die Abfragezahl enthält *)
  INT VAR   dtcb count, ccb count;
  dtcb count := int (subtext (dtcb ref, 1, pos dtcb)); 
  IF NOT last conversion ok OR dtcb count < 0 OR dtcb count > 1000 
  THEN errorstop ("keine vernünftige Zahl von dtcb Abfragen gefunden")  FI;
  ccb count := int (subtext (ccb ref, 1, pos ccb)); 
  IF NOT last conversion ok OR ccb count < 0 OR ccb count > 1000 
  THEN errorstop ("keine vernünftige Zahl von ccb Abfragen gefunden")  FI;
  (* JETZT PASSIERTS : *) 
  dtcb abfragen (m, dtcb count); 
  dtcb refinements (m, subtext (dtcb ref, pos dtcb + 1)); 
  ccb abfragen (m, ccb count); 
  ccb refinements (m, subtext (ccb ref, pos ccb + 1)); 
  info (m, infotext);
  line;
  putline (""""+module+""" gelinkt. " + text (storage (old (module))) +
           " K Datenraumgröße.").

typ aendern :
  IF type (old (module)) = 1003 (* file type *)
  THEN putline ("(""" + module + """ hat den Typ FILE)")  FI;
  putline ("Achtung: """ + module + """ ist nicht vom Typ eines SHard-Moduls");
  yes ("Soll es dazu gemacht werden (Typ aufprägen)", FALSE).
END PROC link shard module;

(******************** file as one text ************************************) 
 
TEXT PROC file as one text (TEXT CONST filename, BOOL CONST verbatim) : 
  FILE VAR f :: sequential file (input, filename); 
  TEXT VAR result :: "", t; 
  put ("Lese """ + filename + """ :");
  WHILE NOT eof (f) REP 
    cout (line no (f));
    getline (f, t);
    work on t;
    result CAT t
  PER;
  line;
  result.

work on t :
  IF verbatim
  THEN t CAT ""13""10""
  ELSE t := compress (t); t CAT " "  FI.
END PROC file as one text;

(****** ich schreibe jetzt ein neues shard modul ***************************)

PROC ich schreibe jetzt ein neues shard modul :
  line (2);
  putline ("So so, Sie wollen also ein neues SHard-Modul schreiben."); line;
  pause (20);
  putline ("Mir kommt es so vor, als sei heute der " + date +
           " und im Moment gerade " + time of day + " Uhr"); line;
  IF NOT yes ("Stimmt das ungefähr (auf 5 Minuten kommt's nicht an)", TRUE)
  THEN do ("set date"); line (2) FI;
  putline ("Also gut. Schreiben Sie Ihr verdammtes Modul.");
  putline ("Aber merken Sie sich die folgenden 4 Bytes als ihren Modultyp");
  put (""15"   ");
  REAL VAR x :: floor (clock (1) - date ("05.05.79") - time ("10:00:00"));
  INT VAR i;
  FOR i FROM 1 UPTO 4 REP
    put (int (x MOD 256.0));
    x := floor (x / 256.0)
  PER;
  put ("  "14""); line (2);
  putline ("Also : die Dinger merken (schreiben Sie sie auf, sonst vergessen Sie");
  putline ("       sie ja doch) und NICHT MEHR ÄNDERN !");
  line (3)
END PROC ich schreibe jetzt ein neues shard modul;

END PACKET setup eumel dienstprogramme;