X-Git-Url: http://pileus.org/git/?p=lackey;a=blobdiff_plain;f=src%2Futil.c;h=d74a7469d0914c23a909140066c95ec3d501775d;hp=24a8f3706f0108d2bcc06e07af1cd34e20774414;hb=39c440444ff38c0e1702209c67cf018b92c71882;hpb=9d6df8f874cef59df16086c71031db2ba0267d3a diff --git a/src/util.c b/src/util.c index 24a8f37..d74a746 100644 --- a/src/util.c +++ b/src/util.c @@ -1,63 +1,162 @@ /* -#include - * 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 . */ +#define _XOPEN_SOURCE +#define _XOPEN_SOURCE_EXTENDED + #include #include +#include #include -#include #include "date.h" #include "cal.h" #include "view.h" +#include "util.h" + +#pragma weak view_exit +#pragma weak view_debug /* Static data */ static FILE *debug_fd = NULL; +/* View debugging */ +extern void view_debug(const char *fmt, va_list ap); + +/* Helper functions */ +static void message(FILE *output_fd, const char *prefix, const char *fmt, va_list ap) +{ + va_list tmp; + + /* 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); + } +} + /* Initialize */ void util_init(void) { debug_fd = fopen("/tmp/lackey.log", "w+"); } -/* Debugging functions */ -int debug(char *fmt, ...) +/* String functions */ +void strsub(char *str, char find, char repl) { - int rval; - va_list ap; + for (char *cur = str; *cur; cur++) + if (*cur == find) + *cur = repl; +} - /* Log to debug file */ - if (debug_fd) { - va_start(ap, fmt); - vfprintf(debug_fd, "debug: ", ap); - rval = vfprintf(debug_fd, fmt, ap); - } +char *strcopy(const char *str) +{ + if (str == NULL) + return NULL; + return strdup(str); +} - /* Log to status bar */ - if (stdscr) { - va_start(ap, fmt); - mvhline(LINES-2, 0, ACS_HLINE, COLS); - move(LINES-1, 0); - attron(COLOR_PAIR(COLOR_ERROR)); - vwprintw(stdscr, fmt, ap); - attroff(COLOR_PAIR(COLOR_ERROR)); - clrtoeol(); +int match(const char *a, const char *b) +{ + if (a == b) + return 1; + if (!a || !b) + return 0; + return !strcmp(a, b); +} + +/* Memory functions */ +void *alloc0(int size) +{ + void *data = calloc(1, size); + if (!data) + error("memory allocation failed"); + return data; +} + +/* File functions */ +char *read_file(const char *path, int *len) +{ + /* 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; +} + +/* Debugging functions */ +void debug(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + message(NULL, "debug", fmt, ap); + va_end(ap); +} + +void error(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fflush(stdout); + fflush(stderr); + message(stderr, "error", fmt, ap); va_end(ap); - return rval; + if (view_exit) + view_exit(); + exit(-1); }