Erweitertes LCase und UCase (mit Sonderzeichen)
Verfasst: 09.10.2006 14:51
Beide Funktionen überschreiben per Macros die normalen LCase()- und
UCase-Funktionen und funktionieren wie folgt:
Beim ersten Aufruf wird ein Array erstellt, in dem jedem Zeichen (ASCII 0
bis 255) seine kleinere bzw. größere Version zugeordnet wird. Das Array
bleibt wegen "Static" im Speicher und muss am dem zweiten Aufruf der
Funktion nicht wieder neu erzeugt werden. Somit sollte die Funktion schnell
genug sein.
Das Umformen hab ich anhand der ASCII-Tabelle in der PB-Hilfe (F1)
vorgenommen. Die Funktionen unterstützen auch Unicode.
Ich denke, dass es mit dem Array die effizienteste Art ist. Wer einen
besseren Vorschlag hat (außer API), bitte melden.
UCase-Funktionen und funktionieren wie folgt:
Beim ersten Aufruf wird ein Array erstellt, in dem jedem Zeichen (ASCII 0
bis 255) seine kleinere bzw. größere Version zugeordnet wird. Das Array
bleibt wegen "Static" im Speicher und muss am dem zweiten Aufruf der
Funktion nicht wieder neu erzeugt werden. Somit sollte die Funktion schnell
genug sein.
Das Umformen hab ich anhand der ASCII-Tabelle in der PB-Hilfe (F1)
vorgenommen. Die Funktionen unterstützen auch Unicode.
Ich denke, dass es mit dem Array die effizienteste Art ist. Wer einen
besseren Vorschlag hat (außer API), bitte melden.

Code: Alles auswählen
;info: advanced LCase and UCase
Procedure.s _LCase(String.s)
Static first.l = 0, Dim Chars.c(255)
Protected *c.Character, a.l
If first = 0
For a = 0 To 255
Select a
Case 65 To 90
Chars(a) = a + 32
Case 138, 140, 142
Chars(a) = a + 16
Case 159
Chars(a) = 255
Case 192 To 214
Chars(a) = a + 32
Case 216 To 222
Chars(a) = a + 32
Default
Chars(a) = a
EndSelect
Next
first = 1
EndIf
*c = @String
While *c\c
If *c\c <= 255
*c\c = Chars(*c\c)
EndIf
*c + SizeOf(Character)
Wend
ProcedureReturn String
EndProcedure
Macro LCase(String) : _LCase(String) : EndMacro
Procedure.s _UCase(String.s)
Static first.l = 0, Dim Chars.c(255)
Protected *c.Character, a.l
If first = 0
For a = 0 To 255
Select a
Case 97 To 122
Chars(a) = a - 32
Case 154, 156, 158
Chars(a) = a - 16
Case 255
Chars(a) = 159
Case 224 To 246
Chars(a) = a - 32
Case 248 To 254
Chars(a) = a - 32
Default
Chars(a) = a
EndSelect
Next
first = 1
EndIf
*c = @String
While *c\c
If *c\c <= 255
*c\c = Chars(*c\c)
EndIf
*c + SizeOf(Character)
Wend
ProcedureReturn String
EndProcedure
Macro UCase(String) : _UCase(String) : EndMacro