Index: work/polydev/test.c =================================================================== --- work/polydev/test.c (revision 8177) +++ work/polydev/test.c (revision 8178) @@ -155,10 +155,48 @@ return pa; } -int main() + +static void valid_report(pcb_pline_t *c, pcb_vnode_t *pl) { + if (c->Flags.orient == PCB_PLF_INV) + fprintf(stderr, "failed orient\n"); + if (pcb_polyarea_contour_check(c)) + fprintf(stderr, "failed self-intersection\n"); +} + +pcb_bool poly_valid(pcb_polyarea_t * p) +{ + pcb_pline_t *c; + + if ((p == NULL) || (p->contours == NULL)) { + fprintf(stderr, "Empty poly\n"); + return pcb_false; + } + + if (p->contours->Flags.orient == PCB_PLF_INV || pcb_polyarea_contour_check(p->contours)) { + fprintf(stderr, "Invalid Outer pcb_pline_t\n"); + valid_report(p->contours, &p->contours->head); + return pcb_false; + } + for (c = p->contours->next; c != NULL; c = c->next) { + if (c->Flags.orient == PCB_PLF_DIR || pcb_polyarea_contour_check(c) || !pcb_poly_contour_in_contour(p->contours, c)) { + fprintf(stderr, "Invalid Inner pcb_pline_t orient = %d\n", c->Flags.orient); + valid_report(c, &c->head); + return pcb_false; + } + } + return pcb_true; +} + + + + + +/*****************/ +int main(int argc, char *argv[]) +{ char line[8192], *cmd, *arg; - pcb_polyarea_t *pa; + pcb_polyarea_t *pa = NULL; while(fgets(line, sizeof(line), stdin) != NULL) { @@ -181,6 +219,8 @@ draw(pa); else if (strcmp(cmd, "echo") == 0) printf(arg); + else if (strcmp(cmd, "check") == 0) + printf("%s\n", poly_valid(pa) ? "valid" : "INVALID"); else fprintf(stderr, "syntax error\n"); }