/** * @brief cal - print a calendar * * @copyright * This file is part of ToaruOS and is released under the terms * of the NCSA / University of Illinois License - see LICENSE.md * Copyright (C) 2019 K. Lange */ #include #include #include #include #include const char * month_names[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", }; int days_in_months[] = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }; int main(int argc, char * argv[]) { if (argc > 1) { fprintf(stderr, "%s: arguments not currently supported\n", argv[0]); return 1; } struct timeval now; gettimeofday(&now, NULL); struct tm actual; struct tm * timeinfo; timeinfo = localtime((time_t *)&now.tv_sec); memcpy(&actual, timeinfo, sizeof(struct tm)); timeinfo = &actual; char month[20]; sprintf(month, "%s %d", month_names[timeinfo->tm_mon], timeinfo->tm_year + 1900); int len = (20 - strlen(month)) / 2; while (len > 0) { printf(" "); len--; } /* Heading */ printf("%s\n", month); printf("Su Mo Tu We Th Fr Sa\n"); /* Now's the fun part. */ int days_in_month = days_in_months[timeinfo->tm_mon]; if (days_in_month == 0) { /* How many days in February? */ struct tm tmp; memcpy(&tmp, timeinfo, sizeof(struct tm)); tmp.tm_mday = 29; tmp.tm_hour = 12; time_t tmp3 = mktime(&tmp); struct tm * tmp2 = localtime(&tmp3); if (tmp2->tm_mday == 29) { days_in_month = 29; } else { days_in_month = 28; } } int mday = timeinfo->tm_mday; int wday = timeinfo->tm_wday; /* 0 == sunday */ while (mday > 1) { mday--; wday = (wday + 6) % 7; } for (int i = 0; i < wday; ++i) { printf(" "); } while (mday <= days_in_month) { if (mday == timeinfo->tm_mday) { printf("\033[7m%2d\033[0m ", mday); } else { printf("%2d ", mday); } if (wday == 6) { printf("\n"); } mday += 1; wday = (wday + 1) % 7; } if (wday != 0) { printf("\n"); } return 0; }