X-Git-Url: http://pileus.org/git/?p=lackey;a=blobdiff_plain;f=src%2Futil.c;h=1ebecfc02dae764fead047a08765eecbc4c0e3ca;hp=3d6aa200f542e830e77fbe56dc3010dd220a1d83;hb=569a0db79c00169e15d5abed2a82f28d1b2391c4;hpb=ee82a6d611fb17b94462b7b2a87b0b5cc3ec1178 diff --git a/src/util.c b/src/util.c index 3d6aa20..1ebecfc 100644 --- a/src/util.c +++ b/src/util.c @@ -1,136 +1,160 @@ /* - * Copyright (C) 2012 Andy Spencer - * + * 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 . */ -/* Time Keeping Bugs Abound! */ +#define _XOPEN_SOURCE +#define _XOPEN_SOURCE_EXTENDED #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; -} +#pragma weak view_debug -int days_in_year(year_t year) -{ - return 365 + is_leap_year(year); -} +/* Static data */ +static FILE *debug_fd = NULL; -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; -} +/* View debugging */ +extern void view_debug(const char *fmt, va_list ap); -int weeks_in_month(year_t year, month_t month) +/* Helper functions */ +static void message(FILE *output_fd, const char *prefix, const char *fmt, va_list ap) { - int start = start_of_month(year, month); - int days = days_in_month(year, month); - return ((start + days)-1) / 7 + 1; -} + va_list tmp; -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"); + fflush(output_fd); + } + + /* 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"); + fflush(debug_fd); + } + + /* Log to status bar */ + if (&view_debug) { + va_copy(tmp, ap); + view_debug(fmt, tmp); + } } -wday_t start_of_month(year_t year, month_t month) +/* Initialize */ +void util_init(void) { - return day_of_week(year, month, 1); + debug_fd = fopen("/tmp/lackey.log", "w+"); } -void add_days(year_t *year, month_t *month, day_t *day, int days) +/* String functions */ +void strsub(char *str, char find, char repl) { - 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; + 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%12]; + 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%12]; + 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%7]; + 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%7]; + /* 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%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); + view_exit(); + exit(-1); }