/* $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;
    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;
}
