
devil1geo.h / devil1geo.c
    Handles files containing geometry.

Functions
    All functions are static but exposed by a function pointer in a constant
    struct called DEVIL1GEO. For example, clients call functions using
    DEVIL1GEO.printheader(...);

    void printheader(struct Header*);
        Show attributes and values of a Header for the package.

        input: pointer to Header, pass by reference of a struct.
               Can not be NULL.

    void printmeshheader(struct MeshHeader*);
        Show attributes and values of a MeshHeader.

        input: pointer to MeshHeader, pass by reference of a struct.
               Can not be NULL.

    void printbatch(struct Batch*);
        Show attribute and values of a Batch and three sample position 
        coordinates.

        input: pointer to Batch, pass by reference of a struct.
               Can not be NULL.

    void printcoordinate(struct Coordinate*, unsigned int);
        Show a specified quantity of Coordinates.
        
        input: 
            pointer to array of Coordinates.
            Can not be NULL.
            
            unsigned int, for quantity of coordinates to be printed.

    bool getheader(struct Header**, const char*);
        Retrieves the header for a geometry package.

            input:
                Pointer of a pointer to struct Header.
                Pass by reference of a pointer to the function.
                The pointer of Header can be NULL and will be set to point to
                a region in the buffer.

                const char*, the buffer containing the whole geometry package.
                Can not be NULL.

    bool getmeshheader(struct MeshHeader**, 
                       unsigned int, 
                       const char * const);
        Retrieves the i-th MeshHeader in a buffer.

        input:
            Pointer of a pointer to MeshHeader.
            Pass by reference of a pointer to the function.
            The pointer of MeshHeader can be NULL and will be set to point to
            a region in the buffer.

            unsigned int, the i-th instance of MeshHeader in the buffer.

            const char*, the buffer containing the whole mesh package.

        output:
            true on success.

            false when failing checks against segmentation faults.
                If parameter 'struct MeshHeader**' is NULL.
                If parameter 'const char*' is NULL.

    bool getbatch(struct Batch*, 
                  unsigned int offset, 
                  const char * const);
        Retrieves the i-th Batch in a buffer.

        input:
            Pointer to a Batch.
            Pass by reference of a struct to the function.
            Can not be NULL.

            unsigned int, the i-th instance of Batch in the buffer.

            const char*, the buffer containing the whole mesh package.

        output:
            true on success.

            false when failing checks against segmentation faults.
                If parameter 'struct Batch*' is NULL.
                If parameter 'const char*' is NULL.

    bool getmesh(struct Mesh*, 
                 unsigned int, 
                 const char*,
                 unsigned int);
    Retrieves the i-th Mesh in a buffer.

        input:
            Pointer to mesh.
            Pass by reference of a struct to the function.

            unsigned int, the i-th instance of Mesh in the buffer.

            const char*, the buffer containing the whole mesh package.

        output:
            true on success.

            false when failing checks against segmentation faults.
                If parameter 'struct Mesh*' is NULL.
                If attribute 'b' of parameter 'struct Mesh' is NULL.
                if parameter 'const char*' is NULL.
                When file size is detected to be too small for a given i-th
                Mesh.

Example logic to interact with all meshes:
    {
        // After the file has been read in.

        // Need to know how many meshes are in the file.
        struct Header *h = (struct Header*)filedata;
        
        // Need to know about a specific mesh (how many batches).
        struct MeshHeader *mh = NULL;
        
        // Need to hold information about mesh.
        struct Mesh m;
        // As a precaution - empty for now.
        m.b = NULL;

        unsigned int i;
        for (i = 0; i < h -> numMesh; i++) {
            DEVIL1GEO.getmeshheader(&mh, i, filedata);
            // Allocate space to hold batch data.
            m.b = (struct Batch*)malloc(sizeof(struct Batch) * (mh -> numBatch));
            if (m.b != NULL) {
                DEVIL1GEO.getmesh(&m, i, filedata, filesize);
                // Do whatever you want with the mesh.
                free(m.b);
            }
    }

