home *** CD-ROM | disk | FTP | other *** search
/ linuxmafia.com 2016 / linuxmafia.com.tar / linuxmafia.com / pub / palmos / happydays-src-1.37.tar.gz / happydays-src-1.37.tar / happydays-1.37 / sol2lun.c < prev    next >
C/C++ Source or Header  |  2000-04-01  |  11KB  |  322 lines

  1. /*
  2. HappyDays - A Birthdate displayer for the PalmPilot
  3. Copyright (C) 1999-2000 JaeMok Jeong
  4.  
  5. This program is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU General Public License
  7. as published by the Free Software Foundation; either version 2
  8. of the License, or (at your option) any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18. */
  19.  
  20.  
  21. #include <PalmOS.h>
  22. #include "calendar.h"
  23.  
  24. Char convertIndex[163][13] = {
  25.  
  26. /*1881*/
  27.     1, 2, 1, 2, 1, 2, 2, 3, 2, 2, 1, 2, 1,
  28.     1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0,
  29.     1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0,
  30.     2, 1, 1, 2, 1, 3, 2, 1, 2, 2, 1, 2, 2,
  31.     2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0,
  32.     2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  33.     2, 2, 1, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2,
  34.     2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0,
  35.     2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0,
  36.     1, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2,
  37.  
  38.     /*1891*/
  39.     1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0,
  40.     1, 1, 2, 1, 1, 2, 3, 2, 2, 1, 2, 2, 2,
  41.     1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0,
  42.     1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0,
  43.     2, 1, 2, 1, 2, 3, 1, 2, 1, 2, 1, 2, 1,
  44.     2, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  45.     1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0,
  46.     2, 1, 2, 3, 2, 2, 1, 2, 1, 2, 1, 2, 1,
  47.     2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 0,
  48.     1, 2, 1, 1, 2, 1, 2, 2, 3, 2, 2, 1, 2,
  49.  
  50.     /*1901*/
  51.     1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0,
  52.     2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0,
  53.     1, 2, 1, 2, 1, 3, 2, 1, 1, 2, 2, 1, 2,
  54.     2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 0,
  55.     2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  56.     1, 2, 2, 1, 4, 1, 2, 1, 2, 1, 2, 1, 2,
  57.     1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0,
  58.     2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0,
  59.     1, 2, 3, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2,
  60.     1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0,
  61.  
  62.     /*1911*/
  63.     2, 1, 2, 1, 1, 2, 3, 1, 2, 2, 1, 2, 2,
  64.     2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 0,
  65.     2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0,
  66.     2, 2, 1, 2, 2, 3, 1, 2, 1, 2, 1, 1, 2,
  67.     2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0,
  68.     1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0,
  69.     2, 1, 3, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1,
  70.     2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 0,
  71.     1, 2, 1, 1, 2, 1, 2, 3, 2, 2, 1, 2, 2,
  72.     1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0,
  73.  
  74.     /*1921*/
  75.     2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0,
  76.     2, 1, 2, 2, 1, 3, 2, 1, 1, 2, 1, 2, 2,
  77.     1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 0,
  78.     2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 0,
  79.     2, 1, 2, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2,
  80.     1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0,
  81.     2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0,
  82.     1, 2, 3, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2,
  83.     1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 0,
  84.     1, 2, 2, 1, 1, 2, 3, 1, 2, 1, 2, 2, 1,
  85.  
  86.     /*1931*/
  87.     2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 0,
  88.     2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0,
  89.     1, 2, 2, 1, 2, 4, 1, 2, 1, 2, 1, 1, 2,
  90.     1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 0,
  91.     1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0,
  92.     2, 1, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1,
  93.     2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 0,
  94.     2, 2, 1, 1, 2, 1, 1, 4, 1, 2, 2, 1, 2,
  95.     2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  96.     2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0,
  97.  
  98.     /*1941*/
  99.     2, 2, 1, 2, 2, 1, 4, 1, 1, 2, 1, 2, 1,
  100.     2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 0,
  101.     1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0,
  102.     1, 1, 2, 1, 4, 1, 2, 1, 2, 2, 1, 2, 2,
  103.     1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0,
  104.     2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 0,
  105.     2, 2, 3, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2,
  106.     2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  107.     2, 2, 1, 2, 1, 2, 1, 3, 2, 1, 2, 1, 2,
  108.     2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0,
  109.  
  110.     /*1951*/
  111.     2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0,
  112.     1, 2, 1, 2, 1, 4, 2, 1, 2, 1, 2, 1, 2,
  113.     1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 0,
  114.     1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 0,
  115.     2, 1, 1, 4, 1, 1, 2, 1, 2, 1, 2, 2, 2,
  116.     1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0,
  117.     2, 1, 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2,
  118.     1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  119.     1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0,
  120.     2, 1, 2, 1, 2, 2, 3, 2, 1, 2, 1, 2, 1,
  121.  
  122.     /*1961*/
  123.     2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 0,
  124.     1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0,
  125.     2, 1, 2, 1, 3, 2, 1, 2, 1, 2, 2, 2, 1,
  126.     2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0,
  127.     1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 0,
  128.     2, 2, 2, 3, 2, 1, 1, 2, 1, 1, 2, 2, 1,
  129.     2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  130.     1, 2, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2,
  131.     1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0,
  132.     2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0,
  133.  
  134.     /*1971*/
  135.     1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 1, 2,
  136.     1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0,
  137.     2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 0,
  138.     2, 2, 1, 2, 3, 1, 2, 1, 1, 2, 2, 1, 2,
  139.     2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0,
  140.     2, 2, 1, 2, 1, 2, 1, 2, 3, 2, 1, 1, 2,
  141.     2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 0,
  142.     2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0,
  143.     2, 1, 1, 2, 1, 2, 4, 1, 2, 2, 1, 2, 1,
  144.     2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0,
  145.  
  146.     /*1981*/
  147.     1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0,
  148.     2, 1, 2, 1, 3, 2, 1, 1, 2, 2, 1, 2, 2,
  149.     2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0,
  150.     2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 3, 2, 2,
  151.     1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0,
  152.     1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 0,
  153.     2, 1, 2, 2, 1, 2, 3, 2, 2, 1, 2, 1, 2,
  154.     1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0,
  155.     2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0,
  156.     1, 2, 1, 1, 2, 3, 1, 2, 1, 2, 2, 2, 2,
  157.  
  158.     /*1991*/
  159.     1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 0,
  160.     1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0,
  161.     1, 2, 2, 3, 2, 1, 2, 1, 1, 2, 1, 2, 1,
  162.     2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0,
  163.     1, 2, 2, 1, 2, 2, 1, 2, 3, 2, 1, 1, 2,
  164.     1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0,
  165.     1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0,
  166.     2, 1, 1, 2, 1, 3, 2, 2, 1, 2, 2, 2, 1,
  167.     2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 0,
  168.     2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 0,
  169.  
  170.     /*2001*/
  171.     2, 2, 2, 1, 3, 2, 1, 1, 2, 1, 2, 1, 2,
  172.     2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0,
  173.     2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 0,
  174.     1, 2, 3, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2,
  175.     1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0,
  176.     1, 1, 2, 1, 2, 1, 2, 3, 2, 2, 1, 2, 2,
  177.     1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0,
  178.     2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 0,
  179.     2, 2, 1, 1, 2, 3, 1, 2, 1, 2, 1, 2, 2,
  180.     2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  181.  
  182.     /*2011*/
  183.     2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0,
  184.     2, 1, 2, 4, 2, 1, 2, 1, 1, 2, 1, 2, 1,
  185.     2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0,
  186.     1, 2, 1, 2, 1, 2, 1, 2, 2, 3, 2, 1, 2,
  187.     1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 0,
  188.     1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 0,
  189.     2, 1, 1, 2, 1, 3, 2, 1, 2, 1, 2, 2, 2,
  190.     1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0,
  191.     2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0,
  192.     2, 1, 2, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2,
  193.  
  194.     /*2021*/
  195.     1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0,
  196.     2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 0,
  197.     1, 2, 3, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2,
  198.     1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0,
  199.     2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 1,
  200.     2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0,
  201.     1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 0,
  202.     1, 2, 2, 1, 2, 3, 1, 2, 1, 1, 2, 2, 1,
  203.     2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 0,
  204.     1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 0,
  205.  
  206.     /*2031*/
  207.     2, 1, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2, 1,
  208.     2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0,
  209.     1, 2, 1, 1, 2, 1, 2, 3, 2, 2, 2, 1, 2,
  210.     1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0,
  211.     2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 0,
  212.     2, 2, 1, 2, 1, 1, 4, 1, 1, 2, 1, 2, 2,
  213.     2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0,
  214.     2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 0,
  215.     2, 2, 1, 2, 2, 3, 2, 1, 2, 1, 2, 1, 1,
  216.     2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0,
  217.  
  218.     /*2041*/
  219.     2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0,
  220.     1, 2, 3, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2,
  221.     1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0
  222. };
  223.  
  224. Int16 month[12] = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  225.  
  226. //
  227. //  solarDay : the solar day to be converted
  228. //  leapyes  : leap yes or no(0/1)
  229. //
  230. int sol2lun(int syear, int smonth, int sday, DateTimeType *lunar, int *leapyes)
  231. {
  232.     int lyear, lmonth, lday;      /* calculated lunar date */
  233.     int m1, m2, i, j, jcount, ll, m0;
  234.     int dt[163];
  235.     long td, td0, td1, td2, k11;
  236.       
  237.     if ( syear < 1881 || syear > 2043 ) return -1;
  238.     if ( smonth < 1 || smonth > 12 ) return -1;
  239.     if ( sday < 1 || sday > 31 ) return -1;
  240.     if ( syear == 1881 && smonth == 1 && sday < 30 ) return -1;
  241.  
  242.  
  243.     for(i=0; i<163; i++) {
  244.         dt[i] = 0;
  245.         for(j=0; j<12; j++) {
  246.             switch(convertIndex[i][j])
  247.             {
  248.             case 1:
  249.             case 3:
  250.                 dt[i] = dt[i] + 29;
  251.                 break;
  252.             case 2:
  253.             case 4:
  254.                 dt[i] = dt[i] + 30;
  255.             }
  256.         }
  257.         switch(convertIndex[i][12])
  258.         {
  259.         case 0:
  260.             break;
  261.         case 1:
  262.         case 3:
  263.             dt[i] = dt[i] + 29;
  264.             break;
  265.         case 2:
  266.         case 4:
  267.             dt[i] = dt[i] + 30;
  268.             break;
  269.         }
  270.     }
  271.  
  272.     /* 1. 1. 1. - 1910. 2. 10. */
  273.     td1 = 1880*365L + 1880/4 - 1880/100 + 1880/400 + 30;
  274.     /* ## 1. 1. 1. - syear. smonth. sday. ## */
  275.     k11 = (long)(syear-1);
  276.     td2 = k11*365L + k11/4L - k11/100L + k11/400L;
  277.     ll = syear%400==0 || (syear%100!=0 && syear%4==0);
  278.     if(ll) month[1] = 29;
  279.     else   month[1] = 28;
  280.     if( sday > month[smonth-1] ) {                   /* Input */
  281.         return -1;
  282.     }
  283.     for(i=0; i<smonth-1; i++) td2 = td2 + (long)month[i];
  284.     td2 = td2 + (long)sday;
  285.  
  286.     /* ## 1881. 1. 30. - syear. smonth. sday. ## */
  287.     td = td2 - td1 + 1;
  288.  
  289.     /* ## Lunar Year Caculation ## */
  290.     td0 = (long)dt[0];
  291.     for(i=0; i<163; i++) {
  292.         if( td <= td0 ) break;
  293.         td0 = td0 + (long)dt[i+1];
  294.     }
  295.     lyear = i + 1881;  /* Calculated Lunar Year */
  296.  
  297.     /* ## Lunar Month Calculation ## */
  298.     td0 = td0 - (long)dt[i];
  299.     td = td - td0;
  300.     if(convertIndex[i][12] != 0) jcount = 13;
  301.     else               jcount = 12;
  302.     m2 = 0;
  303.     for(j=0; j<jcount; j++) {
  304.         if( convertIndex[i][j] <=2 ) m2++;
  305.         if( convertIndex[i][j] <=2 ) m1 = convertIndex[i][j] + 28;
  306.         else               m1 = convertIndex[i][j] + 26;
  307.         if( td <= (long)m1 ) break;
  308.         td = td - (long)m1;
  309.     }
  310.     m0 = j;
  311.     lmonth = m2;  /* Calculated Lunar Month */
  312.  
  313.     lday = td;  /* Calculated Lunar Day */
  314.  
  315.     lunar->year = lyear; lunar->month = lmonth; lunar->day = lday;
  316.     if( (int)convertIndex[lyear-1881][12] != 0 &&
  317.         (int)convertIndex[lyear-1881][m0] > 2 ) *leapyes = 1;
  318.     else *leapyes = 0;
  319.     
  320.     return 0;
  321. }
  322.