Newer
Older
Import / applications / MakePDF / Tests / exip-0.5.4 / utils / schemaHandling / output / dynOutputUtils.c
/*==================================================================*\
|                EXIP - Embeddable EXI Processor in C                |
|--------------------------------------------------------------------|
|          This work is licensed under BSD 3-Clause License          |
|  The full license terms and conditions are located in LICENSE.txt  |
\===================================================================*/

/**
 * @file dynOutputUtils.c
 * @brief Implement utility functions for storing EXIPSchema instances as dynamic code
 * @date May 7, 2012
 * @author Rumen Kyusakov
 * @version 0.5
 * @par[Revision] $Id: dynOutputUtils.c 328 2013-10-30 16:00:10Z kjussakov $
 */

#include "schemaOutputUtils.h"
#include "hashtable.h"
#include "stringManipulate.h"

#define MAX_GRAMMARS_COUNT 5000

//TODO: split this code into separate functions
errorCode dynExipSchemaOutput(EXIPSchema* schema, char* prefix, unsigned char mask_specified,
		unsigned char mask_strict, unsigned char mask_sc, unsigned char mask_preserve, FILE* out)
{

	// TODO: must be fixed!
#if 0
	Index uriIter, lnIter, pfxIter, ruleIter, partIter, prodIter;
	EXIGrammar* tmpGrammar;
	uintptr_t grammarPointer = 0;
	String hashKey;
	Index typeGrammarID;
	struct hashtable *typeGrammarsHash;
	unsigned int tgCount = 0;
	QNameID typeGrammars[MAX_GRAMMARS_COUNT];

	typeGrammarsHash = create_hashtable(1000, djbHash, stringEqual);

	// TODO: needs to be fixed

	fprintf(out, "errorCode get_%sSchema(EXIPSchema* schema);\n\n", prefix);
	fprintf(out, "errorCode get_%sSchema(EXIPSchema* schema)\n{\n\t errorCode tmp_err_code = EXIP_UNEXPECTED_ERROR;\n\t\n\t", prefix);
	fprintf(out, "if(schema == NULL)\n\t return EXIP_NULL_POINTER_REF;\n\t");

	fprintf(out, "tmp_err_code = initAllocList(&schema->memList);\n\t");
	fprintf(out, "if(tmp_err_code != EXIP_OK)\n\t return tmp_err_code;\n\t");

	for(uriIter = 0; uriIter < schema->uriTable.count; uriIter++)
	{
		if(schema->uriTable.uri[uriIter].pfxTable != NULL)
		{
			fprintf(out, "PfxTable* pfxTable_%d = memManagedAllocate(&schema->memList, sizeof(PfxTable));\n\t", uriIter);
			fprintf(out, "if(pTable_%d == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t", uriIter);
			fprintf(out, "pTable_%d->rowCount = %d;\n\t", uriIter, schema->uriTable.uri[uriIter].pfxTable->count);

			for(pfxIter = 0; pfxIter < schema->uriTable.uri[uriIter].pfxTable->count; pfxIter++)
			{
				fprintf(out, "tmp_err_code += asciiToString(\"");
				fwrite(schema->uriTable.uri[uriIter].pfxTable->pfxStr[pfxIter].str, sizeof(CharType), schema->uriTable.uri[uriIter].pfxTable->pfxStr[pfxIter].length, out);
				fprintf(out, "\", &pTable_%d->string_val[%d], &schema->memList, TRUE);\n\t", uriIter, pfxIter);
			}
			for(; pfxIter < MAXIMUM_NUMBER_OF_PREFIXES_PER_URI; pfxIter++)
			{
				fprintf(out, "getEmptyString(&pTable_%d->string_val[%d]);\n\t", uriIter, pfxIter);
			}
			fprintf(out, "if(tmp_err_code != EXIP_OK)\n\t return EXIP_UNEXPECTED_ERROR;\n\t");
		}

		for(lnIter = 0; lnIter < schema->uriTable.uri[uriIter].lnTable.count; lnIter++)
		{
			tmpGrammar = schema->uriTable.uri[uriIter].lnTable.ln[lnIter].typeGrammar;
			grammarPointer = (uintptr_t) tmpGrammar;
			hashKey.str = (CharType*) &grammarPointer;
			hashKey.length = sizeof(grammarPointer)/sizeof(CharType);
			typeGrammarID = hashtable_search(typeGrammarsHash, &hashKey);
			if(tmpGrammar != NULL && typeGrammarID == INDEX_MAX)
			{
				if(mask_specified == TRUE)
				{
					if(EXIP_OK != addUndeclaredProductions(&schema->memList, mask_strict, mask_sc, mask_preserve, tmpGrammar, &schema->simpleTypeTable))
					{
						printf("\n ERROR: OUT_SRC_DYN output format!");
						exit(1);
					}
				}

				for(ruleIter = 0; ruleIter < tmpGrammar->count; ruleIter++)
				{
					for(partIter = 0; partIter < 3; partIter++)
					{
						if(tmpGrammar->rule[ruleIter].part[partIter].count > 0)
						{
							fprintf(out, "Production* prod_%d_%d_%d_part%d = memManagedAllocate(&schema->memList, %d * sizeof(Production));\n\t", uriIter, lnIter, ruleIter, partIter, tmpGrammar->rule[ruleIter].part[partIter].count);
							fprintf(out, "if(prod_%d_%d_%d_part%d == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t", uriIter, lnIter, ruleIter, partIter);

							for(prodIter = 0; prodIter < tmpGrammar->rule[ruleIter].part[partIter].count; prodIter++)
							{
								fprintf(out, "prod_%d_%d_%d_part%d[%d].evnt.eventType = %d;\n\t", uriIter, lnIter, ruleIter, partIter, prodIter, tmpGrammar->rule[ruleIter].part[partIter].prod[prodIter].evnt.eventType);
								fprintf(out, "prod_%d_%d_%d_part%d[%d].evnt.valueType.exiType = %d;\n\t", uriIter, lnIter, ruleIter, partIter, prodIter, tmpGrammar->rule[ruleIter].part[partIter].prod[prodIter].evnt.valueType.exiType);
								fprintf(out, "prod_%d_%d_%d_part%d[%d].evnt.valueType.simpleTypeId = %d;\n\t", uriIter, lnIter, ruleIter, partIter, prodIter, tmpGrammar->rule[ruleIter].part[partIter].prod[prodIter].evnt.valueType.simpleTypeId);
								fprintf(out, "prod_%d_%d_%d_part%d[%d].nonTermID = %d;\n\t", uriIter, lnIter, ruleIter, partIter, prodIter, tmpGrammar->rule[ruleIter].part[partIter].prod[prodIter].nonTermID);
								fprintf(out, "prod_%d_%d_%d_part%d[%d].qname.uriId = %d;\n\t", uriIter, lnIter, ruleIter, partIter, prodIter, tmpGrammar->rule[ruleIter].part[partIter].prod[prodIter].qname.uriId);
								fprintf(out, "prod_%d_%d_%d_part%d[%d].qname.lnId = %d;\n\t", uriIter, lnIter, ruleIter, partIter, prodIter, tmpGrammar->rule[ruleIter].part[partIter].prod[prodIter].qname.lnId);

							}
						}
					}
				}
				fprintf(out, "GrammarRule* rule_%d_%d = memManagedAllocate(&schema->memList, %d * sizeof(GrammarRule));\n\t", uriIter, lnIter, tmpGrammar->count);
				fprintf(out, "if(rule_%d_%d == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t", uriIter, lnIter);

				for(ruleIter = 0; ruleIter < tmpGrammar->count; ruleIter++)
				{
					for(partIter = 0; partIter < 3; partIter++)
					{
						if(tmpGrammar->rule[ruleIter].part[partIter].count > 0)
							fprintf(out, "rule_%d_%d[%d].part[%d] = prod_%d_%d_%d_part%d;\n\t", uriIter, lnIter, ruleIter, partIter, uriIter, lnIter, ruleIter, partIter);
						else
							fprintf(out, "rule_%d_%d[%d].part[%d].prod = NULL;\n\t", uriIter, lnIter, ruleIter, partIter);

						fprintf(out, "rule_%d_%d[%d].part[%d].count = %d;\n\t", uriIter, lnIter, ruleIter, partIter, tmpGrammar->rule[ruleIter].part[partIter].count);
						fprintf(out, "rule_%d_%d[%d].part[%d].bits = %d;\n\t", uriIter, lnIter, ruleIter, partIter, tmpGrammar->rule[ruleIter].part[partIter].bits);

					}
				}

				fprintf(out, "EXIGrammar* grammar_%d_%d = memManagedAllocate(&schema->memList, sizeof(EXIGrammar));\n\t", uriIter, lnIter);
				fprintf(out, "if(grammar_%d_%d == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t", uriIter, lnIter);

				fprintf(out, "grammar_%d_%d->contentIndex = %d;\n\t", uriIter, lnIter, tmpGrammar->contentIndex);
				fprintf(out, "grammar_%d_%d->props = 0x%02x;\n\t", uriIter, lnIter, tmpGrammar->props);
				fprintf(out, "grammar_%d_%d->count = %d;\n\t", uriIter, lnIter, tmpGrammar->count);
				fprintf(out, "grammar_%d_%d->rule = rule_%d_%d;\n\t", uriIter, lnIter, uriIter, lnIter);

				if(tgCount >= MAX_GRAMMARS_COUNT)
				{
					printf("\n ERROR: MAX_GRAMMARS_COUNT reached!");
					exit(1);
				}

				if(EXIP_OK != hashtable_insert(typeGrammarsHash, &hashKey, tgCount))
				{
					printf("\n ERROR: OUT_SRC_DYN output format!");
					exit(1);
				}
				typeGrammars[tgCount].uriId = uriIter;
				typeGrammars[tgCount].lnId = lnIter;
				tgCount++;
			}
		}
		fprintf(out, "struct LocalNamesRow* LNrows_%d = memManagedAllocate(&schema->memList, %d * sizeof(struct LocalNamesRow));\n\t", uriIter, schema->uriTable.uri[uriIter].lnTable.count);
		fprintf(out, "if(LNrows_%d == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t", uriIter);

		for(lnIter = 0; lnIter < schema->uriTable.uri[uriIter].lnTable.count; lnIter++)
		{
			tmpGrammar = schema->uriTable.uri[uriIter].lnTable.ln[lnIter].typeGrammar;
			grammarPointer = (uintptr_t) tmpGrammar;
			hashKey.str = (CharType*) &grammarPointer;
			hashKey.length = sizeof(grammarPointer)/sizeof(CharType);
			typeGrammarID = hashtable_search(typeGrammarsHash, &hashKey);

			if(tmpGrammar != NULL)
				fprintf(out, "LNrows_%d[%d].typeGrammar = grammar_%d_%d;\n\t", uriIter, lnIter, typeGrammars[typeGrammarID].uriId, typeGrammars[typeGrammarID].lnId);
			else
				fprintf(out, "LNrows_%d[%d].typeGrammar = NULL;\n\t", uriIter, lnIter);

			fprintf(out, "LNrows_%d[%d].string_val.str = \"", uriIter, lnIter);
			fwrite(schema->uriTable.uri[uriIter].lnTable.ln[lnIter].lnStr.str, sizeof(CharType), schema->uriTable.uri[uriIter].lnTable.ln[lnIter].lnStr.length, out);
			fprintf(out, "\";\n\t");
			fprintf(out, "LNrows_%d[%d].string_val.length = %d;\n\t", uriIter, lnIter, schema->uriTable.uri[uriIter].lnTable.ln[lnIter].lnStr.length);
			fprintf(out, "LNrows_%d[%d].vCrossTable = NULL;\n\t", uriIter, lnIter);

		}

		fprintf(out, "LocalNamesTable* lTable_%d = memManagedAllocate(&schema->memList, sizeof(LocalNamesTable));\n\t", uriIter);
		fprintf(out, "if(lTable_%d == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t", uriIter);

		fprintf(out, "lTable_%d->arrayDimension = %d;\n\t", uriIter, schema->uriTable.uri[uriIter].lnTable.count);
		fprintf(out, "lTable_%d->rowCount = %d;\n\t", uriIter, schema->uriTable.uri[uriIter].lnTable.count);
		fprintf(out, "lTable_%d->rows = LNrows_%d;\n\t", uriIter, uriIter);
		fprintf(out, "lTable_%d->memPair.memBlock = NULL;\n\t", uriIter); // TO BE fixed!
		fprintf(out, "lTable_%d->memPair.allocIndx = 0;\n\t", uriIter); // TO BE fixed!
	}

	fprintf(out, "struct URIRow* uriRows = memManagedAllocate(&schema->memList, %d * sizeof(struct URIRow));\n\t", schema->uriTable.count);

	fprintf(out, "if(uriRows == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t");


	for(uriIter = 0; uriIter < schema->uriTable.count; uriIter++)
	{
		if(schema->uriTable.uri[uriIter].pfxTable != NULL)
			fprintf(out, "uriRows[%d].pTable = pTable_%d;\n\t", uriIter, uriIter);
		else
			fprintf(out, "uriRows[%d].pTable = NULL;\n\t", uriIter);
		fprintf(out, "uriRows[%d].lTable = lTable_%d;\n\t", uriIter, uriIter);
		fprintf(out, "uriRows[%d].string_val.str = \"", uriIter);
		fwrite(schema->uriTable.uri[uriIter].uriStr.str, sizeof(CharType), schema->uriTable.uri[uriIter].uriStr.length, out);
		fprintf(out, "\";\n\t");
		fprintf(out, "uriRows[%d].string_val.length = %d;\n\t", uriIter, schema->uriTable.uri[uriIter].uriStr.length);

	}

	fprintf(out, "URITable* uriTbl = memManagedAllocate(&schema->memList, sizeof(URITable));\n\t");
	fprintf(out, "if(uriTbl == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t");
	fprintf(out, "uriTbl->arrayDimension = %d;\n\t", schema->uriTable.dynArray.arrayEntries);
	fprintf(out, "uriTbl->rowCount = %d;\n\t", schema->uriTable.count);
	fprintf(out, "uriTbl->rows = uriRows;\n\t");
	fprintf(out, "uriTbl->memPair.memBlock = NULL;\n\t"); // TO BE fixed!
	fprintf(out, "uriTbl->memPair.allocIndx = 0;\n\t"); // TO BE fixed!
	fprintf(out, "QNameID* qnames = memManagedAllocate(&schema->memList, %d * sizeof(QNameID));\n\t", schema->globalElemGrammarTable.count);
	fprintf(out, "if(qnames == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t");

	for(uriIter = 0; uriIter < schema->globalElemGrammarTable.count; uriIter++)
	{
		fprintf(out, "qnames[%d].uriId = %d;\n\t", uriIter, schema->globalElemGrammarTable.qname[uriIter].uriId);
		fprintf(out, "qnames[%d].lnId = %d;\n\t", uriIter, schema->globalElemGrammarTable.qname[uriIter].lnId);

	}

	fprintf(out, "SimpleType* sTypes = memManagedAllocate(&schema->memList, %d * sizeof(SimpleType));\n\t", schema->simpleTypeTable.count);
	fprintf(out, "if(sTypes == NULL)\n\t return EXIP_MEMORY_ALLOCATION_ERROR;\n\t");

	for(uriIter = 0; uriIter < schema->simpleTypeTable.count; uriIter++)
	{
		fprintf(out, "sTypes[%d].facetPresenceMask = %d;\n\t", uriIter, schema->simpleTypeTable.sType[uriIter].facetPresenceMask);
		fprintf(out, "sTypes[%d].maxInclusive = %d;\n\t", uriIter, schema->simpleTypeTable.sType[uriIter].maxInclusive);
		fprintf(out, "sTypes[%d].minInclusive = %d;\n\t", uriIter, schema->simpleTypeTable.sType[uriIter].minInclusive);
		fprintf(out, "sTypes[%d].maxLength = %d;\n\t", uriIter, schema->simpleTypeTable.sType[uriIter].maxLength);

	}

	fprintf(out, "schema->globalElemGrammars = qnames;\n\t");
	fprintf(out, "schema->globalElemGrammarTable.count = %d;\n\t", schema->globalElemGrammarTable.count);
	fprintf(out, "schema->uriTable = uriTbl;\n\t");
	fprintf(out, "schema->simpleTypeArray = sTypes;\n\t");
	fprintf(out, "schema->simpleTypeTable.count = %d;\n\t", schema->simpleTypeTable.count);
	fprintf(out, "schema->isAugmented = %d;\n\t", mask_specified);
	fprintf(out, "schema->isStatic = FALSE;\n\t");
	fprintf(out, "return EXIP_OK;\n}");

	hashtable_destroy(typeGrammarsHash);
#endif
	return EXIP_OK;
}