blob: 70e61f5a887f4ebbb36e2d8f6119fb7e331ee007 [file] [log] [blame]
/*
* Legal Notice
*
* This document and associated source code (the "Work") is a part of a
* benchmark specification maintained by the TPC.
*
* The TPC reserves all right, title, and interest to the Work as provided
* under U.S. and international laws, including without limitation all patent
* and trademark rights therein.
*
* No Warranty
*
* 1.1 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE INFORMATION
* CONTAINED HEREIN IS PROVIDED "AS IS" AND WITH ALL FAULTS, AND THE
* AUTHORS AND DEVELOPERS OF THE WORK HEREBY DISCLAIM ALL OTHER
* WARRANTIES AND CONDITIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
* INCLUDING, BUT NOT LIMITED TO, ANY (IF ANY) IMPLIED WARRANTIES,
* DUTIES OR CONDITIONS OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
* PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OF
* WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF NEGLIGENCE.
* ALSO, THERE IS NO WARRANTY OR CONDITION OF TITLE, QUIET ENJOYMENT,
* QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT
* WITH REGARD TO THE WORK.
* 1.2 IN NO EVENT WILL ANY AUTHOR OR DEVELOPER OF THE WORK BE LIABLE TO
* ANY OTHER PARTY FOR ANY DAMAGES, INCLUDING BUT NOT LIMITED TO THE
* COST OF PROCURING SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS
* OF USE, LOSS OF DATA, OR ANY INCIDENTAL, CONSEQUENTIAL, DIRECT,
* INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER CONTRACT, TORT, WARRANTY,
* OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY OTHER AGREEMENT
* RELATING TO THE WORK, WHETHER OR NOT SUCH AUTHOR OR DEVELOPER HAD
* ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
*
* Contributors:
* Gradient Systems
*/
#include "config.h"
#include "porting.h"
#include <stdio.h>
#include <stdlib.h>
#ifdef USE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif
/*
* Routine: mkheader()
* Purpose: keep columns.h and streams.h in sync
* Algorithm: this should really be a simple shell script, but need to assure that it will
* port to non-unix (i.e., windows)
* Data Structures:
*
* Params:
* Returns:
* Called By:
* Calls:
* Assumptions:
* Side Effects:
* TODO: None
*/
int
main(int ac, char **av)
{
FILE *pInputFile,
*pColumnsFile,
*pStreamsFile,
*pTablesFile;
char szColumn[80],
szTable[80],
szLine[1024],
szDuplicate[80],
szLastTable[80],
*cp;
int nLineNumber = 0,
nColumnCount = 1,
bError = 0,
nTableCount = 0,
nRNGUsage = 1;
if (ac != 2)
bError = 1;
pInputFile = fopen(av[1], "r");
if (pInputFile == NULL)
bError = 1;
pColumnsFile = fopen("columns.h", "w");
if (pColumnsFile == NULL)
bError = 1;
pStreamsFile = fopen("streams.h", "w");
if (pStreamsFile == NULL)
bError = 1;
pTablesFile = fopen("tables.h", "w");
if (pTablesFile == NULL)
bError = 1;
if (bError)
{
fprintf(stderr, "USAGE:\n\t%s file -- build headers based on file\n", av[0]);
fprintf(stderr, "\tcolumns.h and streams.h produced as a result\n");
exit(-1);
}
/* set up varaibles */
szLastTable[0] = '\0';
/* put out minimal headers for each file */
fprintf(pColumnsFile, "/*\n * THIS IS A GENERATED FILE\n * SEE COLUMNS.LIST\n*/\n");
fprintf(pStreamsFile, "/*\n * THIS IS A GENERATED FILE\n * SEE COLUMNS.LIST\n*/\n");
fprintf(pTablesFile, "/*\n * THIS IS A GENERATED FILE\n * SEE COLUMNS.LIST\n*/\n");
fprintf(pColumnsFile, "#ifndef COLUMNS_H\n#define COLUMNS_H\n");
fprintf(pStreamsFile, "#ifndef STREAMS_H\n#define STREAMS_H\n");
fprintf(pStreamsFile, "rng_t Streams[] = {\n{0, 0, 0, 0, 0, 0, 0},\n");
fprintf(pTablesFile, "#ifndef TABLES_H\n#define TABLES_H\n");
/* add an entry to each for each column in the list */
while (fgets(szLine, 1024, pInputFile) != NULL)
{
nLineNumber += 1;
szColumn[0] = szTable[0] = szDuplicate[0] = '\0';
nRNGUsage = 1;
if ((cp = strchr(szLine, '#')) != NULL)
*cp = '\0';
if (!strlen(szLine))
continue;
if (sscanf(szLine, "%s %s %d %s", szColumn, szTable, &nRNGUsage, szDuplicate) != 4)
{
strcpy(szDuplicate, szColumn);
if (sscanf(szLine, "%s %s %d", szColumn, szTable, &nRNGUsage) != 3)
{
if (sscanf(szLine, "%s %s", szColumn, szTable) != 2)
continue;
}
}
fprintf(pStreamsFile, "{0, %d, 0, 0, %s, %s, %s},\n", nRNGUsage, szColumn, szTable, szDuplicate);
if (strcmp(szLastTable, szTable))
{
if (strlen(szLastTable))
fprintf(pColumnsFile, "#define %s_END\t%d\n", szLastTable, nColumnCount - 1);
fprintf(pColumnsFile, "#define %s_START\t%d\n", szTable, nColumnCount);
fprintf(pTablesFile, "#define %s\t%d\n", szTable, nTableCount++);
strcpy(szLastTable, szTable);
}
fprintf(pColumnsFile, "#define %s\t%d\n", szColumn, nColumnCount++);
}
/* close out the files */
fprintf(pStreamsFile, "{-1, -1, -1, -1, -1, -1, -1}\n};\n");
fprintf(pStreamsFile, "#endif\n");
fprintf(pColumnsFile, "#define %s_END\t%d\n", szLastTable, nColumnCount - 1);
fprintf(pColumnsFile, "#define MAX_COLUMN\t%d\n", nColumnCount - 1);
fprintf(pColumnsFile, "#endif\n");
fprintf(pTablesFile, "#define PSEUDO_TABLE_START\t%d\n", nTableCount);
fprintf(pTablesFile, "/* PSEUDO TABLES from here on; used in hierarchies */\n");
fprintf(pTablesFile, "#define ITEM_BRAND\t%d\n", nTableCount++);
fprintf(pTablesFile, "#define ITEM_CLASS\t%d\n", nTableCount++);
fprintf(pTablesFile, "#define ITEM_CATEGORY\t%d\n", nTableCount++);
fprintf(pTablesFile, "#define DIVISIONS\t%d\n", nTableCount++);
fprintf(pTablesFile, "#define COMPANY\t%d\n", nTableCount++);
fprintf(pTablesFile, "#define CONCURRENT_WEB_SITES\t%d\n", nTableCount++);
fprintf(pTablesFile, "#define ACTIVE_CITIES\t%d\n", nTableCount++);
fprintf(pTablesFile, "#define ACTIVE_COUNTIES\t%d\n", nTableCount++);
fprintf(pTablesFile, "#define ACTIVE_STATES\t%d\n", nTableCount);
fprintf(pTablesFile, "#define MAX_TABLE\t%d\n", nTableCount);
fprintf(pTablesFile, "#endif\n");
/* close the files */
fclose(pStreamsFile);
fclose(pColumnsFile);
fclose(pInputFile);
fclose(pTablesFile);
exit(0);
}