[Lib] TexData-Files

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Antworten
Benutzeravatar
Jonathan
Establishment
Beiträge: 2367
Registriert: 04.08.2004, 20:06
Kontaktdaten:

[Lib] TexData-Files

Beitrag von Jonathan »

Hintergrund:
Ich brauchte neulich wieder irgendeine einfache Konfigurationsdatei. Einfach um ein paar Variablen zu definieren, bei denen ich mein Programm nicht ständig neu kompilieren muss, wenn ich sie ändern will. Textbasiert musste es sein, damit man es einfach editieren kann. Mein erster Impuls war also XML, aber seien wir ehrlich, die Syntax von XML ist grauenhaft, sowas will man weder schreiben noch lesen. Weitere Alternativen waren JSON und Yaml. Beides hab ich nicht benutzt, letzteres schien mir aber eine verbesserte Version von ersterem zu sein. Also habe ich die nächstbeste YAML Bibliothek installiert und losgelegt. Und schnell wieder aufgehört, weil yamlcpp alles andere als einfach zu benutzen war. Es fängt schon damit an, dass die CMake Datei über 300 Zeilen hat (wieso zur Hölle kann es so kompliziert sein, eine Bibliothek zu kompilieren, die Textdateien verarbeitet, dass man ein 300 Zeilen Programm schreiben muss das Projektdateien generiert???). Nachdem diese Hürde genommen war, stoplerte ich aber ANDAUERND über Syntax-Fehler die schwer zu beheben waren, da die Fehlerausgabe von Yamlcpp unter aller Sau ist. Kurz ich hatte keinen Bock mehr.
Dann habe ich mir gesagt "Das Problem ist doch echt nicht so schwer, ich wette ich kann einen Loader schreiben, der mit weniger Code als die CMake-Datei von yamlcpp auskommt, und alles kann was ich will". Es stellte sich heraus, dass ich recht hatte.

Was soll das ganze?
Möglichst einfaches auslesen nett strukturierter Textdateien. Beispiel:

(Sieht besser aus, wenn ein Tab 4 Leerzeichen groß ist, weiß grad nicht wie man es umstellt. Oder wer denkt, 8 Leerzeichen wäre eine sinnvolle Tabulator-Größe...)

Code: Alles auswählen

Scene
	Camera
		Position		= 10 12 14
		Focal Length	= 10.4
		Model			= PMD SuperCam
		New				= false
	Objects
		Table
			Height = 4
			Shininess = 0
		Ball
			Radius = 3
  
	Files
		SaveTo = C:\LabData\Files.txd
		overwrite 
		noWarnings
 
	Dependencys
		C:\Standard Resources\Ball
		C:\Standard Resources\Table
Achja: Struktur wird Python mäßig durch Whitespaces (Tabs) definiert. Weils so übersichtlich und so wenig zu tippen ist. Yay!


Einlesen:

Code: Alles auswählen

#include <iostream>

#include "TexData.hpp"
using namespace std;

int main()
{
	try
	{
		auto config = TexData::LoadFile("test.txt");
		config.DebugPrint();
		cout << "\n\n" << config["Scene"]["Files"]["SaveTo"].as<string>() << endl;
		for(auto& c : config["Scene"]["Dependencys"])
		{
			cout << c->as<string>() << endl;
		}

		auto Scene = config["Scene"];
		cout << "Overwrite: " << Scene["Files"].has("overwrite") << endl;

	}
	catch(std::exception& ex)
	{
		cout << ex.what() << endl;
	}
	system("pause");
}
Im Grunde hat man eine Hierarchie aus Zeilen die aus Name = Wert Paaren bestehen. Wobei man Wert in jeden beliebigen Typen casten kann, für den lexical_cast funktioniert. Ein paar mehr Infos stehen in der .pdf im Archiv.


Warum ist das toll?
Weil man ständig simple Konfigurationsdateien braucht. Weil man zum Installieren nur 2 kleine Dateien in sein Projekt kopieren muss (angenommen, man verwendet schon boost). Und weil man dann Variablen in einer einzigen Zeile, mir einer relativ hübschen Syntax auslesen kann (TexData::LoadFile("test.txt")["Scene"]["Files"]["SaveTo"].Value()). Und weil man, wenn man irgendetwas falsch macht, eine Fehlermeldung bekommt, die einem genau sagt, was schief gelaufen ist, und wo. Und weil der Code nur 356 Zeilen hat, inklusive geräumiger Formatierung und Kommentaren und man es deshalb leicht verstehen und erweitern kann. KISS.

Aber ernsthaft noch ein Format?
Ja, denn: TexData ist sehr simpel. Es ist nicht für jede Art von Daten gedacht, sondern eher für Konfigurationsdateien und ähnliches. Es gibt keine direkte Unterstützung für komplexe Datentypen (man kann alle Typen benutzen, die man in einen 1-Zeilen String hin- und zurück casten kann), also keine Arrays, Listen oder Binärdaten. Aber dafür ist es sehr einfach zu benutzen. Ein Nischenformat also, aber eines das ich schon in viele meiner Projekte eingebaut habe, weil es so leicht geht und so nützlich ist.

