|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
#include "common.h"
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
void* alloc(size_t size) {
|
|
Ivan Mahonin |
fdbd7d |
void *p = calloc(1, size);
|
|
Ivan Mahonin |
fdbd7d |
if (!p) DIE("cannot allocate %llu bytes of memory", (unsigned long long)size);
|
|
Ivan Mahonin |
fdbd7d |
return p;
|
|
Ivan Mahonin |
fdbd7d |
}
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
void* alloc2d(size_t cnt, size_t size) {
|
|
Ivan Mahonin |
fdbd7d |
if (cnt < 0) return NULL;
|
|
Ivan Mahonin |
fdbd7d |
size_t ps = cnt*sizeof(void*);
|
|
Ivan Mahonin |
fdbd7d |
char **p = (char**)alloc(ps + cnt*size);
|
|
Ivan Mahonin |
fdbd7d |
char *d = ((char*)p) + ps;
|
|
Ivan Mahonin |
fdbd7d |
if (size) for(size_t i = 0; i < cnt; ++i) p[i] = d + i*size;
|
|
Ivan Mahonin |
fdbd7d |
return p;
|
|
Ivan Mahonin |
fdbd7d |
}
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
char* vstrprintf(const char *fmt, va_list args) {
|
|
Ivan Mahonin |
fdbd7d |
va_list copy;
|
|
Ivan Mahonin |
fdbd7d |
va_copy(copy, args);
|
|
Ivan Mahonin |
fdbd7d |
int size = vsnprintf(NULL, 0, fmt, copy);
|
|
Ivan Mahonin |
fdbd7d |
va_end(copy);
|
|
Ivan Mahonin |
fdbd7d |
if (size < 0) size = 0;
|
|
Ivan Mahonin |
fdbd7d |
++size;
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
char *buf = alloc(size+1);
|
|
Ivan Mahonin |
fdbd7d |
vsnprintf(buf, size, fmt, args);
|
|
Ivan Mahonin |
fdbd7d |
return buf;
|
|
Ivan Mahonin |
fdbd7d |
}
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
char* strprintf(const char *format, ...) {
|
|
Ivan Mahonin |
fdbd7d |
va_list args;
|
|
Ivan Mahonin |
fdbd7d |
va_start(args,format);
|
|
Ivan Mahonin |
fdbd7d |
char* s = vstrprintf(format, args);
|
|
Ivan Mahonin |
fdbd7d |
va_end(args);
|
|
Ivan Mahonin |
fdbd7d |
return s;
|
|
Ivan Mahonin |
fdbd7d |
}
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
char* unquote(char *s, char prefix, char suffix) {
|
|
Ivan Mahonin |
fdbd7d |
char *s0 = NULL, *s1 = s;
|
|
Ivan Mahonin |
fdbd7d |
for(char *c = s; *c; ++c) {
|
|
Ivan Mahonin |
fdbd7d |
if (isspace(*c)) continue;
|
|
Ivan Mahonin |
fdbd7d |
if (!s0) s0 = c;
|
|
Ivan Mahonin |
fdbd7d |
s1 = c+1;
|
|
Ivan Mahonin |
fdbd7d |
}
|
|
Ivan Mahonin |
fdbd7d |
if (!s0) s0 = s;
|
|
Ivan Mahonin |
fdbd7d |
if (s0 < s1 && *s0 == prefix) ++s0;
|
|
Ivan Mahonin |
fdbd7d |
if (s0 < s1 && *(s1-1) == suffix) --s1;
|
|
Ivan Mahonin |
fdbd7d |
memmove(s, s0, s1 - s0);
|
|
Ivan Mahonin |
fdbd7d |
s[s1-s0] = 0;
|
|
Ivan Mahonin |
fdbd7d |
return s;
|
|
Ivan Mahonin |
fdbd7d |
}
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
dcf1b6 |
char* readline(FILE *f) {
|
|
Ivan Mahonin |
dcf1b6 |
size_t len = 0, blen = 1024;
|
|
Ivan Mahonin |
dcf1b6 |
char *buf = alloc(blen+1);
|
|
Ivan Mahonin |
dcf1b6 |
while(1) {
|
|
Ivan Mahonin |
dcf1b6 |
int ch = fgetc(f);
|
|
Ivan Mahonin |
dcf1b6 |
if (ch <= 0 || ch == '\n')
|
|
Ivan Mahonin |
dcf1b6 |
break;
|
|
Ivan Mahonin |
dcf1b6 |
if (len+1 >= blen) {
|
|
Ivan Mahonin |
dcf1b6 |
size_t bl = blen + blen/8;
|
|
Ivan Mahonin |
dcf1b6 |
buf = realloc(buf, bl);
|
|
Ivan Mahonin |
dcf1b6 |
if (!buf) DIE("cannot re-allocate %llu bytes of memory", (unsigned long long)bl);
|
|
Ivan Mahonin |
dcf1b6 |
memset(buf + blen, 0, bl - blen);
|
|
Ivan Mahonin |
dcf1b6 |
blen = bl;
|
|
Ivan Mahonin |
dcf1b6 |
}
|
|
Ivan Mahonin |
dcf1b6 |
buf[len++] = ch;
|
|
Ivan Mahonin |
dcf1b6 |
}
|
|
Ivan Mahonin |
dcf1b6 |
buf[len++] = 0;
|
|
Ivan Mahonin |
dcf1b6 |
buf = realloc(buf, len);
|
|
Ivan Mahonin |
dcf1b6 |
if (!buf) DIE("cannot re-allocate %llu bytes of memory", (unsigned long long)len);
|
|
Ivan Mahonin |
dcf1b6 |
return buf;
|
|
Ivan Mahonin |
dcf1b6 |
}
|
|
Ivan Mahonin |
dcf1b6 |
|
|
Ivan Mahonin |
dcf1b6 |
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
void cubicto(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3, int levels) {
|
|
Ivan Mahonin |
fdbd7d |
if (--levels <= 0) { lineTo(x3, y3); return; }
|
|
Ivan Mahonin |
fdbd7d |
double xx0 = (x0 + x1)/2, yy0 = (y0 + y1)/2;
|
|
Ivan Mahonin |
fdbd7d |
double xx1 = (x1 + x2)/2, yy1 = (y1 + y2)/2;
|
|
Ivan Mahonin |
fdbd7d |
double xx2 = (x2 + x3)/2, yy2 = (y2 + y3)/2;
|
|
Ivan Mahonin |
fdbd7d |
double xxx0 = (xx0 + xx1)/2, yyy0 = (yy0 + yy1)/2;
|
|
Ivan Mahonin |
fdbd7d |
double xxx1 = (xx1 + xx2)/2, yyy1 = (yy1 + yy2)/2;
|
|
Ivan Mahonin |
fdbd7d |
double xxxx = (xxx0 + xxx1)/2, yyyy = (yyy0 + yyy1)/2;
|
|
Ivan Mahonin |
fdbd7d |
cubicto(x0, y0, xx0, yy0, xxx0, yyy0, xxxx, yyyy, levels);
|
|
Ivan Mahonin |
fdbd7d |
cubicto(xxxx, yyyy, xxx1, yyy1, xx2, yy2, x3, y3, levels);
|
|
Ivan Mahonin |
fdbd7d |
}
|
|
Ivan Mahonin |
fdbd7d |
|
|
Ivan Mahonin |
fdbd7d |
|