Ini-Reader
Übersicht

![]() |
mpmxyzBetreff: Ini-Reader |
![]() Antworten mit Zitat ![]() |
---|---|---|
In einem Langeweileprojekt entstanden, in meiner GUI gewachsen und in meinem Precompiler verfeinert ist dieser Code jetzt bereit, der Öffentlichkeit gezeigt zu werden.
Anders als die anderen Ini-Reader im Codearchiv liest er die Ini-Datei nur ein einziges Mal! Dadurch hat er eine sehr hohe Geschwindigkeit. Ein anderer Unterschied ist auch, dass man für neue Sektionen/Schlüssel Code hinzufügen muss anstatt nur einen Parameter zu ändern. Dieser Weg ermöglicht aber auch einige Zusatzfunktionen: -Zahlenwerte können automatisch umgewandelt werden; diese Funktion geht weit über die BB-Funktionen "Float()" und "Int()" hinaus, da man hiermit auch "%101010" oder "$2A" statt "42" schreiben kann. -Man kann in den Werten auch Anführungszeichen verwenden, indem man stattdessen """ schreibt. Für "&" gibt es ein dem entsprechendes "&" Und hier ist der Code: [AUSKLAPPEN] Const Ini_Normal=0 ;Dies ist die Grundsektion; in normalen Inis steht hier nichts drin, da dies eigentlich gar keine Sektion ist.
;Const SektionID=<einmalige ID> ;eigene Sektionen kommen hier hin. Global NextWordTxt$ Function NextWord$(Txt$) ;Diese Funktion gibt das nächste Wort im String zurück. ;NextWordTxt$ beinhaltet den Rest des Strings ;Als Trenner funktionieren While Replace(Mid(Txt,1,1),Chr(9)," ")=" " Txt=Mid(Txt,2,Len(Txt)-1) Wend Local ZW=Instr(Replace(Txt$,Chr(9)," ")," ") If ZW=0 NextWordTxt$="" Return Txt$ Else NextWordTxt$=Right(Txt$,Len(Txt$)-ZW+1) Return Left(Txt$,ZW-1) EndIf End Function Function HexToInt(HexS$);Umwandlung eines hexadezimalen Zahlenstrings in einen Integer Local ZW Local ZW2 Local Integer HexS$=Upper(HexS$) For ZW=1 To Len(HexS$) Select Mid(HexS$,ZW,1) Case "0" Integer=Integer Shl 4 Integer=Integer Or $0 Case "1" Integer=Integer Shl 4 Integer=Integer Or $1 Case "2" Integer=Integer Shl 4 Integer=Integer Or $2 Case "3" Integer=Integer Shl 4 Integer=Integer Or $3 Case "4" Integer=Integer Shl 4 Integer=Integer Or $4 Case "5" Integer=Integer Shl 4 Integer=Integer Or $5 Case "6" Integer=Integer Shl 4 Integer=Integer Or $6 Case "7" Integer=Integer Shl 4 Integer=Integer Or $7 Case "8" Integer=Integer Shl 4 Integer=Integer Or $8 Case "9" Integer=Integer Shl 4 Integer=Integer Or $9 Case "A" Integer=Integer Shl 4 Integer=Integer Or $A Case "B" Integer=Integer Shl 4 Integer=Integer Or $B Case "C" Integer=Integer Shl 4 Integer=Integer Or $C Case "D" Integer=Integer Shl 4 Integer=Integer Or $D Case "E" Integer=Integer Shl 4 Integer=Integer Or $E Case "F" Integer=Integer Shl 4 Integer=Integer Or $F Default Return Integer End Select Next Return Integer End Function Function BinToInt(BinS$);Umwandlung eines binären Zahlenstrings in einen Integer Local ZW Local Integer For ZW=1 To Len(BinS$) Select Mid(BinS$,ZW,1) Case "0" Integer=Integer Shl 1 Integer=Integer Or %0 Case "1" Integer=Integer Shl 1 Integer=Integer Or %1 Default Return Integer End Select Next Return Integer End Function Function Int2%(val$);Umwandlung eines "Integerstrings" in einen Integer Select Left(val$,1) Case "$";Eine hexadezimale Zahl Return HexToInt(Mid(val$,2,Len(val$)-1)) Case "%";Eine Binärziffer Return BinToInt(Mid(val$,2,Len(val$)-1)) Default Return Int(val$) End Select End Function Function Load(FileStream,Strict=0) ;Die eigentliche Ini-Ladefunktion ;Bei Fehlern wird die Zeilennummer zurückgegeben, wenn der Parameter "Strict" "True" ist. ;Sonst wird der Fehler einfach überlesen. ; Nicht eingerückte Kommentarzeilen, wie diese hier, kennzeichnen Teile, bei denen man etwas Eigeninitiative zeigen muss. :-) Local LineText$,Word$ Local Sektion Local InBracket;1-"[",2-"=" Local Brackettext$ Local WertI%,WertF#,WertS$ Local LineNr=0 ;-------------- ; Eigene Variablen ;-------------- Sektion=Ini_Normal While Eof(FileStream)=0 ;Zeilenweise durcharbeiten InBracket=0 Brackettext="" LineText=ReadLine(FileStream) LineNr=LineNr+1 ;Zum vereinfachen des Lesens ;Jeder wichtige "Begriff" wird jetzt durch Leerzeichen von den anderen getrennt. LineText$=Replace(LineText,"["," [ ") LineText$=Replace(LineText,"]"," ] ") LineText$=Replace(LineText,Chr(34)," "+Chr(34)+" ") LineText$=Replace(LineText,"="," = ") LineText$=Replace(LineText,";"," ; ") While Len(LineText)>0 Word$=NextWord(LineText$) LineText$=NextWordTxt$ Select InBracket Case 1;[ Select Word$ Case "]" ;neue Sektion Select Brackettext$ ; Case Lower("Sektionsname") ; Sektion=SektionsID ; ;Mache irgendwas weiteres Default ;Sektion unbekannt? If Strict Return LineNr EndIf End Select Exit Case ";" ;Hier ein Kommentar? If Strict Return LineNr EndIf Exit Default Brackettext$=Lower(Word$) ;Name der neuen Sektion setzen. End Select Case 2;= Select Word$ ;String aus Anführungszeichen extrahieren Case ";" ;Hier ein Kommentar? If Strict Return LineNr EndIf Exit Case Chr(34) ;ein Anführungszeichen->Jetzt wird der Wert ermittelt. WertI=Instr(LineText,Chr(34)) If WertI<2;kein abschließendes Anführungszeichen? If Strict Return LineNr EndIf Exit EndIf WertS=Mid(LineText,2,WertI-3) Default If Strict Return LineNr EndIf Exit End Select WertS$=Replace(WertS$," [ ","[");Vereinfachung rückgangig machen WertS$=Replace(WertS$," ] ","]") WertS$=Replace(WertS$," = ","=") WertS$=Replace(WertS$," ; ",";") WertS$=Replace(WertS$,""",Chr(34)) ;Diese Sonderzeichen schreibt man wie in HTML. WertS$=Replace(WertS$,"&","&") ;Bei der Speicherfunktion sollte man dies beachten! ;Werte für andere Datentypen vorberechnen ;WertS$ gibt den Wert ohne Änderung an. ;WertI% hat ihn in einen Integer umgewandelt ;WertF# hat ihn in eine Float umgewandelt WertI%=Int2(WertS$) WertF#=Float(WertS$) If WertI<>0 And WertF=0 WertF=WertI ;Floatwerte werden auch bei binären und hexadezimalen Zahlen gesetzt ElseIf WertI=0 And WertF<>0 WertI=WertF ;bei z.B. ".49" oder 1.e9 bekommt der Integer auch einen Wert EndIf Select Sektion ;Sektion? Case Ini_Normal ;keine Sektion If Strict Return LineNr EndIf ; Case SektionsID ; Select Brackettext$ ; Case Lower("Variablenname") ; ;Wertzuweisung ; End Select Default If Strict Return LineNr EndIf End Select InBracket=0 Exit Default Select Word$ Case "[" ;Jetzt wird die Sektion gewechselt InBracket=1 Brackettext$="" Case "]" If Strict Return LineNr EndIf Exit Case "=" ;Wertzuweisung InBracket=2 Case Chr(34) ;Ein " hier? If Strict Return LineNr EndIf Exit Case ";" ;ein Kommentar Exit Default ;Die Variable wird geändert Brackettext$=Lower(Word$) End Select End Select Wend Wend End Function Viel Spaß damit! mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schreibe anstatt "Return Int(val$)" in der Funktion Int2 einfach "Return Int(Float(val$))", dann funktionieren auch Angaben wie "4e5". ![]() |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
mpmxyzBetreff: 4e5 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] ElseIf WertI=0 And WertF<>0
WertI=WertF ;bei z.B. ".49" oder 1.e9 bekommt der Integer auch einen Wert Dann rate mal, wozu diese Zeilen gut sind. ![]() mfG mpmxyz Edit: Wer die Funktion "Int2" anders benutzt, darf die vorgeschlagene Änderung ruhig durchführen. |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oh, daran hatte ich nicht gedacht, ich habe einfach nur die Funktion Int2 in der Form gesehen, und mr dabei gedacht: "Das geht doch besser." Naja, nichts für ungut. Ein sehr schönes Stückchen Code. ![]() |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group