ngspice/contrib/mslib/inc_main.c

209 lines
3.8 KiB
C
Raw Normal View History

2000-04-27 22:03:57 +02:00
/*
* MW. Include - main functions
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "datadef.h"
struct LSData *firstLIB;
struct LSData *firstSUB;
struct LSData *firstMOD;
struct LSData *deck;
struct LSData *tmplib;
int bsize, bsizer;
char buf[BSIZE];
int
main(int argc, char *argv[])
{
/*
* Initialize everything
*/
struct LSData *subp, *libp, *modp;
char tch[BSIZE];
int mswritten;
tmplib = LSinsert(NULL, NULL);
deck = LSinsert(NULL, NULL);
*tch = '\0';
mswritten = 0;
switch (argc)
{
case 3:
strcpy(tmplib->name, argv[--argc]);
strcpy(tch, tmplib->name);
case 2:
strcpy(deck->name, argv[--argc]);
if (!(*tch))
{
sprintf(tmplib->name, "%s%s", deck->name, TMPLIBNAME);
strcpy(tch, tmplib->name);
}
break;
case 1:
fprintf(stdout, "Usage: mslib deck [tmplib]\n");
return FAILED;
default:
fprintf(stderr, "mslib: Incorrect parameters count.\n");
return FAILED;
}
/*
* Open deck
*/
if (!(deck->filedes = fopen(deck->name, "r")))
{
sprintf(deck->name, "%s%s", DECKPATH, argv[1]);
sprintf(tmplib->name, "%s%s", DECKPATH, tch);
if (!(deck->filedes = fopen(deck->name, "r")))
{
fprintf(stderr, "mslib: Can't open deck %s.\n", deck->name);
LSclear(deck);
LSclear(tmplib);
return FAILED;
}
}
bsizer = BSIZE;
bsize = bsizer--;
deck->flag = DECK_OPEN;
/*
* Create tmplib and write first line to it
*/
if (!(tmplib->filedes = fopen(tmplib->name, "w")))
{
fprintf(stderr, "mslib: Can't creat tmplib %s.\n", tmplib->name);
LSclear(tmplib);
LSclear(deck);
return FAILED;
}
tmplib->flag = TLIB_OPEN;
fprintf(tmplib->filedes, "%s\n* Tmp library: %s,\n* For deck: %s.\n\n", \
LIBMESSAGE, tmplib->name, deck->name);
firstLIB = LSinsert(NULL, NULL);
firstSUB = LSinsert(NULL, NULL);
firstMOD = LSinsert(NULL, NULL);
/*
* Find commands in deck
*/
readdeck(deck->filedes, firstLIB, firstSUB, firstMOD);
if (firstLIB->flag = IS_LIB)
{
libp = firstLIB->nextLS;
do
{
if (!(libp->filedes = fopen(libp->name, "r")))
{
strcpy(tch, libp->name);
sprintf(libp->name, "%s%s", LIBPATH, tch);
if (!(libp->filedes = fopen(libp->name, "r")))
{
libp->flag = FAILED;
}
}
/*
* Read libraries if everything is OK
*/
if (libp->flag != FAILED)
{
libp->flag = LIB_OPEN;
modp = (firstMOD->flag == IS_MOD) ? firstMOD->nextLS : NULL;
subp = (firstSUB->flag == IS_SUB) ? firstSUB->nextLS : NULL;
mswritten += readlib(libp, tmplib->filedes, subp, modp);
}
libp = libp->nextLS;
}
while (libp);
}
fprintf(stdout, "mslib: Written %d items to tmplib %s.\n", \
mswritten, tmplib->name);
if (libp = firstLIB->nextLS)
{
do
{
if (libp->flag != LIB_OPEN)
fprintf(stderr, " Can't open lib %s.\n", libp->name);
libp = libp->nextLS;
}
while (libp);
}
/*
* Check is models or subckts were find and
* * are not duplicated
*/
if (modp = firstMOD->nextLS)
{
do
{
switch (modp->flag)
{
case DUPLICATE:
fprintf(stderr, " Model duplicated %s.\n", \
modp->name);
break;
default:
fprintf(stderr, " Can't find model %s.\n", \
modp->name);
break;
case FINDED:
}
modp = modp->nextLS;
}
while (modp);
}
if (subp = firstSUB->nextLS)
{
do
{
switch (subp->flag)
{
case DUPLICATE:
fprintf(stderr, " Subckt duplicated %s.\n", \
subp->name);
break;
default:
fprintf(stderr, " Can't find subckt %s.\n", \
subp->name);
break;
case FINDED:
}
subp = subp->nextLS;
}
while (subp);
}
/*
* Clear all data and close files
*/
LSclear(tmplib);
LSclear(deck);
LSclear(firstLIB);
LSclear(firstSUB);
return SUCCESS;
}