Blame src/svg-track.inc.c

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