X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Fcommon.h;fp=yarrg%2Fcommon.h;h=9d06fabf9a55c79b8a1878a649b8db03f6aaa083;hb=c68fb80a6bbf7acbcac4b2cb2143f5fea745cd2b;hp=0000000000000000000000000000000000000000;hpb=b9cce976550d000f15e5a8f2b690740bdae1e468;p=ypp-sc-tools.db-live.git diff --git a/yarrg/common.h b/yarrg/common.h new file mode 100644 index 0000000..9d06fab --- /dev/null +++ b/yarrg/common.h @@ -0,0 +1,181 @@ +/* + * useful common stuff, mostly error handling and debugging + */ +/* + * This is part of ypp-sc-tools, a set of third-party tools for assisting + * players of Yohoho Puzzle Pirates. + * + * Copyright (C) 2009 Ian Jackson + * + * 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 . + * + * Yohoho and Puzzle Pirates are probably trademarks of Three Rings and + * are used without permission. This program is not endorsed or + * sponsored by Three Rings. + */ + +#ifndef COMMON_H +#define COMMON_H + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +typedef struct { + int w,h; + char d[]; +} CanonImage; + + +/*----- debugging arrangements, rather contingent -----*/ + +typedef struct { + int x, y; +} Point; + +typedef struct { /* both inclusive */ + Point tl; + Point br; +} Rect; + +#define RECT_W(r) ((r).br.x - (r).tl.x + 1) +#define RECT_H(r) ((r).br.y - (r).tl.y + 1) + + + +#define DEBUG_FLAG_LIST \ + DF(findypp) \ + DF(pages) \ + DF(rect) \ + DF(pixmap) \ + DF(struct) \ + DF(ocr) \ + DF(rsync) \ + DF(structcolon) \ + DF(callout) + +enum { +#define DF(f) dbg__shift_##f, + DEBUG_FLAG_LIST +#undef DF +}; +enum { +#define DF(f) dbg_##f = 1 << dbg__shift_##f, + DEBUG_FLAG_LIST +#undef DF +}; + +unsigned debug_flags; + +#define DEBUGP(f) (!!(debug_flags & dbg_##f)) + +void debug_flush(void); +#define debug stderr + +const char *get_vardir(void); +const char *get_libdir(void); + +#define FMT(f,a) __attribute__((format(printf,f,a))) +#define SCANFMT(f,a) __attribute__((format(scanf,f,a))) +#define NORET __attribute__((noreturn)) + +#define DEFINE_VWRAPPERF(decls, funcf, otherattribs) \ + decls void funcf(const char *fmt, ...) FMT(1,2) otherattribs; \ + decls void funcf(const char *fmt, ...) { \ + va_list al; va_start(al,fmt); v##funcf(fmt,al); va_end(al); \ + } + +#define DEBUG_DEFINE_SOME_DEBUGF(fl,funcf) \ + static void v##funcf(const char *fmt, va_list al) { \ + if (DEBUGP(fl)) \ + vfprintf(debug,fmt,al); \ + } \ + DEFINE_VWRAPPERF(static, funcf, ) + +#define DEBUG_DEFINE_DEBUGF(fl) DEBUG_DEFINE_SOME_DEBUGF(fl,debugf) + + +/*---------- error handling ----------*/ + +void vfatal(const char *fmt, va_list) FMT(1,0) NORET; +void fatal(const char *fmt, ...) FMT(1,2) NORET; + +#define sysassert(what) \ + ((what) ? (void)0 : sysassert_fail(__FILE__, __LINE__, #what)) + +void sysassert_fail(const char *file, int line, const char *what) + __attribute__((noreturn)); + +void waitpid_check_exitstatus(pid_t pid, const char *what, int sigpipeok); + + +void *mmalloc(size_t sz); +void *mrealloc(void *p, size_t sz); + + +#define dbassert(x) ((x) ? (void)0 : dbfile_assertfail(__FILE__,__LINE__,#x)) +void dbfile_assertfail(const char *file, int line, const char *m) NORET; + +FILE *dbfile; +void dbfile_getsline(char *lbuf, size_t lbufsz, const char *file, int line); +int dbfile_open(const char *tpath); /* 0: ENOENT; 1: worked */ +int dbfile_gzopen(const char *tpath); /* 0: ENOENT; 1: worked */ +void dbfile_close(void); /* idempotent */ + +int dbfile_scanf(const char *fmt, ...) SCANFMT(1,2); +int dbfile_vscanf(const char *fmt, va_list al) SCANFMT(1,0); + +int gzopen(const char *zpath, int oflags, FILE **f_r, pid_t *pid_r, + const char *gziplevel /* 0 for read; may be 0, or "-1" etc. */); + /* returns errno value from open */ +void gzclose(FILE **f, pid_t *p, const char *what); + /* also OK with f==0, or p==-1 */ + +char *masprintf(const char *fmt, ...) FMT(1,2); + +#define EXECLP_HELPER(helper, ...) do{ \ + char *helper_path= masprintf("%s/%s",get_libdir(),helper); \ + execlp(helper_path,helper, __VA_ARGS__); \ + sysassert(errno==ENOENT); \ + fatal("Failed to find helper program %s.\n" \ + "(Are you in the correct directory?)", helper); \ + }while(0) + + +#define ARRAYSIZE(a) ((sizeof((a)) / sizeof((a)[0]))) +#define FILLZERO(obj) (memset(&(obj),0,sizeof((obj)))) + +#define STRING2(x) #x +#define STRING(x) STRING2(x) + +#endif /*COMMON_H*/