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

📄 dimens.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1992 Regents of the University of California.  All rights reserved.Author: 1992 David A. Gates, U. C. Berkeley CAD Group**********//* * Read and write dimension/index arrays via strings. */#include "spice.h"#include "util.h"#include "ftedata.h"		/* For MAXDIMS *//* * Create a string of the form "12,1,10". */char *dimstring( data, length )int *data;int length;{    int i;    char buf[BSIZE_SP];    if (!data || length < 1)	return NULL;    buf[0] = '\0';    for (i=0; i < length; i++) {	sprintf(buf + strlen(buf), "%d%s",  data[i],	    (i < length - 1) ? "," : "");    }    /* XXX Should I return a copy instead? */    return(buf);}/* * Create a string of the form "[12][1][10]". */char *indexstring( data, length )int *data;int length;{    int i;    char buf[BSIZE_SP];    if (!data || length < 1)	return NULL;    buf[0] = '\0';    for (i=0; i < length; i++) {	sprintf(buf + strlen(buf), "[%d]",  data[i]);    }    return(buf);}/* * Add one to an index into an array with sizes in dims. * Return 1 when all counters overflow at once. */intincindex(counts, numcounts, dims, numdims)int *counts;int numcounts;int *dims;int numdims;{    int i, start;    if (!counts || numcounts < 1 || !dims || numdims < 1)	return 0;    start = numcounts - 1;    for (i = start; i >= 0; i--) {	if (++counts[i] < dims[i])	    break;	/* This counter is not maxed out. */	else	    counts[i] = 0;    }    if (i == 0)	return(1);    else	return(0);}/* * Count number of empty dimensions in an array. */intemptydims( data, length )int *data;int length;{    int i, numempty = 0;    for (i=0; i < length; i++) {	if (data[i] == 0)	    numempty++;    }    return(numempty);}/* * Read a string of one of the following forms into a dimensions array: *  [12][1][10] *  [12,1,10] *  12,1,10 *  12, 1, 10 *  12 , 1 , 10 *  Basically, we require that all brackets be matched, that all numbers *  be separated by commas or by "][", that all whitespace is ignored, and *  the beginning [ and end ] are ignored if they exist.  The only valid *  characters in the string are brackets, commas, spaces, and digits. *  If any dimension is blank, its entry in the array is set to 0. *   *  Return 0 on success, 1 on failure. */intatodims( p, data, outlength )char *p;int *data;int *outlength;{    int length = 0;    int state = 0;    int err = 0;    int needbracket = 0;    char sep = '\0';    if (!data || !outlength)	return 1;    if (!p) {	*outlength = 0;	return 0;    }    while (*p && isspace(*p))	p++;    if (*p == '[') {	p++;	while (*p && isspace(*p))	    p++;	needbracket = 1;    }    while (*p && state != 3) {	switch (state) {	case 0: /* p just at or before a number */	    if (length >= MAXDIMS) {		if (length == MAXDIMS)		    printf("Error: maximum of %d dimensions allowed.\n",			MAXDIMS);		length += 1;	    } else if (!isdigit(*p)) {		data[length++] = 0;	/* This position was empty. */	    } else {		data[length++] = atoi(p);		while (isdigit(*p))		    p++;	    }	    state = 1;	    break;	case 1: /* p after a number, looking for ',' or ']' */	    if (sep == '\0') {	      sep = *p;	    }	    if (*p == ']' && *p == sep) {		p++;		state = 2;	    } else if (*p == ',' && *p == sep) {		p++;		state = 0;	    } else  /* Funny character following a # */		break;	    break;	case 2: /* p after a ']', either at the end or looking for '[' */	    if (*p == '[') {		p++;		state = 0;	    } else {		state = 3;	    }	    break;	}	while (*p && isspace(*p))	    p++;    }    *outlength = length;    if (length > MAXDIMS) {	return(1);    }    if (state == 3) {  /* We finished with a closing bracket */	err = !needbracket;    } else if (*p) {   /* We finished by hitting a bad character after a # */	err = 1;    } else {	       /* We finished by exhausting the string */	err = needbracket;    }    if (err) {	*outlength = 0;    }    return(err);}/* * Skip to the first character that cannot be part of a dimension string. */char *skipdims( p )char *p;{    if (!p)	return NULL;    while(*p && (*p == '[' || *p == ']' || *p == ','	    || isspace(*p) || isdigit(*p)))	p++;    return(p);}

⌨️ 快捷键说明

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