From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/mtex/documentation/mdoctrns.tex | 1201 ++++++++++++++++++++++++++++++++ 1 file changed, 1201 insertions(+) create mode 100644 macros/mtex/documentation/mdoctrns.tex (limited to 'macros/mtex/documentation/mdoctrns.tex') diff --git a/macros/mtex/documentation/mdoctrns.tex b/macros/mtex/documentation/mdoctrns.tex new file mode 100644 index 0000000000..6990fb99ad --- /dev/null +++ b/macros/mtex/documentation/mdoctrns.tex @@ -0,0 +1,1201 @@ +%format plaine +\input webmac +\newdimen\pageheight \pageheight=25cm +\newdimen\pagewidth \pagewidth=16cm +\advance\topskip by 3mm +\parindent0pt +\frenchspacing +\def\_{\us} +\def\8{\char25{}} +\catcode`\"=\active %Umlaute +\def"{\accent'177} +\openup -3pt + +\N1. Anhang B: Definitionen. + +\fi + +\M2. One of the extensions to standard \\{pascal} that we shall deal with +is to use a default \&{case} as in \\{tangle}, \\{weave}, etc. + +\Y\P\D \37$\\{othercases}\S\\{otherwise}$\C{default for cases not listed +explicitly}\par +\P\D \37$\\{endcases}\S$ \6 +\&{end} \C{follows the default case}\par +\P\F \37$\\{othercases}\S\\{else}$\par +\P\F \37$\\{endcases}\S\\{end}$\par +\fi + +\M3. Folgende Definitionen sind Abk"urzungen f"ur den Befehl, eine Meldung +gleichzeitig auf den Bildschirm und in eine Datei zu schreiben. + +\Y\P\D \37$\\{writeln\_error}(\#)\S\\{writeln}(\\{err},\39\#)$;\5 +$\\{writeln}(\\{outterm},\39\#)$\par +\P\D \37$\\{write\_error}(\#)\S\\{write}(\\{err},\39\#)$;\5 +$\\{write}(\\{outterm},\39\#)$\par +\fi + +\N4. Anhang B: Heading und Funktion getchar. + +\fi + +\M5. Programmkopf und Variablendeklarationen\par +Das Programm hat vier Textfiles als Parameter. \\{infile} enth"alt die +Eingabedaten in der entwickelten Noten\-ein\-ga\-be\-sprache. Nach der +Bearbeitung durch das vorliegende Programm werden die Daten in eine +f"ur die Notenausgabe ben"otigte Datei \\{outfile} geschrieben. +Syntax-Fehler in der Eingabedatei werden mit Hilfe von +\\{outterm} auf dem Terminal angezeigt und gleichzeitig in die +Datei \\{err} geschrieben. Mit \\{interm} sind +Eingaben vom Terminal m"oglich. + +\Y\P\4\&{program}\1\ \37$\\{trans}(\\{infile},\39\\{outfile},\39\\{err},\39% +\\{outterm},\39\\{interm})$; \6 +\4\&{label} \X18:Labels\X \6 +\4\&{type} \X44:New type\X \6 +\4\&{var} \37\X6:Files\X\X7:Globals\X\X8:Function getchar\X\X31:Procedure +newline music\X\X62:Procedure error\X\X21:Function ausruf\X\X67:Procedure macro% +\X\X65:Procedure backslash\X\X33:Procedure nonmusic\X\X35:Procedure music\X\par +\fi + +\M6. In diesem Teil sind die ben"otigten Textfiles deklariert. + +\Y\P$\4\X6:Files\X\S$\6 +\4\\{infile}: \37\\{text};\6 +\4\\{outfile}: \37\\{text};\6 +\4\\{outterm}: \37\\{text};\6 +\4\\{interm}: \37\\{text};\6 +\4\\{err}: \37\\{text};\par +\U section~5.\fi + +\M7. Es folgt nun die Einleseroutine \\{get\_char} +und die Deklaration +der daf"ur ben"otigten Variablen. +\\{get\_char} ist eine function, die auf die folgenden Weise +an das Programm das n"achste Zeichen - einen Character - +zur"uckgibt. +\par +Die Eingabedatei \\{infile} wird zeilenweise abgearbeitet. Jede neue +Zeile wird auf den string \\{in\_line} eingelesen, der wiederum auf +den array \\{buffer} kopiert wird. Dieses Feld enth"alt gleichzeitig +drei Zeilen der Eingabedatei: die letzte abgearbeitete Zeile der +L"ange \\{last\_line\_length}; die Zeile, die gerade bearbeitet wird +- sie hat die L"ange \\{actual\_line\_length} - und die Zeile, die als +n"achstes gelesen werden soll mit der L"ange \\{next\_line\_length}. +Die Variable \\{line\_ptr} gibt dabei immer an, wie weit die +\\{actual\_line} abgearbeitet ist. \par +Falls das Ende dieser Zeile +erreicht ist, werden die Zeilen im \\{buffer} nach links geschoben. +Die \\{last\_line} wird durch die \\{actual\_line}, die \\{actual\_line} durch +die \\{next\_line} und die \\{next\_line} durch eine neue \\{in\_line} +ersetzt. +Bei einem Zeilenwechsel wird die Variable \\{change} auf true +gesetzt, ansonsten hat sie den Wert false. +\par +Mit Hilfe der character-Variablen \\{sign} wird jeweils das n"achste +Zeichen einer Zeile an das Programm "ubergeben. +Die gelesenen Zeilen werden mit \\{line\_num} gez"ahlt. +Beim ersten Einlesen von der Datei \\{in\_file} kann das +``Weiterschieben'' im \\{buffer} unterbleiben, deshalb gibt es +daf"ur eine gesonderte Abfrage. +Gesondert werden ebenfalls die F"alle $\\{inline\_length}=0$ und +$\\{actual\_line\_length}=0$ behandelt. Im ersten Fall wird der Teil des +\\{buffer}, der nicht belegt ist, mit blanks besetzt, um falsche +Belegung von \\{sign} zu vermeiden, im zweiten Fall erh"alt +\\{get\_char} den Wert \.{\'\ \'}. +\par +\noindent\\{eof\_infile} zeigt an, wenn die Eingabedatei einschlie\8lich +der letzten Zeile abgearbeitet ist. Diese Variable ist +notwendig, weil das Ende der Datei mit dem Lesen der letzten Zeile +auf \\{in\_line} erreicht ist, diese dann aber noch abgearbeitet +werden mu\8. + + + +\Y\P$\4\X7:Globals\X\S$\6 +\4\\{buffer}: \37\&{array} $[1\to240]$ \1\&{of}\5 +\\{char};\2\6 +\4\\{in\_line}: \37$\\{string}(80)$;\6 +\4\\{sign}: \37\\{char};\6 +\4\\{last\_line\_length}: \37\\{integer};\6 +\4\\{actual\_line\_length}: \37\\{integer};\6 +\4\\{next\_line\_length}: \37\\{integer};\6 +\4\\{inline\_length}: \37\\{integer};\6 +\4\\{line\_ptr}: \37\\{integer};\6 +\4\\{line\_num}: \37\\{integer};\6 +\4\\{eof\_infile}: \37\\{boolean};\6 +\4\\{change}: \37\\{boolean};\par +\A sections~17, 20, 36, 39, 41, 45, 50, 57, and~61. +\U section~5.\fi + +\M8. + +\Y\P$\4\X8:Function getchar\X\S$\6 +\4\&{function}\1\ \37\\{get\_char}: \37\\{char};\6 +\4\&{var} \37\|j: \37\\{integer};\2\6 +\&{begin} \37\&{if} $\\{line\_num}=0$ \1\&{then}\6 +\&{begin} \37\&{if} $\R\\{eof}(\\{infile})$ \1\&{then}\6 +\&{begin} \37\X9:Lesen der n"achsten Zeile von infile\X;\6 +\X10:Einlesen der neuen Zeile in den buffer\X;\6 +\&{end}\6 +\4\&{else} \&{goto} \3710;\2\6 +\&{end};\2\6 +\&{if} $\\{line\_ptr}>\\{last\_line\_length}+\\{actual\_line\_length}$ \1% +\&{then}\6 +\&{begin} \37\X11:Neubelegung der \\{actual\_line} durch \\{next\_line}, +Zeilenwechsel\X;\6 +$\\{get}(\\{infile})$;\6 +\&{if} $\R\\{eof}(\\{infile})$ \1\&{then}\6 +\&{begin} \37\X9:Lesen der n"achsten Zeile von infile\X;\6 +\&{if} $\\{inline\_length}=0$ \1\&{then}\6 +\&{begin} \37\X12:\\{in\_line} ist Leerzeile bzw. existiert nicht\X;\6 +\&{end}\6 +\4\&{else} \&{begin} \37\X10:Einlesen der neuen Zeile in den buffer\X;\6 +\&{end};\2\6 +\&{end}\6 +\4\&{else} \&{begin} \37\X12:\\{in\_line} ist Leerzeile bzw. existiert nicht\X;% +\6 +\&{end};\2\6 +$\\{line\_ptr}\K\\{last\_line\_length}+1$;\6 +\&{end}\6 +\4\&{else} \&{begin} \37\X13:Kein Zeilenwechsel\X;\6 +\&{end};\2\6 +\&{if} $\\{actual\_line\_length}=0$ \1\&{then}\6 +\&{begin} \37\X14:\\{actual\_line} ist Leerzeile\X;\6 +\&{end}\6 +\4\&{else} \&{begin} \37\X15:Zeichen lesen\X;\6 +\&{end};\2\6 +$\\{line\_ptr}\K\\{line\_ptr}+1$;\5 +$\\{eof\_infile}\K(\\{eof}(\\{infile})\W(\\{line\_ptr}>\\{last\_line\_length}+% +\\{actual\_line\_length}))$;\6 +\&{end};\par +\U section~5.\fi + +\M9. Es wird eine neue Zeile aus der Eingabedatei \\{infile} gelesen. +"Uberfl"ussigen blanks werden entfernt. + +\Y\P$\4\X9:Lesen der n"achsten Zeile von infile\X\S$\6 +$\\{read}(\\{infile},\39\\{in\_line})$;\5 +$\\{in\_line}\K\\{ltrim}(\\{in\_line})$;\5 +$\\{in\_line}\K\\{trim}(\\{in\_line})$;\5 +$\\{in\_line}\K\\{compress}(\\{in\_line})$;\5 +$\\{inline\_length}\K\\{length}(\\{in\_line})$;\par +\U sections~8 and~8.\fi + +\M10. Die neue Zeile wird in den string \\{buffer} gelesen. + +\Y\P$\4\X10:Einlesen der neuen Zeile in den buffer\X\S$\6 +\&{for} $\|j\K1\mathrel{\&{to}}\\{inline\_length}$ \1\&{do}\5 +$\\{buffer}[\\{actual\_line\_length}+\\{next\_line\_length}+\|j]\K\\{in\_line}[% +\|j]$;\2\6 +$\\{last\_line\_length}\K\\{actual\_line\_length}$;\5 +$\\{actual\_line\_length}\K\\{next\_line\_length}$;\5 +$\\{next\_line\_length}\K\\{inline\_length}$;\par +\U sections~8 and~8.\fi + +\M11. Die \\{actual\_line} im \\{buffer} wird mit einer neuen Zeile, n"amlich +der \\{next\_line} belegt. Auf \\{last\_line} wird die vorherige \\{actual% +\_line} +geschrieben. \\{change} wird true, da ein Zeilenwechsel +stattfindet. + +\Y\P$\4\X11:Neubelegung der \\{actual\_line} durch \\{next\_line}, +Zeilenwechsel\X\S$\6 +\&{for} $\|j\K1\mathrel{\&{to}}\\{actual\_line\_length}$ \1\&{do}\5 +$\\{buffer}[\|j]\K\\{buffer}[\\{last\_line\_length}+\|j]$;\2\6 +\&{for} $\|j\K1\mathrel{\&{to}}\\{next\_line\_length}$ \1\&{do}\5 +$\\{buffer}[\\{actual\_line\_length}+\|j]\K\\{buffer}[\\{last\_line\_length}+% +\\{actual\_line\_length}+\|j]$;\2\6 +$\\{line\_num}\K\\{line\_num}+1$;\5 +$\\{change}\K\\{true}$;\par +\U section~8.\fi + +\M12. \\{in\_line} ist eine Leerzeile. + +\Y\P$\4\X12:\\{in\_line} ist Leerzeile bzw. existiert nicht\X\S$\6 +\&{for} $\|j\K\\{actual\_line\_length}+\\{next\_line\_length}+1\mathrel{% +\&{to}}240$ \1\&{do}\5 +$\\{buffer}[\|j]\K\.{\'\ \'}$;\2\6 +$\\{last\_line\_length}\K\\{actual\_line\_length}$;\5 +$\\{actual\_line\_length}\K\\{next\_line\_length}$;\5 +$\\{next\_line\_length}\K0$;\par +\U sections~8 and~8.\fi + +\M13. Es findet kein Zeilenwechsel statt, da das Ende der \\{actual\_line} noch +nicht erreicht ist: \\{change} ist false. + +\Y\P$\4\X13:Kein Zeilenwechsel\X\S$\6 +$\\{change}\K\\{false}$;\par +\U section~8.\fi + +\M14. Die \\{actual\_line} ist eine Leerzeile. Da ein Wert an das Programm +zur"uckgegeben werden mu\8, erh"alt \\{get\_char} den Wert \.{\'\ \'}. + +\Y\P$\4\X14:\\{actual\_line} ist Leerzeile\X\S$\6 +$\\{get\_char}\K\.{\'\ \'}$;\par +\U section~8.\fi + +\M15. Ist der \\{buffer} richtig belegt, so kann das n"achste Zeichen auf +\\{get\_char} eingelesen werden. + +\Y\P$\4\X15:Zeichen lesen\X\S$\6 +$\\{get\_char}\K\\{buffer}[\\{line\_ptr}]$;\par +\U section~8.\fi + +\N16. Anhang B: Hauptprogramm und Function ausruf. + +\fi + +\M17. Hauptprogramm\par +Im Hauptprogramm werden die oben definierten Textfiles zum Lesen bzw. +Schreiben ge"offnet. Solange das Ende der Eingabedatei nicht +erreicht ist, wird mit der Variablen \\{music\_num} +unterschieden, ob gerade eine Noteneingabe ($\\{music\_num}=\\{true}$) +oder eine +Texteingabe ($\\{music\_num}=\\{false}$) bearbeitet wird. +Je nachdem wird entweder die Routine \\{nonmusic} oder \\{music} aufgerufen. +Texteingaben werden so wie sie in der Eingabedatei stehen in +die Ausgabedatei \\{outfile} geschrieben, also Zeile f"ur Zeile. +Noteneingaben werden in eine +andere Form gebracht. + +Falls innerhalb einer Routine das Ende der Eingabedatei erreicht +wird, soll das Programm beendet werden. An der entsprechenden Stelle +in der Routine wird dann auf das Label 10 verwiesen. + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\\{music\_num}: \37\\{boolean};\par +\fi + +\M18. Labeldeklaration +\Y\P$\4\X18:Labels\X\S$\6 +10;\par +\U section~5.\fi + +\M19. Hauptprogramm. + +\Y\P\&{begin} \37$\\{termout}(\\{outterm})$;\5 +$\\{termin}(\\{interm})$;\5 +\X59:Setze die default-Werte\X;\6 +$\\{reset}(\\{infile})$;\5 +$\\{rewrite}(\\{outfile})$;\5 +$\\{rewrite}(\\{err})$;\5 +$\\{eof\_infile}\K(\\{eof}(\\{infile})\W(\\{line\_ptr}>\\{last\_line\_length}+% +\\{actual\_line\_length}))$;\6 +\&{while} $\R(\\{eof\_infile})$ \1\&{do}\6 +\&{begin} \37\&{case} $\\{music\_num}$ \1\&{of}\6 +\4\\{false}: \37\\{nonmusic};\6 +\4\\{true}: \37\\{music};\6 +\4\&{othercases} \37;\2\6 +\&{endcases};\6 +\&{end};\2\6 +\410: \37\&{end}.\par +\fi + +\M20. Routine, die den Wechsel zwischen Noteneingabe und Texteingabe +anzeigt\par +Die Funktion berechnet als Wert, ob sich der mode ge"andert hat +oder nicht. +Ein Wechsel des Modes wird durch zwei aufeinanderfolgende +Ausrufezeichen angezeigt. Die Routine wird also aufgerufen, +sobald ein Ausrufezeichen gelesen wurde. Dann mu\8 +"uberpr"uft werden, ob ein zweites Ausrufezeichen folgt oder nicht. +\par +An die Routine wird der Wert von \\{change} "ubergeben, da es +f"ur das Schreiben in \\{outfile} f"ur allem bei Texteingabe +notwendig ist, "uber einen Zeilenwechsel Bescheid zu wissen. +\par +Falls es "uberhaupt kein n"achstes Zeichen gibt, also das +Ende der Eingabedatei erreicht wurde, wird bei einer Texteingabe +($\\{music\_num}=\\{false}$) +das gelesene Zeichen +in die Ausgabedatei \\{outfile} geschrieben; bei einer Noteneingabe +zeigt das Ausrufezeichen das Ende an.\par +Falls das n"achste Zeichen kein Ausrufezeichen ist, werden im +Fall $\\{music\_num}=\\{false}$ das Ausrufezeichen und das neu gelesene Zeichen +in \\{outfile} geschrieben. F"ur $\\{music\_num}=\\{true}$ wird angenommen, da% +\8 +das zweite Ausrufezeichen vergessen wurde, also ein Wechsel +in den nonmusic-mode stattfindet. Das neu gelesene Zeichen wird +dann - als erstes Zeichen der Texteingabe - +in eine neue Zeile von \\{outfile} geschrieben. +\par +Der dritte Fall ist, da\8 es sich bei dem neuen Zeichen um ein +Ausrufezeichen handelt. Dann findet ein mode-Wechsel statt. +\par\noindent +\\{w\_column} ist die Variable, die anzeigt, in welche Spalte von \\{outfile} +geschrieben wird. + + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\\{w\_column}: \37\\{integer};\par +\fi + +\M21. + +\Y\P$\4\X21:Function ausruf\X\S$\6 +\4\&{function}\1\ \37$\\{ausruf}(\\{help}:\\{boolean})$: \37\\{boolean};\2\6 +\&{begin} \37\&{if} $\R(\\{eof\_infile})$ \1\&{then}\5 +\X22:Lesen des n"achsten Zeichens\X\6 +\4\&{else} \X30:Ende der Eingabedatei erreicht\X;\2\6 +\&{end};\par +\U section~5.\fi + +\M22. Das n"achste Zeichen wird auf \\{sign} gelesen und "uberpr"uft, ob es +ein Ausrufezeichen ist oder nicht. + +\Y\P$\4\X22:Lesen des n"achsten Zeichens\X\S$\6 +\&{begin} \37$\\{sign}\K\\{get\_char}$;\6 +\&{if} $\\{sign}=\.{\'!\'}$ \1\&{then}\5 +\X23:Wechsel des modes\X\6 +\4\&{else} \X26:Kein Wechsel des modes\X\2\6 +\&{end}\par +\U section~21.\fi + +\M23. + +\Y\P$\4\X23:Wechsel des modes\X\S$\6 +\&{begin} \37\&{case} $\\{music\_num}$ \1\&{of}\6 +\4\\{false}: \37\X24:Wechsel in music mode\X;\6 +\4\\{true}: \37\X25:Wechsel in nonmusic mode\X;\6 +\4\&{othercases} \37;\2\6 +\&{endcases};\6 +\&{end}\par +\U section~22.\fi + +\M24. Beim Wechsel in den musicmode bzw. nonmusicmode wird jeweils eine +neue Zeile angefangen. + +\Y\P$\4\X24:Wechsel in music mode\X\S$\6 +\&{begin} \37\&{if} $\\{line\_num}>1$ \1\&{then}\5 +$\\{writeln}(\\{outfile})$;\2\6 +$\\{write}(\\{outfile},\39\.{\'\\beginsong\'})$;\5 +$\\{ausruf}\K\\{true}$;\5 +$\\{w\_column}\K10$;\6 +\&{end};\par +\U section~23.\fi + +\M25. + +\Y\P$\4\X25:Wechsel in nonmusic mode\X\S$\6 +\&{begin} \37$\\{newline\_music}(9)$;\5 +$\\{writeln}(\\{outfile},\39\.{\'\\endsong\'})$;\5 +$\\{w\_column}\K0$;\5 +$\\{ausruf}\K\\{false}$;\6 +\&{end};\par +\U section~23.\fi + +\M26. + +\Y\P$\4\X26:Kein Wechsel des modes\X\S$\6 +\&{begin} \37\&{case} $\\{music\_num}$ \1\&{of}\6 +\4\\{false}: \37\X27:Gelesene Zeichen schreiben\X;\6 +\4\\{true}: \37\&{begin} \37\X28:Ausrufezeichen fehlt\X;\6 +\X29:Ende musicmode, Zeichen schreiben\X;\6 +\&{end};\6 +\4\&{othercases} \37;\2\6 +\&{endcases};\6 +\&{end};\par +\U section~22.\fi + +\M27. Falls ein Zeilenwechsel beim Lesen des letzten Zeichens stattgefunden +hat, wird das Ausrufezeichen in die letzte Zeile von \\{outfile} +geschrieben, f"ur das neue Zeichen wird eine neue Zeile angefangen. +\par +Hat der Zeilenwechsel beim Lesen des Ausrufezeichens stattgefunden, +werden beide Zeichen in eine neue Zeile geschrieben. + +\Y\P$\4\X27:Gelesene Zeichen schreiben\X\S$\6 +\&{begin} \37\&{if} $\\{change}=\\{true}$ \1\&{then}\6 +\&{begin} \37$\\{writeln}(\\{outfile},\39\.{\'!\'})$;\5 +$\\{write}(\\{outfile},\39\\{sign})$;\6 +\&{end}\6 +\4\&{else} \&{begin} \37\&{if} $\\{help}=\\{true}$ \1\&{then}\6 +\&{begin} \37$\\{writeln}(\\{outfile})$;\5 +$\\{write}(\\{outfile},\39\.{\'!\'},\39\\{sign})$;\6 +\&{end}\6 +\4\&{else} $\\{write}(\\{outfile},\39\.{\'!\'},\39\\{sign})$;\2\6 +\&{end};\2\6 +$\\{ausruf}\K\\{false}$;\6 +\&{end};\par +\U section~26.\fi + +\M28. + +\Y\P$\4\X28:Ausrufezeichen fehlt\X\S$\6 +\&{if} $\\{change}=\\{true}$ \1\&{then}\5 +$\\{error}(\.{\'Fehlendes\ Ausrufezeichen\ gesetzt\'},\39\\{line\_num}-1)$\6 +\4\&{else} $\\{error}(\.{\'Fehlendes\ Ausrufezeichen\ gesetzt\'},\39\\{line% +\_num})$;\2\par +\U section~26.\fi + +\M29. + +\Y\P$\4\X29:Ende musicmode, Zeichen schreiben\X\S$\6 +$\\{ausruf}\K\\{false}$;\5 +$\\{newline\_music}(9)$;\6 +\&{if} $\\{eof}(\\{infile})$ \1\&{then}\6 +\&{begin} \37\&{if} $\\{actual\_line\_length}=0$ \1\&{then}\5 +$\\{write}(\\{outfile},\39\.{\'\\endsong\'})$\6 +\4\&{else} $\\{writeln}(\\{outfile},\39\.{\'\\endsong\'})$;\2\6 +\&{end}\6 +\4\&{else} $\\{writeln}(\\{outfile},\39\.{\'\\endsong\'})$;\2\6 +$\\{write}(\\{outfile},\39\\{sign})$;\5 +$\\{w\_column}\K1$;\par +\U section~26.\fi + +\M30. + +\Y\P$\4\X30:Ende der Eingabedatei erreicht\X\S$\6 +\&{begin} \37\&{if} $\\{music\_num}=\\{true}$ \1\&{then}\6 +\&{begin} \37$\\{newline\_music}(8)$;\5 +$\\{write}(\\{outfile},\39\.{\'\\endsong\'})$;\5 +$\\{error}(\.{\'Fehlendes\ Ausrufezeichen\ am\ Ende\ gesetzt\'},\39\\{line% +\_num})$;\6 +\&{end}\6 +\4\&{else} $\\{write}(\\{outfile},\39\.{\'!\'})$;\2\6 +$\\{ausruf}\K\\{music\_num}$;\5 +\&{goto} \3710;\6 +\&{end};\par +\U section~21.\fi + +\M31. F"ur das Schreiben in die Ausgabedatei wird f"ur den music-mode +eine weitere Routine ben"otigt, die berechnet, ob +eine neue Zeile in der Ausgabedatei begonnen werden mu\8. +F"ur den nonmusic-mode ist das nicht n"otig, da die Zeilen +so "ubernommen werden, wie sie in der Eingabedatei stehen. +"Ubergeben wird zur Berechnung die L"ange des zu schreibenden Worts. + +\Y\P$\4\X31:Procedure newline music\X\S$\6 +\4\&{procedure}\1\ \37$\\{newline\_music}(\\{word\_length}:\\{integer})$;\2\6 +\&{begin} \37$\\{w\_column}\K\\{w\_column}+\\{word\_length}$;\6 +\&{if} $\\{w\_column}\G70$ \1\&{then}\6 +\&{begin} \37$\\{write}(\\{outfile},\39\.{\'\%\'})$;\5 +$\\{writeln}(\\{outfile})$;\5 +$\\{w\_column}\K\\{word\_length}$;\6 +\&{end};\2\6 +\&{end};\par +\U section~5.\fi + +\N32. Anhang B: Prozedur nonmusic. + +\fi + +\M33. Prozedur, die normalen Text ausgibt, solange \\{music\_num} false ist. +Ein Zeilenwechsel im Ausgabefile findet statt, wenn die +Zeile in der Eingabedatei ebenfalls gewechselt wird. Falls +ein Ausrufezeichen eingelesen wird, mu\8 die Funktion \\{ausruf} +aufgerufen werden. + +\Y\P$\4\X33:Procedure nonmusic\X\S$\6 +\4\&{procedure}\1\ \37\\{nonmusic};\2\6 +\&{begin} \37\&{while} $\\{music\_num}=\\{false}$ \1\&{do}\6 +\&{begin} \37\&{if} $\R(\\{eof\_infile})$ \1\&{then}\6 +\&{begin} \37$\\{sign}\K\\{get\_char}$;\6 +\&{if} $\\{sign}=\.{\'!\'}$ \1\&{then}\5 +$\\{music\_num}\K\\{ausruf}(\\{change})$\6 +\4\&{else} \&{begin} \37\&{if} $\\{line\_num}=1$ \1\&{then}\5 +$\\{write}(\\{outfile},\39\\{sign})$\6 +\4\&{else} \&{begin} \37\&{if} $\\{change}=\\{false}$ \1\&{then}\5 +$\\{write}(\\{outfile},\39\\{sign})$\6 +\4\&{else} \&{begin} \37\&{if} $\\{w\_column}=0$ \1\&{then}\5 +$\\{write}(\\{outfile},\39\\{sign})$\6 +\4\&{else} \&{begin} \37$\\{writeln}(\\{outfile})$;\5 +$\\{write}(\\{outfile},\39\\{sign})$\6 +\&{end};\2\6 +\&{end};\2\6 +\&{end};\2\6 +\&{end};\2\6 +$\\{w\_column}\K\\{line\_ptr}-1$;\6 +\&{end}\6 +\4\&{else} \&{goto} \3710;\2\6 +\&{end};\2\6 +\&{end};\par +\U section~5.\fi + +\N34. Anhang B: Prozedur music. + + +\fi + +\M35. Prozedur, die Musikeingabe abarbeitet und abfragt, +um welches Zeichen es sich gerade handelt. +Dabei wird unterschieden, +ob es sich um eine Tonh"ohe , um eine Pause oder +Taktstrich, um erg"anzende Angaben zur +Tonh"ohe (z. B. Dauer, Vorzeichen, Oktave, Punkte), +um das Ende der Musikeingabe oder +um den Beginn +einer Kontrollsequenz (\\{backslash}) oder eines Kommentars handelt. + + + +\Y\P$\4\X35:Procedure music\X\S$\6 +\4\&{procedure}\1\ \37\\{music};\2\6 +\&{begin} \37\&{while} $\\{music\_num}=\\{true}$ \1\&{do}\6 +\&{begin} \37\&{if} $\R(\\{eof\_infile})$ \1\&{then}\6 +\&{begin} \37$\\{sign}\K\\{get\_char}$;\6 +\&{case} $\\{sign}$ \1\&{of}\6 +\X37:Zeichen ist Angabe zum Ton\X;\6 +\X38:Zeichen ist Tonh"ohe\X;\6 +\X51:Zeichen ist Pause oder Taktstrich\X;\6 +\X56:Zeichen bedeutet Ende der Musikeingabe\X;\6 +\X54:Zeichen ist Kommentar\X;\6 +\X55:Zeichen ist backslash\X;\6 +\4\&{othercases} \37;\2\6 +\&{endcases};\6 +\&{end}\6 +\4\&{else} \&{goto} \3710;\2\6 +\&{end};\2\6 +\&{end};\par +\U section~5.\fi + +\M36. Es folgen die Variablen, die f"ur die Prozedur \\{music} ben"otigt +werden. Die einzelnen Programmteile werden an den entsprechenden +Stellen erl"autert. + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\\{octave\_num}: \37\\{integer};\6 +\4\\{dot\_num}: \37\\{integer};\6 +\4\\{nat\_num}: \37\\{integer};\6 +\4\\{b\_num}: \37\\{integer};\6 +\4\\{x\_num}: \37\\{integer};\6 +\4\\{duration}: \37\\{char};\par +\fi + +\M37. In diesem Teil werden die f"ur die Note notwendigen Variablen +besetzt. +\\{octave\_num} z"ahlt die Hochkommata bzw. Kommata, +die zur Angabe der Oktave +eingegeben wurden. +Die Tondauer mu\8 f"ur den Ausgabefile mit einer Zahl angegeben +werden. Diese Belegung findet mit Hilfe von \\{duration} statt. +\\{dot\_num} z"ahlt die eingegebenen Punkte. +Etwaige Vorzeichen werden registriert. Da ein Doppelkreuz bzw. Doppel-be +durch zwei x bzw. b eingegeben wird, werden diese mit \\{x\_num} +bzw. \\{b\_num} gez"ahlt. + + +\Y\P$\4\X37:Zeichen ist Angabe zum Ton\X\S$\6 +\4\.{\',\'}: \37$\\{octave\_num}\K\\{octave\_num}-1$;\6 +\4\.{\'\'}\.{\'\'}: \37$\\{octave\_num}\K\\{octave\_num}+1$;\6 +\4\.{\'1\'}: \37$\\{duration}\K\.{\'g\'}$;\6 +\4\.{\'2\'}: \37$\\{duration}\K\.{\'h\'}$;\6 +\4\.{\'4\'}: \37$\\{duration}\K\.{\'v\'}$;\6 +\4\.{\'8\'}: \37$\\{duration}\K\.{\'a\'}$;\6 +\4\.{\'6\'}: \37$\\{duration}\K\.{\'s\'}$;\6 +\4\.{\'5\'}: \37$\\{duration}\K\.{\'z\'}$;\6 +\4\.{\'.\'}: \37$\\{dot\_num}\K\\{dot\_num}+1$;\6 +\4\.{\'b\'}: \37$\\{b\_num}\K\\{b\_num}+1$;\6 +\4\.{\'x\'}: \37$\\{x\_num}\K\\{x\_num}+1$;\6 +\4\.{\'n\'}: \37$\\{nat\_num}\K5$;\par +\U section~35.\fi + +\M38. Die oben +beschriebene Belegung ist beendet, sobald ein Notenname eingelesen +wird. +Dann wird die Oktave endg"ultig berechnet, +der Tonh"ohe wird +eine Zahl zugeordnet, die die Stellung der Note im Notenliniensystem +angibt und die Vorzeichen angegeben. Anschlie\8end wird die +Note in die Ausgabedatei \\{outfile} geschrieben. + +\Y\P$\4\X38:Zeichen ist Tonh"ohe\X\S$\6 +\4$\.{\'c\'},\39\.{\'d\'},\39\.{\'e\'},\39\.{\'f\'},\39\.{\'g\'},\39\.{\'a\'},% +\39\.{\'h\'}$: \37\&{begin} \37\X42:Berechnung der richtigen Oktave\X;\6 +\X40:Umsetzung der Tonh"ohe in eine Zahl\X;\6 +\X46:Gibt es ein Vorzeichen\X;\6 +\X48:Schreibe die gelesene Note\X;\6 +\X49:Schreibe die Punkte\X;\6 +\&{end};\par +\U section~35.\fi + +\M39. + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\\{pitchnum}: \37\\{integer};\par +\fi + +\M40. Das Liniensystem wird mit einer Numerierung versehen. Jedem Notennamen +wird dann mit der Variablen \\{pitchnum} die entsprechende Zahl zwischen +-2 und 4 in Abh"angigkeit von der Lage +im Notenliniensystem zugeordnet. + +\Y\P$\4\X40:Umsetzung der Tonh"ohe in eine Zahl\X\S$\6 +\&{case} $\\{sign}$ \1\&{of}\6 +\4\.{\'c\'}: \37$\\{pitchnum}\K-2$;\6 +\4\.{\'d\'}: \37$\\{pitchnum}\K-1$;\6 +\4\.{\'e\'}: \37$\\{pitchnum}\K0$;\6 +\4\.{\'f\'}: \37$\\{pitchnum}\K1$;\6 +\4\.{\'g\'}: \37$\\{pitchnum}\K2$;\6 +\4\.{\'a\'}: \37$\\{pitchnum}\K3$;\6 +\4\.{\'h\'}: \37$\\{pitchnum}\K4$;\6 +\4\&{othercases} \37;\2\6 +\&{endcases};\par +\A section~43. +\U section~38.\fi + +\M41. + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\\{octave}: \37\\{integer};\par +\fi + +\M42. Nun wird die Oktave berechnet. Das ist wichtig f"ur +die n-gestrichene Oktave (n$>$0), da die eingestrichene Oktave +den Wert \\{octave}=0 erhalten soll, die zweigestrichene den Wert 1 usw. +Weil aber zun"achst die Hochkommas gez"ahlt wurden, ist eine +Zur"ucksetzung erforderlich. + +\Y\P$\4\X42:Berechnung der richtigen Oktave\X\S$\6 +\&{if} $\\{octave\_num}>0$ \1\&{then}\6 +\&{begin} \37$\\{octave}\K\\{octave\_num}-1$;\5 +$\\{octave\_num}\K0$;\6 +\&{end}\6 +\4\&{else} \&{begin} \37\&{if} $\\{octave\_num}<0$ \1\&{then}\6 +\&{begin} \37$\\{octave}\K\\{octave\_num}$;\5 +$\\{octave\_num}\K0$;\6 +\&{end}\2\6 +\&{end};\2\par +\U section~38.\fi + +\M43. Nun wird die Tonh"ohe unter Ber"ucksichtigung der +eben gesetzten Zahl \\{pitchnum} und der Oktave \\{octave} +endg"ultig berechnet. + +\Y\P$\4\X40:Umsetzung der Tonh"ohe in eine Zahl\X\mathrel{+}\S$\6 +\&{if} $(-3\L\\{octave})\W(\\{octave}\L3)$ \1\&{then}\5 +$\\{pitchnum}\K\\{pitchnum}+(\\{octave})\ast7$\6 +\4\&{else} \&{begin} \37$\\{error}(\.{\'Die\ Oktave\ wurde\ falsch\ eingegeben,% +\ default\ gesetzt\'},\39\\{line\_num})$;\5 +$\\{octave\_num}\K0$;\6 +\&{end};\2\par +\fi + +\M44. Zur Berechnung der Vorzeichen mu\8. +ein neuer Variablentyp definiert werden. +\\{accidental} ist ein array, mit dem mit Hilfe der +eingelesenen Anzahl der x bzw. b das Vorzeichen bestimmt werden kann. + +\Y\P$\4\X44:New type\X\S$\6 +$\\{accidental}=$\1\5 +\&{array} $[1\to5]$ \1\&{of}\5 +$\\{string}(2)$;\2\2\par +\U section~5.\fi + +\M45. + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\\{accid}: \37\\{accidental};\6 +\4\\{acc}: \37$\\{string}(2)$;\par +\fi + +\M46. Falls \\{x\_num} bzw. \\{b\_num} von 0 verschieden sind, gibt es ein +Vorzeichen. Ob es sich um ein Kreuz oder ein b handelt, +wird anhand der Variablen +\\{x\_num} bzw. \\{b\_num} deutlich. Diese integer-Zahlen werden als +Index von \\{accid} benutzt, dieser gibt dann das Vorzeichen an. +Danach werden \\{x\_num}, \\{b\_num} und \\{nat\_num} auf die defaults +gesetzt. + +\Y\P$\4\X46:Gibt es ein Vorzeichen\X\S$\6 +\&{if} $\\{x\_num}>0$ \1\&{then}\6 +\&{begin} \37$\\{acc}\K\\{accid}[\\{x\_num}]$;\5 +$\\{x\_num}\K0$;\5 +\X47:Schreibe das Vorzeichen\X;\6 +\&{end}\6 +\4\&{else} \&{begin} \37\&{if} $\\{b\_num}>2$ \1\&{then}\6 +\&{begin} \37$\\{acc}\K\\{accid}[\\{b\_num}]$;\5 +$\\{b\_num}\K2$;\5 +\X47:Schreibe das Vorzeichen\X;\6 +\&{end}\6 +\4\&{else} \&{begin} \37\&{if} $\\{nat\_num}=5$ \1\&{then}\6 +\&{begin} \37$\\{acc}\K\\{accid}[\\{nat\_num}]$;\5 +$\\{nat\_num}\K0$;\5 +\X47:Schreibe das Vorzeichen\X;\6 +\&{end};\2\6 +\&{end};\2\6 +\&{end};\2\par +\U section~38.\fi + +\M47. Die Schreibbefehle f"ur Vorzeichen, Noten, Pausen, Punkte folgen. +\par +Das Vorzeichen wird geschrieben, falls vorhanden. +Beim Schreiben m"ussen zwei F"alle unterschieden werden. +Falls n"amlich \\{pitchnum} kleiner als 0 oder gr"o\8er als 9 +ist, mu\8 die Zahl in +geschweifte Klammern geschrieben werden, sonst nicht. +Die Zahl, die zu der Variablen +\\{w\_column} (z"ahlt die Spalte in \\{outfile}) +addiert wird, ist die gr"o\8tm"ogliche. + +\Y\P$\4\X47:Schreibe das Vorzeichen\X\S$\6 +\&{if} $(\\{pitchnum}<0)\V(\\{pitchnum}>9)$ \1\&{then}\6 +\&{begin} \37$\\{newline\_music}(8)$;\5 +$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{acc},\39\.{\'\{\'},\39% +\\{pitchnum}:1,\39\.{\'\}\'})$;\6 +\&{end}\6 +\4\&{else} \&{begin} \37$\\{newline\_music}(5)$;\5 +$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{acc},\39\\{pitchnum}:1)$;\6 +\&{end};\2\par +\U sections~46, 46, and~46.\fi + +\M48. Die Note wird - "ahnlich wie das Vorzeichen - geschrieben. + +\Y\P$\4\X48:Schreibe die gelesene Note\X\S$\6 +\&{if} $(\\{pitchnum}<0)\V(\\{pitchnum}>9)$ \1\&{then}\6 +\&{begin} \37$\\{newline\_music}(7)$;\5 +$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{duration},\39\.{\'\{\'},\39% +\\{pitchnum}:1,\39\.{\'\}\'})$;\6 +\&{end}\6 +\4\&{else} \&{begin} \37$\\{newline\_music}(4)$;\5 +$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{duration},\39\\{pitchnum}:1)$;\6 +\&{end};\2\par +\U section~38.\fi + +\M49. Punkte werden geschrieben, falls vorhanden. +Danach wird \\{dot\_num} auf 0 gesetzt. + +\Y\P$\4\X49:Schreibe die Punkte\X\S$\6 +\&{if} $\\{dot\_num}>0$ \1\&{then}\6 +\&{begin} \37$\\{newline\_music}(\\{dot\_num}+1)$;\5 +$\\{write}(\\{outfile},\39\.{\'\\\'},\39\.{\'.\'},\39\\{dot\_num}:1)$;\5 +$\\{dot\_num}\K0$;\6 +\&{end};\2\par +\U section~38.\fi + +\M50. + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\\{bar\_line}: \37\\{char};\6 +\4\\{rest}: \37\\{char};\par +\fi + +\M51. Pause und Taktstrich werden gesondert behandelt und sofort +ausgedruckt. + +\Y\P$\4\X51:Zeichen ist Pause oder Taktstrich\X\S$\6 +\4$\.{\'|\'},\39\.{\'=\'}$: \37\&{begin} \37$\\{bar\_line}\K\\{sign}$;\5 +\X53:Schreibe Taktstrich\X;\6 +\&{end};\6 +\4\.{\'p\'}: \37\&{begin} \37$\\{rest}\K\\{sign}$;\5 +\X52:Schreibe Pause\X;\6 +\&{end};\par +\U section~35.\fi + +\M52. Pause wird geschrieben. + +\Y\P$\4\X52:Schreibe Pause\X\S$\6 +$\\{newline\_music}(3)$;\5 +$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{rest},\39\\{duration})$;\par +\U section~51.\fi + +\M53. Taktstrich wird geschrieben. + +\Y\P$\4\X53:Schreibe Taktstrich\X\S$\6 +$\\{newline\_music}(2)$;\5 +$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{bar\_line})$;\par +\U section~51.\fi + +\M54. Das Zeichen ist ein Kommentarzeichen. Der Rest der Zeile +soll im Musikmode nicht mit"ubergeben werden. Deshalb setzen wir +\\{line\_ptr} um eins zu hoch; daraufhin wird die n"achste Zeile +eingelesen. + +\Y\P$\4\X54:Zeichen ist Kommentar\X\S$\6 +\4\.{\'\%\'}: \37$\\{line\_ptr}\K\\{last\_line\_length}+\\{actual\_line% +\_length}+1$;\par +\U sections~35 and~65.\fi + +\M55. Das Zeichen ist Beginn eines macros. + +\Y\P$\4\X55:Zeichen ist backslash\X\S$\6 +\4\.{\'\\\'}: \37\\{backslash};\par +\U sections~35 and~65.\fi + +\M56. Es wird "uberpr"uft, ob man zum Ende der Musikeingabe gelangt ist. + +\Y\P$\4\X56:Zeichen bedeutet Ende der Musikeingabe\X\S$\6 +\4\.{\'!\'}: \37$\\{music\_num}\K\\{ausruf}(\\{change})$;\par +\U section~35.\fi + +\M57. + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\|i: \37\\{integer};\par +\fi + +\N58. Anhang B: Default-Werte. + + +\fi + +\M59. Die am Anfang notwendigen Werte werden gesetzt. + +\Y\P$\4\X59:Setze die default-Werte\X\S$\6 +$\\{last\_line\_length}\K0$;\5 +$\\{actual\_line\_length}\K0$;\5 +$\\{next\_line\_length}\K0$;\5 +$\\{inline\_length}\K0$;\5 +$\\{line\_ptr}\K1$;\5 +$\\{line\_num}\K0$;\5 +$\\{music\_num}\K\\{false}$;\5 +$\\{change}\K\\{false}$;\5 +$\\{w\_column}\K0$;\5 +$\\{octave\_num}\K0$;\5 +$\\{duration}\K\.{\'v\'}$;\5 +$\\{dot\_num}\K0$;\5 +$\\{x\_num}\K0$;\5 +$\\{b\_num}\K2$;\5 +$\\{nat\_num}\K0$;\5 +$\\{octave}\K0$;\5 +$\\{accid}[1]\K\.{\'x\'}$;\5 +$\\{accid}[2]\K\.{\'xx\'}$;\5 +$\\{accid}[3]\K\.{\'b\'}$;\5 +$\\{accid}[4]\K\.{\'bb\'}$;\5 +$\\{accid}[5]\K\.{\'n\'}$;\5 +$\|i\K1$;\par +\U section~19.\fi + +\N60. Anhang B: Fehlermeldungen. + +\fi + +\M61. Prozedur, die f"ur manche +Syntaxfehler Meldungen auf den Bildschirm und in einen +Fehler--file (\\{err}) schreibt. +Dabei wird die Zeile, in der der Fehler vorkommt bis zur falschen +Stelle ausgedruckt, der Rest der Zeile \\{actual\_line} wird in der +n"achsten Zeile ausgedruckt. Au\8erdem wird mit der Fehlermeldung +auch die Zeilennummer in der der Fehler steht, ausgedruckt. +"Ubergeben wird der Text der Fehlermeldung, ein string +der L"ange 80, und die Zeilennummer \\{line\_num} der Zeile, in der der +Fehler auftritt. + +\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6 +\4\\{error\_help}: \37$\\{string}(20)$;\6 +\4\\{input\_term}: \37$\\{string}(20)$;\6 +\4\\{input\_char}: \37\\{char};\par +\fi + +\M62. + +\Y\P$\4\X62:Procedure error\X\S$\6 +\4\&{procedure}\1\ \37$\\{error}(\\{error\_text}:\\{string}(80);\,\35\\{help}:% +\\{integer})$;\6 +\4\&{var} \37\|i: \37\\{integer};\2\6 +\&{begin} \37$\\{writeln\_error}(\.{\'\ \'})$;\5 +$\\{writeln\_error}(\.{\'Fehler\ in\ Zeile:\ \'},\39\\{help}:1)$;\6 +\&{if} $\\{line\_ptr}-11>0$ \1\&{then}\6 +\&{begin} \37\&{for} $\|i\K10\mathrel{\&{downto}}0$ \1\&{do}\6 +\&{begin} \37$\\{write\_error}(\\{buffer}[\\{line\_ptr}-1-\|i])$;\6 +\&{end};\2\6 +$\\{writeln\_error}(\.{\'\ \'})$;\5 +$\\{write\_error}(\.{\'\ \ \ \ \ \ \ \ \ \ \ \'})$;\6 +\&{for} $\|i\K1\mathrel{\&{to}}11$ \1\&{do}\6 +\&{begin} \37$\\{write\_error}(\\{buffer}[\\{line\_ptr}-1+\|i])$;\6 +\&{end};\2\6 +\&{end}\6 +\4\&{else} \&{begin} \37\&{for} $\|i\K1\mathrel{\&{to}}(\\{line\_ptr}-1)$ \1% +\&{do}\6 +\&{begin} \37$\\{write\_error}(\\{buffer}[\|i])$;\6 +\&{end};\2\6 +$\\{writeln\_error}(\.{\'\ \'})$;\6 +\&{for} $\|i\K1\mathrel{\&{to}}(\\{line\_ptr}-1)$ \1\&{do}\6 +\&{begin} \37$\\{write\_error}(\.{\'\ \'})$;\6 +\&{end};\2\6 +\&{for} $\|i\K1\mathrel{\&{to}}11$ \1\&{do}\6 +\&{begin} \37$\\{write\_error}(\\{buffer}[\\{line\_ptr}-1+\|i])$;\6 +\&{end};\2\6 +\&{end};\2\6 +$\\{writeln\_error}(\.{\'\ \'})$;\5 +$\\{writeln\_error}(\\{error\_text})$;\5 +\X63:Eingabe vom Terminal\X;\6 +\&{end};\par +\U section~5.\fi + +\M63. Nach der Fehlermeldung kann eine Eingabe vom Terminal erfolgen. + +\Y\P$\4\X63:Eingabe vom Terminal\X\S$\6 +$\\{writeln}(\\{err},\39\.{\'?\'})$;\5 +$\\{writeln}(\\{outterm},\39\.{\'?\'})$;\5 +$\\{read}(\\{interm},\39\\{input\_char})$;\6 +\&{case} $\\{input\_char}$ \1\&{of}\6 +\4\.{\'i\'}: \37\&{begin} \37$\\{writeln\_error}(\.{\'input>\'})$;\5 +$\\{read}(\\{interm},\39\\{input\_term})$;\5 +$\\{error\_help}\K\\{input\_term}$;\6 +\&{end};\6 +\4\.{\'x\'}: \37\&{goto} \3710;\6 +\4\&{othercases} \37;\2\6 +\&{endcases};\par +\U section~62.\fi + +\N64. Anhang B: Prozedur backslash. + +\fi + +\M65. Prozedur, die aufgerufen wird, wenn ein backslash eingelesen +wurde. Sie erkennt, um welches Kontrollwort es sich handelt und +ruft die entsprechenden Unterprogramme auf. +Daf"ur wird zun"achst das macro auf den string \\{control} gelesen. +Das Kontrollwort ist beendet, falls $\\{macroend}=\\{true}$, d.h. +das eingelesen Zeichen ist ein \.{\'\ \'}, \.{\'\{\'}, \.{\'\%\'} oder \.{\'% +\\\'}. + +\Y\P$\4\X65:Procedure backslash\X\S$\6 +\4\&{procedure}\1\ \37\\{backslash}; \6 +\4\&{var} \37\\{control}: \37$\\{string}(80)$;\5 +\\{macroend}: \37\\{boolean}; \X67:Procedure macro\X \6 +\&{begin} \37$\\{control}\K\\{str}(\.{\'\ \'})$;\6 +\1\&{repeat} \37\&{begin} \37\X66:Einlesen der Kontrollsequenz auf \\{control}% +\X\6 +\&{end}\6 +\4\&{until}\5 +$\\{macroend}=\\{true}$;\2\6 +$\\{control}\K\\{trim}(\\{control})$;\5 +$\\{control}\K\\{ltrim}(\\{control})$;\6 +\&{if} $((\\{control}=\.{\'\\beam\'})\V(\\{control}=\.{\'\\slur\'})\V(% +\\{control}=\.{\'\\cresc\'})\V(\\{control}=\.{\'\\decresc\'})\V(\\{control}=\.{% +\'\\chord\'}))$ \1\&{then}\6 +\&{begin} \37$\\{macro}(\\{control})$\6 +\&{end}\6 +\4\&{else} \&{begin} \37\&{if} $\\{control}=\.{\'\\group\'}$ \1\&{then}\6 +\&{begin} \37$\\{macro}(\\{control})$\6 +\&{end}\6 +\4\&{else} \&{begin} \37\&{if} $\\{control}=\.{\'\\signature\'}$ \1\&{then}\6 +\&{begin} \37$\\{macro}(\\{control})$\6 +\&{end}\6 +\4\&{else} \&{begin} \37\&{if} $((\\{control}=\.{\'\\text\'})\V(\\{control}=\.{% +\'\\vocal\'})\V(\\{control}=\.{\'\\two\'}))$ \1\&{then}\6 +\&{begin} \37$\\{macro}(\\{control})$\6 +\&{end}\6 +\4\&{else} \&{begin} \37$\\{newline\_music}(\\{length}(\\{control}))$;\5 +$\\{write}(\\{outfile},\39\\{control})$;\6 +\&{case} $\\{sign}$ \1\&{of}\6 +\X54:Zeichen ist Kommentar\X;\6 +\X55:Zeichen ist backslash\X;\6 +\4\&{othercases} \37;\2\6 +\&{endcases};\6 +\&{end};\2\6 +\&{end};\2\6 +\&{end};\2\6 +\&{end};\2\6 +\&{end};\par +\U section~5.\fi + +\M66. Dieser Teil wird von der Prozedur \\{backslash} ben"otigt und +liest auf den String \\{control} die Kontrollsequenz ein, die durch +backslash angezeigt wird. + +\Y\P$\4\X66:Einlesen der Kontrollsequenz auf \\{control}\X\S$\6 +$\\{control}\K\\{control}\\{str}(\\{sign})$;\6 +\&{if} $\R(\\{eof\_infile})$ \1\&{then}\6 +\&{begin} \37$\\{sign}\K\\{get\_char}$;\5 +$\\{macroend}\K((\\{sign}=\.{\'\{\'})\V(\\{sign}=\.{\'\%\'})\V(\\{sign}=\.{\'% +\\\'})\V(\\{sign}=\.{\'\ \'}))$;\6 +\&{end}\6 +\4\&{else} \&{begin} \37$\\{control}\K\\{trim}(\\{control})$;\5 +$\\{newline\_music}(\\{length}(\\{control}))$;\5 +$\\{write}(\\{outfile},\39\\{control})$;\5 +\&{goto} \3710;\6 +\&{end};\2\par +\U section~65.\fi + +\M67. + +\Y\P$\4\X67:Procedure macro\X\S$\6 +\4\&{procedure}\1\ \37$\\{macro}(\\{help}:\\{string}(80))$;\2\6 +\&{begin} \37$\\{help}\K\\{trim}(\\{help})$;\5 +$\\{help}\K\\{ltrim}(\\{help})$;\5 +$\\{help}\K\\{compress}(\\{help})$;\5 +$\\{newline\_music}(\\{length}(\\{help}))$;\5 +$\\{write}(\\{outfile},\39\\{help})$;\5 +$\\{line\_ptr}\K\\{line\_ptr}-1$;\6 +\&{end};\par + +\U sections~5 and~65.\fi + +\pageheight=23cm\vskip0.5cm \def\rhead{ANHANG B: INDEX} +\inx +\:\\{acc}, 45, 46, 47. +\:\\{accid}, 45, 46, 59. +\:\\{accidental}, 44, 45. +\:\\{actual\_line}, 7, 11, 13, 14, 61. +\:\\{actual\_line\_length}, 7, 8, 10, 11, 12, 19, 29, 54, 59. +\:\\{ausruf}, \[21], 24, 25, 27, 29, 30, 33, 56. +\:\\{b\_num}, 36, 37, 46, 59. +\:\\{backslash}, 35, 55, \[65], 66. +\:\\{bar\_line}, 50, 51, 53. +\:\\{boolean}, 7, 17, 21, 65. +\:\\{buffer}, 7, 10, 11, 12, 15, 62. +\:\\{change}, 7, 11, 13, 20, 27, 28, 33, 56, 59. +\:\\{char}, 7, 8, 36, 50, 61. +\:\\{compress}, 9, 67. +\:\\{control}, \[65], 66. +\:\\{dot\_num}, 36, 37, 49, 59. +\:\\{duration}, 36, 37, 48, 52, 59. +\:\&{else}, 2. +\:\&{end}, 2. +\:\&{endcases}, \[2]. +\:\\{eof}, 8, 19, 29. +\:\\{eof\_infile}, 7, 8, 19, 21, 33, 35, 66. +\:\\{err}, 3, 5, 6, 19, 61, 63. +\:\\{error}, 28, 30, 43, \[62]. +\:\\{error\_help}, 61, 63. +\:\\{error\_text}, 62. +\:\\{false}, 13, 17, 19, 20, 23, 25, 26, 27, 29, 33, 59. +\:\\{get}, 8. +\:\\{get\_char}, 7, \[8], 14, 15, 22, 33, 35, 66. +\:\\{help}, 21, 27, 62, 67. +\:\|{i}, \[62]. +\:\\{in\_file}, 7. +\:\\{in\_line}, 7, 9, 10, 12. +\:\\{infile}, 5, 6, 7, 8, 9, 19, 29. +\:\\{inline\_length}, 7, 8, 9, 10, 59. +\:\\{input\_char}, 61, 63. +\:\\{input\_term}, 61, 63. +\:\\{integer}, 7, 8, 20, 31, 36, 39, 41, 57, 62. +\:\\{interm}, 5, 6, 19, 63. +\:\|{j}, \[8]. +\:\\{last\_line}, 7, 11. +\:\\{last\_line\_length}, 7, 8, 10, 11, 12, 19, 54, 59. +\:\\{length}, 9, 65, 66, 67. +\:\\{line\_num}, 7, 8, 11, 24, 28, 30, 33, 43, 59, 61. +\:\\{line\_ptr}, 7, 8, 15, 19, 33, 54, 59, 62, 67. +\:\\{ltrim}, 9, 65, 67. +\:\\{macro}, 65, \[67]. +\:\\{macroend}, 65, 66. +\:\\{music}, 17, 19, \[35], 36. +\:\\{music\_num}, 17, 19, 20, 23, 26, 30, 33, 35, 56, 59. +\:\\{nat\_num}, 36, 37, 46, 59. +\:\\{newline\_music}, 25, 29, 30, \[31], 47, 48, 49, 52, 53, 65, 66, 67. +\:\\{next\_line}, 7, 11. +\:\\{next\_line\_length}, 7, 10, 11, 12, 59. +\:\\{nonmusic}, 17, 19, \[33]. +\:\\{octave}, 41, 42, 43, 59. +\:\\{octave\_num}, 36, 37, 42, 43, 59. +\:\&{othercases}, \[2]. +\:\\{otherwise}, 2. +\:\\{outfile}, 5, 6, 17, 19, 20, 24, 25, 27, 29, 30, 31, 33, 38, 47, 48, 49, +52, 53, 65, 66, 67. +\:\\{outterm}, 3, 5, 6, 19, 63. +\:\\{pascal}, 2. +\:\\{pitchnum}, 39, 40, 43, 47, 48. +\:\\{read}, 9, 63. +\:\\{reset}, 19. +\:\\{rest}, 50, 51, 52. +\:\\{rewrite}, 19. +\:\\{sign}, 7, 22, 27, 29, 33, 35, 40, 51, 65, 66. +\:\\{str}, 65, 66. +\:\\{string}, 7, 44, 45, 61, 62, 65, 67. +\:\\{tangle}, 2. +\:\\{termin}, 19. +\:\\{termout}, 19. +\:\\{text}, 6. +\:\\{trans}, \[5]. +\:\\{trim}, 9, 65, 66, 67. +\:\\{true}, 11, 17, 19, 20, 23, 24, 26, 27, 28, 30, 35, 65. +\:\\{w\_column}, 20, 24, 25, 29, 31, 33, 47, 59. +\:\\{weave}, 2. +\:\\{word\_length}, 31. +\:\\{write}, 3, 24, 27, 29, 30, 31, 33, 47, 48, 49, 52, 53, 65, 66, 67. +\:\\{write\_error}, \[3], 62. +\:\\{writeln}, 3, 24, 25, 27, 29, 31, 33, 63. +\:\\{writeln\_error}, \[3], 62, 63. +\:\\{x\_num}, 36, 37, 46, 59. +\fin +\def\rhead{ANHANG B: NAMES OF THE SECTIONS} +\:\X28:Ausrufezeichen fehlt\X +\U section~26. +\:\X42:Berechnung der richtigen Oktave\X +\U section~38. +\:\X63:Eingabe vom Terminal\X +\U section~62. +\:\X66:Einlesen der Kontrollsequenz auf \\{control}\X +\U section~65. +\:\X10:Einlesen der neuen Zeile in den buffer\X +\U sections~8 and~8. +\:\X30:Ende der Eingabedatei erreicht\X +\U section~21. +\:\X29:Ende musicmode, Zeichen schreiben\X +\U section~26. +\:\X6:Files\X +\U section~5. +\:\X21:Function ausruf\X +\U section~5. +\:\X8:Function getchar\X +\U section~5. +\:\X27:Gelesene Zeichen schreiben\X +\U section~26. +\:\X46:Gibt es ein Vorzeichen\X +\U section~38. +\:\X7, 17, 20, 36, 39, 41, 45, 50, 57, 61:Globals\X +\U section~5. +\:\X26:Kein Wechsel des modes\X +\U section~22. +\:\X13:Kein Zeilenwechsel\X +\U section~8. +\:\X18:Labels\X +\U section~5. +\:\X9:Lesen der n"achsten Zeile von infile\X +\U sections~8 and~8. +\:\X22:Lesen des n"achsten Zeichens\X +\U section~21. +\:\X11:Neubelegung der \\{actual\_line} durch \\{next\_line}, Zeilenwechsel\X +\U section~8. +\:\X44:New type\X +\U section~5. +\:\X65:Procedure backslash\X +\U section~5. +\:\X62:Procedure error\X +\U section~5. +\:\X67:Procedure macro\X +\U sections~5 and~65. +\:\X35:Procedure music\X +\U section~5. +\:\X31:Procedure newline music\X +\U section~5. +\:\X33:Procedure nonmusic\X +\U section~5. +\:\X52:Schreibe Pause\X +\U section~51. +\:\X53:Schreibe Taktstrich\X +\U section~51. +\:\X47:Schreibe das Vorzeichen\X +\U sections~46, 46, and~46. +\:\X49:Schreibe die Punkte\X +\U section~38. +\:\X48:Schreibe die gelesene Note\X +\U section~38. +\:\X59:Setze die default-Werte\X +\U section~19. +\:\X40, 43:Umsetzung der Tonh"ohe in eine Zahl\X +\U section~38. +\:\X23:Wechsel des modes\X +\U section~22. +\:\X24:Wechsel in music mode\X +\U section~23. +\:\X25:Wechsel in nonmusic mode\X +\U section~23. +\:\X56:Zeichen bedeutet Ende der Musikeingabe\X +\U section~35. +\:\X37:Zeichen ist Angabe zum Ton\X +\U section~35. +\:\X54:Zeichen ist Kommentar\X +\U sections~35 and~65. +\:\X51:Zeichen ist Pause oder Taktstrich\X +\U section~35. +\:\X38:Zeichen ist Tonh"ohe\X +\U section~35. +\:\X55:Zeichen ist backslash\X +\U sections~35 and~65. +\:\X15:Zeichen lesen\X +\U section~8. +\:\X14:\\{actual\_line} ist Leerzeile\X +\U section~8. +\:\X12:\\{in\_line} ist Leerzeile bzw. existiert nicht\X +\U sections~8 and~8. + +\vfill\eject % finish the section names +\rightskip 0pt \hyphenpenalty 50 \tolerance 200 +\setpage -- cgit v1.2.3