DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T f

⟦62dfd3d48⟧ TextFile

    Length: 6199 (0x1837)
    Types: TextFile
    Names: »fixwrites.c«

Derivation

└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
    └─⟦this⟧ »./tex82/web2cdir/fixwrites.c« 

TextFile

/*
 * This program converts the pascal-type write/writeln's into fprintf's
 * or putc's.
 *
 * Tim Morgan   October 10, 1987
 */

#include <stdio.h>
#include "site.h"

#ifdef	SYSV
#define	index	strchr
#endif

#define	TRUE	1
#define	FALSE	0

char buf[BUFSIZ], filename[100], *file, *argp, args[100], *as, *cmd;
int tex = FALSE;

extern char *index(), *strcpy();

char *insert_long(cp)
char *cp;
{
    char tbuf[BUFSIZ];
    register int i;

    for (i=0; &buf[i] < cp; ++i)
	tbuf[i] = buf[i];
    (void) strcpy(&tbuf[i], "(long)");
    (void) strcpy(&tbuf[i+6], cp);
    (void) strcpy(buf, tbuf);
    return(cp+6);
}

void join(cp)
char *cp;
{
    char temp[BUFSIZ], *tp;

    if (!gets(temp)) return;
    *cp++ = ' ';
    for (tp=temp; *tp == ' '; ++tp);
    (void) strcpy(cp, tp);
}

void do_blanks(indent)
int indent;
{
    register int i;

    for (i=0; i<indent/8; i++)
	(void) putchar('\t');
    indent %= 8;
    for (i=0; i<indent; i++)
	(void) putchar(' ');
}

/*
 * Return true if we have a whole write/writeln statement.  We determine
 * this by matching parens, ignoring those within strings.
 */
whole(buf)
char *buf;
{
    register char *cp;
    register int depth=0;

    cp = buf;
    while (cp && *cp) {
	switch (*cp) {
	case '(':
		++depth;
		break;
	case ')':
		--depth;
		break;
	case '"':
		for (++cp; cp && *cp && *cp != '"'; ++cp)
			if (*cp == '\\') ++cp;
		break;
	case '\'':
		++cp;
		if (*cp == '\\') ++cp;
		++cp;
		break;
	}
	++cp;
    }
    return(depth <= 0);
}

/* Skips to the next , or ), skipping over balanced paren pairs */
char *skip_balanced(cp)
char *cp;
{
    register int depth = 0;

    while (depth > 0 || (*cp != ',' && *cp != ')')) {
	switch (*cp) {
	case '(':
	    ++depth;
	    break;
	case ')':
	    --depth;
	    break;
	}
	++cp;
    }
    return(cp);
}

/* Return true if c appears, except inside a quoted string */
bare(cp, c)
char *cp, c;
{
    for (; *cp && *cp != c; ++cp) {
	if (*cp == '"') {
	    ++cp;	/* Skip over initial quotation mark */
	    while (*cp && *cp != '"') { /* skip to closing double quote */
		if (*cp == '\\') ++cp;
		++cp;
	    }
	}
	else if (*cp == '\'') {
	    ++cp;	/* Skip to contained char */
	    if (*cp == '\'') ++cp;	/* if backslashed, it's double */
	    ++cp;	/* Skip to closing single-quote mark */
	}
    }
    return(*cp);
}

