home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume7 / yearlength / days.c next >
C/C++ Source or Header  |  1987-01-19  |  1KB  |  53 lines

  1. #include <stdio.h>
  2.  
  3. struct country_years
  4. {
  5.     short  greg_switch;        /* year according to Christian era  */
  6.     int    (*weird_years)();    /* function pointer for early years */
  7. };
  8.  
  9.  
  10. #include "year.tbl"
  11.  
  12.  
  13.  
  14. /**********************************************************************
  15. *
  16. *  days_in_year() -- give number of days for particular year and country
  17. *
  18. *     N.B. countries and their borders have changed a bit over time ...
  19. *
  20. *     returns:
  21. *        -1      for unknown countries or bad years
  22. *     # of days  for good years of countries in table
  23. *
  24. **********************************************************************/
  25. int
  26. days_in_year(year, country_code)
  27.     register int   year;
  28.     register int   country_code;
  29. {
  30.     register int switch_year;
  31.  
  32.  
  33.     /* valid country code? */
  34.     if (country_code < 0  ||  country_code > MAX_COUNTRY)
  35.     return(-1);
  36.  
  37.     /* check the farthest boundaries; there is no year 0 */
  38.     /* NOTE: individual country functions may handle less */
  39.     if (year <= 0  ||  year > 9999)
  40.     return(-1);
  41.  
  42.     /* if year is after Gregorian calendar change, use Gregorian rule */
  43.     switch_year = year_table[country_code].greg_switch;
  44.     if (year > switch_year)
  45.     if ((year&0x3)==0 && ((year&0xF)==0 || year%100))
  46.         return(366);
  47.     else
  48.         return(365);
  49.     
  50.     /* else, need to handle years before and during calendar change */
  51.     return((*year_table[country_code].weird_years)(year, switch_year));
  52. }
  53.