home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GME / GMEFILE.I < prev    next >
Encoding:
Text File  |  1991-03-09  |  49.5 KB  |  3 lines

  1. ⓪ (* (C) 1989, 1990 by Johannes Leckebusch *)
  2. ⓪ (* Portiert für MM2: 7. 6. 89 *)
  3. ⓪ 
  4. ⓪ (* 12.12.90  TT  Puffer werden hier statt in GMEBase angelegt,
  5. ⓪1um zirkul. Import zw. GMEBase & GMEConfig zu lösen;
  6. ⓪1FastLen wieder in Assembler;
  7. ⓪1Ctrl-Z wird in FastLen als Ende erkannt;
  8. ⓪1Meldung "Config laden" nur, wenn's wirklich geladen wird;
  9. ⓪1Wenn ungültiger Text gelesen wird, kommt entspr.
  10. ⓪1Fehlermeldung und TextLesen bricht ab - allerdings
  11. ⓪1wird Puffer noch nicht dann wieder gelöscht!
  12. ⓪#13.12.90  TT  Konstante 'DefaultConfigName' definiert, die Datei heißt
  13. ⓪1wieder "GME.GME", weil's so im Handbuch steht.
  14. ⓪1Meldung, daß .GME nicht gefunden, erscheint nun mit vollst.
  15. ⓪1Dateinamen (also z.B. "GME.GME" statt nur ".GME") und
  16. ⓪1dahinter wird ein CR/LF ausgegeben, damit das evtl. folgende
  17. ⓪1"Text laden" nicht direkt dahinter steht.
  18. ⓪#17.12.90  TT  Fix vom 16.12. von JL wg. Absturz bei ^QE in TextSchreiben
  19. ⓪1eingesetzt.
  20. ⓪#18.12.90  TT  Letzte Zeile wird von TextLesen nun korrekt geladen;
  21. ⓪1Fehlerabfrage beim Anlegen ALLER Puffer -> OutOfMemory-Meldg.;
  22. ⓪1TextSchreiben: Handles werden auf neg. Werte und nicht mehr
  23. ⓪1"<6" verglichen; TextSchreiben: Letzte Zeile wird nicht mit
  24. ⓪1CR/LF versehen.
  25. ⓪#09.03.91  TT  TextSchreiben: liefert Erfolgswert; GME.GME wird nur geladen,
  26. ⓪1wenn "KonfigSpeichern" aktiv ist.
  27. ⓪ *)
  28. ⓪ 
  29. ⓪ (*$R-*)
  30. ⓪ (*$Y+*)
  31. ⓪ (*$Z+*)
  32. ⓪ 
  33. ⓪ IMPLEMENTATION MODULE GMEFile;
  34. ⓪ 
  35. ⓪ 
  36. ⓪ (* The Little Golem Editor. Begonnen 13. 06. 86
  37. ⓪#(C) 1986, 1990 by Johannes Leckebusch
  38. ⓪#Version: Siehe ceditor
  39. ⓪#Stand: 28. 02. 88
  40. ⓪ *)
  41. ⓪ 
  42. ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, CAST;
  43. ⓪ (* FROM Storage IMPORT ALLOCATE, DEALLOCATE; *)
  44. ⓪ FROM Granule IMPORT ALLOCATE, DEALLOCATE;
  45. ⓪ 
  46. ⓪ FROM GEMDOS IMPORT IOMode, Open, Create, Close, Delete, Read, Write, Rename,
  47. ⓪"DaTime, TimeAccessMode;
  48. ⓪ 
  49. ⓪ FROM EasyGEM1 IMPORT MakeScrapName;
  50. ⓪ FROM PrgCtrl IMPORT ActiveProcess;
  51. ⓪ FROM SystemError IMPORT OutOfMemory;
  52. ⓪ 
  53. ⓪ FROM Strings IMPORT Append, Assign, Copy;
  54. ⓪ FROM FastStrings IMPORT Pos;
  55. ⓪ IMPORT FastStrings, Paths, Lists, Directory, ShellMsg, PathCtrl, FileNames;
  56. ⓪ FROM ShellMsg IMPORT ShellPath;
  57. ⓪ 
  58. ⓪ (* FROM MyConversions IMPORT ConvCard; *)
  59. ⓪ FROM Convert IMPORT ConvCard;
  60. ⓪ 
  61. ⓪ FROM GMEConfig IMPORT ConfigInit, InitConfig;
  62. ⓪ 
  63. ⓪ FROM GMEBase IMPORT WriteConst, WriteLn, WriteChar, Trace,
  64. ⓪(bel, cr, eot, lf, tab, nul, LinesOnScreen,
  65. ⓪(
  66. ⓪(PuffRecSize, cRevision,
  67. ⓪(InitBuffer,
  68. ⓪(LoescheBild, LoescheZeile,
  69. ⓪(WriteLine, HighLight, Normal, GotoXY, CursorEin, CursorAus,
  70. ⓪(Nachricht, FrageJaNein, Ja, Nein, MausEin, MausAus, MausBusy,
  71. ⓪(GetVersion,
  72. ⓪(PuffInit,
  73. ⓪(UndoPuffer, ClipBoard, HilfsPuffer, ConfigPuffer,
  74. ⓪(EditPuffer, AlternEdit, DruckPuff, MailPuffer,
  75. ⓪(Tausch, GolemPuffer, PSCPuffer, FehlerPuffer;
  76. ⓪ 
  77. ⓪ FROM GMEBase IMPORT DeleteTail, GetDirectory, GetPfad;
  78. ⓪ 
  79. ⓪ FROM GMEBase IMPORT cZeile, cTabWeite, cKopfVorlauf, cKopfNachlauf,
  80. ⓪(cZeilenAbstand, cSpiegel, cOffset;
  81. ⓪ 
  82. ⓪ FROM GMEBase IMPORT Mode, CharSet,
  83. ⓪(einPufferPointer, eineInfo, eineZeile,
  84. ⓪(einLinePointer, Moden, MerkIndex,
  85. ⓪(einMerkPunkt, einMerkPointer, einStringPointer, einMerkSet;
  86. ⓪ 
  87. ⓪ FROM GMEBase IMPORT Loeschen, Init, AllocLine, PutLine,
  88. ⓪(AutoCount, InsertPuffer;
  89. ⓪ 
  90. ⓪ (* FROM EditCommand IMPORT SplitFileName; *)
  91. ⓪ 
  92. ⓪ FROM GMEKernel IMPORT SchirmSchreiben;
  93. ⓪ 
  94. ⓪ FROM GMEKernel IMPORT LineUp, InsertLine, StelleZeileEin, SucheZeilenPointer;
  95. ⓪ 
  96. ⓪ (* Bemerkung: StringZeilen werden als >>Zeile<<, Pointer-Objekte
  97. ⓪#als >>Line<< bezeichnet *)
  98. ⓪ 
  99. ⓪ CONST   cpuffer =       32767;
  100. ⓪(cgrain =        16; (* Hm - das war natürlich Granule... *)
  101. ⓪(
  102. ⓪(DefaultConfigName = 'GME.GME';
  103. ⓪ 
  104. ⓪ TYPE    einPuffer =     ARRAY [0..cpuffer] OF CHAR;
  105. ⓪(PufferPointer = POINTER TO einPuffer;
  106. ⓪ 
  107. ⓪ VAR     version:        eineInfo;
  108. ⓪(puffer:         PufferPointer;
  109. ⓪ 
  110. ⓪ 
  111. ⓪ (************************* aus GMEBase *******************************)
  112. ⓪ 
  113. ⓪ PROCEDURE LoadConfig (Puff: einPufferPointer; frage, message: BOOLEAN);
  114. ⓪ VAR     Info:           eineInfo;
  115. ⓪(filehandle:     INTEGER;
  116. ⓪(ok:             BOOLEAN;
  117. ⓪(button:         INTEGER;
  118. ⓪ VAR     PName:          eineInfo;
  119. ⓪(LSIZE:          LONGCARD;
  120. ⓪(mind:           MerkIndex;
  121. ⓪(dot, star:      ARRAY [0..0] OF CHAR; (* Compilerfehler! *)
  122. ⓪(i:              CARDINAL;
  123. ⓪(ch:             CHAR;
  124. ⓪(chp:            POINTER TO CHAR;
  125. ⓪ 
  126. ⓪$PROCEDURE ReadZeile (VAR lp: einLinePointer);
  127. ⓪$VAR       LSIZE:          LONGCARD;
  128. ⓪.l:              eineZeile;
  129. ⓪.ind:            CARDINAL;
  130. ⓪$BEGIN
  131. ⓪&LSIZE := 1; ind := 0;
  132. ⓪&WHILE (ch # cr) & (ch # eot) & (ind < cZeile) & (LSIZE = 1L) DO
  133. ⓪&(* Achtung: Falls tatsaechlich zuviele Zeichen im String,
  134. ⓪)werden nicht alle gelesen! (ind < cZeile) *)
  135. ⓪(l [ind] := ch; INC (ind);
  136. ⓪(Read (filehandle, LSIZE, chp);
  137. ⓪&END (* WHILE *);
  138. ⓪&l [ind] := nul;
  139. ⓪&(* merkinfo ist nicht alloziiert! *)
  140. ⓪&AllocLine (lp, 0);
  141. ⓪&IF lp = NIL THEN
  142. ⓪(Nachricht ('Kein Platz für|Zeileninfo.113');
  143. ⓪&ELSE
  144. ⓪(PutLine (lp, l);
  145. ⓪&END;
  146. ⓪$END ReadZeile;
  147. ⓪ 
  148. ⓪ (*
  149. ⓪$PROCEDURE LoadMerkpunktListe (VAR mp: einMerkPunkt);
  150. ⓪$VAR     mpp, hp:    einMerkPointer;
  151. ⓪,Ende:       BOOLEAN;
  152. ⓪"
  153. ⓪&PROCEDURE LoadMerkpunkt (VAR p: einMerkPointer);
  154. ⓪&VAR       LSIZE:          LONGCARD;
  155. ⓪(VAR     lp:             einLinePointer;
  156. ⓪(
  157. ⓪&BEGIN (* LoadMerkpunkt *)
  158. ⓪((* Merkpunkt-Record lesen: *)
  159. ⓪(NEW (p);
  160. ⓪(IF p = NIL THEN
  161. ⓪*Nachricht ('Kein Platz für|Merkpunkt.114');
  162. ⓪*Ende := TRUE; RETURN;
  163. ⓪(END;
  164. ⓪(LSIZE := LONG (SIZE (p^));
  165. ⓪(Read (filehandle, LSIZE, p);
  166. ⓪((* p^.nextMerk enthaelt alten Pointerwert, dieser darf
  167. ⓪+jedoch nur auf NIL verglichen werden! *)
  168. ⓪(WITH p^ DO
  169. ⓪*merkline := Puff^.Puffer^.naechste; (* erste effektive Textzeile *)
  170. ⓪ 
  171. ⓪*(* Infostring lesen: *)
  172. ⓪ 
  173. ⓪*IF merkinfo # NIL THEN
  174. ⓪,lp := merkinfo;
  175. ⓪,chp := ADR (ch); LSIZE := 1;
  176. ⓪,Read (filehandle, LSIZE, chp);
  177. ⓪,WHILE (ch # eot) & (LSIZE = 1) DO
  178. ⓪.ReadZeile (merkinfo);
  179. ⓪.Read (filehandle, LSIZE, chp);
  180. ⓪.IF ch # eot THEN
  181. ⓪0AllocLine (merkinfo^.naechste, 0);
  182. ⓪0IF merkinfo^.naechste = NIL THEN
  183. ⓪2Nachricht ('Kein Platz für|Zeileninfo.115');
  184. ⓪2Ende := TRUE; RETURN;
  185. ⓪0END;
  186. ⓪0merkinfo^.naechste^.vorige := merkinfo;
  187. ⓪0merkinfo := merkinfo^.naechste;
  188. ⓪.END (* IF *);
  189. ⓪,END (* WHILE NOT ^Z *);
  190. ⓪*END (* IF Infostring lesen *);
  191. ⓪*
  192. ⓪(END (* WITH *);
  193. ⓪&END LoadMerkpunkt;
  194. ⓪&
  195. ⓪$BEGIN (* LoadMerkpunktListe *)
  196. ⓪&IF mp.nextMerk # NIL THEN
  197. ⓪((* WriteLn; WriteConst (' Lade Merkpunktliste'); *)
  198. ⓪(LoadMerkpunkt (mp.nextMerk);
  199. ⓪(mpp := mp.nextMerk; Ende := FALSE;
  200. ⓪(WHILE (mpp^.nextMerk # NIL) & ~Ende DO
  201. ⓪*LoadMerkpunkt (mpp^.nextMerk);
  202. ⓪*mpp := mpp^.nextMerk;
  203. ⓪(END (* WHILE *);
  204. ⓪&END (* IF *);
  205. ⓪$END LoadMerkpunktListe;
  206. ⓪ *)
  207. ⓪ BEGIN (* LoadConfig *)
  208. ⓪"(* IF ~FrageJaNein (1, 'Texteinstellungen laden') THEN RETURN; END; *)
  209. ⓪ 
  210. ⓪"dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)
  211. ⓪"star [0] := '*';
  212. ⓪"(* REPEAT *)
  213. ⓪"IF frage THEN CursorAus;
  214. ⓪%LoescheBild;
  215. ⓪%HighLight; WriteLine (version);
  216. ⓪%Normal; WriteLn; WriteLn;
  217. ⓪"END (* IF frage *);
  218. ⓪"
  219. ⓪$WITH Puff^ DO
  220. ⓪&FileNames.ConcatName (Pfad, 'GME', Pfad);
  221. ⓪&FileNames.ConcatName (Name, 'GME', Name);
  222. ⓪$END;
  223. ⓪$
  224. ⓪$Info := Puff^.Pfad; DeleteTail (Info);
  225. ⓪$FastStrings.Append (Puff^.Name, Info);
  226. ⓪$IF frage THEN
  227. ⓪&(* WriteConst (' Text-Konfiguration lesen: '); *)
  228. ⓪&HighLight; WriteConst (Info); Normal;
  229. ⓪&GetDirectory (Puff^.Pfad, Puff^.Name, 'GME lesen', button, FALSE);
  230. ⓪&IF (button # 1) THEN
  231. ⓪((*IF expand THEN RETURN; END;*)
  232. ⓪(InitConfig (Puff);
  233. ⓪(CursorEin; RETURN;
  234. ⓪&END;
  235. ⓪&Info := Puff^.Pfad; DeleteTail (Info);
  236. ⓪&FastStrings.Append (Puff^.Name, Info);
  237. ⓪$END (* IF frage *);
  238. ⓪ 
  239. ⓪$Open (Info, ORD (read), filehandle);
  240. ⓪$(* frage := TRUE; *)
  241. ⓪ 
  242. ⓪"IF ~(filehandle >= 0) THEN
  243. ⓪$(* Nachricht ('.GME-Datei nicht gefunden!'); *)
  244. ⓪ 
  245. ⓪$HighLight; WriteLine (Puff^.Name);
  246. ⓪$WriteConst (' nicht gefunden!'); Normal;
  247. ⓪$WriteLn;
  248. ⓪ 
  249. ⓪$InitConfig (Puff);
  250. ⓪$EXCL (Puff^.Modus, KonfigSpeichern);
  251. ⓪$RETURN;
  252. ⓪"END (* IF *);
  253. ⓪"IF message THEN
  254. ⓪$WriteConst ('Config laden');
  255. ⓪$WriteLn;
  256. ⓪"END;
  257. ⓪"MausBusy;
  258. ⓪"LSIZE := 4;
  259. ⓪"Read (filehandle, LSIZE, Puff);
  260. ⓪"IF Puff^.MagicRevision # cRevision THEN
  261. ⓪$ok := Close (filehandle);
  262. ⓪$Nachricht ('GME-Datei inkompatibel');
  263. ⓪$InitConfig (Puff);(* Puff^.MagicRevision := 0;*)
  264. ⓪$CursorEin;
  265. ⓪$RETURN;
  266. ⓪"END (* IF *);
  267. ⓪"LSIZE := PuffRecSize - 4L;
  268. ⓪"Read (filehandle, LSIZE, ADDRESS (Puff) + 4L);
  269. ⓪"EXCL (Puff^.Modus, Editiert);
  270. ⓪"(* EXCL (Puff^.Modus, ScanText); (* Flag steuert PSC-Interpreter! *) *)
  271. ⓪"
  272. ⓪"(* Merkinfo der festen Merkpunkte laden: *)
  273. ⓪"
  274. ⓪"FOR mind := ErsteZeile TO LetztePosition DO
  275. ⓪$(* Trace (' Merkpunkt laden...'); *)
  276. ⓪$WITH Puff^.MerkPunkte [mind] DO
  277. ⓪&IF merkinfo # NIL (* alter String war vorhanden *)
  278. ⓪(THEN chp := ADR (ch); LSIZE := 1;
  279. ⓪-Read (filehandle, LSIZE, chp);
  280. ⓪-ReadZeile (merkinfo);
  281. ⓪&END (* IF merkinfo *);
  282. ⓪$END (* WITH *);
  283. ⓪"END (* FOR *);
  284. ⓪ 
  285. ⓪ (*
  286. ⓪"(* Merklisten laden: *)
  287. ⓪"
  288. ⓪"IF expand THEN
  289. ⓪$FOR mind := ErsteZeile TO LetztePosition DO
  290. ⓪&WITH Puff^ DO
  291. ⓪(LoadMerkpunktListe (MerkPunkte [mind]);
  292. ⓪&END (* WITH *);
  293. ⓪$END (* FOR *);
  294. ⓪"END (* IF *);
  295. ⓪ *)
  296. ⓪ 
  297. ⓪"(* File schliessen *)
  298. ⓪"ok := Close (filehandle);
  299. ⓪"MausEin; CursorEin;
  300. ⓪ END LoadConfig;
  301. ⓪ 
  302. ⓪ PROCEDURE SaveConfig (Puff: einPufferPointer; frage: BOOLEAN);
  303. ⓪ (* Speichere die in listen genannten Merkpunktlisten, sonst nur den
  304. ⓪#Kopfrecord des Textpufferdescriptors *)
  305. ⓪ 
  306. ⓪ VAR     Name, BakName, Pfad:  eineInfo;
  307. ⓪(filehandle:           INTEGER;
  308. ⓪(ok:                   BOOLEAN;
  309. ⓪(dot, star:            ARRAY [0..0] OF CHAR; (* Compilerfehler! *)
  310. ⓪(PName:                eineInfo;
  311. ⓪(i:                    CARDINAL;
  312. ⓪(button:               INTEGER;
  313. ⓪(LSIZE:                LONGCARD;
  314. ⓪(mind:                 MerkIndex;
  315. ⓪ 
  316. ⓪"PROCEDURE WriteInfo (lp: einLinePointer);
  317. ⓪"VAR   ch:             CHAR;
  318. ⓪"BEGIN
  319. ⓪$LSIZE := LONG (LENGTH (lp^.ZeilPointer^)); (* ERROR *)
  320. ⓪$Write (filehandle, LSIZE, lp^.ZeilPointer);
  321. ⓪$ch := cr; LSIZE := 1;
  322. ⓪$Write (filehandle, LSIZE, ADR (ch));
  323. ⓪"END WriteInfo;
  324. ⓪ 
  325. ⓪ (*
  326. ⓪"PROCEDURE SaveMerkpunktListe (mp: einMerkPunkt);
  327. ⓪"VAR     mpp:    einMerkPointer;
  328. ⓪ 
  329. ⓪$PROCEDURE SaveMerkpunkt (p: einMerkPointer);
  330. ⓪$VAR         LSIZE:          LONGCARD;
  331. ⓪0lp:             einLinePointer;
  332. ⓪0ch:             CHAR;
  333. ⓪$BEGIN
  334. ⓪&(* Merkpunkt-Record schreiben: *)
  335. ⓪&LSIZE := LONG (SIZE (p^));
  336. ⓪&Write (filehandle, LSIZE, p);
  337. ⓪&WITH p^ DO
  338. ⓪&
  339. ⓪((* Infostring schreiben: *)
  340. ⓪&
  341. ⓪(IF merkinfo # NIL THEN
  342. ⓪*lp := merkinfo;
  343. ⓪*WHILE lp # NIL DO
  344. ⓪,WriteInfo (lp);
  345. ⓪,lp := lp^.naechste;
  346. ⓪*END (* WHILE *);
  347. ⓪(END (* IF Infostring schreiben *);
  348. ⓪(ch := eot; (* ^Z *)
  349. ⓪(LSIZE := 1;
  350. ⓪(Write (filehandle, LSIZE, ADR (ch));
  351. ⓪&END (* WITH p^ *);
  352. ⓪$END SaveMerkpunkt;
  353. ⓪$
  354. ⓪"BEGIN (* SaveMerkpunktListe *)
  355. ⓪$mpp := mp.nextMerk;
  356. ⓪$WHILE mpp # NIL DO
  357. ⓪&SaveMerkpunkt (mpp);
  358. ⓪&mpp := mpp^.nextMerk;
  359. ⓪$END (* WHILE *);
  360. ⓪"END SaveMerkpunktListe;
  361. ⓪ *)
  362. ⓪ 
  363. ⓪ BEGIN (* SaveConfig *)
  364. ⓪ (*
  365. ⓪"IF ~FrageJaNein (1, 'Texteinstellungen speichern') THEN RETURN; END;
  366. ⓪ *)
  367. ⓪"dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)
  368. ⓪"star [0] := '*';
  369. ⓪"IF frage THEN
  370. ⓪$Name := DefaultConfigName;
  371. ⓪"ELSE
  372. ⓪$(*
  373. ⓪$Name := Puff^.Name;
  374. ⓪$IF Pos (dot, Name) >= 0 THEN
  375. ⓪&(* Suffix entfernen: *)
  376. ⓪&i := LENGTH (Name); DEC (i);
  377. ⓪&WHILE Name [i] # '.' DO
  378. ⓪(DEC (i);
  379. ⓪&END (* WHILE *);
  380. ⓪&Name [i] := nul;
  381. ⓪$END (* IF Punkt *);
  382. ⓪$IF Name [0] = nul THEN FastStrings.Assign (star, Name); END;
  383. ⓪$FastStrings.Append ('.GME', Name);
  384. ⓪$*)
  385. ⓪$FileNames.ConcatName (Puff^.Name, 'GME', Name);
  386. ⓪"END (* IF frage *);
  387. ⓪"
  388. ⓪"(* Meldung in die obersten Bildschirmzeilen schreiben: *)
  389. ⓪"
  390. ⓪"(* LoescheBild; *)
  391. ⓪"GotoXY (0, 0); CursorAus;
  392. ⓪"HighLight; WriteLine (version); Normal; LoescheZeile;
  393. ⓪"WriteLn; LoescheZeile; WriteLn; LoescheZeile;
  394. ⓪"HighLight; WriteConst (' Text-Konfiguration schreiben: ');
  395. ⓪"Pfad := Puff^.Pfad; DeleteTail (Pfad);
  396. ⓪"WriteConst (Pfad); WriteConst (Name); Normal; LoescheZeile;
  397. ⓪"WriteLn; LoescheZeile;
  398. ⓪"
  399. ⓪"IF frage THEN
  400. ⓪$FileNames.ConcatPath (ShellPath, DefaultConfigName, PName);
  401. ⓪"ELSE
  402. ⓪$(*
  403. ⓪$PName := Puff^.Pfad;
  404. ⓪$IF Pos (dot, PName) >= 0 THEN
  405. ⓪&i := LENGTH (PName); DEC (i);
  406. ⓪&WHILE PName [i] # '.' DO
  407. ⓪(DEC (i);
  408. ⓪&END (* WHILE *);
  409. ⓪&PName [i] := nul;
  410. ⓪$END (* IF Punkt *);
  411. ⓪$IF PName [0] = nul THEN FastStrings.Assign (star, PName); END;
  412. ⓪$FastStrings.Append ('.GME', PName);
  413. ⓪$*)
  414. ⓪$FileNames.ConcatName (Puff^.Pfad, 'GME', PName);
  415. ⓪"END (* IF frage *);
  416. ⓪"
  417. ⓪"IF (* frage OR *) (Name [0] = nul) THEN
  418. ⓪$(* Filename vom Benutzer holen: *)
  419. ⓪$GetDirectory (PName, Name, '*.GME speichern', button, FALSE);
  420. ⓪$IF button # 1 THEN (* Abbruch-Knopf gedrueckt *)
  421. ⓪&RETURN;
  422. ⓪$END;
  423. ⓪"END (* IF frage *);
  424. ⓪"
  425. ⓪"IF Name [0] = nul THEN
  426. ⓪$Nachricht('Sie müssen einen Dateinamen angeben!');
  427. ⓪$RETURN;
  428. ⓪"END (* IF kein Name *);
  429. ⓪"BakName := Name;
  430. ⓪"Pfad := PName; DeleteTail (Pfad);
  431. ⓪"FastStrings.Append (BakName, Pfad);
  432. ⓪ 
  433. ⓪"(* Alte Datei in .OLD umbenennen *)
  434. ⓪"IF (MakeBAK IN Puff^.Modus) THEN
  435. ⓪$FileNames.ConcatName (Pfad, 'OLD', BakName);
  436. ⓪$ok := Delete (BakName);
  437. ⓪$Rename (Pfad, BakName);
  438. ⓪"END (* IF ~MakeBAK *);
  439. ⓪"
  440. ⓪"(* Neue Datei anlegen: *)
  441. ⓪"
  442. ⓪"MausBusy;
  443. ⓪"
  444. ⓪"Create (Pfad, 0, filehandle);
  445. ⓪"IF filehandle < 0 THEN
  446. ⓪$Nachricht ('Fehler beim Erzeugen der .GME-Datei');
  447. ⓪$RETURN;
  448. ⓪"END (* IF Handle ungueltig *);
  449. ⓪"
  450. ⓪"(* Deskriptor-Record schreiben: *)
  451. ⓪"
  452. ⓪"LSIZE := PuffRecSize;
  453. ⓪"Write (filehandle, LSIZE, Puff);
  454. ⓪"
  455. ⓪"(* Merkinfo der festen Merkpunkte speichern: *)
  456. ⓪"
  457. ⓪"FOR mind := ErsteZeile TO LetztePosition DO
  458. ⓪$WITH Puff^.MerkPunkte [mind] DO
  459. ⓪&IF merkinfo # NIL THEN
  460. ⓪(WriteInfo (merkinfo);
  461. ⓪&END (* IF *);
  462. ⓪$END (* WITH *);
  463. ⓪"END (* FOR *);
  464. ⓪ 
  465. ⓪ (*
  466. ⓪"(* Merkpunktlisten speichern: *)
  467. ⓪"
  468. ⓪"FOR mind := ErsteZeile TO LetztePosition DO
  469. ⓪$IF mind IN listen THEN
  470. ⓪&WITH Puff^ DO
  471. ⓪(SaveMerkpunktListe (MerkPunkte [mind]);
  472. ⓪&END (* WITH *);
  473. ⓪$END (* IF mind IN listen *);
  474. ⓪"END (* FOR *);
  475. ⓪ *)
  476. ⓪"
  477. ⓪"(* Datei schliessen: *)
  478. ⓪"
  479. ⓪"ok := Close (filehandle);
  480. ⓪"MausEin; CursorEin;
  481. ⓪ END SaveConfig;
  482. ⓪ 
  483. ⓪ 
  484. ⓪ PROCEDURE TextVorhanden (Name: ARRAY OF CHAR): BOOLEAN;
  485. ⓪ VAR     h:              INTEGER;
  486. ⓪(ok:             BOOLEAN;
  487. ⓪ BEGIN
  488. ⓪"Open (Name, ORD (read), h);
  489. ⓪"IF h >= 0 THEN
  490. ⓪$ok := Close (h); RETURN TRUE;
  491. ⓪"ELSE RETURN FALSE;
  492. ⓪"END (* IF *);
  493. ⓪ END TextVorhanden;
  494. ⓪ 
  495. ⓪ PROCEDURE TextLoeschen (Name: ARRAY OF CHAR);
  496. ⓪ VAR     ok:             BOOLEAN;
  497. ⓪ BEGIN
  498. ⓪"ok := Delete (Name);
  499. ⓪ END TextLoeschen;
  500. ⓪ 
  501. ⓪ PROCEDURE ReInit (Puff: einPufferPointer);
  502. ⓪ (* Initialisiere Puffer nach LoadConfig, ohne ??? *)
  503. ⓪ VAR     merkindex:      MerkIndex;
  504. ⓪ BEGIN
  505. ⓪"WITH Puff^ DO
  506. ⓪$ZeilenAnzahl := 1; (* da sie durch Laden inkrementiert wird! *)
  507. ⓪$MerkPunkte [LaufendeZeile].zeilpos := 1;
  508. ⓪$AllocLine (Puffer, 0);
  509. ⓪$IF Puffer = NIL THEN RETURN; END;
  510. ⓪$WITH Puffer^ DO
  511. ⓪&AllocLine (naechste, 0);
  512. ⓪&naechste^.vorige := Puffer;
  513. ⓪$END (* WITH *);
  514. ⓪"END (* WITH *);
  515. ⓪"FOR merkindex := ErsteZeile TO LaufendeZeile DO
  516. ⓪$WITH Puff^.MerkPunkte [merkindex] DO
  517. ⓪&merkline := Puff^.Puffer^.naechste;
  518. ⓪$END (* WITH *);
  519. ⓪"END (* FOR *);
  520. ⓪ END ReInit;
  521. ⓪ 
  522. ⓪ VAR     expandBlankCompr:       BOOLEAN;
  523. ⓪ 
  524. ⓪ CONST DLE = 20C;
  525. ⓪&ctrlZ = CHR (26);
  526. ⓪ 
  527. ⓪(
  528. ⓪"PROCEDURE LiesPuffer (VAR index, ende: LONGCARD; texthandle: INTEGER);
  529. ⓪"(* Diese Routine liest möglichst schnell einen Textblock aus der Datei
  530. ⓪%"texthandle" in den internen Puffer (puffer). Dabei wird festgehalten,
  531. ⓪%wo das Ende des gültigen Textinhaltes steht (globaler Parameter ende).
  532. ⓪%"index" wird wieder auf Null gesetzt, außer es war vorher schon Null,
  533. ⓪%dann auf 1. Dann ist nämlich index > ende, was das Ende des Textes
  534. ⓪%bedeutet.
  535. ⓪#*)
  536. ⓪%
  537. ⓪"BEGIN
  538. ⓪$(*Trace ('LiesPuffer');*)
  539. ⓪$index := VAL (LONGCARD, cpuffer) + 1L; (* versuche, ganzen Block zu les. *)
  540. ⓪$Read (texthandle, index, ADDRESS (puffer)); (* wird i. d. R. cpuffer + 1 *)
  541. ⓪$(*Trace ('Read fertig');*)
  542. ⓪$ende := index;
  543. ⓪$(* Anzahl gelesener Zeichen, im Fehlerfall eigentlich negative LONGINT *)
  544. ⓪$IF (ende > (*VAL (LONGCARD, 0)*) 0L) THEN
  545. ⓪&(*Trace ('ende > 0');*)
  546. ⓪&index := (*VAL (LONGCARD, 0)*) 0L; DEC (ende); (* Da 0-based, ist der gueltige Index
  547. ⓪Adie Anzahl Zeichen - 1 *)
  548. ⓪>(* Index auf 0, um Puffer vom Anfang aus-
  549. ⓪Azulesen *)
  550. ⓪$ELSE index := 1; (* index > ende! *)
  551. ⓪$END (* IF *);
  552. ⓪$(*Trace ('LiesPuffer fertig');*)
  553. ⓪"END LiesPuffer;
  554. ⓪ 
  555. ⓪ PROCEDURE FastLen (    texthandle: INTEGER;
  556. ⓪3VAR index, ende: LONGCARD; TabWeite: CARDINAL;
  557. ⓪3VAR blanks, len, endindex: CARDINAL;
  558. ⓪3VAR zeilenende, dateiende: BOOLEAN): BOOLEAN;
  559. ⓪ (* Diese Funktion ermittelt die effektive Länge einer Zeile im Puffer.
  560. ⓪#Sie startet ab der globalen Variablen index und liefert den endindex
  561. ⓪#in Puffer. "len" ist die expandierte Länge, dh. die Länge der zu
  562. ⓪#kopierenden Zeile, wenn Tabs und DLE expandiert werden. Die Funktion
  563. ⓪#liefert TRUE, wenn Zeile ungültige Daten enthält
  564. ⓪!*)
  565. ⓪ VAR   end: CARDINAL;
  566. ⓪&error, first, fertig: BOOLEAN;
  567. ⓪ BEGIN
  568. ⓪"(*
  569. ⓪$endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);
  570. ⓪$len := 0; blanks := 0;
  571. ⓪$zeilenende := FALSE; fertig := FALSE;
  572. ⓪$IF dateiende OR (endindex > end) THEN RETURN FALSE; END;
  573. ⓪$error:= FALSE;
  574. ⓪$first:= TRUE;
  575. ⓪$REPEAT
  576. ⓪&CASE puffer^ [endindex] OF
  577. ⓪((* DLE darf nur am Zeilenanfang stehen... *)
  578. ⓪(DLE:    IF NOT first THEN
  579. ⓪2error:= TRUE;
  580. ⓪2fertig := TRUE;
  581. ⓪2zeilenende := TRUE;
  582. ⓪0INC (endindex); (* Skip DLE *) INC (index);
  583. ⓪0IF (endindex > end) THEN
  584. ⓪2LiesPuffer (index, ende, texthandle);
  585. ⓪2endindex := VAL (CARDINAL, index);
  586. ⓪2end := VAL (CARDINAL, ende);
  587. ⓪0END (* IF *);
  588. ⓪0IF (ORD (puffer^[endindex]) >= ORD (' ')) THEN
  589. ⓪2blanks := ORD (puffer^[endindex]) - ORD (' ');
  590. ⓪0ELSE
  591. ⓪2error:= TRUE;
  592. ⓪0END (* IF *);
  593. ⓪0INC (index);
  594. ⓪(|
  595. ⓪(lf:     INC (index); (* Skip Linefeed *);
  596. ⓪(|
  597. ⓪(tab:    INC (len,
  598. ⓪2TabWeite * ((len + blanks) DIV TabWeite + 1)
  599. ⓪3- len);
  600. ⓪(|
  601. ⓪(cr:     fertig := TRUE;
  602. ⓪0zeilenende := TRUE;
  603. ⓪(|
  604. ⓪(ctrlZ:  dateiende:= TRUE; fertig:= TRUE
  605. ⓪(|
  606. ⓪(ELSE    INC (len);
  607. ⓪&END (* CASE *);
  608. ⓪&first:= FALSE;
  609. ⓪&INC (endindex); IF endindex > end THEN fertig := TRUE; END;
  610. ⓪$UNTIL fertig;
  611. ⓪ *)
  612. ⓪"ASSEMBLER
  613. ⓪&; endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);
  614. ⓪&MOVE.L  index(A6),A0
  615. ⓪&MOVE.L  endindex(A6),A1
  616. ⓪&MOVE.L  (A0),D1
  617. ⓪&MOVE    D1,(A1)
  618. ⓪&MOVE.L  ende(A6),A0
  619. ⓪&MOVE.L  (A0),D2
  620. ⓪&MOVE    D2,end(A6)
  621. ⓪&; len := 0; blanks := 0;
  622. ⓪&MOVE.L  len(A6),A0
  623. ⓪&CLR     (A0)
  624. ⓪&MOVE.L  blanks(A6),A0
  625. ⓪&CLR     (A0)
  626. ⓪&; zeilenende := FALSE; fertig := FALSE; first:= TRUE; error:= FALSE;
  627. ⓪&MOVE.L  zeilenende(A6),A0
  628. ⓪&CLR     (A0)
  629. ⓪&CLR     first(A6)
  630. ⓪&CLR     error(A6)
  631. ⓪&; IF dateiende OR (endindex > end) THEN RETURN FALSE; END;
  632. ⓪&MOVE.L  dateiende(A6),A0
  633. ⓪&TST     (A0)
  634. ⓪&BNE.W   endRepeat
  635. ⓪&CMP.L   D2,D1
  636. ⓪&BLS     repeat
  637. ⓪&BRA.W   endRepeat
  638. ⓪ 
  639. ⓪&; REPEAT
  640. ⓪$repeat:
  641. ⓪&; CASE puffer^ [endindex] OF
  642. ⓪&MOVE.L  endindex(A6),A1
  643. ⓪&MOVE    (A1),D1
  644. ⓪&MOVE.L  puffer,A0
  645. ⓪&MOVE.B  0(A0,D1.W),D0
  646. ⓪ 
  647. ⓪&CMPI.B  #DLE,D0
  648. ⓪&BNE     noDLE
  649. ⓪ 
  650. ⓪&; IF ~first THEN <ende> END;
  651. ⓪&; INC (endindex); INC (index);
  652. ⓪&; IF (endindex > end) THEN
  653. ⓪&;   LiesPuffer (index, ende, texthandle);
  654. ⓪&;   endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);
  655. ⓪&; END (* IF *);
  656. ⓪&; blanks:= ORD (puffer^[endindex]) - ORD (' ');
  657. ⓪&; INC (index);
  658. ⓪&TAS     first(A6)
  659. ⓪&BPL     isfirst
  660. ⓪$isnotext:
  661. ⓪&; Garbage im File!
  662. ⓪&MOVE    #1,error(A6)
  663. ⓪&BRA.W   endOfLine
  664. ⓪$isfirst:
  665. ⓪&ADDQ    #1,D1             ; endindex
  666. ⓪&MOVE    D1,(A1)
  667. ⓪&MOVE.L  index(A6),A0
  668. ⓪&ADDQ.L  #1,(A0)
  669. ⓪&MOVE    end(A6),D0
  670. ⓪&CMP     D0,D1
  671. ⓪&BLS     not1
  672. ⓪&END;
  673. ⓪(LiesPuffer (index, ende, texthandle);
  674. ⓪&ASSEMBLER
  675. ⓪&MOVE.L  index(A6),A0
  676. ⓪&MOVE.L  endindex(A6),A1
  677. ⓪&MOVE.L  (A0),D1
  678. ⓪&MOVE    D1,(A1)
  679. ⓪&MOVE.L  ende(A6),A0
  680. ⓪&MOVE.L  (A0),D2
  681. ⓪&MOVE    D2,end(A6)
  682. ⓪$not1:
  683. ⓪&MOVE.L  puffer,A0
  684. ⓪&MOVE.L  endindex(A6),A1
  685. ⓪&MOVE    (A1),D1
  686. ⓪&MOVEQ   #0,D0
  687. ⓪&MOVE.B  0(A0,D1.W),D0
  688. ⓪&SUBI.B  #' ',D0
  689. ⓪&BCS     isnotext
  690. ⓪&MOVE.L  blanks(A6),A0
  691. ⓪&MOVE    D0,(A0)
  692. ⓪&MOVE.L  index(A6),A0
  693. ⓪&ADDQ.L  #1,(A0)
  694. ⓪&BRA.W   endCase
  695. ⓪ 
  696. ⓪$noDLE:
  697. ⓪&; lf:     INC (index); (* Skip Linefeed *);
  698. ⓪&CMPI.B  #lf,D0
  699. ⓪&BNE     noLF
  700. ⓪&MOVE.L  index(A6),A0
  701. ⓪&ADDQ.L  #1,(A0)
  702. ⓪&BRA.W   endCase
  703. ⓪ 
  704. ⓪$noLF:
  705. ⓪&; tab:  INC (len, TabWeite * ((len + blanks) DIV TabWeite + 1) - len);
  706. ⓪&CMPI.B  #tab,D0
  707. ⓪&BNE     noTAB
  708. ⓪&MOVE    TabWeite(A6),D1
  709. ⓪&MOVE    D1,D2
  710. ⓪&ADDQ    #1,D2
  711. ⓪&MOVE.L  len(A6),A0
  712. ⓪&MOVE.W  (A0),D0
  713. ⓪&MOVE.L  blanks(A6),A0
  714. ⓪&ADD     (A0),D0
  715. ⓪&MULU    D1,D0
  716. ⓪&DIVU    D2,D0
  717. ⓪&MOVE.L  len(A6),A0
  718. ⓪&SUB     (A0),D0
  719. ⓪&ADD     D0,(A0)
  720. ⓪&BRA     endCase
  721. ⓪ 
  722. ⓪$noTAB:
  723. ⓪&; cr:     fertig := TRUE; zeilenende := TRUE;
  724. ⓪&CMPI.B  #cr,D0
  725. ⓪&BNE     noCR
  726. ⓪ 
  727. ⓪$endOfLine
  728. ⓪&MOVE.L  zeilenende(A6),A0
  729. ⓪&MOVE    #1,(A0)
  730. ⓪&MOVE.L  endindex(A6),A0
  731. ⓪&ADDQ    #1,(A0)
  732. ⓪&BRA     endRepeat
  733. ⓪ 
  734. ⓪$noCR:
  735. ⓪&CMPI.B  #ctrlZ,D0
  736. ⓪&BNE     noEOF
  737. ⓪&
  738. ⓪&MOVE.L  dateiende(A6),A0
  739. ⓪&MOVE    #1,(A0)
  740. ⓪&BRA     endRepeat
  741. ⓪&
  742. ⓪$noEOF:
  743. ⓪&MOVE.L  len(A6),A0
  744. ⓪&ADDQ    #1,(A0)
  745. ⓪ 
  746. ⓪$endCase:
  747. ⓪&; INC (endindex); IF endindex > end THEN fertig := TRUE; END;
  748. ⓪&MOVE.L  endindex(A6),A0
  749. ⓪&ADDQ    #1,(A0)
  750. ⓪&MOVE    (A0),D0
  751. ⓪&MOVE    end(A6),D1
  752. ⓪&CMP     D1,D0
  753. ⓪&BHI     endRepeat
  754. ⓪ 
  755. ⓪&; UNTIL fertig;
  756. ⓪&BRA     repeat
  757. ⓪ 
  758. ⓪$endRepeat:
  759. ⓪"END;
  760. ⓪"RETURN error
  761. ⓪ END FastLen;
  762. ⓪ 
  763. ⓪ PROCEDURE FastCopyExpand (VAR index, ende: LONGCARD; texthandle: INTEGER;
  764. ⓪:TabWeite: CARDINAL;
  765. ⓪:blanks, laenge, end: CARDINAL; VAR z: ARRAY OF CHAR);
  766. ⓪ (* Kopiert Zeile oder Zeilenteil von
  767. ⓪#start..end aus puffer^ in Zielstring. Expandiert Tab-Codes.
  768. ⓪ *)
  769. ⓪ VAR   ztab:           CARDINAL;
  770. ⓪&start, zindex:  CARDINAL;
  771. ⓪ BEGIN
  772. ⓪ (*
  773. ⓪$zindex := 0;
  774. ⓪$start := VAL (CARDINAL, index); laenge := laenge + blanks;
  775. ⓪ 
  776. ⓪$(* !JL 11. 12. 90 *)
  777. ⓪$IF laenge > HIGH (z) THEN
  778. ⓪&Nachricht ('Sourcezeile ist zu lang!');
  779. ⓪&laenge := HIGH (z);
  780. ⓪$END (* IF *);
  781. ⓪$
  782. ⓪$WHILE blanks > zindex DO
  783. ⓪&z [zindex] := ' '; INC (zindex);
  784. ⓪$END (* WHILE *);
  785. ⓪$WHILE zindex < laenge DO
  786. ⓪&CASE puffer^[start] OF
  787. ⓪(tab:    ztab := TabWeite * (zindex DIV TabWeite + 1);
  788. ⓪0WHILE (zindex < ztab) DO
  789. ⓪2z [zindex] := ' '; INC (zindex);
  790. ⓪0END (* WHILE *);
  791. ⓪(|
  792. ⓪(ELSE    z [zindex] := puffer^[start]; INC (zindex);
  793. ⓪&END (* CASE *);
  794. ⓪&INC (start);
  795. ⓪$END (* WHILE *);
  796. ⓪$z [zindex] := nul;
  797. ⓪$index := VAL (LONGCARD, end);
  798. ⓪$IF index > ende THEN
  799. ⓪&LiesPuffer (index, ende, texthandle);
  800. ⓪$END;
  801. ⓪ *)
  802. ⓪"ASSEMBLER
  803. ⓪&; zindex := 0;
  804. ⓪&; start := VAL (CARDINAL, index); laenge := laenge + blanks;
  805. ⓪&MOVE.L  index(A6),A0
  806. ⓪&MOVE.L  (A0),D0
  807. ⓪&MOVE    D0,start(A6)
  808. ⓪&MOVE    blanks(A6),D0
  809. ⓪&ADD     D0,laenge(A6)
  810. ⓪&
  811. ⓪&; IF laenge > HIGH (z) THEN
  812. ⓪&;   Nachricht ('Sourcezeile ist zu lang!');
  813. ⓪&;   laenge := HIGH (z);
  814. ⓪&; END;
  815. ⓪&MOVE.W  laenge(A6),D1
  816. ⓪&CMP.W   z+4(A6),D1
  817. ⓪&BLS     nope
  818. ⓪&MOVE.W  z+4(A6),laenge(A6)
  819. ⓪&END;
  820. ⓪(Nachricht ('Sourcezeile ist zu lang!');
  821. ⓪&ASSEMBLER
  822. ⓪$nope:
  823. ⓪&
  824. ⓪&; WHILE blanks > zindex DO z [zindex] := ' '; INC (zindex); END
  825. ⓪&MOVE    blanks(A6),D0
  826. ⓪&MOVEQ   #0,D1
  827. ⓪&MOVE.L  z(A6),A2
  828. ⓪$while1:
  829. ⓪&CMP     D1,D0
  830. ⓪&BLS     endWhile1
  831. ⓪&MOVE.B  #' ',(A2)+
  832. ⓪&ADDQ    #1,D1
  833. ⓪&BRA     while1
  834. ⓪$endWhile1:
  835. ⓪ 
  836. ⓪$while2:
  837. ⓪&; WHILE zindex < laenge DO
  838. ⓪&MOVE    laenge(A6),D0
  839. ⓪&CMP     D1,D0
  840. ⓪&BLS.W   endWhile2
  841. ⓪&; CASE puffer^[start] OF
  842. ⓪&MOVE.L  puffer,A0
  843. ⓪&MOVE    start(A6),D0
  844. ⓪&MOVE.B  0(A0,D0.W),D0
  845. ⓪&; tab:  ztab := TabWeite * (zindex DIV TabWeite + 1);
  846. ⓪&;       WHILE (zindex < ztab) DO z [zindex] := ' '; INC (zindex); END
  847. ⓪&CMPI.B  #tab,D0
  848. ⓪&BNE     noTAB
  849. ⓪&MOVE    TabWeite(A6),D0
  850. ⓪&ADDQ    #1,D0
  851. ⓪&MOVEQ   #0,D2
  852. ⓪&MOVE    D1,D2
  853. ⓪&DIVU    D0,D2
  854. ⓪&MULU    TabWeite(A6),D2
  855. ⓪$while3:
  856. ⓪&CMP     D1,D2
  857. ⓪&BLS     endWhile3
  858. ⓪&MOVE.B  #' ',(A2)+
  859. ⓪&ADDQ    #1,D1
  860. ⓪&BRA     while3
  861. ⓪$endWhile3:
  862. ⓪&BRA     endCase
  863. ⓪ 
  864. ⓪$noTAB:
  865. ⓪&; ELSE    z [zindex] := puffer^[start]; INC (zindex);
  866. ⓪&MOVE.B  D0,(A2)+
  867. ⓪&ADDQ    #1,D1
  868. ⓪ 
  869. ⓪$endCase:
  870. ⓪&; END (* CASE *);
  871. ⓪&; INC (start);
  872. ⓪&ADDQ    #1,start(A6)
  873. ⓪&BRA     while2
  874. ⓪ 
  875. ⓪$endWhile2:
  876. ⓪&; z [zindex] := nul;
  877. ⓪&CLR.B   (A2)+
  878. ⓪>; MOVE.L  zindex(A6),A0
  879. ⓪>; MOVE    D1,(A0)
  880. ⓪&; index := VAL (LONGCARD, end);
  881. ⓪&MOVEQ   #0,D0
  882. ⓪&MOVE    end(A6),D0
  883. ⓪&MOVE.L  index(A6),A0
  884. ⓪&MOVE.L  D0,(A0)
  885. ⓪&; IF index > ende THEN
  886. ⓪&;   LiesPuffer (index, ende, texthandle);
  887. ⓪&; END;
  888. ⓪&MOVE.L  ende(A6),A0
  889. ⓪&CMP.L   (A0),D0
  890. ⓪&BLS     noLies
  891. ⓪&END;
  892. ⓪(LiesPuffer (index, ende, texthandle);
  893. ⓪&ASSEMBLER
  894. ⓪$noLies:
  895. ⓪"END (* Assembler *)
  896. ⓪ END FastCopyExpand;
  897. ⓪!
  898. ⓪ PROCEDURE TextLesen (Puff: einPufferPointer; initialisiere: BOOLEAN;
  899. ⓪5frage, loadconfig, message: BOOLEAN);
  900. ⓪ (* Stellt yoffset auf 0 *)
  901. ⓪ 
  902. ⓪ VAR     z, z2:          eineZeile;
  903. ⓪(indent:         Moden;  (* Menge der Zustaende von Puff *)
  904. ⓪(Info:           eineInfo;
  905. ⓪(pf, na:         eineInfo;
  906. ⓪(dummys:         eineInfo;
  907. ⓪!
  908. ⓪(index, ende:    LONGCARD;
  909. ⓪(zindex:      CARDINAL;
  910. ⓪(ok:             BOOLEAN;
  911. ⓪(texthandle:     INTEGER;
  912. ⓪(dummy, dum:     CHAR;
  913. ⓪(button:         INTEGER;
  914. ⓪(nulldeleted:    BOOLEAN;
  915. ⓪(tabsgefiltert:  BOOLEAN;
  916. ⓪(tabsfiltern:    BOOLEAN;
  917. ⓪(dot:            ARRAY [0..0] OF CHAR; (* Compilerfehler! *)
  918. ⓪(
  919. ⓪(zlaenge, endindex,
  920. ⓪(blanks:         CARDINAL;
  921. ⓪(dateiende:      BOOLEAN;
  922. ⓪(zeilenende:     BOOLEAN; (* Zeilenende steht im Puffer *)
  923. ⓪ 
  924. ⓪ VAR     PName:                                  eineInfo;
  925. ⓪(AlteZeilenNummer:                       CARDINAL;
  926. ⓪(erstezeilpos, erstecharpos, laufendezeilpos,
  927. ⓪(laufendecharpos:                        CARDINAL;
  928. ⓪(nextpuff:                               einPufferPointer;
  929. ⓪(helpline:                               einLinePointer;
  930. ⓪(OldPfad:                                eineInfo;
  931. ⓪(Message:                                ARRAY [0..60] OF CHAR;
  932. ⓪(dname:                                  eineInfo;
  933. ⓪(suff:                                   ARRAY [0..3] OF CHAR;
  934. ⓪(h:                                      CARDINAL;
  935. ⓪(timeptr:                                ADDRESS;
  936. ⓪ 
  937. ⓪ PROCEDURE keinTextNachricht;
  938. ⓪"BEGIN
  939. ⓪$Nachricht ('Dies ist kein Text!');
  940. ⓪"END keinTextNachricht;
  941. ⓪ 
  942. ⓪ BEGIN (* TextLesen *)
  943. ⓪"nulldeleted := FALSE; tabsgefiltert := FALSE;
  944. ⓪"tabsfiltern := (* TabFiltern IN Puff^.Modus; *) TRUE;
  945. ⓪"expandBlankCompr := TRUE; (*DLECompr IN Puff^.Modus; *)
  946. ⓪"IF message THEN CursorAus; END;
  947. ⓪"REPEAT
  948. ⓪$IF message THEN
  949. ⓪&LoescheBild;
  950. ⓪&SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);
  951. ⓪&GotoXY (0, 0);
  952. ⓪$END (* IF message *);
  953. ⓪$IF (Editiert IN Puff^.Modus) & initialisiere THEN
  954. ⓪&IF ~FrageJaNein (Ja, 'Puffer wurde editiert|Überschreiben?')
  955. ⓪&THEN RETURN END;
  956. ⓪&LoescheBild;
  957. ⓪$END (* IF Puffer nicht leer *);
  958. ⓪$IF Puff^.Pfad [0] = nul THEN
  959. ⓪&SplitFileName (GlobalPfad, Puff^.Pfad, dname, suff);
  960. ⓪&IF suff [0] = nul THEN Append ('*.*', Puff^.Pfad, ok);
  961. ⓪&ELSE Append ('*.', Puff^.Pfad, ok); FastStrings.Append (suff, Puff^.Pfad);
  962. ⓪&END (* IF suff *);
  963. ⓪$END (* IF *);
  964. ⓪$Info := Puff^.Pfad; DeleteTail (Info);
  965. ⓪$FastStrings.Append (Puff^.Name, Info);
  966. ⓪$IF message THEN
  967. ⓪&HighLight; WriteConst (version); Normal; WriteLn; WriteLn;
  968. ⓪&IF initialisiere THEN Message := 'File lesen';
  969. ⓪&ELSE Message := 'Block lesen';
  970. ⓪&END;
  971. ⓪&HighLight; WriteConst (Info); Normal;
  972. ⓪&WriteLn;
  973. ⓪&WriteLn;
  974. ⓪$END (* IF message *);
  975. ⓪$IF frage THEN
  976. ⓪&PName := Puff^.Name;
  977. ⓪&GetDirectory (Puff^.Pfad, Puff^.Name, Message, button, FALSE);
  978. ⓪&IF button # 1 THEN
  979. ⓪(IF ~initialisiere THEN
  980. ⓪*Puff^.Name := PName;
  981. ⓪(ELSE Puff^.Name [0] := nul;
  982. ⓪(END;
  983. ⓪(RETURN;
  984. ⓪&END;
  985. ⓪&GlobalPfad := Puff^.Pfad;
  986. ⓪&MausEin;
  987. ⓪&Info := Puff^.Pfad; DeleteTail (Info);
  988. ⓪&FastStrings.Append (Puff^.Name, Info);
  989. ⓪$ELSE MausEin;
  990. ⓪$END (* IF frage *);
  991. ⓪$Paths.SearchFile (Info, ShellMsg.SrcPaths, Paths.fromStart, ok, Info);
  992. ⓪$IF ok THEN FileNames.SplitPath (Info, Puff^.Pfad, Puff^.Name); END;
  993. ⓪$Open (Info, ORD (read), texthandle);
  994. ⓪$frage := TRUE;
  995. ⓪"UNTIL (texthandle >= 0);
  996. ⓪"IF texthandle >= 0  THEN
  997. ⓪$WITH Puff^ DO
  998. ⓪'pf := Pfad; na := Name;
  999. ⓪'IF initialisiere THEN
  1000. ⓪)Loeschen (Puff);
  1001. ⓪)Pfad := pf; Name := na;
  1002. ⓪'END (* IF *);
  1003. ⓪'indent := Modus;
  1004. ⓪'EXCL (Modus, AutoIndent);
  1005. ⓪'dateiende:= FALSE;
  1006. ⓪'index := 0; ende := 0;
  1007. ⓪ 
  1008. ⓪ (****************************** Abspeichern von *.GME ***********************)
  1009. ⓪'IF loadconfig THEN
  1010. ⓪)nextpuff := NaechsterPuffer;
  1011. ⓪)LoadConfig (Puff, FALSE, message);
  1012. ⓪)(* Änderung 10. 6. 89: *)
  1013. ⓪)loadconfig := KonfigSpeichern IN Modus;
  1014. ⓪)(* ******************* *)
  1015. ⓪)indent := Modus;
  1016. ⓪)Pfad := pf; Name := na;
  1017. ⓪)erstezeilpos := MerkPunkte [ErsteZeile].zeilpos;
  1018. ⓪)erstecharpos := MerkPunkte [ErsteZeile].charpos;
  1019. ⓪)laufendezeilpos := MerkPunkte  [LaufendeZeile].zeilpos;
  1020. ⓪)laufendecharpos := MerkPunkte  [LaufendeZeile].charpos;
  1021. ⓪)ReInit (Puff);
  1022. ⓪'END (* IF loadconfig *);
  1023. ⓪ 
  1024. ⓪'IF message THEN
  1025. ⓪)WriteConst ('Text laden');
  1026. ⓪'END;
  1027. ⓪'IF puffer = NIL THEN
  1028. ⓪)Nachricht ('Speicher reicht|nicht für Puffer');
  1029. ⓪)RETURN;
  1030. ⓪'END (* IF *);
  1031. ⓪'LiesPuffer (index, ende, texthandle);
  1032. ⓪'IF FastLen (texthandle, index, ende, TabWeite,
  1033. ⓪,blanks, zlaenge, endindex, zeilenende, dateiende) THEN
  1034. ⓪)keinTextNachricht; RETURN;
  1035. ⓪'END;
  1036. ⓪'FastCopyExpand (index, ende, texthandle, TabWeite, blanks, zlaenge, endindex, z);
  1037. ⓪'IF ~zeilenende THEN
  1038. ⓪)IF FastLen (texthandle, index, ende, TabWeite,
  1039. ⓪0blanks, zlaenge, endindex, zeilenende, dateiende) THEN
  1040. ⓪+keinTextNachricht; RETURN;
  1041. ⓪)END;
  1042. ⓪)FastCopyExpand (index, ende, texthandle, TabWeite,
  1043. ⓪9blanks, zlaenge, endindex, z2);
  1044. ⓪)FastStrings.Append (z2, z);
  1045. ⓪'END;
  1046. ⓪'(* *)
  1047. ⓪'IF initialisiere THEN
  1048. ⓪)PutLine (MerkPunkte [LaufendeZeile].merkline, z);
  1049. ⓪'ELSE
  1050. ⓪)LineUp (Puff);
  1051. ⓪)InsertLine (Puff, z, FALSE, FALSE, ~initialisiere);
  1052. ⓪'END (* IF *);
  1053. ⓪'IF message THEN
  1054. ⓪)GotoXY (38, 12); HighLight; (* CursorAus; *)
  1055. ⓪)WriteConst ('   0'); MausBusy;
  1056. ⓪'END;
  1057. ⓪'AlteZeilenNummer := 1;
  1058. ⓪'z:= '';
  1059. ⓪'LOOP
  1060. ⓪)IF index > ende THEN
  1061. ⓪+(*Nachricht ('EXIT 1');*)
  1062. ⓪+EXIT
  1063. ⓪)END;
  1064. ⓪)IF FastLen (texthandle, index, ende, TabWeite,
  1065. ⓪1blanks, zlaenge, endindex, zeilenende, dateiende) THEN
  1066. ⓪+keinTextNachricht; EXIT;
  1067. ⓪)END;
  1068. ⓪)(* *)
  1069. ⓪)WITH MerkPunkte [LaufendeZeile] DO
  1070. ⓪+WITH merkline^ DO
  1071. ⓪ 
  1072. ⓪ (********** INLINE-Code fuer einen Sonderfall von InsertLine **********)
  1073. ⓪(
  1074. ⓪-IF initialisiere & zeilenende THEN
  1075. ⓪/NEW (helpline);
  1076. ⓪/IF helpline # NIL THEN
  1077. ⓪1helpline^.terminator [0] := nul;
  1078. ⓪1zindex := zlaenge + blanks;
  1079. ⓪1IF zindex > 0 THEN
  1080. ⓪3WITH helpline^ DO
  1081. ⓪5laenge := (zindex DIV cgrain + 1) * cgrain;
  1082. ⓪!
  1083. ⓪5ALLOCATE (ZeilPointer, VAL (LONGCARD, laenge));
  1084. ⓪5IF ZeilPointer = NIL THEN
  1085. ⓪7DISPOSE (helpline);
  1086. ⓪7Nachricht ('Speicher reicht nicht 1');
  1087. ⓪7EXIT;
  1088. ⓪5ELSE
  1089. ⓪7FastCopyExpand (index, ende, texthandle, TabWeite,
  1090. ⓪Gblanks, zlaenge, endindex, ZeilPointer^);
  1091. ⓪7(* *)
  1092. ⓪7INC (zeilpos); INC (ZeilenAnzahl);
  1093. ⓪5END (* IF noch Speicher *);
  1094. ⓪3END (* WITH *);
  1095. ⓪1ELSE
  1096. ⓪3WITH helpline^ DO
  1097. ⓪5ZeilPointer := ADR (terminator);
  1098. ⓪5laenge := 0;
  1099. ⓪3END (* WITH *);
  1100. ⓪3INC (zeilpos); INC (ZeilenAnzahl);
  1101. ⓪ 
  1102. ⓪3(* Pufferindex weiterschalten!!! *)
  1103. ⓪3FastCopyExpand (index, ende, texthandle, TabWeite,
  1104. ⓪Cblanks, zlaenge, endindex, z2);
  1105. ⓪3(* Dummy-Aufruf zur Zeilenweiterschaltung *)
  1106. ⓪,
  1107. ⓪1END;
  1108. ⓪1IF zeilpos > AlteZeilenNummer THEN
  1109. ⓪3helpline^.vorige := merkline;
  1110. ⓪3helpline^.naechste := NIL;
  1111. ⓪3naechste := helpline;
  1112. ⓪3merkline := helpline;
  1113. ⓪1END (* IF *);
  1114. ⓪/ELSE Nachricht ('Speicher reicht nicht 2');
  1115. ⓪4EXIT;
  1116. ⓪/END (* IF # NIL *);
  1117. ⓪ 
  1118. ⓪ (********** INLINE-Code fuer einen Sonderfall von InsertLine **********)
  1119. ⓪ 
  1120. ⓪-ELSE
  1121. ⓪/(* *)
  1122. ⓪/FastCopyExpand (index, ende, texthandle, TabWeite,
  1123. ⓪?blanks, zlaenge, endindex, z);
  1124. ⓪/IF ~zeilenende THEN
  1125. ⓪1IF FastLen (texthandle, index, ende, TabWeite,
  1126. ⓪5blanks, zlaenge, endindex, zeilenende, dateiende) THEN
  1127. ⓪3keinTextNachricht; EXIT;
  1128. ⓪1END;
  1129. ⓪1FastCopyExpand (index, ende, texthandle, TabWeite,
  1130. ⓪Ablanks, zlaenge, endindex, z2);
  1131. ⓪1FastStrings.Append (z2, z);
  1132. ⓪/END;
  1133. ⓪ 
  1134. ⓪/IF zeilenende OR dateiende OR (index > ende) THEN
  1135. ⓪1InsertLine (Puff, z, FALSE, FALSE, ~initialisiere);
  1136. ⓪/ELSE (* Textende *)
  1137. ⓪1(*Nachricht ('EXIT 2');*)
  1138. ⓪1EXIT;
  1139. ⓪/END (* IF *);
  1140. ⓪/IF dateiende THEN EXIT END;
  1141. ⓪-END (* IF initialisiere *);
  1142. ⓪-IF zeilpos > AlteZeilenNummer THEN
  1143. ⓪/AlteZeilenNummer := zeilpos
  1144. ⓪-ELSE
  1145. ⓪/Nachricht ('Speicher reicht nicht! 3');
  1146. ⓪/EXIT;
  1147. ⓪-END (* IF ZeilenNummer *);
  1148. ⓪+END (* WITH merkline^ *);
  1149. ⓪)END (* WITH *);
  1150. ⓪)IF message & (ZeilenAnzahl MOD 50 = 0) THEN
  1151. ⓪+CursorAus; MausAus; GotoXY (38, 12);
  1152. ⓪+ConvCard (MerkPunkte [LaufendeZeile].zeilpos, 4, dummys);
  1153. ⓪+WriteConst (dummys); MausBusy;
  1154. ⓪)END (* IF *);
  1155. ⓪'END (* LOOP *);
  1156. ⓪'IF message THEN Normal; END;
  1157. ⓪'(*GetDateTime (texthandle, fullDate, fullTime);
  1158. ⓪'datum:= Clock.PackDate (fullDate);
  1159. ⓪'tageszeit:= Clock.PackTime (fullTime)
  1160. ⓪'*)
  1161. ⓪'timeptr := ADR (tageszeit);
  1162. ⓪'DaTime (texthandle, timeptr, getTime);
  1163. ⓪'
  1164. ⓪'ok := Close (texthandle);
  1165. ⓪'Modus := indent;
  1166. ⓪$END (* WITH *);
  1167. ⓪$IF nulldeleted  & message THEN
  1168. ⓪&Nachricht ('Null-Characters ausgefiltert!');
  1169. ⓪$END (* IF *);
  1170. ⓪$IF tabsgefiltert & message THEN
  1171. ⓪&Nachricht ('Tab-Zeichen ausgefiltert!');
  1172. ⓪$END (* IF *);
  1173. ⓪"ELSE LoescheBild; HighLight;
  1174. ⓪'Assign ('Datei "', dummys, ok); FastStrings.Append (Info, dummys);
  1175. ⓪'Append ('"|nicht vorhanden!', dummys, ok);
  1176. ⓪'Nachricht (dummys);
  1177. ⓪'Info := "Neue Datei: ";
  1178. ⓪"END (* IF File *);
  1179. ⓪"IF initialisiere THEN
  1180. ⓪$WITH Puff^ DO (* Nach Lesen wieder auf Anfang einstellen *)
  1181. ⓪$
  1182. ⓪&IF loadconfig THEN (* wenn oben auskommentiert... *)
  1183. ⓪((* WriteConst ('restaurieren'); *)
  1184. ⓪(NaechsterPuffer := nextpuff;
  1185. ⓪(MerkPunkte [ErsteZeile].zeilpos := erstezeilpos;
  1186. ⓪(MerkPunkte [ErsteZeile].charpos := erstecharpos;
  1187. ⓪(MerkPunkte [LaufendeZeile].zeilpos := laufendezeilpos;
  1188. ⓪(MerkPunkte [LaufendeZeile].charpos := laufendecharpos;
  1189. ⓪((* ReAdjustMerkpointer (Puff); *)
  1190. ⓪ 
  1191. ⓪(StelleZeileEin (Puff, laufendezeilpos, laufendezeilpos - erstezeilpos);
  1192. ⓪&ELSE
  1193. ⓪(MerkPunkte [ErsteZeile].zeilpos := 0;
  1194. ⓪(MerkPunkte [LaufendeZeile].charpos := 0;
  1195. ⓪(MerkPunkte [LaufendeZeile].zeilpos := 1;
  1196. ⓪(MerkPunkte [LaufendeZeile].merkline := Puffer^.naechste;
  1197. ⓪(MerkPunkte [ErsteZeile].merkline := Puffer^.naechste;
  1198. ⓪&END (* IF loadconfig *);
  1199. ⓪&
  1200. ⓪$END (* WITH *);
  1201. ⓪"ELSE StelleZeileEin (Puff, Puff^.MerkPunkte [LaufendeZeile].zeilpos,
  1202. ⓪7LinesOnScreen DIV 2);
  1203. ⓪"END (* IF *);
  1204. ⓪"WITH Puff^ DO
  1205. ⓪$EXCL (Modus, Exit); EXCL (Modus, Editiert); EXCL (Modus, BlockIstMarkiert);
  1206. ⓪$EXCL (Modus, Compiliert);
  1207. ⓪$MerkPunkte [CompilerInfo].charpos := 0;
  1208. ⓪$MerkPunkte [CompilerInfo].zeilpos := 1;
  1209. ⓪$MerkPunkte [CompilerInfo].merkline := Puffer^.naechste;
  1210. ⓪"END (* WITH *);
  1211. ⓪"Trace ('TextLesen fertig');
  1212. ⓪ END TextLesen;
  1213. ⓪ 
  1214. ⓪ PROCEDURE TextSchreiben (Puff: einPufferPointer; backup, markiert,
  1215. ⓪9frage, saveconfig, controlfil: BOOLEAN;
  1216. ⓪9VAR erfolgreich: BOOLEAN);
  1217. ⓪ (* 'erfolgreich' ist auch TRUE, wenn "Abbruch" beim Selektor gewählt wurde! *)
  1218. ⓪ VAR     Help:                   einLinePointer;
  1219. ⓪(i:                      CARDINAL;
  1220. ⓪(Info:                   eineInfo;
  1221. ⓪(BakName:                eineInfo;
  1222. ⓪(oldPfad, oldName:       eineInfo;
  1223. ⓪ 
  1224. ⓪(index:                  LONGCARD;
  1225. ⓪(ok:                     BOOLEAN;
  1226. ⓪(texthandle:                      INTEGER;
  1227. ⓪(rest:                   eineZeile;
  1228. ⓪(ende:                   BOOLEAN;
  1229. ⓪(button:                 INTEGER;
  1230. ⓪ 
  1231. ⓪"PROCEDURE SchreibPuffer (texthandle: INTEGER): BOOLEAN;
  1232. ⓪"VAR   count:  LONGCARD;
  1233. ⓪(ok:  BOOLEAN;
  1234. ⓪"BEGIN
  1235. ⓪$(* GEMDOS-Funktion 40H, D0 = Resultat (LONGINT) *)
  1236. ⓪$count := index;
  1237. ⓪$Write (texthandle, count, ADDRESS (puffer));
  1238. ⓪$ok := count = index;
  1239. ⓪$(* count sollte negative LONGINT sein, wenn Fehlermeldung,
  1240. ⓪'sonst Echo der geschriebenen Anzahl *)
  1241. ⓪$index := VAL (LONGCARD, 0); (* Puffer wieder vom Anfang her beschreiben *)
  1242. ⓪$RETURN ok;
  1243. ⓪"END SchreibPuffer;
  1244. ⓪!
  1245. ⓪"PROCEDURE SchreibZeile (texthandle: INTEGER; REF z: ARRAY OF CHAR;
  1246. ⓪:keinZeilenEndeAnfuegen: BOOLEAN; VAR ok: BOOLEAN);
  1247. ⓪"VAR   (*$Reg*)zindex: CARDINAL;
  1248. ⓪((*$Reg*)l:      CARDINAL;
  1249. ⓪((*$Reg*)ztab:   CARDINAL;
  1250. ⓪((*$Reg*)ind:    CARDINAL;
  1251. ⓪"BEGIN
  1252. ⓪"
  1253. ⓪$zindex := 0; (* Stringanfang *)
  1254. ⓪$(* Zeileninhalt in Puffer schreiben: *)
  1255. ⓪$l := LENGTH (z); (* Laenge des Strings - um 1 groesser als max. Index *)
  1256. ⓪$ok := TRUE;
  1257. ⓪$ind := VAL (CARDINAL, index);
  1258. ⓪$WHILE (ind <= cpuffer) & (zindex < l) & ok DO
  1259. ⓪&IF (z [zindex] < 40C) THEN
  1260. ⓪(IF (z [zindex] = tab) & (TabFiltern IN Puff^.Modus) THEN
  1261. ⓪*ztab := Puff^.TabWeite * ((zindex DIV Puff^.TabWeite) + 1);
  1262. ⓪*WHILE (ztab > 0) & ok DO
  1263. ⓪,puffer^ [ind] := ' '; INC (ind); DEC (ztab);
  1264. ⓪,IF (ind > cpuffer) & ok THEN
  1265. ⓪.index := VAL (LONGCARD, ind);
  1266. ⓪.ok := SchreibPuffer (texthandle);
  1267. ⓪.ind := 0;
  1268. ⓪,END;
  1269. ⓪*END (* WHILE *);
  1270. ⓪*INC (ind);
  1271. ⓪(ELSIF ~controlfil THEN
  1272. ⓪*puffer^ [ind] := z [zindex]; INC (ind);
  1273. ⓪(END (* IF Control-Code *);
  1274. ⓪&ELSE
  1275. ⓪(puffer^ [ind] := z [zindex]; INC (ind);
  1276. ⓪&END (* IF Tab *);
  1277. ⓪&INC (zindex);
  1278. ⓪&IF (ind > cpuffer) & ok THEN
  1279. ⓪(index := VAL (LONGCARD, ind);
  1280. ⓪(ok := SchreibPuffer (texthandle);
  1281. ⓪(ind := 0;
  1282. ⓪&END (* IF *);
  1283. ⓪$END (* WHILE *);
  1284. ⓪$IF ok & NOT keinZeilenEndeAnfuegen THEN
  1285. ⓪&(* cr schreiben: *)
  1286. ⓪&puffer^ [ind] := cr; INC (ind);
  1287. ⓪&IF (ind > cpuffer) & ok THEN
  1288. ⓪(index := VAL (LONGCARD, ind);
  1289. ⓪(ok := SchreibPuffer (texthandle);
  1290. ⓪(ind := 0;
  1291. ⓪&END (* IF *);
  1292. ⓪&(* lf schreiben: *)
  1293. ⓪&puffer^ [ind] := lf; INC (ind);
  1294. ⓪&IF (ind > cpuffer) & ok THEN
  1295. ⓪(index := VAL (LONGCARD, ind);
  1296. ⓪(ok := SchreibPuffer (texthandle);
  1297. ⓪(ind := 0;
  1298. ⓪&END (* IF *);
  1299. ⓪$END;
  1300. ⓪$index := VAL (LONGCARD, ind);
  1301. ⓪"END SchreibZeile;
  1302. ⓪ 
  1303. ⓪ VAR     PName:          eineInfo;
  1304. ⓪(dummy:          CHAR;
  1305. ⓪(dummys:         eineInfo;
  1306. ⓪(dot:            ARRAY [0..0] OF CHAR; (* Compilerfehler! *)
  1307. ⓪(Message:        ARRAY [0..60] OF CHAR;
  1308. ⓪(timeptr:        ADDRESS;
  1309. ⓪ 
  1310. ⓪ BEGIN (* TextSchreiben *)
  1311. ⓪"erfolgreich:= FALSE;
  1312. ⓪"WriteChar (bel);
  1313. ⓪"IF (Puff^.Puffer^.naechste^.naechste = NIL) &
  1314. ⓪%(Puff^.Puffer^.naechste^.ZeilPointer^[0] = nul) THEN
  1315. ⓪$erfolgreich:= TRUE;
  1316. ⓪$RETURN
  1317. ⓪"END (* IF Puffer leer *);
  1318. ⓪"CursorAus;
  1319. ⓪"REPEAT
  1320. ⓪$REPEAT
  1321. ⓪&Info := Puff^.Pfad; DeleteTail (Info);
  1322. ⓪&FastStrings.Append (Puff^.Name, Info);
  1323. ⓪&oldPfad := Puff^.Pfad; oldName := Puff^.Name;
  1324. ⓪&GotoXY (0, 0);
  1325. ⓪&HighLight; WriteConst (version); Normal; LoescheZeile;
  1326. ⓪&WriteLn; LoescheZeile; WriteLn; LoescheZeile;
  1327. ⓪&IF markiert THEN Message := 'Fileblock schreiben';
  1328. ⓪&ELSE Message := 'File schreiben';
  1329. ⓪&END;
  1330. ⓪&HighLight;
  1331. ⓪&WriteConst (Info); Normal;
  1332. ⓪&IF frage THEN
  1333. ⓪(PName := Puff^.Name;
  1334. ⓪(GetDirectory (Puff^.Pfad, Puff^.Name, Message, button, FALSE);
  1335. ⓪(IF button # 1 THEN
  1336. ⓪*Puff^.Name := PName;
  1337. ⓪*erfolgreich:= TRUE;
  1338. ⓪*RETURN;
  1339. ⓪(END;
  1340. ⓪(MausEin;
  1341. ⓪&ELSE MausEin;
  1342. ⓪&END (* IF frage *);
  1343. ⓪&(*
  1344. ⓪&IF Puff^.Name [0] = nul THEN
  1345. ⓪(Nachricht ('Noch kein Dateiname angegeben!');
  1346. ⓪&END (* IF kein Name *);
  1347. ⓪&*)
  1348. ⓪&frage := TRUE;
  1349. ⓪$UNTIL Puff^.Name [0] # nul;
  1350. ⓪$Info := Puff^.Pfad; DeleteTail (Info);
  1351. ⓪$FastStrings.Append (Puff^.Name, Info);
  1352. ⓪!
  1353. ⓪$IF ~markiert & (backup OR (MakeBAK IN Puff^.Modus)) THEN
  1354. ⓪&(*
  1355. ⓪(BakName := Info;
  1356. ⓪(dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)
  1357. ⓪(IF FastStrings.Pos (dot, BakName) > 0 THEN
  1358. ⓪*i := LENGTH (BakName); DEC (i);
  1359. ⓪*WHILE BakName [i] # '.' DO
  1360. ⓪,DEC (i);
  1361. ⓪*END (* WHILE *);
  1362. ⓪*BakName [i] := nul;
  1363. ⓪(END (* IF Punkt *);
  1364. ⓪(Append ('.BAK', BakName, ok);
  1365. ⓪&*)
  1366. ⓪&FileNames.ConcatName (Info, 'BAK', BakName);
  1367. ⓪&ok := Delete (BakName);
  1368. ⓪&Rename (Info, BakName);
  1369. ⓪$END (* IF nicht markiert *);
  1370. ⓪$Create (Info, 0, texthandle);
  1371. ⓪$IF texthandle < 0 THEN
  1372. ⓪&Nachricht ('Fehler beim Erzeugen der Text-Datei');
  1373. ⓪&RETURN;
  1374. ⓪$END (* IF Handle ungueltig *);
  1375. ⓪"UNTIL texthandle >= 0;
  1376. ⓪"WITH Puff^ DO
  1377. ⓪$IF markiert THEN
  1378. ⓪&StelleZeileEin (Puff, MerkPunkte [BlockMarke1].zeilpos, 0);
  1379. ⓪&Help := MerkPunkte [LaufendeZeile].merkline;
  1380. ⓪&i := MerkPunkte [LaufendeZeile].zeilpos;
  1381. ⓪$ELSE
  1382. ⓪&Help := Puffer^.naechste;
  1383. ⓪&i := 1;
  1384. ⓪$END (* IF *);
  1385. ⓪$index := VAL (LONGCARD, 0); ende := FALSE; ok := TRUE;
  1386. ⓪$HighLight;
  1387. ⓪ 
  1388. ⓪$GotoXY (38, 12); HighLight;
  1389. ⓪$WriteConst ('   0'); MausBusy;
  1390. ⓪ 
  1391. ⓪$IF puffer = NIL THEN
  1392. ⓪&Nachricht ('Speicher reicht|nicht für Puffer');
  1393. ⓪&RETURN;
  1394. ⓪$END (* IF *);
  1395. ⓪$WHILE ~ende & ok DO
  1396. ⓪&ende := (Help^.naechste = NIL)
  1397. ⓪/OR (markiert & (i >= MerkPunkte [BlockMarke2].zeilpos));
  1398. ⓪&IF markiert & (i = MerkPunkte [LaufendeZeile].zeilpos) THEN
  1399. ⓪(FastStrings.Copy (Help^.ZeilPointer^, MerkPunkte [BlockMarke1].charpos,
  1400. ⓪.LENGTH (Help^.ZeilPointer^) - MerkPunkte [BlockMarke1].charpos,
  1401. ⓪.rest);
  1402. ⓪(SchreibZeile (texthandle, rest, ende, ok);
  1403. ⓪&ELSIF ende & markiert THEN
  1404. ⓪(FastStrings.Copy (Help^.ZeilPointer^, 0,
  1405. ⓪.MerkPunkte [BlockMarke2].charpos, rest);
  1406. ⓪(SchreibZeile (texthandle, rest, ende, ok);
  1407. ⓪&ELSE
  1408. ⓪(SchreibZeile (texthandle, Help^.ZeilPointer^, ende, ok);
  1409. ⓪&END (* IF *);
  1410. ⓪&Help := Help^.naechste;
  1411. ⓪&INC (i);
  1412. ⓪&IF i MOD 50 = 0 THEN
  1413. ⓪(CursorAus; MausAus; GotoXY (38, 12);
  1414. ⓪(ConvCard (i, 4, dummys);
  1415. ⓪(WriteConst (dummys); MausBusy;
  1416. ⓪&END (* IF *);
  1417. ⓪$END (* WHILE *);
  1418. ⓪$Normal;
  1419. ⓪$IF (index > VAL (LONGCARD, 0)) & ok THEN
  1420. ⓪&ok := SchreibPuffer (texthandle);
  1421. ⓪$END (* IF *);
  1422. ⓪$IF ~ok THEN
  1423. ⓪&Nachricht ('Fehler beim Abspeichern|Eventuell Diskette voll');
  1424. ⓪&LoescheBild;
  1425. ⓪&ok := Close (texthandle);
  1426. ⓪&RETURN
  1427. ⓪$END (* IF ~ok *);
  1428. ⓪$erfolgreich:= Close (texthandle);
  1429. ⓪$Open (Info, ORD (read), texthandle);
  1430. ⓪$timeptr := ADR (tageszeit);
  1431. ⓪$DaTime (texthandle, timeptr, CAST (TimeAccessMode, Compiliert IN Modus));
  1432. ⓪$ok := Close (texthandle);
  1433. ⓪"END (* WITH *);
  1434. ⓪"IF erfolgreich THEN
  1435. ⓪$IF markiert THEN Puff^.Pfad := oldPfad; Puff^.Name := oldName;
  1436. ⓪$ELSIF saveconfig THEN
  1437. ⓪&SaveConfig (Puff, FALSE);
  1438. ⓪$END (* IF *);
  1439. ⓪$AutoCount := 0;
  1440. ⓪$IF NOT markiert THEN
  1441. ⓪&EXCL (Puff^.Modus, Editiert);
  1442. ⓪$END
  1443. ⓪"END
  1444. ⓪ END TextSchreiben;
  1445. ⓪ 
  1446. ⓪ (************************* EditCommand *************************************)
  1447. ⓪ 
  1448. ⓪ CONST   cErrName =              'TLGE.ERR';
  1449. ⓪ 
  1450. ⓪ VAR     FehlerMeldung:          eineInfo;
  1451. ⓪(ErrName:                eineInfo;
  1452. ⓪(FehlerText:             eineZeile;
  1453. ⓪(Start:                  CARDINAL;
  1454. ⓪(FehlerStart:            einLinePointer;
  1455. ⓪(ok:                     BOOLEAN;
  1456. ⓪(ErrZeil, ErrPos:        CARDINAL;
  1457. ⓪(ErrLine:                einLinePointer;
  1458. ⓪(FehlerAnzahl:           CARDINAL;
  1459. ⓪(LaufenderFehler:        CARDINAL;
  1460. ⓪(Backslash:              ARRAY [0..0] OF CHAR;
  1461. ⓪ 
  1462. ⓪"(* Megamax-Modula: *)
  1463. ⓪"PROCEDURE SetCompilerInfo (Puff: einPufferPointer;
  1464. ⓪0VAR FehlerMeldung: ARRAY OF CHAR);
  1465. ⓪"VAR   mp, hp:                 einMerkPointer;
  1466. ⓪(ch:                     CHAR;
  1467. ⓪"BEGIN
  1468. ⓪%
  1469. ⓪%(* Einstellen der Fehlermeldung in Merkpunktliste Compilerinfo: *)
  1470. ⓪%(* Alte Compilerinfo-Liste löschen: *)
  1471. ⓪$
  1472. ⓪%WITH Puff^.MerkPunkte [CompilerInfo] DO
  1473. ⓪'zeilpos := Puff^.MerkPunkte [LaufendeZeile].zeilpos;
  1474. ⓪'merkline := Puff^.MerkPunkte [LaufendeZeile].merkline;
  1475. ⓪'charpos := Puff^.MerkPunkte [LaufendeZeile].charpos;
  1476. ⓪'PutLine (merkinfo, FehlerMeldung);
  1477. ⓪%END (* WITH *);
  1478. ⓪"END SetCompilerInfo;
  1479. ⓪"
  1480. ⓪"PROCEDURE SetPath;
  1481. ⓪"VAR   dummy:          eineInfo;
  1482. ⓪(Button:         INTEGER;
  1483. ⓪"BEGIN
  1484. ⓪$LoescheBild; (*WriteConst ('Pfad für Dienstprogramme: ');*)
  1485. ⓪$dummy [0] := nul;
  1486. ⓪$GetDirectory (CompilerPfad, dummy, 'Pfad für TDI-Programme', Button, FALSE);
  1487. ⓪$DeleteTail (CompilerPfad);
  1488. ⓪$IF CompilerPfad [0] = nul THEN
  1489. ⓪&CompilerPfad [0] := '\'; CompilerPfad [1] := nul;
  1490. ⓪$END;
  1491. ⓪"END SetPath;
  1492. ⓪ 
  1493. ⓪ (*
  1494. ⓪"PROCEDURE DoRunProgram (Pfadname, Dateiname, Argument: ARRAY OF CHAR): INTEGER;
  1495. ⓪"(* korrigiert von Peter Hellinger *)
  1496. ⓪"
  1497. ⓪"VAR   (*Pfadname, Dateiname:    eineInfo;*)
  1498. ⓪(Programmname:           eineInfo;
  1499. ⓪(Button:                 INTEGER;
  1500. ⓪(laenge:                 ARRAY [0..0] OF CHAR;
  1501. ⓪(newDrive, oldDrive:     CARDINAL;
  1502. ⓪(map:                    LONGCARD;
  1503. ⓪(oldPfad:                eineInfo;
  1504. ⓪(Result:                 (*INTEGER*) LONGINT;
  1505. ⓪(key:                    einTasteneintrag;
  1506. ⓪(b:                      CHAR;
  1507. ⓪(ok:                     BOOLEAN;
  1508. ⓪"BEGIN
  1509. ⓪$GEMDOS.GetPath (oldPfad, 0);
  1510. ⓪$GEMDOS.GetDrv (oldDrive);
  1511. ⓪$IF Pfadname [0] = nul THEN
  1512. ⓪&Pfadname [0] := '\'; Pfadname [1] := nul;
  1513. ⓪$END (* IF *);
  1514. ⓪$GotoXY (0, 0);
  1515. ⓪$WriteLine (Pfadname);
  1516. ⓪$Assign (Pfadname, Programmname);
  1517. ⓪$DeleteTail (Programmname);
  1518. ⓪$Append (Dateiname, Programmname); (* Sehr richtig!! *)
  1519. ⓪$
  1520. ⓪$WriteConst ('--> '); WriteLine (Programmname);
  1521. ⓪$WriteConst (': '); WriteLine (Argument);
  1522. ⓪$
  1523. ⓪$laenge [0] := CHR (LENGTH (Argument));
  1524. ⓪$Insert (laenge, 0, Argument);
  1525. ⓪ 
  1526. ⓪$(* Jetzt wirds interessant: *)
  1527. ⓪ 
  1528. ⓪$IF (Programmname [0] >= 'A') & (Programmname [0] <= 'Z') THEN
  1529. ⓪&newDrive := ORD (Programmname [0]) - 65;
  1530. ⓪&IF (newDrive # oldDrive) THEN
  1531. ⓪(GEMDOS.SetDrv (newDrive, map);
  1532. ⓪&END (* IF *);
  1533. ⓪$END (* IF *);
  1534. ⓪$DeleteTail (Pfadname);
  1535. ⓪$IF GEMDOS.SetPath (Pfadname) THEN
  1536. ⓪'MausEin; (* Muss **hier** stehen! *)
  1537. ⓪ 
  1538. ⓪'GEMDOS.Exec (GEMDOS.loadExecute, Programmname, Argument,
  1539. ⓪+Pfadname, Result);
  1540. ⓪ (*      WriteConst ('Programm-Resultat: ');
  1541. ⓪&WriteInt (output, Result, 5);
  1542. ⓪&LiesZeichen (b);
  1543. ⓪ *)
  1544. ⓪&TastInit;
  1545. ⓪&(*RestoreFont; (*-- Golem-Font wieder herstellen --*)*)
  1546. ⓪ 
  1547. ⓪$ELSE (* Falscher Pfad! *)
  1548. ⓪&Nachricht ('Illegaler Zugriffspfad');
  1549. ⓪$END (* IF SetPath *);
  1550. ⓪$(* Altes Laufwerk und Pfad restaurieren *)
  1551. ⓪$GEMDOS.SetDrv (oldDrive, map);
  1552. ⓪$ok := GEMDOS.SetPath (oldPfad);
  1553. ⓪$(* Aechz - erstmal auf die Schnelle lokale Anpassung: *)
  1554. ⓪$RETURN VAL (INTEGER, Result);
  1555. ⓪"END DoRunProgram;
  1556. ⓪ *)
  1557. ⓪ 
  1558. ⓪"PROCEDURE CommandLine (VAR FILENAME, FEHLERMELD: ARRAY OF CHAR): BOOLEAN;
  1559. ⓪"VAR   I, Z, s:        CARDINAL;
  1560. ⓪(CmdLine:        POINTER TO ARRAY [0..127] OF CHAR;
  1561. ⓪"BEGIN
  1562. ⓪$CmdLine:= ActiveProcess ();
  1563. ⓪$INC (CmdLine, 128);
  1564. ⓪$IF CmdLine^ [0] = nul THEN (* Ist eigentlich das Längenbyte...*)
  1565. ⓪&(* Wenn Null, keine Commandline. *)
  1566. ⓪&RETURN FALSE
  1567. ⓪$ELSE
  1568. ⓪&(* Komandozeile wurde übergeben *)
  1569. ⓪&
  1570. ⓪&(* Trace ('CommandLine'); *)
  1571. ⓪&
  1572. ⓪&LoescheBild;
  1573. ⓪&(*
  1574. ⓪&GotoXY (2, 2);
  1575. ⓪&WriteConst ('CML: -->'); WriteLine (CmdLine^); WriteLn;
  1576. ⓪&*)
  1577. ⓪&Z := 0;
  1578. ⓪&s := ORD (CmdLine^ [0]);
  1579. ⓪&IF s >= 126 THEN s := 126; END;
  1580. ⓪&I := 1; CmdLine^ [s(*!TT:*)+1] := nul; (* Nullterminierung sicherstellen *)
  1581. ⓪&WHILE (I <= s) & (CmdLine^ [I] > ' ') & (CmdLine^ [I] # nul) DO
  1582. ⓪(FILENAME [Z] := CmdLine^ [I];
  1583. ⓪(INC (Z);
  1584. ⓪(INC (I);
  1585. ⓪&END (* WHILE *);
  1586. ⓪&FILENAME [Z] := nul;
  1587. ⓪ 
  1588. ⓪&Z := 0;
  1589. ⓪&WHILE (I <= s) & (CmdLine^ [I] >= ' ') & (CmdLine^ [I] # nul) DO
  1590. ⓪(FEHLERMELD [Z] := CmdLine^ [I];
  1591. ⓪(INC (Z); INC (I);
  1592. ⓪&END (* WHILE *);
  1593. ⓪&FEHLERMELD [Z] := nul;
  1594. ⓪&
  1595. ⓪&RETURN TRUE
  1596. ⓪$END (* ELSE Kommandozeile vorhanden *);
  1597. ⓪"END CommandLine;
  1598. ⓪ 
  1599. ⓪"PROCEDURE NextArgument (VAR n, arg: ARRAY OF CHAR): BOOLEAN;
  1600. ⓪"(* Kopiert aus n das erste Argument (bis zum Blank) in arg und löscht
  1601. ⓪%es in n. FALSE wenn n der leere String ist. *)
  1602. ⓪"VAR   quindex, zindex, laenge: CARDINAL;
  1603. ⓪(delimiter:              CHAR;
  1604. ⓪"BEGIN
  1605. ⓪$laenge := LENGTH (n); quindex := 0;
  1606. ⓪$IF laenge = 0 THEN RETURN FALSE; END;
  1607. ⓪$WHILE (n [quindex] = ' ') & (quindex < laenge) DO
  1608. ⓪&INC (quindex);
  1609. ⓪$END;
  1610. ⓪$FastStrings.Delete (n, 0, quindex); laenge := laenge (* + 1 *) - quindex;
  1611. ⓪$zindex := 0; quindex := 0;
  1612. ⓪$IF n [quindex] = '"' THEN
  1613. ⓪&delimiter := '"'; INC (quindex);
  1614. ⓪$ELSE delimiter := ' ';
  1615. ⓪$END;
  1616. ⓪$WHILE (n [quindex] # delimiter) & (quindex < laenge) DO
  1617. ⓪&arg [zindex] := n [quindex];
  1618. ⓪&INC (zindex); INC (quindex);
  1619. ⓪$END (* WHILE *);
  1620. ⓪$(* Skip '"'! *)
  1621. ⓪$IF (n [quindex] = '"') & (quindex < laenge) THEN INC (quindex); END;
  1622. ⓪$FastStrings.Delete (n, 0, quindex);
  1623. ⓪$arg [zindex] := nul;
  1624. ⓪$RETURN arg [0] # nul;
  1625. ⓪"END NextArgument;
  1626. ⓪"
  1627. ⓪"PROCEDURE SplitFileName (name: ARRAY OF CHAR;
  1628. ⓪;VAR path, file, suff: ARRAY OF CHAR);
  1629. ⓪"(* Kopiert den Pfad- und Dateinamensanteil aus name getrennt nach
  1630. ⓪%path und file *)
  1631. ⓪"VAR   i, index, laenge, pfadlaenge:   CARDINAL;
  1632. ⓪"VAR   dummy: ARRAY [0..7] OF CHAR;
  1633. ⓪"BEGIN
  1634. ⓪$FileNames.SplitPath (name, path, file);
  1635. ⓪$FileNames.SplitName (file, dummy, suff);
  1636. ⓪$(* Punkt nach Suff:
  1637. ⓪&Strings.Insert ('.',0,suff,BOOLEAN);
  1638. ⓪$*)
  1639. ⓪"END SplitFileName;
  1640. ⓪ 
  1641. ⓪"PROCEDURE GetScrapPath (VAR ScrapPfad, ScrapName: ARRAY OF CHAR);
  1642. ⓪ (*
  1643. ⓪"CONST cClipVar =        'CLIPBRD';
  1644. ⓪"
  1645. ⓪"VAR     clipPath:       eineInfo;
  1646. ⓪*bootdev[0446H]: CARDINAL;
  1647. ⓪*bootfrom:       CARDINAL;
  1648. ⓪*stack:          ADDRESS;
  1649. ⓪*clipVar:        ARRAY [0..8] OF CHAR;
  1650. ⓪*ok:             BOOLEAN;
  1651. ⓪ *)
  1652. ⓪"VAR     dummySuff:      (*einSuffix*) ARRAY [0..3] OF CHAR;
  1653. ⓪"BEGIN
  1654. ⓪ (*
  1655. ⓪$AESMisc.ReadScrapDir (ScrapPfad);
  1656. ⓪$IF ScrapPfad [0] = nul THEN
  1657. ⓪&clipVar:= cClipVar;
  1658. ⓪&AESMisc.ShellEnvironment (clipVar, clipPath);
  1659. ⓪&IF clipPath [0] # nul THEN
  1660. ⓪((*Nachricht (clipPath);*)
  1661. ⓪(Assign (clipPath, ScrapPfad);
  1662. ⓪&ELSE
  1663. ⓪((*Nachricht ('warnix|');*)
  1664. ⓪(SysUtil1.SuperPeek (ADR (bootdev), bootfrom);
  1665. ⓪(Strings.Assign (':\CLIPBRD\SCRAP.TXT', ScrapPfad, ok);
  1666. ⓪(Strings.Insert (CHR (bootfrom + ORD ('A')), 0, ScrapPfad, ok);
  1667. ⓪&END (* IF clipPath *);
  1668. ⓪&AESMisc.WriteScrapDir (ScrapPfad);
  1669. ⓪$END (* IF ScrapPfad *);
  1670. ⓪ *)
  1671. ⓪$MakeScrapName ('TXT', ScrapPfad);
  1672. ⓪$SplitFileName (ScrapPfad, ScrapPfad, ScrapName, dummySuff);
  1673. ⓪$FastStrings.Assign (ScrapPfad, ClipBoard^.Pfad);
  1674. ⓪$FastStrings.Assign (ScrapName, ClipBoard^.Name);
  1675. ⓪"END GetScrapPath;
  1676. ⓪ 
  1677. ⓪ (* ENDE EditCommand *)
  1678. ⓪ 
  1679. ⓪ VAR     f: PathCtrl.PathEntry;
  1680. ⓪((*ok: BOOLEAN;*)
  1681. ⓪(result: INTEGER;
  1682. ⓪ 
  1683. ⓪ BEGIN (* EditFile *)
  1684. ⓪ 
  1685. ⓪ (* EditCommand *)
  1686. ⓪"BackPointer := NIL;
  1687. ⓪"
  1688. ⓪"InitBuffer;
  1689. ⓪ 
  1690. ⓪ (* !JL 12. 12. 90 *)
  1691. ⓪"NEW (puffer);
  1692. ⓪"IF puffer = NIL THEN OutOfMemory END;
  1693. ⓪"expandBlankCompr := TRUE;
  1694. ⓪ 
  1695. ⓪"NEW (ConfigPuffer);
  1696. ⓪"IF ConfigPuffer = NIL THEN OutOfMemory END;
  1697. ⓪"PuffInit (ConfigPuffer);
  1698. ⓪"IF ConfigPuffer = NIL THEN
  1699. ⓪$Nachricht ('Kann ConfigPuffer|nicht anlegen.109');
  1700. ⓪$RETURN;
  1701. ⓪"END;
  1702. ⓪"ConfigPuffer^.NaechsterPuffer := ConfigPuffer;
  1703. ⓪"ConfigInit := FALSE;
  1704. ⓪"InitConfig (ConfigPuffer);
  1705. ⓪"ConfigInit := TRUE;
  1706. ⓪"ConfigPuffer^.Name := DefaultConfigName;
  1707. ⓪"FileNames.ConcatPath (ShellPath, ConfigPuffer^.Name, ConfigPuffer^.Pfad);
  1708. ⓪"IF KonfigSpeichern IN ConfigPuffer^.Modus THEN
  1709. ⓪$LoadConfig (ConfigPuffer, FALSE, TRUE);
  1710. ⓪"END;
  1711. ⓪"
  1712. ⓪"NEW (HilfsPuffer);
  1713. ⓪"IF HilfsPuffer = NIL THEN OutOfMemory END;
  1714. ⓪"PuffInit (HilfsPuffer);
  1715. ⓪"IF HilfsPuffer = NIL THEN
  1716. ⓪$Nachricht ('Kann Hilfspuffer|nicht anlegen.110');
  1717. ⓪$RETURN;
  1718. ⓪"END;
  1719. ⓪"HilfsPuffer^.NaechsterPuffer := HilfsPuffer;
  1720. ⓪"EditPuffer := InsertPuffer (HilfsPuffer);
  1721. ⓪"Tausch := EditPuffer; MailPuffer := EditPuffer; GolemPuffer := EditPuffer;
  1722. ⓪"AlternEdit := EditPuffer;
  1723. ⓪"NEW (ClipBoard);
  1724. ⓪"IF ClipBoard = NIL THEN OutOfMemory END;
  1725. ⓪"PuffInit (ClipBoard);
  1726. ⓪"IF ClipBoard = NIL THEN
  1727. ⓪$Nachricht ('Kann ClipBoard|nicht anlegen.111');
  1728. ⓪$RETURN;
  1729. ⓪"END;
  1730. ⓪"ClipBoard^.NaechsterPuffer := ClipBoard;
  1731. ⓪"NEW (UndoPuffer);
  1732. ⓪"IF UndoPuffer = NIL THEN OutOfMemory END;
  1733. ⓪"PuffInit (UndoPuffer);
  1734. ⓪"IF UndoPuffer = NIL THEN
  1735. ⓪$Nachricht ('Kann UndoPuffer|nicht anlegen.112');
  1736. ⓪$RETURN;
  1737. ⓪"END;
  1738. ⓪"UndoPuffer^.NaechsterPuffer := UndoPuffer;
  1739. ⓪"
  1740. ⓪"NEW (FehlerPuffer);
  1741. ⓪"IF FehlerPuffer = NIL THEN OutOfMemory END;
  1742. ⓪"PuffInit (FehlerPuffer);
  1743. ⓪"IF UndoPuffer = NIL THEN
  1744. ⓪$Nachricht ('Kann FehlerPuffer|nicht anlegen.112');
  1745. ⓪$RETURN;
  1746. ⓪"END;
  1747. ⓪"FehlerPuffer^.NaechsterPuffer := FehlerPuffer;
  1748. ⓪"FastStrings.Assign (cErrName, ErrName);
  1749. ⓪"FehlerMeldung := '';
  1750. ⓪"GetPfad (CompilerPfad); DeleteTail (CompilerPfad);
  1751. ⓪"GetScrapPath (ScrapPfad, ScrapName);
  1752. ⓪"(* DoClipboard := FALSE; *) (* IN GMEBase!!! *)
  1753. ⓪ 
  1754. ⓪ (* EditFile *)
  1755. ⓪ 
  1756. ⓪"Trace ('EditFile');
  1757. ⓪"GetVersion (version); GlobalPfad [0] := nul; (*GetPfad (GlobalPfad);*)
  1758. ⓪"Lists.ResetList (ShellMsg.SrcPaths);
  1759. ⓪"f := Lists.NextEntry (ShellMsg.SrcPaths);
  1760. ⓪"
  1761. ⓪"IF f # NIL THEN
  1762. ⓪$FastStrings.Assign (f^, GlobalPfad);
  1763. ⓪$Paths.MakeFullName (GlobalPfad, FALSE, ok);
  1764. ⓪"END;
  1765. ⓪"
  1766. ⓪"Directory.MakeFullPath (GlobalPfad, result);
  1767. ⓪"IF result < 0 THEN
  1768. ⓪$GlobalPfad:= '';
  1769. ⓪$GetPfad (GlobalPfad);
  1770. ⓪"END;
  1771. ⓪"(*!TT 18.12.90 - steht oben schon einmal
  1772. ⓪$NEW (puffer);
  1773. ⓪"*)
  1774. ⓪"expandBlankCompr := TRUE;
  1775. ⓪ END GMEFile.
  1776. ⓪ 
  1777. ⓪ ə
  1778. (* $FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82DÇ$00008356T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$0000BC45$FFEB97DE$00001AD8$0000BB22$0000BC14$0000BBB3$0000BB6A$00001F53$0000BC76$0000BB9D$00000431$000082F2$00009C46$00008356$0000832C$00008356ÇÇé*)
  1779.