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

📄 function.h

📁 一个简单的解析器
💻 H
字号:
/***************************************
 Filename : function.h
 Version  : Formula Language V1.1
 Author   : Shen Tu Hongnan
 Modify   :
 Date     : 2001/08/26
 Remark   :
 ***************************************/

#ifndef FUNCTION
    #define FUNCTION
#endif

#ifndef FORMULA
	#define STRING	            0                   /* 字符串 */
	#define NUMBER              1                   /* 数字型 */
    #define MAX_STRING_LEN	    128	                /* 最大串长 */

    /* 数据域 */
    typedef struct          {
		    int             type;	                /* 数据类型 */
		    double          num;	                /* 数字型值 */
		    char            str[MAX_STRING_LEN];    /* 字符串值 */
	        } FIELD;

    /* 堆栈及变量 */
    typedef struct  {
            FIELD   *sp;                            /* 运算堆栈指针 */
            FIELD   **vp;                           /* 赋值堆栈指针 */
            FIELD   *px;                            /* 输入变量组 */
            FIELD   *py;                            /* 输出变量组 */
            FIELD   *pz;                            /* 临时变量组 */
            } PACK;

    /* 函数名,函数指针 */
    typedef struct {
            char   name[16];
            int    (*addr)(PACK *pp);
            } FUN_LIST;

#endif

/* 日期时间分隔符 */
#define DATE_COMPART        '/'
#define TIME_COMPART        ':'
#define DATE_TIME_COMPART   ' '

/* 东八区时区调整数(8*3600),非夏令时 */
#define TIME_AREA           28800
/*****************************************************************************
 一、新增函数时函数名须以大写字母开头,其后的字符可以是字母、数字及下划线。函
     数名的长度不得超过 15 个字符。

 二、新增函数必须在数组 FUN_LIST  Fun[Total_of_Fun] 中按函数名的 ASCII 码递增
     顺序插入一行初始化其函数名及其函数地址,并将常量 Total_of_Fun 增加一。

 三、必须按照以下规则编写函数:
 1、不管供用户调用的函数有多少个参数、返回什么值,编写时函数原型都为:
    int 函数名(PACK *pp);
    函数正确完成时应返回 0,出错时返回 -1。

    PACK 为一个包括堆栈及变量的结构:
    typedef struct  {
            FIELD   *sp;                            // 运算堆栈指针
            FIELD   **vp;                           // 赋值堆栈指针
            FIELD   *px;                            // 输入变量组
            FIELD   *py;                            // 输出变量组
            FIELD   *pz;                            // 临时变量组
            } PACK;
    在函数中除 sp 外,其他指针的值只能使用(vp不用),不能改变。

 2、设用户调用时函数的参数为 n 个,函数应定义局部变量:
    FIELD   *mysp;

    首先调整函数返回时的堆栈指针及参数位置:
    函数有给用户的结果值时
    pp->sp -= n - 1;
    mysp = (pp->sp) - 1;

    函数没有给用户的结果值时(参见第 4 条)
    pp->sp -= n;
    mysp = pp->sp;

    以后参数从左到右的值为:
    第一个参数  mysp->num (数值型) 或 mysp->str (字符串)
    第二个参数  (mysp+1)->num (数值型) 或 (mysp+1)->str (字符串)
    第三个参数  (mysp+2)->num (数值型) 或 (mysp+2)->str (字符串)
    以此类推。

 3、有给用户的结果值的函数正常结束时应将结果压入堆栈并设置结果类型:
    数值型结果:mysp->num = 结果;
                mysp->type = NUMBER;
    字符串结果:strcpy(mysp->str, 结果);
                mysp->type = STRING;
    结果类型和第一个函数参数类型相同时设置结果类型可以省略。

 4、特别的业务处理函数可以编写成对调用用户没有结果值的函数(原型仍按第一条的规
    定书写)。没有结果值的函数不能参与公式中的运算及赋值,只能单独写成一公式行。

 5、函数可以定义下列局部变量并赋值:
    FIELD   *x_array, *y_array, *z_array;

    x_array = pp->px;
    y_array = pp->py;
    z_array = pp->pz;

    以后就可以从 x_array[i].num 或 x_array[i].str 中取得多个输入数据,并可以将
    一个或多个结果直接写入 y_array[i].num 或 y_array[i].str 中并设置其值的类型
    y_array[i].type。可将多个结果写入临时变量 z_array[i].num 或 z_array[i].str
    中并置值的类型 z_array[i].type。这些结果在后续的公式行中都可以正常引用。

 *****************************************************************************/

extern int Not(PACK *pp);
extern int Abs(PACK *pp);
extern int AddrToStr(PACK *pp);
extern int Asc(PACK *pp);
extern int Atol(PACK *pp);
extern int Ceil(PACK *pp);
extern int ConvDate(PACK *pp);
extern int Date(PACK *pp);
extern int DateAdd(PACK *pp);
extern int DateDiff(PACK *pp);
extern int DatePart(PACK *pp);
extern int Dec(PACK *pp);
extern int FindStr(PACK *pp);
extern int Floor(PACK *pp);
extern int Gradin(PACK *pp);
extern int Head(PACK *pp);
extern int IsNum(PACK *pp);
extern int LtoStr(PACK *pp);
extern int Max(PACK *pp);
extern int Min(PACK *pp);
extern int Mod(PACK *pp);
extern int Pow(PACK *pp);
extern int RepChar(PACK *pp);
extern int Round(PACK *pp);
extern int StrToAddr(PACK *pp);
extern int StrToTime(PACK *pp);
extern int Strcat(PACK *pp);
extern int Strcmp(PACK *pp);
extern int Strlen(PACK *pp);
extern int SubStr(PACK *pp);
extern int Tail(PACK *pp);
extern int TimeToStr(PACK *pp);
extern int Upper(PACK *pp);

/*****************************************************************************/

/* 可调用的函数个数 */
#define Total_of_Fun       33

FUN_LIST    Fun[Total_of_Fun] = {
            {"!",           Not,        },
            {"Abs",         Abs,        },
            {"AddrToStr",   AddrToStr,  },
            {"Asc",         Asc,        },
            {"Atol",        Atol,       },
            {"Ceil",        Ceil,       },
            {"ConvDate",    ConvDate,   },
            {"Date",        Date,       },
            {"DateAdd",     DateAdd,    },
            {"DateDiff",    DateDiff,   },
            {"DatePart",    DatePart,   },
            {"Dec",         Dec,        },
            {"FindStr",     FindStr,    },
            {"Floor",       Floor,      },
            {"Gradin",      Gradin,     },
            {"Head",        Head,       },
            {"IsNum",       IsNum,      },
            {"LtoStr",      LtoStr,     },
            {"Max",         Max,        },
            {"Min",         Min,        },
            {"Mod",         Mod,        },
            {"Pow",         Pow,        },
            {"RepChar",     RepChar,    },
            {"Round",       Round,      },
            {"StrToAddr",   StrToAddr,  },
            {"StrToTime",   StrToTime,  },
            {"Strcat",      Strcat,     },
            {"Strcmp",      Strcmp,     },
            {"Strlen",      Strlen,     },
            {"SubStr",      SubStr,     },
            {"Tail",        Tail,       },
            {"TimeToStr",   TimeToStr,  },
            {"Upper",       Upper,      },
            };

/*****************************************************************************/

/* End of file */

⌨️ 快捷键说明

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