📄 function.c
字号:
mysp->type = NUMBER;
return (0);
}
/*************************************************************************
Function: FindStr(S1, S2)
Purpose : 在串 S1 中查找子串 S2 的位置,没找到返回 0
Modify : 堆栈
Remark :
*************************************************************************/
int FindStr(PACK *pp)
{
int i;
char *cp, *tp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
(pp->sp)--;
mysp = (pp->sp) - 1;
if ((tp = strstr(mysp->str, (mysp+1)->str)) == (char *)NULL)
mysp->num = 0;
else
{
i = 1;
cp = mysp->str;
while (cp++ != tp)
i++;
mysp->num = i;
}
mysp->type = NUMBER;
return (0);
}
/*************************************************************************
Function: Head(S, n)
Purpose : 取字符串头部 n 个字符
Modify : 堆栈
Remark :
*************************************************************************/
int Head(PACK *pp)
{
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
(pp->sp)--;
mysp = (pp->sp) - 1;
mysp->str[(int)((mysp+1)->num)] = '\0';
return (0);
}
/*************************************************************************
Function: IsNum(S)
Purpose : 是数字字符串返回 1,否则返回 0
Modify : 堆栈
Remark :
*************************************************************************/
int IsNum(PACK *pp)
{
char *cp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
mysp = (pp->sp) - 1;
cp = mysp->str;
mysp->num = 1;
while (*cp != '\0')
if (!isdigit(*cp++))
{
mysp->num = 0;
break;
}
mysp->type = NUMBER;
return (0);
}
/*************************************************************************
Function: LtoStr(n, m)
Purpose : 将正整数 n 转换成 m 位字符串,不足前面加 0
Modify : 堆栈
Remark :
*************************************************************************/
int LtoStr(PACK *pp)
{
long n;
char *cp, *tp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
(pp->sp)--;
mysp = (pp->sp) - 1;
n = (long)(mysp->num);
tp = mysp->str;
cp = tp + (long)((mysp+1)->num);
*cp = '\0';
while (cp != tp)
{
*(--cp) = n%10 + 48;
n = n/10;
}
mysp->type = STRING;
return (0);
}
/*************************************************************************
Function: RepChar(S, n)
Purpose : 将字符 S 重复 n 次
Modify : 堆栈
Remark :
*************************************************************************/
int RepChar(PACK *pp)
{
int i, n;
char *cp, *tp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
(pp->sp)--;
mysp = (pp->sp) - 1;
cp = tp = mysp->str;
n = (mysp+1)->num;
for (i = 1; i < n; i++)
*(++cp) = *tp;
*(++cp) = '\0';
return (0);
}
/*************************************************************************
Function: Strcat(S1, S2)
Purpose : 连接两个字符串
Modify : 堆栈
Remark :
*************************************************************************/
int Strcat(PACK *pp)
{
char *cp, *tp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
(pp->sp)--;
mysp = (pp->sp) - 1;
cp = mysp->str;
tp = (mysp+1)->str;
while (*cp != '\0') cp++;
while ((*cp++ = *tp++) != '\0');
return (0);
}
/*************************************************************************
Function: Strcmp(S1, S2)
Purpose : 比较两个字符串
Modify : 堆栈
Remark :
*************************************************************************/
int Strcmp(PACK *pp)
{
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
(pp->sp)--;
mysp = (pp->sp) - 1;
mysp->num = strcmp(mysp->str, (mysp+1)->str);
mysp->type = NUMBER;
return (0);
}
/*************************************************************************
Function: Strlen(S)
Purpose : 求字符串的长度
Modify : 堆栈
Remark :
*************************************************************************/
int Strlen(PACK *pp)
{
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
mysp = (pp->sp) - 1;
mysp->num = strlen(mysp->str);
mysp->type = NUMBER;
return (0);
}
/*************************************************************************
Function: SubStr(S, n, m)
Purpose : 从字符串的第 n 个字符起取 m 个字符
Modify : 堆栈
Remark :
*************************************************************************/
int SubStr(PACK *pp)
{
int i, n, m;
char *cp, *tp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
pp->sp -= 2;
mysp = (pp->sp) - 1;
cp = tp = mysp->str;
n = (int)((mysp+1)->num) - 1;
m = (int)((mysp+2)->num);
for (i = 0; i < n; i++)
if (*tp == '\0')
break;
else
tp++;
for (i = 0; i < m; i++)
*cp++ = *tp++;
*cp = '\0';
return (0);
}
/*************************************************************************
Function: Tail(S, n)
Purpose : 从字符串的尾部取 n 个字符
Modify : 堆栈
Remark :
*************************************************************************/
int Tail(PACK *pp)
{
int n;
char *cp, *tp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
(pp->sp)--;
mysp = (pp->sp) - 1;
cp = tp = mysp->str;
n = (int)((mysp+1)->num);
n = strlen(cp) - n;
if (n < 0)
n = 0;
tp += n;
while ((*cp++ = *tp++) != '\0');
return (0);
}
/*************************************************************************
Function: Upper(S)
Purpose : 将串中的小写字母改为大写
Modify : 堆栈
Remark :
*************************************************************************/
int Upper(PACK *pp)
{
char *cp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
mysp = (pp->sp) - 1;
cp = mysp->str;
while (*cp != '\0')
*cp++ = toupper(*cp);
return (0);
}
/*************************************************************************
Function: ConvDate(S, P)
Purpose : 将按 P 所示格式的日期串 S 转换成标准格式
Modify : 堆栈
Remark :
*************************************************************************/
int ConvDate(PACK *pp)
{
struct tm tt;
char *cp;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
(pp->sp)--;
#ifdef UNIX
mysp = (pp->sp) - 1;
cp = mysp->str;
strptime(cp, (mysp+1)->str, &tt);
/* 日期时间串 */
IntToStr(tt.tm_year+1900, 4, cp);
IntToStr(tt.tm_mon+1,2, cp+5);
IntToStr(tt.tm_mday, 2, cp+8);
IntToStr(tt.tm_hour, 2, cp+11);
IntToStr(tt.tm_min, 2, cp+14);
IntToStr(tt.tm_sec, 2, cp+17);
/* 分隔符 */
*(cp+4) = *(cp+7) = DATE_COMPART;
*(cp+10) = DATE_TIME_COMPART;
*(cp+13) = *(cp+16) = TIME_COMPART;
*(cp+19) = '\0';
#endif
return (0);
}
/*************************************************************************
Function: Date()
Purpose : 当前系统的日期时间串
Modify : 堆栈
Remark : 出错时返回 -1,否则返回 0
*************************************************************************/
int Date(PACK *pp)
{
time_t t;
char *cp;
struct tm tt;
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
mysp = pp->sp;
(pp->sp)++;
t = time(NULL);
cp = mysp->str;
mysp->type = STRING;
/* 计算 tm 结构 */
TimeToTm(t, &tt);
/* 日期时间串 */
IntToStr(tt.tm_year, 4, cp);
IntToStr(tt.tm_mon+1,2, cp+5);
IntToStr(tt.tm_mday, 2, cp+8);
IntToStr(tt.tm_hour, 2, cp+11);
IntToStr(tt.tm_min, 2, cp+14);
IntToStr(tt.tm_sec, 2, cp+17);
/* 分隔符 */
*(cp+4) = *(cp+7) = DATE_COMPART;
*(cp+10) = DATE_TIME_COMPART;
*(cp+13) = *(cp+16) = TIME_COMPART;
*(cp+19) = '\0';
return (0);
}
/*************************************************************************
Function: DateAdd(D, P, n)
Purpose : 按格式串 P 的要求在 D 的相应部份上加上 n,n 可正可负。
Modify : 堆栈
Remark : 出错时返回 -1,否则返回 0
D 应为标准日期时间串 (YYYY/MM/DD hh:mm:ss,分隔符任意)
函数未对 D 进行值范围检查,由用户保证其正确性。
*************************************************************************/
int DateAdd(PACK *pp)
{
char *cp;
int df = 0;
long n, tmp;
struct tm tt;
int mdays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
FIELD *mysp;
/* 调整返回堆栈指针并取得参数位置 */
pp->sp -= 2;
mysp = (pp->sp) - 1;
/* 格式 */
cp = (mysp+1)->str;
while (*cp != '\0')
df += (int)*cp++;
/* 加的数值 */
n = (mysp+2)->num;
/* 设置 tm 结构 */
cp = mysp->str;
tt.tm_year = StrToInt(&cp);
tt.tm_mon = StrToInt(&cp) - 1;
tt.tm_mday = StrToInt(&cp);
tt.tm_hour = StrToInt(&cp);
tt.tm_min = StrToInt(&cp);
tt.tm_sec = StrToInt(&cp);
cp = mysp->str;
switch (df)
{
case 230: /* ss 秒数 */
tmp = tt.tm_sec + n;
n = floor((double)tmp/(double)60);
tt.tm_sec = tmp - 60*n;
if (n == 0) break;
case 214: /* mi 分钟 */
tmp = tt.tm_min + n;
n = floor((double)tmp/(double)60);
tt.tm_min = tmp - 60*n;
if (n == 0) break;
case 208: /* hh 小时 */
tmp = tt.tm_hour + n;
n = floor((double)tmp/(double)24);
tt.tm_hour = tmp - 24*n;
if (n == 0) break;
case 200: /* dd 月份中的日 */
case 221: /* dy 年份中的日 */
case 219: /* dw 星期 */
if (df == 219)
tmp = tt.tm_mday + 7*n;
else
tmp = tt.tm_mday + n;
if (tmp > 0)
while (1)
{
if ( IsLeapYear(tt.tm_year) )
mdays[1] = 29;
else
mdays[1] = 28;
do
{
if (tmp <= mdays[tt.tm_mon])
{
tt.tm_mday = tmp;
goto End;
}
tmp -= mdays[tt.tm_mon++];
} while (tt.tm_mon < 12);
tt.tm_mon = 0;
tt.tm_year++;
}
else
while (1)
{
if ( IsLeapYear(tt.tm_year) )
mdays[1] = 29;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -