' Gambas module file PUBLIC SUB Main() DIM hSettings AS Settings hSettings = NEW Settings("~/.config/gambas/gb.form.conf") PRINT hSettings["/Bookmarks/Count", 0] 'PRINT hSettings["/test/Array"].Join(" ") ' hSettings["PROJECTLANG"] = "toto" 'hConfig.WriteString("Name", "Benoit") 'hConfig.WriteInteger("Age", 31) 'hConfig.WriteBoolean("Man", TRUE) 'PRINT hSettings["External/Browser", "mozilla"] END PUBLIC FUNCTION QuoteString(sVal AS String) AS String sVal = Replace(sVal, "\n", "\\n") sVal = Replace(sVal, "\t", "\\t") sVal = Replace(sVal, Chr$(34), "\\" & Chr$(34)) sVal = Replace(sVal, "\\", "\\\\") sVal = Chr$(34) & sVal & Chr$(34) RETURN sVal END PUBLIC FUNCTION UnQuoteString(sVal AS String) AS String IF Left$(sVal) = Chr$(34) THEN sVal = Mid$(sVal, 2, -1) sVal = Replace(sVal, "\\n", "\n") sVal = Replace(sVal, "\\t", "\t") sVal = Replace(sVal, "\\" & Chr$(34), Chr$(34)) sVal = Replace(sVal, "\\\\", "\\") RETURN sVal END PUBLIC FUNCTION ToString(vVal AS Variant) AS String DIM sVal AS String DIM iInd AS Integer IF IsString(vVal) THEN RETURN QuoteString(vVal) ELSE IF IsBoolean(vVal) THEN RETURN IIf(vVal, "True", "False") ELSE IF IsObject(vVal) IF vVal IS String[] OR IF vVal IS Integer[] OR IF vVal IS Float[] THEN sVal = "[" FOR iInd = 0 TO vVal.Max IF iInd THEN sVal &= "," sVal &= ToString(vVal[iInd]) NEXT sVal &= "]" ELSE Error.Raise("Unsupported datatype: " & Object.Type(vVal)) ENDIF ELSE sVal = CStr(vVal) IF IsFloat(vVal) THEN IF InStr(sVal, ".") = "0" THEN sVal = sVal & ".0" ENDIF ENDIF RETURN sVal END PUBLIC FUNCTION FromString(sVal AS String) AS Variant DIM aVal AS String[] DIM iInd AS Integer DIM aVar AS Object IF Left(sVal) = "\"" THEN RETURN UnQuoteString(sVal) ELSE IF Left(sVal) = "[" THEN aVal = Split(Mid$(sVal, 2, -1), ",", Chr$(34)) IF Mid$(sVal, 2, 1) = Chr$(34) THEN RETURN aVal ELSE SELECT CASE TypeOf(FromString(aVal[0])) CASE gb.Integer aVar = NEW Integer[aVal.Count] CASE gb.Float aVar = NEW Float[aVal.Count] CASE ELSE RETURN NULL END SELECT FOR iInd = 0 TO aVal.Max aVar[iInd] = FromString(aVal[iInd]) NEXT RETURN aVar ENDIF ELSE IF InStr(sVal, "/") THEN RETURN CDate(sVal) ELSE IF InStr(sVal, ".") THEN RETURN CFloat(sVal) ELSE IF LCase(sVal) = "true" THEN RETURN TRUE ELSE IF LCase(sVal) = "false" THEN RETURN FALSE ELSE RETURN CInt(sVal) ENDIF END