/*
 * Copyright 2001 IBM Corp 
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */
#include <stdio.h>
#include <unistd.h>
#include <string.h>

extern long ce_exec_config[];

int main(int argc, char *argv[])
{
	int i, cnt, pos, len;
	unsigned int cksum, val;
	unsigned char *lp;
	unsigned char buf[8192];
	char *varname;
	if (argc != 2)
	{
		fprintf(stderr, "usage: %s name <in-file >out-file\n",
			argv[0]);
		exit(1);
	}

	varname = strrchr(argv[1], '/');
	if (varname)
		varname++;
	else
		varname = argv[1];

	fprintf(stdout, "#\n");
	fprintf(stdout, "# Miscellaneous data structures:\n");
	fprintf(stdout, "# WARNING - this file is automatically generated!\n");
	fprintf(stdout, "#\n");
	fprintf(stdout, "\n");
	fprintf(stdout, "\t.data\n");
	fprintf(stdout, "\t.globl %s_data\n", varname);
	fprintf(stdout, "%s_data:\n", varname);
	pos = 0;
	cksum = 0;
	while ((len = read(0, buf, sizeof(buf))) > 0)
	{
		cnt = 0;
		lp = (unsigned char *)buf;
		len = (len + 3) & ~3;  /* Round up to longwords */
		for (i = 0;  i < len;  i += 4)
		{
			if (cnt == 0)
			{
				fprintf(stdout, "\t.long\t");
			}
			fprintf(stdout, "0x%02X%02X%02X%02X", lp[0], lp[1], lp[2], lp[3]);
			val = *(unsigned long *)lp;
			cksum ^= val;
			lp += 4;
			if (++cnt == 4)
			{
				cnt = 0;
				fprintf(stdout, " # %x \n", pos+i-12);
				fflush(stdout);
			} else
			{
				fprintf(stdout, ",");
			}
		}
		if (cnt)
		{
			fprintf(stdout, "0\n");
		}
		pos += len;
	}
	fprintf(stdout, "\t.globl %s_len\n", varname);
	fprintf(stdout, "%s_len:\t.long\t0x%x\n", varname, pos);
	fflush(stdout);
	fclose(stdout);
	fprintf(stderr, "cksum = %x\n", cksum);
	exit(0);
}

