SysMacros.h
上传用户:woshihumen
上传日期:2013-07-18
资源大小:484k
文件大小:5k
源码类别:

Email服务器

开发平台:

Visual C++

  1. /*
  2.  *  XMail by Davide Libenzi ( Intranet and Internet mail server )
  3.  *  Copyright (C) 1999,..,2004  Davide Libenzi
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  *  Davide Libenzi <davidel@xmailserver.org>
  20.  *
  21.  */
  22. #ifndef _SYSMACROS_H
  23. #define _SYSMACROS_H
  24. #define SRand()                 srand((unsigned int) (SysMsTime() * SysGetCurrentThreadId()))
  25. #define NbrCeil(n, a)           ((((n) + (a) - 1) / (a)) * (a))
  26. #define NbrFloor(n, a)          (((n) / (a)) * (a))
  27. #define Sign(v)                 (((v) < 0) ? -1: +1)
  28. #define Min(a, b)               (((a) < (b)) ? (a): (b))
  29. #define Max(a, b)               (((a) > (b)) ? (a): (b))
  30. #define Abs(v)                  (((v) > 0) ? (v): -(v))
  31. #define INext(i, n)             ((((i) + 1) < (n)) ? ((i) + 1): 0)
  32. #define IPrev(i, n)             (((i) > 0) ? ((i) - 1): ((n) - 1))
  33. #define LIndex2D(i, j, n)       ((i) * (n) + (j))
  34. #define ZeroData(d)             memset(&(d), 0, sizeof(d))
  35. #define CountOf(t)              (sizeof(t) / sizeof((t)[0]))
  36. #define SetEmptyString(s)       (s)[0] = ''
  37. #define IsEmptyString(s)        (*(s) == '')
  38. #define CStringSize(s)          (sizeof(s) - 1)
  39. #define StrCmdMatch(s, c)       StrNCmdMatch(s, c, CStringSize(c))
  40. #define StrSkipSpaces(p)        for (; (*(p) == ' ') || (*(p) == 't'); (p)++)
  41. #define CharISame(a, b)         (tolower(a) == tolower(b))
  42. #define StrINComp(s, t)         strnicmp(s, t, strlen(t))
  43. #define StrNComp(s, t)          strncmp(s, t, strlen(t))
  44. #define StrNCpy(t, s, n)        do { strncpy(t, s, n); (t)[(n) - 1] = ''; } while (0)
  45. #define StrSNCpy(t, s)          StrNCpy(t, s, sizeof(t))
  46. #define StrSNCat(t, s)          StrNCat(t, s, sizeof(t))
  47. #define Cpy2Sz(d, s, n)         do { memcpy(d, s, (n) * sizeof(*(s))); (d)[n] = 0; } while (0)
  48. #define StrAppend(s)            ((char *) (s) + strlen(s))
  49. #define CheckRemoveFile(fp)     ((SysExistFile(fp)) ? SysRemove(fp) : 0)
  50. #define ErrorPush()             int __iPushedError = ErrGetErrorCode()
  51. #define ErrorPop()              (ErrSetErrorCode(__iPushedError), __iPushedError)
  52. #define ErrorFetch()            __iPushedError
  53. #define SysFreeCheck(p)         do { if ((p) != NULL) SysFree(p), (p) = NULL; } while(0)
  54. #define IsDotFilename(f)        ((f)[0] == '.')
  55. #define IsEmailAddress(a)       (strchr((a), '@') != NULL)
  56. ///////////////////////////////////////////////////////////////////////////////
  57. //  Inline functions
  58. ///////////////////////////////////////////////////////////////////////////////
  59. inline char *StrNCat(char *pszDest, char const *pszSrc, int iMaxSize)
  60. {
  61. int iDestLength = strlen(pszDest);
  62. if (iDestLength < iMaxSize)
  63. StrNCpy(pszDest + iDestLength, pszSrc, iMaxSize - iDestLength);
  64. return (pszDest);
  65. }
  66. inline int StrNCmdMatch(char const *pszCmdLine, char const *pszCmd, int iCmdLength)
  67. {
  68. return (((strnicmp(pszCmdLine, pszCmd, iCmdLength) == 0) &&
  69.  ((pszCmdLine[iCmdLength] == '') || (pszCmdLine[iCmdLength] == ' ') ||
  70.   (pszCmdLine[iCmdLength] == 't'))) ? 1 : 0);
  71. }
  72. inline char *AppendChar(char *pszString, int iChar)
  73. {
  74. int iStrLength = strlen(pszString);
  75. if ((iStrLength == 0) || (pszString[iStrLength - 1] != iChar)) {
  76. pszString[iStrLength] = iChar;
  77. pszString[iStrLength + 1] = '';
  78. }
  79. return (pszString);
  80. }
  81. inline char *AppendSlash(char *pszPath)
  82. {
  83. return (AppendChar(pszPath, SYS_SLASH_CHAR));
  84. }
  85. inline char *DelFinalChar(char *pszString, int iChar)
  86. {
  87. int iStrLength = strlen(pszString);
  88. if ((iStrLength > 0) && (pszString[iStrLength - 1] == iChar))
  89. pszString[iStrLength - 1] = '';
  90. return (pszString);
  91. }
  92. inline char *DelFinalSlash(char *pszPath)
  93. {
  94. return (DelFinalChar(pszPath, SYS_SLASH_CHAR));
  95. }
  96. inline int ToUpper(int iChar)
  97. {
  98. return (((iChar >= 'a') && (iChar <= 'z')) ? ('A' + (iChar - 'a')) : iChar);
  99. }
  100. inline int ToLower(int iChar)
  101. {
  102. return (((iChar >= 'A') && (iChar <= 'Z')) ? ('a' + (iChar - 'A')) : iChar);
  103. }
  104. inline int IsPrimeNumber(int iNumber)
  105. {
  106. if (iNumber > 3) {
  107. if (iNumber & 1) {
  108. int iHalfNumber = iNumber / 2;
  109. for (int ii = 3; ii < iHalfNumber; ii += 2)
  110. if ((iNumber % ii) == 0)
  111. return (0);
  112. } else
  113. return (0);
  114. }
  115. return (1);
  116. }
  117. #endif