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

📄 numparse.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group**********//* * This routine parses a number. */#include "spice.h"#include "cpdefs.h"#include "ftedefs.h"#include "suffix.h"static doublepow10(num)    register int num;{    double d = 1.0;    while (num-- > 0)        d *= 10.0;    return (d);}bool ft_strictnumparse = false;/* Parse a number. This will handle things like 10M, etc... If the number * must not end before the end of the string, then whole is true. * If whole is false and there is more left to the number, the argument * is advanced to the end of the word. Returns NULL * if no number can be found or if there are trailing characters when * whole is true. * If ft_strictnumparse is true, and whole is false, the first of the * trailing characters must be a '_'. */double *ft_numparse(s, whole)    char **s;    bool whole;{    double mant = 0.0;    int sign = 1, exsign = 1, p;    double expo = 0.0;    static double num;    char *string = *s;    /* See if the number begins with + or -. */    if (*string == '+')        string++;    else if (*string == '-') {        string++;        sign = -1;    }    /* We don't want to recognise "P" as 0P, or .P as 0.0P... */    if ((!isdigit(*string) && *string != '.') ||            ((*string == '.') && !isdigit(string[1])))        return (NULL);    /* Now accumulate a number. Note ascii dependencies here... */    while (isdigit(*string))        mant = mant * 10.0 + (*string++ - '0');        /* Now maybe a decimal point. */    if (*string == '.') {        string++;        p = 1;        while (isdigit(*string))            mant += (*string++ - '0') / pow10(p++);    }    /* Now look for the scale factor or the exponent (can't have both). */    switch (*string) {        case 'e':        case 'E':            /* Parse another number. */            string++;            if (*string == '+') {                exsign = 1;                string++;            } else if (*string == '-') {                exsign = -1;                string++;            }            while(isdigit(*string))                expo = expo * 10.0 + (*string++ - '0');            if (*string == '.') {                string++;                p = 1;                while (isdigit(*string))                    expo += (*string++ - '0') / pow10(p++);            }            expo *= exsign;            break;        case 't':        case 'T':            expo = 12.0;            string++;            break;        case 'g':        case 'G':            expo = 9.0;            string++;            break;        case 'k':        case 'K':            expo = 3.0;            string++;            break;        case 'u':        case 'U':            expo = -6.0;            string++;            break;        case 'n':        case 'N':            expo = -9.0;            string++;            break;        case 'p':        case 'P':            expo = -12.0;            string++;            break;        case 'f':        case 'F':            expo = -15.0;            string++;            break;        case 'm':        case 'M':            /* Can be either m, mil, or meg. */            if (string[1] && string[2] &&                 ((string[1] == 'e') || (string[1] == 'E')) &&                ((string[2] == 'g') || (string[2] == 'G'))) {                expo = 6.0;                string += 3;            } else if (string[1] && string[2] &&                 ((string[1] == 'i') || (string[1] == 'I')) &&                ((string[2] == 'l') || (string[2] == 'L'))) {                expo = -6.0;                mant *= 25.4;                string += 3;            } else {                expo = -3.0;                string++;            }            break;    }    if (whole && *string != '\0') {        return (NULL);    } else if (ft_strictnumparse && *string && isdigit(string[-1])) {        if (*string == '_')            while (isalpha(*string) || (*string == '_'))                string++;        else            return (NULL);    } else {        while (isalpha(*string) || (*string == '_'))            string++;    }    *s = string;    num = sign * mant * pow(10.0, expo);    if (ft_parsedb)        fprintf(cp_err, "numparse: got %e, left = %s\n", num, *s);    return (&num);}

⌨️ 快捷键说明

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