Blame projects/jigsaw/common.c

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