Blame simple/writing/src/svg-track.inc.c

5b5ea1
5b5ea1
5b5ea1
void spSkipSpace(const char **pos)
5b5ea1
  { while(**pos && isspace(**pos)) ++*pos; }
5b5ea1
5b5ea1
5b5ea1
double spReadNum(const char **pos) {
5b5ea1
  spSkipSpace(pos);
5b5ea1
  char *end = "";
5b5ea1
  double x = strtod(*pos, &end);
5b5ea1
  *pos = end;
5b5ea1
  return x;
5b5ea1
}
5b5ea1
5b5ea1
5b5ea1
void spTrack(const char *path, double *x, double *y) {
5b5ea1
  double sx = *x, sy = *y;
5b5ea1
  const char *c = path;
5b5ea1
  spSkipSpace(&c);
5b5ea1
  while(*c) {
5b5ea1
    switch(*c++) {
5b5ea1
    case 'M':
5b5ea1
      sx = (*x = spReadNum(&c));
5b5ea1
      sy = (*y = spReadNum(&c));
5b5ea1
      break;
5b5ea1
    case 'm':
5b5ea1
      sx = (*x += spReadNum(&c));
5b5ea1
      sy = (*y += spReadNum(&c));
5b5ea1
      break;
5b5ea1
5b5ea1
    case 'C':
5b5ea1
      spReadNum(&c);
5b5ea1
      spReadNum(&c);
5b5ea1
    case 'Q':
5b5ea1
      spReadNum(&c);
5b5ea1
      spReadNum(&c);
5b5ea1
    case 'L':
5b5ea1
      *x = spReadNum(&c);
5b5ea1
      *y = spReadNum(&c);
5b5ea1
      break;
5b5ea1
5b5ea1
    case 'c':
5b5ea1
      spReadNum(&c);
5b5ea1
      spReadNum(&c);
5b5ea1
    case 'q':
5b5ea1
      spReadNum(&c);
5b5ea1
      spReadNum(&c);
5b5ea1
    case 'l':
5b5ea1
      *x += spReadNum(&c);
5b5ea1
      *y += spReadNum(&c);
5b5ea1
      break;
5b5ea1
5b5ea1
    case 'Z':
5b5ea1
    case 'z':
5b5ea1
      *x = sx;
5b5ea1
      *y = sy;
5b5ea1
      break;
5b5ea1
    default:
5b5ea1
      printf("unknown path command \'%c\'\n", *(c - 1));
5b5ea1
    }
5b5ea1
    spSkipSpace(&c);
5b5ea1
  }
5b5ea1
}
5b5ea1