varheit.de – nichts als die varheit

ML/I Makro-Prozessor

2026-03-15-14-58 (ml1, macros, upper-case)

Umwandlung von Zeichenketten in ML/I [1]. Heute wandeln wir Klein- in Großbuchstaben um.

upper.ml1
MCSKIP MT,[]
MCINS \.
MCDEF UPPER WITH { } AS [MCSET S13=1
MCDEF a AS A
MCDEF b AS B
MCDEF c AS C
MCDEF d AS D
MCDEF e AS E
MCDEF f AS F
MCDEF g AS G
MCDEF h AS H
MCDEF i AS I
MCDEF j AS J
MCDEF k AS K
MCDEF l AS L
MCDEF m AS M
MCDEF n AS N
MCDEF o AS O
MCDEF p AS P
MCDEF q AS Q
MCDEF r AS R
MCDEF s AS S
MCDEF t AS T
MCDEF u AS U
MCDEF v AS V
MCDEF w AS W
MCDEF x AS X
MCDEF y AS Y
MCDEF z AS Z
\L1.MCDEF [MYLETTER] AS MCSUB(\A1.,\S13.,\S13.)
MCSET S13=\S13.+1
MYLETTER[]MCGO L1 UNLESS \S13. GR MCLENG(\A1.)
]
UPPER{Kleine Dinge werden richtig gross!}
$ ml1 upper.ml1                                                               
KLEINE DINGE WERDEN RICHTIG GROSS!

Vielleicht gibt es eine einfachere Lösung, aber diese funktioniert immerhin, solange man im Bereich der ASCII-Zeichen bleibt. Eine Lösung für UTF-8 bleibt dem Leser überlassen.

Prinzipiell lassen sich Ersetzungen von Umlauten einfach definieren:

umlaut.ml1
MCINS \.
MCSKIP MT,[]
MCDEF UTFASCII WITH { } AS [MCDEF Ã WITH ¤ AS ae
MCDEF Ã WITH ¶ AS oe
MCDEF Ã WITH ¼ AS ue
MCDEF Ã WITH Ÿ AS ss
MCDEF MYSTRING AS \A1.
MYSTRING]
UTFASCII{ä ö ü ß}
$ ml1 umlaut.ml1
ae oe ue ss

Nur funktioniert das natürlich nicht, wenn man wie in upper.ml1 byteweise durch die Zeichenkette durchgeht. In umlaut.ml1 müssen für die Makrodefinition die beiden Bytes der Umlaute getrennt eingegeben werden, wie im Hexdump ersichtlich:

$ hexdump -C umlaut.ml1
hexdump
00000000  4d 43 49 4e 53 20 5c 2e  0a 4d 43 53 4b 49 50 20  |MCINS \..MCSKIP |
00000010  4d 54 2c 5b 5d 0a 4d 43  44 45 46 20 55 54 46 41  |MT,[].MCDEF UTFA|
00000020  53 43 49 49 20 57 49 54  48 20 7b 20 7d 20 41 53  |SCII WITH { } AS|
00000030  20 5b 4d 43 44 45 46 20  c3 20 57 49 54 48 20 a4  | [MCDEF . WITH .|
00000040  20 41 53 20 61 65 0a 4d  43 44 45 46 20 c3 20 57  | AS ae.MCDEF . W|
00000050  49 54 48 20 b6 20 41 53  20 6f 65 0a 4d 43 44 45  |ITH . AS oe.MCDE|
00000060  46 20 c3 20 57 49 54 48  20 bc 20 41 53 20 75 65  |F . WITH . AS ue|
00000070  0a 4d 43 44 45 46 20 c3  20 57 49 54 48 20 9f 20  |.MCDEF . WITH . |
00000080  41 53 20 73 73 0a 4d 43  44 45 46 20 4d 59 53 54  |AS ss.MCDEF MYST|
00000090  52 49 4e 47 20 41 53 20  5c 41 31 2e 0a 4d 59 53  |RING AS \A1..MYS|
000000a0  54 52 49 4e 47 5d 0a 55  54 46 41 53 43 49 49 7b  |TRING].UTFASCII{|
000000b0  c3 a4 20 c3 b6 20 c3 bc  20 c3 9f 7d 0a           |.. .. .. ..}.|
000000bd