N_IDX(x) = k;
}
-static void
+static int
PQ_insert(snode* np)
{
if (PQcnt == PQsize) {
- fprintf (stderr, "Heap overflow\n");
- exit (1);
+ agerr (AGERR, "Heap overflow\n");
+ return 1;
}
PQcnt++;
pq[PQcnt] = np;
PQupheap (PQcnt);
PQcheck();
+ return 0;
}
static void
void PQinit(void);
void PQcheck (void);
void PQupheap(int);
-void PQ_insert(snode* np);
+int PQ_insert(snode* np);
void PQdownheap (int k);
snode* PQremove (void);
void PQupdate (snode* n, int d);
#define DEBUG
#include <stddef.h>
+#include <setjmp.h>
#include <maze.h>
#include "fPQ.h"
#include "memory.h"
Agedge_t* e;
} epair_t;
+static jmp_buf jbuf;
+
#ifdef DEBUG
static void emitSearchGraph (FILE* fp, sgraph* sg);
static void emitGraph (FILE* fp, maze* mp, int n_edges, route* route_list, epair_t[]);
seg_cmp(segment* S1, segment* S2)
{
if(S1->isVert!=S2->isVert||S1->comm_coord!=S2->comm_coord) {
- fprintf (stderr, "incomparable segments !! -- Aborting\n");
- exit(1);
+ agerr (AGERR, "incomparable segments !! -- Aborting\n");
+ longjmp(jbuf, 1);
}
if(S1->isVert)
return segCmp (S1, S2, B_RIGHT, B_LEFT);
addNodeEdges (sg, dest, dn);
addNodeEdges (sg, start, sn);
}
- shortPath (sg, dn, sn);
+ if (shortPath (sg, dn, sn)) goto orthofinish;
}
route_list[i] = convertSPtoRoute(sg, sn, dn);
mp->hchans = extractHChans (mp);
mp->vchans = extractVChans (mp);
assignSegs (n_edges, route_list, mp);
+ if (setjmp(jbuf))
+ goto orthofinish;
assignTracks (n_edges, route_list, mp);
#ifdef DEBUG
if (odb_flags & ODB_ROUTE) emitGraph (stderr, mp, n_edges, route_list, es);
#endif
attachOrthoEdges (g, mp, n_edges, route_list, &sinfo, es, doLbls);
+orthofinish:
if (Concentrate)
freePS (ps);
return (&(g->nodes[e->v1]));
}
-void
+int
shortPath (sgraph* g, snode* from, snode* to)
{
snode* n;
}
PQinit();
- PQ_insert (from);
+ if (PQ_insert (from)) return 1;
N_DAD(from) = NULL;
N_VAL(from) = 0;
fprintf (stderr, "new %d (%d)\n", adjn->index, -d);
#endif
N_VAL(adjn) = d;
- PQ_insert(adjn);
+ if (PQ_insert(adjn)) return 1;
N_DAD(adjn) = n;
N_EDGE(adjn) = e;
}
}
/* PQfree(); */
- return ;
+ return 0;
}
extern sgraph* createSGraph(int);
extern void freeSGraph (sgraph*);
extern void initSEdges (sgraph* g, int maxdeg);
-extern void shortPath (sgraph* g, snode* from, snode* to);
+extern int shortPath (sgraph* g, snode* from, snode* to);
extern snode* createSNode (sgraph*);
extern sedge* createSEdge (sgraph* g, snode* v0, snode* v1, double wt);