Could have a date

Return TypeFunction nameArguments
uint32_tIsDate(uint32_t&,uint32_t&,uint32_t&,const char*,)

Declared in file: hzTextproc.h
Defined in file : hzDate.cpp

Function Logic:

0:START 1:D M Y 2:unknown 3:Return 0 4:unknown 5:unknown 6:unknown 7:i i i i ( ( 8:( 9:Y i i ( M i i ( D 10:Return (Y>9999||!M||M>12||!D||D>(M==2?(!(Y%400)?1:!(Y%100)?0:!(Y%4)?1:0)?29:28:M==4||M==6||M==9||M==11?30:31))?0:10 11:unknown 12:i i i i ( ( 13:( 14:Y i i ( M i i ( D 15:Return (Y>9999||!M||M>12||!D||D>(M==2?(!(Y%400)?1:!(Y%100)?0:!(Y%4)?1:0)?29:28:M==4||M==6||M==9||M==11?30:31))?0:8 16:unknown 17:unknown 18:items 19:*i==(char)47 20:items 21:IsAlpha(*i) 22:items 23:*i<=' ' 24:items 25:*i<=',' 26:items 27:Return 0 28:unknown 29:unknown 30:unknown 31:unknown 32:dow 33:unknown 34:M 35:unknown 36:unknown 37:unknown 38:unknown 39:D * D 40:unknown 41:unknown 42:Y * Y 43:unknown 44:nDigit nSlash 45:unknown 46:unknown 47:items 48:IsDigit(*i) 49:items 50:unknown 51:Return 0 52:i 53:unknown 54:unknown 55:i i i i ( ( 56:( 57:Y i i ( M i i ( D 58:unknown 59:unknown 60:D * D 61:unknown 62:M * M 63:unknown 64:Y * Y 65:Return (Y>9999||!M||M>12||!D||D>(M==2?(!(Y%400)?1:!(Y%100)?0:!(Y%4)?1:0)?29:28:M==4||M==6||M==9||M==11?30:31))?0:len

Function body:

uint32_t IsDate (uint32_t& Y)uint32_t& M, uint32_t& D, const char* cpStr, 
{
   const       char*   i = cpStr ;     //  String iterator
   uint32_t    nDigit = 0;         //  Number of digits encountered
   uint32_t    nSlash = 0;         //  Number of slashes encountered
   uint32_t    nAlpha = 0;         //  Number of alphas encountered
   uint32_t    nSpace = 0;         //  Number of spaces encountered
   uint32_t    nComma = 0;         //  Number of commas encountered
   uint32_t    dow = NULL_DOW ;        //  Day of week
   uint32_t    len = 0;                //  Test string lenght
   Y = M = D = 0;
   if (!i || i[0]== 0)
       return 0;
   //  Check standard formats first
   if (IsDigit(i[0])&& IsDigit(i[1]))
   {
       if (IsDigit(i[2])&& IsDigit(i[3]))
       {
           if (i[4]== CHAR_FWSLASH && IsDigit(i[5])&& IsDigit(i[6])&& i[7]== CHAR_FWSLASH && IsDigit(i[8])&& IsDigit(i[9]))
           {
               Y = ((i[0]-''0'')*1000)+((i[1]-''0'')*100)+((i[2]-''0'')*10)+(i[3]-''0'');
               M = ((i[5]-''0'')*10)+(i[6]-''0'');
               D = ((i[8]-''0'')*10)+(i[9]-''0'');
               return (Y > 9999||!M||M > 12||!D || D > monlen(Y, M)) ? 0: 10;
           }
           if (IsDigit(i[4])&& IsDigit(i[5])&& IsDigit(i[6])&& IsDigit(i[7]))
           {
               Y = ((i[0]-''0'')*1000)+((i[1]-''0'')*100)+((i[2]-''0'')*10)+(i[3]-''0'');
               M = ((i[4]-''0'')*10)+(i[5]-''0'');
               D = ((i[6]-''0'')*10)+(i[7]-''0'');
               return (Y > 9999||!M||M > 12||!D || D > monlen(Y, M)) ? 0: 8;
           }
       }
   }
   //  Check more elaborate formats
   for (i = cpStr ; *i ; len++, i++)
   {
       if      (IsDigit(*i))           nDigit++ ;
       else if (*i == CHAR_FWSLASH)    nSlash++ ;
       else if (IsAlpha(*i))           nAlpha++ ;
       else if (*i <&eq; '' '')           nSpace++ ;
       else if (*i <&eq; '','')           nComma++ ;
       else
           return 0;
   }
   if (nDigit > 4&& nAlpha > 2&& nSpace > 1)
   {
       //  Could have a date
       for (i = cpStr ; *i ; len++, i++)
       {
           if (IsAlpha(*i))
           {
               if (dow == NULL_DOW)
                   dow = _isdow(i) ;
               if (M <&eq; 0)
                   M = _ismonth(i) ;
               for (; IsAlpha(*i) ; i++) ;
           }
           if (IsDigit(*i))
           {
               if (!D)
                   for (; IsDigit(*i) ; i++)   { D *= 10;D += (*i - ''0'');}
               if (!Y)
                   for (; IsDigit(*i) ; i++)   { Y *= 10;Y += (*i - ''0'');}
           }
           if (Y && M > 0&& D > 0)
               break ;
       }
   }
   else
   {
       /*
       **  ** Check numeric format
       **           */
       nDigit = 0;
       nSlash = 0;
       for (i = cpStr ; *i ; len++, i++)
       {
           if (*i == CHAR_FWSLASH)
               nSlash++ ;
           else if (IsDigit(*i))
               nDigit++ ;
           else
               break ;
       }
       if (*i > CHAR_SPACE && *i != CHAR_MINUS)
           return 0;
       i = cpStr ;
       if (nSlash == 0)
       {
           if (nDigit == 8)
           {
               Y = ((i[0]-''0'')*1000)+((i[1]-''0'')*100)+((i[2]-''0'')*10)+(i[3]-''0'');
               M = ((i[4]-''0'')*10)+(i[5]-''0'');
               D = ((i[6]-''0'')*10)+(i[7]-''0'');
           }
       }
       if (nSlash == 2)
       {
           for (i = cpStr ; IsDigit(*i) ; len++, i++)  { D *= 10;D += (*i - ''0'');}
           for (i++ ; IsDigit(*i) ; len++, i++)        { M *= 10;M += (*i - ''0'');}
           for (i++ ; IsDigit(*i) ; len++, i++)        { Y *= 10;Y += (*i - ''0'');}
       }
   }
   return (Y > 9999||!M||M > 12||!D || D > monlen(Y, M)) ? 0: len ;
}