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

📄 function.c

📁 一个简单的解析器
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -