ftp.nice.ch/pub/next/unix/developer/pcn.2.0.s.tar.gz#/contrib/utils/make-states/make-states.c

This is make-states.c in view mode; [Download] [Up]

#include <pwd.h>
#include "regexp.h"
#include <stdio.h>
#include <time.h>

#ifndef DONT_INCLUDE_STRING
#include <string.h>
#endif
#ifdef INCLUDE_STRINGS
#include <strings.h>
#endif

#ifdef STRCHR_TO_INDEX
#define strchr(S,C)     index(S,C)
#define strrchr(S,C)    rindex(S,C)
#endif

#if defined(solbourne) || defined(symmetry)
typedef long time_t;
#endif

#include "assoc.h"

#define MatchLength(regexp, which) ((regexp)->endp[which] - (regexp)->startp[which])
#define GetMatch(regexp, which, string) \
    strncpy(string, (regexp)->startp[which], MatchLength(regexp,which)); \
    string[MatchLength(regexp,which)] = '\0';

AssocArray *defs, *state_start, *state_end, *state_color;

FILE *openFile();
void initRegexps();
void go();

char *strdup();

char *progname;
int lineno;

extern int errno;
extern char *sys_errlist[];

regexp *empty, *comment;
regexp *match_name;
regexp *match_state, *match_start, *match_end, *match_color;

char currentState[100];

char *inputFile, *eventFile, *stateFile;
FILE *inputFP, *eventFP, *stateFP;

main(argc, argv)
int argc;
char **argv;
{
    progname = argv[0];
    if (argc != 4)
    {
	fprintf(stderr, "Usage: %s input event-file state-file\n", progname);
	exit(1);
    }
    inputFile = argv[1];
    eventFile = argv[2];
    stateFile = argv[3];
    inputFP = openFile(inputFile, "r");
    eventFP = openFile(eventFile, "w");
    stateFP = openFile(stateFile, "w");
    lineno = 0;

    initRegexps();

    defs = assoc_new();
    state_start = assoc_new();
    state_end = assoc_new();
    state_color = assoc_new();

    go();

    fclose(inputFP);
    fclose(eventFP);
    fclose(stateFP);
}

