/*
&cstruse
cstr - Produce compilable C STRing from a text file.

Syntax:
        cstr file.str

Where:
   file.str
        is the name of a file containing text.  The filename need not end
        in ".str", but it cannot end in ".c" (since the output would
        destroy the input).

Descriptionn:
        From a text file, cstr produces a C file containing a character
        array named after the input file and initialized with its text.
        If the first line of the text file is of the form:

        &name size

        it will be taken to indicate the name and the dimension (in bytes)
        of the character array.  The "size" specification is optional.
*/
/* ------------------------------------------------------------------ */
/*  cstr - produce compilable C STRing from a text file.              */
/*                                                                    */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINE   512                /*  largest input line expected */
#define MAX_NAME   128                /*  largest file name expected  */

main(argc,argv)
char    **argv;
{
    int   i;
    FILE  *fin, *fout;
    char  foutname[MAX_NAME+1];
    char  sname[MAX_NAME+1];

    fprintf(stderr, "cstr 1.0\n");
    if(argc < 2)                      /*  if not command-line args... */
        usage();
    for(i = 1; i < argc; ++i)  {      /*  for each input file...      */
        if( !makeout(argv[i], foutname, sname))  {
            printf("%s: Input filename ('%s') must not end in '.c'\n",
                    argv[0],argv[i]);
            exit(EXIT_FAILURE);         /*  defined in <stdlib.h>     */
        }
        fin  = fopen(argv[i], "r");
        if(!fin) {
            printf("%s: Can't open '%s" for input\n", argv[0],argv[i]);
            exit(EXIT_FAILURE);
        }
        fout = fopen(foutname, "w");
        if(!fout) {
            printf("%s: Can't open '%s' for output\n", argv[0],argv[i]);
            exit(EXIT_FAILURE);
        }
        cstr(fin, fout, sname);
        fclose(fin);
        fclose(fout);
    }
}
/*  usage - display correct usage and exit.  */

usage()
{
/*  extern char cstruse[]; */

/*  fputs(cstruse,stderr); */
    exit(EXIT_FAILURE);               /*  defined in <stdlib.h>  */
}

/*  makeout - make output name from input name.  */

static
int     makeout(in, out, sname)
char    *in, *out, *sname;
{
    char  c;
    char  *t = "c";
    while((*sname++=*out++=c=*in++) != '\0')
        if(c == '.')
            if (!strcmp(*in, *t))
                return(0);
            else
                break;
    if(c != '.')  {         /*  output has '.', even if input didn't. */
        *out++ = '.';
        *sname = '\0';
    }
    else
        *--sname = '\0';
    *out++ = 'c';
    *out++ = '\0';
    return(1);
}

/*  cstr - do the actual work...  */

static
int     cstr(fin, fout, sname)
FILE    *fin, *fout;
char    *sname;
{
    char    line[MAX_LINE+1], *maxdimp;
    int     maxdim = 0, c, i;

    if((c = fgetc(fin)) == '&')  {    /*  if input specifies name and */
                                      /*    dimension...              */
        fgets(line, MAX_LINE, fin);
        maxdimp = strpbrk(line, "\t\n");
        if(*maxdimp)
            *maxdimp++ = '\0';
        maxdim  =  atoi(maxdimp);
    }
    else  {
        ungetc(c, fin);
        strcpy(line, sname);
    }
    fprintf(fout, "char %s[", line);
    if(maxdim)
        fprintf(fout, "%d", maxdim);
    fprintf(fout, "]  =\n      {");

    for(i = 0; (c=fetc(fin)) !=EOF; ++i)   {
        if(!(i%12))
            fprintf(fout,"\n  ");
        if(c == '\n')
            fprintf(fout," '\\n',");
        else if(c == '\t')
            fprintf(fout," '\\t',");
        else if(c == '\\')
            fprintf(fout, " '\\\\',");
        else
            fprintf(fout,"  '%c',",c);
    }
    if (!(i%12)  {
        fprintf(fout, "\n  ");
        fprintf(fout,"   '\\0'\n   };\n");
    }
    else
        fprintf(fout, "  '\\0'\n  };\n");
    fprintf(stderr, "Did %d chars\n", i);
}
/* ------------------------------------------------------------------ */
/* ------------------------------------------------------------------ */








