Ini-Reader

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

mpmxyz

Betreff: Ini-Reader

BeitragDi, Jul 14, 2009 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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$,"&quot;",Chr(34))   ;Diese Sonderzeichen schreibt man wie in HTML.
               WertS$=Replace(WertS$,"&amp;","&")      ;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

BeitragDi, Jul 14, 2009 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Schreibe anstatt "Return Int(val$)" in der Funktion Int2 einfach "Return Int(Float(val$))", dann funktionieren auch Angaben wie "4e5". Wink
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)

mpmxyz

Betreff: 4e5

BeitragDi, Jul 14, 2009 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Cool
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

BeitragDi, Jul 14, 2009 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile
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)

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group