#include #include #include #include /* * operations over move datatype, grp is many moves * in a linked list. */ void fillmov(Move *m, Point pos, char type) { assert(m); m->Point = pos; m->type = type; m->next = nil; } void freegrp(Move *m) { Move *p,*next; for(p = m; p != nil; p = next){ next = p->next; free(p); } } int opgrp(Move *grp, char type, void (*op)(Move *m, char type)) { int nmoves; Move *p,*next; nmoves = 0; for(p = grp; p != nil; p = next){ next = p->next; nmoves++; if(op) op(p, type); } return nmoves; } //Probably buggy, not tried yet.. Move * clonegrp(Move *grp) { Move *p, *c, *clgrp; if(!grp) return nil; clgrp = malloc(sizeof(Move)); c = clgrp; for(p = grp; p != nil; p = p->next){ c->type = p->type; c->Point = p->Point; if(p->next == nil) c->next = nil; else{ c->next = malloc(sizeof(Move)); c = c->next; } } return clgrp; } /*Adds at the end*/ Move * addlast(Move *g, Move *m) { Move *p, *next; if(verbose) dprint("Addlast %P\n",m->Point); if(!g) return m; for(p = g; ; p = next){ next = p->next; if(!next) break; } p->next = m; return g; } Move * pushmov(Move *g, Move *m) { if(!m) return nil; m->next = g; return m; } Move * popmov(Move **m, Move *g) { Move *ng; if(!g) return nil; ng = g->next; g->next = nil; *m = g; return ng; } void opprint(Move *m, char) { if(!m){ dprint("nil\n"); return; } dprint("%c %d %d\n",m->type, m->Point.x, m->Point.y); } void opdebug(Move *m, char) { if(!m){ dprint("nil\n"); return; } dprint("%p, %P, %c, [%p]->|||",m,m->Point, m->type, m->next); } void opsettype(Move *m, char c) { if(!m){ dprint("nil\n"); return; } m->type = c; } void opnop(Move *,char) { return; } Move * freelast(Move *g) { Move *p, *next, *prev; if(!g) return nil; prev = nil; for(p = g; ; p = next){ next = p->next; if(!next) break; prev = p; } free(p); if(!prev) return nil; prev->next = nil; return g; } /*Take out the last move from a group and return it*/ Move * takelast(Move **grp) { Move *p, *next, *prev,*last, *g; g = *grp; if(!g){ *grp=nil; return nil; } prev = nil; for(p=g; ; p = next){ next = p->next; if(!next) break; prev = p; } last = p; if(!prev){ return nil; } prev->next = nil; *grp = g; return last; }