/* $Id$
 *
 * Generate array-of-const-string from text file.
 *
 *  Copyright (C) 2006  Peter Johnson
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINE	1024

int
main(int argc, char *argv[])
{
    FILE *in, *out;
    int i;
    char *str;
    char *strp;
    char *charp;
    size_t len;

    if (argc < 4) {
	fprintf(stderr, "Usage: %s <string> <outfile> <file> [<file> ...]\n",
		argv[0]);
	return EXIT_FAILURE;
    }

    out = fopen(argv[2], "wt");

    if (!out) {
	fprintf(stderr, "Could not open `%s'.\n", argv[2]);
	return EXIT_FAILURE;
    }

    str = malloc(MAXLINE);

    fprintf(out, "/* This file auto-generated from %s by genstring.c"
		 " - don't edit it */\n\n"
		 "static const char *%s[] = {\n", argv[3], argv[1]);

    for (i=3; i<argc; i++) {
	in = fopen(argv[i], "rt");
	if (!in) {
	    fprintf(stderr, "Could not open `%s'.\n", argv[i]);
	    fclose(out);
	    remove(argv[2]);
	    return EXIT_FAILURE;
	}

	while (fgets(str, MAXLINE, in)) {
	    strp = str;

	    /* strip off trailing whitespace */
	    len = strlen(strp);
	    while (len > 0 && (strp[len-1] == ' ' || strp[len-1] == '\t' ||
			       strp[len-1] == '\n')) {
		strp[len-1] = '\0';
		len--;
	    }

	    /* output as string to output file */
	    fprintf(out, "    \"");
	    while (*strp != '\0') {
		if (*strp == '\\' || *strp == '"')
		    fputc('\\', out);
		fputc(*strp, out);
		strp++;
	    }
	    fprintf(out, "\",\n");
	}

	fclose(in);
    }

    fprintf(out, "};\n");
    fclose(out);

    free(str);

    return EXIT_SUCCESS;
}