main(argc, argv)
char *argv[];
{
    register char *cp;
    int blanks_done, indent, i;

    for (i=1; i<argc; i++) switch (argv[i][1]) {
    case 't':
	tex = TRUE;
	break;
    default:
	(void) fprintf(stderr, "Unknown flag %s\n", argv[i]);
	exit(1);
    }

    while (gets(buf)) {
	blanks_done = FALSE;
	for (cp=buf; *cp; ++cp);
	while (*--cp == ' ');
	while (*cp == '.') {
	    join(cp+1);
	    while (*cp) ++cp;
	    while (*--cp == ' ');
	}
	for (cp=buf, indent=0; *cp == ' ' || *cp == '\t'; ++cp) {
		if (*cp == ' ') indent++;
		else indent += 8;
	}
	if (!*cp) {	/* All blanks, possibly with "{" */
	    (void) puts(buf);
	    continue;
	}
	if (*cp == '{') {
	    do_blanks(indent);
	    (void) putchar('{');
	    ++cp;
	    while (*cp == ' ' || *cp == '\t') ++cp;
	    blanks_done = TRUE;
	    if (!*cp) {
		(void) putchar('\n');
		continue;
	    }
	}
	if (!blanks_done) do_blanks(indent);
	if (strncmp(cp, "read ( input", 12) == 0) {
	    char variable_name[20];
	    if (sscanf(cp, "read ( input , %s )", variable_name) != 1)
		(void) fprintf(stderr, "sscanf failed\n"), exit(1);
	    (void) printf("%s = getint();\n", variable_name);
	    continue;
	}
	if (strncmp(cp, "lab", 3) == 0 && index(cp, ':')) {
	    do {
		(void) putchar(*cp);
	    } while (*cp++ != ':');
	    while (*cp == ' ') ++cp;
	    (void) putchar(' ');
	}
	if (strncmp(cp, "else write", 10) == 0) {
	    (void) puts("else");
	    do_blanks(indent);
	    cp += 5;
	    while (*cp == ' ') ++cp;
	}
	if (bare(cp, '{')) {
	    while (*cp != '{') {
		(void) putchar(*cp);
		++cp;
	    }
	    ++cp;
	    (void) puts("{");
	    indent += 4;
	    do_blanks(indent);
	    while (*cp == ' ') ++cp;
	}
	if (strncmp(cp, "write (", 7) && strncmp(cp, "writeln (", 9)) {
	    /* if not a write/writeln, just copy it to stdout and continue */
	    (void) puts(cp);
	    continue;
	}
	cmd = cp;
	while (!whole(buf))	/* Make sure we have whole stmt */
	    (void) gets(&buf[strlen(buf)]);
	while (*cp != '(') ++cp;
	++cp;
	while (*(cp+1) == ' ') ++cp;
	if (*(cp+1) == '"' || *(cp+1) == '\'' ||
	  strncmp(cp+1, "buffer", 6) == 0 ||
	  strncmp(cp+1, "dig", 3) == 0 ||
	  strncmp(cp+1, "xchr", 4) == 0 ||
	  strncmp(cp+1, "k ,", 3) == 0 ||
	  strncmp(cp+1, "s ,", 3) == 0)
	    (void) strcpy(filename, "stdout");
	else {
	    file = filename;
	    while (*cp != ',' && *cp != ')')
		*file++ = *cp++;
	    *file = '\0';
	}
	if (*cp == ')') {
	    (void) printf("(void) putc('\\n', %s);\n", filename);
	    continue;
	}
	argp = ++cp;
	as = args;
	while (*cp==' ') ++cp;
	while (*cp != ')') {
	    if (*cp == '\'' || strncmp(cp, "xchr", 4) == 0
	      || strncmp(cp, "ASCII04", 7) == 0
	      || strncmp(cp, "ASCII1", 6) == 0
	      || strncmp(cp, "nameoffile", 10) == 0
	      || strncmp(cp, "months", 6) == 0) {
		*as++ = '%';
		*as++ = 'c';
		if (tex && strncmp(cp, "xchr", 4) == 0) {
		    *cp = 'X';
		    cp = index(cp, '[');
		    *cp = '(';
		    cp = index(cp, ']');
		    *cp++ = ')';
		}
		else if (*cp == '\'')
			cp += 2;
	    }
	    else if (*cp == '"') {
		*as++ = '%';
		*as++ = 's';
		while (*++cp != '"') /* skip to end of string */
		    if (*cp == '\\') ++cp;	/* allow \" in string */
	    }
	    else {
		*as++ = '%';
		*as++ = 'l';
		*as++ = 'd';
		cp = insert_long(cp);
		cp = skip_balanced(cp);/* It's a numeric expression */
	    }
	    while (*cp != ',' && *cp != ')') ++cp;
	    while (*cp == ',' || *cp == ' ') ++cp;
	}
	if (strncmp(cmd, "writeln", 7) == 0) {
	    *as++ = '\\';
	    *as++ = 'n';
	}
	*as = '\0';
	if (strcmp(args, "%c") == 0) {
	    for (as = argp; *as; ++as);
	    while (*--as != ')');
	    *as = '\0';
	    (void) printf("(void) putc(%s, %s);\n", argp, filename);
	} else if (strcmp(args, "%s") == 0) {
	    (void) printf("(void) Fputs(%s, %s\n", filename, argp);
	} else {
	    (void) printf("(void) fprintf(%s, \"%s\", %s\n",
			  filename, args, argp);
	}
    }
    exit(0);
}