Modifications on the generics in C file

Adding error output when the compilation fails (fullfilling a user
request)
This commit is contained in:
Frederic Petrot 2002-06-06 15:46:49 +00:00
parent fbb4746fff
commit 0efb10cf0a
3 changed files with 143 additions and 33 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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);