void go()
{
    char buf[1000], name[100], date[100], *s, string[100];
    int l, nlen;
    int num;
    struct passwd *pw;
    time_t tim;
    struct tm *tm;
    AssocState *state;

    tim = time(0);
    tm = localtime(&tim);
    strcpy(date, asctime(tm));
    if (s = strchr(date, '\n'))
	*s = 0;

    pw = getpwuid(getuid());

    if (s = strchr(pw->pw_gecos, ','))
	*s = 0;
    if (pw)
    {
	fprintf(eventFP, "\n\
/*\n\
 * Event definitions.\n\
 *\n\
 * This file generated automatically by %s from %s\n\
 * by %s (%s) on %s.\n\
 *\n\
 */\n\
\n\
/* Start event definitions */\n\
",
		progname, inputFile, pw->pw_name,
		pw->pw_gecos, date);
    }

    num = 1;

    while (fgets(buf, sizeof(buf), inputFP) != NULL)
    {
	lineno++;
	l = strlen(buf);
	buf[l - 1] = 0;
	l--;

	if (regexec(empty, buf))
	{
#ifdef DEBUG
	    printf("Skipping empty line\n");
#endif
	    continue;
	}
	else if (regexec(comment, buf))
	{
#ifdef DEBUG
	    printf("Skipping comment\n");
#endif
	    continue;
	}
	else if (regexec(match_state, buf))
	{
#ifdef DEBUG
	    printf("Got state and breaking\n");
#endif
	    break;
	}
	else if (regexec(match_name, buf))
	{
	    nlen = match_name->endp[1] - match_name->startp[1];
	    strncpy(name, match_name->startp[1], nlen);
	    name[nlen] = 0;
#ifdef DEBUG
	    printf("Got name '%s'\n", name);
#endif
	    fprintf(eventFP, "#define %s %d\n", name, num);
	    assoc_assign(defs, name, (void *) num);
	    num++;
	}
	else
	{
	    fprintf(stderr, "Syntax error at line %d\n", lineno);
	}
    }

    fprintf(eventFP, "/* End event definitions */\n");

    GetMatch(match_state, 1, currentState);

    while (fgets(buf, sizeof(buf), inputFP) != NULL)
    {
	lineno++;
	l = strlen(buf);
	buf[l - 1] = 0;
	l--;

	if (regexec(empty, buf))
	{
#ifdef DEBUG
	    printf("Skipping empty line\n");
#endif
	    continue;
	}
	else if (regexec(comment, buf))
	{
#ifdef DEBUG
	    printf("Skipping comment\n");
#endif
	    continue;
	}
	else if (regexec(match_state, buf))
	{
	    GetMatch(match_state, 1, currentState);
#ifdef DEBUG
	    printf("got new current state '%s'\n",currentState);
#endif
	}
	else if (regexec(match_start, buf))
	{
	    GetMatch(match_start, 1, string);
#ifdef DEBUG
	    printf("got start '%s'\n", string);
#endif
	    assoc_assign(state_start, currentState, strdup(string));
	}
	else if (regexec(match_end, buf))
	{
	    GetMatch(match_end, 1, string);
#ifdef DEBUG
	    printf("got end '%s'\n", string);
#endif
	    assoc_assign(state_end, currentState, strdup(string));
	}
	else if (regexec(match_color, buf))
	{
	    GetMatch(match_color, 1, string);
#ifdef DEBUG
	    printf("got color '%s'\n", string);
#endif
	    assoc_assign(state_color, currentState, strdup(string));
	}
	else
	{
	    fprintf(stderr, "Syntax error at line %d\n", lineno);
	}
    }

    num = 1;
    for (state = assoc_iter_init(state_start); state;
	 state = assoc_iter_next(state))
    {
	char *stateName, *start, *end, *color;
	int startNum, endNum;

	stateName = assoc_this_key(state);
	start = (char *) assoc_this_value(state);
	end = (char *) assoc_lookup(state_end, stateName);
	color = (char *) assoc_lookup(state_color, stateName);
#ifdef DEBUG
	printf("Got '%s' '%s' '%s' '%s'\n",
	       stateName, start, end, color);
#endif
	startNum = (int) assoc_lookup(defs, start);
	endNum = (int) assoc_lookup(defs, end);

	fprintf(stateFP, "%d %d %d %s %s\n",
		num++, startNum, endNum, color, stateName);
	
    }
}

FILE *openFile(s, m)
char *s, *m;
{
    FILE *fp;

    fp = fopen(s, m);
    if (fp == NULL)
    {
	fprintf(stderr, "Error opening file %s: %s\n",
		s, sys_errlist[errno]);
	exit(1);
    }
    return fp;
}

void initRegexps()
{
    empty = regcomp("^[ \t]*$");
    comment = regcomp("^[ \t]*#");

    match_name = regcomp("^[ \t]*([^ \t]+)[ \t]*$");

    match_state = regcomp("^[ \t]*state[ \t]+([^ \t]+)[ \t]*$");
    match_start= regcomp("^[ \t]*start[ \t]+([^ \t]+)[ \t]*$");
    match_end = regcomp("^[ \t]*end[ \t]+([^ \t]+)[ \t]*$");
    match_color = regcomp("^[ \t]*color[ \t]+([^ \t]+)[ \t]*$");
}
    
int errreport = 0;		/* Report errors via errseen? */
char *errseen = NULL;		/* Error message. */
    
void
regerror(s)
char *s;
{
	if (errreport)
		errseen = s;
	else
		error(s, "");
}

#ifndef ERRAVAIL
error(s1, s2)
char *s1;
char *s2;
{
	fprintf(stderr, "regexp: ");
	fprintf(stderr, s1, s2);
	fprintf(stderr, "\n");
	exit(1);
}
#endif

char *strdup(s)
char *s;
{
    char *rc;

    rc = (char *) malloc(strlen(s) + 1);
    strcpy(rc, s);
    return rc;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.