home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sdktools / windiff / gdate.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  5KB  |  197 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1993-1997 Microsoft Corporation.
  5. *       All rights reserved. 
  6. *       This source code is only intended as a supplement to 
  7. *       Microsoft Development Tools and/or WinHelp documentation.
  8. *       See these sources for detailed information regarding the 
  9. *       Microsoft samples programs.
  10. \******************************************************************************/
  11.  
  12. /****************************** Module Header *******************************
  13. * Module Name: GDATE.C
  14. *
  15. * Contains date conversion functions.
  16. *
  17. * Functions:
  18. *
  19. * gdi_isleap()
  20. * gdate_daytodmy()
  21. * gdate_dmytoday()
  22. * gdate_monthdays()
  23. * gdate_weeklyday()
  24. *
  25. * Comments:
  26. *
  27. ****************************************************************************/
  28.  
  29. #include <windows.h>
  30. #include <string.h>
  31.  
  32. #include "gutils.h"
  33.  
  34.  
  35. BOOL gdi_isleap(LONG year);
  36.  
  37. /*---static data--------------------------------------------*/
  38.  
  39. int monthdays[] = {
  40.         31,
  41.         28,
  42.         31,
  43.         30,
  44.         31,
  45.         30,
  46.         31,
  47.         31,
  48.         30,
  49.         31,
  50.         30,
  51.         31
  52. };
  53.  
  54.  
  55. /***************************************************************************
  56.  * Function: gdate_daytomy
  57.  *
  58.  * Purpose:
  59.  *
  60.  * converts day to d/m/y
  61.  */
  62. void APIENTRY
  63. gdate_daytodmy(LONG days, int FAR* yrp, int FAR* monthp, int FAR* dayp)
  64. {
  65.         int years;
  66.         int nleaps;
  67.         int month;
  68.         int mdays;
  69.  
  70.         /* get number of completed years and calc leap days */
  71.         years = (int) (days / 365);
  72.         days = days % 365;
  73.         nleaps = (years / 4) - (years / 100) + (years / 400);
  74.         while (nleaps > days) {
  75.                 days += 365;
  76.                 years--;
  77.                 nleaps = (years / 4) - (years / 100) + (years / 400);
  78.         }
  79.         days -= nleaps;
  80.  
  81.         /* add one year for current (non-complete) year */
  82.         years++;
  83.  
  84.  
  85.         /* current month */
  86.         for (month = 0; month < 12; month++) {
  87.                 mdays = monthdays[month];
  88.                 if (gdi_isleap(years) && (month == 1)) {
  89.                         mdays++;
  90.                 }
  91.                 if (days == mdays) {
  92.                         days = 0;
  93.                         month++;
  94.                         break;
  95.                 } else if (days < mdays) {
  96.                         break;
  97.                 } else {
  98.                         days -= mdays;
  99.                 }
  100.         }
  101.         /* conv month from 0-11 to 1-12 */
  102.         if (monthp != NULL) {
  103.                 *monthp = month+1;
  104.         }
  105.         if (dayp != NULL) {
  106.                 *dayp = (int) days + 1;
  107.         }
  108.         if (yrp != NULL) {
  109.                 *yrp = years;
  110.         }
  111. }
  112.  
  113.  
  114. /***************************************************************************
  115.  * Function: gdate_dmytoday
  116.  *
  117.  * Purpose:
  118.  *
  119.  * converts d/m/y to a day
  120.  */ 
  121. LONG APIENTRY
  122. gdate_dmytoday(int yr, int month, int day)
  123. {
  124.         int nleaps;
  125.         int i;
  126.         long ndays;
  127.  
  128.         /* exclude the current year */
  129.         yr--;
  130.         nleaps = (yr / 4) - (yr / 100) + (yr / 400);
  131.  
  132.         /* in any given year, day 0 is jan1 */
  133.         month--;
  134.         day--;
  135.         ndays = 0;
  136.         for (i = 0; i < month ; i++) {
  137.                 ndays += monthdays[i];
  138.                 if (gdi_isleap(yr+1) && (i == 1)) {
  139.                         ndays++;
  140.                 }
  141.         }
  142.         ndays = ndays + day + nleaps + (yr * 365L);
  143.         return(ndays);
  144. }
  145.  
  146. /***************************************************************************
  147.  * Function: gdate_monthdays
  148.  *
  149.  * Purpose:
  150.  *
  151.  * Gets number of days in month
  152.  */
  153. int APIENTRY
  154. gdate_monthdays(int month, int year)
  155. {
  156.         int ndays;
  157.  
  158.         ndays = monthdays[month - 1];
  159.         if (gdi_isleap(year) && (month == 2)) {
  160.                 ndays++;
  161.         }
  162.         return(ndays);
  163. }
  164.  
  165. /***************************************************************************
  166.  * Function: gdate_weekday
  167.  *
  168.  * Purpose:
  169.  * 
  170.  * Gets the day of the week
  171.  */
  172. int APIENTRY
  173. gdate_weekday(long daynr)
  174. {
  175.         return((int) ((daynr + 1) % 7));
  176. }
  177.  
  178.  
  179. /***************************************************************************
  180.  * Function: gdi_isleap
  181.  *
  182.  * Purpose:
  183.  * 
  184.  * Determines whether the year is a leap year
  185.  */
  186. BOOL
  187. gdi_isleap(LONG year)
  188. {
  189.         if ( ((year % 4) == 0) &&
  190.                 (((year % 100) != 0) ||
  191.                 ((year % 400) == 0))) {
  192.                         return TRUE;
  193.         } else {
  194.                 return FALSE;
  195.         }
  196. }
  197.