/* See LICENSE file for copyright and license details. */ #include #include #include #include #ifndef MAX #define MAX(A, B) ((A) > (B) ? (A) : (B)) #endif #ifndef MIN #define MIN(A, B) ((A) < (B) ? (A) : (B)) #endif #ifndef BETWEEN #define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) #endif #ifndef INTERSECT #define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ && MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) #endif #ifndef LENGTH #define LENGTH(X) (sizeof X / sizeof X[0]) #endif #ifndef TEXTW #define TEXTW(X) (draw_font_getwidth(draw, (X), False) + sp.lrpad) #endif #ifndef TEXTWM #define TEXTWM(X) (draw_font_getwidth(draw, (X), True) + sp.lrpad) #endif #ifndef NUMBERSMAXDIGITS #define NUMBERSMAXDIGITS 100 #endif #ifndef NUMBERSBUFSIZE #define NUMBERSBUFSIZE (NUMBERSMAXDIGITS * 2) + 1 #endif #ifndef MAXITEMLENGTH #define MAXITEMLENGTH 1024 #endif size_t sp_strncpy(char *restrict dst, const char *restrict src, size_t size); void die(const char *fmt, ...); void *ecalloc(size_t nmemb, size_t size); size_t sp_strncpy(char *restrict dst, const char *restrict src, size_t size) { int offset; offset = 0; if (size > 0) { while (*(src+offset) != '\0' ) { if (offset == size) { offset--; break; } *(dst+offset) = *(src+offset); offset++; } } *(dst+offset) = '\0'; while (*(src+offset) != '\0') offset++; return offset; } void die(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); if (fmt[0] && fmt[strlen(fmt)-1] == ':') { fputc(' ', stderr); perror(NULL); } else { fputc('\n', stderr); } exit(1); } void *ecalloc(size_t nmemb, size_t size) { void *p; if (!(p = calloc(nmemb, size))) die("calloc:"); return p; }