X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Futil.c;h=0d64fc4b2bb70598a4ccb26bb275a64f49d6385d;hb=296fd1bb5f87b1961e98c7ea4c224219012f7161;hp=55cd265a14b45812ea66a743f39ff139f83303f5;hpb=78e336e0f67c12e154121d293aeaca4d7c15c17a;p=lackey diff --git a/src/util.c b/src/util.c index 55cd265..0d64fc4 100644 --- a/src/util.c +++ b/src/util.c @@ -1,105 +1,167 @@ -/* Time Keeping Bugs Abound! */ +/* + * Copyright (C) 2012-2013 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 . + */ + +#define _XOPEN_SOURCE +#define _XOPEN_SOURCE_EXTENDED #include +#include +#include +#include +#include "date.h" +#include "cal.h" +#include "view.h" #include "util.h" +/* For testing */ +#pragma weak COMPACT + +/* Static data */ +static FILE *debug_fd = NULL; + /* Helper functions */ -static int is_leap_year(year_t year) +static void message(FILE *output_fd, const char *prefix, const char *fmt, va_list ap) { - return (year % 400 == 0) ? 1 : - (year % 100 == 0) ? 0 : - (year % 4 == 0) ? 1 : 0; -} + va_list tmp; -static 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 < 3) - year--; - int start = year + year / 4 - - year / 100 - + year / 400 - + tmp[month]; - return (start + day) % 7; -} + /* 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"); + } -/* Time functions */ -int days_in_year(year_t year) -{ - return 365 + is_leap_year(year); -} + /* 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"); + } -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; + /* Log to status bar */ + if (&COMPACT && stdscr) { + int rev = COMPACT ? A_BOLD : 0; + va_copy(tmp, ap); + if (!COMPACT) + mvhline(LINES-2, 0, ACS_HLINE, COLS); + move(LINES-1, 0); + attron(COLOR_PAIR(COLOR_ERROR) | rev); + vwprintw(stdscr, fmt, tmp); + attroff(COLOR_PAIR(COLOR_ERROR) | rev); + if (!COMPACT) + clrtoeol(); + } } -int weeks_in_month(year_t year, month_t month) +/* Initialize */ +void util_init(void) { - int start = start_of_month(year, month); - int days = days_in_month(year, month); - return ((start + days)-1) / 7 + 1; + debug_fd = fopen("/tmp/lackey.log", "w+"); } -wday_t start_of_month(year_t year, month_t month) +/* String functions */ +void strsub(char *str, char find, char repl) { - return day_of_week(year, month, 1); + for (char *cur = str; *cur; cur++) + if (*cur == find) + *cur = repl; } -/* Debug functions */ -const char *month_to_str(month_t month) +char *strcopy(const char *str) { - static const char *map[] = - { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", }; - return map[month]; + if (str == NULL) + return NULL; + return strdup(str); } -const char *month_to_string(month_t month) + +int match(const char *a, const char *b) { - static const char *map[] = - { "January", "February", "March", "April", - "May", "June", "July", "August", - "September", "October", "November", "December" }; - return map[month]; + if (a == b) + return 1; + if (!a || !b) + return 0; + return !strcmp(a, b); } -const char *day_to_st(wday_t day) +/* Memory functions */ +void *alloc0(int size) { - static const char *map[] = - { "Su","Mo", "Tu", "We", "Th", "Fr", "Sa" }; - return map[day]; + void *data = calloc(1, size); + if (!data) + error("memory allocation failed"); + return data; } -const char *day_to_str(wday_t day) + +/* File functions */ +char *read_file(const char *path, int *len) { - static const char *map[] = - { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - return map[day]; + /* we could use stat, but we'll try to be portable */ + FILE *fd = fopen(path, "rt+"); + if (!fd) + return NULL; + + int block = 512; // read size + int size = 512; // buffer size + int slen = 0; // string length + char *buf = malloc(size); + if (!buf) + goto err; + + while (!feof(fd)) { + if (slen + block + 1 > size) { + size *= 2; + buf = realloc(buf, size); + if (!buf) + goto err; + } + slen += fread(&buf[slen], 1, block, fd); + buf[slen] = '\0'; + } + +err: + if (len) + *len = slen; + fclose(fd); + return buf; } -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]; + 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); }