+char* month_name[][13] =
+{ /* CAL_GREGORIAN */
+ { "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
+ "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" },
+ /* CAL_JULIAN */
+ { "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
+ "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" },
+ /* CAL_JEWISH */
+ { "TSH", "CSH", "KSL", "TVT", "SHV", "ADR", "ADS",
+ "NSN", "IYR", "SVN", "TMZ", "AAV", "ELL" },
+ /* CAL_FRENCH_REF */
+ { "VEND", "BRUM", "FRIM", "NIVO", "PLUV", "VENT", "GERM",
+ "FLOR", "PRAI", "MESS", "THER", "FRUC", "COMP" }
+};
+
+typedef long int (*to_sdn_func_type) (int, int, int);
+typedef void (*from_sdn_func_type) (long int, int*, int*, int*);
+
+to_sdn_func_type to_sdn_func[] = {
+ &GregorianToSdn, /* CAL_GREGORIAN */
+ &JulianToSdn, /* CAL_JULIAN */
+ &JewishToSdn, /* CAL_JEWISH */
+ &FrenchToSdn /* CAL_FRENCH_REV */
+};
+
+from_sdn_func_type from_sdn_func[] = {
+ &SdnToGregorian, /* CAL_GREGORIAN */
+ &SdnToJulian, /* CAL_JULIAN */
+ &SdnToJewish, /* CAL_JEWISH */
+ &SdnToFrench /* CAL_FRENCH_REV */
+};
+
+long int checkedCalToSdn(Calendar_type cal, int year, int month, int day)
+{
+ int y, m, d;
+ long int sdn = (*to_sdn_func[cal])(year,month, day);
+ if (sdn <= 0)
+ return -1;
+ else {
+ (*from_sdn_func[cal])(sdn, &y, &m, &d);
+ if ((year == y) && (month == m) && (day == d))
+ return sdn;
+ else
+ return -1;
+ }
+}
+
+int checkedSdnToCal(Calendar_type cal, long int sdn,
+ int* year, int* month, int* day)
+{
+ (*from_sdn_func[cal])(sdn, year, month, day);
+ if (*year > 0 && *month > 0 && *day > 0)
+ return 1;
+ else
+ return 0;
+}
+