2023-01-20 23:17:30 +01:00
|
|
|
/* See LICENSE file for copyright and license details. */
|
2023-08-07 06:19:15 +02:00
|
|
|
|
2023-01-20 23:17:30 +01:00
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2023-08-07 06:19:15 +02:00
|
|
|
#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
|
2023-01-20 23:17:30 +01:00
|
|
|
|
2023-08-07 06:19:15 +02:00
|
|
|
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);
|
2023-01-20 23:17:30 +01:00
|
|
|
|
2023-06-12 03:39:29 +02:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2023-05-06 14:29:45 +02:00
|
|
|
void die(const char *fmt, ...) {
|
2023-05-08 23:00:45 +02:00
|
|
|
va_list ap;
|
2023-01-20 23:17:30 +01:00
|
|
|
|
2023-05-08 23:00:45 +02:00
|
|
|
va_start(ap, fmt);
|
|
|
|
vfprintf(stderr, fmt, ap);
|
|
|
|
va_end(ap);
|
2023-01-20 23:17:30 +01:00
|
|
|
|
2023-05-08 23:00:45 +02:00
|
|
|
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
|
|
|
|
fputc(' ', stderr);
|
|
|
|
perror(NULL);
|
|
|
|
} else {
|
|
|
|
fputc('\n', stderr);
|
|
|
|
}
|
2023-01-20 23:17:30 +01:00
|
|
|
|
2023-05-08 23:00:45 +02:00
|
|
|
exit(1);
|
2023-01-20 23:17:30 +01:00
|
|
|
}
|
2023-08-07 06:19:15 +02:00
|
|
|
|
|
|
|
void *ecalloc(size_t nmemb, size_t size) {
|
|
|
|
void *p;
|
|
|
|
|
|
|
|
if (!(p = calloc(nmemb, size)))
|
|
|
|
die("calloc:");
|
|
|
|
return p;
|
|
|
|
}
|