⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inpgtok.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. QuarlesModified: 2000 AlansFixes**********/    /* get input token from 'line',      *  and return a pointer to it in 'token'     *//* INPgetTok: node names   INPgetUTok: numbers and other elements in expressions	   (called from INPevaluate) */#include "ngspice.h"#include "iferrmsg.h"#include "inpdefs.h"#include "inp.h"/*------------------------------------------------------------------- * INPgetTok -- this fcn extracts a generic input token from  * 'line' and returns a pointer to it in 'token'.   *------------------------------------------------------------------*/int INPgetTok(char **line, char **token, int gobble)		    /* eat non-whitespace trash AFTER token? */{    char *point;    int signstate;    /* scan along throwing away garbage characters until end of line       or a separation char is found */    for (point = *line; *point != '\0'; point++) {	if (*point == ' ')	    continue;	if (*point == '\t')	    continue;	if (*point == '\r')	    continue;	    	if (*point == '=')	    continue;	if (*point == '(')	    continue;	if (*point == ')')	    continue;	if (*point == ',')	    continue;	break;    }    /* mark beginning of token */    *line = point;    /* now find all good characters up to next occurance of a        separation character. */    signstate = 0;    for (point = *line; *point != '\0'; point++) {	if (*point == ' ')	    break;	if (*point == '\t')	    break;	if (*point == '\r')	    break;	if (*point == '=')	    break;	if (*point == '(')	    break;	if (*point == ')')	    break;	if (*point == ',')	    break;	/* This is not complex enough to catch all errors, 	   but it will get the "good" parses */	if ((*point == '+') || (*point == '-')){		/* Treat '+' signs same as '-' signs */		if (signstate == 1 || signstate == 3) break;		signstate += 1;		continue;		}	if (*point == '*')	    break;	if (*point == '/')	    break;	if (*point == '^')	    break;	if (isdigit(*point) || *point == '.') {	    if (signstate > 1)		signstate = 3;	    else		signstate = 1;	} else if (tolower(*point) == 'e' && signstate == 1)	    signstate = 2;	else	    signstate = 3;    }    if (point == *line && *point)	/* Weird items, 1 char */	point++;    *token = (char *) MALLOC(1 + point - *line);    if (!*token)	return (E_NOMEM);    (void) strncpy(*token, *line, point - *line);    *(*token + (point - *line)) = '\0';    *line = point;    /* gobble garbage to next token */    for (; **line != '\0'; (*line)++) {	if (**line == ' ')	    continue;	if (**line == '\t')	    continue;	if (**line == '\r')	    continue;	if ((**line == '=') && gobble)	    continue;	if ((**line == ',') && gobble)	    continue;	break;    }#ifdef TRACE    /* SDB debug statement */    /* printf("found generic token (%s) and rest of line (%s)\n", *token, *line); */#endif    return (OK);}/*------------------------------------------------------------------- * INPgetNetTok -- this fcn extracts an input netname token from  * 'line' and returns a pointer to it in 'token'.   * This fcn cloned from INPgetTok by SDB to enable * complex netnames (e.g. netnames like '+VCC' and 'IN-'). * mailto:sdb@cloud9.net -- 4.7.2003 *------------------------------------------------------------------*/int INPgetNetTok(char **line, char **token, int gobble)		    /* eat non-whitespace trash AFTER token? */{    char *point;    int signstate;    /* scan along throwing away garbage characters until end of line       or a separation char is found */    for (point = *line; *point != '\0'; point++) {	if (*point == ' ')	    continue;	if (*point == '\t')	    continue;	if (*point == '=')	    continue;	if (*point == '(')	    continue;	if (*point == ')')	    continue;	if (*point == ',')	    continue;	break;    }    /* mark beginning of token */    *line = point;    /* now find all good characters up to next occurance of a        separation character. INPgetNetTok is very liberal about       what it accepts.  */    signstate = 0;    for (point = *line; *point != '\0'; point++) {	if (*point == ' ')	    break;	if (*point == '\t')	    break;	if (*point == '\r')	    break;	if (*point == '=')	    break;	if (*point == ',')	    break;	if (*point == ')')	    break;    }    /* now copy found token into *token */    if (point == *line && *point)	/* Weird items, 1 char */	point++;    *token = (char *) MALLOC(1 + point - *line);    if (!*token)	return (E_NOMEM);    (void) strncpy(*token, *line, point - *line);    *(*token + (point - *line)) = '\0';    *line = point;    /* gobble garbage to next token */    for (; **line != '\0'; (*line)++) {	if (**line == ' ')	    continue;	if (**line == '\t')	    continue;	if (**line == '\r')	    continue;	if ((**line == '=') && gobble)	    continue;	if ((**line == ',') && gobble)	    continue;	break;    }#ifdef TRACE    /* SDB debug statement */    /* printf("found netname token (%s) and rest of line (%s)\n", *token, *line); */#endif    return (OK);}/*------------------------------------------------------------------- * INPgetUTok -- this fcn extracts an input refdes token from  * 'line' and returns a pointer to it in 'token'.   *------------------------------------------------------------------*/int INPgetUTok(char **line, char **token, int gobble)		    /* eat non-whitespace trash AFTER token? */{    char *point, separator;    int signstate;    /* scan along throwing away garbage characters */    for (point = *line; *point != '\0'; point++) {	if (*point == ' ')	    continue;	if (*point == '\t')	    continue;	if (*point == '=')	    continue;	if (*point == '(')	    continue;	if (*point == ')')	    continue;	if (*point == ',')	    continue;	break;    }    if (*point == '"') {	separator = '"';	point++;    } else if (*point == '\'') {	separator = '\'';	point++;    } else	separator = 0;    /* mark beginning of token */    *line = point;    /* now find all good characters */    signstate = 0;    for (point = *line; *point != '\0'; point++) {	if (separator) {	    if (*point == separator)		break;	    else		continue;	}	if (*point == ' ')	    break;	if (*point == '\t')	    break;	if (*point == '=')	    break;	if (*point == '(')	    break;	if (*point == ')')	    break;	if (*point == ',')	    break;	/* This is not complex enough to catch all errors, but it will	   get the "good" parses */	if (*point == '+' && (signstate == 1 || signstate == 3))	    break;	if (*point == '-') {	    if (signstate == 1 || signstate == 3)		break;	    signstate += 1;	    continue;	}	if (*point == '*')	    break;	if (*point == '/')	    break;	if (*point == '^')	    break;	if (isdigit(*point) || *point == '.') {	    if (signstate > 1)		signstate = 3;	    else		signstate = 1;	} else if (tolower(*point) == 'e' && signstate == 1)	    signstate = 2;	else	    signstate = 3;    }    if (separator && *point == separator)	point--;    if (point == *line && *point)	/* Weird items, 1 char */	point++;    *token = (char *) MALLOC(1 + point - *line);    if (!*token)	return (E_NOMEM);    (void) strncpy(*token, *line, point - *line);    *(*token + (point - *line)) = '\0';    /* gobble garbage to next token */    for (; *point != '\0'; point++) {	if (*point == separator)	    continue;	if (*point == ' ')	    continue;	if (*point == '\t')	    continue;	if ((*point == '=') && gobble)	    continue;	if ((*point == ',') && gobble)	    continue;	break;    }    *line = point;#ifdef TRACE    /* SDB debug statement */    /*  printf("found refdes token (%s) and rest of line (%s)\n",*token,*line);  */#endif    return (OK);}

⌨️ 快捷键说明

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