if (ctl->header_hint || ctl->header_year) {
for (i = month; i; i = i->next) {
- sprintf(out, "%s", ctl->full_month[i->month - 1]);
+ snprintf(out, sizeof(out), "%s", ctl->full_month[i->month - 1]);
center(out, ctl->week_width - 1, i->next == NULL ? 0 : ctl->gutter_width);
}
if (!ctl->header_year) {
my_putstring("\n");
for (i = month; i; i = i->next) {
- sprintf(out, "%04d", i->year);
+ snprintf(out, sizeof(out), "%04d", i->year);
center(out, ctl->week_width - 1, i->next == NULL ? 0 : ctl->gutter_width);
}
}
} else {
for (i = month; i; i = i->next) {
- sprintf(out, "%s %04d", ctl->full_month[i->month - 1], i->year);
+ snprintf(out, sizeof(out), "%s %04d", ctl->full_month[i->month - 1], i->year);
center(out, ctl->week_width - 1, i->next == NULL ? 0 : ctl->gutter_width);
}
}
for (i = month; i; i = i->next) {
if (ctl->weektype) {
if (ctl->julian)
- sprintf(out, "%*s%s", (int)ctl->day_width - 1, "", day_headings);
+ snprintf(out, sizeof(out), "%*s%s", (int)ctl->day_width - 1, "", day_headings);
else
- sprintf(out, "%*s%s", (int)ctl->day_width, "", day_headings);
+ snprintf(out, sizeof(out), "%*s%s", (int)ctl->day_width, "", day_headings);
my_putstring(out);
} else
my_putstring(day_headings);
if (i->next != NULL) {
- sprintf(out, "%*s", ctl->gutter_width, "");
+ snprintf(out, sizeof(out), "%*s", ctl->gutter_width, "");
my_putstring(out);
}
}
if (0 < i->weeks[week_line]) {
if ((ctl->weektype & WEEK_NUM_MASK) ==
i->weeks[week_line])
- sprintf(out, "%s%2d%s", Senter, i->weeks[week_line],
- Sexit);
+ snprintf(out, sizeof(out), "%s%2d%s",
+ Senter, i->weeks[week_line],
+ Sexit);
else
- sprintf(out, "%2d", i->weeks[week_line]);
+ snprintf(out, sizeof(out), "%2d", i->weeks[week_line]);
} else
- sprintf(out, "%2s", "");
+ snprintf(out, sizeof(out), "%2s", "");
my_putstring(out);
skip = ctl->day_width;
} else
d < DAYS_IN_WEEK * week_line + DAYS_IN_WEEK; d++) {
if (0 < i->days[d]) {
if (reqday == i->days[d])
- sprintf(out, "%*s%s%*d%s", skip - (ctl->julian ? 3 : 2),
+ snprintf(out, sizeof(out), "%*s%s%*d%s",
+ skip - (ctl->julian ? 3 : 2),
"", Senter, (ctl->julian ? 3 : 2),
i->days[d], Sexit);
else
- sprintf(out, "%*d", skip, i->days[d]);
+ snprintf(out, sizeof(out), "%*d", skip, i->days[d]);
} else
- sprintf(out, "%*s", skip, "");
+ snprintf(out, sizeof(out), "%*s", skip, "");
my_putstring(out);
if (skip < (int)ctl->day_width)
skip++;
}
if (i->next != NULL) {
- sprintf(out, "%*s", ctl->gutter_width, "");
+ snprintf(out, sizeof(out), "%*s", ctl->gutter_width, "");
my_putstring(out);
}
}
static void monthly(const struct cal_control *ctl)
{
struct cal_month m1,m2,m3, *m;
- int i, rows, new_month, month = ctl->req.start_month ? ctl->req.start_month : ctl->req.month;
+ int i, rows, month = ctl->req.start_month ? ctl->req.start_month : ctl->req.month;
int32_t year = ctl->req.year;
/* cal -3, cal -Y --span, etc. */
if (ctl->span_months) {
- new_month = month - ctl->num_months / 2;
+ int new_month = month - ctl->num_months / 2;
if (new_month < 1) {
- month = new_month + MONTHS_IN_YEAR;
- year--;
- }
- else
+ new_month *= -1;
+ year -= (new_month / MONTHS_IN_YEAR) + 1;
+
+ if (new_month > MONTHS_IN_YEAR)
+ new_month %= MONTHS_IN_YEAR;
+ month = MONTHS_IN_YEAR - new_month;
+ } else
month = new_month;
}
year_width--;
if (ctl->header_year) {
- sprintf(out, "%04d", ctl->req.year);
+ snprintf(out, sizeof(out), "%04d", ctl->req.year);
center(out, year_width, 0);
my_putstring("\n\n");
}