From 0efb10cf0ac23854444ffbb1cd9f2afb922cafc5 Mon Sep 17 00:00:00 2001 From: Frederic Petrot Date: Thu, 6 Jun 2002 15:46:49 +0000 Subject: [PATCH] Modifications on the generics in C file Adding error output when the compilation fails (fullfilling a user request) --- alliance/src/genlib/src/genlib.c | 158 ++++++++++++++++++++++++------ alliance/src/genlib/src/genlib.sh | 4 +- alliance/src/genlib/src/mgn.h | 14 ++- 3 files changed, 143 insertions(+), 33 deletions(-) diff --git a/alliance/src/genlib/src/genlib.c b/alliance/src/genlib/src/genlib.c index 4478bad3..f085d0fe 100644 --- a/alliance/src/genlib/src/genlib.c +++ b/alliance/src/genlib/src/genlib.c @@ -71,7 +71,7 @@ #include "mbkgen.h" #define __GENLIB__ #include "mgn.h" -static char rcsid[] = "$Id"; +static char rcsid[] = "$Id: genlib.c,v 1.6 2002/06/06 15:46:48 fred Exp $"; /******************************************************************************* * global variables used in genlib * @@ -2796,7 +2796,20 @@ lofig_list *ptfig; } ptchain = addchain(ptchain, (void *)ptsig); } - (void)addloins(WORK_LOFIG, insname, ptfig, ptchain); + { + loins_list *ptins; + ptype_list *pt; + + ptins = addloins(WORK_LOFIG, insname, ptfig, ptchain); + pt = getptype(ptfig->USER, LOGEN); + if (pt) { + logen_list *g; + ptins->USER = addptype(ptins->USER, LOGEN, NULL); + for (g = pt->DATA; g; g = g->NEXT) { + ptins->USER->DATA = (ptype_list *)duplogenlist(g, ptins->USER->DATA, g->NAME); + } + } + } va_end(arg); } @@ -3045,7 +3058,20 @@ chain_list *ptchain = NULL; addchain((chain_list *)NULL, (void *)signame), 'I'); ptchain = addchain(ptchain, (void *)ptsig); } - (void)addloins(WORK_LOFIG, insname, ptfig, ptchain); + { + loins_list *ptins; + ptype_list *pt; + + ptins = addloins(WORK_LOFIG, insname, ptfig, ptchain); + pt = getptype(ptfig->USER, LOGEN); + if (pt) { + logen_list *g; + ptins->USER = addptype(ptins->USER, LOGEN, NULL); + for (g = pt->DATA; g; g = g->NEXT) { + ptins->USER->DATA = (ptype_list *)duplogenlist(g, ptins->USER->DATA, g->NAME); + } + } + } va_end(arg); } @@ -3443,25 +3469,99 @@ chain_list *chain; (void)dellosig(WORK_LOFIG, ls2->INDEX); } +/******************************************************************************* +* function LOGENLIST * +*******************************************************************************/ +logen_list *genLOGENLIST(int type, ...) +{ +va_list ap; +int v; +char *s, *t; +logen_list *g = NULL, *x = NULL; + + va_start(ap, type); + while (type != GENTYPE_EMPTY) { + g = addlogen(g, NULL); + g->TYPE = type; + switch (type) { + case GENTYPE_VAL: + case GENTYPE_HEX: + g->VALUE.VAL = va_arg(ap, long); + break; + case GENTYPE_TEXT: + s = va_arg(ap, char *); + t = malloc((strlen(s) + 3) * sizeof(char)); + sprintf(t, "\"%s\"", s); + g->VALUE.TEXT = namealloc(t); + free(t); + break; + case GENTYPE_BIT: + g->VALUE.CHAR = '0' + (va_arg(ap, long)&1); + break; + case GENTYPE_LIST: + g->VALUE.LIST = va_arg(ap, logen_list *); + break; + default: + (void)fflush(stdout); + (void)fputs("*** genlib error ***\n", stderr); + (void)fprintf(stderr, "Illegal LOGENLIST: unsupported generic type\n"); + EXIT(1); + } + type = va_arg(ap, int); + } + return reverse((chain_list *)g); +} + /******************************************************************************* * function LOGEN * *******************************************************************************/ -void genLOGEN(char *name, int type) +void genLOGEN(char *name, int type, ...) { ptype_list *p = getptype(WORK_LOFIG->USER, LOGEN); +va_list ap; /* We have a single argument, but of unknown type yet! */ +char *s, *t; +logen_list *g; if (!p) p = WORK_LOFIG->USER = addptype(WORK_LOFIG->USER, LOGEN, NULL); - p->DATA = addlogen(p->DATA, name); + p->DATA = g = addlogen(p->DATA, name); - if (type != INTEGER_GEN && type != STRING_GEN) { + if (type < 0 && type > GENTYPE_MAX) { (void)fflush(stdout); (void)fputs("*** genlib error ***\n", stderr); (void)fprintf(stderr, "Illegal LOGEN: unsupported generic type\n"); EXIT(1); } - ((logen_list *)p->DATA)->TYPE = type; + g->TYPE = type; + + va_start(ap, type); + switch (type) { + case GENTYPE_VAL: + case GENTYPE_HEX: + g->VALUE.VAL = va_arg(ap, long); + break; + case GENTYPE_TEXT: + s = va_arg(ap, char *); + t = malloc((strlen(s) + 3) * sizeof(char)); + sprintf(t, "\"%s\"", s); + g->VALUE.TEXT = namealloc(t); + free(t); + break; + case GENTYPE_BIT: + g->VALUE.CHAR = '0' + (va_arg(ap, long)&1); + break; + case GENTYPE_LIST: + g->VALUE.LIST = va_arg(ap, logen_list *); + break; + default: + (void)fflush(stdout); + (void)fputs("*** genlib error ***\n", stderr); + (void)fprintf(stderr, "Illegal LOGEN: unsupported generic type\n"); + EXIT(1); + } + va_end(ap); + debuglogen(g, 0); } /******************************************************************************* @@ -3484,8 +3584,7 @@ char *s, *t; EXIT(1); } - f = getlofig(i->FIGNAME, 'P'); - p = getptype(f->USER, LOGEN); + p = getptype(i->USER, LOGEN); if (!p) { (void)fflush(stdout); (void)fputs("*** genlib error ***\n", stderr); @@ -3503,28 +3602,29 @@ char *s, *t; } va_start(ap, name); - p = getptype(i->USER, LOGEN); - if (!p) - p = i->USER = addptype(i->USER, LOGEN, NULL); - p->DATA = addlogen(p->DATA, name); switch (g->TYPE) { - case INTEGER_GEN: - ((logen_list *)p->DATA)->TYPE = INTEGER_GEN; - ((logen_list *)p->DATA)->VALUE.VAL = va_arg(ap, long); - break; - case STRING_GEN: - ((logen_list *)p->DATA)->TYPE = STRING_GEN; - s = va_arg(ap, char *); - t = malloc((strlen(s) + 3) * sizeof(char)); - sprintf(t, "\"%s\"", s); - ((logen_list *)p->DATA)->VALUE.TEXT = namealloc(t); - free(t); - break; + case GENTYPE_VAL: + case GENTYPE_HEX: + g->VALUE.VAL = va_arg(ap, long); + break; + case GENTYPE_TEXT: + s = va_arg(ap, char *); + t = malloc((strlen(s) + 3) * sizeof(char)); + sprintf(t, "\"%s\"", s); + g->VALUE.TEXT = namealloc(t); + free(t); + break; + case GENTYPE_BIT: + g->VALUE.CHAR = '0' + (va_arg(ap, long)&1); + break; + case GENTYPE_LIST: + g->VALUE.LIST = va_arg(ap, logen_list *); + break; default: - (void)fflush(stdout); - (void)fputs("*** genlib error ***\n", stderr); - (void)fprintf(stderr, "Illegal SETLOGEN: unsupported generic type\n"); - EXIT(1); + (void)fflush(stdout); + (void)fputs("*** genlib error ***\n", stderr); + (void)fprintf(stderr, "Illegal SETLOGEN: unsupported generic type\n"); + EXIT(1); } va_end(ap); } diff --git a/alliance/src/genlib/src/genlib.sh b/alliance/src/genlib/src/genlib.sh index 66a2d387..f562ad20 100755 --- a/alliance/src/genlib/src/genlib.sh +++ b/alliance/src/genlib/src/genlib.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# $Id: genlib.sh,v 1.4 2002/05/28 16:22:13 jpc Exp $ +# $Id: genlib.sh,v 1.5 2002/06/06 15:46:49 fred Exp $ # # /------------------------------------------------------------------\ # | | @@ -310,6 +310,8 @@ EOF if [ $KEEP_MAKEFILE != "y" ]; then rm -f $MAKEFILE; fi echo "genlib:error: Compilation failed." + echo "error messages:" + cat $CSOURCE.grr exit $exit_code else diff --git a/alliance/src/genlib/src/mgn.h b/alliance/src/genlib/src/mgn.h index 51ee9983..be1bf5cc 100644 --- a/alliance/src/genlib/src/mgn.h +++ b/alliance/src/genlib/src/mgn.h @@ -108,7 +108,7 @@ extern void genSC_TOP(); extern void genSC_BOTTOM(); extern void genSC_CHANNEL(); extern void genSC_CON_CHANNEL(); -extern void genLOGEN(); +extern void genLOGEN(char *, int, ...);; extern void genSETLOGEN(char *, char *, ...); /******************************************************************************* * name forming functions, for both views * @@ -358,8 +358,15 @@ extern char *genNAME(char *, ...); /* Quick and dirty hack as required */ #define LOGEN 21 -#define INTEGER_GEN 2 -#define STRING_GEN 4 +#define GENTYPE_EMPTY 0 +#define GENTYPE_BIT 1 +#define GENTYPE_VAL 2 +#define GENTYPE_ARG 3 +#define GENTYPE_TEXT 4 +#define GENTYPE_LIST 5 +#define GENTYPE_HEX 6 +#define GENTYPE_MAX 6 + typedef struct logen { @@ -378,6 +385,7 @@ typedef struct logen extern logen_list *addlogen(logen_list *,char *); extern logen_list *getlogen(logen_list *,char *); extern logen_list *duplogen(logen_list *,logen_list *, char *); +extern logen_list *duplogenlist(logen_list *,logen_list *, char *); extern logen_list *chklogen(logen_list *,logen_list *, char *, char *); extern logen_list *dellogen(logen_list *, char *name);