4 scnode *scnodalloc(void *data)
6 scnode *nod = malloc(sizeof(scnode));
12 scway *scaddway(scnode *from, const scnode *to, float len, void *data)
14 scway *way = malloc(sizeof(scway));
19 scway *par = __scnodgetway(from);
27 int scisconnected(scnode *n1, scnode *n2) {
28 for (scway *way = n1->way; way != NULL; way = way->alt) {
35 scwaypoint *scout(const scnode *from, const scnode *to, scwaypoint *stack)
37 scwaypoint *wayp = NULL;
39 return __scallocwayp(from, NULL);
40 scwaypoint *stackend = __scstackgetend(stack);
41 for (scway *way = from->way; way != NULL; way = way->alt) {
42 if (__scstackfind(stack, way))
44 scwaypoint *twayp = __scallocwayp(from, way);
46 stackend->nxt = twayp;
47 if ((twayp->nxt = scout(way->lto, to, stack ? stack : twayp)))
48 twayp->len += twayp->nxt->len;
49 if (twayp->nxt && (! wayp || wayp->len > twayp->len)) {
56 return stack ? (stackend->nxt = wayp) : wayp;
59 void scdestroypath(scwaypoint *stack)
61 for (scwaypoint *sptr = stack; sptr != NULL; sptr = sptr->nxt)
65 scway *__scnodgetway(const scnode *node)
68 for (way = node->way; way != NULL && way->alt != NULL; way = way->alt);
72 scwaypoint *__scallocwayp(const scnode *node, const scway *way)
74 scwaypoint *wayp = malloc(sizeof(scwaypoint));
78 wayp->len = way ? way->len : 0.0f;
82 int __scstackfind(const scwaypoint *stack, const scway *way)
84 for (const scwaypoint *sptr = stack; sptr != NULL; sptr = sptr->nxt)
85 if (sptr->nod == way->lto)
90 scwaypoint *__scstackgetend(scwaypoint *stack)
93 for (sptr = stack; sptr != NULL && sptr->nxt != NULL; sptr = sptr->nxt);