inc_inp.c

来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 218 行

C
218
字号
/* * MW. Include for spice  */#include <stdlib.h>#include <stdio.h>#include <sys/types.h>#include <string.h>#include "datadef.h"static int whatdline(char *tbuf, char *firstname);static int whatlline(char *tbuf, char *name);extern int bsizer;extern char buf[BSIZE];/* * Read deck and search for *MOD, *LIB, *SUB commands  */intreaddeck(FILE * tdeck, struct LSData *lib, \		 struct LSData *sub, struct LSData *mod){  char firstname[BSIZE];  char *names, *smlp;  struct LSData *which;  while (fgets(buf, bsizer, tdeck))	{	  smlp = buf;	/*	 * Ignore control chars at the end of line 	 */	  do		{		  smlp++;		}	  while ((!(iscntrl(*smlp))) && (*smlp != '\0'));	  *smlp = '\0';	  switch (whatdline(buf, firstname))		{		case LIBDLINE:		  lib->flag = IS_LIB;		  which = lib;		  break;		case SUBDLINE:		  sub->flag = IS_SUB;		  which = sub;		  break;		case MODDLINE:		  mod->flag = IS_MOD;		  which = mod;		  break;		default:		  which = NULL;		}/* * If we finded something  */	  if (which)		{		  names = buf;		  strsep(&names, " ");		  while (smlp = strsep(&names, " "))			{			  if (*smlp)				{				  which = LSinsert(NULL, which);				  strcpy(which->name, smlp);				}			}		}	}  return ((lib->flag != IS_LIB) && (mod->flag != IS_MOD) \		  &&(sub->flag != IS_SUB)) ? FAILED : SUCCESS;}/* * Read library and write specififed models/subckts to tmplib  */intreadlib(struct LSData *lib, FILE * tlib, \		struct LSData *sub, struct LSData *mod){  char name[BSIZE];  int numi, wflag, nextsub;  numi = 0;  wflag = NOWRITE;  nextsub = 0;      while (fgets(buf, bsizer, lib->filedes))	{/* * Now we must check what line is it and if it should be written to tmplib  */	  switch (whatlline(buf, name))		{		case (MODLLINE):		  if (wflag == WRITESUB)			fputs(buf, tlib);		  else			{			  if (mod)				{				  if (checkname(mod, name))					{					  wflag = WRITEMOD;					  numi++;					  fprintf(tlib, "*  Model: %s, from: %s.\n", \							  name, lib->name);					  fputs(buf, tlib);					}				}			}		  break;		case (SUBLLINE):		  if (sub)			{			    if (wflag==WRITESUB) 				{				/* subckt inside subckt  				    not so funny */				    nextsub++;				    fputs(buf, tlib);				    break;				}    							    if (checkname(sub, name))				{				  wflag = WRITESUB;				  numi++;				  fprintf(tlib, "*  Subckt: %s, from: %s.\n", \						  name, lib->name);				  fputs(buf, tlib);				}			}		  break;		case (NORMLINE):		  if (wflag == WRITEMOD)			{			  wflag = NOWRITE;			  fputs("\n*  End Model.\n\n", tlib);			}		  if (wflag == WRITESUB)			fputs(buf, tlib);		  break;		case (ENDSLLINE):		    if (nextsub)			{			nextsub--;			fputs(buf, tlib);			break;			} else {		    		    if (wflag == WRITESUB)			{			  fprintf(tlib, "%s\n*  End Subckt\n\n", buf);			}		  wflag = NOWRITE;		  break;		  }		case (CONTLLINE):		  if (wflag != NOWRITE)			fputs(buf, tlib);		}	}  return numi;}/* * Check what line in deck it is  */intwhatdline(char *tbuf, char *firstname){  if (sscanf(tbuf, "*LIB %s", firstname) == 1)	return LIBDLINE;  if (sscanf(tbuf, "*SUB %s", firstname) == 1)	return SUBDLINE;  if (sscanf(tbuf, "*MOD %s", firstname) == 1)	return MODDLINE;  return NORMLINE;}/* * Check what line it is. If we have model or subckt line we also read its name   */intwhatlline(char *tbuf, char *name){  if (sscanf(tbuf, ".SUBCKT %s %*s", name) == 1)	return SUBLLINE;  if (sscanf(tbuf, ".MODEL %s %*s", name) == 1)	return MODLLINE;  if (sscanf(tbuf, ".ENDS%c", name) == 1)	return ENDSLLINE;  if (sscanf(tbuf, "+%s", name) == 1)	return CONTLLINE;  return NORMLINE;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?