home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 20 / read.me next >
Encoding:
Text File  |  1991-03-20  |  98.3 KB  |  1,840 lines

  1. ToolboX-
  2. Language
  3.  
  4.  ⌐████ ████  █████ █████ ███  ███  █
  5. ⌐█  ¬░░░⌐█ ¬░░⌐█¬░⌐█ ¬░░░░░ ¬░░⌐█¬░░⌐█¬░░⌐█  ¬░⌐█¬░⌐█ ¬░
  6.  ⌐███  ⌐████  ⌐███    ⌐███  ¬░⌐█ ¬░⌐█████ ⌐█ ¬░
  7.    ¬░⌐█¬░⌐█ ¬░░░░⌐█ ¬░░░ ⌐█  ¬░░░ ⌐█ ¬░⌐█ ¬░░⌐█¬░⌐█ ¬░
  8. ⌐████  ⌐█ ¬░   ⌐█████ ⌐█████ ⌐███¬░⌐█ ¬░ ⌐█ ⌐█████
  9. ¬  ░░░░  ░     ░░░░░ ░░░░░ ░░░ ░   ░ ░░░░░
  10.  
  11. ⌐█   █  ███  ⌐█         █   █  █   █           █████  █   █  █
  12. ⌐█ ¬░ ⌐█ █  ¬░⌐█¬░⌐█ ¬░        ⌐█¬░⌐█  ¬░ ⌐█¬░⌐█  ¬░           ⌐█¬░░░░ ⌐█¬░⌐█  ¬░⌐█ ¬░
  13. ⌐█ ¬░ ⌐█ █ ¬░ ⌐█ ⌐█ ¬░         ⌐█¬░ ░   ⌐█¬░ ░ ⌐█          █ ¬░    ⌐█¬░ ░ ⌐█ ¬░
  14.  ⌐█¬░⌐█  █ ¬░ ⌐█ ⌐█ ¬░        ⌐█ ⌐█¬░   ⌐█ ⌐█¬░    ░        ⌐█ ¬░   ⌐█ █¬░  ⌐█ ¬░
  15.   ⌐█¬░ ░ ⌐███  ████ █    █  ¬░⌐█¬░ ⌐█  ¬░⌐█¬░ ⌐█          █ ¬░  ⌐█  ¬░⌐█¬░ ⌐████
  16.     ░    ░░░  ░░░░ ░    ░   ░  ░   ░  ░          ░    ░   ░  ░░░░
  17.  
  18.  
  19. ,,0
  20. ⌐0. INHALTSVERZEICHNIS
  21. ⌐═════════════════════
  22.  
  23. ⌐<0>¬..........Inhaltsverzeichnis
  24. ⌐<1>¬..........Bedienung des Readme-Programms
  25. ⌐<2>¬..........Schneller Einstieg in TXL
  26. ⌐<3>¬..........TXL für DOS: Der Editor
  27. ⌐<4>¬..........TXL für DOS: Die Befehle
  28. ⌐<5>¬..........Besonderheiten der Atari-ST Version von TXL
  29. ⌐<6>¬..........TXL unter Windows: Die Befehle
  30. ⌐<7>¬..........Eigene Befehle implementieren
  31. ⌐<8>¬..........Die Geschichte der ToolboX Language
  32. ⌐<9>¬..........Registrierung und Support für TXL
  33.  
  34.  
  35. ,,1
  36. ⌐1. BEDIENUNG DES README-PROGRAMMS
  37. ⌐═════════════════════════════════
  38.  
  39. ⌐<Cursor hoch/runter>¬.........Eine Zeile nach oben/unten scrollen
  40.  
  41. ⌐<Bild hoch/runter>¬...........Eine Seite nach oben/unten blättern
  42.  
  43. ⌐<Pos1>, <Ende>¬...............Zum Anfang/Ende des Textes springen
  44.  
  45. ⌐<Esc>¬........................Readme verlassen
  46.  
  47. Außerdem können Sie alle Kapitel bequem über die in ⌐<¬ und ⌐>¬ einge-
  48. schlossenen Hotkeys anwählen, die im Inhaltsverzeichnis angegeben sind.
  49.  
  50.  
  51. ,,2
  52. ⌐2. Schneller Einstieg in TXL
  53. ⌐════════════════════════════
  54.  
  55. Pascal, C oder auch Basic-Programmierern dürfte es nicht schwerfallen,
  56. einen schnellen Einstieg in die "ToolboX Language" zu bekommen.
  57. Schleifenfunktionen, Fenster-, Ein- und Ausgaberoutinen bieten eine
  58. Fülle von Möglichkeiten. Das an sich ist jedoch nicht die Besonderheit
  59. der TXL.
  60. TXL erlaubt es im Gegensatz zu herkömmlichen Interpreter-Sprachen auf
  61. einfache Weise, nicht vorhandene Befehle schnell und problemlos in C
  62. einzubinden. 
  63. Der Leistungsfähigkeit der TXL sind somit keine Grenzen
  64. gesetzt. Aber auch schon im vorhandenen Befehlsumfang wird einiges
  65. geboten, sodaß man wahrscheinlich nur in Spezialfällen dazu gezwungen
  66. ist, wirklich neue Anweisungen hinzuzufügen.
  67.  
  68. Zu beachten ist bei der Erstinstallation von TXL, daß der Sourcecode
  69. der DOS-Version (Diskette 3/3) als selbstentpackende Datei vorliegt.
  70. Vor dem Start ist also für ausreichend Platz auf Diskette oder Fest-
  71. platte zu sorgen.
  72.  
  73. Durch das offene Konzept von TXL es möglich, sich die vorliegenden
  74. entsprechenden Befehlsnamen und Parameter so anzupassen, daß sie mit
  75. bisher bekannten und verwendeten Routinen und Bibliotheken
  76. übereinstimmen.
  77. Um die ersten Berührungsängste zu nehmen, sollte man sich über die
  78. Hilfe-Funktion (HILFE oder F1) und im On-Line Dialog (nur DOS- und
  79. Windows-Version) einen kleinen Überblick verschaffen. 
  80. Eine Kurzübersicht aller aktuell implemetierter Befehle erhält man durch
  81. den Befehl "COMMANDS". Detaillierte Angaben sind dann jeweils über die
  82. Hilfefunktion zu finden.
  83. Die meisten Befehle lassen sich auch im Direktmodus ausführen, sodaß
  84. die Wirkung unmittelbar beobachtet werden kann. Der integrierte Editor
  85. ermöglicht weiterhin eine komfortable Programmentwicklung und das
  86. Starten von TXL-Programmen aus dem Editor heraus (CTRL-T).
  87.  
  88.  
  89. ,,3
  90. ⌐3. TXL für DOS: Der Editor
  91. ⌐══════════════════════════
  92.  
  93.  Das Editor-System
  94. ────────────────────────────────────────────────────────────────────────
  95.   Das Editorsystem für TXL erlaubt 10 Editoren, die gleichzeitig
  96.   verschiedene Dateien bearbeiten können und eine Schnittstelle zu TXL
  97.   besitzen, d.h. (fast) jede Editorfunktion kann durch einen TXL-Befehl
  98.   simuliert werden. Da 50 Hotkeys für die Editoren in TXL auf
  99.   Unterprogamme gelegt werden können (Alt/Shift/Ctrl-F1-F10, F1-F10,
  100.   Alt0-Alt9), lassen sich so einafch MAKROS programmieren.
  101.  
  102.   Im Direktmodus bearbeitet "edit" das aktuelle Programm, speichert es
  103.   am Ende unter "AKTUELL.TXL" und läd es in den Interpreter.
  104.  
  105.   "edit <file>" läd eine bestimmte Datei, die explizit gesichert
  106.   werden muß (z.B. edit "Programm.TXL").
  107.  
  108.  
  109.  Editorbefehle beim Editieren
  110. ────────────────────────────────────────────────────────────────────────
  111.  Funktionsnr  Hotkey
  112.     10         INS
  113.     11         DEL
  114.     12       Backspace
  115.     13        Return
  116.     14        Ctrl-Y    Zeile löschen
  117.     15       Ctrl-Left  Wort links
  118.     16       Ctrl-Right Wort rechts
  119.     17       Ctrl-B     Blockbeginn setzen
  120.     18       Ctrl-E     Blockende setzen
  121.     19       Ctrl-C     Block kopieren
  122.     20       Ctrl-D     Block löschend
  123.     21       Ctrl-V     Block verschieben
  124.     22       Ctrl-R     Block von Diskette lesen
  125.     24       Ctrl-W     Block auf Diskette schreiben
  126.  
  127.  
  128.   Editorbefehle beim Editieren
  129. ────────────────────────────────────────────────────────────────────────
  130.   Funktionsnr  Hotkey
  131.      23       Ctrl-S     Datei speichern
  132.      25        Home      Cursor an Deteianfang
  133.      26        End       Cursor an Textende
  134.      30       Alt-R      Fenster mit Cursortasten in Größe ändern
  135.      31       Alt-M      Fenster mit Cursortasten verschieben
  136.      32       Alt-Z      Fenster zoomen, d.h. auf ganzen Bildschirm
  137.                          ausdehnen
  138.      --       Ctrl-T     Aufruf des Präprozessors
  139.       0                  Eingabe eines Zeichens
  140.    1,2,3,4               Simulieren der
  141.   5,6,7,8,9              Cursortasten
  142.  
  143.   Der TXL-Befehl "edfunction <Ed-Nr> <Func-Nr> <Char>" führt die
  144.   Funktionsnummer <Func-Nr> im Editor <Ed-Nr> aus. <Char> ist
  145.   bei Funktion 0 der ASCII-Code des Zeichens, das eingefügt
  146.   werden soll. (Über Makros sind so auch die unteren Zeichen des
  147.   Zeichensatzes ansprechbar.)
  148.  
  149.  
  150. ,,4
  151. ⌐4. TXL für DOS: Die Befehle
  152. ⌐═══════════════════════════
  153.  
  154. ╔════════════════════════════════════════════════════════════════╗
  155. ║ Befehlsübersicht:  Standard-Befehle                            ║
  156. ╟─────────────┬──────────────────────────────────────────────────╢
  157. ║ Befehlsname │ Funktion                                         ║
  158. ╟─────────────┼──────────────────────────────────────────────────╢
  159. ║ lauf        │ Ausführen eines Interpreterprogramms im Speicher ║
  160. ║ drucke      │ Ausgabe von Text oder Werten auf dem Terminal    ║
  161. ║ setze       │ Zuweisen eines Wertes an eine Variable           ║
  162. ║ wenn        │ Bedingte Programmausführung (siehe unten)        ║
  163. ║ gehezu      │ Programm an anderer Stelle fortführen            ║
  164. ║ ende        │ Ende eines Interpreterprogramms                  ║
  165. ║ merke       │ Kommentar                                        ║
  166. ║ liste       │ Auflisten des Interpreterprogramms               ║
  167. ║ neu         │ Programm im Speicher löschen                     ║
  168. ║ lade        │ Laden eines TXL-Quelltexts                       ║
  169. ║ speichere   │ Speichern eines TXL-Quelltexts (ASCII-Format)    ║
  170. ║ verlasse    │ Verlassen des Interpreters                       ║
  171. ║ info        │ Die Entstehungsgeschichte des TXL-Interpreters   ║
  172. ╚═════════════╧═══════════════════════════════════════< weiter >═╝
  173. |
  174. ╔════════════════════════════════════════════════════════════════╗
  175. ║ Befehlsübersicht:  Neue-Befehle                                ║
  176. ╟─────────────┬──────────────────────────────────────────────────╢
  177. ║ Befehlsname │ Funktion                                         ║
  178. ╟─────────────┼──────────────────────────────────────────────────╢
  179. ║ hilfe       │ Hilfe am Bildschirm anzeigen                     ║
  180. ║ dos         │ Startet ein Dos-Programm oder Dos-Shell          ║
  181. ║ setfarbe    │ Stellt die Farbe ein für zeig,loesch,lese,box    ║
  182. ║ zeig        │ Positionierte Ausgabe auf dem Bildschirm         ║
  183. ║ lese        │ Positioniertes Einlesen einer Variable           ║
  184. ║ loesch      │ Ganzer Bildschirm oder Ausschnitt löschen        ║
  185. ║ sbild       │ Bildschirm in eine Variable sichern              ║
  186. ║ rbild       │ Bildschirm aus einer Var. wieder herstellen      ║
  187. ║ attribut    │ Wechselt die Farbe am Bildschirm                 ║
  188. ║ box         │ Zeichnet eine Box an die angegebenen Koordin.    ║
  189. ║ pause       │ Wartet auf einen Tastendruck                     ║
  190. ║ iftaste     │ Abfrage der letzten Taste von PAUSE und LESE     ║
  191. ║ piep        │ Erzeugt einen Piepton                            ║
  192. ╚═════════════╧═══════════════════════════════════════< weiter >═╝
  193. |
  194. ╔════════════════════════════════════════════════════════════════╗
  195. ║ Befehlsübersicht: Weitere neue Befehle         Befehle Seite 3 ║
  196. ╟─────────────┬──────────────────────────────────────────────────╢
  197. ║ Befehlsname │ Parameter und Funktion                           ║
  198. ╟─────────────┼──────────────────────────────────────────────────╢
  199. ║ strdef      │ <String-Var> <Länge>                             ║
  200. ║             │   Definition eines Strings mit bestimmter Länge  ║
  201. ║ strset      │ <String-Var> = <String> Stringzuweisung          ║
  202. ║ strtoi      │ <String(-var)> <Integer-Var>                     ║
  203. ║             │   Wandelt String in long um                      ║
  204. ║ itostr      │ <Integer(-var)> <String-Var>                     ║
  205. ║             │   Wandelt long in String um                      ║
  206. ║ readln      │ <String-Var>                                     ║
  207. ║             │ Liest String von Tastatur                        ║
  208. ║             │                                                  ║
  209. ║ randomize   │ Initialisiet den Zufallszahlengenerator          ║
  210. ║ random      │ <Integer(-var)> <Integer-Var>                    ║
  211. ║             │   Setzt 2. Variable auf Zufallszahl, maximal     ║
  212. ║             │   auf den Wert des ersten Parameters             ║
  213. ╚═════════════╧═══════════════════════════════════════< weiter >═╝
  214. |
  215. ╔════════════════════════════════════════════════════════════════╗
  216. ║ Verweise auf weitere Befehlsgruppen            Befehle Seite 4 ║
  217. ╟────────────────────────────────────────────────────────────────╢
  218. ║                                                                ║
  219. ║ Unterprogramm-Erstellung                                       ║
  220. ║   blockbegin,blockend,gosub    -> siehe <gosub>                ║
  221. ║                                                                ║
  222. ║ Stackverwaltung (push/pop)     -> siehe <push>                 ║
  223. ║                                                                ║
  224. ║ Gemischte Arrays                                               ║
  225. ║   DefArrayElem, SetArrayElem, GetArrayElem                     ║
  226. ║                                                                ║
  227. ║ Windows         -> eigene Befehlsübersicht                     ║
  228. ║ Editor          -> folgt nach der Fensterbefehl-Beschreibung   ║
  229. ║ Datenbank       -> 10 ausführliche Hilfsseiten                 ║
  230. ║ Präprozessor    -> folgt nach der Datenbankbeschreibung        ║
  231. ║                                                                ║
  232. ║ Menüs -> siehe bei Windows                                     ║
  233. ║                                                                ║
  234. ╚════════════════════════════════════════════════════════════════╝
  235. |
  236. ╔════════════════════════════════════════════════════════════════╗
  237. ║ Syntaxbeschreibung:                                            ║
  238. ╟────────────────────────────────────────────────────────────────╢
  239. ║ lauf<Return>                                                   ║
  240. ║ drucke "String";<Return>                                       ║
  241. ║ drucke Variable;<Return>                                       ║
  242. ║ setze  Variable1 = Variable2;<Return>                          ║
  243. ║ setze  Variable = (Formel);<Return>                            ║
  244. ║ wenn   (Bedingung)<Return>                                     ║
  245. ║        (Dann-Zweig)<Return>                                    ║
  246. ║        (Sonst-Zweig)<Return>                                   ║
  247. ║ gehezu Zeilennummer<Return>                                    ║
  248. ║ ende<Return>                                                   ║
  249. ║ merke  Kommentar<Return>                                       ║
  250. ║ liste<Return>                                                  ║
  251. ║ neu<Return>                                                    ║
  252. ║ lade      "Filename.Extension"<Return>                         ║
  253. ║ speichere "Filename.Extension"<Return>                         ║
  254. ║ verlasse<Return>                                               ║
  255. ╚════════════════════════════════════════════════════════════════╝
  256. |
  257. ⌐<hilfe>
  258. ╔════════════════════════════════════════════════════════════════╗
  259. ║ Syntaxbeschreibung: HILFE                                      ║
  260. ╟────────────────────────────────────────────────────────────────╢
  261. ║                                                                ║
  262. ║ hilfe<Return>           Zeigt die gesammte Hilfe an.           ║
  263. ║                                                                ║
  264. ║ hilfe BEFEHL<Return>                                           ║
  265. ║ BEFEHL<F1>              Zeigt die Hilfe zum angegebenen Befehl ║
  266. ║ F1                                                             ║
  267. ║                                                                ║
  268. ║ Hilfetext erweitern oder ändern :                              ║
  269. ║                                                                ║
  270. ║     Der gesammte Hilfetext ist in der Datei "hilfe.txl"        ║
  271. ║     gespeichert.                                               ║
  272. ║     Die einzelnen Bildschirmseiten sind durch das Zeichen 124  ║
  273. ║     voneinander abgetrennt.                                    ║
  274. ║     Um einen Befehl in den SUCH-INDEX aufzunehmen,             ║
  275. ║     reicht es, den gewünschten Befehl nach einem Seitenzeichen ║
  276. ║     zwischen die Zeichen '<' und '>' zu schreiben.   <neubef>  ║
  277. ║                                                                ║
  278. ╚════════════════════════════════════════════════════════════════╝
  279. |
  280. ⌐<dos>
  281. ╔════════════════════════════════════════════════════════════════╗
  282. ║ Syntaxbeschreibung: DOS                                        ║
  283. ╟────────────────────────────────────────────────────────────────╢
  284. ║                                                                ║
  285. ║ dos<Return>             Dos-Shell                              ║
  286. ║                                                                ║
  287. ║ dos "BEFEHL"<return>    Dosbefehl ausführen                    ║
  288. ║                                                                ║
  289. ╚════════════════════════════════════════════════════════════════╝
  290. |
  291. ⌐<setfarbe>
  292. ╔════════════════════════════════════════════════════════════════╗
  293. ║ Syntaxbeschreibung: SETFARBE                                   ║
  294. ╟────────────────────────────────────────────────────────────────╢
  295. ║                                                                ║
  296. ║ setfarbe  n1  n2<Return>     Bildschirmfarbe einstellen für    ║
  297. ║                              zeig, loesch und lese             ║
  298. ║                                                                ║
  299. ║           n1    : Vordergrund                                  ║
  300. ║           n2    : Hintergrund                                  ║
  301. ║                                                                ║
  302. ║     Farben :                                                   ║
  303. ║     --------                                                   ║
  304. ║     0 schwarz                                                  ║
  305. ║     1 blau                                                     ║
  306. ║     2 grün                                                     ║
  307. ║     3 türkis                                                   ║
  308. ║     4 rot                                                      ║
  309. ║     5 lila                                                     ║
  310. ║     6 braun                                                    ║
  311. ║     7 weiss                                                    ║
  312. ╚════════════════════════════════════════════════════════════════╝
  313. |
  314. ⌐<zeig>
  315. ╔════════════════════════════════════════════════════════════════╗
  316. ║ Syntaxbeschreibung: ZEIG                                       ║
  317. ╟────────────────────────────────────────────────────────────────╢
  318. ║                                                                ║
  319. ║ zeig  n1  n2  "String"<Return>            Positionierte        ║
  320. ║ zeig  n1  n2  Variable "MASKE"<Return>    Bildschirmausgabe.   ║
  321. ║                                                                ║
  322. ║       n1        : Zeile    ( 0-24 )                            ║
  323. ║       n2        : Spalte   ( 0-79 )                            ║
  324. ║       "String"  : Ausgabetext                                  ║
  325. ║       Variable  : Ausgabevariable                              ║
  326. ║       MASKE     : Ausgabemaske ist nur bei Var-Ausgabe aktiv ! ║
  327. ║                                                                ║
  328. ║                   "99999999"      Zahlen                       ║
  329. ║                   "99999.99"      Dezimalzahl                  ║
  330. ║                   "XXXXXXXX"      String                       ║
  331. ║                                                                ║
  332. ║ Siehe auch  <SETFARBE>                                         ║
  333. ╚════════════════════════════════════════════════════════════════╝
  334. |
  335. ⌐<lese>
  336. ╔════════════════════════════════════════════════════════════════╗
  337. ║ Syntaxbeschreibung: LESE                           1. Seite    ║
  338. ╟────────────────────────────────────────────────────────────────╢
  339. ║                                                                ║
  340. ║ lese  n1  n2   Variable  "MASKE"<return> Einlesen einer        ║
  341. ║                                          Variable.             ║
  342. ║       n1         : Zeile  ( 0-24 )                             ║
  343. ║       n2         : Spalte ( 0-79 )                             ║
  344. ║       Variable   : Variable, die eingelesen wird               ║
  345. ║       MASKE      : Siehe nächste Seite                         ║
  346. ║                   "9999"          Integer einlesen             ║
  347. ║                   "9.99"          Dezimalzahl einlesen         ║
  348. ║                   "XXXX"          String                       ║
  349. ║                   "DD.DD.DDDD"    Datum                        ║
  350. ║                                                                ║
  351. ║       Mit diesen Tasten wird LESE beendet :                    ║
  352. ║                   Return, ESC, Pfeiltasten rauf runter,        ║
  353. ║                   Seite auf ab, alle Funktionstasten.          ║
  354. ║                                                                ║
  355. ║ Siehe auch  <SETFARBE> <IFTASTE>  <nächste Seite>              ║
  356. ╚═════════════════════════════════════════════════< weiter >═════╝
  357. |
  358. ╔════════════════════════════════════════════════════════════════╗
  359. ║ Syntaxbeschreibung: LESE                           2. Seite    ║
  360. ╟────────────────────────────────────────────────────────────────╢
  361. ║                                                                ║
  362. ║       MASKE :  "99999999"      Zahlen            -1234567890   ║
  363. ║                "99999.99"      Dezimalzahl       -.1234567890  ║
  364. ║                "XXXXXXXX"      String            Alle Zeichen  ║
  365. ║                "DD.DD.DD"      Datum             TT.MM.JJ      ║
  366. ║                "DD.DD.DDDD"                      TT.MM.JJJJ    ║
  367. ║                                                                ║
  368. ║      Jedes Maskenzeichen ergibt eine Eingabestelle.            ║
  369. ║                                                                ║
  370. ║                                                                ║
  371. ║      Sezial :  "@X"  = Maske wird automatisch    Alle Zeichen  ║
  372. ║                        auf Stringlänge erstellt.               ║
  373. ║                                                                ║
  374. ║                "@D"  = Maske wird automatisch    TT.MM.JJJJ    ║
  375. ║                        auf Datumfeld erstellt.                 ║
  376. ║                                                                ║
  377. ║ Siehe auch  <SETFARBE> <IFTASTE>  <vorherige Seite>            ║
  378. ╚════════════════════════════════════════════════════════════════╝
  379. |
  380. ⌐<loesch>
  381. ╔════════════════════════════════════════════════════════════════╗
  382. ║ Syntaxbeschreibung: LOESCH                                     ║
  383. ╟────────────────────────────────────────────────────────────────╢
  384. ║                                                                ║
  385. ║ loesch ;<Return>                 Löscht den ganzen Bildschirm  ║
  386. ║ loesch  n1  n2  n3  n4 <Return>  Löscht einen Ausschnitt       ║
  387. ║                                  auf dem Bildschirm            ║
  388. ║                                                                ║
  389. ║         n1   :  obere Zeile    ( 0-24 )                        ║
  390. ║         n2   :  linke Spalte   ( 0-79 )                        ║
  391. ║         n3   :  untere Zeile   ( 0-24 )                        ║
  392. ║         n4   :  rechte Spalte  ( 0-79 )                        ║
  393. ║                                                                ║
  394. ║ Bsp.                                                           ║
  395. ║                                                                ║
  396. ║         loesch 10 5 20 40<Return>                              ║
  397. ║                                                                ║
  398. ║                                                                ║
  399. ║ Siehe auch  <SETFARBE>                                         ║
  400. ╚════════════════════════════════════════════════════════════════╝
  401. |
  402. ⌐<sbild>
  403. ╔════════════════════════════════════════════════════════════════╗
  404. ║ Syntaxbeschreibung: SBILD    (Im ANSI-Modus nicht aktiv !)     ║
  405. ╟────────────────────────────────────────────────────────────────╢
  406. ║                                                                ║
  407. ║ sbild  n1  n2  n3  n4  Str-Var<Return>  Sichert den Bildschirm ║
  408. ║                                         des angegebenen        ║
  409. ║                                         Fensters in Variable.  ║
  410. ║                                                                ║
  411. ║         n1      :  obere Zeile    ( 0-24 )                     ║
  412. ║         n2      :  linke Spalte   ( 0-79 )                     ║
  413. ║         n3      :  untere Zeile   ( 0-24 )                     ║
  414. ║         n4      :  rechte Spalte  ( 0-79 )                     ║
  415. ║         Str-Var :  Variable vom Type STRING                    ║
  416. ║ Bsp.                                                           ║
  417. ║                                                                ║
  418. ║         sbild  10 5 20 40 screen<Return>                       ║
  419. ║                                                                ║
  420. ║                                                                ║
  421. ║ Siehe auch  <RBILD>                                            ║
  422. ╚════════════════════════════════════════════════════════════════╝
  423. |
  424. ⌐<rbild>
  425. ╔════════════════════════════════════════════════════════════════╗
  426. ║ Syntaxbeschreibung: RBILD    (Im ANSI-Modus nicht aktiv !)     ║
  427. ╟────────────────────────────────────────────────────────────────╢
  428. ║                                                                ║
  429. ║ rbild  n1  n2  n3  n4  Str-Var<Return>  Stellt den Bildschirm  ║
  430. ║                                         aus einer Variablen    ║
  431. ║                                         wieder her.            ║
  432. ║                                                                ║
  433. ║         n1      :  obere Zeile    ( 0-24 )                     ║
  434. ║         n2      :  linke Spalte   ( 0-79 )                     ║
  435. ║         n3      :  untere Zeile   ( 0-24 )                     ║
  436. ║         n4      :  rechte Spalte  ( 0-79 )                     ║
  437. ║         Str-Var :  Variable vom Type STRING                    ║
  438. ║ Bsp.                                                           ║
  439. ║                                                                ║
  440. ║         rbild  10 5 20 40 screen<Return>                       ║
  441. ║                                                                ║
  442. ║                                                                ║
  443. ║ Siehe auch  <SBILD>                                            ║
  444. ╚════════════════════════════════════════════════════════════════╝
  445. |
  446. ⌐<attribut>
  447. ╔════════════════════════════════════════════════════════════════╗
  448. ║ Syntaxbeschreibung: ATTRIBUT (Im ANSI-Modus nicht aktiv !)     ║
  449. ╟────────────────────────────────────────────────────────────────╢
  450. ║                                                                ║
  451. ║ attribut  n1  n2  n3  n4  v  h<Return>  Stellt die Bildschirm- ║
  452. ║                                         farbe im angegebenen   ║
  453. ║                                         Fenster um.            ║
  454. ║                                         Die Zeichen auf den    ║
  455. ║                                         Bildschirm werden      ║
  456. ║                                         nicht verändert.       ║
  457. ║                                                                ║
  458. ║         n1      :  obere Zeile      ( 0-24 )                   ║
  459. ║         n2      :  linke Spalte     ( 0-79 )                   ║
  460. ║         n3      :  untere Zeile     ( 0-24 )                   ║
  461. ║         n4      :  rechte Spalte    ( 0-79 )                   ║
  462. ║         v       :  Vordergrundfarbe ( 0-7 )    (Farbtabelle    ║
  463. ║         h       :  Hintergrundfarbe ( 0-7 )     bei SETFARBE)  ║
  464. ║                                                                ║
  465. ║ Siehe auch  <SETFARBE>                                         ║
  466. ╚════════════════════════════════════════════════════════════════╝
  467. |
  468. ⌐<box>
  469. ╔════════════════════════════════════════════════════════════════╗
  470. ║ Syntaxbeschreibung: BOX                                        ║
  471. ╟────────────────────────────────────────────────────────────────╢
  472. ║                                                                ║
  473. ║ box    n1  n2  n3  n4 "Box-Str"<Return>  Zeichnet eine Box     ║
  474. ║                                          an die angegebenen    ║
  475. ║                                          Koordinaten.          ║
  476. ║                                                                ║
  477. ║         n1        :  obere Zeile    ( 0-24 )                   ║
  478. ║         n2        :  linke Spalte   ( 0-79 )                   ║
  479. ║         n3        :  untere Zeile   ( 0-24 )                   ║
  480. ║         n4        :  rechte Spalte  ( 0-79 )                   ║
  481. ║         "Box-Str" :  Variable vom Type STRING                  ║
  482. ║                                                                ║
  483. ║         Boxstring "12345678#"  ergibt    12222223              ║
  484. ║                                          4######8              ║
  485. ║                                          4######8              ║
  486. ║         "╔═╗║╝═╚║ "                      76666665              ║
  487. ║                                                                ║
  488. ║ Siehe auch  <SETFARBE>                                         ║
  489. ╚════════════════════════════════════════════════════════════════╝
  490. |
  491. ⌐<pause>
  492. ╔════════════════════════════════════════════════════════════════╗
  493. ║ Syntaxbeschreibung:  PAUSE                                     ║
  494. ╟────────────────────────────────────────────────────────────────╢
  495. ║                                                                ║
  496. ║ pause<Return>          Das Programm wartet auf einen Tasten-   ║
  497. ║                        druck.                                  ║
  498. ║                                                                ║
  499. ║ Siehe auch  <IFTASTE>                                          ║
  500. ╚════════════════════════════════════════════════════════════════╝
  501. |
  502. ⌐<iftaste>
  503. ╔════════════════════════════════════════════════════════════════╗
  504. ║ Syntaxbeschreibung: IFTASTE                                    ║
  505. ╟────────────────────────────────────────────────────────────────╢
  506. ║                                                                ║
  507. ║ iftaste TASTENWERT<Return>       Fragt den Tastenwert ab,      ║
  508. ║         (Dann-Zweig)<Return>     mit dem die Funktion          ║
  509. ║         (Sonst-Zweig)<Return>    PAUSE oder LESE verlassen     ║
  510. ║                                  wurde.                        ║
  511. ║                                                                ║
  512. ║         Tasten-Tabelle auf der nächsten Seite !                ║
  513. ║                                                                ║
  514. ║ Siehe auch  <PAUSE>  <LESE>      < nächste Seite >             ║
  515. ╚════════════════════════════════════════════════════════════════╝
  516. |
  517. ╔════════════════════════════════════════════════════════════════╗
  518. ║ Tastenwert-Tabelle  für IFTASTE                                ║
  519. ╟────────────────────────────────────────────────────────────────╢
  520. ║      Normal      Shift        Ctrl         Alt                 ║
  521. ║      ------      -----        ----         ---                 ║
  522. ║      F1  9059    SF1  9084    CF1  9094    AF1  9104           ║
  523. ║      F2  9060    SF2  9085    CF2  9095    AF2  9105           ║
  524. ║      F3  9061    SF3  9086    CF3  9096    AF3  9106           ║
  525. ║      F4  9062    SF4  9087    CF4  9097    AF4  9107           ║
  526. ║      F5  9063    SF5  9088    CF5  9098    AF5  9108           ║
  527. ║      F6  9064    SF6  9089    CF6  9099    AF6  9109           ║
  528. ║      F7  9065    SF7  9090    CF7  9100    AF7  9110           ║
  529. ║      F8  9066    SF8  9091    CF8  9101    AF8  9111           ║
  530. ║      F9  9067    SF9  9092    CF9  9102    AF9  9112           ║
  531. ║      F10 9068    SF10 9093    CF10 9103    AF10 9113           ║
  532. ║                                                                ║
  533. ║         Escape        9027    Page up       9073               ║
  534. ║         Return        9013    Page down     9081               ║
  535. ║         Pfeilrunter   9080    Pfeilrauf     9072               ║
  536. ║                                                                ║
  537. ╚════════════════════════════════════════════════════════════════╝
  538. |
  539. ⌐<info>
  540. ╔════════════════════════════════════════════════════════════════╗
  541. ║    TXL, die "toolbox language",  ist ein nach allen Seiten     ║
  542. ║    offenes Interpreterkonzept für PC und Atari-ST.             ║
  543. ║    Jedem C-Programmierer wird es damit möglich, sich seine     ║
  544. ║    eigene Sprache zu gestalten.                                ║
  545. ║    Neben der Verwendung der TXL für Schulungszwecke lassen     ║
  546. ║    sich auch hervorragend  rechnerunabhängige  Anwendungen     ║
  547. ║    realisieren.   Einzige  Voraussetzung  ist  ein  ANSI-C     ║
  548. ║    Compiler.                                                   ║
  549. ║    Das Grundgerüst für den TXL-Interpreter  wurde  in  der     ║
  550. ║    Zeitschrift toolbox, Heft 9/10'1990 vorgestellt.            ║
  551. ║    Wesentliche Erweiterungen  sowie  eine  Windows-Version     ║
  552. ║    wurden im Rahmen eines Wettbewerbs in der toolbox 04'91     ║
  553. ║    veröffentlicht.                                             ║
  554. ║    Bezogen werden kann der aktuelle  Grundinterpreter  als     ║
  555. ║    toolbox-Special 20.                                         ║
  556. ║    Bestellungen richten sie bitte an den DMV-Verlag            ║
  557. ║                                          Postfach 250          ║
  558. ║                                          3440 Eschwege         ║
  559. ║                                                                ║
  560. ╚════════════════════════════════════════════════════════════════╝
  561. |
  562. ⌐<gosub>
  563. ╔════════════════════════════════════════════════════════════════╗
  564. ║ Unterprogramme                                                 ║
  565. ╟────────────────────────────────────────────────────────────────╢
  566. ║                                                                ║
  567. ║ Unterprogramme werden mit den Befehlen 'blockbegin' am Anfang  ║
  568. ║ und 'blockend' am Ende gekennzeichnet. Mit 'gosub <zeile>'     ║
  569. ║ wird ein Unterprogramm aufgerufen. Zur Namensgebung lassen     ║
  570. ║ sich Variablen verwenden.                                      ║
  571. ║                                                                ║
  572. ║ Beispiel :                                                     ║
  573. ║                                                                ║
  574. ║   010 setze SUB = 100;                                         ║
  575. ║   020 gosub SUB                                                ║
  576. ║   030 gehezu 200                                               ║
  577. ║   100 blockbegin                                               ║
  578. ║   110 drucke " Hier Unterprogramm. "                           ║
  579. ║   120 blockend                                                 ║
  580. ║   200 merke Programmende                                       ║
  581. ║                                                                ║
  582. ╚════════════════════════════════════════════════════════════════╝
  583. |
  584. ⌐<DefArray>
  585. ╔════════════════════════════════════════════════════════════════╗
  586. ║ Arrays                                                         ║
  587. ╟────────────────────────────────────────────────────────────────╢
  588. ║                                                                ║
  589. ║ Mit "DefArray" definierte Arrays können jeden Datentyp - außer ║
  590. ║ weitere Arrays - als Elemente enthalten, auch gemischte        ║
  591. ║ Arrays (verschiedene Typen in einem Array) sind möglich.       ║
  592. ║                                                                ║
  593. ║ Mit "DefArray" muß das Array zuerst definiert werden.          ║
  594. ║                                                                ║
  595. ║                                                                ║
  596. ║   Syntax : DefArray <name> : <dim1> [,dim2] [,dim3]            ║
  597. ║                                                                ║
  598. ║   Beispiel : DefArray quadrat : 10,10                          ║
  599. ║           (definiert ein 10*10 Felder großes Array)            ║
  600. ║                                                                ║
  601. ║ Mit DefArray könnten Arrays auch redefiniert werden, da aber   ║
  602. ║ Speicher verloren geht, wenn bereits Werte in das Array ein-   ║
  603. ║ getragen sind, ist von der Redefinition abzuraten.             ║
  604. ║                                                                ║
  605. ╚══════════════════════════════════════════════════════<weiter>══╝
  606. |
  607. ⌐<SetArrayElem>
  608. ╔════════════════════════════════════════════════════════════════╗
  609. ║ Arrays : "SetArrayElem"                                        ║
  610. ╟────────────────────────────────────────────────────────────────╢
  611. ║                                                                ║
  612. ║ Syntax : SetArrayElem <name> (dim1 [,dim2[,dim3]]) = <wert>    ║
  613. ║                                                                ║
  614. ║ Setzt ein Arrayelement an der Stelle (dim1,dim2,dim3), wobei   ║
  615. ║ <wert> ein einfacher Typ (Fließkomma, Ganzzahl oder Zeichen)   ║
  616. ║ oder ein String sein kann.                                     ║
  617. ║                                                                ║
  618. ║ Beispiel : SetArrayElem quadrat (4,4) = zahl                   ║
  619. ║                                                                ║
  620. ║ Anmerkungen :                                                  ║
  621. ║   - Hinter dem "=" muß eine Variable stehen, Direktwerte sind  ║
  622. ║     nicht erlaubt.                                             ║
  623. ║   - Die Numerierung der Elemente beginnt bei 0                 ║
  624. ║   - vollständiges Beispiel auf nächster Seite                  ║
  625. ║                                                                ║
  626. ╚══════════════════════════════════════════════════════<weiter>══╝
  627. |
  628. ⌐<GetArrayElem>
  629. ╔════════════════════════════════════════════════════════════════╗
  630. ║ Arrays : "GetArrayElem"                                        ║
  631. ╟────────────────────────────────────────────────────────────────╢
  632. ║                                                                ║
  633. ║ Syntax : GetArrayElem <name> (dim1 [,dim2[,dim3]]) -> <wert>   ║
  634. ║                                                                ║
  635. ║ Speichert das Element an der Stelle (dim1,dim2,dim3) in <wert>.║
  636. ║ <wert> muß den Typ des Elements haben.                         ║
  637. ║                                                                ║
  638. ║ Beispiel : DefArray quadrat : 10,10                            ║
  639. ║            setze string = "Ein String im Array "               ║
  640. ║            setze zahl = 100;                                   ║
  641. ║            SetArrayElem quadrat (0,0) = string                 ║
  642. ║            SetArrayElem quadrat (0,1) = zahl                   ║
  643. ║            GetArrayElem quadrat (0,0) -> string2               ║
  644. ║            GetArrayElem quadrat (0,1) -> zahl2                 ║
  645. ║            drucke string2                                      ║
  646. ║            drucke zahl2                                        ║
  647. ║                                                                ║
  648. ╚════════════════════════════════════════════════════════════════╝
  649. |
  650. ⌐<push>
  651. ╔════════════════════════════════════════════════════════════════╗
  652. ║ Integer-Stack                                                  ║
  653. ╟────────────────────────────────────────────────────────────────╢
  654. ║                                                                ║
  655. ║ Mit den Befehlen "push" und "pop" ist der Stack, auf dem nur   ║
  656. ║ Ganzzahl-Variablen (long) gespeichert werden können.           ║
  657. ║                                                                ║
  658. ║ Die Größe des Stacks ist nur durch den freien Heap begrenzt.   ║
  659. ║ Der Stack läßt sich gut zur Rückgabe von Funktionswerten       ║
  660. ║ in Unterprogrammen oder zur Parameterübergabe benutzen.        ║
  661. ║                                                                ║
  662. ║   Syntax : push <var oder Konstante>                           ║
  663. ║            pop <var>                                           ║
  664. ║                                                                ║
  665. ╚════════════════════════════════════════════════════════════════╝
  666. |
  667. ⌐<window>
  668. ╔════════════════════════════════════════════════════════════════╗
  669. ║ Das Window-System (c) 1991 toolbox                             ║
  670. ╟────────────────────────────────────────────────────────────────╢
  671. ║ Das Windowsystem für TXL erlaubt soviele Fenster, wie der Heap ║
  672. ║ kann. Einen ersten Überblick gibt die Kurzb. der Befehle:      ║
  673. ║                                                                ║
  674. ║   openwindow      Fenster öffnen und Farben definieren         ║
  675. ║   closewindow     Oberstes Fenster schließen                   ║
  676. ║   setcursor       Cursor relativ zum Fenster positionieren     ║
  677. ║   newfirstwindow  Verdecktes Fenster nach vorne bringen        ║
  678. ║   newwindowkoor   Neue Koordinaten für oberstes Fenster        ║
  679. ║   resizewindow    Ändern der Größe des obersten Fensters       ║
  680. ║   movewindow      Verschieben       "     "        "           ║
  681. ║   winreadstring   String in neuem Fenster einlesen (mit Infoz.)║
  682. ║   winmessage      Ausgabe einer Meldung in einem Fenster       ║
  683. ║   winwrite        Schnelle Stringausgabe im ob. Fenster        ║
  684. ║                                                                ║
  685. ╚═══════════════════════════< genaue Beschreibung folgt ... >════╝
  686. |
  687. ⌐<openwindow>
  688. ╔════════════════════════════════════════════════════════════════╗
  689. ║ Neue Fenster öffnen                   Das Window-System      1 ║
  690. ╟────────────────────────────────────────────────────────────────╢
  691. ║  Syntax                                                        ║
  692. ║                                                                ║
  693. ║  openwindow <x1> <y1> <x2> <y2>   <f1> <f2> <f3> <f4>  [num]   ║
  694. ║                                                                ║
  695. ║  Die linke obere Ecke wird mit x1/y1, die rechte untere mit    ║
  696. ║  x2/y2 angegeben. Es folgen vier Farbangaben :                 ║
  697. ║                                                                ║
  698. ║        f1 : Farbe des Rahmens                                  ║
  699. ║        f2 : Farbe des Inneren                                  ║
  700. ║        f3 : Farbe für Überschrift (für Editor)                 ║
  701. ║             Überschriften für Nicht-Editor-Fenster können mit  ║
  702. ║             "winwrite" erzeugt werden.                         ║
  703. ║        f4 : Farbe der Statuszeile (siehe f3)                   ║
  704. ║                                                                ║
  705. ║  Im optionalen Parameter [num] wird die Fensternummer des      ║
  706. ║  neuen Fensters gespeichert.                                   ║
  707. ║                                                                ║
  708. ╚════════════════════════════════════════════════════════════════╝
  709. |
  710. ⌐<resizewindow>
  711. ╔════════════════════════════════════════════════════════════════╗
  712. ║ Fensterkoordinaten ändern             Das Window-System      2 ║
  713. ╟────────────────────────────────────────────────────────────────╢
  714. ║                                                                ║
  715. ║  Der allgemeine Befehl zum Ändern der Fensterkoordinaten       ║
  716. ║  Fensters) ist                                                 ║
  717. ║                                                                ║
  718. ║  newwindowkoor <x1> <y1> <x2> <y2>.                            ║
  719. ║  Die Parameternamen sprechen für sich.                         ║
  720. ║                                                                ║
  721. ║  Nur Breite und Höhe bzw. Position ändern folgende Befehle :   ║
  722. ║                                                                ║
  723. ║  (1) resizewindow <rel-x> <rel-y>                              ║
  724. ║  (2) movewindow   <rel-x> <rel-y>                              ║
  725. ║                                                                ║
  726. ║  Bei (1) wird die rechte untere Ecke um relx/rely verschoben,  ║
  727. ║  bei (2) das gesamte Fenster.                                  ║
  728. ║  (Da keine negativen Werte möglich sind, muß "newwindowkoor"   ║
  729. ║   benutzt werden, um negative Werte zu ersetzen.)              ║
  730. ║                                                                ║
  731. ╚════════════════════════════════════════════════════════════════╝
  732. |
  733. ⌐<winmessage>
  734. ╔════════════════════════════════════════════════════════════════╗
  735. ║ "Automatische Fenster"                Das Window-System      3 ║
  736. ╟────────────────────────────────────────────────────────────────╢
  737. ║                                                                ║
  738. ║ winmessage <string>                                            ║
  739. ║             Gibt den <string> und die Aufforderung, eine Taste ║
  740. ║             zu drücken in einem zentrierten Fenster aus, das   ║
  741. ║             nach einem Tastendruck wieder geschlossen wird.    ║
  742. ║                                                                ║
  743. ║ winreadstr <frage> <str-var> <laenge>                          ║
  744. ║                                                                ║
  745. ║             Gibt in einem zentrierten Fenster <frage> aus und  ║
  746. ║             liest einen String in <str-var> ein. Das Fenster   ║
  747. ║             wird wieder geschlossen. <laenge> gibt an, wie     ║
  748. ║             lang das Eingabefeld minimal sein soll.            ║
  749. ║                                                                ║
  750. ╚════════════════════════════════════════════════════════════════╝
  751. |
  752. ⌐<winwrite>
  753. ╔════════════════════════════════════════════════════════════════╗
  754. ║ weitere Window-Befehle                Das Window-System      4 ║
  755. ╟────────────────────────────────────────────────────────────────╢
  756. ║                                                                ║
  757. ║ closewindow                Schließt das oberste Fenster        ║
  758. ║                                                                ║
  759. ║ newfirstwindow <num>       Das Fenster <nr> (siehe Openwindow) ║
  760. ║                            wird neues oberes Fenster           ║
  761. ║                                                                ║
  762. ║ winwrite <x> <y> <a> <str> Schreibt <str> mit dem Farbattribut ║
  763. ║                            <a> an die Position  x/y des oberen ║
  764. ║                            Fensters.                           ║
  765. ║                            0/0 gibt die linke obere Ecke des   ║
  766. ║                            Rahmens an.                         ║
  767. ║ setcursor <x> <y>          Setzt den Cursor an x/y             ║
  768. ║                            (oberes Fenster)                    ║
  769. ║                                                                ║
  770. ║ "winwrite" und "setcursor" funktionieren auch ohne geöffnetes  ║
  771. ║                            Fenster.                            ║
  772. ║                                                                ║
  773. ╚════════════════════════════════════════════════════════════════╝
  774. |
  775. ⌐<menue>
  776. ╔════════════════════════════════════════════════════════════════╗
  777. ║ Pulldown- und Auswahlmenüs                             1 von 2 ║
  778. ╟────────────────────────────────────────────────────────────────╢
  779. ║                                                                ║
  780. ║ Die hier implementierten Pulldownmenüs werden mit den Cursor-  ║
  781. ║ tasten gesteuert, und mit <ESC> verlassen.   Die Auswahlmenüs  ║
  782. ║ werden nach der Auswahl eines Punktes mit <Return> geschlossen.║
  783. ║ Beide Formen öffnen kein Fenster, dieses muß also vorher       ║
  784. ║ geöffnet werden. Dadurch hat man aber die freie                ║
  785. ║ Wahl in der Farbe und Position des Menüs und die Menü-         ║
  786. ║ Parameterzeile wird nicht zu lang.                             ║
  787. ║ Der Auswahlbalken wird in der Rahmenfarbe dargestellt.         ║
  788. ║                                                                ║
  789. ║ Syntax :                                                       ║
  790. ║                                                                ║
  791. ║   auswahl <punkt1> <punkt2> ... <punkt n>                      ║
  792. ║   menue <punkt1> <uprog1> ... <punkt n> <uprog n>              ║
  793. ║                                                                ║
  794. ║ Beschreibung wird auf nächster Seite fortgesetzt.              ║
  795. ║                                                                ║
  796. ╚════════════════════════════════════════════════════════════════╝
  797. |
  798. ╔════════════════════════════════════════════════════════════════╗
  799. ║ Pulldown- und Auswahlmenüs                             2 von 2 ║
  800. ╟────────────────────────────────────────────────────────────────╢
  801. ║                                                                ║
  802. ║ Der "menue"-Befehl ruft im Gegensatz zum "auswahl"-Befehl nach ║
  803. ║ jeder Wahl                                                     ║
  804. ║ eines Menüpunktes ein Unterprogramm, das durch seine Zeilen-   ║
  805. ║ nummer in den Parametern <uprog x> angegeben ist, auf.         ║
  806. ║ Nach Ausführung des Unterprogramms wird die Menüschleife       ║
  807. ║ solange weiter durchlaufen, bis <ESC> gedrückt wird.           ║
  808. ║ Das Unterprogramm kann natürlich auch aus einer Zeile          ║
  809. ║ bestehen, wenn kein "blockbegin" angegeben ist.                ║
  810. ║                                                                ║
  811. ║ Der "auswahl"-Befehl wird nach Auswahl eines Punktes beendet   ║
  812. ║ und legt die Nummer des ausgewählten Punktes auf den Stack     ║
  813. ║ (erster Punkt : 1), so daß sie mit pop <xxx> ausgelesen        ║
  814. ║ werden sollte.                                                 ║
  815. ║                                                                ║
  816. ║ Hinweis : Das Fenster für die Menüs muß nach Beenden des Menüs ║
  817. ║ wieder explizit geschlossen werden.                            ║
  818. ║                                                                ║
  819. ╚════════════════════════════════════════════════════════════════╝
  820. |
  821. ⌐<edit>
  822. ╔════════════════════════════════════════════════════════════════╗
  823. ║ Das Editor-System (c) 1991 toolbox                             ║
  824. ╟────────────────────────────────────────────────────────────────╢
  825. ║ Das Editorsystem für TXL erlaubt 10 Editoren, die gleichzeitig ║
  826. ║ verschiedene Dateien bearbeiten können und eine Schnittstelle  ║
  827. ║ zu TXL                                                         ║
  828. ║ besitzen, d.h. (fast) jede Editorfunktion kann durch einen     ║
  829. ║ TXL-Befehl simuliert werden. Da 50 Hotkeys für die Editoren in ║
  830. ║ TXL auf Unterprogramme gelegt werden können, lassen sich so    ║
  831. ║ (Alt/Shift/Ctrl-F1-F10, F1-F10, Alt0-Alt9) Makros programmieren║
  832. ║                                                                ║
  833. ║ Im Direktmodus bearbeitet "edit" das aktuelle Programm,        ║
  834. ║ speichert es am Ende unter "AKTUELL.TXL" und läd es in den     ║
  835. ║ Interpreter.                                                   ║
  836. ║                                                                ║
  837. ║   "edit <file>" läd eine bestimmte Datei, die explizit         ║
  838. ║   gesichert werden muß (z.B. edit "Programm.TXL").             ║
  839. ║                                                                ║
  840. ╚═══════════════════════════< Übersichttafeln folgen ... >═══════╝
  841. |
  842. ╔════════════════════════════════════════════════════════════════╗
  843. ║ Editorbefehle beim Editieren                  Der Editor    1  ║
  844. ╟────────────────────────────────────────────────────────────────╢
  845. ║ Funktionsnr  Hotkey                                            ║
  846. ║    10         INS                                              ║
  847. ║    11         DEL                                              ║
  848. ║    12       Backspace                                          ║
  849. ║    13        Return                                            ║
  850. ║    14        Ctrl-Y    Zeile löschen                           ║
  851. ║    15       Ctrl-Left  Wort links                              ║
  852. ║    16       Ctrl-Right Wort rechts                             ║
  853. ║    17       Ctrl-B     Blockbeginn setzen                      ║
  854. ║    18       Ctrl-E     Blockende setzen                        ║
  855. ║    19       Ctrl-C     Block kopieren                          ║
  856. ║    20       Ctrl-D     Block löschen                           ║
  857. ║    21       Ctrl-V     Block verschieben                       ║
  858. ║    22       Ctrl-R     Block von Diskette lesen                ║
  859. ║    24       Ctrl-W     Block auf Diskette schreiben            ║
  860. ║                                                                ║
  861. ╚════════════════════════════════════════════════════════════════╝
  862. |
  863. ⌐<edfunction>
  864. ╔════════════════════════════════════════════════════════════════╗
  865. ║ Editorbefehle beim Editieren                  Der Editor    2  ║
  866. ╟──────────────────────────────────────────── ───────────────────╢
  867. ║ Funktionsnr  Hotkey                                            ║
  868. ║    23       Ctrl-S     Datei speichern                         ║
  869. ║    25        Home      Cursor an Dateianfang                   ║
  870. ║    26        End       Cursor an Textende                      ║
  871. ║    30       Alt-R      Fenster mit Cursortasten in Größe ändern║
  872. ║    31       Alt-M      Fenster mit Cursortasten verschieben    ║
  873. ║    32       Alt-Z      Fenster zoomen                          ║
  874. ║    --       Ctrl-T     Aufruf des Präprozessors                ║
  875. ║     0                  Eingabe eines Zeichens                  ║
  876. ║  1,2,3,4               Simulieren der                          ║
  877. ║ 5,6,7,8,9                  Cursortasten                        ║
  878. ║                                                                ║
  879. ║ Der TXL-Befehl "edfunction <Ed-Nr> <Func-Nr> <Char>" führt die ║
  880. ║ Funktionsnummer <Func-Nr> im Editor <Ed-Nr> aus. <Char> ist bei║
  881. ║ Funktion 0 der ASCII-Code des Zeichens, das eingefügt werden   ║
  882. ║ soll. (Über Makros sind so auch die unteren Zeichen des        ║
  883. ║ Zeichensatzes ansprechbar.)                                    ║
  884. ║                                                                ║
  885. ╚════════════════════════════════════════════════════════════════╝
  886. |
  887. ⌐<initeditor>
  888. ╔════════════════════════════════════════════════════════════════╗
  889. ║ Editorbefehle für TXL                         Der Editor    3  ║
  890. ╟────────────────────────────────────────────────────────────────╢
  891. ║ Grundsätzlich ist ein Editor nicht an ein bestimmtes Fenster   ║
  892. ║ gebunden; die Ausgaben der Editorfunktionen finden immer im    ║
  893. ║ obersten Fenster statt.                                        ║
  894. ║ Da insgesamt 10 Editoren zur Verfügung stehen (Nummer 0 bis 9) ║
  895. ║ , ist der erste Parameter der meisten Editor-Befehle die Nummer║
  896. ║ des angesprochenen Editors. Zuerst wird ein Editor mit         ║
  897. ║                                                                ║
  898. ║   initeditor <nummer> [file]                                   ║
  899. ║                                                                ║
  900. ║ initialisiert. Der optionale Parameter [file] hat den selben   ║
  901. ║ Zweck, wie [file] beim "edit"-Befehl. Wird er weggelassen, so  ║
  902. ║ lädt der Editor das TXL-Programm.                              ║
  903. ║ Der Befehl                                                     ║
  904. ║                                                                ║
  905. ║   editorproc <nummer>                                          ║
  906. ║                                                                ║
  907. ║ veranlaßt den Editor <nummer>, Benutzereingaben zu bearbeiten, ║
  908. ║ bis <ESC> oder <Ctrl>-T gedrückt wird. Der Editor wird durch   ║
  909. ║ Eingaben nicht automatisch geschlossen (anders als "edit").    ║
  910. ╚════════════════════════════════════════════════════════════════╝
  911. |
  912. ⌐<closeeditor>
  913. ╔════════════════════════════════════════════════════════════════╗
  914. ║ Editorbefehle für TXL                         Der Editor    4  ║
  915. ╟────────────────────────────────────────────────────────────────╢
  916. ║                                                                ║
  917. ║ Soll der vom Editorinhalt belegte Speicher freigegeben werden, ║
  918. ║ so ist der Befehl                                              ║
  919. ║                                                                ║
  920. ║    closeeditor <nummer>                                        ║
  921. ║                                                                ║
  922. ║ anzuwenden. Dieser Befehl speichert nur, wenn das aktuelle     ║
  923. ║ TXL-Programm geladen ist, und dann in die Datei "aktuell.txl". ║
  924. ║ Für Fälle, in denen es notwendig wird, den Fensterinhalt für   ║
  925. ║ einen Editor neu darzustellen, ist die Anweisung               ║
  926. ║                                                                ║
  927. ║    showeditor <nummer>                                         ║
  928. ║                                                                ║
  929. ║ gedacht. Sie ist aber nicht erforderlich, wenn der Text mit    ║
  930. ║ "editorproc" bearbeitet wird.                                  ║
  931. ║                                                                ║
  932. ╚════════════════════════════════════════════════════════════════╝
  933. |
  934. ⌐<setfkey>
  935. ╔════════════════════════════════════════════════════════════════╗
  936. ║ Editorbefehle für TXL                         Der Editor    5  ║
  937. ╟────────────────────────────────────────────────────────────────╢
  938. ║                                                                ║
  939. ║ Die Belegung der Hotkeys, die für alle Editoren gleichzeitig   ║
  940. ║ gelten, wird von                                               ║
  941. ║                                                                ║
  942. ║   setfkey <taste> <zeile>                                      ║
  943. ║                                                                ║
  944. ║ übernommen. Die Zeile mit der Nummer <zeile> wird angesprungen,║
  945. ║ wenn die angegebene Taste gedrückt wird. Steht in dieser Zeile ║
  946. ║ ein "blockbegin", so wird natürlich der darauf folgende Block  ║
  947. ║ ausgeführt. Die Angabe "0" bei <zeile> bewirkt die Löschung der║
  948. ║ Hotkey-definition für <taste>.                                 ║
  949. ║ <taste> kann folgende Werte haben :                            ║
  950. ║                                                                ║
  951. ║   1-10 : F1-F10            31-40 : Alt-F1-F10                  ║
  952. ║  11-20 : Shift-F1-F10      41-50 : Alt-1 bis Alt-0             ║
  953. ║  21-30 : Ctrl-F1-F10                                           ║
  954. ║                                                                ║
  955. ╚════════════════════════════════════════════════════════════════╝
  956. |
  957. ⌐<insertstring>
  958. ╔════════════════════════════════════════════════════════════════╗
  959. ║ Editorbefehle für TXL                         Der Editor    6  ║
  960. ╟────────────────────────────────────────────────────────────────╢
  961. ║ Neben der Funktion 0 von "edfunction", die einzelne Zeichen in ║
  962. ║ den Editor eingibt, existiert auch eine Funktion, die Strings  ║
  963. ║ in den Editor eingibt:                                         ║
  964. ║                                                                ║
  965. ║   insertstring <editornr> <str>                                ║
  966. ║                                                                ║
  967. ║ Außer dem String / der Stringvariablen wird als erster Param.  ║
  968. ║ die Editornummer erwartet.                                     ║
  969. ║                                                                ║
  970. ║ Das Lesen des Editors in TXL-Programmen kann wort- oder zeilen-║
  971. ║ erfolgen :                                                     ║
  972. ║                                                                ║
  973. ║   getedword <editornr> <str-var>                               ║
  974. ║   getedstring <editornr> <str-var>                             ║
  975. ║                                                                ║
  976. ║ Bei "getedword" muß der Cursor auf dem Anfang des Wortes stehen║
  977. ║ ,"getedstring" wird die gesamte Zeile in <str-var> gespeichert.║
  978. ║                                                                ║
  979. ╚════════════════════════════════════════════════════════════════╝
  980. |
  981. ╔════════════════════════════════════════════════════════════════╗
  982. ║ Das Datenbankmodul (c) 1991 toolbox                            ║
  983. ╟────────────────────────────────────────────────────────────────╢
  984. ║                                                                ║
  985. ║ Der Aufbau der Datenfelder ist frei wählbar und wird in einer  ║
  986. ║ Datei mit der Endung ".def" gespeichert, sobald einmal defin.  ║
  987. ║ Die Daten werden in gleichnamige Dateien, jedoch mit der Endung║
  988. ║ ".dat" geschrieben. Als Datenfeldtypen stehen Zeichenfelder mit║
  989. ║ frei definierbarer Länge und Integerfelder zur Verfügung.      ║
  990. ║ Die Sortierung der Daten erfolgt bei den Strings in einem      ║
  991. ║ binären Baum, was aber für die Programmierung in TXL nicht von ║
  992. ║ Bedeutung ist. Die vielfältigen Möglichkeiten beim Suchen von  ║
  993. ║ Datensätzen und sonstigen Funktionen werden auf den folgenden  ║
  994. ║ Seiten beschrieben.                                            ║
  995. ║                                                                ║
  996. ║ Bei den Befehlen des Datenbankmoduls ist die Groß- und Klein-  ║
  997. ║ schreibung zu beachten.                                        ║
  998. ║                                                                ║
  999. ║ Es können gleichzeitig 3 Datenbanken geöffnet werden, daher    ║
  1000. ║ haben die meisten Datenbankfunktionen einen Parameter <dbnr>,  ║
  1001. ║ für den Werte von 0 bis 2 erlaubt sind.                        ║
  1002. ║                                                                ║
  1003. ╚════════════════════════════════════════════════════════════════╝
  1004. |
  1005. ⌐<DefDB>
  1006. ╔════════════════════════════════════════════════════════════════╗
  1007. ║ Erstellen und Öffnen einer Datenbank    Das Datenbankmodul  1  ║
  1008. ╟────────────────────────────────────────────────────────────────╢
  1009. ║ Zuerst muß der Aufbau eines Datensatzes definiert werden.      ║
  1010. ║ Dazu wird für jedes Datenfeld die Funktion                     ║
  1011. ║                                                                ║
  1012. ║   DefDB <dbnr> <int?> <strlen>                                 ║
  1013. ║                                                                ║
  1014. ║ aufgerufen. <int?>=1 zeigt an, daß es sich um ein Integerfeld  ║
  1015. ║ handelt, der Parameter <strlen> muß vorhanden sein, sein Wert  ║
  1016. ║ bedeutet aber in diesem Fall nichts. Wenn <int?>=0 ist, wird   ║
  1017. ║ ein Stringfeld mit der Länge <strlen> erstellt. Der Parameter  ║
  1018. ║ <dbnr> gibt die Nummer der Datenbank an (0 bis 2).             ║
  1019. ║ Die Feldnummer wird automatisch ermittelt: Der erste Aufruf    ║
  1020. ║ definiert Feld 1, maximal 20 Felder sind möglich.              ║
  1021. ║ Ist die Definition vollständig, muß sie mit                    ║
  1022. ║                                                                ║
  1023. ║   CreateDB <dbnr> <name>                                       ║
  1024. ║                                                                ║
  1025. ║ gespeichert werden. Dabei werden die Dateien "<name>.def" und  ║
  1026. ║ "<name>.dat"                                                   ║
  1027. ║ neu erzeugt und dabei gelöscht, falls sie schon vorhanden sind.║
  1028. ╚════════════════════════════════════════════════════════════════╝
  1029. |
  1030. ⌐<OpenDB>
  1031. ╔════════════════════════════════════════════════════════════════╗
  1032. ║ Öffnen und Schließen einer Datenbank    Das Datenbankmodul  2  ║
  1033. ╟────────────────────────────────────────────────────────────────╢
  1034. ║                                                                ║
  1035. ║ Eine mit "CreateDB" erstellte Datenbank kann mit               ║
  1036. ║                                                                ║
  1037. ║   OpenDB <dbnr> <name>                                         ║
  1038. ║                                                                ║
  1039. ║ wieder geöffnet werden. Die Definition wird dabei automatisch  ║
  1040. ║ geladen, die Anwendung von "DefDB" ist hier also nicht nötig.  ║
  1041. ║                                                                ║
  1042. ║ Nach der Bearbeitung wird die Datenbank mit                    ║
  1043. ║                                                                ║
  1044. ║   CloseFile <dbnr>                                             ║
  1045. ║                                                                ║
  1046. ║ geschlossen.                                                   ║
  1047. ║                                                                ║
  1048. ╚════════════════════════════════════════════════════════════════╝
  1049. |
  1050. <WriteDB>
  1051. ╔════════════════════════════════════════════════════════════════╗
  1052. ║ Datenspeicherung                        Das Datenbankmodul  3  ║
  1053. ╟────────────────────────────────────────────────────────────────╢
  1054. ║                                                                ║
  1055. ║ Das Beschreiben eines Datensatzes erfolgt für jedes Feld       ║
  1056. ║ einzeln mit dem Befehl                                         ║
  1057. ║                                                                ║
  1058. ║   WriteDB <dbnr> <feldnr> <str> <int>                          ║
  1059. ║                                                                ║
  1060. ║ In das Feld <feldnr> des aktuellen Datensatzes der Datenbank   ║
  1061. ║ <dbnr> wird entweder der String <str>, oder der Integer <int>  ║
  1062. ║ geschrieben, je nach Feldtyp. Beide Parameter müssen angegeben ║
  1063. ║ werden. Besonders günstig ist die Dateneingabe mit Hilfe des   ║
  1064. ║ Editors, wie im Beispielprogramm demonstriert wird.            ║
  1065. ║ Mit "AddDB" wird der aktuelle Datensatz auf Disk gespeichert.  ║
  1066. ║   Syntax : AddDB <dbnr>                                        ║
  1067. ║                                                                ║
  1068. ╚════════════════════════════════════════════════════════════════╝
  1069. |
  1070. ⌐<ReadDB>
  1071. ╔════════════════════════════════════════════════════════════════╗
  1072. ║ Das Lesen der Daten                     Das Datenbankmodul  4  ║
  1073. ╟────────────────────────────────────────────────────────────────╢
  1074. ║ Analog zum Beschreiben eines Satzes funktioniert das Auslesen :║
  1075. ║                                                                ║
  1076. ║   ReadDB <dbnr> <feldnr> <str> <int>                           ║
  1077. ║                                                                ║
  1078. ║ liest das Feld <feldnr> und speichert den Inhalt je nach Typ   ║
  1079. ║ entweder in <str> oder <int>.                                  ║
  1080. ║                                                                ║
  1081. ║ Zur Formatierten Ausgabe bessert geeignet ist folgender Befehl:║
  1082. ║                                                                ║
  1083. ║   ReadDBForm <dbnr> <feldnr> <str>                             ║
  1084. ║                                                                ║
  1085. ║ gibt in jedem Fall einen String zurück, der auf die Maximale   ║
  1086. ║ Länge des Feldes ausgedehnt ist (linksbündig ausgerichtet),    ║
  1087. ║ und sich so gut für Tabellen eignet. Integerwerte werden in    ║
  1088. ║ einen sechs Zeichen langen String umgewandelt.                 ║
  1089. ║                                                                ║
  1090. ╚════════════════════════════════════════════════════════════════╝
  1091. |
  1092. ⌐<GotoBegin>
  1093. ╔════════════════════════════════════════════════════════════════╗
  1094. ║ Bewegung innerhalb der Datenbank        Das Datenbankmodul  5  ║
  1095. ╟────────────────────────────────────────────────────────────────╢
  1096. ║                                                                ║
  1097. ║ Nach der Öffnung befindet sich als aktueller Datensatz ein     ║
  1098. ║ neuer Satz im Speicher, der hinter allen bisher gespeicherten  ║
  1099. ║ Datensätzen in der Datei gespeichert wird. Um den aktuellen    ║
  1100. ║ Datensatz zu ändern, existieren, außer den Datensuchbefehlen,  ║
  1101. ║ folgende Befehle :                                             ║
  1102. ║                                                                ║
  1103. ║   Befehl                        Zielposition                   ║
  1104. ║                                                                ║
  1105. ║   GotoBegin  <dbnr>             erster Datensatz der Datei     ║
  1106. ║   GotoEnd    <dbnr>             ein Satz hinter dem letzten    ║
  1107. ║   GoForward  <dbnr>             einen Satz weiter              ║
  1108. ║   GoBackward <dbnr>             einen Satz zurück, -> Anfang   ║
  1109. ║   GoTo       <dbnr> <filepos>   Dateiposition(Bytenr.)<filepos>║
  1110. ║   GoToNr     <dbnr> <satznr>    Datensatz Nummer <satznr>      ║
  1111. ║                                                                ║
  1112. ╚════════════════════════════════════════════════════════════════╝
  1113. |
  1114. ⌐<MarkCurrent>
  1115. ╔════════════════════════════════════════════════════════════════╗
  1116. ║ Löschen von Datensätzen                 Das Datenbankmodul  6  ║
  1117. ╟────────────────────────────────────────────────────────────────╢
  1118. ║                                                                ║
  1119. ║ Der aktuelle Datensatz wird durch                              ║
  1120. ║                                                                ║
  1121. ║   MarkCurrent <dbnr> <val>                                     ║
  1122. ║                                                                ║
  1123. ║ mit <val> markiert. <val> ungleich 0 bedeutet Löschen.         ║
  1124. ║                                                                ║
  1125. ║   DelMarked <dbnr>                                             ║
  1126. ║                                                                ║
  1127. ║ löscht alle markierten Datensätze physikalisch in der Datei.   ║
  1128. ║ Die Markierung kann entweder mit "MarkCurrent <dbnr> 0" für    ║
  1129. ║ einen speziellen Satz, oder mit                                ║
  1130. ║                                                                ║
  1131. ║   UnMarkAll <dbnr>                                             ║
  1132. ║                                                                ║
  1133. ║ für alle markierten Sätze rückgängig gemacht werden.           ║
  1134. ║                                                                ║
  1135. ╚════════════════════════════════════════════════════════════════╝
  1136. |
  1137. <SearchDB>
  1138. ╔═══════════════════ ════════════════════════════════════════════╗
  1139. ║ Suchen ohne Baum                        Das Datenbankmodul  7  ║
  1140. ╟────────────────────────────────────────────────────────────────╢
  1141. ║                                                                ║
  1142. ║ Zur Suche mit komplexen Bedingungen ist der Befehl             ║
  1143. ║                                                                ║
  1144. ║   SearchDB <dbnr> <test> <ausg>                                ║
  1145. ║                                                                ║
  1146. ║ gedacht. Er geht die Datenbank Satz für Satz durch und ruft für║
  1147. ║ jeden Satz das Unterprogramm ab der Zeile <test> auf. Dieses   ║
  1148. ║ kann mit "ReadDB" den aktuellen Satz auf verschiedene          ║
  1149. ║ Bedingungen testen und ruft "GefundenOK" ohne Parameter auf,   ║
  1150. ║ falls der Datensatz den gewünschten Bedingungen entspricht.    ║
  1151. ║ Ist dies der Fall, so ruft "SearchDB" das Unterprogramm <ausg> ║
  1152. ║ auf, das die Bearbeitung oder Ausgabe des Satzes übernimmt.    ║
  1153. ║ In beiden Unterprogrammen kann die Suche mit dem parameterlosen║
  1154. ║ Befehl "StopSearch" beendet werden.                            ║
  1155. ║                                                                ║
  1156. ╚════════════════════════════════════════════════════════════════╝
  1157. |
  1158. ⌐<MakeTree>
  1159. ╔════════════════════════════════════════════════════════════════╗
  1160. ║ Sortieren                               Das Datenbankmodul  8  ║
  1161. ╟────────────────────────────────────────────────────────────────╢
  1162. ║                                                                ║
  1163. ║ Jede der Datenbanken kann für eines der Zeichenfelder einen    ║
  1164. ║ binären Baum zur Sortierung aufbauen.    Durch den Befehl      ║
  1165. ║                                                                ║
  1166. ║   MakeTree <dbnr> <feldnr>                                     ║
  1167. ║                                                                ║
  1168. ║ veranlaßt. Für das (String-)Feld <feldnr> baut die Datenbank # ║
  1169. ║ <dbnr> einen Baum auf. Dieser kann mit                         ║
  1170. ║                                                                ║
  1171. ║   DelTree <dbnr>                                               ║
  1172. ║                                                                ║
  1173. ║ explizit wieder gelöscht werden, was aber automatisch geschieht║
  1174. ║ ,wenn erneut "MakeTree" für dieselbe Datenbank aufgerufen wird.║
  1175. ║                                                                ║
  1176. ╚════════════════════════════════════════════════════════════════╝
  1177. |
  1178. ⌐<PassTree>
  1179. ╔════════════════════════════════════════════════════════════════╗
  1180. ║ Nutzung des sortierten Baumes           Das Datenbankmodul  9  ║
  1181. ╟────────────────────────────────────────────────────────────────╢
  1182. ║ Die Funktion "PassTree" geht ebenso wie "SearchDB" die gesamte ║
  1183. ║ Datenbank durch, jedoch in der Reihenfolge, die durch den Baum ║
  1184. ║ vorgegeben ist. Für jeden Datensatz wird wieder eine Test- und ║
  1185. ║ dann je nach Ergebnis eine Bearbeitungs-/Ausgaberoutine auf-   ║
  1186. ║ gerufen. Die Syntax ist demnach dieselbe wie bei "SearchDB" :  ║
  1187. ║                                                                ║
  1188. ║   PassTree <dbnr> <test> <ausg>                                ║
  1189. ║                                                                ║
  1190. ║ Zum direkten Auffinden eines Datensatzes dient der Befehl:     ║
  1191. ║                                                                ║
  1192. ║   SearchTree <dbnr> <ERGEBNIS> <str>                           ║
  1193. ║                                                                ║
  1194. ║ Er sucht <str> im Baum (<str> muß also in einem Feld stehen,   ║
  1195. ║ daß im Baum sortiert wurde) und gibt die Dateiposition des     ║
  1196. ║ gefundenen Satzes in <ERGEBNIS> zurück. Der Wert 1 Milliarde   ║
  1197. ║ bedeutet, daß der Satz nicht gefunden wurde.                   ║
  1198. ║ Die Position ist mit "GoTo", nicht mit "GoToNr" direkt         ║
  1199. ║ ansteuerbar, sie wird auch automatisch gesetzt,                ║
  1200. ║ wenn <str> gefunden wurde.                                     ║
  1201. ╚════════════════════════════════════════════════════════════════╝
  1202. |
  1203. ⌐<ListTree>
  1204. ╔════════════════════════════════════════════════════════════════╗
  1205. ║ Ausgabe des sortierten Baumes           Das Datenbankmodul  10 ║
  1206. ╟────────────────────────────────────────────────────────────────╢
  1207. ║                                                                ║
  1208. ║ Um eine einfache Baumausgaberoutine handelt es sich bei:       ║
  1209. ║                                                                ║
  1210. ║   ListTree <dbnr>                                              ║
  1211. ║                                                                ║
  1212. ║ Der Bauminhalt wird (sortiert) wie mit "drucke" ausgegeben,    ║
  1213. ║ also nicht in  irgendein Fenster.                              ║
  1214. ║                                                                ║
  1215. ╚════════════════════════════════════════════════════════════════╝
  1216. |
  1217. ╔════════════════════════════════════════════════════════════════╗
  1218. ║ Der Präprozessor (c) 1991 toolbox                            1 ║
  1219. ╟────────────────────────────────────────────────────────────────╢
  1220. ║ Der Präprozessor wandelt ein Programm im Editor in ein TXL-aus-║
  1221. ║ führbares Programm um. Er wird mit Ctrl-T im Editor aufgerufen.║
  1222. ║ Nach Drücken dieser Tastenkombination wird das Programm auto-  ║
  1223. ║ matisch gespeichert, mit dem Präprozessor in die Datei         ║
  1224. ║ "AKTUELL.TXL" umgewandelt und automatisch in den Programm-     ║
  1225. ║ speicher eingelesen.                                           ║
  1226. ║                                                                ║
  1227. ║ Die Verbesserungen durch den Präprozessor sind :               ║
  1228. ║   - Wegfall der Zeilennumern am Anfang jeder Zeile             ║
  1229. ║   - Ansteuerung von Unterprogrammen und Programmzeilen (gehezu ║
  1230. ║     und gosub) mit Namen statt mit Zeilennummern               ║
  1231. ║   - Einführung von Bezeichnern für Konstanten, die vom Präproz.║
  1232. ║     automatisch eingesetzt werden.                             ║
  1233. ║   - Leerzeilen sind möglich                                    ║
  1234. ║                                                                ║
  1235. ║ Sowohl Programmzeilenbezeichnungen, als auch Konstanten können ║
  1236. ║ auch nach ihrer ersten Bezeichnung noch definiert werden.      ║
  1237. ║                                                                ║
  1238. ╚══════════════════════════════════════════════════< weiter >════╝
  1239. |
  1240. ╔════════════════════════════════════════════════════════════════╗
  1241. ║ Die Präprozessorbefehle                                      2 ║
  1242. ╟────────────────────────────────────────────────────────────────╢
  1243. ║                                                                ║
  1244. ║ 1. label <name>                                                ║
  1245. ║                                                                ║
  1246. ║   ordnet der folgenden Zeile den Bezeichner <name> zu, der     ║
  1247. ║   überall im Programm verwendet werden kann.                   ║
  1248. ║                                                                ║
  1249. ║ 2. const <name> <wert>                                         ║
  1250. ║                                                                ║
  1251. ║   definiert eine Konstante, die den Wert <wert> und die Be-    ║
  1252. ║   zeichnung <name> hat.                                        ║
  1253. ║                                                                ║
  1254. ╚══════════════════════════════════════════════════< weiter >════╝
  1255. |
  1256. ╔════════════════════════════════════════════════════════════════╗
  1257. ║ Ein Beispiel für den Präprozessor                            3 ║
  1258. ╟────────────────────────────────────────────────────────────────╢
  1259. ║                                                                ║
  1260. ║ gehezu haupt                                                   ║
  1261. ║                                                                ║
  1262. ║ label Unterprogramm                                            ║
  1263. ║   blockbegin                                                   ║
  1264. ║     drucke KONSTANTE                                           ║
  1265. ║   blockend                                                     ║
  1266. ║                                                                ║
  1267. ║ label haupt                                                    ║
  1268. ║   ...                                                          ║
  1269. ║   gosub Unterprogramm                                          ║
  1270. ║   ...                                                          ║
  1271. ║                                                                ║
  1272. ║ const KONSTANTE 2000                                           ║
  1273. ║                                                                ║
  1274. ╚════════════════════════════════════════════════════════════════╝
  1275.  
  1276.  
  1277. ,,5
  1278. ⌐5. Besonderheiten der Atari-ST Version von TXL
  1279. ⌐══════════════════════════════════════════════
  1280.  
  1281. Die TXL-Version für den Atari-ST ist nicht voll kompatibel zur
  1282. DOS-Version. Durch Eingabe von "COMMANDS" erhalten sie auch hier
  1283. eine komplette Befehlsübersicht. Die Atari-ST-Version verfügt
  1284. allerdings über ein paar sehr mächtige zusätzliche Funktionen.
  1285. Tracer sowie Formelinterpreter und dynamische Strings bieten
  1286. hier ein weites Feld für jeden Programmierer. Die Funktionen im
  1287. Detail:
  1288.  
  1289. Der Tracer
  1290. ----------
  1291. dient wie seine Kollegen gleichen Namens zur Unterstützung bei
  1292. der Fehler- suche. Zu diesem Zweck wurde er mit folgenden
  1293. Fähigkeiten ausgestattet:
  1294.  
  1295. - Nach Ausführung der aktuellen Zeile wird diese angezeigt,
  1296.   woraufhin der Tracer auf eine Tasteneingabe wartet. Die mit
  1297.   Funktionen belegten Tasten werden im folgenden erklärt.
  1298.  
  1299. - "H" erklärt kurz die Tracerfunktionen.
  1300. - "V" zeigt alle Variablen mit Namen und Wert an.
  1301. - "N" erfragt einen Variablennamen und zeigt deren Wert an.
  1302. - "S" erfragt einen Variablennamen, sowie einen neuen Wert, und
  1303.       setze die Variable auf diesen Wert.
  1304. - "L" zeigt die aktuelle Zeile noch einmal an.
  1305. - "A" schaltet den Trace-Modus aus, d.h. der Tracer wird nach
  1306.       ausführen der einzelnen Zeilen nicht mehr aufgerufen. Der
  1307.       Trace-Modus wird durch den Interpreterbefehl " verfolge"
  1308.       wird aktiv.
  1309. - "B" Beendet das Programm - Die Returntaste führt die
  1310.       nächste Zeile aus.
  1311.  
  1312.  Zur Implementierung : Der Tracer wird durch die Funktion Trace
  1313.  realisiert, welche die aktuelle Zeile anzeigt, auf einen
  1314.  Tastendruck wartet und die dazugehörigen Funktionen ausführt.
  1315.  Der Tracer wird in DoProgram in Abhän- gigkeit der Variablen
  1316.  traceFlag aufgerufen. Zu seiner Steuerung gibt es die
  1317.  Interpreterbefehle :
  1318.  
  1319. - verfolge : schaltet den Tracer an, und gibt eine entsprechende
  1320.   Meldung aus folgenicht : schaltet den Tracer aus wachhund : um
  1321.   den Tracer für eine einmalig Inspektion der Variablen auf-
  1322.   zurufen ( auch aus dem Direktmodus möglich ); traceFlag wird
  1323.   nicht auf TRUE gesetzt der Wachhund meldet sich mit einem
  1324.   kräftigen "wuff wuff" Die Tracerfunktion "S" ( setze neuen
  1325.   Wert ) verwendet einen kleinen Trick.
  1326.   Um nicht extra eine Eingaberoutine schreiben zu müssen wird
  1327.   der Scanner auf den Eingabepuffer des Tracer's umgelenkt (
  1328.   LinePos auf den Anfang des Puffer's setzen ), und ReadValue
  1329.   aufgerufen. Einziger Nachteil : Bei Strings müssen die
  1330.   Anführungszeichen mit angegeben werden, da der Scanner die
  1331.   Eingabe sonst nicht als String erkennt. Um das Programm aus
  1332.   dem Tracer heraus zu beenden, wird einfach IntError auf TRUE
  1333.   gesetzt.
  1334.  
  1335.  Folgende Erweiterungen in den einzelnen Modulen sind nötig :
  1336.  
  1337.  - 3 neue Tokens in interp.h
  1338.  
  1339.  - die Prototypen in intprot.h
  1340.  
  1341.  - die Funktionen ctrcon, ctrcoff,cwdog in ibefehle.c
  1342.    realisieren
  1343.  
  1344.  - diese Befehle, Aufrufnamen etc. in die Struktur TokBefDesc in
  1345.    intglob.c eintragen
  1346.  
  1347.  - die Variable traceFlag im selben Modul deklarieren
  1348.  
  1349.  - im Modul itracer.c die eigentliche Tracer-Funktion
  1350.    implementieren
  1351.  
  1352.  - den Modul itracer.c in die Projektdatei eintragen
  1353.  
  1354.  - in DoProgram in interp.c den Tracer aufrufen
  1355.  
  1356. Eine Erweiterung die nicht mit dem Tracer zusammenhängt, aber
  1357. ebenfalls bei der Suche nach Fehlern nützlich ist, soll hier
  1358. erwähnt werden. In der Funktion DoProgram wird im Fehlerfall die
  1359. fehlerbehaftete Zeile angezeigt, so da₧ man wei₧ wo der Fehler
  1360. aufgetreten ist:
  1361.  
  1362.  
  1363. Der Formelinterpreter
  1364. ---------------------
  1365.  Die Auswertung eines Ausdrucks wurde vollständig umgestrickt,
  1366.  und erlaubt nun auch solche Ausdrücke wie
  1367.  "2*sqr(3+4*x)-min(2,y,4)". Dabei wird die Priorität der
  1368.  Operatoren beachtet.  Es sind Funktionen mit mehr als einem
  1369.  Parameter, ja sogar mit einer beliebigen Zahl von Parametern
  1370.  möglich. Ein Beispiel dafür ist die Funktion min (welche, wie
  1371.  nicht schwer zu erraten, das Minimum der übergebenen Werte
  1372.  bestimmt), die sowohl mit einem, mit 2, mit 3 mit ... eben
  1373.  soviel Parametern aufgerufen werden kann, wie auf den Stack
  1374.  passen. Wie wird so ein Ausdruck nun ausgewertet ? Nun, ein
  1375.  Ausdruck ( im Fach- chinesisch Expression gennant ) besteht aus
  1376.  Operanden und Operatoren.
  1377.  
  1378.  Bspiel: 2*3+4*7
  1379.  
  1380.  Dabei bindet der Operator * die Operanden 2,3,4,7 stärker als
  1381.  der Operator +. Wir können also den Ausdruck in 2 Teilausdrücke
  1382.  2*3 und 4*7 aufteilen, die durch ein + verbunden sind. So einen
  1383.  Teilausdruck nennen wir fortan Term. Die durch das *
  1384.  verbundenen Operanden nennen wir Faktoren. Gleichrangig zu +
  1385.  ist -, sowie / zu *. Ein Faktor kann jedoch nicht nur eine Zahl
  1386.  sein, wie im obigen Beispiel, sondern auch :
  1387.  
  1388.  - eine Variable : 2*x+3*y - wiederum ein Ausdruck, der durch
  1389.  Klammern eingeschlossen ist : 2*(3+6/x)-2
  1390.  
  1391.  - ein Funktionsbezeichner wie sin,cos,min,sqr ... in diesem
  1392.  Fall muß eine sich öffnende Klammer, ein Ausdruck und eine sich
  1393.  schließende Klammer folgen 2*sin(3+x)+cos(2)+sqr((4+y)*2).
  1394.  
  1395.  Viel deutlicher als mit Worten, läßt sich dies mit Hilfe des
  1396.  EBNF ( Erweiterten Backus Naur Formalismus ) erklären. Der
  1397.  EBNF ist eine Metasprache, eine Sprache, welche die
  1398.  Beschreibung einer natürlichen Sprache oder einer
  1399.  Programmiersprache ermöglicht. Und solche Ausdrücke wie oben,
  1400.  sind jedem beim Programmieren schon ungezählte male begegnet.
  1401.  Die EBNF verwendet folgende Metasymbole zum Beschreiben der
  1402.  Sprachregeln: | um eine Alternative anzuzeigen :
  1403.  a | b bedeutet entweder a oder b [] um ein ein- oder
  1404.  keinmaliges Vorkommen zu beschreiben [ a ] bedeutet ein a oder
  1405.  kein a {} um eine beliebige Wiederholung auszudrücken {a} kann
  1406.  a aa aaa aaaa aaaaa ... bedeuten in " eingeschlossene Symbole
  1407.  müssen an der Stelle ihres Auftretens stehen.
  1408.  Eine Expression können wir also so beschreiben :
  1409.   Expression = ["+" | "-" ] Term { AddOppearator Term }.
  1410.  
  1411.  Als erstes Symbol einer Expression KANN ein "+" oder ein "-"
  1412.  stehen. Diese beiden Symbole können aber auch fehlen ( siehe []
  1413.  ). Dann muß ein Term folgen. Darauf können beliebig viele
  1414.  Wiederholungen eines Addoperators, gefolgt von einem Term
  1415.  stehen. Bsp. : - 2 + 3*4 Vorzeichen Term Addoperator Term 4*3 -
  1416.  2 + 4*x Term AddOperator Term AddOperator Term.
  1417.  
  1418.  Daraus wird auch schon die Erklärung des AddOpeartors
  1419.  ersichtlich AddOpeartor = "+" | "-". Die noch fehlenden Regeln
  1420.  : Term = Faktor { MulOpeartor Faktor } MulOperator = "*" | "/".
  1421.  Faktor = Zahl | Variablenname | "(" Expression ")" |
  1422.  Funktionsname "(" Expression ")". Zahl, Variablenname und
  1423.  Funktionsname dürften klar sein. Die Metasymbole entsprechen im
  1424.  Programm jeweils einer Anweisung. | entspricht z.B. einem if
  1425.  else Konstrukt, {} einer Schleife. Ein weiteres wichtiges
  1426.  Mittel zur Implementierung ist die Rekursion, da die Regeln
  1427.  sich selbst wieder aufrufen, z.B. kann ein Faktor wiederum eine
  1428.  Expression sein. Die Auflösung eines Ausdrucks geschieht also
  1429.  durch wiederholtes ( rekursives )Aufrufen der Funktionen
  1430.  Expression, Term und Faktor. Dabei wird der Ausdruckin die UPN
  1431.  transformiert. 2+3 ergibt also 2 3 +, 2+3*4 2 3 4 * +. Gerade
  1432.  das letzte Beispiel zeigt, das ein Operatorenstack zur
  1433.  Berechnung des Ausdruck's nicht geeignet ist, da er die
  1434.  Priorität der Operatoren nicht gewährleistet.
  1435.  
  1436.  Bei 2+3 muß das "+" also solange zwischengespeichert werden,
  1437.  bis die 3 auch gelesen ist. Dazu eignet sich eine lokale
  1438.  Variable, die auch beim Aufruf von Term erhalten bleibt
  1439.  bestens. Globale Variablen erfüllen diesen Zweck mitnichten. Im
  1440.  Gegensatz zur bisherigen Version werden also nicht alle
  1441.  Operanden und Operatoren zuerst auf den entsprechenden Stack
  1442.  verfrachtet, und dann in einem Rutsch alle Berechnungen
  1443.  durchgeführt ( CalcResult ), sondern sobald alle Werte eines
  1444.  Operatoren auf dem Stack liegen aus Expression, Term oder
  1445.  Faktor heraus CalcResult für EINE Berechnung aufgerufen. Bsp. :
  1446.  2 * 3 + 4 2 auf Stack -- merke * -- 3 auf Stack -- berechne *,
  1447.  ergibt 6 auf Stack merke + -- 4 auf Stack -- berechne +, ergibt
  1448.  10 auf Stack CalcResult führt also nur jeweils eine Berechnung
  1449.  durch. Einige Funktionen, z.B. min, die eine unbestimmte Anzahl
  1450.  von Werten auf dem Stack verarbeiten, werden direkt, ohne Umweg
  1451.  über CalcResult, aufgerufen.
  1452.  
  1453.  Tiefer möchte ich auf diese Materie an dieser Stelle nicht
  1454.  eingehen, aber auf [1] und [2] verweisen, wobei vor allem in
  1455.  [2] der EBNF ausführlich erklärt wird, und in beiden ein
  1456.  Programm zur Auswertung von Expressions erstellt wird.
  1457.  
  1458.  Hier nun die bereits zur Verfügung stehenden Funktionen :
  1459.   sqr (Quadrat ),
  1460.   sqrt ( Quardratwurzel ),
  1461.   sin, cos, tan, atan, ln, exp.
  1462.  
  1463.  Zudem die beiden Funktionen min (Minimum) und max (Maximunm).
  1464.  Während die erstgenannten Funktionen genau einen Parameter
  1465.  benötigen, können diese beiden, wie oben bereits erklärt, mit
  1466.  einer variablen Anzahl von Parametern aufgerufen werden. Sie
  1467.  können jedoch wie die anderen in Ausdrücken verwendet werden.
  1468.  Bsp. setze x=sqr(3)+min(a,3,67,b)+23; Um ein ordentliches
  1469.  Ergebnis der Funktionen zu gewährleisten, wurde der Flotype in
  1470.  der Variablendeklaration als float deklariert ( siehe interp.h
  1471.  ). Der Stack verwaltet wie bisher nur einen Zahlentyp, dies ist
  1472.  nun ebenfalls float. Es gibt also keine Möglichkeit eine
  1473.  Integervariable zu deklarieren. Eine Unterscheidung dieser
  1474.  beiden Typen, würde eine Erweiterung des Funktion CalcResult
  1475.  erfordern. Zudem müßten bei gemischten Ausdrücken ( z.B. 2 *
  1476.  3.5 ) d.h. integer * float, Typumwandlungen vorgenommen werden.
  1477.  Dies ist natürlich möglich, scheint uns aber beim gegenwärtigen
  1478.  Stand der Entwicklung mehr zu verwirren, als zu nützen.
  1479.   Schließlich soll jemand, der sich den Quelltext anschaut, den
  1480.  Überblick behalten.
  1481.  Alle Namen werden in ifuncs ( siehe intutil.c ) aufgenommen.
  1482.  Die Funktion TestFunc ( sie wird in Faktor aufgerufen, wenn ein
  1483.  Bezeichner gefunden wird ), vergleicht den gefundenen
  1484.  Bezeichner mit den vorhandenen Namen und liefert falls gefunden
  1485.  dessen Index. TestFunc arbeitet wie TestBefehl aus interp.c. Da
  1486.  in dieser Version kein Parameterstack mehr verwendet wird, wird
  1487.  der Operator der Funktion CalcResult als Parameter übergeben.
  1488.  Da die Anzahl der benötigten Operanden unterschiedlich ist (
  1489.  +-*/ benötigen 2, sin,cos ... nur einen ) wird CalcResult als
  1490.  zweiter Parameter die Anzahl der benötigten Opaeranden
  1491.  übergeben.
  1492.  Die Auswertung von Bedingungen ( Compare ) arbeitet nun
  1493.  ebenfalls mit Aus- drücken. Ein Vergleich der Form 2*3+x <=
  1494.  12-y ist somit möglich.
  1495.  
  1496.  Die benötigten Erweiterungen :
  1497.  
  1498. - die neuen Prototypen in intprot.h
  1499.  
  1500. - ändern der Prototypen von CalcResult, Compare und ReadComp
  1501.  
  1502. - Deklaration der Variablen expOk in intutil.c, die
  1503.   anzeigt, ob die Auswertung eines Ausdrucks reibungslos
  1504.   verlaufen ist
  1505.  
  1506. - die Funktionsnamen in ifuncs ( ebenfalls in intutil.c )
  1507.   vereinbaren
  1508.  
  1509. - die neuen Funktionen implementieren
  1510.  
  1511. - CalcResult anpassen
  1512.  
  1513. - die 3 Compare-Funktionen anpassen
  1514.  
  1515. - Da CalcExpression nun auch von anderen Funktionen als SetVar
  1516.   aufgerufen wird, die nicht immer ein Zeilenende voraussetzen,
  1517.   wurde dieser Test nach SetVar verlagert.
  1518.  
  1519. - Die Ausgabe funktioniert ebenfalls mit Audrücken : drucke
  1520.   2*sqr(3) -> 18
  1521.  
  1522. - Erweitern des Scanners, sodaß er auch Kommas als Sonderzeichen
  1523.   erkennt, welche zur Trennung der Parameter benötigt werden
  1524.  
  1525.  
  1526. Dynamische Strings
  1527. ------------------
  1528. WIr haben uns für dynamische Strings entschieden, weil sie dem
  1529. Anwender am meisten Komfort bieten, nicht so schwer zu
  1530. implementieren sind, wie man im ersten Moment meint, weil's
  1531. am meisten Spaß macht. Etwas Sorgfalt verlangt lediglich die
  1532. Verwaltung des Speichers, den ein dynamischer String belegt. Ist
  1533. dieser zu klein, können leicht andere wichtige Teile
  1534. überschrieben werden. Ansonsten werden dynamische Strings ( ab
  1535. jetzt einfach Strings genannt ) im TXL-Interpreter wie andere
  1536. Daten auch behandelt. Gleichheit für alle. Natürlich sind
  1537. nicht alle Operationen die auf Zahlen anwendbar sind, auch
  1538. aufStrings anwendbar. sin("hallo Baby") geht wohl schlecht, daß
  1539. hätten wir in Mathe mitbekommen. Dafür gibts aber auch
  1540. Operationen, die nur mit Strings funktionieren. Trifft der
  1541. Formelinterpreter also auf einen String, wird dieser auf den
  1542. Stack verfrachtet, genauer gesagt, der Zeiger auf den String.
  1543. Die Stringoperationen nehmen diesen Zeiger von Stack, ordnen ihn
  1544. einem anderen Speicherplatz zu, wenn der Speicher durch die
  1545. Operation zu klein wird und geben den alten Speicher frei.
  1546. SetValue, richtet nun einfach VarWert.variable.text auf diesen
  1547. Speicher aus, und gibt eventuell vorher schon durch diese
  1548. Variable belegten Speicher wieder frei.
  1549.  
  1550. Ganz einfach oder ?
  1551. Die Stringoperatoren : + Verkettet Strings : "hallo"+ " wie
  1552. "+"geht's" ergibt "hallo iw geht's" * setzt einen String
  1553. linksbündig ein : "hallo"*"H" ergibt "Hallo" / setzt rechtbündig
  1554. ein :
  1555.  
  1556. "abcde"/"--" ergibt "abc--" 'links' liefert eine vorgegebene
  1557. Anzahl Zeichen von links :
  1558.  
  1559. links("hallo",2) ergibt "ha" 'rechts' wie links von rechts her :
  1560.  
  1561. rechts("hallo",2) ergibt "lo" 'mitte' liefert Zeichen mitten aus
  1562. dem String mitte
  1563.  
  1564. ("hallalli",3,4) ergibt "lall"
  1565.  
  1566. 'laenge' liefert die Länge eines String's :
  1567.  
  1568. laenge("hey") ergibt 3
  1569.  
  1570. 'suche' liefert die Position, an welcher ein String in einem
  1571. anderen enthalten ist
  1572.  
  1573. suche("45","1234567",0) ergibt 3 der 3.
  1574.  
  1575. Parameter bezeichnet die Startposition der Suche.
  1576.  
  1577. Das waren Funktionen, nun folgen noch neue Interpreterbefehle:
  1578.  
  1579. 'kopiere' kopiert Zeichen in eine Stringvariable hinein.
  1580. s="abcdefg" ergibt kopiere("123",s,1) "a123efg"
  1581.  
  1582. 'einfuegen' fügt Zeichen ein, ohne andere dadurch zu
  1583. überschreiben: einfügen("123",s,1 ) ergibt "a123bcdefg"
  1584.  
  1585. 'loesche' löscht Zeichen. loesche(s,2,3) ergibt "abcfg"
  1586.  
  1587. kopiere,einfuegen und loesche erwartet dabei an der Stelle an
  1588. der in den Beispielen s steht eine Stringvariable. An allen
  1589. anderen Stellen kann auch ein Stringausdruck stehen.
  1590.  
  1591. Beispiele:
  1592. mit s="hallo wie geht's"
  1593. setze l=links(s+" denn so",laenge(s)+5) ergibt "hallo wie
  1594. geht's denn" kopiere "WIE",s,suche("wie,s,0) ergibt "hallo WIE
  1595. geht's" setze a="abcdefg"+"hijklm"*"~~"/".." ergibt
  1596. "abcdefg~~jk.."
  1597.  
  1598. Zudem sind die üblichen Vergleichsoperatoren auf Strings
  1599. anwendbar. Die notwendigen Erweiterungen :
  1600.  
  1601. - 3 neue Tokens in interp.h
  1602.  
  1603. - die Prototypen in intprot.h
  1604.  
  1605. - die Funktionen ccopy, cins, cdel in ibefehle.c realisieren
  1606.  
  1607. - diese Befehle, Aufrufnamen etc. in die Struktur TokBefDesc in
  1608.   intglob.c eintragen
  1609.  
  1610. - die Vergleiche für String realisieren
  1611.  
  1612. Zudem wurden 3 Hilfsfunktionen in intutil.c aufgenommen, die
  1613. zum aufschlüsseln der jeweils benötigten Parameter dienen. Die
  1614. Erklärung siehe dort.
  1615.  
  1616. Der lese-Befehl
  1617. ---------------
  1618.  Syntax : lese Variablenbezeichner lese führt zur Funktion
  1619.  creadvar. Diese ruft Scan auf, und testet ob es sich um einen
  1620.  Bezeichner handelt ( Steuer == ALPHA ). Sodann wird SetVar
  1621.  aufge- rufen. Dadurch ist es auch möglich Ausdrücke zuzuweisen.
  1622.  Alles hat seine 2 Seiten, Strings müßten in " eingeschlossen
  1623.  sein, da sie sonst nicht als solche erkannt werden. Wollen Sie
  1624.  also den Sting "hallo" in die Variable "s" einlesen, müssen Sie
  1625.  "hallo" eingeben. Erweiterungen :
  1626.  
  1627. - Token
  1628.  
  1629. - Prototyp
  1630.  
  1631. - TokBefDesc erweitern
  1632.  
  1633. - creadvar Zum Schluß noch ein Hinweis auf einen Fehler im 
  1634.   Scanner. Nach dem Einlesen von Strings trat ein Fehler auf, da
  1635.   mit dem letzten GetChar schon das erste Zeichen nach dem String
  1636.   gelesen wird. Daher muß dort ein NoSkipChar folgen.
  1637.  
  1638. Verwendete Hardware :
  1639. Atari 520 ST+ Programmiersprache : Turbo C 2.0
  1640.  
  1641. Literatur :
  1642.  
  1643. [1] PASCAL international 8/87 CALC ein Mathe-Compiler für
  1644. Formeln und Funktionen
  1645.  
  1646. [2] MODULA-2 für Atari ST Ralf Morgenstern Heim-Verlag 1990
  1647. Kapitel 10 : Die MODULA-2 Syntax und der EBNF
  1648.  
  1649.  
  1650. ,,6
  1651. ⌐6. TXL unter Windows: Die Befehle
  1652. ⌐═════════════════════════════════
  1653.  
  1654. Die TXL-Version unter Windows verfügt wie alle TXL-Versionen über den
  1655. vollen deutschen Grundbefehlssatz (siehe toolbox 10'90).
  1656. Darüber hinaus nutzt es die Windows-Architektur optimal aus.
  1657.  
  1658. Über die Funktionstasten F7 und F8 läßt sich blitzschnell zwischen
  1659. Editor und Direktmodus wechseln. Um TXL-Programme zu laden, kann man
  1660. entweder im Menü auf die Option "laden/load" gehen oder im Direktmodus
  1661. <load"> mit abschließendem Return eingeben. Danach öffnet sich dann
  1662. eine Fileselect Box und ermöglicht die interaktive Eingabe eines
  1663. Filenamens.
  1664.  
  1665. Mit "RUNB" lassen sich beispielsweise Programme im Hintergrund als
  1666. einzelner Task starten. Ein Feature, was wesentlich teurere Systeme in
  1667. dieser Form nicht anzubieten haben.
  1668. Effektives Multitasking ohne lästige Speicherdefinitionen wird so
  1669. erstmals unter einem Windows-Interpreter ermöglicht.
  1670. Teilweise wurden Befehle des DOS-TXL nicht in die Windows-Version
  1671. übernommen. Durch das offene System der Sprache ist es aber ohne
  1672. Probleme möglich, sich die benötigten Erweiterungen selbst
  1673. einzubinden. Die integrierte Hilfsfunktion erleichtert darüber hinaus
  1674. das Arbeiten mit dem Interpreter. Dabei ist zu beachten, daß der
  1675. deutsche Grundbefehlssatz nicht in die kontext-sensitive Hilfe
  1676. implementiert wurde. Die funktionsgleichen englischen Befehle sind
  1677. jedoch alle in das Hilfesystem integriert.
  1678. Nachstehend die unter Win-TXL verfügbaren Befehle und die deutschen
  1679. Anweisungen im Überblick:
  1680.  
  1681. input               liest Numerische Variable ein
  1682. titlewindow         setzt Fenstertitel
  1683. rectangle           zeichnet ausgefülltes Rechteck
  1684. line                zeichnet Linie
  1685. ellipse             zeichnet Kreis/Ellipse
  1686. roundrect           zeichnet ausgefülltes abgerundetes Rechteck
  1687. arc                 zeichnet Kreisbogen
  1688. setpixel            zeichnet Punkt
  1689. movewindow          setzt Fenstergröße
  1690. pie                 zeichnet unausgef. Tortenstück
  1691. setprinter          setzt Drucker - Display - Context
  1692. play                spielt Note
  1693. cls                 löscht Fensterinhalt
  1694. run                 startet Programm nicht abbrechbar
  1695. print               schreibt Variable Formeln Strings
  1696. new                 neues Programm altes löschen
  1697. if                  Wenn dann
  1698. load                Datei laden
  1699. save                Datei sichern
  1700. goto                gehezu
  1701. end                 Programmende
  1702. system              Interpreter beenden Alt - F4
  1703. rem                 Bemerkung
  1704. list                Programm auflisten
  1705. let                 Varable Wert zuweisen
  1706. setscreen           Druckerspooler aus
  1707. typeset             setze Schriftart
  1708. llist               Listing ausdrucken (später über Editor > 1 Seite)
  1709. locate              Textausgabe lokalisieren
  1710. polyline            zeichnet unausgefülltes Polygon
  1711. floodfill           ausfüllen einer Fläche
  1712. settextcolor        setze Textfarbe  0-15
  1713. setbkcolor          setze Texthintergrund 0-15
  1714. setcolor            setze Füllfarbe
  1715. setpencolor         setze Rand - Stiftfarbe
  1716. msgbox              gib Meldungsstring in Box aus
  1717. viereck             zeichnet unausgefülltes Viereck
  1718. rectline            zeichnet unausgefülltes Rechteck/Quadrat
  1719. inline              lese String in Variable
  1720. for                 Schleifen
  1721. next                   "
  1722. while                  "
  1723. wend                   "  
  1724. cursor             Carret aus- und anschalten
  1725. runb               startet Programm abbrechbar im Multitasking
  1726. commands           listet alle Befehle auf
  1727. messagebeep        Beep
  1728. readclipboard      liest Clipboard-Wert in Variable
  1729. writeclipboard     schreibt Variable oder String ins Clipboard
  1730.  
  1731.  
  1732.  
  1733. ⌐Der deutsche Grundbefehlssatz
  1734. ⌐═════════════════════════════
  1735.  
  1736. lauf      entspricht "run". Startet Programm nicht abbrechbar
  1737. drucke    Funktion wie "print". Gibt Strings, Variablen und Strings aus
  1738. setze     Zuweisungsanweisung, Funktion wie "let"
  1739. wenn      Bedingung, "wenn dann". Entspricht "if"
  1740. gehezu    Sprungbefehl, "gehezu Marke??". Entspricht "goto"
  1741. ende      Beendet ein TXL-Programm. Funktion wie "end"
  1742. merke     Hier läßt sich ein Kommentar einfügen. Funktion wie "rem"
  1743. liste     Führt zum auslisten eines Programms. Funktion wie "list"
  1744. neu       Löscht das aktuelle Programm im Speicher. Entspricht "new"
  1745. lade      Lädt ein TXL-Programm. Alternative zu "load"
  1746. speichere Speichert ein TXL-Programm. Entspricht "save"
  1747. verlasse  Beendet den TXL-Interpreter. Funktionsgleich mit "system"
  1748.  
  1749.  
  1750.  
  1751.  
  1752. ,,7
  1753. ⌐7. Eigene Befehle unter DOS implementieren
  1754. ⌐══════════════════════════════════════════
  1755.  
  1756. Der Einbau eigener Befehle in die TXL ist nicht
  1757. besonders schwierig. Das eigentliche Problem liegt
  1758. darin, wirklich alle nötigen Definitionen in allen
  1759. notwendigen Dateien bekannt zu machen. An einem kleinen
  1760. Beispiel wollen wir die Vorgehensweise demonstrieren.
  1761. Den einfachsten und daher zum Verständnis besten Fall
  1762. stellt ein neuer Befehl dar, der weder Parameter
  1763. übernimmt noch zurückliefert. Ein solcher Befehl wäre
  1764. beispielsweise das Kommando zur Anzeige aller
  1765. verfügbaren Befehle "COMMANDS". Um also "COMMANDS" zu
  1766. implementieren, ist als erstes die benötigte Routine zu
  1767. codieren.
  1768.  
  1769. -  In der Datei "NEUBEF.C" oder einer beliebigen
  1770.    anderen Quelldatei schreiben wir also unsere
  1771.    "COMMANDS"-Routine. "COMMANDS" greift auf die
  1772.    Befehlsstruktur "TokBefDesc[i].Befehl" zurück und
  1773.    ermittelt daraus die Befehlsnamen, was aber für die
  1774.    Darstellung der Einbindung keine Rolle spielt.
  1775.  
  1776. -  In der Datei "INTERP.H" ist entsprechend ein neues Token ein-
  1777.    zutragen. Bei der Windows-TXL-Version sind die Tokens in der Datei
  1778.    "GLOBAL.H" definiert. Neben dem eigentlichen Token ist auch die
  1779.    Konstante für die maximale Anzahl Tokens (TOKMAX) entsprechend zu
  1780.    erhöhen.
  1781.  
  1782. -  Die Prototypen der neuen Funktion sind in "INTPROT.H" einzutragen.
  1783.  
  1784. -  Den oder die neuen Befehle sind in der Struktur "TokBefDesc"
  1785.    einzutragen (Datei "INTGLOB.C". Hier wird auch entschieden, 
  1786.    ob der neue Befehl Parameter übergeben bekommt oder nicht.
  1787.  
  1788. -  Befinden sich die neuen Befehle in einer eigenen Source-Datei und
  1789.    nicht in "NEUBEF.C", so ist diese Datei in die Projektdatei
  1790.    einzubinden.
  1791.  
  1792.  
  1793. ,,8
  1794. ⌐8. Die Entstehungsgeschichte der ToolboX Language
  1795. ⌐═════════════════════════════════════════════════
  1796.  
  1797. TXL, die "toolbox language",  ist ein nach allen Seiten
  1798. offenes Interpreterkonzept für PC und Atari-ST.
  1799. Jedem C-Programmierer wird es damit möglich, sich seine
  1800. eigene Sprache zu gestalten.
  1801. Neben der Verwendung der TXL für Schulungszwecke lassen
  1802. sich auch hervorragend  rechnerunabhängige  Anwendungen
  1803. realisieren.   Einzige  Voraussetzung  ist  ein  ANSI-C
  1804. Compiler.
  1805. Das Grundgerüst für den TXL-Interpreter  wurde  in  der
  1806. Zeitschrift toolbox, Heft 9/10'1990 vorgestellt.
  1807. Wesentliche Erweiterungen  sowie  eine  Windows-Version
  1808. wurden im Rahmen eines Wettbewerbs in der toolbox 04'91
  1809. veröffentlicht.
  1810. Bezogen werden kann der aktuelle  Grundinterpreter  als
  1811. toolbox-Spezial-XX.
  1812. Bestellungen richten sie bitte an den DMV-Verlag
  1813.                                       Postfach 250
  1814.                                       3440 Eschwege
  1815.  
  1816.  
  1817.  
  1818. ,,9
  1819. ⌐9. Registrierung
  1820. ⌐════════════════
  1821.  
  1822. Am Anfang stand eine Idee. Der Interpreter zum selbermachen. Ein
  1823. Sprachenbausatz für Jedermann. Inzwischen sind aus den wenigen
  1824. Einsendungen megabyte große Erweiterungen geworden und TXL hat Einzug
  1825. in Lehrbetriebe und Universitäten gefunden.
  1826. Wohin diese Entwicklung gehen wird, ist noch nicht abzusehen. Mit
  1827. Sicherheit wird auch der Erfolg- oder Mißerfolg des toolbox-Special-XX
  1828. darüber entscheiden, ob es vielleicht schon bald einen Compiler zu TXL
  1829. geben wird.
  1830. Wenn sie über die aktuelle Entwicklung informiert werden wollen oder
  1831. eigene Erweiterungen für TXL in der Schublade haben, drucken sie bitte
  1832. die Datei "REGISTER.TXT" über den DOS-Print-Befehl (PRINT REGISTER.TXT)
  1833. aus und schicken ihn ausgefüllt direkt an die
  1834.  
  1835.     toolbox Redaktion
  1836.     z.Hd. Ulrich Schmitz
  1837.     Stichwort "TXL-Registrierung"
  1838.     Fuldaer Straße 6
  1839.     3440 Eschwege
  1840.