home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_07 / islamdat.c < prev    next >
C/C++ Source or Header  |  1993-01-30  |  1KB  |  55 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <memory.h>
  5. #include "date.h"
  6.  
  7. #define THIRTY_YEARS 10631L
  8. #define T0 1948086L
  9.  
  10. char *leap = "aaabbbccdddeeefffgghhhiiijjkkkl";
  11.            /* 012345678901234567890123456789 */
  12.  
  13. extern char *islam_month_name[12] = {
  14.       "Muharram", "Safar", "Rabia I", "Rabia II", "Jumada I", "Jumada II",
  15.       "Rajab", "Shaban", "Ramadan", "Shawwai", "Zu'lkadah", "Zu'lhijah" };
  16.  
  17. long islam_dmy_to_day(int day, int month, long year)
  18. {
  19.    long rval;
  20.  
  21.    month--;
  22.    rval = (long)(year / 30L) * THIRTY_YEARS;
  23.    year %= 30L;
  24.    rval += year * 354L + (long)(leap[year] - 'a');
  25.    rval += (long)((month / 2) * 59 + (month & 1) * 30 + day - 1);
  26.    return( rval + T0);
  27. }
  28.  
  29. void islam_day_to_dmy( long day, int *d, int *m, long *y)
  30. {
  31.    int i;
  32.  
  33.    *y = ((day - T0) / THIRTY_YEARS) * 30L;
  34.    day = (day - T0) % THIRTY_YEARS;
  35.    for( i = 1; i < 31; i++)
  36.       if( (int)day < 354 * i + (int)(leap[i] - 'a'))
  37.          {
  38.          i--;
  39.          *y += i;
  40.          day -= (long)i * 354L + (long)(leap[i] - 'a');
  41.          *m = 2 * (int)(day / 59L);
  42.          if( *m == 12)        /* leap day fix */
  43.             *m = 10;
  44.          day -= (long)*m * 59L / 2L;
  45.          if( day >= 30L)
  46.             {
  47.             day -= 30L;
  48.             (*m)++;
  49.             }
  50.          *d = (int)day + 1;
  51.          (*m)++;
  52.          return;
  53.          }
  54. }
  55.