|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 7480 (0x1d38)
Types: TextFile
Names: »fixwrites.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦c6be2784f⟧ »web2c-5.84b.tar.Z«
└─⟦5800b1b62⟧
└─⟦this⟧ »src-5.84b/web2c/fixwrites.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦63303ae94⟧ »unix3.14/TeX3.14.tar.Z«
└─⟦c58930e5c⟧
└─⟦this⟧ »TeX3.14/web2c/fixwrites.c«
/* fixwrites -- convert Pascal write/writeln's into fprintf's or putc's.
Originally by Tim Morgan, October 10, 1987. */
#include <stdio.h>
#include "site.h"
#include "common.h"
#ifdef ANSI
void exit (int);
void main (int argc, char **argv);
char *insert_long (char *cp);
void join (char *cp);
void do_blanks (int indent);
int whole (char *buf);
char *skip_balanced (char *cp);
int bare (char *cp, char c);
#endif /* ANSI */
char buf[BUFSIZ], filename[FILENAMESIZE], *file, *argp, args[100], *as, *cmd;
int tex = FALSE;
\f
/* Replace the last (should be only) newline in S with a null. */
void
remove_newline (s)
char *s;
{
char *temp = rindex (s, '\n');
if (temp == NULL)
{
fprintf (stderr, "Lost newline somehow.\n");
exit (1);
}
*temp = 0;
}
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 (!fgets (temp, BUFSIZ, stdin))
return;
remove_newline (temp);
*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 (cp)
register char *cp;
{
register int depth = 0;
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 */
int
#ifdef ANSI
bare (char *cp, char c)
#else
bare (cp, c)
char *cp, c;
#endif /* not ANSI */
{
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);
}
void
main (argc, argv)
char *argv[];
{
register char *cp;
int blanks_done, indent, i;
char *program_name = "";
for (i = 1; i < argc; i++)
{
switch (argv[i][1])
{
case 't':
tex = TRUE;
break;
default:
program_name = argv[i];
}
}
while (fgets (buf, BUFSIZ, stdin))
{
remove_newline (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) fgets (&buf[strlen (buf)], BUFSIZ - strlen (buf), stdin);
remove_newline (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, "buffer", 6) == 0
&& (strcmp (program_name, "vptovf") == 0
|| strcmp (program_name, "pltotf") == 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);
}