Lizenz:
Naja, es sind ~350 nicht sehr geistreiche Zeilen. Benutzt sie, erweitert sie und schreibt mir, wenns euch gefallen hat. Möglicherweise bau ich irgendewann mehr Features ein und lade irgendwo ein Git-Repository hoch, mal sehen.
Dateianhänge
TexData.zip
Sourcecode und Doku
(28.42 KiB) 215-mal heruntergeladen
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Lib] TexData-Files

Beitrag von Schrompf »

Das Konzept finde ich gut, und einfache Kompilierbarkeit auf jeden Fall auch. Gruppierung mit Tab allerdings... Das ergibt bei Python doch schon immer Ärger, wenn man jemand mit nem anderen Editor und anderer Whitespace-Einstellung darin editiert.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2367
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Lib] TexData-Files

Beitrag von Jonathan »

Es macht halt Probleme, wenn Leute Editoren benutzen, die Tabs in Spaces umwandeln. Ich könnte eigentlich auch irgendwo mal einen Rant starten, was ich davon halte, aber das führt hier evtl. zu weit.
Andererseits ist das halt auch einfach so eine Sache, die man mit 2 Zeilen Code ändern in 5 Minuten angepasst hat. Und zwar hoffentlich auch als jemand, der den Code zum ersten Mal sieht.

Interessanterweise ist es so aber tatsächlich auch am einfachsten zu implementieren. Ich baue einen Baum auf, und je nachdem, wie viele Tabs ich am Anfang zähle, gehe ich eine Stufe hoch oder runter oder einfach nur weiter. Klammern zu matchen wäre wesentlich komplizierter und ich müsste vor allen Dingen aufpassen, wenn ich Klammern in Strings habe und mir über irgendein Escaping Gedanken machen. Durch diese Limitierungen (feste Einrückung per Whitespace, nur 1 Wert pro Zeile, usw.) wird es halt echt übersichtlich zu parsen und für die gedachten Anwendungsgebiete finde ich es auch echt sehr übersichtlich zu lesen (Wenn man Tabs auf 4 Leerzeichen stellt).
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [Lib] TexData-Files

Beitrag von Krishty »

Das mit dem Whitespace ist wirklich ein Editor-Problem. Scheiß auf die Dinger, die das in Leerzeichen umwandeln (und umgekehrt auch; fuck you, Visual C++).

Einrückung ist redundante Information zu Blöcken und Klammern; wenn man eh einrückt, kann man es direkt semantisch benutzen und sich den Rest sparen. Was ich mir nur problematisch vorstelle, ist die Programmierung von der Kommandozeile aus.

… nein, Spaß! Ich meine die Formatierung von langen Zeilen (entweder man rückt die eingebrochene Zeile ebenso weit ein wie die vorherige, und hat semantische Probleme, oder man lässt es, und hat kosmetische Probleme). Aber das ist für 99,9 % der Anwendungen doch echt nicht Meckerwürdig.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Lib] TexData-Files

Beitrag von Schrompf »

Dann könnte ich auch einen Rant über Leute starten, die überhaupt auf den aberwitzigen Gedanken kommen, Tabs zu benutzen. Aber das führt zu weit :-)

Meine Idee wäre eher gewesen, ein explizites sichtbares Einrückungszeichen zu verwenden. Z.B. einen Punkt. Und dazwischen wird Whitespace ignoriert. Allerdings geht dafür dann die Einrückungsunterstützung der gängigen Texteditoren nicht mehr.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Alexander Kornrumpf
Moderator
Beiträge: 2112
Registriert: 25.02.2009, 13:37

Re: [Lib] TexData-Files

Beitrag von Alexander Kornrumpf »

Es gibt Leute, die werden diskutieren, egal was du ihnen vorsetzt, und wenn man es schafft deren Energien mit Whitespace vs. Tabs zu binden, während alle anderen weiter ihre Arbeit machen können, betrachte ich das netto als Gewinn. Ich habe den Verdacht, dass Guido van Rossum das auch wusste und das Redundanzargument nur vorgeschoben ist :)
Benutzeravatar
Jonathan
Establishment
Beiträge: 2367
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Lib] TexData-Files

Beitrag von Jonathan »

Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: [Lib] TexData-Files

Beitrag von joeydee »

Ja, mache ich auch gern, sowas :) gute Entscheidung.

Da es in der Regel ja um Config während der Entwicklung geht, gilt: gut ist immer das womit man selbst zurechtkommt. Und wenn doch mal ein Enduser was damit konfigurieren soll: woanders muss ich mich auch an kryptische Syntax und exakte Schreibweisen gewöhnen. Sobald es wirklich final relevant und komplexer wird, macht man meist sowieso ein Tool das die Dateien schreibt ...

Was ich meist noch mit drin habe: // für Kommentarzeilen und um Zeilen von der Interpretation schnell mal auszuklammern (brauche ich dauernd), sowie einfache Makrodefinitionen (reine Ersetzungen). Damit kann man auch zu tiefen Schachtelungen provisorisch aus dem Weg gehen und das Ganze sprechender gestalten, was ja gerade bei Szenenbeschreibungen schnell von Vorteil sein kann.
Zuletzt noch Drag'n'Drop, um bequem mit verschiedenen Dateien testen zu können ohne den Testlauf neu starten zu müssen, aber das ist dann schon wieder anwendungsspezifisch. Jedenfalls aber saupraktisch :)
Antworten