date_t nextHebDate( date_t dth ) { dth.dd++; if (dth.dd > max_days_in_heb_month (dth.mm, dth.yy)) { if (dth.mm == MONTHS_IN_HEB (dth.yy)) { dth.mm = NISAN; dth.dd = 1; } else { dth.mm++; dth.dd = 1; if (dth.mm == TISHREI) { dth.yy++; } } } return dth; }
void init_yahrtzeits( int hyear ) { holstorep_t tmpholp; char *s, *monthStr, *eventStr, nextChar; int index, inMonth, inDay, inYear, lineNum = 1; date_t hDeath, gDeath; initStr (&s, MAX_LINE_LEN); initStr (&monthStr, MAX_LINE_LEN); rewind (yFile); nextChar = (char) getc (yFile); /* priming getc */ for (; !feof (yFile); lineNum++, nextChar = (char) getc (yFile)) { /* force an EOF */ ungetc (nextChar, yFile); if (!fgets (s, MAX_LINE_LEN, yFile)) { warn ("yahrtzeit file read error. Skipping line %s", hc_itoa (lineNum)); continue; } if (s[0] == '\n') /* blank line */ continue; if (sscanf (s, "%s %d %d%n", monthStr, &inDay, &inYear, &index) < 3) { warn ("Error in yahrtzeit file. Skipping line %s", hc_itoa (lineNum)); continue; } if (!isAllNums (monthStr)) { warn ("Non-numeric month in yahrtzeit file. Skipping line %s", hc_itoa (lineNum)); continue; } sscanf (monthStr, "%d", &inMonth); if (inMonth > 12 || inMonth < 1 || inDay < 1 || inDay > MonthLengths[LEAP (inYear)][inMonth]) { warn ("Date out of range in yahrtzeit file. Skipping line %s", hc_itoa (lineNum)); continue; } gDeath.dd = inDay; gDeath.mm = inMonth; gDeath.yy = inYear; hDeath = abs2hebrew (greg2abs (gDeath)); /* If it's Heshvan 30 it depends on the first anniversary; if that was not Heshvan 30, use the day before Kislev 1. */ if (hDeath.mm == CHESHVAN && hDeath.dd == 30 && !long_cheshvan (hDeath.yy + 1)) { hDeath.dd = 1; hDeath.mm = KISLEV; hDeath.yy = hyear; hDeath = abs2hebrew (hebrew2abs (hDeath) - 1L); } /* If it's Kislev 30 it depends on the first anniversary; if that was not Kislev 30, use the day before Teveth 1. */ else if (hDeath.mm == KISLEV && hDeath.dd == 30 && !short_kislev (hDeath.yy + 1)) { hDeath.dd = 1; hDeath.mm = TEVET; hDeath.yy = hyear; hDeath = abs2hebrew (hebrew2abs (hDeath) - 1L); } /* If it's Adar II, use the same day in last month of year (Adar or Adar II). */ else if (hDeath.mm == ADAR_II) { hDeath.mm = MONTHS_IN_HEB (hyear); } /* If it's the 30th in Adar I and year is not a leap year (so Adar has only 29 days), use the last day in Shevat. */ else if (hDeath.mm == ADAR_I && hDeath.dd == 30 && !LEAP_YR_HEB (hyear)) { hDeath.dd = 30; hDeath.mm = SHVAT; } /* In all other cases, use the normal anniversary of the date of death. */ /* advance day to rosh chodesh if needed */ if (hDeath.mm == CHESHVAN && hDeath.dd == 30 && !long_cheshvan(hyear)) { hDeath.mm = KISLEV; hDeath.dd = 1; } else if (hDeath.mm == KISLEV && hDeath.dd == 30 && short_kislev(hyear)) { hDeath.mm = TEVET; hDeath.dd = 1; } eventStr = s + index + 1; /* get the name of the event */ /* if (eventStr[strlen(eventStr)-1] == '\n') */ eventStr[strlen (eventStr) - 1] = '\0'; /* chop off the \n */ /* store the holiday in the LUT */ tmpholp = getHolstorep (); initStr (&tmpholp->name, MAX_LINE_LEN); strcpy (tmpholp->name, eventStr); /* load the user holiday into it. */ tmpholp->typeMask = USER_EVENT; PushHoliday (tmpholp, &var_holidays[hDeath.mm][hDeath.dd]); } }
void main_calendar( long todayAbs, long endAbs) /* the range of the desired printout */ { date_t todayGreg, todayHeb; holstorep_t holi_start,holip; /* a list of holidays for today */ year_t theYear; char *omerStr ; int omer, day_of_week, first_weekday, returnedMask; int omer_today, sedra_today, candle_today, holidays_today, molad_today; molad_t moladNext; int monthNext; int today_zemanim, i_zman; int num_zmanim = sizeof (zemanim) / sizeof (struct _zman); char buffer[80]; /* Used to decide whether a particular type of daily info should be included in the abbreviated view. In abbreviated mode things like sunrise, daf, omer are printed once a week. */ #define INCLUDE_TODAY(_sw) \ ( (_sw) && ((!abbrev_sw) || (first_weekday == day_of_week))) todayHeb = abs2hebrew (todayAbs); todayGreg = abs2greg (todayAbs); theYear = yearData (todayHeb.yy); /* plug in light_offset before starting the loop */ for (i_zman = 0; i_zman < num_zmanim; i_zman ++) if (zemanim[i_zman].flags == ZMAN_CANDLES_BEFORE) zemanim[i_zman].min_offset = light_offset; else if (zemanim[i_zman].flags == ZMAN_CANDLES_AFTER || zemanim[i_zman].flags == ZMAN_HAVDALAH ) zemanim[i_zman].min_offset = havdalah_minutes; /*============== Main Year Loop ==============*/ reset_Omer (todayHeb.yy); if (sedraAllWeek_sw || sedrot_sw) reset_sedra (todayHeb.yy); first_weekday = day_of_week = (int) (todayAbs % 7L); while (todayAbs <= endAbs) { /* get the holidays for today */ returnedMask = getHebHolidays (todayHeb, &holip); sedra_today = sedraAllWeek_sw || (sedrot_sw && (day_of_week == SAT)); omer_today = printOmer_sw && (todayAbs >= beginOmer) && (todayAbs <= endOmer); holidays_today = holip && (!noHolidays_sw || (returnedMask & USER_EVENT)); molad_today = printMolad_sw && (day_of_week == SAT) && (todayHeb.dd >= 23 && todayHeb.dd <= 29) && (todayHeb.mm != ELUL); /* no birkat hachodesh before rosh hashana */ today_zemanim = 0; if (INCLUDE_TODAY(default_zemanim)) today_zemanim |= default_zemanim; if (candleLighting_sw) { if (day_of_week == FRI) today_zemanim |= ZMAN_CANDLES_BEFORE; else { if (returnedMask & LIGHT_CANDLES) today_zemanim |= (day_of_week == SAT) ? ZMAN_CANDLES_AFTER : ZMAN_CANDLES_BEFORE; else if ((returnedMask & LIGHT_CANDLES_TZEIS) && ! (returnedMask & YOM_TOV_ENDS)) today_zemanim |= ZMAN_CANDLES_AFTER; } if (!(today_zemanim & (ZMAN_CANDLES_BEFORE | ZMAN_CANDLES_AFTER)) && (day_of_week == SAT || returnedMask & YOM_TOV_ENDS)) today_zemanim |= ZMAN_HAVDALAH; if (!(today_zemanim & (ZMAN_CANDLES_BEFORE)) && (returnedMask & CHANUKAH_CANDLES)) today_zemanim |= ZMAN_CANDLES_AFTER; /* even if havdalah */ } if (INCLUDE_TODAY(printHebDates_sw) || ((printSomeHebDates_sw || printHebDates_sw) && (holidays_today || sedra_today || omer_today || (today_zemanim & (ZMAN_CANDLES_BEFORE|ZMAN_CANDLES_AFTER|ZMAN_HAVDALAH))))) { PrintGregDate (todayGreg); printf ("%d%s of %s, %d\n", todayHeb.dd, /* print the hebrew date */ numSuffix( todayHeb.dd ), _(hMonths[LEAP_YR_HEB( todayHeb.yy )][todayHeb.mm].name), todayHeb.yy); } if (printSunriseSunset_sw) { print_sunrise_sunset(todayGreg); } /* print the sedra, if desired */ if (sedra_today) { char sedraStr[40]; int foundSedra = sedra( todayAbs, sedraStr, 40 ); if (foundSedra) { PrintGregDate( todayGreg ); printf( "%s %s\n", _("Parashat"), sedraStr ); } } /* print today's holidays */ holi_start=holip; /* store the head of the list for freeing */ for (; holip; holip = holip->next) { if (!noHolidays_sw || (holip->typeMask & USER_EVENT)) { PrintGregDate( todayGreg ); puts( holip->name ); } } /* Print the Omer */ if (INCLUDE_TODAY(omer_today)) { initStr (&omerStr, NM_LEN); omer = (int) (todayAbs - beginOmer + 1L); if (!tabs_sw) { strncat (omerStr, hc_itoa (omer), NM_LEN); strncat (omerStr, numSuffix (omer), NM_LEN); strncat (omerStr, " day of the Omer", NM_LEN); } else { strncat (omerStr, "Omer: ", NM_LEN); strncat (omerStr, hc_itoa (omer), NM_LEN); } PrintGregDate (todayGreg); printf ("%s\n", omerStr); free( omerStr ); } if (INCLUDE_TODAY(dafYomi_sw)) hebcal_dafyomi(&todayGreg); /* Print CandleLighting times */ if (today_zemanim) { print_candlelighting_times (today_zemanim, day_of_week, todayGreg); } /* Print Molad */ if (molad_today) { PrintGregDate (todayGreg); monthNext = (todayHeb.mm == MONTHS_IN_HEB(todayHeb.yy) ? 1 : todayHeb.mm + 1); moladNext = get_molad(todayHeb.yy, monthNext); printf ("Molad %s: %s, %d minutes and %d chalakim after %d %s\n", hMonths[LEAP_YR_HEB(todayHeb.yy)][monthNext].name, ShortDayNames[dayOfWeek(abs2greg(moladNext.day))], (int) moladNext.chalakim / 18, moladNext.chalakim % 18, (moladNext.hour > 12 ? moladNext.hour - 12 : moladNext.hour), (moladNext.hour > 12 ? "PM" : "AM") ); } incHebGregDate (&todayHeb, &todayGreg, &todayAbs, &day_of_week, &theYear); # ifdef PLUG_LEAKS free_holidays(*holip); # endif } #undef INCLUDE_TODAY }