|
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 - downloadIndex: ┃ T e ┃
Length: 7227 (0x1c3b) Types: TextFile Names: »emitcf.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec8/ease/src/emitcf.c«
/* $Header: /usr/src/local/etc/ease/RCS/emitcf.c,v 1.3 85/11/22 20:14:11 jss Exp $ */ /* * emitcf.c -- This file contains routines associated with the writing * and formatting of a translated sendmail configuration file. * * author -- James S. Schoner, Purdue University Computing Center, * West Lafayette, Indiana 47907 * * date -- July 9, 1985 * * Copyright (c) 1985 by Purdue Research Foundation * * All rights reserved. * */ #include <stdio.h> #include "symtab.h" #define REGLINE 60 /* length of output lines which may be continued */ #define MAXLINE 256 /* liberal maximum line length */ extern short Rformat; /* read-format flag for a class */ extern char *MacScan (); extern char MakeMac (); extern void PrintError (), FatalError (), PrintWarning (), ErrorReport (); void PrintDef (); static char ClassCH; /* printable class macro char */ /* * EmitDef () -- Emit a definition line (Ease block definition) in cf * format. * */ void EmitDef (blockdef, targ, defstr1, defstr2) register enum bdefs blockdef; /* type of definition */ register struct he *targ; /* target to be defined */ char *defstr1, *defstr2; /* one or two definition strings */ { /* * This routine is about as pretty as a translated ease file... * Each type of line (Ease block) is handled case by case below. * */ switch (blockdef) { case def_macro: printf ("D%c", MakeMac (targ, ID_MACRO)); PrintDef (def_macro, MacScan (defstr1)); if (ISMACRO(targ->idd)) PrintWarning ("Redefining macro %s.\n", targ->psb); targ->idd |= ID_MACRO; /* signal definition */ break; case def_class: if (Rformat) /* read format */ printf ("F"); else printf ("C"); printf ("%c", ClassCH = MakeMac (targ, ID_CLASS)); if (Rformat) { /* read format */ printf ("%s\n", defstr1); Rformat = FALSE; } else PrintDef (def_class, defstr1); if (ISCLASS(targ->idd)) PrintWarning ("Redefining class %s.\n", targ->psb); targ->idd |= ID_CLASS; /* signal definition */ break; case def_option: printf ("O%c", *defstr1); PrintDef (def_option, defstr2); break; case def_prec: printf ("P%s=%d\n", targ->psb, targ->idval.prec); break; case def_trusted: printf ("T"); PrintDef (def_trusted, defstr1); break; case def_header: printf ("H"); if (defstr1 != NULL) printf ("?%s?", defstr1); PrintDef (def_header, defstr2); break; case def_mailer: if (ISMAILER(targ->idtype)) { if (ISMAILER(targ->idd)) PrintWarning ("Redefining mailer %s.\n", targ->psb); } else if (ISTYPED(targ->idtype)) { PrintError ("Redeclaration of identifier as mailer:", targ->psb); return; } targ->idd |= ID_MAILER; /* signal definition */ printf ("M%s, ", targ->psb); PrintDef (def_mailer, defstr1); break; case def_ruleset: printf ("R"); PrintDef (def_ruleset, defstr1); break; default: FatalError ("Bad case in EmitDef ()", (char *) NULL); } } /* * PrintContinued () -- Print a line definition (buf) by splitting it over * more than one line. The two definition types * accepted for this method of continuation are class * and trusted user lists, indicated in the argument * btype * */ void PrintContinued (btype, buf) enum bdefs btype; /* block (line) type for definition */ register char *buf; /* buffer containing the definition */ { register char *tmp; /* breakpoint search pointer */ register char tc; /* temporary swap byte */ int buflen; /* length of definition buffer */ buflen = strlen (buf); tmp = buf + REGLINE; while ((*--tmp != ' ') && (tmp != buf)) /* look for suitable break */ /* null */ ; if (tmp == buf) { for (tmp = buf + REGLINE; (*tmp != ' ') && (tmp - buf != buflen); tmp++) /* null */ ; if ((tmp - buf) >= MAXLINE) PrintWarning ("Member name may be too long.\n", (char *) NULL); } tc = *tmp; /* swap break char with null char */ *tmp = '\0'; printf ("%s\n", buf); if ((*tmp = tc) == '\0') return; else tmp++; if (btype == def_class) /* start next line */ printf ("C%c", ClassCH); else printf ("T"); if (strlen (tmp) < REGLINE) /* continue the line */ printf ("%s\n", tmp); else PrintContinued (btype, tmp); } /* * PrintDef () -- Handles special cases (like line continuation) when * printing definitions. * */ void PrintDef (btype, dstr) register enum bdefs btype; /* block type (output line type) */ register char *dstr; /* definition string */ { register char *tmp; for (tmp = dstr; *tmp != '\0'; tmp++) /* search for line continuations */ if ((*tmp == '\\') && (*++tmp == '\n')) if (btype != def_header) { ErrorReport ("Non-header string contains line continuation\n"); return; } else break; /* * Perform case by case handling of definition printing. * */ switch (btype) { case def_header : if (*tmp-- == '\n') { *tmp = '\0'; if (tmp - dstr >= MAXLINE) PrintWarning ("Header may be too long.\n", (char *) NULL); printf ("%s\n\t", dstr); tmp += 2; PrintDef (def_header, tmp); } else { if (strlen (dstr) >= MAXLINE) PrintWarning ("Header may be too long.\n", (char *) NULL); printf ("%s\n", dstr); } break; case def_mailer : if (strlen (dstr) >= MAXLINE) PrintWarning ("Mailer definition may be too long.\n", (char *) NULL); printf ("%s\n", dstr); break; case def_ruleset: if (strlen (dstr) >= MAXLINE) PrintWarning ("Rewriting rule may be too long.\n", (char *) NULL); printf ("%s\n", dstr); break; case def_option : if (strlen (dstr) >= MAXLINE) PrintWarning ("Option assignment may be too long.\n", (char *) NULL); printf ("%s\n", dstr); break; case def_macro : if (strlen (dstr) >= MAXLINE) PrintWarning ("Macro assignment may be too long.\n", (char *) NULL); printf ("%s\n", dstr); break; case def_prec : if (strlen (dstr) >= MAXLINE) PrintWarning ("Precedence relation may be too long.\n", (char *) NULL); printf ("%s\n", dstr); break; case def_trusted: case def_class : if (strlen (dstr) < REGLINE) printf ("%s\n", dstr); else /* use line continuation feature */ PrintContinued (btype, dstr); break; default : FatalError ("Invalid case in PrintDef ()", (char *) NULL); } } /* * StartRuleset () -- Prints a ruleset heading for the ruleset identifier * contained in the argument rsid. * */ void StartRuleset (rsid) register struct he *rsid; /* ruleset identifier */ { if (!ISRULESET(rsid->idtype)) if (ISTYPED(rsid->idtype)) PrintError ("Identifier not of ruleset type:", rsid->psb); else PrintError ("Ruleset identifier not bound to a number:", rsid->psb); else { if (ISRULESET(rsid->idd)) PrintWarning ("Redefining ruleset %s.\n", rsid->psb); rsid->idd |= ID_RULESET; printf ("S%s\n", rsid->idval.rsn); } }