]> git.tdb.fi Git - libs/datafile.git/commitdiff
Add Readme.txt and some other documentation
authorMikko Rasa <tdb@tdb.fi>
Mon, 17 Sep 2007 17:09:56 +0000 (17:09 +0000)
committerMikko Rasa <tdb@tdb.fi>
Mon, 17 Sep 2007 17:09:56 +0000 (17:09 +0000)
Readme.txt [new file with mode: 0644]
source/binarydict.h
source/binaryparser.cpp
source/binaryparser.h
source/binarywriter.cpp
source/binarywriter.h
source/loader.h
source/parser.h
source/parsermode.h
source/writer.h

diff --git a/Readme.txt b/Readme.txt
new file mode 100644 (file)
index 0000000..2c03cf2
--- /dev/null
@@ -0,0 +1,84 @@
+libmspdatafile - structured datafile library
+Copyright © 2006-2007  Mikko Rasa, Mikkosoft Productions
+Version 0.1 readme
+
+
+Libmspdatafile is a library for reading and writing structured data files.  It
+supports both a human-readable text format and a more compact binary format.
+The text-based format is designed to be compact yet clean, avoiding much of the
+redundancy of XML.
+
+Libmspdatafile is distributed under the terms of the GNU Lesser Public License.
+Full text of the license can be found in the file License.txt.
+
+
+*** Structure
+
+The basic building block of a datafile is a statement.  A statement has a
+keyword and zero or more arguments.  It may also have zero or more substate-
+ments.
+
+The interface is heavily object-oriented and typically one statement in a file
+represents one object in the program's memory.
+
+The library supports five basic data types: integers, floats, strings, booleans
+and enums.  Data types are strictly enforced - the only allowed conversion is
+from float to integer.
+
+The correct argument types for a statement is determined from the function or
+variable used to load it.  This means that semantical validation can only be
+done by the program that actually uses the file.  A generic tool can only
+perform syntactic validation.
+
+
+*** Basic usage
+
+Loading data from files is achieved through Loader classes.  Such a class must
+be derived from the DataFile::Loader class.  In the constructor, a series of
+calls to the various overloads of the add() function is executed, telling the
+loader what to do.  The two basic actions are calling a function of the loader
+with the statement's arguments, or assigning the arguments to variables of the
+loaded object.
+
+There is a load() function in namespace scope that allows loading a whole file
+into an object.
+
+It is also possible to call the Parser::parse function directly and obtain a
+raw Statement.  However, this is rarely useful.
+
+
+*** Syntax
+
+The syntax of the text format vaguely resembles C.  Statements are terminated
+with a semicolon and substatements are enclosed between burly braces.  The sub-
+statement block comes after all arguments and the semicolon comes after it.  An
+empty substatement block is allowed and equal to an absent block.
+
+Integers can be written in decimal, octal or hexadecimal notation.  A minus
+sign can be used in any base for negative numbers, as well as an optional plus
+sign for positive numbers.
+
+Floats must be written in decimal and they must contain a decimal point.  An
+exponent may come after the mantissa, separated by the character e.  Minus and
+plus signs are allowed in both exponent and mantissa.
+
+Strings are enclosed in double quotes.  Backslash can be used to escape a
+literal double quote or backslash.
+
+Booleans are either true or false.
+
+Enumeration values are represented as symbolic identifiers.  They may contain
+alphaumeric characters and underscores and must begin with a letter or an
+underscore.
+
+
+*** Binary format
+
+The binary format is not intended to be manipulated by anything else than
+libmspdatafile.  A detailed description is not available at this time.
+
+The tool provided with the library can be used to convert between the two
+formats.
+
+
+*** $Id$
index 3b195617b1c45c8933d815030685171911de6ab8..9309b4fffaefe39d381f78d2a40a2eb2f22c6068 100644 (file)
@@ -13,6 +13,9 @@ Distributed under the LGPL
 namespace Msp {
 namespace DataFile {
 
+/**
+Stores statement information for binary files.
+*/
 struct DictEntry
 {
        std::string keyword;
index 298770a50f3ccbf2b02d3113f0163daea0dfefa7..6aed5b1590bb93b383fb45c535a6cd75af94a030 100644 (file)
@@ -19,7 +19,7 @@ BinaryParser::BinaryParser(Input &i, const string &s):
        ParserMode(i, s),
        first(true)
 {
-       dict[1]=DictEntry("__kw", "iss");
+       dict[1]=DictEntry("__st", "iss");
        dict[2]=DictEntry("__enum", "is");
 }
 
@@ -28,7 +28,7 @@ Statement BinaryParser::parse()
        while(1)
        {
                Statement st=parse_statement();
-               if(st.keyword=="__kw")
+               if(st.keyword=="__st")
                {
                        if(st.args.size()!=3)
                                throw TypeError(src+": Keyword definition must have three arguments");
index 560703c66ddb337791a98b7e72d8dc1c81262169..f1d51b236edc8b192c3644574905775c7cf9b9da 100644 (file)
@@ -15,6 +15,9 @@ Distributed under the LGPL
 namespace Msp {
 namespace DataFile {
 
+/**
+Parses data in binary format.
+*/
 class BinaryParser: public ParserMode
 {
 private:
index e89def35a8eeac9dc7cab2c55202ef251e8701b8..95526bbae84666b6b02997ec68c724a1a357e6d8 100644 (file)
@@ -18,7 +18,7 @@ BinaryWriter::BinaryWriter(ostream &o):
        next_st_id(3),
        next_enum_id(1)
 {
-       dict[DictEntry("__kw", "iss")]=1;
+       dict[DictEntry("__st", "iss")]=1;
        dict[DictEntry("__enum", "is")]=1;
 }
 
@@ -72,7 +72,7 @@ void BinaryWriter::collect_keywords(const Statement &st)
        if(!dict.count(de))
        {
                Statement kst;
-               kst.keyword="__kw";
+               kst.keyword="__st";
                kst.args.push_back(next_st_id);
                kst.args.push_back(de.keyword);
                kst.args.push_back(de.args);
index cf8f9fcaa016c35bfedb9172a6c0c76c940b00d5..691ed701d3bcaa4be9c5641aeebddfb0391fabb9 100644 (file)
@@ -15,6 +15,9 @@ Distributed under the LGPL
 namespace Msp {
 namespace DataFile {
 
+/**
+Writes data in binary format.
+*/
 class BinaryWriter: public WriterMode
 {
 private:
index 7d5d8d9690dfd1c9460739e7a22332a26e6d5e42..9c0933694e074389a5931f3af8a5e2fc029ca6f7 100644 (file)
@@ -189,11 +189,11 @@ private:
 
 
 /**
-Base class for data loaders.  To enable objects of a certain class to be loaded
-from datafiles, create a public Loader class in it, derived from this class.
-Typically the Loader class contains a reference to the object being loaded.  If
-you want to load data members of the object directly, the Loader class must
-have a member function get_object() returning that reference.
+Base class for data loaders.  To give loading capabilities to a class, create a
+public Loader class in it, derived from this class.  Typically a loader object
+contains a reference to the loaded object.  To make use of loading directly
+into data members, the Loader class must have a get_object() member function,
+returning that reference.
 */
 class Loader
 {
@@ -214,6 +214,9 @@ public:
 protected:
        Loader(): cur_st(0) { }
 
+       /**
+       Adds a keyword that is loaded with a zero-argument function.
+       */
        template<typename L>
        void add(const std::string &k, void (L::*func)())
        { actions.insert(typename ActionMap::value_type(k, new LoaderFunc0<L>(func))); }
@@ -234,6 +237,9 @@ protected:
        void add(const std::string &k, void (L::*func)(A0, A1, A2, A3))
        { actions.insert(typename ActionMap::value_type(k, new LoaderFunc4<L, A0, A1, A2, A3>(func))); }
 
+       /**
+       Adds a keyword that is loaded into a variable of the loaded object.
+       */
        template<typename L, typename T0>
        void add(const std::string &k, T0 L::*p0)
        { actions.insert(typename ActionMap::value_type(k, new LoadValue1<L, T0>(p0))); }
@@ -242,6 +248,9 @@ protected:
        void add(const std::string &k, T0 L::*p0, T1 L::*p1)
        { actions.insert(typename ActionMap::value_type(k, new LoadValue2<L, T0, T1>(p0, p1))); }
 
+       /**
+       Adds a keyword that is recognized but ignored.
+       */
        void add(const std::string &k)
        { actions.insert(ActionMap::value_type(k, 0)); }
 
index 5bec123ae74f7aeee3485dbbeeb226d0bad928b7..c830c3c8367f5c082788ad864f23eed84266439a 100644 (file)
@@ -19,19 +19,32 @@ class ParserMode;
 class Statement;
 struct Token;
 
+/**
+Frontend for loading datafiles.  Handles switching between text and binary
+formats.  A Parser evaluates into a boolean value indicating whether more
+statements may be read.
+*/
 class Parser
 {
-public:
-       Parser(std::istream &, const std::string &);
-       ~Parser();
-
-       Statement parse();
-       operator bool() const { return in; }
 private:
        Input       in;
        std::string src;
        bool        good;
        ParserMode  *mode;
+
+public:
+       Parser(std::istream &i, const std::string &s);
+       ~Parser();
+
+       /**
+       Reads a statement from the input.  If the end of input was reached, an empty
+       invalid statement will be returned.  If an error occurs, the parser will be
+       marked as bad and no more statements may be read, even if the exception was
+       caught.
+       */
+       Statement parse();
+
+       operator bool() const { return good && in; }
 };
 
 } // namespace DataFile
index 824525d66aeeddaa0347e1848b18f409d8e82f91..ae407566a9d0442a96a699cbfde1b1387c1add91 100644 (file)
@@ -15,6 +15,9 @@ namespace DataFile {
 
 class Input;
 
+/**
+Base class for parse modes.
+*/
 class ParserMode
 {
 protected:
index 756e19a22c41668cea43fb5387944b90b84a4721..698bade8f650cf45198ee92ac147f18a10540b02 100644 (file)
@@ -18,6 +18,9 @@ namespace DataFile {
 class Statement;
 class WriterMode;
 
+/**
+Frontend for writing data.
+*/
 class Writer
 {
 private:
@@ -26,9 +29,21 @@ private:
        bool binary;
 
 public:
-       Writer(std::ostream &);
-       void write(const Statement &);
-       void set_binary(bool);
+       Writer(std::ostream &o);
+
+       /**
+       Writes a statement to the output.  This function always writes a complete
+       statement, so it's not possible to add substatements later.
+       */
+       void write(const Statement &st);
+
+       /**
+       Sets binary or text mode.  While it is possible to enter and exit binary
+       mode multiple times, doing so produces sub-optimal output.
+
+       @param  b  true for binary mode, false for text
+       */
+       void set_binary(bool b);
 };
 
 } // namespace DataFile