X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Futil.c;h=e3f3a43a8015cb630302d507b45c66f8f7b43a02;hb=035bf3a6553362883c2451c36afc7766002941a3;hp=688cc949813bfd6ba3667db026d17fadfbb6b8e1;hpb=f38a6d9028aa186d31710008d8bf86af5c341da1;p=lackey diff --git a/src/util.c b/src/util.c index 688cc94..e3f3a43 100644 --- a/src/util.c +++ b/src/util.c @@ -1,136 +1,100 @@ /* * Copyright (C) 2012 Andy Spencer - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -/* Time Keeping Bugs Abound! */ - #include -#include +#include +#include +#include +#include "date.h" +#include "cal.h" +#include "view.h" #include "util.h" -/* Time functions */ -int is_leap_year(year_t year) -{ - return (year % 400 == 0) ? 1 : - (year % 100 == 0) ? 0 : - (year % 4 == 0) ? 1 : 0; -} +/* Static data */ +static FILE *debug_fd = NULL; -int days_in_year(year_t year) +/* Helper functions */ +static void message(FILE *output_fd, const char *prefix, const char *fmt, va_list ap) { - return 365 + is_leap_year(year); -} + va_list tmp; -int days_in_month(year_t year, month_t month) -{ - static int mdays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - int days = mdays[month]; - if (month == FEB) - days += is_leap_year(year); - return days; -} - -int weeks_in_month(year_t year, month_t month) -{ - int start = start_of_month(year, month); - int days = days_in_month(year, month); - return ((start + days)-1) / 7 + 1; -} + /* Log to standard out */ + if (output_fd) { + va_copy(tmp, ap); + fprintf(output_fd, "%s: ", prefix); + vfprintf(output_fd, fmt, tmp); + fprintf(output_fd, "\n"); + } -wday_t day_of_week(year_t year, month_t month, day_t day) -{ - static int tmp[] = {0, 3, 2, 5, 0, 3, - 5, 1, 4, 6, 2, 4}; - if (month < MAR) - year--; - int start = year + year / 4 - - year / 100 - + year / 400 - + tmp[month]; - return (start + day + 1) % 7; -} + /* Log to debug file */ + if (debug_fd) { + va_copy(tmp, ap); + fprintf(debug_fd, "%s: ", prefix); + vfprintf(debug_fd, fmt, tmp); + fprintf(debug_fd, "\n"); + } -wday_t start_of_month(year_t year, month_t month) -{ - return day_of_week(year, month, 0); + /* Log to status bar */ + if (stdscr) { + va_copy(tmp, ap); + mvhline(LINES-2, 0, ACS_HLINE, COLS); + move(LINES-1, 0); + attron(COLOR_PAIR(COLOR_ERROR)); + vwprintw(stdscr, fmt, tmp); + attroff(COLOR_PAIR(COLOR_ERROR)); + clrtoeol(); + } } -void add_days(year_t *year, month_t *month, day_t *day, int days) +/* Initialize */ +void util_init(void) { - time_t time = mktime(&(struct tm){ - .tm_year = *year-1900, - .tm_mon = *month, - .tm_mday = *day+1, - .tm_hour = 12}); - time += days*24*60*60; - struct tm *tm = localtime(&time); - *year = tm->tm_year+1900; - *month = tm->tm_mon; - *day = tm->tm_mday-1; + debug_fd = fopen("/tmp/lackey.log", "w+"); } -/* Debug functions */ -const char *month_to_str(month_t month) -{ - static const char *map[] = - { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", }; - return map[month%12]; -} -const char *month_to_string(month_t month) +/* String functions */ +void strsub(char *str, char find, char repl) { - static const char *map[] = - { "January", "February", "March", "April", - "May", "June", "July", "August", - "September", "October", "November", "December" }; - return map[month%12]; + for (char *cur = str; *cur; cur++) + if (*cur == find) + *cur = repl; } -const char *day_to_st(wday_t day) -{ - static const char *map[] = - { "Su","Mo", "Tu", "We", "Th", "Fr", "Sa" }; - return map[day%7]; -} -const char *day_to_str(wday_t day) -{ - static const char *map[] = - { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - return map[day%7]; -} -const char *day_to_string(wday_t day) +/* Debugging functions */ +void debug(char *fmt, ...) { - static const char *map[] = - { "Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday" }; - return map[day%7]; + va_list ap; + va_start(ap, fmt); + message(NULL, "debug", fmt, ap); + va_end(ap); } -/* Test functions */ -void test_time(void) +void error(char *fmt, ...) { - printf("Year Month Start Weeks Days\n"); - for (int y = 2012; y <= 2012; y++) - for (int m = JAN; m <= DEC; m++) { - printf("%-5d", y); - printf("%-10s", month_to_string(m)); - printf("%-6s", day_to_str(start_of_month(y,m))); - printf("%-6d", weeks_in_month(y,m)); - printf("%-2d", days_in_month(y,m)); - printf("\n"); + va_list ap; + va_start(ap, fmt); + fflush(stdout); + fflush(stderr); + message(stderr, "error", fmt, ap); + va_end(ap); + if (stdscr) { + getch(); + endwin(); } + exit(-1); }