enowars5-service-stldoctor

STL-Analyzing A/D Service for ENOWARS5 in 2021
git clone https://git.sinitax.com/sinitax/enowars5-service-stldoctor
Log | Files | Refs | README | LICENSE | sfeed.txt

util.c (2129B)


      1#include "util.h"
      2
      3void*
      4checkp(void *p)
      5{
      6	if (!p) die("pointer assertion failed, OOM?\n");
      7	return p;
      8}
      9
     10void*
     11die(const char *fmtstr, ...)
     12{
     13	va_list ap;
     14
     15	va_start(ap, fmtstr);
     16	vprintf(fmtstr, ap);
     17	va_end(ap);
     18
     19	exit(EXIT_FAILURE);
     20}
     21
     22char*
     23aprintf(const char *fmtstr, ...)
     24{
     25	va_list ap, cpy;
     26	size_t nb;
     27	char *str;
     28
     29	va_copy(cpy, ap);
     30
     31	va_start(cpy, fmtstr);
     32	nb = vsnprintf(NULL, 0, fmtstr, cpy);
     33	va_end(cpy);
     34
     35	if (nb < 0) die("Invalid fmtstr!\n");
     36	str = checkp(malloc(nb+1));
     37
     38	va_start(ap, fmtstr);
     39	nb = vsnprintf(str, nb+1, fmtstr, ap);
     40	va_end(ap);
     41
     42	return str;
     43}
     44
     45const char*
     46mhash(const char *str, int len)
     47{
     48	static char buf[MHASHLEN + 1];
     49	int i, k, v;
     50	char c, *bp;
     51
     52	if (!str || !*str) str = ".";
     53	if (len == -1) len = strlen(str);
     54
     55	for (v = 0, i = 0; i < len; i++) v += str[i];
     56
     57	srand(v);
     58	for (bp = buf, i = 0; i < MHASHLEN / 2; i++)
     59		bp += sprintf(bp, "%02x", str[i % len] ^ (rand() % 256));
     60
     61	return buf;
     62}
     63
     64int
     65checkalph(const char *str, const char *alph)
     66{
     67	const char *c;
     68
     69	for (c = str; *c; c++)
     70		if (!strchr(alph, *c)) return FAIL;
     71
     72	return OK;
     73}
     74
     75void
     76freadstr(FILE *f, char **dst)
     77{
     78	size_t start, len, tmp;
     79	char c;
     80
     81	start = ftell(f);
     82	for (len = 0; (c = fgetc(f)) != EOF && c; len++);
     83	fseek(f, start, SEEK_SET);
     84
     85	*dst = checkp(calloc(1, len + 1));
     86	tmp = fread(*dst, len, 1, f);
     87	fgetc(f);
     88}
     89
     90void
     91fputstr(FILE *f, char *s)
     92{
     93	fprintf(f, "%s", s);
     94	fputc(0, f);
     95}
     96
     97const char*
     98ask(const char *fmtstr, ...)
     99{
    100	static char linebuf[256];
    101	va_list ap;
    102	int fail;
    103
    104	va_start(ap, fmtstr);
    105	vprintf(fmtstr, ap);
    106	va_end(ap);
    107
    108	fail = !fgets(linebuf, sizeof(linebuf), stdin);
    109
    110	if (!fail && *linebuf) {
    111		if (linebuf[strlen(linebuf)-1] == '\n')
    112			linebuf[strlen(linebuf)-1] = '\0';
    113		if (echo) printf("%s\n", linebuf);
    114	}
    115
    116	if (fail) errno = EBADMSG;
    117
    118	return fail ? "" : linebuf;
    119}
    120
    121void
    122dump(const char *filename)
    123{
    124	char buf[256];
    125	FILE *f;
    126	int nb;
    127
    128	if (!(f = fopen(filename, "r"))) return;
    129
    130	while ((nb = fread(buf, 1, sizeof(buf) - 1, f)))
    131		printf("%.*s", nb, buf);
    132
    133	fclose(f);
    134}
    135
    136int
    137strpfcmp(const char *prefix, const char *str)
    138{
    139	return strncmp(prefix, str, strlen(prefix));
    140}