summaryrefslogtreecommitdiff
path: root/app/flint/0.4/src/klartextbelegung
blob: efe4b0869b79df9378f39382719eecbba82b6445 (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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
(*************************************************************************)
(*                                                                        *)
(*       K L A R T E X T                                                  *)
(*       ===============                                                  *)
(*                                                                        *)
(*       Tastenbelegungen im Klartext fuer Steuertasten                   *)
(*                                                                        *)
(*       Autor: Thomas Berlage                                            *)
(*       Stand: 27.04.88                                                  *)
(*       Version 1.0                                                      *)
(*                                                                        *)
(*       Zweck: Lernsequenzen koennen editiert werden, wobei fuer         *)
(*              die Steuertasten symbolische Namen in spitzen             *)
(*              Klammern verwendet werden. Folgende Namen sind            *)
(*              zulaessig:                                                *)
(*                                                                        *)
(*              <hop> <links> <rechts> <oben> <unten> <tab>               *)
(*              <rubin> <rubout> <mark> <esc>                             *)
(*                                                                        *)
(*       Aufruf:                                                          *)
(*              PROC lernsequenz editieren (TEXT CONST taste)             *)
(*                                                                        *)
(**************************************************************************)
PACKET case conversion                                 (* Stand: 07.02.88 *)

  DEFINES

  to lowercase,
  to uppercase :


PROC to uppercase (TEXT VAR line) :

  INT VAR p := 0;
  REP
    p := pos (line, "a", "z", p + 1);
    IF p = 0 THEN LEAVE to uppercase END IF;
    replace (line, p, code (code (line SUB p) - 32))
  END REP

END PROC to uppercase;

PROC to lowercase (TEXT VAR line) :

  INT VAR p := 0;
  REP
    p := pos (line, "A", "Z", p + 1);
    IF p = 0 THEN LEAVE to lowercase END IF;
    replace (line, p, code (code (line SUB p) + 32))
  END REP

END PROC to lowercase;

END PACKET case conversion;

PACKET klartextbelegung 
 
  DEFINES 
 
  sieben bit modus, 
  klartext, 
  kodierung : 
 
 
BOOL VAR sieben bit := TRUE; 
 
ROW 33 TEXT CONST tasten := ROW 33 TEXT : ( 
  "nul", "hop", "rechts", "oben", "-(4)", "fkt1", "fkt2", "-(7)", "links",
  "tab", "unten", "rubin", "rubout", "return", "fkt3", "fkt4", "mark",
  "-(17)", "-(18)", "-(19)", "-(20)", "fkt5", "fkt6", "-(23)", "fkt7",
  "fkt8", "fkt9", "esc", "fkt10", "fkt11", "fkt12", "fkt13", "blank");

LET
  separator anfang = "<",
  separator ende = ">";

TEXT VAR ergebnis;


BOOL PROC sieben bit modus :

  sieben bit

END PROC sieben bit modus;

PROC sieben bit modus (BOOL CONST modus) :

  sieben bit := modus

END PROC sieben bit modus;

TEXT PROC klartext (TEXT CONST t) :

  INT VAR i;
  ergebnis := "";
  FOR i FROM 1 UPTO length (t) REP
    klartext eines zeichens bestimmen
  END REP;
  ergebnis .

klartext eines zeichens bestimmen :
  INT CONST c := code (t SUB i);
  IF c < 33 THEN
    ergebnis CAT separator anfang + tasten (c + 1) + separator ende
  ELIF c >= 127 CAND sieben bit CAND kein umlaut THEN
    ergebnis CAT separator anfang + text (c) + separator ende
  ELSE
    ergebnis CAT code (c)
  END IF .

kein umlaut :
  pos (eumel sonderzeichen, code (c)) = 0 .

eumel sonderzeichen :
  ""214""215""216""217""218""219""220""221""222""223""251""252"" .

END PROC klartext;

TEXT PROC kodierung (TEXT CONST t) :

  INT VAR
    sep pos := pos (t, separator anfang),
    sep ende := 0;

  enable stop;
  ergebnis := "";
  WHILE sep pos > 0 REP
    text vor separator uebernehmen;
    separiertes zeichen behandeln;
    sep pos := pos (t, separator anfang, sep ende)
  END REP;
  restliche zeichen uebernehmen;
  ergebnis .

text vor separator uebernehmen :
  ergebnis CAT subtext (t, sep ende + 1, sep pos - 1) .

separiertes zeichen behandeln :
  sep ende := pos (t, separator ende, sep pos);
  IF sep ende = 0 THEN
    errorstop ("""" + separator ende + """ fehlt.")
  ELSE
    separiertes zeichen kodieren
  END IF .

separiertes zeichen kodieren :
  TEXT VAR bezeichnung := subtext (t, sep pos + 1, sep ende - 1);
  change all (bezeichnung, " ", "");
  to lowercase (bezeichnung);
  INT VAR c := int (bezeichnung);
  IF keine zahl THEN
    mit tabelle vergleichen
  END IF;
  ergebnis CAT code (c) .

keine zahl :
  NOT last conversion ok .

mit tabelle vergleichen :
  INT VAR i;
  FOR i FROM 1 UPTO 33 REP
    IF bezeichnung = tasten (i) THEN
      c := i - 1;
      LEAVE mit tabelle vergleichen
    END IF
  END REP;
  errorstop ("unbekannte Tastenbezeichnung: """ + bezeichnung + """") .

restliche zeichen uebernehmen :
  ergebnis CAT subtext (t, sep ende + 1) .

END PROC kodierung;

END PACKET klartextbelegung;

PACKET klartext anwendung

  DEFINES

  klartext auf taste,
  klartext auf taste legen,
  klartext aus file,
  klartext in file,
  lernsequenz editieren :


LET
  separator anfang = "<",
  separator ende = ">";

TEXT VAR
  zeile,
  sequenz,
  aenderung;

DATASPACE VAR
  ds;


TEXT PROC klartext auf taste (TEXT CONST taste) :

  klartext (lernsequenz auf taste (kodierung (taste)))

END PROC klartext auf taste;

PROC klartext auf taste legen (TEXT CONST taste, belegung) :

  lernsequenz auf taste legen (kodierung (taste), kodierung (belegung))

END PROC klartext auf taste legen;

PROC klartext in file (FILE VAR f, TEXT CONST belegung) :

  INT VAR
    ende,
    anfang := 1;

  output (f);
  zeile := klartext (belegung);
  REP
    ende der zeile bestimmen;
    putline (f, subtext (zeile, anfang, ende - 1));
    anfang := ende
  UNTIL anfang > length (zeile) END REP .

ende der zeile bestimmen :
  TEXT CONST zeichen := subtext (zeile, anfang, anfang + 4);
  IF zeichen = "<hop>" OR zeichen = "<esc>" THEN
    ende := pos (zeile, separator anfang, anfang + 6)
  ELSE
    ende := pos (zeile, separator anfang, anfang + 1)
  END IF;
  IF ende = 0 THEN ende := length (zeile) + 1 END IF;
  ende := min (anfang + maxlinelength (f), ende) .
(*
  IF (ende - anfang) > maxlinelength (f) THEN
    ende := anfang + maxlinelength (f)
  ELIF ende > 5 THEN
    letzten separator bestimmen
  END IF .

letzten separator bestimmen :
  TEXT CONST zeichen := subtext (zeile, ende - 4, ende - 2);
  IF zeichen = "esc" OR zeichen = "hop" THEN
    ende verschieben
  ELSE
    ende := pos (zeile, separator ende, ende)
  END IF .

ende verschieben :
  IF (zeile SUB ende + 5) = separator anfang THEN
    ende := pos (zeile, separator ende, ende + 5);
    IF ende = 0 THEN ende := length (zeile) END IF
  ELSE
    ende := ende + 5
  END IF .
 *)
END PROC klartext in file;

PROC klartext aus file (FILE VAR f, TEXT VAR belegung) :

  input (f);
  belegung := "";
  WHILE NOT eof (f) REP
    getline (f, zeile);
    IF (zeile SUB LENGTH zeile) = " " THEN
      zeile := subtext (zeile, 1, length (zeile) - 1)
    END IF;
    belegung CAT kodierung (zeile)
  END REP .

END PROC klartext aus file;

PROC lernsequenz editieren (TEXT CONST taste) :

  disable stop;
  ds := nilspace;
  editieren (taste);
  forget (ds)

END PROC lernsequenz editieren;

PROC editieren (TEXT CONST taste) :

  enable stop;
  FILE VAR f := sequential file (output, ds);
  sequenz := lernsequenz auf taste (taste);
  klartext in file (f, sequenz);
  headline (f, "Tastenbelegung");
  edit (f);
  klartext aus file (f, aenderung);
  IF aenderung <> sequenz CAND wirklich aendern THEN
    lernsequenz auf taste legen (taste, aenderung)
  END IF .

wirklich aendern :
  yes ("Lernsequenz aendern") .

END PROC editieren;

END PACKET klartext anwendung;