home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / xbase / library / clipper / rettig / source / _tr_mkdt.c < prev    next >
C/C++ Source or Header  |  1990-10-21  |  3KB  |  115 lines

  1. /*********
  2. * _tr_mkdt.c
  3. *
  4. * by Tom Rettig
  5. * Modified by Leonard Zerman
  6. *
  7. * Placed in the public domain by Tom Rettig Associates, 10/22/1990.
  8. *
  9. * Syntax: _tr_makedate( <year>, <month>, <day> )
  10. * Return: valid <date string> of <year> plus <month> plus <day>
  11. ********/
  12.  
  13. #include "trlib.h"
  14.  
  15. char *_tr_makedate(year,month,day)
  16. double year, month;
  17. long int day;
  18. {
  19.    static char ret[9] = "        ";
  20.    int newyear, newmonth, newday, lastday,
  21.        mosmonth, mosday, monthyears, daymonths, calcmonth, calcday,
  22.        yrsyear, yrsday;
  23.    /* break into integer and decimal for calculating months and days */
  24.    mosmonth = (int) month;
  25.    /* consider current month when calculating day part of mos */
  26.    mosday = (int) ( (month - (double)mosmonth) * 
  27.                     ((ISYEAR(year)&&ISMONTH((int)month))?
  28.                     (double)_tr_ldm((int)month,(int)year):31) );
  29.  
  30.    /* break into integer and decimal for converting fractional years to days */
  31.    yrsyear = (int) year;
  32.    yrsday = (int) ( (year - (double)yrsyear) * (ISLPYR(yrsyear)?366:365) );
  33.  
  34.    /* add mos and yrs fractions to days */
  35.    day += (long int)(mosday + yrsday);
  36.  
  37.    /* push excess days into months and excess months into years */
  38.    daymonths   = (int)(day / ((ABS(day)>32 && (day%31)==1) ? 31 : 32));
  39.    calcday     = (int)((day-1) % 31) +1;
  40.    mosmonth   += daymonths;
  41.    calcmonth   = ((mosmonth-1) % 12) +1;
  42.    if( mosmonth >= 0 )
  43.    {
  44.       monthyears  = mosmonth /((mosmonth%12)==0 ? 13 : 12); 
  45.       monthyears += (mosmonth%12==0) ? (int)(mosmonth/156) : 0;
  46.    }
  47.    else
  48.    {
  49.       monthyears  = mosmonth /((mosmonth%13)==0 ? 13 : 12); 
  50.       monthyears += (mosmonth%13==0) ? (int)(mosmonth/156) : 0;
  51.    }
  52.    monthyears += ((calcmonth==12)  && (mosmonth%13==0)) ||
  53.                  ((calcmonth==1 )  && (mosmonth < -10)) ? -1 : 0;
  54.    newyear     = yrsyear + monthyears;
  55.  
  56.    /* calculate preliminary new month assuming 31 days */
  57.    if ( calcmonth > 0 )
  58.       newmonth = calcmonth;
  59.    else
  60.    {
  61.       newmonth = 12 + calcmonth;
  62.       newyear--;
  63.    }
  64.  
  65.    /* calculate preliminary new day */
  66.    if ( calcday > 0 )
  67.       newday = calcday;
  68.    else
  69.    {
  70.       newday = 31 + calcday;
  71.       if ( newmonth == 1 )
  72.       {
  73.          newmonth = 12;
  74.          newyear--;
  75.       }
  76.       else
  77.          newmonth--;
  78.    }
  79.  
  80.    /* if year is zero or less, date becomes 01/01/0001 */
  81.    if ( newyear <= 0 )
  82.       newyear = newmonth = newday = 1;
  83.    else
  84.    {
  85.       /* recalculate if newday exceeds valid lastday of month */
  86.       lastday = _tr_ldm(newmonth,newyear);
  87.       if ( newday > lastday )
  88.       {
  89.          if ( calcday > 0 )
  90.          {
  91.             /* will never go over 12 because December has 31 days */
  92.             newmonth++;
  93.             newday -= lastday;
  94.          }
  95.          else
  96.             newday = lastday;
  97.       }
  98.    }
  99.  
  100.    /* build new date string */
  101.    ret[0] = DIGIT( newyear          / 1000 );
  102.    ret[1] = DIGIT((newyear  % 1000) /  100 );
  103.    ret[2] = DIGIT((newyear  %  100) /   10 );
  104.    ret[3] = DIGIT( newyear  %   10         );
  105.    ret[4] = DIGIT( newmonth         /   10 );
  106.    ret[5] = DIGIT( newmonth %   10         );
  107.    ret[6] = DIGIT( newday           /   10 );
  108.    ret[7] = DIGIT( newday   %   10         );
  109.    ret[8] = NULLC;
  110.  
  111.    return( ret );
  112. }
  113.  
  114.