?? function.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 + -