Adding handling of simple generics in genlib

This commit is contained in:
Frederic Petrot 2002-04-16 07:18:31 +00:00
parent 373a87ee1c
commit 8533d03c59
3 changed files with 95 additions and 41 deletions

View File

@ -96,10 +96,7 @@ int bus_decod();
* physical user functions * * physical user functions *
*******************************************************************************/ *******************************************************************************/
static chain_list *g_addphvia(p, type, x, y, dx, dy, name) static chain_list *g_addphvia( phfig_list *p, char type, long x, long y, long dx, long dy, char *name)
phfig_list *p;
char type, *name;
long x, y, dx, dy;
{ {
chain_list *c = NULL; chain_list *c = NULL;
@ -2716,7 +2713,7 @@ va_list arg;
char *figname, *signame; char *figname, *signame;
lofig_list *ptfig; lofig_list *ptfig;
va_start(arg, instance); va_start(arg, insname);
figname = namealloc(va_arg(arg, char *)); figname = namealloc(va_arg(arg, char *));
if (WORK_LOFIG == NULL) { if (WORK_LOFIG == NULL) {
(void)fflush(stdout); (void)fflush(stdout);
@ -3454,9 +3451,17 @@ void genLOGEN(char *name, int type)
ptype_list *p = getptype(WORK_LOFIG->USER, LOGEN); ptype_list *p = getptype(WORK_LOFIG->USER, LOGEN);
if (!p) if (!p)
p = addptype(WORK_LOFIG->USER, LOGEN, NULL); p = WORK_LOFIG->USER = addptype(WORK_LOFIG->USER, LOGEN, NULL);
p->DATA = addlogen(name, type); p->DATA = addlogen(p->DATA, name);
if (type != INTEGER_GEN && type != STRING_GEN) {
(void)fflush(stdout);
(void)fputs("*** genlib error ***\n", stderr);
(void)fprintf(stderr, "Illegal SETLOGEN: unsupported generic type\n");
EXIT(1);
}
((logen_list *)p->DATA)->TYPE = type;
} }
/******************************************************************************* /*******************************************************************************
@ -3465,16 +3470,63 @@ ptype_list *p = getptype(WORK_LOFIG->USER, LOGEN);
void genSETLOGEN(char *instance, char *name, ...) void genSETLOGEN(char *instance, char *name, ...)
{ {
va_list ap; /* We have a single argument, but of unknown type yet! */ va_list ap; /* We have a single argument, but of unknown type yet! */
lofig_list *f = getlofig(); loins_list *i = getloins(WORK_LOFIG, instance);
lofig_list *f;
ptype_list *p; ptype_list *p;
logen_list *g;
char *s, *t;
if (!i) {
(void)fflush(stdout);
(void)fputs("*** genlib error ***\n", stderr);
(void)fprintf(stderr, "Illegal SETLOGEN : no instance called '%s' \n",
instance);
EXIT(1);
}
f = getlofig(i->FIGNAME, 'P');
p = getptype(f->USER, LOGEN);
if (!p) {
(void)fflush(stdout);
(void)fputs("*** genlib error ***\n", stderr);
(void)fprintf(stderr, "Illegal SETLOGEN : no logen in model '%s' \n",
i->FIGNAME);
EXIT(1);
}
g = getlogen(p->DATA, name);
if (!g) {
(void)fflush(stdout);
(void)fputs("*** genlib error ***\n", stderr);
(void)fprintf(stderr, "Illegal SETLOGEN : no generic called '%s' \n",
name);
EXIT(1);
}
va_start(ap, name); va_start(ap, name);
p = getptype(i->USER, LOGEN);
ptype_list *p = getptype(WORK_LOFIG->USER, LOGEN);
if (!p) if (!p)
p = addptype(WORK_LOFIG->USER, LOGEN, NULL); p = i->USER = addptype(i->USER, LOGEN, NULL);
p->DATA = addlogen(p->DATA, name);
p->DATA = addlogen(name, type); 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;
default:
(void)fflush(stdout);
(void)fputs("*** genlib error ***\n", stderr);
(void)fprintf(stderr, "Illegal SETLOGEN: unsupported generic type\n");
EXIT(1);
}
va_end(ap);
} }
/******************************************************************************* /*******************************************************************************
@ -3539,11 +3591,10 @@ losig_list *s;
/******************************************************************************* /*******************************************************************************
* function UNFLATTEN_LOFIG * * function UNFLATTEN_LOFIG *
*******************************************************************************/ *******************************************************************************/
void genUNFLATTEN_LOFIG(va_alist) void genUNFLATTEN_LOFIG(char *modelname, ...)
va_dcl
{ {
va_list instancelist; va_list instancelist;
char *modelname, *instancename, *iname; char *instancename, *iname;
chain_list *ilist = NULL; chain_list *ilist = NULL;
if (WORK_LOFIG == NULL) { if (WORK_LOFIG == NULL) {
@ -3552,8 +3603,8 @@ chain_list *ilist = NULL;
(void)fputs("Illegal UNFLATTEN_LOFIG : missing DEF_LOFIG\n", stderr); (void)fputs("Illegal UNFLATTEN_LOFIG : missing DEF_LOFIG\n", stderr);
EXIT(1); EXIT(1);
} }
va_start(instancelist); va_start(instancelist, modelname);
if ((modelname = va_arg(instancelist, char *)) == NULL) { if (modelname == NULL) {
(void)fflush(stdout); (void)fflush(stdout);
(void)fputs("*** genlib error ***\n", stderr); (void)fputs("*** genlib error ***\n", stderr);
(void)fputs("Illegal UNFLATTEN_LOFIG : missing arguments\n", stderr); (void)fputs("Illegal UNFLATTEN_LOFIG : missing arguments\n", stderr);
@ -3913,17 +3964,15 @@ chain_list *c, *loname = NULL, *phname = NULL;
/******************************************************************************* /*******************************************************************************
* function NAME * * function NAME *
*******************************************************************************/ *******************************************************************************/
char *genNAME(va_alist) char *genNAME(char *p, ...)
va_dcl
{ {
va_list stack; va_list stack;
char *ret, *res, *p; char *ret, *res;
long strsize = 0; long strsize = 0;
char piece[BUFSIZ], *s; char piece[BUFSIZ], *s;
long d; long d;
va_start(stack); va_start(stack, p);
p = va_arg(stack, char *);
ret = res = (char *)mbkalloc(BUFSIZ); ret = res = (char *)mbkalloc(BUFSIZ);
while (*p != '\0') { while (*p != '\0') {
if (*p != '%') { if (*p != '%') {

View File

@ -21,7 +21,7 @@
# with the GNU C Library; see the file COPYING. If not, write to the Free # with the GNU C Library; see the file COPYING. If not, write to the Free
# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
# #
# $Id: genlib.sh,v 1.1 2002/03/08 14:08:11 fred Exp $ # $Id: genlib.sh,v 1.2 2002/04/16 07:18:31 fred Exp $
help() { help() {
echo "Syntax: `basename $0` [-vk] source-file (without extension)" echo "Syntax: `basename $0` [-vk] source-file (without extension)"
@ -65,7 +65,13 @@ help() {
done done
trap "rm -f ./*.$$; exit 1" 1 2 3 6 trap "rm -f ./*.$$; exit 1" 1 2 3 6
alcbanner "GenLib" "3.3" "Procedural Generation Language" "1991" ALLIANCE_LIB=${ALLIANCE_TOP}/lib
ALLIANCE_INCLUDE=${ALLIANCE_TOP}/include
ALLIANCE_BIN=${ALLIANCE_TOP}/bin
export ALLIANCE_LIB ALLIANCE_INCLUDE ALLIANCE_BIN
${ALLIANCE_BIN}/alcbanner "GenLib" "3.3" "Procedural Generation Language" "1991"
if [ -z "$name" ] ; then if [ -z "$name" ] ; then
help help
@ -74,6 +80,8 @@ help() {
echo "There seems no to be a file called $name.c" echo "There seems no to be a file called $name.c"
help help
fi fi
rm -f $name > /dev/null 2>&1
if [ $talk -eq 1 ]; then if [ $talk -eq 1 ]; then
echo "Generating the Makefile"; echo "Generating the Makefile";
@ -84,21 +92,17 @@ help() {
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Development hacks. # Development hacks.
if [ $devel -eq 1 ]; then if [ $devel -eq 1 ]; then
ALLIANCE_INSTALL_DIR="__ALLIANCE_INSTALL_DIR__" ALLIANCE_INSTALL_DIR="__ALLIANCE_INSTALL_DIR__"
ALLIANCE_DEVEL_INCLUDE="-I${ALLIANCE_INSTALL_DIR}/include" ALLIANCE_DEVEL_INCLUDE="-I${ALLIANCE_INSTALL_DIR}/include"
ALLIANCE_DEVEL_LIB="-L${ALLIANCE_INSTALL_DIR}/lib" ALLIANCE_DEVEL_LIB="-L${ALLIANCE_INSTALL_DIR}/lib"
ALLIANCE_LIB=${ALLIANCE_TOP}/lib export ALLIANCE_INSTALL_DIR ALLIANCE_DEVEL_INCLUDE ALLIANCE_DEVEL_LIB
ALLIANCE_INCLUDE=${ALLIANCE_TOP}/include fi
fi
makefile="Makefile.$$" makefile="Makefile.$$"
echo 'include $(ALLIANCE_TOP)/etc/libraries.mk' > $makefile
echo 'include $(ALLIANCE_TOP)/etc/$(ALLIANCE_OS).mk' >> $makefile
echo 'ALLIANCE_LIBRARY = '${ALLIANCE_DEVEL_LIB}' -L$(ALLIANCE_LIB) \ echo 'ALLIANCE_LIBRARY = '${ALLIANCE_DEVEL_LIB}' -L$(ALLIANCE_LIB) \
-lMgn -lMlu -lMpu -lMcp -lMap -lMmg -lMcl -lMgl \ -lMgn -lMlu -lMpu -lMcp -lMap -lMmg -lMcl -lMgl \
-lMal -lMvl -lMel -lMsl -lMhl -lMlo -lMph -lMut -lRcn' >> $makefile -lMal -lMvg -lMel -lMsl -lMhl -lMlo -lMph -lMut -lRcn' >> $makefile
echo "ALLIANCE_INC = ${ALLIANCE_DEVEL_INCLUDE} -I\$(ALLIANCE_INCLUDE)" >> $makefile echo "ALLIANCE_INC = ${ALLIANCE_DEVEL_INCLUDE} -I\$(ALLIANCE_INCLUDE)" >> $makefile
echo "$name : $name.c" >> $makefile echo "$name : $name.c" >> $makefile
@ -115,7 +119,8 @@ help() {
if [ ! $? -eq 0 ]; then if [ ! $? -eq 0 ]; then
echo "Compilation failed!" echo "Compilation failed!"
cat $name.grr cat $name.grr
exit 1 rm $makefile
exit 1
fi fi
if [ $talk -eq 1 ] ; then if [ $talk -eq 1 ] ; then

View File

@ -91,8 +91,8 @@ extern void genOUTLINE();
extern void genDEF_LOFIG(); extern void genDEF_LOFIG();
extern void genLOAD_LOFIG(); extern void genLOAD_LOFIG();
extern void genSAVE_LOFIG(); extern void genSAVE_LOFIG();
extern void genLOINS(); extern void genLOINS(char *, ...);
extern void genLOINSE(); extern void genLOINSE(char *, ...);
extern void genLOINSA(); extern void genLOINSA();
extern void genLOTRS(); extern void genLOTRS();
extern void genLOCON(); extern void genLOCON();
@ -109,13 +109,13 @@ extern void genSC_BOTTOM();
extern void genSC_CHANNEL(); extern void genSC_CHANNEL();
extern void genSC_CON_CHANNEL(); extern void genSC_CON_CHANNEL();
extern void genLOGEN(); extern void genLOGEN();
extern void genSETLOGEN(); extern void genSETLOGEN(char *, char *, ...);
/******************************************************************************* /*******************************************************************************
* name forming functions, for both views * * name forming functions, for both views *
*******************************************************************************/ *******************************************************************************/
extern char *genBUS(); extern char *genBUS();
extern char *genELM(); extern char *genELM();
extern char *genNAME(); extern char *genNAME(char *, ...);
/******************************************************************************* /*******************************************************************************
* macro definitions for allowed stdlib functions * * macro definitions for allowed stdlib functions *