]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/gtkgensurf/triangle.c
reformat code! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / contrib / gtkgensurf / triangle.c
index 8d4e0c98c952e87f424aa359e832f627a0a72f40..2d1ad339c66c7f0635488dc735acfacebac138b4 100644 (file)
@@ -1,4 +1,5 @@
-#define ANSI_DECLARATORS
+#define
+ANSI_DECLARATORS
 /*****************************************************************************/
 /*                                                                           */
 /*      888888888        ,o,                          / 888                  */
 /*   recommend double precision unless you want to generate a mesh for which */
 /*   you do not have enough memory.                                          */
 
-#define SINGLE
+#define
+SINGLE
 
-#ifdef SINGLE
-#define REAL float
+#ifdef
+SINGLE
+#define
+REAL float
 #else /* not SINGLE */
-#define REAL double
+#define
+REAL double
 #endif /* not SINGLE */
 
 /* If yours is not a Unix system, define the NO_TIMER compiler switch to     */
 /*   remove the Unix-specific timing code.                                   */
 
-#define NO_TIMER
+#define
+NO_TIMER
 
 /* To insert lots of self-checks for internal errors, define the SELF_CHECK  */
 /*   symbol.  This will slow down the program significantly.  It is best to  */
 /*   TRILIBRARY symbol.  Read the file triangle.h for details on how to call */
 /*   the procedure triangulate() that results.                               */
 
-#define TRILIBRARY
+#define
+TRILIBRARY
 
 /* It is possible to generate a smaller version of Triangle using one or     */
 /*   both of the following symbols.  Define the REDUCED symbol to eliminate  */
 /*   These reductions are most likely to be useful when generating an object */
 /*   library (triangle.o) by defining the TRILIBRARY symbol.                 */
 
-#define REDUCED
-#define CDT_ONLY
+#define
+REDUCED
+#define
+CDT_ONLY
 
 /* On some machines, the exact arithmetic routines might be defeated by the  */
 /*   use of internal extended precision floating-point registers.  Sometimes */
 /* To try this out, write "#define INEXACT volatile" below.  Normally,       */
 /*   however, INEXACT should be defined to be nothing.  ("#define INEXACT".) */
 
-#define INEXACT /* Nothing */
+#define
+INEXACT /* Nothing */
 /* #define INEXACT volatile */
 
 /* Maximum number of characters in a file name (including the null).         */
 
-#define FILENAMESIZE 512
+#define
+FILENAMESIZE 512
 
 /* Maximum number of characters in a line read from a file (including the    */
 /*   null).                                                                  */
 
-#define INPUTLINESIZE 512
+#define
+INPUTLINESIZE 512
 
 /* For efficiency, a variety of data structures are allocated in bulk.  The  */
 /*   following constants determine how many of each structure is allocated   */
 /*   at once.                                                                */
 
-#define TRIPERBLOCK 4092           /* Number of triangles allocated at once. */
-#define SHELLEPERBLOCK 508       /* Number of shell edges allocated at once. */
-#define POINTPERBLOCK 4092            /* Number of points allocated at once. */
-#define VIRUSPERBLOCK 1020   /* Number of virus triangles allocated at once. */
+#define
+TRIPERBLOCK 4092           /* Number of triangles allocated at once. */
+#define
+SHELLEPERBLOCK 508       /* Number of shell edges allocated at once. */
+#define
+POINTPERBLOCK 4092            /* Number of points allocated at once. */
+#define
+VIRUSPERBLOCK 1020   /* Number of virus triangles allocated at once. */
 /* Number of encroached segments allocated at once. */
-#define BADSEGMENTPERBLOCK 252
+#define
+BADSEGMENTPERBLOCK 252
 /* Number of skinny triangles allocated at once. */
-#define BADTRIPERBLOCK 4092
+#define
+BADTRIPERBLOCK 4092
 /* Number of splay tree nodes allocated at once. */
-#define SPLAYNODEPERBLOCK 508
+#define
+SPLAYNODEPERBLOCK 508
 
 /* The point marker DEADPOINT is an arbitrary number chosen large enough to  */
 /*   (hopefully) not conflict with user boundary markers.  Make sure that it */
 /*   is small enough to fit into your machine's integer size.                */
 
-#define DEADPOINT -1073741824
+#define
+DEADPOINT -1073741824
 
 /* The next line is used to outsmart some very stupid compilers.  If your    */
 /*   compiler is smarter, feel free to replace the "int" with "void".        */
 /*   Not that it matters.                                                    */
 
-#define VOID int
+#define
+VOID int
 
 /* Two constants for algorithms based on random sampling.  Both constants    */
 /*   have been chosen empirically to optimize their respective algorithms.   */
 
 /* Used for the point location scheme of Mucke, Saias, and Zhu, to decide    */
 /*   how large a random sample of triangles to inspect.                      */
-#define SAMPLEFACTOR 11
+#define
+SAMPLEFACTOR 11
 /* Used in Fortune's sweepline Delaunay algorithm to determine what fraction */
 /*   of boundary edges should be maintained in the splay tree for point      */
 /*   location on the front.                                                  */
-#define SAMPLERATE 10
+#define
+SAMPLERATE 10
 
 /* A number that speaks for itself, every kissable digit.                    */
 
-#define PI 3.141592653589793238462643383279502884197169399375105820974944592308
+#define
+PI 3.141592653589793238462643383279502884197169399375105820974944592308
 
 /* Another fave.                                                             */
 
-#define SQUAREROOTTWO 1.4142135623730950488016887242096980785696718753769480732
+#define
+SQUAREROOTTWO 1.4142135623730950488016887242096980785696718753769480732
 
 /* And here's one for those of you who are intimidated by math.              */
 
-#define ONETHIRD 0.333333333333333333333333333333333333333333333333333333333333
-
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#ifndef NO_TIMER
-#include <sys/time.h>
+#define
+ONETHIRD 0.333333333333333333333333333333333333333333333333333333333333
+
+#include
+<stdio.h>
+#include
+<string.h>
+#include
+<math.h>
+#ifndef
+NO_TIMER
+#include
+<sys/time.h>
 #endif /* NO_TIMER */
-#ifdef TRILIBRARY
-#include "triangle.h"
+#ifdef
+TRILIBRARY
+#include
+"triangle.h"
 #endif /* TRILIBRARY */
 
 /* The following obscenity seems to be necessary to ensure that this program */
 /* exit() may or may not already be defined at this point.  I declare these  */
 /* functions explicitly because some non-ANSI C compilers lack stdlib.h.     */
 
-#ifndef _STDLIB_H_
+#ifndef
+_STDLIB_H_
 extern void *malloc();
 extern void free();
 extern void exit();
@@ -330,7 +364,8 @@ extern long strtol();
 /* A few forward declarations.                                               */
 
 void poolrestart();
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 char *readline();
 char *findfield();
 #endif /* not TRILIBRARY */
@@ -338,33 +373,37 @@ char *findfield();
 /* Labels that signify whether a record consists primarily of pointers or of */
 /*   floating-point words.  Used to make decisions about data alignment.     */
 
-enum wordtype {POINTER, FLOATINGPOINT};
+enum wordtype {
+POINTER, FLOATINGPOINT
+};
 
 /* Labels that signify the result of point location.  The result of a        */
 /*   search indicates that the point falls in the interior of a triangle, on */
 /*   an edge, on a vertex, or outside the mesh.                              */
 
-enum locateresult {INTRIANGLE, ONEDGE, ONVERTEX, OUTSIDE};
+enum locateresult { INTRIANGLE, ONEDGE, ONVERTEX, OUTSIDE };
 
 /* Labels that signify the result of site insertion.  The result indicates   */
 /*   that the point was inserted with complete success, was inserted but     */
 /*   encroaches on a segment, was not inserted because it lies on a segment, */
 /*   or was not inserted because another point occupies the same location.   */
 
-enum insertsiteresult {SUCCESSFULPOINT, ENCROACHINGPOINT, VIOLATINGPOINT,
-                                          DUPLICATEPOINT};
+enum insertsiteresult {
+SUCCESSFULPOINT, ENCROACHINGPOINT, VIOLATINGPOINT,
+DUPLICATEPOINT
+};
 
 /* Labels that signify the result of direction finding.  The result          */
 /*   indicates that a segment connecting the two query points falls within   */
 /*   the direction triangle, along the left edge of the direction triangle,  */
 /*   or along the right edge of the direction triangle.                      */
 
-enum finddirectionresult {WITHIN, LEFTCOLLINEAR, RIGHTCOLLINEAR};
+enum finddirectionresult { WITHIN, LEFTCOLLINEAR, RIGHTCOLLINEAR };
 
 /* Labels that signify the result of the circumcenter computation routine.   */
 /*   The return value indicates which edge of the triangle is shortest.      */
 
-enum circumcenterresult {OPPOSITEORG, OPPOSITEDEST, OPPOSITEAPEX};
+enum circumcenterresult { OPPOSITEORG, OPPOSITEDEST, OPPOSITEAPEX };
 
 /*****************************************************************************/
 /*                                                                           */
@@ -488,8 +527,8 @@ typedef REAL **triangle;            /* Really:  typedef triangle *triangle   */
 /*   directed to point counterclockwise about the corresponding triangle.    */
 
 struct triedge {
-       triangle *tri;
-       int orient;                                       /* Ranges from 0 to 2. */
+triangle *tri;
+int orient;                                       /* Ranges from 0 to 2. */
 };
 
 /* The shell data structure.  Each shell edge contains two pointers to       */
@@ -504,8 +543,8 @@ typedef REAL **shelle;                  /* Really:  typedef shelle *shelle   */
 /*   directed so that the "side" denoted is the right side of the edge.      */
 
 struct edge {
-       shelle *sh;
-       int shorient;                                     /* Ranges from 0 to 1. */
+shelle *sh;
+int shorient;                                     /* Ranges from 0 to 1. */
 };
 
 /* The point data structure.  Each point is actually an array of REALs.      */
@@ -519,9 +558,9 @@ typedef REAL *point;
 /*   stored so that one can check whether a segment is still the same.       */
 
 struct badsegment {
-       struct edge encsegment;                        /* An encroached segment. */
-       point segorg, segdest;                              /* The two vertices. */
-       struct badsegment *nextsegment;   /* Pointer to next encroached segment. */
+struct edge encsegment;                        /* An encroached segment. */
+point segorg, segdest;                              /* The two vertices. */
+struct badsegment *nextsegment;   /* Pointer to next encroached segment. */
 };
 
 /* A queue used to store bad triangles.  The key is the square of the cosine */
@@ -529,10 +568,10 @@ struct badsegment {
 /*   stored so that one can check whether a triangle is still the same.      */
 
 struct badface {
-       struct triedge badfacetri;                            /* A bad triangle. */
-       REAL key;                           /* cos^2 of smallest (apical) angle. */
-       point faceorg, facedest, faceapex;                /* The three vertices. */
-       struct badface *nextface;               /* Pointer to next bad triangle. */
+struct triedge badfacetri;                            /* A bad triangle. */
+REAL key;                           /* cos^2 of smallest (apical) angle. */
+point faceorg, facedest, faceapex;                /* The three vertices. */
+struct badface *nextface;               /* Pointer to next bad triangle. */
 };
 
 /* A node in a heap used to store events for the sweepline Delaunay          */
@@ -546,9 +585,9 @@ struct badface {
 /*   events are given an invalid (smaller than `xmin') x-coordinate `xkey'.  */
 
 struct event {
-       REAL xkey, ykey;                            /* Coordinates of the event. */
-       VOID *eventptr;     /* Can be a point or the location of a circle event. */
-       int heapposition;            /* Marks this event's position in the heap. */
+REAL xkey, ykey;                            /* Coordinates of the event. */
+VOID *eventptr;     /* Can be a point or the location of a circle event. */
+int heapposition;            /* Marks this event's position in the heap. */
 };
 
 /* A node in the splay tree.  Each node holds an oriented ghost triangle     */
@@ -563,9 +602,9 @@ struct event {
 /*   boundary edge and should be deleted.                                    */
 
 struct splaynode {
-       struct triedge keyedge;                /* Lprev of an edge on the front. */
-       point keydest;          /* Used to verify that splay node is still live. */
-       struct splaynode *lchild, *rchild;            /* Children in splay tree. */
+struct triedge keyedge;                /* Lprev of an edge on the front. */
+point keydest;          /* Used to verify that splay node is still live. */
+struct splaynode *lchild, *rchild;            /* Children in splay tree. */
 };
 
 /* A type used to allocate memory.  firstblock is the first block of items.  */
@@ -593,18 +632,18 @@ struct splaynode {
 /*   on deaditemstack.                                                       */
 
 struct memorypool {
-       VOID **firstblock, **nowblock;
-       VOID *nextitem;
-       VOID *deaditemstack;
-       VOID **pathblock;
-       VOID *pathitem;
-       enum wordtype itemwordtype;
-       int alignbytes;
-       int itembytes, itemwords;
-       int itemsperblock;
-       long items, maxitems;
-       int unallocateditems;
-       int pathitemsleft;
+VOID **firstblock, **nowblock;
+VOID *nextitem;
+VOID *deaditemstack;
+VOID **pathblock;
+VOID *pathitem;
+enum wordtype itemwordtype;
+int alignbytes;
+int itembytes, itemwords;
+int itemsperblock;
+long items, maxitems;
+int unallocateditems;
+int pathitemsleft;
 };
 
 /* Variables used to allocate memory for triangles, shell edges, points,     */
@@ -710,7 +749,8 @@ static REAL maxarea;
 
 /* Variables for file names.                                                 */
 
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 char innodefilename[FILENAMESIZE];
 char inelefilename[FILENAMESIZE];
 char inpolyfilename[FILENAMESIZE];
@@ -776,8 +816,8 @@ static struct triedge recenttri;
 
 /* Fast lookup arrays to speed some of the mesh manipulation primitives.     */
 
-int plus1mod3[3] = {1, 2, 0};
-int minus1mod3[3] = {2, 0, 1};
+int plus1mod3[3] = { 1, 2, 0 };
+int minus1mod3[3] = { 2, 0, 1 };
 
 /********* Primitives for triangles                                  *********/
 /*                                                                           */
@@ -786,17 +826,19 @@ int minus1mod3[3] = {2, 0, 1};
 /* decode() converts a pointer to an oriented triangle.  The orientation is  */
 /*   extracted from the two least significant bits of the pointer.           */
 
-#define decode( ptr, triedge )                                                                                                 \
-       ( triedge ).orient = (int) ( (unsigned long) ( ptr ) & (unsigned long) 3l );      \
-       ( triedge ).tri = (triangle *)                                                                                            \
-                                         ( (unsigned long) ( ptr ) ^ (unsigned long) ( triedge ).orient )
+#define
+decode( ptr, triedge )                                                    \
+    ( triedge ).orient = (int) ((unsigned long) ( ptr ) & (unsigned long) 3l );      \
+    ( triedge ).tri = (triangle *)                                                  \
+                      ((unsigned long) ( ptr ) ^ (unsigned long) ( triedge ).orient )
 
 /* encode() compresses an oriented triangle into a single pointer.  It       */
 /*   relies on the assumption that all triangles are aligned to four-byte    */
 /*   boundaries, so the two least significant bits of (triedge).tri are zero.*/
 
-#define encode( triedge )                                                                                                              \
-       (triangle) ( (unsigned long) ( triedge ).tri | (unsigned long) ( triedge ).orient )
+#define
+encode( triedge )                                                        \
+    (triangle) ((unsigned long) ( triedge ).tri | (unsigned long) ( triedge ).orient )
 
 /* The following edge manipulation primitives are all described by Guibas    */
 /*   and Stolfi.  However, they use an edge-based data structure, whereas I  */
@@ -806,190 +848,226 @@ int minus1mod3[3] = {2, 0, 1};
 /*   edge direction is necessarily reversed, because triangle/edge handles   */
 /*   are always directed counterclockwise around the triangle.               */
 
-#define sym( triedge1, triedge2 )                                                                                              \
-       ptr = ( triedge1 ).tri[( triedge1 ).orient];                                                                    \
-       decode( ptr, triedge2 );
+#define
+sym( triedge1, triedge2 )                                                \
+    ptr = ( triedge1 ).tri[( triedge1 ).orient];                                    \
+    decode( ptr, triedge2 );
 
-#define symself( triedge )                                                                                                             \
-       ptr = ( triedge ).tri[( triedge ).orient];                                                                              \
-       decode( ptr, triedge );
+#define
+symself( triedge )                                                        \
+    ptr = ( triedge ).tri[( triedge ).orient];                                        \
+    decode( ptr, triedge );
 
 /* lnext() finds the next edge (counterclockwise) of a triangle.             */
 
-#define lnext( triedge1, triedge2 )                                                                                            \
-       ( triedge2 ).tri = ( triedge1 ).tri;                                                                                    \
-       ( triedge2 ).orient = plus1mod3[( triedge1 ).orient]
+#define
+lnext( triedge1, triedge2 )                                                \
+    ( triedge2 ).tri = ( triedge1 ).tri;                                            \
+    ( triedge2 ).orient = plus1mod3[( triedge1 ).orient]
 
-#define lnextself( triedge )                                                                                                   \
-       ( triedge ).orient = plus1mod3[( triedge ).orient]
+#define
+lnextself( triedge )                                                    \
+    ( triedge ).orient = plus1mod3[( triedge ).orient]
 
 /* lprev() finds the previous edge (clockwise) of a triangle.                */
 
-#define lprev( triedge1, triedge2 )                                                                                            \
-       ( triedge2 ).tri = ( triedge1 ).tri;                                                                                    \
-       ( triedge2 ).orient = minus1mod3[( triedge1 ).orient]
+#define
+lprev( triedge1, triedge2 )                                                \
+    ( triedge2 ).tri = ( triedge1 ).tri;                                            \
+    ( triedge2 ).orient = minus1mod3[( triedge1 ).orient]
 
-#define lprevself( triedge )                                                                                                   \
-       ( triedge ).orient = minus1mod3[( triedge ).orient]
+#define
+lprevself( triedge )                                                    \
+    ( triedge ).orient = minus1mod3[( triedge ).orient]
 
 /* onext() spins counterclockwise around a point; that is, it finds the next */
 /*   edge with the same origin in the counterclockwise direction.  This edge */
 /*   will be part of a different triangle.                                   */
 
-#define onext( triedge1, triedge2 )                                                                                            \
-       lprev( triedge1, triedge2 );                                                                                              \
-       symself( triedge2 );
+#define
+onext( triedge1, triedge2 )                                                \
+    lprev( triedge1, triedge2 );                                                  \
+    symself( triedge2 );
 
-#define onextself( triedge )                                                                                                   \
-       lprevself( triedge );                                                                                                             \
-       symself( triedge );
+#define
+onextself( triedge )                                                    \
+    lprevself( triedge );                                                          \
+    symself( triedge );
 
 /* oprev() spins clockwise around a point; that is, it finds the next edge   */
 /*   with the same origin in the clockwise direction.  This edge will be     */
 /*   part of a different triangle.                                           */
 
-#define oprev( triedge1, triedge2 )                                                                                            \
-       sym( triedge1, triedge2 );                                                                                                        \
-       lnextself( triedge2 );
+#define
+oprev( triedge1, triedge2 )                                                \
+    sym( triedge1, triedge2 );                                                      \
+    lnextself( triedge2 );
 
-#define oprevself( triedge )                                                                                                   \
-       symself( triedge );                                                                                                                       \
-       lnextself( triedge );
+#define
+oprevself( triedge )                                                    \
+    symself( triedge );                                                              \
+    lnextself( triedge );
 
 /* dnext() spins counterclockwise around a point; that is, it finds the next */
 /*   edge with the same destination in the counterclockwise direction.  This */
 /*   edge will be part of a different triangle.                              */
 
-#define dnext( triedge1, triedge2 )                                                                                            \
-       sym( triedge1, triedge2 );                                                                                                        \
-       lprevself( triedge2 );
+#define
+dnext( triedge1, triedge2 )                                                \
+    sym( triedge1, triedge2 );                                                      \
+    lprevself( triedge2 );
 
-#define dnextself( triedge )                                                                                                   \
-       symself( triedge );                                                                                                                       \
-       lprevself( triedge );
+#define
+dnextself( triedge )                                                    \
+    symself( triedge );                                                              \
+    lprevself( triedge );
 
 /* dprev() spins clockwise around a point; that is, it finds the next edge   */
 /*   with the same destination in the clockwise direction.  This edge will   */
 /*   be part of a different triangle.                                        */
 
-#define dprev( triedge1, triedge2 )                                                                                            \
-       lnext( triedge1, triedge2 );                                                                                              \
-       symself( triedge2 );
+#define
+dprev( triedge1, triedge2 )                                                \
+    lnext( triedge1, triedge2 );                                                  \
+    symself( triedge2 );
 
-#define dprevself( triedge )                                                                                                   \
-       lnextself( triedge );                                                                                                             \
-       symself( triedge );
+#define
+dprevself( triedge )                                                    \
+    lnextself( triedge );                                                          \
+    symself( triedge );
 
 /* rnext() moves one edge counterclockwise about the adjacent triangle.      */
 /*   (It's best understood by reading Guibas and Stolfi.  It involves        */
 /*   changing triangles twice.)                                              */
 
-#define rnext( triedge1, triedge2 )                                                                                            \
-       sym( triedge1, triedge2 );                                                                                                        \
-       lnextself( triedge2 );                                                                                                            \
-       symself( triedge2 );
+#define
+rnext( triedge1, triedge2 )                                                \
+    sym( triedge1, triedge2 );                                                      \
+    lnextself( triedge2 );                                                          \
+    symself( triedge2 );
 
-#define rnextself( triedge )                                                                                                   \
-       symself( triedge );                                                                                                                       \
-       lnextself( triedge );                                                                                                             \
-       symself( triedge );
+#define
+rnextself( triedge )                                                    \
+    symself( triedge );                                                              \
+    lnextself( triedge );                                                          \
+    symself( triedge );
 
 /* rnext() moves one edge clockwise about the adjacent triangle.             */
 /*   (It's best understood by reading Guibas and Stolfi.  It involves        */
 /*   changing triangles twice.)                                              */
 
-#define rprev( triedge1, triedge2 )                                                                                            \
-       sym( triedge1, triedge2 );                                                                                                        \
-       lprevself( triedge2 );                                                                                                            \
-       symself( triedge2 );
+#define
+rprev( triedge1, triedge2 )                                                \
+    sym( triedge1, triedge2 );                                                      \
+    lprevself( triedge2 );                                                          \
+    symself( triedge2 );
 
-#define rprevself( triedge )                                                                                                   \
-       symself( triedge );                                                                                                                       \
-       lprevself( triedge );                                                                                                             \
-       symself( triedge );
+#define
+rprevself( triedge )                                                    \
+    symself( triedge );                                                              \
+    lprevself( triedge );                                                          \
+    symself( triedge );
 
 /* These primitives determine or set the origin, destination, or apex of a   */
 /* triangle.                                                                 */
 
-#define org( triedge, pointptr )                                                                                               \
-       pointptr = (point) ( triedge ).tri[plus1mod3[( triedge ).orient] + 3]
+#define
+org( triedge, pointptr )                                                \
+    pointptr = (point) ( triedge ).tri[plus1mod3[( triedge ).orient] + 3]
 
-#define dest( triedge, pointptr )                                                                                              \
-       pointptr = (point) ( triedge ).tri[minus1mod3[( triedge ).orient] + 3]
+#define
+dest( triedge, pointptr )                                                \
+    pointptr = (point) ( triedge ).tri[minus1mod3[( triedge ).orient] + 3]
 
-#define apex( triedge, pointptr )                                                                                              \
-       pointptr = (point) ( triedge ).tri[( triedge ).orient + 3]
+#define
+apex( triedge, pointptr )                                                \
+    pointptr = (point) ( triedge ).tri[( triedge ).orient + 3]
 
-#define setorg( triedge, pointptr )                                                                                            \
-       ( triedge ).tri[plus1mod3[( triedge ).orient] + 3] = (triangle) pointptr
+#define
+setorg( triedge, pointptr )                                                \
+    ( triedge ).tri[plus1mod3[( triedge ).orient] + 3] = (triangle) pointptr
 
-#define setdest( triedge, pointptr )                                                                                   \
-       ( triedge ).tri[minus1mod3[( triedge ).orient] + 3] = (triangle) pointptr
+#define
+setdest( triedge, pointptr )                                            \
+    ( triedge ).tri[minus1mod3[( triedge ).orient] + 3] = (triangle) pointptr
 
-#define setapex( triedge, pointptr )                                                                                   \
-       ( triedge ).tri[( triedge ).orient + 3] = (triangle) pointptr
+#define
+setapex( triedge, pointptr )                                            \
+    ( triedge ).tri[( triedge ).orient + 3] = (triangle) pointptr
 
-#define setvertices2null( triedge )                                                                                            \
-       ( triedge ).tri[3] = (triangle) NULL;                                                                             \
-       ( triedge ).tri[4] = (triangle) NULL;                                                                             \
-       ( triedge ).tri[5] = (triangle) NULL;
+#define
+setvertices2null( triedge )                                                \
+    ( triedge ).tri[3] = (triangle) NULL;                                          \
+    ( triedge ).tri[4] = (triangle) NULL;                                          \
+    ( triedge ).tri[5] = (triangle) NULL;
 
 /* Bond two triangles together.                                              */
 
-#define bond( triedge1, triedge2 )                                                                                             \
-       ( triedge1 ).tri[( triedge1 ).orient] = encode( triedge2 );                                               \
-       ( triedge2 ).tri[( triedge2 ).orient] = encode( triedge1 )
+#define
+bond( triedge1, triedge2 )                                                \
+    ( triedge1 ).tri[( triedge1 ).orient] = encode( triedge2 );                          \
+    ( triedge2 ).tri[( triedge2 ).orient] = encode( triedge1 )
 
 /* Dissolve a bond (from one side).  Note that the other triangle will still */
 /*   think it's connected to this triangle.  Usually, however, the other     */
 /*   triangle is being deleted entirely, or bonded to another triangle, so   */
 /*   it doesn't matter.                                                      */
 
-#define dissolve( triedge )                                                                                                            \
-       ( triedge ).tri[( triedge ).orient] = (triangle) dummytri
+#define
+dissolve( triedge )                                                        \
+    ( triedge ).tri[( triedge ).orient] = (triangle) dummytri
 
 /* Copy a triangle/edge handle.                                              */
 
-#define triedgecopy( triedge1, triedge2 )                                                                              \
-       ( triedge2 ).tri = ( triedge1 ).tri;                                                                                    \
-       ( triedge2 ).orient = ( triedge1 ).orient
+#define
+triedgecopy( triedge1, triedge2 )                                        \
+    ( triedge2 ).tri = ( triedge1 ).tri;                                            \
+    ( triedge2 ).orient = ( triedge1 ).orient
 
 /* Test for equality of triangle/edge handles.                               */
 
-#define triedgeequal( triedge1, triedge2 )                                                                             \
-       ( ( ( triedge1 ).tri == ( triedge2 ).tri ) &&                                                                      \
-         ( ( triedge1 ).orient == ( triedge2 ).orient ) )
+#define
+triedgeequal( triedge1, triedge2 )                                        \
+    ((( triedge1 ).tri == ( triedge2 ).tri ) &&                                       \
+      (( triedge1 ).orient == ( triedge2 ).orient ))
 
 /* Primitives to infect or cure a triangle with the virus.  These rely on    */
 /*   the assumption that all shell edges are aligned to four-byte boundaries.*/
 
-#define infect( triedge )                                                                                                              \
-       ( triedge ).tri[6] = (triangle)                                                                                           \
-                                                ( (unsigned long) ( triedge ).tri[6] | (unsigned long) 2l )
+#define
+infect( triedge )                                                        \
+    ( triedge ).tri[6] = (triangle)                                                  \
+                         ((unsigned long) ( triedge ).tri[6] | (unsigned long) 2l )
 
-#define uninfect( triedge )                                                                                                            \
-       ( triedge ).tri[6] = (triangle)                                                                                           \
-                                                ( (unsigned long) ( triedge ).tri[6] & ~(unsigned long) 2l )
+#define
+uninfect( triedge )                                                        \
+    ( triedge ).tri[6] = (triangle)                                                  \
+                         ((unsigned long) ( triedge ).tri[6] & ~(unsigned long) 2l )
 
 /* Test a triangle for viral infection.                                      */
 
-#define infected( triedge )                                                                                                            \
-       ( ( (unsigned long) ( triedge ).tri[6] & (unsigned long) 2l ) != 0 )
+#define
+infected( triedge )                                                        \
+    (((unsigned long) ( triedge ).tri[6] & (unsigned long) 2l ) != 0 )
 
 /* Check or set a triangle's attributes.                                     */
 
-#define elemattribute( triedge, attnum )                                                                               \
-       ( (REAL *) ( triedge ).tri )[elemattribindex + ( attnum )]
+#define
+elemattribute( triedge, attnum )                                        \
+    ((REAL *) ( triedge ).tri )[elemattribindex + ( attnum )]
 
-#define setelemattribute( triedge, attnum, value )                                                             \
-       ( (REAL *) ( triedge ).tri )[elemattribindex + ( attnum )] = (REAL)value
+#define
+setelemattribute( triedge, attnum, value )                                \
+    ((REAL *) ( triedge ).tri )[elemattribindex + ( attnum )] = (REAL)value
 
 /* Check or set a triangle's maximum area bound.                             */
 
-#define areabound( triedge )  ( (REAL *) ( triedge ).tri )[areaboundindex]
+#define
+areabound( triedge )  ((REAL *) ( triedge ).tri )[areaboundindex]
 
-#define setareabound( triedge, value )                                                                                 \
-       ( (REAL *) ( triedge ).tri )[areaboundindex] = (REAL)value
+#define
+setareabound( triedge, value )                                            \
+    ((REAL *) ( triedge ).tri )[areaboundindex] = (REAL)value
 
 /********* Primitives for shell edges                                *********/
 /*                                                                           */
@@ -1000,95 +1078,113 @@ int minus1mod3[3] = {2, 0, 1};
 /*   least significant bits (one for orientation, one for viral infection)   */
 /*   are masked out to produce the real pointer.                             */
 
-#define sdecode( sptr, edge )                                                                                                  \
-       ( edge ).shorient = (int) ( (unsigned long) ( sptr ) & (unsigned long) 1l );      \
-       ( edge ).sh = (shelle *)                                                                                                          \
-                                 ( (unsigned long) ( sptr ) & ~(unsigned long) 3l )
+#define
+sdecode( sptr, edge )                                                    \
+    ( edge ).shorient = (int) ((unsigned long) ( sptr ) & (unsigned long) 1l );      \
+    ( edge ).sh = (shelle *)                                                      \
+                  ((unsigned long) ( sptr ) & ~(unsigned long) 3l )
 
 /* sencode() compresses an oriented shell edge into a single pointer.  It    */
 /*   relies on the assumption that all shell edges are aligned to two-byte   */
 /*   boundaries, so the least significant bit of (edge).sh is zero.          */
 
-#define sencode( edge )                                                                                                                        \
-       (shelle) ( (unsigned long) ( edge ).sh | (unsigned long) ( edge ).shorient )
+#define
+sencode( edge )                                                            \
+    (shelle) ((unsigned long) ( edge ).sh | (unsigned long) ( edge ).shorient )
 
 /* ssym() toggles the orientation of a shell edge.                           */
 
-#define ssym( edge1, edge2 )                                                                                                   \
-       ( edge2 ).sh = ( edge1 ).sh;                                                                                                    \
-       ( edge2 ).shorient = 1 - ( edge1 ).shorient
+#define
+ssym( edge1, edge2 )                                                    \
+    ( edge2 ).sh = ( edge1 ).sh;                                                    \
+    ( edge2 ).shorient = 1 - ( edge1 ).shorient
 
-#define ssymself( edge )                                                                                                               \
-       ( edge ).shorient = 1 - ( edge ).shorient
+#define
+ssymself( edge )                                                        \
+    ( edge ).shorient = 1 - ( edge ).shorient
 
 /* spivot() finds the other shell edge (from the same segment) that shares   */
 /*   the same origin.                                                        */
 
-#define spivot( edge1, edge2 )                                                                                                 \
-       sptr = ( edge1 ).sh[( edge1 ).shorient];                                                                                \
-       sdecode( sptr, edge2 )
+#define
+spivot( edge1, edge2 )                                                    \
+    sptr = ( edge1 ).sh[( edge1 ).shorient];                                        \
+    sdecode( sptr, edge2 )
 
-#define spivotself( edge )                                                                                                             \
-       sptr = ( edge ).sh[( edge ).shorient];                                                                                  \
-       sdecode( sptr, edge )
+#define
+spivotself( edge )                                                        \
+    sptr = ( edge ).sh[( edge ).shorient];                                            \
+    sdecode( sptr, edge )
 
 /* snext() finds the next shell edge (from the same segment) in sequence;    */
 /*   one whose origin is the input shell edge's destination.                 */
 
-#define snext( edge1, edge2 )                                                                                                  \
-       sptr = ( edge1 ).sh[1 - ( edge1 ).shorient];                                                                    \
-       sdecode( sptr, edge2 )
+#define
+snext( edge1, edge2 )                                                    \
+    sptr = ( edge1 ).sh[1 - ( edge1 ).shorient];                                    \
+    sdecode( sptr, edge2 )
 
-#define snextself( edge )                                                                                                              \
-       sptr = ( edge ).sh[1 - ( edge ).shorient];                                                                              \
-       sdecode( sptr, edge )
+#define
+snextself( edge )                                                        \
+    sptr = ( edge ).sh[1 - ( edge ).shorient];                                        \
+    sdecode( sptr, edge )
 
 /* These primitives determine or set the origin or destination of a shell    */
 /*   edge.                                                                   */
 
-#define sorg( edge, pointptr )                                                                                                 \
-       pointptr = (point) ( edge ).sh[2 + ( edge ).shorient]
+#define
+sorg( edge, pointptr )                                                    \
+    pointptr = (point) ( edge ).sh[2 + ( edge ).shorient]
 
-#define sdest( edge, pointptr )                                                                                                        \
-       pointptr = (point) ( edge ).sh[3 - ( edge ).shorient]
+#define
+sdest( edge, pointptr )                                                    \
+    pointptr = (point) ( edge ).sh[3 - ( edge ).shorient]
 
-#define setsorg( edge, pointptr )                                                                                              \
-       ( edge ).sh[2 + ( edge ).shorient] = (shelle) pointptr
+#define
+setsorg( edge, pointptr )                                                \
+    ( edge ).sh[2 + ( edge ).shorient] = (shelle) pointptr
 
-#define setsdest( edge, pointptr )                                                                                             \
-       ( edge ).sh[3 - ( edge ).shorient] = (shelle) pointptr
+#define
+setsdest( edge, pointptr )                                                \
+    ( edge ).sh[3 - ( edge ).shorient] = (shelle) pointptr
 
 /* These primitives read or set a shell marker.  Shell markers are used to   */
 /*   hold user boundary information.                                         */
 
-#define mark( edge )  ( *(int *) ( ( edge ).sh + 6 ) )
+#define
+mark( edge )  ( *(int *) (( edge ).sh + 6 ))
 
-#define setmark( edge, value )                                                                                                 \
-       *(int *) ( ( edge ).sh + 6 ) = value
+#define
+setmark( edge, value )                                                    \
+    *(int *) (( edge ).sh + 6 ) = value
 
 /* Bond two shell edges together.                                            */
 
-#define sbond( edge1, edge2 )                                                                                                  \
-       ( edge1 ).sh[( edge1 ).shorient] = sencode( edge2 );                                                      \
-       ( edge2 ).sh[( edge2 ).shorient] = sencode( edge1 )
+#define
+sbond( edge1, edge2 )                                                    \
+    ( edge1 ).sh[( edge1 ).shorient] = sencode( edge2 );                              \
+    ( edge2 ).sh[( edge2 ).shorient] = sencode( edge1 )
 
 /* Dissolve a shell edge bond (from one side).  Note that the other shell    */
 /*   edge will still think it's connected to this shell edge.                */
 
-#define sdissolve( edge )                                                                                                              \
-       ( edge ).sh[( edge ).shorient] = (shelle) dummysh
+#define
+sdissolve( edge )                                                        \
+    ( edge ).sh[( edge ).shorient] = (shelle) dummysh
 
 /* Copy a shell edge.                                                        */
 
-#define shellecopy( edge1, edge2 )                                                                                             \
-       ( edge2 ).sh = ( edge1 ).sh;                                                                                                    \
-       ( edge2 ).shorient = ( edge1 ).shorient
+#define
+shellecopy( edge1, edge2 )                                                \
+    ( edge2 ).sh = ( edge1 ).sh;                                                    \
+    ( edge2 ).shorient = ( edge1 ).shorient
 
 /* Test for equality of shell edges.                                         */
 
-#define shelleequal( edge1, edge2 )                                                                                            \
-       ( ( ( edge1 ).sh == ( edge2 ).sh ) &&                                                                                      \
-         ( ( edge1 ).shorient == ( edge2 ).shorient ) )
+#define
+shelleequal( edge1, edge2 )                                                \
+    ((( edge1 ).sh == ( edge2 ).sh ) &&                                               \
+      (( edge1 ).shorient == ( edge2 ).shorient ))
 
 /********* Primitives for interacting triangles and shell edges      *********/
 /*                                                                           */
@@ -1096,46 +1192,55 @@ int minus1mod3[3] = {2, 0, 1};
 
 /* tspivot() finds a shell edge abutting a triangle.                         */
 
-#define tspivot( triedge, edge )                                                                                               \
-       sptr = (shelle) ( triedge ).tri[6 + ( triedge ).orient];                                                \
-       sdecode( sptr, edge )
+#define
+tspivot( triedge, edge )                                                \
+    sptr = (shelle) ( triedge ).tri[6 + ( triedge ).orient];                        \
+    sdecode( sptr, edge )
 
 /* stpivot() finds a triangle abutting a shell edge.  It requires that the   */
 /*   variable `ptr' of type `triangle' be defined.                           */
 
-#define stpivot( edge, triedge )                                                                                               \
-       ptr = (triangle) ( edge ).sh[4 + ( edge ).shorient];                                                    \
-       decode( ptr, triedge )
+#define
+stpivot( edge, triedge )                                                \
+    ptr = (triangle) ( edge ).sh[4 + ( edge ).shorient];                            \
+    decode( ptr, triedge )
 
 /* Bond a triangle to a shell edge.                                          */
 
-#define tsbond( triedge, edge )                                                                                                        \
-       ( triedge ).tri[6 + ( triedge ).orient] = (triangle) sencode( edge );                     \
-       ( edge ).sh[4 + ( edge ).shorient] = (shelle) encode( triedge )
+#define
+tsbond( triedge, edge )                                                    \
+    ( triedge ).tri[6 + ( triedge ).orient] = (triangle) sencode( edge );              \
+    ( edge ).sh[4 + ( edge ).shorient] = (shelle) encode( triedge )
 
 /* Dissolve a bond (from the triangle side).                                 */
 
-#define tsdissolve( triedge )                                                                                                  \
-       ( triedge ).tri[6 + ( triedge ).orient] = (triangle) dummysh
+#define
+tsdissolve( triedge )                                                    \
+    ( triedge ).tri[6 + ( triedge ).orient] = (triangle) dummysh
 
 /* Dissolve a bond (from the shell edge side).                               */
 
-#define stdissolve( edge )                                                                                                             \
-       ( edge ).sh[4 + ( edge ).shorient] = (shelle) dummytri
+#define
+stdissolve( edge )                                                        \
+    ( edge ).sh[4 + ( edge ).shorient] = (shelle) dummytri
 
 /********* Primitives for points                                     *********/
 /*                                                                           */
 /*                                                                           */
 
-#define pointmark( pt )  ( (int *) ( pt ) )[pointmarkindex]
+#define
+pointmark( pt )  ((int *) ( pt ))[pointmarkindex]
 
-#define setpointmark( pt, value )                                                                                              \
-       ( (int *) ( pt ) )[pointmarkindex] = value
+#define
+setpointmark( pt, value )                                                \
+    ((int *) ( pt ))[pointmarkindex] = value
 
-#define point2tri( pt )  ( (triangle *) ( pt ) )[point2triindex]
+#define
+point2tri( pt )  ((triangle *) ( pt ))[point2triindex]
 
-#define setpoint2tri( pt, value )                                                                                              \
-       ( (triangle *) ( pt ) )[point2triindex] = value
+#define
+setpoint2tri( pt, value )                                                \
+    ((triangle *) ( pt ))[point2triindex] = value
 
 /**                                                                         **/
 /**                                                                         **/
@@ -1151,66 +1256,75 @@ int minus1mod3[3] = {2, 0, 1};
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 
 void syntax(){
-#ifdef CDT_ONLY
-#ifdef REDUCED
-       printf( "triangle [-pAcevngBPNEIOXzo_lQVh] input_file\n" );
+#ifdef
+CDT_ONLY
+#ifdef
+REDUCED
+printf( "triangle [-pAcevngBPNEIOXzo_lQVh] input_file\n" );
 #else /* not REDUCED */
-       printf( "triangle [-pAcevngBPNEIOXzo_iFlCQVh] input_file\n" );
+printf( "triangle [-pAcevngBPNEIOXzo_iFlCQVh] input_file\n" );
 #endif /* not REDUCED */
 #else /* not CDT_ONLY */
-#ifdef REDUCED
-       printf( "triangle [-prq__a__AcevngBPNEIOXzo_YS__lQVh] input_file\n" );
+#ifdef
+REDUCED
+printf( "triangle [-prq__a__AcevngBPNEIOXzo_YS__lQVh] input_file\n" );
 #else /* not REDUCED */
-       printf( "triangle [-prq__a__AcevngBPNEIOXzo_YS__iFlsCQVh] input_file\n" );
+printf( "triangle [-prq__a__AcevngBPNEIOXzo_YS__iFlsCQVh] input_file\n" );
 #endif /* not REDUCED */
 #endif /* not CDT_ONLY */
 
-       printf( "    -p  Triangulates a Planar Straight Line Graph (.poly file).\n" );
-#ifndef CDT_ONLY
-       printf( "    -r  Refines a previously generated mesh.\n" );
-       printf(
-               "    -q  Quality mesh generation.  A minimum angle may be specified.\n" );
-       printf( "    -a  Applies a maximum triangle area constraint.\n" );
+printf( "    -p  Triangulates a Planar Straight Line Graph (.poly file).\n" );
+#ifndef
+CDT_ONLY
+printf( "    -r  Refines a previously generated mesh.\n" );
+printf(
+"    -q  Quality mesh generation.  A minimum angle may be specified.\n" );
+printf( "    -a  Applies a maximum triangle area constraint.\n" );
 #endif /* not CDT_ONLY */
-       printf(
-               "    -A  Applies attributes to identify elements in certain regions.\n" );
-       printf( "    -c  Encloses the convex hull with segments.\n" );
-       printf( "    -e  Generates an edge list.\n" );
-       printf( "    -v  Generates a Voronoi diagram.\n" );
-       printf( "    -n  Generates a list of triangle neighbors.\n" );
-       printf( "    -g  Generates an .off file for Geomview.\n" );
-       printf( "    -B  Suppresses output of boundary information.\n" );
-       printf( "    -P  Suppresses output of .poly file.\n" );
-       printf( "    -N  Suppresses output of .node file.\n" );
-       printf( "    -E  Suppresses output of .ele file.\n" );
-       printf( "    -I  Suppresses mesh iteration numbers.\n" );
-       printf( "    -O  Ignores holes in .poly file.\n" );
-       printf( "    -X  Suppresses use of exact arithmetic.\n" );
-       printf( "    -z  Numbers all items starting from zero (rather than one).\n" );
-       printf( "    -o2 Generates second-order subparametric elements.\n" );
-#ifndef CDT_ONLY
-       printf( "    -Y  Suppresses boundary segment splitting.\n" );
-       printf( "    -S  Specifies maximum number of added Steiner points.\n" );
+printf(
+"    -A  Applies attributes to identify elements in certain regions.\n" );
+printf( "    -c  Encloses the convex hull with segments.\n" );
+printf( "    -e  Generates an edge list.\n" );
+printf( "    -v  Generates a Voronoi diagram.\n" );
+printf( "    -n  Generates a list of triangle neighbors.\n" );
+printf( "    -g  Generates an .off file for Geomview.\n" );
+printf( "    -B  Suppresses output of boundary information.\n" );
+printf( "    -P  Suppresses output of .poly file.\n" );
+printf( "    -N  Suppresses output of .node file.\n" );
+printf( "    -E  Suppresses output of .ele file.\n" );
+printf( "    -I  Suppresses mesh iteration numbers.\n" );
+printf( "    -O  Ignores holes in .poly file.\n" );
+printf( "    -X  Suppresses use of exact arithmetic.\n" );
+printf( "    -z  Numbers all items starting from zero (rather than one).\n" );
+printf( "    -o2 Generates second-order subparametric elements.\n" );
+#ifndef
+CDT_ONLY
+printf( "    -Y  Suppresses boundary segment splitting.\n" );
+printf( "    -S  Specifies maximum number of added Steiner points.\n" );
 #endif /* not CDT_ONLY */
-#ifndef REDUCED
-       printf( "    -i  Uses incremental method, rather than divide-and-conquer.\n" );
-       printf( "    -F  Uses Fortune's sweepline algorithm, rather than d-and-c.\n" );
+#ifndef
+REDUCED
+printf( "    -i  Uses incremental method, rather than divide-and-conquer.\n" );
+printf( "    -F  Uses Fortune's sweepline algorithm, rather than d-and-c.\n" );
 #endif /* not REDUCED */
-       printf( "    -l  Uses vertical cuts only, rather than alternating cuts.\n" );
-#ifndef REDUCED
-#ifndef CDT_ONLY
-       printf(
-               "    -s  Force segments into mesh by splitting (instead of using CDT).\n" );
+printf( "    -l  Uses vertical cuts only, rather than alternating cuts.\n" );
+#ifndef
+REDUCED
+#ifndef
+CDT_ONLY
+printf(
+"    -s  Force segments into mesh by splitting (instead of using CDT).\n" );
 #endif /* not CDT_ONLY */
-       printf( "    -C  Check consistency of final mesh.\n" );
+printf( "    -C  Check consistency of final mesh.\n" );
 #endif /* not REDUCED */
-       printf( "    -Q  Quiet:  No terminal output except errors.\n" );
-       printf( "    -V  Verbose:  Detailed information on what I'm doing.\n" );
-       printf( "    -h  Help:  Detailed instructions for Triangle.\n" );
-       exit( 0 );
+printf( "    -Q  Quiet:  No terminal output except errors.\n" );
+printf( "    -V  Verbose:  Detailed information on what I'm doing.\n" );
+printf( "    -h  Help:  Detailed instructions for Triangle.\n" );
+exit( 0 );
 }
 
 #endif /* not TRILIBRARY */
@@ -1221,1428 +1335,1433 @@ void syntax(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 
 void info(){
-       printf( "Triangle\n" );
-       printf(
-               "A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator.\n" );
-       printf( "Version 1.3\n\n" );
-       printf(
-               "Copyright 1996 Jonathan Richard Shewchuk  (bugs/comments to jrs@cs.cmu.edu)\n"
-               );
-       printf( "School of Computer Science / Carnegie Mellon University\n" );
-       printf( "5000 Forbes Avenue / Pittsburgh, Pennsylvania  15213-3891\n" );
-       printf(
-               "Created as part of the Archimedes project (tools for parallel FEM).\n" );
-       printf(
-               "Supported in part by NSF Grant CMS-9318163 and an NSERC 1967 Scholarship.\n" );
-       printf( "There is no warranty whatsoever.  Use at your own risk.\n" );
-#ifdef SINGLE
-       printf( "This executable is compiled for single precision arithmetic.\n\n\n" );
+printf( "Triangle\n" );
+printf(
+"A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator.\n" );
+printf( "Version 1.3\n\n" );
+printf(
+"Copyright 1996 Jonathan Richard Shewchuk  (bugs/comments to jrs@cs.cmu.edu)\n"
+);
+printf( "School of Computer Science / Carnegie Mellon University\n" );
+printf( "5000 Forbes Avenue / Pittsburgh, Pennsylvania  15213-3891\n" );
+printf(
+"Created as part of the Archimedes project (tools for parallel FEM).\n" );
+printf(
+"Supported in part by NSF Grant CMS-9318163 and an NSERC 1967 Scholarship.\n" );
+printf( "There is no warranty whatsoever.  Use at your own risk.\n" );
+#ifdef
+SINGLE
+printf( "This executable is compiled for single precision arithmetic.\n\n\n" );
 #else /* not SINGLE */
-       printf( "This executable is compiled for double precision arithmetic.\n\n\n" );
+printf( "This executable is compiled for double precision arithmetic.\n\n\n" );
 #endif /* not SINGLE */
-       printf(
-               "Triangle generates exact Delaunay triangulations, constrained Delaunay\n" );
-       printf(
-               "triangulations, and quality conforming Delaunay triangulations.  The latter\n"
-               );
-       printf(
-               "can be generated with no small angles, and are thus suitable for finite\n" );
-       printf(
-               "element analysis.  If no command line switches are specified, your .node\n" );
-       printf(
-               "input file will be read, and the Delaunay triangulation will be returned in\n"
-               );
-       printf( ".node and .ele output files.  The command syntax is:\n\n" );
-#ifdef CDT_ONLY
-#ifdef REDUCED
-       printf( "triangle [-pAcevngBPNEIOXzo_lQVh] input_file\n\n" );
+printf(
+"Triangle generates exact Delaunay triangulations, constrained Delaunay\n" );
+printf(
+"triangulations, and quality conforming Delaunay triangulations.  The latter\n"
+);
+printf(
+"can be generated with no small angles, and are thus suitable for finite\n" );
+printf(
+"element analysis.  If no command line switches are specified, your .node\n" );
+printf(
+"input file will be read, and the Delaunay triangulation will be returned in\n"
+);
+printf( ".node and .ele output files.  The command syntax is:\n\n" );
+#ifdef
+CDT_ONLY
+#ifdef
+REDUCED
+printf( "triangle [-pAcevngBPNEIOXzo_lQVh] input_file\n\n" );
 #else /* not REDUCED */
-       printf( "triangle [-pAcevngBPNEIOXzo_iFlCQVh] input_file\n\n" );
+printf( "triangle [-pAcevngBPNEIOXzo_iFlCQVh] input_file\n\n" );
 #endif /* not REDUCED */
 #else /* not CDT_ONLY */
-#ifdef REDUCED
-       printf( "triangle [-prq__a__AcevngBPNEIOXzo_YS__lQVh] input_file\n\n" );
+#ifdef
+REDUCED
+printf( "triangle [-prq__a__AcevngBPNEIOXzo_YS__lQVh] input_file\n\n" );
 #else /* not REDUCED */
-       printf( "triangle [-prq__a__AcevngBPNEIOXzo_YS__iFlsCQVh] input_file\n\n" );
+printf( "triangle [-prq__a__AcevngBPNEIOXzo_YS__iFlsCQVh] input_file\n\n" );
 #endif /* not REDUCED */
 #endif /* not CDT_ONLY */
-       printf(
-               "Underscores indicate that numbers may optionally follow certain switches;\n" );
-       printf(
-               "do not leave any space between a switch and its numeric parameter.\n" );
-       printf(
-               "input_file must be a file with extension .node, or extension .poly if the\n" );
-       printf(
-               "-p switch is used.  If -r is used, you must supply .node and .ele files,\n" );
-       printf(
-               "and possibly a .poly file and .area file as well.  The formats of these\n" );
-       printf( "files are described below.\n\n" );
-       printf( "Command Line Switches:\n\n" );
-       printf(
-               "    -p  Reads a Planar Straight Line Graph (.poly file), which can specify\n"
-               );
-       printf(
-               "        points, segments, holes, and regional attributes and area\n" );
-       printf(
-               "        constraints.  Will generate a constrained Delaunay triangulation\n" );
-       printf(
-               "        fitting the input; or, if -s, -q, or -a is used, a conforming\n" );
-       printf(
-               "        Delaunay triangulation.  If -p is not used, Triangle reads a .node\n"
-               );
-       printf( "        file by default.\n" );
-       printf(
-               "    -r  Refines a previously generated mesh.  The mesh is read from a .node\n"
-               );
-       printf(
-               "        file and an .ele file.  If -p is also used, a .poly file is read\n" );
-       printf(
-               "        and used to constrain edges in the mesh.  Further details on\n" );
-       printf( "        refinement are given below.\n" );
-       printf(
-               "    -q  Quality mesh generation by Jim Ruppert's Delaunay refinement\n" );
-       printf(
-               "        algorithm.  Adds points to the mesh to ensure that no angles\n" );
-       printf(
-               "        smaller than 20 degrees occur.  An alternative minimum angle may be\n"
-               );
-       printf(
-               "        specified after the `q'.  If the minimum angle is 20.7 degrees or\n" );
-       printf(
-               "        smaller, the triangulation algorithm is theoretically guaranteed to\n"
-               );
-       printf(
-               "        terminate (assuming infinite precision arithmetic - Triangle may\n" );
-       printf(
-               "        fail to terminate if you run out of precision).  In practice, the\n" );
-       printf(
-               "        algorithm often succeeds for minimum angles up to 33.8 degrees.\n" );
-       printf(
-               "        For highly refined meshes, however, it may be necessary to reduce\n" );
-       printf(
-               "        the minimum angle to well below 20 to avoid problems associated\n" );
-       printf(
-               "        with insufficient floating-point precision.  The specified angle\n" );
-       printf( "        may include a decimal point.\n" );
-       printf(
-               "    -a  Imposes a maximum triangle area.  If a number follows the `a', no\n" );
-       printf(
-               "        triangle will be generated whose area is larger than that number.\n" );
-       printf(
-               "        If no number is specified, an .area file (if -r is used) or .poly\n" );
-       printf(
-               "        file (if -r is not used) specifies a number of maximum area\n" );
-       printf(
-               "        constraints.  An .area file contains a separate area constraint for\n"
-               );
-       printf(
-               "        each triangle, and is useful for refining a finite element mesh\n" );
-       printf(
-               "        based on a posteriori error estimates.  A .poly file can optionally\n"
-               );
-       printf(
-               "        contain an area constraint for each segment-bounded region, thereby\n"
-               );
-       printf(
-               "        enforcing triangle densities in a first triangulation.  You can\n" );
-       printf(
-               "        impose both a fixed area constraint and a varying area constraint\n" );
-       printf(
-               "        by invoking the -a switch twice, once with and once without a\n" );
-       printf(
-               "        number following.  Each area specified may include a decimal point.\n"
-               );
-       printf(
-               "    -A  Assigns an additional attribute to each triangle that identifies\n" );
-       printf(
-               "        what segment-bounded region each triangle belongs to.  Attributes\n" );
-       printf(
-               "        are assigned to regions by the .poly file.  If a region is not\n" );
-       printf(
-               "        explicitly marked by the .poly file, triangles in that region are\n" );
-       printf(
-               "        assigned an attribute of zero.  The -A switch has an effect only\n" );
-       printf( "        when the -p switch is used and the -r switch is not.\n" );
-       printf(
-               "    -c  Creates segments on the convex hull of the triangulation.  If you\n" );
-       printf(
-               "        are triangulating a point set, this switch causes a .poly file to\n" );
-       printf(
-               "        be written, containing all edges in the convex hull.  (By default,\n"
-               );
-       printf(
-               "        a .poly file is written only if a .poly file is read.)  If you are\n"
-               );
-       printf(
-               "        triangulating a PSLG, this switch specifies that the interior of\n" );
-       printf(
-               "        the convex hull of the PSLG should be triangulated.  If you do not\n"
-               );
-       printf(
-               "        use this switch when triangulating a PSLG, it is assumed that you\n" );
-       printf(
-               "        have identified the region to be triangulated by surrounding it\n" );
-       printf(
-               "        with segments of the input PSLG.  Beware:  if you are not careful,\n"
-               );
-       printf(
-               "        this switch can cause the introduction of an extremely thin angle\n" );
-       printf(
-               "        between a PSLG segment and a convex hull segment, which can cause\n" );
-       printf(
-               "        overrefinement or failure if Triangle runs out of precision.  If\n" );
-       printf(
-               "        you are refining a mesh, the -c switch works differently; it\n" );
-       printf(
-               "        generates the set of boundary edges of the mesh, rather than the\n" );
-       printf( "        convex hull.\n" );
-       printf(
-               "    -e  Outputs (to an .edge file) a list of edges of the triangulation.\n" );
-       printf(
-               "    -v  Outputs the Voronoi diagram associated with the triangulation.\n" );
-       printf( "        Does not attempt to detect degeneracies.\n" );
-       printf(
-               "    -n  Outputs (to a .neigh file) a list of triangles neighboring each\n" );
-       printf( "        triangle.\n" );
-       printf(
-               "    -g  Outputs the mesh to an Object File Format (.off) file, suitable for\n"
-               );
-       printf( "        viewing with the Geometry Center's Geomview package.\n" );
-       printf(
-               "    -B  No boundary markers in the output .node, .poly, and .edge output\n" );
-       printf(
-               "        files.  See the detailed discussion of boundary markers below.\n" );
-       printf(
-               "    -P  No output .poly file.  Saves disk space, but you lose the ability\n" );
-       printf(
-               "        to impose segment constraints on later refinements of the mesh.\n" );
-       printf( "    -N  No output .node file.\n" );
-       printf( "    -E  No output .ele file.\n" );
-       printf(
-               "    -I  No iteration numbers.  Suppresses the output of .node and .poly\n" );
-       printf(
-               "        files, so your input files won't be overwritten.  (If your input is\n"
-               );
-       printf(
-               "        a .poly file only, a .node file will be written.)  Cannot be used\n" );
-       printf(
-               "        with the -r switch, because that would overwrite your input .ele\n" );
-       printf(
-               "        file.  Shouldn't be used with the -s, -q, or -a switch if you are\n" );
-       printf(
-               "        using a .node file for input, because no .node file will be\n" );
-       printf( "        written, so there will be no record of any added points.\n" );
-       printf( "    -O  No holes.  Ignores the holes in the .poly file.\n" );
-       printf(
-               "    -X  No exact arithmetic.  Normally, Triangle uses exact floating-point\n"
-               );
-       printf(
-               "        arithmetic for certain tests if it thinks the inexact tests are not\n"
-               );
-       printf(
-               "        accurate enough.  Exact arithmetic ensures the robustness of the\n" );
-       printf(
-               "        triangulation algorithms, despite floating-point roundoff error.\n" );
-       printf(
-               "        Disabling exact arithmetic with the -X switch will cause a small\n" );
-       printf(
-               "        improvement in speed and create the possibility (albeit small) that\n"
-               );
-       printf(
-               "        Triangle will fail to produce a valid mesh.  Not recommended.\n" );
-       printf(
-               "    -z  Numbers all items starting from zero (rather than one).  Note that\n"
-               );
-       printf(
-               "        this switch is normally overrided by the value used to number the\n" );
-       printf(
-               "        first point of the input .node or .poly file.  However, this switch\n"
-               );
-       printf( "        is useful when calling Triangle from another program.\n" );
-       printf(
-               "    -o2 Generates second-order subparametric elements with six nodes each.\n"
-               );
-       printf(
-               "    -Y  No new points on the boundary.  This switch is useful when the mesh\n"
-               );
-       printf(
-               "        boundary must be preserved so that it conforms to some adjacent\n" );
-       printf(
-               "        mesh.  Be forewarned that you will probably sacrifice some of the\n" );
-       printf(
-               "        quality of the mesh; Triangle will try, but the resulting mesh may\n"
-               );
-       printf(
-               "        contain triangles of poor aspect ratio.  Works well if all the\n" );
-       printf(
-               "        boundary points are closely spaced.  Specify this switch twice\n" );
-       printf(
-               "        (`-YY') to prevent all segment splitting, including internal\n" );
-       printf( "        boundaries.\n" );
-       printf(
-               "    -S  Specifies the maximum number of Steiner points (points that are not\n"
-               );
-       printf(
-               "        in the input, but are added to meet the constraints of minimum\n" );
-       printf(
-               "        angle and maximum area).  The default is to allow an unlimited\n" );
-       printf(
-               "        number.  If you specify this switch with no number after it,\n" );
-       printf(
-               "        the limit is set to zero.  Triangle always adds points at segment\n" );
-       printf(
-               "        intersections, even if it needs to use more points than the limit\n" );
-       printf(
-               "        you set.  When Triangle inserts segments by splitting (-s), it\n" );
-       printf(
-               "        always adds enough points to ensure that all the segments appear in\n"
-               );
-       printf(
-               "        the triangulation, again ignoring the limit.  Be forewarned that\n" );
-       printf(
-               "        the -S switch may result in a conforming triangulation that is not\n"
-               );
-       printf(
-               "        truly Delaunay, because Triangle may be forced to stop adding\n" );
-       printf(
-               "        points when the mesh is in a state where a segment is non-Delaunay\n"
-               );
-       printf(
-               "        and needs to be split.  If so, Triangle will print a warning.\n" );
-       printf(
-               "    -i  Uses an incremental rather than divide-and-conquer algorithm to\n" );
-       printf(
-               "        form a Delaunay triangulation.  Try it if the divide-and-conquer\n" );
-       printf( "        algorithm fails.\n" );
-       printf(
-               "    -F  Uses Steven Fortune's sweepline algorithm to form a Delaunay\n" );
-       printf(
-               "        triangulation.  Warning:  does not use exact arithmetic for all\n" );
-       printf( "        calculations.  An exact result is not guaranteed.\n" );
-       printf(
-               "    -l  Uses only vertical cuts in the divide-and-conquer algorithm.  By\n" );
-       printf(
-               "        default, Triangle uses alternating vertical and horizontal cuts,\n" );
-       printf(
-               "        which usually improve the speed except with point sets that are\n" );
-       printf(
-               "        small or short and wide.  This switch is primarily of theoretical\n" );
-       printf( "        interest.\n" );
-       printf(
-               "    -s  Specifies that segments should be forced into the triangulation by\n"
-               );
-       printf(
-               "        recursively splitting them at their midpoints, rather than by\n" );
-       printf(
-               "        generating a constrained Delaunay triangulation.  Segment splitting\n"
-               );
-       printf(
-               "        is true to Ruppert's original algorithm, but can create needlessly\n"
-               );
-       printf( "        small triangles near external small features.\n" );
-       printf(
-               "    -C  Check the consistency of the final mesh.  Uses exact arithmetic for\n"
-               );
-       printf(
-               "        checking, even if the -X switch is used.  Useful if you suspect\n" );
-       printf( "        Triangle is buggy.\n" );
-       printf(
-               "    -Q  Quiet: Suppresses all explanation of what Triangle is doing, unless\n"
-               );
-       printf( "        an error occurs.\n" );
-       printf(
-               "    -V  Verbose: Gives detailed information about what Triangle is doing.\n" );
-       printf(
-               "        Add more `V's for increasing amount of detail.  `-V' gives\n" );
-       printf(
-               "        information on algorithmic progress and more detailed statistics.\n" );
-       printf(
-               "        `-VV' gives point-by-point details, and will print so much that\n" );
-       printf(
-               "        Triangle will run much more slowly.  `-VVV' gives information only\n"
-               );
-       printf( "        a debugger could love.\n" );
-       printf( "    -h  Help:  Displays these instructions.\n" );
-       printf( "\n" );
-       printf( "Definitions:\n" );
-       printf( "\n" );
-       printf(
-               "  A Delaunay triangulation of a point set is a triangulation whose vertices\n"
-               );
-       printf(
-               "  are the point set, having the property that no point in the point set\n" );
-       printf(
-               "  falls in the interior of the circumcircle (circle that passes through all\n"
-               );
-       printf( "  three vertices) of any triangle in the triangulation.\n\n" );
-       printf(
-               "  A Voronoi diagram of a point set is a subdivision of the plane into\n" );
-       printf(
-               "  polygonal regions (some of which may be infinite), where each region is\n" );
-       printf(
-               "  the set of points in the plane that are closer to some input point than\n" );
-       printf(
-               "  to any other input point.  (The Voronoi diagram is the geometric dual of\n"
-               );
-       printf( "  the Delaunay triangulation.)\n\n" );
-       printf(
-               "  A Planar Straight Line Graph (PSLG) is a collection of points and\n" );
-       printf(
-               "  segments.  Segments are simply edges, whose endpoints are points in the\n" );
-       printf(
-               "  PSLG.  The file format for PSLGs (.poly files) is described below.\n" );
-       printf( "\n" );
-       printf(
-               "  A constrained Delaunay triangulation of a PSLG is similar to a Delaunay\n" );
-       printf(
-               "  triangulation, but each PSLG segment is present as a single edge in the\n" );
-       printf(
-               "  triangulation.  (A constrained Delaunay triangulation is not truly a\n" );
-       printf( "  Delaunay triangulation.)\n\n" );
-       printf(
-               "  A conforming Delaunay triangulation of a PSLG is a true Delaunay\n" );
-       printf(
-               "  triangulation in which each PSLG segment may have been subdivided into\n" );
-       printf(
-               "  several edges by the insertion of additional points.  These inserted\n" );
-       printf(
-               "  points are necessary to allow the segments to exist in the mesh while\n" );
-       printf( "  maintaining the Delaunay property.\n\n" );
-       printf( "File Formats:\n\n" );
-       printf(
-               "  All files may contain comments prefixed by the character '#'.  Points,\n" );
-       printf(
-               "  triangles, edges, holes, and maximum area constraints must be numbered\n" );
-       printf(
-               "  consecutively, starting from either 1 or 0.  Whichever you choose, all\n" );
-       printf(
-               "  input files must be consistent; if the nodes are numbered from 1, so must\n"
-               );
-       printf(
-               "  be all other objects.  Triangle automatically detects your choice while\n" );
-       printf(
-               "  reading the .node (or .poly) file.  (When calling Triangle from another\n" );
-       printf(
-               "  program, use the -z switch if you wish to number objects from zero.)\n" );
-       printf( "  Examples of these file formats are given below.\n\n" );
-       printf( "  .node files:\n" );
-       printf(
-               "    First line:  <# of points> <dimension (must be 2)> <# of attributes>\n" );
-       printf(
-               "                                           <# of boundary markers (0 or 1)>\n"
-               );
-       printf(
-               "    Remaining lines:  <point #> <x> <y> [attributes] [boundary marker]\n" );
-       printf( "\n" );
-       printf(
-               "    The attributes, which are typically floating-point values of physical\n" );
-       printf(
-               "    quantities (such as mass or conductivity) associated with the nodes of\n"
-               );
-       printf(
-               "    a finite element mesh, are copied unchanged to the output mesh.  If -s,\n"
-               );
-       printf(
-               "    -q, or -a is selected, each new Steiner point added to the mesh will\n" );
-       printf( "    have attributes assigned to it by linear interpolation.\n\n" );
-       printf(
-               "    If the fourth entry of the first line is `1', the last column of the\n" );
-       printf(
-               "    remainder of the file is assumed to contain boundary markers.  Boundary\n"
-               );
-       printf(
-               "    markers are used to identify boundary points and points resting on PSLG\n"
-               );
-       printf(
-               "    segments; a complete description appears in a section below.  The .node\n"
-               );
-       printf(
-               "    file produced by Triangle will contain boundary markers in the last\n" );
-       printf( "    column unless they are suppressed by the -B switch.\n\n" );
-       printf( "  .ele files:\n" );
-       printf(
-               "    First line:  <# of triangles> <points per triangle> <# of attributes>\n" );
-       printf(
-               "    Remaining lines:  <triangle #> <point> <point> <point> ... [attributes]\n"
-               );
-       printf( "\n" );
-       printf(
-               "    Points are indices into the corresponding .node file.  The first three\n"
-               );
-       printf(
-               "    points are the corners, and are listed in counterclockwise order around\n"
-               );
-       printf(
-               "    each triangle.  (The remaining points, if any, depend on the type of\n" );
-       printf(
-               "    finite element used.)  The attributes are just like those of .node\n" );
-       printf(
-               "    files.  Because there is no simple mapping from input to output\n" );
-       printf(
-               "    triangles, an attempt is made to interpolate attributes, which may\n" );
-       printf(
-               "    result in a good deal of diffusion of attributes among nearby triangles\n"
-               );
-       printf(
-               "    as the triangulation is refined.  Diffusion does not occur across\n" );
-       printf(
-               "    segments, so attributes used to identify segment-bounded regions remain\n"
-               );
-       printf(
-               "    intact.  In output .ele files, all triangles have three points each\n" );
-       printf(
-               "    unless the -o2 switch is used, in which case they have six, and the\n" );
-       printf(
-               "    fourth, fifth, and sixth points lie on the midpoints of the edges\n" );
-       printf( "    opposite the first, second, and third corners.\n\n" );
-       printf( "  .poly files:\n" );
-       printf(
-               "    First line:  <# of points> <dimension (must be 2)> <# of attributes>\n" );
-       printf(
-               "                                           <# of boundary markers (0 or 1)>\n"
-               );
-       printf(
-               "    Following lines:  <point #> <x> <y> [attributes] [boundary marker]\n" );
-       printf( "    One line:  <# of segments> <# of boundary markers (0 or 1)>\n" );
-       printf(
-               "    Following lines:  <segment #> <endpoint> <endpoint> [boundary marker]\n" );
-       printf( "    One line:  <# of holes>\n" );
-       printf( "    Following lines:  <hole #> <x> <y>\n" );
-       printf(
-               "    Optional line:  <# of regional attributes and/or area constraints>\n" );
-       printf(
-               "    Optional following lines:  <constraint #> <x> <y> <attrib> <max area>\n" );
-       printf( "\n" );
-       printf(
-               "    A .poly file represents a PSLG, as well as some additional information.\n"
-               );
-       printf(
-               "    The first section lists all the points, and is identical to the format\n"
-               );
-       printf(
-               "    of .node files.  <# of points> may be set to zero to indicate that the\n"
-               );
-       printf(
-               "    points are listed in a separate .node file; .poly files produced by\n" );
-       printf(
-               "    Triangle always have this format.  This has the advantage that a point\n"
-               );
-       printf(
-               "    set may easily be triangulated with or without segments.  (The same\n" );
-       printf(
-               "    effect can be achieved, albeit using more disk space, by making a copy\n"
-               );
-       printf(
-               "    of the .poly file with the extension .node; all sections of the file\n" );
-       printf( "    but the first are ignored.)\n\n" );
-       printf(
-               "    The second section lists the segments.  Segments are edges whose\n" );
-       printf(
-               "    presence in the triangulation is enforced.  Each segment is specified\n" );
-       printf(
-               "    by listing the indices of its two endpoints.  This means that you must\n"
-               );
-       printf(
-               "    include its endpoints in the point list.  If -s, -q, and -a are not\n" );
-       printf(
-               "    selected, Triangle will produce a constrained Delaunay triangulation,\n" );
-       printf(
-               "    in which each segment appears as a single edge in the triangulation.\n" );
-       printf(
-               "    If -q or -a is selected, Triangle will produce a conforming Delaunay\n" );
-       printf(
-               "    triangulation, in which segments may be subdivided into smaller edges.\n"
-               );
-       printf( "    Each segment, like each point, may have a boundary marker.\n\n" );
-       printf(
-               "    The third section lists holes (and concavities, if -c is selected) in\n" );
-       printf(
-               "    the triangulation.  Holes are specified by identifying a point inside\n" );
-       printf(
-               "    each hole.  After the triangulation is formed, Triangle creates holes\n" );
-       printf(
-               "    by eating triangles, spreading out from each hole point until its\n" );
-       printf(
-               "    progress is blocked by PSLG segments; you must be careful to enclose\n" );
-       printf(
-               "    each hole in segments, or your whole triangulation may be eaten away.\n" );
-       printf(
-               "    If the two triangles abutting a segment are eaten, the segment itself\n" );
-       printf(
-               "    is also eaten.  Do not place a hole directly on a segment; if you do,\n" );
-       printf( "    Triangle will choose one side of the segment arbitrarily.\n\n" );
-       printf(
-               "    The optional fourth section lists regional attributes (to be assigned\n" );
-       printf(
-               "    to all triangles in a region) and regional constraints on the maximum\n" );
-       printf(
-               "    triangle area.  Triangle will read this section only if the -A switch\n" );
-       printf(
-               "    is used or the -a switch is used without a number following it, and the\n"
-               );
-       printf(
-               "    -r switch is not used.  Regional attributes and area constraints are\n" );
-       printf(
-               "    propagated in the same manner as holes; you specify a point for each\n" );
-       printf(
-               "    attribute and/or constraint, and the attribute and/or constraint will\n" );
-       printf(
-               "    affect the whole region (bounded by segments) containing the point.  If\n"
-               );
-       printf(
-               "    two values are written on a line after the x and y coordinate, the\n" );
-       printf(
-               "    former is assumed to be a regional attribute (but will only be applied\n"
-               );
-       printf(
-               "    if the -A switch is selected), and the latter is assumed to be a\n" );
-       printf(
-               "    regional area constraint (but will only be applied if the -a switch is\n"
-               );
-       printf(
-               "    selected).  You may also specify just one value after the coordinates,\n"
-               );
-       printf(
-               "    which can serve as both an attribute and an area constraint, depending\n"
-               );
-       printf(
-               "    on the choice of switches.  If you are using the -A and -a switches\n" );
-       printf(
-               "    simultaneously and wish to assign an attribute to some region without\n" );
-       printf( "    imposing an area constraint, use a negative maximum area.\n\n" );
-       printf(
-               "    When a triangulation is created from a .poly file, you must either\n" );
-       printf(
-               "    enclose the entire region to be triangulated in PSLG segments, or\n" );
-       printf(
-               "    use the -c switch, which encloses the convex hull of the input point\n" );
-       printf(
-               "    set.  If you do not use the -c switch, Triangle will eat all triangles\n"
-               );
-       printf(
-               "    on the outer boundary that are not protected by segments; if you are\n" );
-       printf(
-               "    not careful, your whole triangulation may be eaten away.  If you do\n" );
-       printf(
-               "    use the -c switch, you can still produce concavities by appropriate\n" );
-       printf( "    placement of holes just inside the convex hull.\n\n" );
-       printf(
-               "    An ideal PSLG has no intersecting segments, nor any points that lie\n" );
-       printf(
-               "    upon segments (except, of course, the endpoints of each segment.)  You\n"
-               );
-       printf(
-               "    aren't required to make your .poly files ideal, but you should be aware\n"
-               );
-       printf(
-               "    of what can go wrong.  Segment intersections are relatively safe -\n" );
-       printf(
-               "    Triangle will calculate the intersection points for you and add them to\n"
-               );
-       printf(
-               "    the triangulation - as long as your machine's floating-point precision\n"
-               );
-       printf(
-               "    doesn't become a problem.  You are tempting the fates if you have three\n"
-               );
-       printf(
-               "    segments that cross at the same location, and expect Triangle to figure\n"
-               );
-       printf(
-               "    out where the intersection point is.  Thanks to floating-point roundoff\n"
-               );
-       printf(
-               "    error, Triangle will probably decide that the three segments intersect\n"
-               );
-       printf(
-               "    at three different points, and you will find a minuscule triangle in\n" );
-       printf(
-               "    your output - unless Triangle tries to refine the tiny triangle, uses\n" );
-       printf(
-               "    up the last bit of machine precision, and fails to terminate at all.\n" );
-       printf(
-               "    You're better off putting the intersection point in the input files,\n" );
-       printf(
-               "    and manually breaking up each segment into two.  Similarly, if you\n" );
-       printf(
-               "    place a point at the middle of a segment, and hope that Triangle will\n" );
-       printf(
-               "    break up the segment at that point, you might get lucky.  On the other\n"
-               );
-       printf(
-               "    hand, Triangle might decide that the point doesn't lie precisely on the\n"
-               );
-       printf(
-               "    line, and you'll have a needle-sharp triangle in your output - or a lot\n"
-               );
-       printf( "    of tiny triangles if you're generating a quality mesh.\n\n" );
-       printf(
-               "    When Triangle reads a .poly file, it also writes a .poly file, which\n" );
-       printf(
-               "    includes all edges that are part of input segments.  If the -c switch\n" );
-       printf(
-               "    is used, the output .poly file will also include all of the edges on\n" );
-       printf(
-               "    the convex hull.  Hence, the output .poly file is useful for finding\n" );
-       printf(
-               "    edges associated with input segments and setting boundary conditions in\n"
-               );
-       printf(
-               "    finite element simulations.  More importantly, you will need it if you\n"
-               );
-       printf(
-               "    plan to refine the output mesh, and don't want segments to be missing\n" );
-       printf( "    in later triangulations.\n\n" );
-       printf( "  .area files:\n" );
-       printf( "    First line:  <# of triangles>\n" );
-       printf( "    Following lines:  <triangle #> <maximum area>\n\n" );
-       printf(
-               "    An .area file associates with each triangle a maximum area that is used\n"
-               );
-       printf(
-               "    for mesh refinement.  As with other file formats, every triangle must\n" );
-       printf(
-               "    be represented, and they must be numbered consecutively.  A triangle\n" );
-       printf(
-               "    may be left unconstrained by assigning it a negative maximum area.\n" );
-       printf( "\n" );
-       printf( "  .edge files:\n" );
-       printf( "    First line:  <# of edges> <# of boundary markers (0 or 1)>\n" );
-       printf(
-               "    Following lines:  <edge #> <endpoint> <endpoint> [boundary marker]\n" );
-       printf( "\n" );
-       printf(
-               "    Endpoints are indices into the corresponding .node file.  Triangle can\n"
-               );
-       printf(
-               "    produce .edge files (use the -e switch), but cannot read them.  The\n" );
-       printf(
-               "    optional column of boundary markers is suppressed by the -B switch.\n" );
-       printf( "\n" );
-       printf(
-               "    In Voronoi diagrams, one also finds a special kind of edge that is an\n" );
-       printf(
-               "    infinite ray with only one endpoint.  For these edges, a different\n" );
-       printf( "    format is used:\n\n" );
-       printf( "        <edge #> <endpoint> -1 <direction x> <direction y>\n\n" );
-       printf(
-               "    The `direction' is a floating-point vector that indicates the direction\n"
-               );
-       printf( "    of the infinite ray.\n\n" );
-       printf( "  .neigh files:\n" );
-       printf(
-               "    First line:  <# of triangles> <# of neighbors per triangle (always 3)>\n"
-               );
-       printf(
-               "    Following lines:  <triangle #> <neighbor> <neighbor> <neighbor>\n" );
-       printf( "\n" );
-       printf(
-               "    Neighbors are indices into the corresponding .ele file.  An index of -1\n"
-               );
-       printf(
-               "    indicates a mesh boundary, and therefore no neighbor.  Triangle can\n" );
-       printf(
-               "    produce .neigh files (use the -n switch), but cannot read them.\n" );
-       printf( "\n" );
-       printf(
-               "    The first neighbor of triangle i is opposite the first corner of\n" );
-       printf( "    triangle i, and so on.\n\n" );
-       printf( "Boundary Markers:\n\n" );
-       printf(
-               "  Boundary markers are tags used mainly to identify which output points and\n"
-               );
-       printf(
-               "  edges are associated with which PSLG segment, and to identify which\n" );
-       printf(
-               "  points and edges occur on a boundary of the triangulation.  A common use\n"
-               );
-       printf(
-               "  is to determine where boundary conditions should be applied to a finite\n" );
-       printf(
-               "  element mesh.  You can prevent boundary markers from being written into\n" );
-       printf( "  files produced by Triangle by using the -B switch.\n\n" );
-       printf(
-               "  The boundary marker associated with each segment in an output .poly file\n"
-               );
-       printf( "  or edge in an output .edge file is chosen as follows:\n" );
-       printf(
-               "    - If an output edge is part or all of a PSLG segment with a nonzero\n" );
-       printf(
-               "      boundary marker, then the edge is assigned the same marker.\n" );
-       printf(
-               "    - Otherwise, if the edge occurs on a boundary of the triangulation\n" );
-       printf(
-               "      (including boundaries of holes), then the edge is assigned the marker\n"
-               );
-       printf( "      one (1).\n" );
-       printf( "    - Otherwise, the edge is assigned the marker zero (0).\n" );
-       printf(
-               "  The boundary marker associated with each point in an output .node file is\n"
-               );
-       printf( "  chosen as follows:\n" );
-       printf(
-               "    - If a point is assigned a nonzero boundary marker in the input file,\n" );
-       printf(
-               "      then it is assigned the same marker in the output .node file.\n" );
-       printf(
-               "    - Otherwise, if the point lies on a PSLG segment (including the\n" );
-       printf(
-               "      segment's endpoints) with a nonzero boundary marker, then the point\n" );
-       printf(
-               "      is assigned the same marker.  If the point lies on several such\n" );
-       printf( "      segments, one of the markers is chosen arbitrarily.\n" );
-       printf(
-               "    - Otherwise, if the point occurs on a boundary of the triangulation,\n" );
-       printf( "      then the point is assigned the marker one (1).\n" );
-       printf( "    - Otherwise, the point is assigned the marker zero (0).\n" );
-       printf( "\n" );
-       printf(
-               "  If you want Triangle to determine for you which points and edges are on\n" );
-       printf(
-               "  the boundary, assign them the boundary marker zero (or use no markers at\n"
-               );
-       printf(
-               "  all) in your input files.  Alternatively, you can mark some of them and\n" );
-       printf( "  leave others marked zero, allowing Triangle to label them.\n\n" );
-       printf( "Triangulation Iteration Numbers:\n\n" );
-       printf(
-               "  Because Triangle can read and refine its own triangulations, input\n" );
-       printf(
-               "  and output files have iteration numbers.  For instance, Triangle might\n" );
-       printf(
-               "  read the files mesh.3.node, mesh.3.ele, and mesh.3.poly, refine the\n" );
-       printf(
-               "  triangulation, and output the files mesh.4.node, mesh.4.ele, and\n" );
-       printf( "  mesh.4.poly.  Files with no iteration number are treated as if\n" );
-       printf(
-               "  their iteration number is zero; hence, Triangle might read the file\n" );
-       printf(
-               "  points.node, triangulate it, and produce the files points.1.node and\n" );
-       printf( "  points.1.ele.\n\n" );
-       printf(
-               "  Iteration numbers allow you to create a sequence of successively finer\n" );
-       printf(
-               "  meshes suitable for multigrid methods.  They also allow you to produce a\n"
-               );
-       printf(
-               "  sequence of meshes using error estimate-driven mesh refinement.\n" );
-       printf( "\n" );
-       printf(
-               "  If you're not using refinement or quality meshing, and you don't like\n" );
-       printf(
-               "  iteration numbers, use the -I switch to disable them.  This switch will\n" );
-       printf(
-               "  also disable output of .node and .poly files to prevent your input files\n"
-               );
-       printf(
-               "  from being overwritten.  (If the input is a .poly file that contains its\n"
-               );
-       printf( "  own points, a .node file will be written.)\n\n" );
-       printf( "Examples of How to Use Triangle:\n\n" );
-       printf(
-               "  `triangle dots' will read points from dots.node, and write their Delaunay\n"
-               );
-       printf(
-               "  triangulation to dots.1.node and dots.1.ele.  (dots.1.node will be\n" );
-       printf(
-               "  identical to dots.node.)  `triangle -I dots' writes the triangulation to\n"
-               );
-       printf(
-               "  dots.ele instead.  (No additional .node file is needed, so none is\n" );
-       printf( "  written.)\n\n" );
-       printf(
-               "  `triangle -pe object.1' will read a PSLG from object.1.poly (and possibly\n"
-               );
-       printf(
-               "  object.1.node, if the points are omitted from object.1.poly) and write\n" );
-       printf( "  their constrained Delaunay triangulation to object.2.node and\n" );
-       printf(
-               "  object.2.ele.  The segments will be copied to object.2.poly, and all\n" );
-       printf( "  edges will be written to object.2.edge.\n\n" );
-       printf(
-               "  `triangle -pq31.5a.1 object' will read a PSLG from object.poly (and\n" );
-       printf(
-               "  possibly object.node), generate a mesh whose angles are all greater than\n"
-               );
-       printf(
-               "  31.5 degrees and whose triangles all have area smaller than 0.1, and\n" );
-       printf(
-               "  write the mesh to object.1.node and object.1.ele.  Each segment may have\n"
-               );
-       printf(
-               "  been broken up into multiple edges; the resulting constrained edges are\n" );
-       printf( "  written to object.1.poly.\n\n" );
-       printf(
-               "  Here is a sample file `box.poly' describing a square with a square hole:\n"
-               );
-       printf( "\n" );
-       printf(
-               "    # A box with eight points in 2D, no attributes, one boundary marker.\n" );
-       printf( "    8 2 0 1\n" );
-       printf( "    # Outer box has these vertices:\n" );
-       printf( "     1   0 0   0\n" );
-       printf( "     2   0 3   0\n" );
-       printf( "     3   3 0   0\n" );
-       printf( "     4   3 3   33     # A special marker for this point.\n" );
-       printf( "    # Inner square has these vertices:\n" );
-       printf( "     5   1 1   0\n" );
-       printf( "     6   1 2   0\n" );
-       printf( "     7   2 1   0\n" );
-       printf( "     8   2 2   0\n" );
-       printf( "    # Five segments with boundary markers.\n" );
-       printf( "    5 1\n" );
-       printf( "     1   1 2   5      # Left side of outer box.\n" );
-       printf( "     2   5 7   0      # Segments 2 through 5 enclose the hole.\n" );
-       printf( "     3   7 8   0\n" );
-       printf( "     4   8 6   10\n" );
-       printf( "     5   6 5   0\n" );
-       printf( "    # One hole in the middle of the inner square.\n" );
-       printf( "    1\n" );
-       printf( "     1   1.5 1.5\n\n" );
-       printf(
-               "  Note that some segments are missing from the outer square, so one must\n" );
-       printf(
-               "  use the `-c' switch.  After `triangle -pqc box.poly', here is the output\n"
-               );
-       printf(
-               "  file `box.1.node', with twelve points.  The last four points were added\n" );
-       printf(
-               "  to meet the angle constraint.  Points 1, 2, and 9 have markers from\n" );
-       printf(
-               "  segment 1.  Points 6 and 8 have markers from segment 4.  All the other\n" );
-       printf(
-               "  points but 4 have been marked to indicate that they lie on a boundary.\n" );
-       printf( "\n" );
-       printf( "    12  2  0  1\n" );
-       printf( "       1    0   0      5\n" );
-       printf( "       2    0   3      5\n" );
-       printf( "       3    3   0      1\n" );
-       printf( "       4    3   3     33\n" );
-       printf( "       5    1   1      1\n" );
-       printf( "       6    1   2     10\n" );
-       printf( "       7    2   1      1\n" );
-       printf( "       8    2   2     10\n" );
-       printf( "       9    0   1.5    5\n" );
-       printf( "      10    1.5   0    1\n" );
-       printf( "      11    3   1.5    1\n" );
-       printf( "      12    1.5   3    1\n" );
-       printf( "    # Generated by triangle -pqc box.poly\n\n" );
-       printf( "  Here is the output file `box.1.ele', with twelve triangles.\n\n" );
-       printf( "    12  3  0\n" );
-       printf( "       1     5   6   9\n" );
-       printf( "       2    10   3   7\n" );
-       printf( "       3     6   8  12\n" );
-       printf( "       4     9   1   5\n" );
-       printf( "       5     6   2   9\n" );
-       printf( "       6     7   3  11\n" );
-       printf( "       7    11   4   8\n" );
-       printf( "       8     7   5  10\n" );
-       printf( "       9    12   2   6\n" );
-       printf( "      10     8   7  11\n" );
-       printf( "      11     5   1  10\n" );
-       printf( "      12     8   4  12\n" );
-       printf( "    # Generated by triangle -pqc box.poly\n\n" );
-       printf(
-               "  Here is the output file `box.1.poly'.  Note that segments have been added\n"
-               );
-       printf(
-               "  to represent the convex hull, and some segments have been split by newly\n"
-               );
-       printf(
-               "  added points.  Note also that <# of points> is set to zero to indicate\n" );
-       printf( "  that the points should be read from the .node file.\n\n" );
-       printf( "    0  2  0  1\n" );
-       printf( "    12  1\n" );
-       printf( "       1     1   9     5\n" );
-       printf( "       2     5   7     1\n" );
-       printf( "       3     8   7     1\n" );
-       printf( "       4     6   8    10\n" );
-       printf( "       5     5   6     1\n" );
-       printf( "       6     3  10     1\n" );
-       printf( "       7     4  11     1\n" );
-       printf( "       8     2  12     1\n" );
-       printf( "       9     9   2     5\n" );
-       printf( "      10    10   1     1\n" );
-       printf( "      11    11   3     1\n" );
-       printf( "      12    12   4     1\n" );
-       printf( "    1\n" );
-       printf( "       1   1.5 1.5\n" );
-       printf( "    # Generated by triangle -pqc box.poly\n\n" );
-       printf( "Refinement and Area Constraints:\n\n" );
-       printf(
-               "  The -r switch causes a mesh (.node and .ele files) to be read and\n" );
-       printf(
-               "  refined.  If the -p switch is also used, a .poly file is read and used to\n"
-               );
-       printf(
-               "  specify edges that are constrained and cannot be eliminated (although\n" );
-       printf(
-               "  they can be divided into smaller edges) by the refinement process.\n" );
-       printf( "\n" );
-       printf(
-               "  When you refine a mesh, you generally want to impose tighter quality\n" );
-       printf(
-               "  constraints.  One way to accomplish this is to use -q with a larger\n" );
-       printf(
-               "  angle, or -a followed by a smaller area than you used to generate the\n" );
-       printf(
-               "  mesh you are refining.  Another way to do this is to create an .area\n" );
-       printf(
-               "  file, which specifies a maximum area for each triangle, and use the -a\n" );
-       printf(
-               "  switch (without a number following).  Each triangle's area constraint is\n"
-               );
-       printf(
-               "  applied to that triangle.  Area constraints tend to diffuse as the mesh\n" );
-       printf(
-               "  is refined, so if there are large variations in area constraint between\n" );
-       printf( "  adjacent triangles, you may not get the results you want.\n\n" );
-       printf(
-               "  If you are refining a mesh composed of linear (three-node) elements, the\n"
-               );
-       printf(
-               "  output mesh will contain all the nodes present in the input mesh, in the\n"
-               );
-       printf(
-               "  same order, with new nodes added at the end of the .node file.  However,\n"
-               );
-       printf(
-               "  there is no guarantee that each output element is contained in a single\n" );
-       printf(
-               "  input element.  Often, output elements will overlap two input elements,\n" );
-       printf(
-               "  and input edges are not present in the output mesh.  Hence, a sequence of\n"
-               );
-       printf(
-               "  refined meshes will form a hierarchy of nodes, but not a hierarchy of\n" );
-       printf(
-               "  elements.  If you a refining a mesh of higher-order elements, the\n" );
-       printf(
-               "  hierarchical property applies only to the nodes at the corners of an\n" );
-       printf( "  element; other nodes may not be present in the refined mesh.\n\n" );
-       printf(
-               "  It is important to understand that maximum area constraints in .poly\n" );
-       printf(
-               "  files are handled differently from those in .area files.  A maximum area\n"
-               );
-       printf(
-               "  in a .poly file applies to the whole (segment-bounded) region in which a\n"
-               );
-       printf(
-               "  point falls, whereas a maximum area in an .area file applies to only one\n"
-               );
-       printf(
-               "  triangle.  Area constraints in .poly files are used only when a mesh is\n" );
-       printf(
-               "  first generated, whereas area constraints in .area files are used only to\n"
-               );
-       printf(
-               "  refine an existing mesh, and are typically based on a posteriori error\n" );
-       printf(
-               "  estimates resulting from a finite element simulation on that mesh.\n" );
-       printf( "\n" );
-       printf(
-               "  `triangle -rq25 object.1' will read object.1.node and object.1.ele, then\n"
-               );
-       printf(
-               "  refine the triangulation to enforce a 25 degree minimum angle, and then\n" );
-       printf(
-               "  write the refined triangulation to object.2.node and object.2.ele.\n" );
-       printf( "\n" );
-       printf(
-               "  `triangle -rpaa6.2 z.3' will read z.3.node, z.3.ele, z.3.poly, and\n" );
-       printf(
-               "  z.3.area.  After reconstructing the mesh and its segments, Triangle will\n"
-               );
-       printf(
-               "  refine the mesh so that no triangle has area greater than 6.2, and\n" );
-       printf(
-               "  furthermore the triangles satisfy the maximum area constraints in\n" );
-       printf(
-               "  z.3.area.  The output is written to z.4.node, z.4.ele, and z.4.poly.\n" );
-       printf( "\n" );
-       printf(
-               "  The sequence `triangle -qa1 x', `triangle -rqa.3 x.1', `triangle -rqa.1\n" );
-       printf(
-               "  x.2' creates a sequence of successively finer meshes x.1, x.2, and x.3,\n" );
-       printf( "  suitable for multigrid.\n\n" );
-       printf( "Convex Hulls and Mesh Boundaries:\n\n" );
-       printf(
-               "  If the input is a point set (rather than a PSLG), Triangle produces its\n" );
-       printf(
-               "  convex hull as a by-product in the output .poly file if you use the -c\n" );
-       printf(
-               "  switch.  There are faster algorithms for finding a two-dimensional convex\n"
-               );
-       printf(
-               "  hull than triangulation, of course, but this one comes for free.  If the\n"
-               );
-       printf(
-               "  input is an unconstrained mesh (you are using the -r switch but not the\n" );
-       printf(
-               "  -p switch), Triangle produces a list of its boundary edges (including\n" );
-       printf( "  hole boundaries) as a by-product if you use the -c switch.\n\n" );
-       printf( "Voronoi Diagrams:\n\n" );
-       printf(
-               "  The -v switch produces a Voronoi diagram, in files suffixed .v.node and\n" );
-       printf(
-               "  .v.edge.  For example, `triangle -v points' will read points.node,\n" );
-       printf(
-               "  produce its Delaunay triangulation in points.1.node and points.1.ele,\n" );
-       printf(
-               "  and produce its Voronoi diagram in points.1.v.node and points.1.v.edge.\n" );
-       printf(
-               "  The .v.node file contains a list of all Voronoi vertices, and the .v.edge\n"
-               );
-       printf(
-               "  file contains a list of all Voronoi edges, some of which may be infinite\n"
-               );
-       printf(
-               "  rays.  (The choice of filenames makes it easy to run the set of Voronoi\n" );
-       printf( "  vertices through Triangle, if so desired.)\n\n" );
-       printf(
-               "  This implementation does not use exact arithmetic to compute the Voronoi\n"
-               );
-       printf(
-               "  vertices, and does not check whether neighboring vertices are identical.\n"
-               );
-       printf(
-               "  Be forewarned that if the Delaunay triangulation is degenerate or\n" );
-       printf(
-               "  near-degenerate, the Voronoi diagram may have duplicate points, crossing\n"
-               );
-       printf(
-               "  edges, or infinite rays whose direction vector is zero.  Also, if you\n" );
-       printf(
-               "  generate a constrained (as opposed to conforming) Delaunay triangulation,\n"
-               );
-       printf(
-               "  or if the triangulation has holes, the corresponding Voronoi diagram is\n" );
-       printf( "  likely to have crossing edges and unlikely to make sense.\n\n" );
-       printf( "Mesh Topology:\n\n" );
-       printf(
-               "  You may wish to know which triangles are adjacent to a certain Delaunay\n" );
-       printf(
-               "  edge in an .edge file, which Voronoi regions are adjacent to a certain\n" );
-       printf(
-               "  Voronoi edge in a .v.edge file, or which Voronoi regions are adjacent to\n"
-               );
-       printf(
-               "  each other.  All of this information can be found by cross-referencing\n" );
-       printf(
-               "  output files with the recollection that the Delaunay triangulation and\n" );
-       printf( "  the Voronoi diagrams are planar duals.\n\n" );
-       printf(
-               "  Specifically, edge i of an .edge file is the dual of Voronoi edge i of\n" );
-       printf(
-               "  the corresponding .v.edge file, and is rotated 90 degrees counterclock-\n" );
-       printf(
-               "  wise from the Voronoi edge.  Triangle j of an .ele file is the dual of\n" );
-       printf(
-               "  vertex j of the corresponding .v.node file; and Voronoi region k is the\n" );
-       printf( "  dual of point k of the corresponding .node file.\n\n" );
-       printf(
-               "  Hence, to find the triangles adjacent to a Delaunay edge, look at the\n" );
-       printf(
-               "  vertices of the corresponding Voronoi edge; their dual triangles are on\n" );
-       printf(
-               "  the left and right of the Delaunay edge, respectively.  To find the\n" );
-       printf(
-               "  Voronoi regions adjacent to a Voronoi edge, look at the endpoints of the\n"
-               );
-       printf(
-               "  corresponding Delaunay edge; their dual regions are on the right and left\n"
-               );
-       printf(
-               "  of the Voronoi edge, respectively.  To find which Voronoi regions are\n" );
-       printf( "  adjacent to each other, just read the list of Delaunay edges.\n" );
-       printf( "\n" );
-       printf( "Statistics:\n" );
-       printf( "\n" );
-       printf(
-               "  After generating a mesh, Triangle prints a count of the number of points,\n"
-               );
-       printf(
-               "  triangles, edges, boundary edges, and segments in the output mesh.  If\n" );
-       printf(
-               "  you've forgotten the statistics for an existing mesh, the -rNEP switches\n"
-               );
-       printf(
-               "  (or -rpNEP if you've got a .poly file for the existing mesh) will\n" );
-       printf( "  regenerate these statistics without writing any output.\n\n" );
-       printf(
-               "  The -V switch produces extended statistics, including a rough estimate\n" );
-       printf(
-               "  of memory use and a histogram of triangle aspect ratios and angles in the\n"
-               );
-       printf( "  mesh.\n\n" );
-       printf( "Exact Arithmetic:\n\n" );
-       printf(
-               "  Triangle uses adaptive exact arithmetic to perform what computational\n" );
-       printf(
-               "  geometers call the `orientation' and `incircle' tests.  If the floating-\n"
-               );
-       printf(
-               "  point arithmetic of your machine conforms to the IEEE 754 standard (as\n" );
-       printf(
-               "  most workstations do), and does not use extended precision internal\n" );
-       printf(
-               "  registers, then your output is guaranteed to be an absolutely true\n" );
-       printf( "  Delaunay or conforming Delaunay triangulation, roundoff error\n" );
-       printf(
-               "  notwithstanding.  The word `adaptive' implies that these arithmetic\n" );
-       printf(
-               "  routines compute the result only to the precision necessary to guarantee\n"
-               );
-       printf(
-               "  correctness, so they are usually nearly as fast as their approximate\n" );
-       printf(
-               "  counterparts.  The exact tests can be disabled with the -X switch.  On\n" );
-       printf(
-               "  most inputs, this switch will reduce the computation time by about eight\n"
-               );
-       printf(
-               "  percent - it's not worth the risk.  There are rare difficult inputs\n" );
-       printf(
-               "  (having many collinear and cocircular points), however, for which the\n" );
-       printf(
-               "  difference could be a factor of two.  These are precisely the inputs most\n"
-               );
-       printf( "  likely to cause errors if you use the -X switch.\n\n" );
-       printf(
-               "  Unfortunately, these routines don't solve every numerical problem.  Exact\n"
-               );
-       printf(
-               "  arithmetic is not used to compute the positions of points, because the\n" );
-       printf(
-               "  bit complexity of point coordinates would grow without bound.  Hence,\n" );
-       printf(
-               "  segment intersections aren't computed exactly; in very unusual cases,\n" );
-       printf(
-               "  roundoff error in computing an intersection point might actually lead to\n"
-               );
-       printf(
-               "  an inverted triangle and an invalid triangulation.  (This is one reason\n" );
-       printf(
-               "  to compute your own intersection points in your .poly files.)  Similarly,\n"
-               );
-       printf(
-               "  exact arithmetic is not used to compute the vertices of the Voronoi\n" );
-       printf( "  diagram.\n\n" );
-       printf(
-               "  Underflow and overflow can also cause difficulties; the exact arithmetic\n"
-               );
-       printf(
-               "  routines do not ameliorate out-of-bounds exponents, which can arise\n" );
-       printf(
-               "  during the orientation and incircle tests.  As a rule of thumb, you\n" );
-       printf(
-               "  should ensure that your input values are within a range such that their\n" );
-       printf(
-               "  third powers can be taken without underflow or overflow.  Underflow can\n" );
-       printf(
-               "  silently prevent the tests from being performed exactly, while overflow\n" );
-       printf( "  will typically cause a floating exception.\n\n" );
-       printf( "Calling Triangle from Another Program:\n\n" );
-       printf( "  Read the file triangle.h for details.\n\n" );
-       printf( "Troubleshooting:\n\n" );
-       printf( "  Please read this section before mailing me bugs.\n\n" );
-       printf( "  `My output mesh has no triangles!'\n\n" );
-       printf(
-               "    If you're using a PSLG, you've probably failed to specify a proper set\n"
-               );
-       printf(
-               "    of bounding segments, or forgotten to use the -c switch.  Or you may\n" );
-       printf(
-               "    have placed a hole badly.  To test these possibilities, try again with\n"
-               );
-       printf(
-               "    the -c and -O switches.  Alternatively, all your input points may be\n" );
-       printf(
-               "    collinear, in which case you can hardly expect to triangulate them.\n" );
-       printf( "\n" );
-       printf( "  `Triangle doesn't terminate, or just crashes.'\n" );
-       printf( "\n" );
-       printf(
-               "    Bad things can happen when triangles get so small that the distance\n" );
-       printf(
-               "    between their vertices isn't much larger than the precision of your\n" );
-       printf(
-               "    machine's arithmetic.  If you've compiled Triangle for single-precision\n"
-               );
-       printf(
-               "    arithmetic, you might do better by recompiling it for double-precision.\n"
-               );
-       printf(
-               "    Then again, you might just have to settle for more lenient constraints\n"
-               );
-       printf(
-               "    on the minimum angle and the maximum area than you had planned.\n" );
-       printf( "\n" );
-       printf(
-               "    You can minimize precision problems by ensuring that the origin lies\n" );
-       printf(
-               "    inside your point set, or even inside the densest part of your\n" );
-       printf(
-               "    mesh.  On the other hand, if you're triangulating an object whose x\n" );
-       printf(
-               "    coordinates all fall between 6247133 and 6247134, you're not leaving\n" );
-       printf( "    much floating-point precision for Triangle to work with.\n\n" );
-       printf(
-               "    Precision problems can occur covertly if the input PSLG contains two\n" );
-       printf(
-               "    segments that meet (or intersect) at a very small angle, or if such an\n"
-               );
-       printf(
-               "    angle is introduced by the -c switch, which may occur if a point lies\n" );
-       printf(
-               "    ever-so-slightly inside the convex hull, and is connected by a PSLG\n" );
-       printf(
-               "    segment to a point on the convex hull.  If you don't realize that a\n" );
-       printf(
-               "    small angle is being formed, you might never discover why Triangle is\n" );
-       printf(
-               "    crashing.  To check for this possibility, use the -S switch (with an\n" );
-       printf(
-               "    appropriate limit on the number of Steiner points, found by trial-and-\n"
-               );
-       printf(
-               "    error) to stop Triangle early, and view the output .poly file with\n" );
-       printf(
-               "    Show Me (described below).  Look carefully for small angles between\n" );
-       printf(
-               "    segments; zoom in closely, as such segments might look like a single\n" );
-       printf( "    segment from a distance.\n\n" );
-       printf(
-               "    If some of the input values are too large, Triangle may suffer a\n" );
-       printf(
-               "    floating exception due to overflow when attempting to perform an\n" );
-       printf(
-               "    orientation or incircle test.  (Read the section on exact arithmetic\n" );
-       printf(
-               "    above.)  Again, I recommend compiling Triangle for double (rather\n" );
-       printf( "    than single) precision arithmetic.\n\n" );
-       printf(
-               "  `The numbering of the output points doesn't match the input points.'\n" );
-       printf( "\n" );
-       printf(
-               "    You may have eaten some of your input points with a hole, or by placing\n"
-               );
-       printf( "    them outside the area enclosed by segments.\n\n" );
-       printf(
-               "  `Triangle executes without incident, but when I look at the resulting\n" );
-       printf(
-               "  mesh, it has overlapping triangles or other geometric inconsistencies.'\n" );
-       printf( "\n" );
-       printf(
-               "    If you select the -X switch, Triangle's divide-and-conquer Delaunay\n" );
-       printf(
-               "    triangulation algorithm occasionally makes mistakes due to floating-\n" );
-       printf(
-               "    point roundoff error.  Although these errors are rare, don't use the -X\n"
-               );
-       printf( "    switch.  If you still have problems, please report the bug.\n" );
-       printf( "\n" );
-       printf(
-               "  Strange things can happen if you've taken liberties with your PSLG.  Do\n" );
-       printf(
-               "  you have a point lying in the middle of a segment?  Triangle sometimes\n" );
-       printf(
-               "  copes poorly with that sort of thing.  Do you want to lay out a collinear\n"
-               );
-       printf(
-               "  row of evenly spaced, segment-connected points?  Have you simply defined\n"
-               );
-       printf(
-               "  one long segment connecting the leftmost point to the rightmost point,\n" );
-       printf(
-               "  and a bunch of points lying along it?  This method occasionally works,\n" );
-       printf(
-               "  especially with horizontal and vertical lines, but often it doesn't, and\n"
-               );
-       printf(
-               "  you'll have to connect each adjacent pair of points with a separate\n" );
-       printf( "  segment.  If you don't like it, tough.\n\n" );
-       printf(
-               "  Furthermore, if you have segments that intersect other than at their\n" );
-       printf(
-               "  endpoints, try not to let the intersections fall extremely close to PSLG\n"
-               );
-       printf( "  points or each other.\n\n" );
-       printf(
-               "  If you have problems refining a triangulation not produced by Triangle:\n" );
-       printf(
-               "  Are you sure the triangulation is geometrically valid?  Is it formatted\n" );
-       printf(
-               "  correctly for Triangle?  Are the triangles all listed so the first three\n"
-               );
-       printf( "  points are their corners in counterclockwise order?\n\n" );
-       printf( "Show Me:\n\n" );
-       printf(
-               "  Triangle comes with a separate program named `Show Me', whose primary\n" );
-       printf(
-               "  purpose is to draw meshes on your screen or in PostScript.  Its secondary\n"
-               );
-       printf(
-               "  purpose is to check the validity of your input files, and do so more\n" );
-       printf(
-               "  thoroughly than Triangle does.  Show Me requires that you have the X\n" );
-       printf(
-               "  Windows system.  If you didn't receive Show Me with Triangle, complain to\n"
-               );
-       printf( "  whomever you obtained Triangle from, then send me mail.\n\n" );
-       printf( "Triangle on the Web:\n\n" );
-       printf(
-               "  To see an illustrated, updated version of these instructions, check out\n" );
-       printf( "\n" );
-       printf( "    http://www.cs.cmu.edu/~quake/triangle.html\n" );
-       printf( "\n" );
-       printf( "A Brief Plea:\n" );
-       printf( "\n" );
-       printf(
-               "  If you use Triangle, and especially if you use it to accomplish real\n" );
-       printf(
-               "  work, I would like very much to hear from you.  A short letter or email\n" );
-       printf(
-               "  (to jrs@cs.cmu.edu) describing how you use Triangle will mean a lot to\n" );
-       printf(
-               "  me.  The more people I know are using this program, the more easily I can\n"
-               );
-       printf(
-               "  justify spending time on improvements and on the three-dimensional\n" );
-       printf(
-               "  successor to Triangle, which in turn will benefit you.  Also, I can put\n" );
-       printf(
-               "  you on a list to receive email whenever a new version of Triangle is\n" );
-       printf( "  available.\n\n" );
-       printf(
-               "  If you use a mesh generated by Triangle in a publication, please include\n"
-               );
-       printf( "  an acknowledgment as well.\n\n" );
-       printf( "Research credit:\n\n" );
-       printf(
-               "  Of course, I can take credit for only a fraction of the ideas that made\n" );
-       printf(
-               "  this mesh generator possible.  Triangle owes its existence to the efforts\n"
-               );
-       printf(
-               "  of many fine computational geometers and other researchers, including\n" );
-       printf(
-               "  Marshall Bern, L. Paul Chew, Boris Delaunay, Rex A. Dwyer, David\n" );
-       printf(
-               "  Eppstein, Steven Fortune, Leonidas J. Guibas, Donald E. Knuth, C. L.\n" );
-       printf(
-               "  Lawson, Der-Tsai Lee, Ernst P. Mucke, Douglas M. Priest, Jim Ruppert,\n" );
-       printf(
-               "  Isaac Saias, Bruce J. Schachter, Micha Sharir, Jorge Stolfi, Christopher\n"
-               );
-       printf(
-               "  J. Van Wyk, David F. Watson, and Binhai Zhu.  See the comments at the\n" );
-       printf( "  beginning of the source code for references.\n\n" );
-       exit( 0 );
+printf(
+"Underscores indicate that numbers may optionally follow certain switches;\n" );
+printf(
+"do not leave any space between a switch and its numeric parameter.\n" );
+printf(
+"input_file must be a file with extension .node, or extension .poly if the\n" );
+printf(
+"-p switch is used.  If -r is used, you must supply .node and .ele files,\n" );
+printf(
+"and possibly a .poly file and .area file as well.  The formats of these\n" );
+printf( "files are described below.\n\n" );
+printf( "Command Line Switches:\n\n" );
+printf(
+"    -p  Reads a Planar Straight Line Graph (.poly file), which can specify\n"
+);
+printf(
+"        points, segments, holes, and regional attributes and area\n" );
+printf(
+"        constraints.  Will generate a constrained Delaunay triangulation\n" );
+printf(
+"        fitting the input; or, if -s, -q, or -a is used, a conforming\n" );
+printf(
+"        Delaunay triangulation.  If -p is not used, Triangle reads a .node\n"
+);
+printf( "        file by default.\n" );
+printf(
+"    -r  Refines a previously generated mesh.  The mesh is read from a .node\n"
+);
+printf(
+"        file and an .ele file.  If -p is also used, a .poly file is read\n" );
+printf(
+"        and used to constrain edges in the mesh.  Further details on\n" );
+printf( "        refinement are given below.\n" );
+printf(
+"    -q  Quality mesh generation by Jim Ruppert's Delaunay refinement\n" );
+printf(
+"        algorithm.  Adds points to the mesh to ensure that no angles\n" );
+printf(
+"        smaller than 20 degrees occur.  An alternative minimum angle may be\n"
+);
+printf(
+"        specified after the `q'.  If the minimum angle is 20.7 degrees or\n" );
+printf(
+"        smaller, the triangulation algorithm is theoretically guaranteed to\n"
+);
+printf(
+"        terminate (assuming infinite precision arithmetic - Triangle may\n" );
+printf(
+"        fail to terminate if you run out of precision).  In practice, the\n" );
+printf(
+"        algorithm often succeeds for minimum angles up to 33.8 degrees.\n" );
+printf(
+"        For highly refined meshes, however, it may be necessary to reduce\n" );
+printf(
+"        the minimum angle to well below 20 to avoid problems associated\n" );
+printf(
+"        with insufficient floating-point precision.  The specified angle\n" );
+printf( "        may include a decimal point.\n" );
+printf(
+"    -a  Imposes a maximum triangle area.  If a number follows the `a', no\n" );
+printf(
+"        triangle will be generated whose area is larger than that number.\n" );
+printf(
+"        If no number is specified, an .area file (if -r is used) or .poly\n" );
+printf(
+"        file (if -r is not used) specifies a number of maximum area\n" );
+printf(
+"        constraints.  An .area file contains a separate area constraint for\n"
+);
+printf(
+"        each triangle, and is useful for refining a finite element mesh\n" );
+printf(
+"        based on a posteriori error estimates.  A .poly file can optionally\n"
+);
+printf(
+"        contain an area constraint for each segment-bounded region, thereby\n"
+);
+printf(
+"        enforcing triangle densities in a first triangulation.  You can\n" );
+printf(
+"        impose both a fixed area constraint and a varying area constraint\n" );
+printf(
+"        by invoking the -a switch twice, once with and once without a\n" );
+printf(
+"        number following.  Each area specified may include a decimal point.\n"
+);
+printf(
+"    -A  Assigns an additional attribute to each triangle that identifies\n" );
+printf(
+"        what segment-bounded region each triangle belongs to.  Attributes\n" );
+printf(
+"        are assigned to regions by the .poly file.  If a region is not\n" );
+printf(
+"        explicitly marked by the .poly file, triangles in that region are\n" );
+printf(
+"        assigned an attribute of zero.  The -A switch has an effect only\n" );
+printf( "        when the -p switch is used and the -r switch is not.\n" );
+printf(
+"    -c  Creates segments on the convex hull of the triangulation.  If you\n" );
+printf(
+"        are triangulating a point set, this switch causes a .poly file to\n" );
+printf(
+"        be written, containing all edges in the convex hull.  (By default,\n"
+);
+printf(
+"        a .poly file is written only if a .poly file is read.)  If you are\n"
+);
+printf(
+"        triangulating a PSLG, this switch specifies that the interior of\n" );
+printf(
+"        the convex hull of the PSLG should be triangulated.  If you do not\n"
+);
+printf(
+"        use this switch when triangulating a PSLG, it is assumed that you\n" );
+printf(
+"        have identified the region to be triangulated by surrounding it\n" );
+printf(
+"        with segments of the input PSLG.  Beware:  if you are not careful,\n"
+);
+printf(
+"        this switch can cause the introduction of an extremely thin angle\n" );
+printf(
+"        between a PSLG segment and a convex hull segment, which can cause\n" );
+printf(
+"        overrefinement or failure if Triangle runs out of precision.  If\n" );
+printf(
+"        you are refining a mesh, the -c switch works differently; it\n" );
+printf(
+"        generates the set of boundary edges of the mesh, rather than the\n" );
+printf( "        convex hull.\n" );
+printf(
+"    -e  Outputs (to an .edge file) a list of edges of the triangulation.\n" );
+printf(
+"    -v  Outputs the Voronoi diagram associated with the triangulation.\n" );
+printf( "        Does not attempt to detect degeneracies.\n" );
+printf(
+"    -n  Outputs (to a .neigh file) a list of triangles neighboring each\n" );
+printf( "        triangle.\n" );
+printf(
+"    -g  Outputs the mesh to an Object File Format (.off) file, suitable for\n"
+);
+printf( "        viewing with the Geometry Center's Geomview package.\n" );
+printf(
+"    -B  No boundary markers in the output .node, .poly, and .edge output\n" );
+printf(
+"        files.  See the detailed discussion of boundary markers below.\n" );
+printf(
+"    -P  No output .poly file.  Saves disk space, but you lose the ability\n" );
+printf(
+"        to impose segment constraints on later refinements of the mesh.\n" );
+printf( "    -N  No output .node file.\n" );
+printf( "    -E  No output .ele file.\n" );
+printf(
+"    -I  No iteration numbers.  Suppresses the output of .node and .poly\n" );
+printf(
+"        files, so your input files won't be overwritten.  (If your input is\n"
+);
+printf(
+"        a .poly file only, a .node file will be written.)  Cannot be used\n" );
+printf(
+"        with the -r switch, because that would overwrite your input .ele\n" );
+printf(
+"        file.  Shouldn't be used with the -s, -q, or -a switch if you are\n" );
+printf(
+"        using a .node file for input, because no .node file will be\n" );
+printf( "        written, so there will be no record of any added points.\n" );
+printf( "    -O  No holes.  Ignores the holes in the .poly file.\n" );
+printf(
+"    -X  No exact arithmetic.  Normally, Triangle uses exact floating-point\n"
+);
+printf(
+"        arithmetic for certain tests if it thinks the inexact tests are not\n"
+);
+printf(
+"        accurate enough.  Exact arithmetic ensures the robustness of the\n" );
+printf(
+"        triangulation algorithms, despite floating-point roundoff error.\n" );
+printf(
+"        Disabling exact arithmetic with the -X switch will cause a small\n" );
+printf(
+"        improvement in speed and create the possibility (albeit small) that\n"
+);
+printf(
+"        Triangle will fail to produce a valid mesh.  Not recommended.\n" );
+printf(
+"    -z  Numbers all items starting from zero (rather than one).  Note that\n"
+);
+printf(
+"        this switch is normally overrided by the value used to number the\n" );
+printf(
+"        first point of the input .node or .poly file.  However, this switch\n"
+);
+printf( "        is useful when calling Triangle from another program.\n" );
+printf(
+"    -o2 Generates second-order subparametric elements with six nodes each.\n"
+);
+printf(
+"    -Y  No new points on the boundary.  This switch is useful when the mesh\n"
+);
+printf(
+"        boundary must be preserved so that it conforms to some adjacent\n" );
+printf(
+"        mesh.  Be forewarned that you will probably sacrifice some of the\n" );
+printf(
+"        quality of the mesh; Triangle will try, but the resulting mesh may\n"
+);
+printf(
+"        contain triangles of poor aspect ratio.  Works well if all the\n" );
+printf(
+"        boundary points are closely spaced.  Specify this switch twice\n" );
+printf(
+"        (`-YY') to prevent all segment splitting, including internal\n" );
+printf( "        boundaries.\n" );
+printf(
+"    -S  Specifies the maximum number of Steiner points (points that are not\n"
+);
+printf(
+"        in the input, but are added to meet the constraints of minimum\n" );
+printf(
+"        angle and maximum area).  The default is to allow an unlimited\n" );
+printf(
+"        number.  If you specify this switch with no number after it,\n" );
+printf(
+"        the limit is set to zero.  Triangle always adds points at segment\n" );
+printf(
+"        intersections, even if it needs to use more points than the limit\n" );
+printf(
+"        you set.  When Triangle inserts segments by splitting (-s), it\n" );
+printf(
+"        always adds enough points to ensure that all the segments appear in\n"
+);
+printf(
+"        the triangulation, again ignoring the limit.  Be forewarned that\n" );
+printf(
+"        the -S switch may result in a conforming triangulation that is not\n"
+);
+printf(
+"        truly Delaunay, because Triangle may be forced to stop adding\n" );
+printf(
+"        points when the mesh is in a state where a segment is non-Delaunay\n"
+);
+printf(
+"        and needs to be split.  If so, Triangle will print a warning.\n" );
+printf(
+"    -i  Uses an incremental rather than divide-and-conquer algorithm to\n" );
+printf(
+"        form a Delaunay triangulation.  Try it if the divide-and-conquer\n" );
+printf( "        algorithm fails.\n" );
+printf(
+"    -F  Uses Steven Fortune's sweepline algorithm to form a Delaunay\n" );
+printf(
+"        triangulation.  Warning:  does not use exact arithmetic for all\n" );
+printf( "        calculations.  An exact result is not guaranteed.\n" );
+printf(
+"    -l  Uses only vertical cuts in the divide-and-conquer algorithm.  By\n" );
+printf(
+"        default, Triangle uses alternating vertical and horizontal cuts,\n" );
+printf(
+"        which usually improve the speed except with point sets that are\n" );
+printf(
+"        small or short and wide.  This switch is primarily of theoretical\n" );
+printf( "        interest.\n" );
+printf(
+"    -s  Specifies that segments should be forced into the triangulation by\n"
+);
+printf(
+"        recursively splitting them at their midpoints, rather than by\n" );
+printf(
+"        generating a constrained Delaunay triangulation.  Segment splitting\n"
+);
+printf(
+"        is true to Ruppert's original algorithm, but can create needlessly\n"
+);
+printf( "        small triangles near external small features.\n" );
+printf(
+"    -C  Check the consistency of the final mesh.  Uses exact arithmetic for\n"
+);
+printf(
+"        checking, even if the -X switch is used.  Useful if you suspect\n" );
+printf( "        Triangle is buggy.\n" );
+printf(
+"    -Q  Quiet: Suppresses all explanation of what Triangle is doing, unless\n"
+);
+printf( "        an error occurs.\n" );
+printf(
+"    -V  Verbose: Gives detailed information about what Triangle is doing.\n" );
+printf(
+"        Add more `V's for increasing amount of detail.  `-V' gives\n" );
+printf(
+"        information on algorithmic progress and more detailed statistics.\n" );
+printf(
+"        `-VV' gives point-by-point details, and will print so much that\n" );
+printf(
+"        Triangle will run much more slowly.  `-VVV' gives information only\n"
+);
+printf( "        a debugger could love.\n" );
+printf( "    -h  Help:  Displays these instructions.\n" );
+printf( "\n" );
+printf( "Definitions:\n" );
+printf( "\n" );
+printf(
+"  A Delaunay triangulation of a point set is a triangulation whose vertices\n"
+);
+printf(
+"  are the point set, having the property that no point in the point set\n" );
+printf(
+"  falls in the interior of the circumcircle (circle that passes through all\n"
+);
+printf( "  three vertices) of any triangle in the triangulation.\n\n" );
+printf(
+"  A Voronoi diagram of a point set is a subdivision of the plane into\n" );
+printf(
+"  polygonal regions (some of which may be infinite), where each region is\n" );
+printf(
+"  the set of points in the plane that are closer to some input point than\n" );
+printf(
+"  to any other input point.  (The Voronoi diagram is the geometric dual of\n"
+);
+printf( "  the Delaunay triangulation.)\n\n" );
+printf(
+"  A Planar Straight Line Graph (PSLG) is a collection of points and\n" );
+printf(
+"  segments.  Segments are simply edges, whose endpoints are points in the\n" );
+printf(
+"  PSLG.  The file format for PSLGs (.poly files) is described below.\n" );
+printf( "\n" );
+printf(
+"  A constrained Delaunay triangulation of a PSLG is similar to a Delaunay\n" );
+printf(
+"  triangulation, but each PSLG segment is present as a single edge in the\n" );
+printf(
+"  triangulation.  (A constrained Delaunay triangulation is not truly a\n" );
+printf( "  Delaunay triangulation.)\n\n" );
+printf(
+"  A conforming Delaunay triangulation of a PSLG is a true Delaunay\n" );
+printf(
+"  triangulation in which each PSLG segment may have been subdivided into\n" );
+printf(
+"  several edges by the insertion of additional points.  These inserted\n" );
+printf(
+"  points are necessary to allow the segments to exist in the mesh while\n" );
+printf( "  maintaining the Delaunay property.\n\n" );
+printf( "File Formats:\n\n" );
+printf(
+"  All files may contain comments prefixed by the character '#'.  Points,\n" );
+printf(
+"  triangles, edges, holes, and maximum area constraints must be numbered\n" );
+printf(
+"  consecutively, starting from either 1 or 0.  Whichever you choose, all\n" );
+printf(
+"  input files must be consistent; if the nodes are numbered from 1, so must\n"
+);
+printf(
+"  be all other objects.  Triangle automatically detects your choice while\n" );
+printf(
+"  reading the .node (or .poly) file.  (When calling Triangle from another\n" );
+printf(
+"  program, use the -z switch if you wish to number objects from zero.)\n" );
+printf( "  Examples of these file formats are given below.\n\n" );
+printf( "  .node files:\n" );
+printf(
+"    First line:  <# of points> <dimension (must be 2)> <# of attributes>\n" );
+printf(
+"                                           <# of boundary markers (0 or 1)>\n"
+);
+printf(
+"    Remaining lines:  <point #> <x> <y> [attributes] [boundary marker]\n" );
+printf( "\n" );
+printf(
+"    The attributes, which are typically floating-point values of physical\n" );
+printf(
+"    quantities (such as mass or conductivity) associated with the nodes of\n"
+);
+printf(
+"    a finite element mesh, are copied unchanged to the output mesh.  If -s,\n"
+);
+printf(
+"    -q, or -a is selected, each new Steiner point added to the mesh will\n" );
+printf( "    have attributes assigned to it by linear interpolation.\n\n" );
+printf(
+"    If the fourth entry of the first line is `1', the last column of the\n" );
+printf(
+"    remainder of the file is assumed to contain boundary markers.  Boundary\n"
+);
+printf(
+"    markers are used to identify boundary points and points resting on PSLG\n"
+);
+printf(
+"    segments; a complete description appears in a section below.  The .node\n"
+);
+printf(
+"    file produced by Triangle will contain boundary markers in the last\n" );
+printf( "    column unless they are suppressed by the -B switch.\n\n" );
+printf( "  .ele files:\n" );
+printf(
+"    First line:  <# of triangles> <points per triangle> <# of attributes>\n" );
+printf(
+"    Remaining lines:  <triangle #> <point> <point> <point> ... [attributes]\n"
+);
+printf( "\n" );
+printf(
+"    Points are indices into the corresponding .node file.  The first three\n"
+);
+printf(
+"    points are the corners, and are listed in counterclockwise order around\n"
+);
+printf(
+"    each triangle.  (The remaining points, if any, depend on the type of\n" );
+printf(
+"    finite element used.)  The attributes are just like those of .node\n" );
+printf(
+"    files.  Because there is no simple mapping from input to output\n" );
+printf(
+"    triangles, an attempt is made to interpolate attributes, which may\n" );
+printf(
+"    result in a good deal of diffusion of attributes among nearby triangles\n"
+);
+printf(
+"    as the triangulation is refined.  Diffusion does not occur across\n" );
+printf(
+"    segments, so attributes used to identify segment-bounded regions remain\n"
+);
+printf(
+"    intact.  In output .ele files, all triangles have three points each\n" );
+printf(
+"    unless the -o2 switch is used, in which case they have six, and the\n" );
+printf(
+"    fourth, fifth, and sixth points lie on the midpoints of the edges\n" );
+printf( "    opposite the first, second, and third corners.\n\n" );
+printf( "  .poly files:\n" );
+printf(
+"    First line:  <# of points> <dimension (must be 2)> <# of attributes>\n" );
+printf(
+"                                           <# of boundary markers (0 or 1)>\n"
+);
+printf(
+"    Following lines:  <point #> <x> <y> [attributes] [boundary marker]\n" );
+printf( "    One line:  <# of segments> <# of boundary markers (0 or 1)>\n" );
+printf(
+"    Following lines:  <segment #> <endpoint> <endpoint> [boundary marker]\n" );
+printf( "    One line:  <# of holes>\n" );
+printf( "    Following lines:  <hole #> <x> <y>\n" );
+printf(
+"    Optional line:  <# of regional attributes and/or area constraints>\n" );
+printf(
+"    Optional following lines:  <constraint #> <x> <y> <attrib> <max area>\n" );
+printf( "\n" );
+printf(
+"    A .poly file represents a PSLG, as well as some additional information.\n"
+);
+printf(
+"    The first section lists all the points, and is identical to the format\n"
+);
+printf(
+"    of .node files.  <# of points> may be set to zero to indicate that the\n"
+);
+printf(
+"    points are listed in a separate .node file; .poly files produced by\n" );
+printf(
+"    Triangle always have this format.  This has the advantage that a point\n"
+);
+printf(
+"    set may easily be triangulated with or without segments.  (The same\n" );
+printf(
+"    effect can be achieved, albeit using more disk space, by making a copy\n"
+);
+printf(
+"    of the .poly file with the extension .node; all sections of the file\n" );
+printf( "    but the first are ignored.)\n\n" );
+printf(
+"    The second section lists the segments.  Segments are edges whose\n" );
+printf(
+"    presence in the triangulation is enforced.  Each segment is specified\n" );
+printf(
+"    by listing the indices of its two endpoints.  This means that you must\n"
+);
+printf(
+"    include its endpoints in the point list.  If -s, -q, and -a are not\n" );
+printf(
+"    selected, Triangle will produce a constrained Delaunay triangulation,\n" );
+printf(
+"    in which each segment appears as a single edge in the triangulation.\n" );
+printf(
+"    If -q or -a is selected, Triangle will produce a conforming Delaunay\n" );
+printf(
+"    triangulation, in which segments may be subdivided into smaller edges.\n"
+);
+printf( "    Each segment, like each point, may have a boundary marker.\n\n" );
+printf(
+"    The third section lists holes (and concavities, if -c is selected) in\n" );
+printf(
+"    the triangulation.  Holes are specified by identifying a point inside\n" );
+printf(
+"    each hole.  After the triangulation is formed, Triangle creates holes\n" );
+printf(
+"    by eating triangles, spreading out from each hole point until its\n" );
+printf(
+"    progress is blocked by PSLG segments; you must be careful to enclose\n" );
+printf(
+"    each hole in segments, or your whole triangulation may be eaten away.\n" );
+printf(
+"    If the two triangles abutting a segment are eaten, the segment itself\n" );
+printf(
+"    is also eaten.  Do not place a hole directly on a segment; if you do,\n" );
+printf( "    Triangle will choose one side of the segment arbitrarily.\n\n" );
+printf(
+"    The optional fourth section lists regional attributes (to be assigned\n" );
+printf(
+"    to all triangles in a region) and regional constraints on the maximum\n" );
+printf(
+"    triangle area.  Triangle will read this section only if the -A switch\n" );
+printf(
+"    is used or the -a switch is used without a number following it, and the\n"
+);
+printf(
+"    -r switch is not used.  Regional attributes and area constraints are\n" );
+printf(
+"    propagated in the same manner as holes; you specify a point for each\n" );
+printf(
+"    attribute and/or constraint, and the attribute and/or constraint will\n" );
+printf(
+"    affect the whole region (bounded by segments) containing the point.  If\n"
+);
+printf(
+"    two values are written on a line after the x and y coordinate, the\n" );
+printf(
+"    former is assumed to be a regional attribute (but will only be applied\n"
+);
+printf(
+"    if the -A switch is selected), and the latter is assumed to be a\n" );
+printf(
+"    regional area constraint (but will only be applied if the -a switch is\n"
+);
+printf(
+"    selected).  You may also specify just one value after the coordinates,\n"
+);
+printf(
+"    which can serve as both an attribute and an area constraint, depending\n"
+);
+printf(
+"    on the choice of switches.  If you are using the -A and -a switches\n" );
+printf(
+"    simultaneously and wish to assign an attribute to some region without\n" );
+printf( "    imposing an area constraint, use a negative maximum area.\n\n" );
+printf(
+"    When a triangulation is created from a .poly file, you must either\n" );
+printf(
+"    enclose the entire region to be triangulated in PSLG segments, or\n" );
+printf(
+"    use the -c switch, which encloses the convex hull of the input point\n" );
+printf(
+"    set.  If you do not use the -c switch, Triangle will eat all triangles\n"
+);
+printf(
+"    on the outer boundary that are not protected by segments; if you are\n" );
+printf(
+"    not careful, your whole triangulation may be eaten away.  If you do\n" );
+printf(
+"    use the -c switch, you can still produce concavities by appropriate\n" );
+printf( "    placement of holes just inside the convex hull.\n\n" );
+printf(
+"    An ideal PSLG has no intersecting segments, nor any points that lie\n" );
+printf(
+"    upon segments (except, of course, the endpoints of each segment.)  You\n"
+);
+printf(
+"    aren't required to make your .poly files ideal, but you should be aware\n"
+);
+printf(
+"    of what can go wrong.  Segment intersections are relatively safe -\n" );
+printf(
+"    Triangle will calculate the intersection points for you and add them to\n"
+);
+printf(
+"    the triangulation - as long as your machine's floating-point precision\n"
+);
+printf(
+"    doesn't become a problem.  You are tempting the fates if you have three\n"
+);
+printf(
+"    segments that cross at the same location, and expect Triangle to figure\n"
+);
+printf(
+"    out where the intersection point is.  Thanks to floating-point roundoff\n"
+);
+printf(
+"    error, Triangle will probably decide that the three segments intersect\n"
+);
+printf(
+"    at three different points, and you will find a minuscule triangle in\n" );
+printf(
+"    your output - unless Triangle tries to refine the tiny triangle, uses\n" );
+printf(
+"    up the last bit of machine precision, and fails to terminate at all.\n" );
+printf(
+"    You're better off putting the intersection point in the input files,\n" );
+printf(
+"    and manually breaking up each segment into two.  Similarly, if you\n" );
+printf(
+"    place a point at the middle of a segment, and hope that Triangle will\n" );
+printf(
+"    break up the segment at that point, you might get lucky.  On the other\n"
+);
+printf(
+"    hand, Triangle might decide that the point doesn't lie precisely on the\n"
+);
+printf(
+"    line, and you'll have a needle-sharp triangle in your output - or a lot\n"
+);
+printf( "    of tiny triangles if you're generating a quality mesh.\n\n" );
+printf(
+"    When Triangle reads a .poly file, it also writes a .poly file, which\n" );
+printf(
+"    includes all edges that are part of input segments.  If the -c switch\n" );
+printf(
+"    is used, the output .poly file will also include all of the edges on\n" );
+printf(
+"    the convex hull.  Hence, the output .poly file is useful for finding\n" );
+printf(
+"    edges associated with input segments and setting boundary conditions in\n"
+);
+printf(
+"    finite element simulations.  More importantly, you will need it if you\n"
+);
+printf(
+"    plan to refine the output mesh, and don't want segments to be missing\n" );
+printf( "    in later triangulations.\n\n" );
+printf( "  .area files:\n" );
+printf( "    First line:  <# of triangles>\n" );
+printf( "    Following lines:  <triangle #> <maximum area>\n\n" );
+printf(
+"    An .area file associates with each triangle a maximum area that is used\n"
+);
+printf(
+"    for mesh refinement.  As with other file formats, every triangle must\n" );
+printf(
+"    be represented, and they must be numbered consecutively.  A triangle\n" );
+printf(
+"    may be left unconstrained by assigning it a negative maximum area.\n" );
+printf( "\n" );
+printf( "  .edge files:\n" );
+printf( "    First line:  <# of edges> <# of boundary markers (0 or 1)>\n" );
+printf(
+"    Following lines:  <edge #> <endpoint> <endpoint> [boundary marker]\n" );
+printf( "\n" );
+printf(
+"    Endpoints are indices into the corresponding .node file.  Triangle can\n"
+);
+printf(
+"    produce .edge files (use the -e switch), but cannot read them.  The\n" );
+printf(
+"    optional column of boundary markers is suppressed by the -B switch.\n" );
+printf( "\n" );
+printf(
+"    In Voronoi diagrams, one also finds a special kind of edge that is an\n" );
+printf(
+"    infinite ray with only one endpoint.  For these edges, a different\n" );
+printf( "    format is used:\n\n" );
+printf( "        <edge #> <endpoint> -1 <direction x> <direction y>\n\n" );
+printf(
+"    The `direction' is a floating-point vector that indicates the direction\n"
+);
+printf( "    of the infinite ray.\n\n" );
+printf( "  .neigh files:\n" );
+printf(
+"    First line:  <# of triangles> <# of neighbors per triangle (always 3)>\n"
+);
+printf(
+"    Following lines:  <triangle #> <neighbor> <neighbor> <neighbor>\n" );
+printf( "\n" );
+printf(
+"    Neighbors are indices into the corresponding .ele file.  An index of -1\n"
+);
+printf(
+"    indicates a mesh boundary, and therefore no neighbor.  Triangle can\n" );
+printf(
+"    produce .neigh files (use the -n switch), but cannot read them.\n" );
+printf( "\n" );
+printf(
+"    The first neighbor of triangle i is opposite the first corner of\n" );
+printf( "    triangle i, and so on.\n\n" );
+printf( "Boundary Markers:\n\n" );
+printf(
+"  Boundary markers are tags used mainly to identify which output points and\n"
+);
+printf(
+"  edges are associated with which PSLG segment, and to identify which\n" );
+printf(
+"  points and edges occur on a boundary of the triangulation.  A common use\n"
+);
+printf(
+"  is to determine where boundary conditions should be applied to a finite\n" );
+printf(
+"  element mesh.  You can prevent boundary markers from being written into\n" );
+printf( "  files produced by Triangle by using the -B switch.\n\n" );
+printf(
+"  The boundary marker associated with each segment in an output .poly file\n"
+);
+printf( "  or edge in an output .edge file is chosen as follows:\n" );
+printf(
+"    - If an output edge is part or all of a PSLG segment with a nonzero\n" );
+printf(
+"      boundary marker, then the edge is assigned the same marker.\n" );
+printf(
+"    - Otherwise, if the edge occurs on a boundary of the triangulation\n" );
+printf(
+"      (including boundaries of holes), then the edge is assigned the marker\n"
+);
+printf( "      one (1).\n" );
+printf( "    - Otherwise, the edge is assigned the marker zero (0).\n" );
+printf(
+"  The boundary marker associated with each point in an output .node file is\n"
+);
+printf( "  chosen as follows:\n" );
+printf(
+"    - If a point is assigned a nonzero boundary marker in the input file,\n" );
+printf(
+"      then it is assigned the same marker in the output .node file.\n" );
+printf(
+"    - Otherwise, if the point lies on a PSLG segment (including the\n" );
+printf(
+"      segment's endpoints) with a nonzero boundary marker, then the point\n" );
+printf(
+"      is assigned the same marker.  If the point lies on several such\n" );
+printf( "      segments, one of the markers is chosen arbitrarily.\n" );
+printf(
+"    - Otherwise, if the point occurs on a boundary of the triangulation,\n" );
+printf( "      then the point is assigned the marker one (1).\n" );
+printf( "    - Otherwise, the point is assigned the marker zero (0).\n" );
+printf( "\n" );
+printf(
+"  If you want Triangle to determine for you which points and edges are on\n" );
+printf(
+"  the boundary, assign them the boundary marker zero (or use no markers at\n"
+);
+printf(
+"  all) in your input files.  Alternatively, you can mark some of them and\n" );
+printf( "  leave others marked zero, allowing Triangle to label them.\n\n" );
+printf( "Triangulation Iteration Numbers:\n\n" );
+printf(
+"  Because Triangle can read and refine its own triangulations, input\n" );
+printf(
+"  and output files have iteration numbers.  For instance, Triangle might\n" );
+printf(
+"  read the files mesh.3.node, mesh.3.ele, and mesh.3.poly, refine the\n" );
+printf(
+"  triangulation, and output the files mesh.4.node, mesh.4.ele, and\n" );
+printf( "  mesh.4.poly.  Files with no iteration number are treated as if\n" );
+printf(
+"  their iteration number is zero; hence, Triangle might read the file\n" );
+printf(
+"  points.node, triangulate it, and produce the files points.1.node and\n" );
+printf( "  points.1.ele.\n\n" );
+printf(
+"  Iteration numbers allow you to create a sequence of successively finer\n" );
+printf(
+"  meshes suitable for multigrid methods.  They also allow you to produce a\n"
+);
+printf(
+"  sequence of meshes using error estimate-driven mesh refinement.\n" );
+printf( "\n" );
+printf(
+"  If you're not using refinement or quality meshing, and you don't like\n" );
+printf(
+"  iteration numbers, use the -I switch to disable them.  This switch will\n" );
+printf(
+"  also disable output of .node and .poly files to prevent your input files\n"
+);
+printf(
+"  from being overwritten.  (If the input is a .poly file that contains its\n"
+);
+printf( "  own points, a .node file will be written.)\n\n" );
+printf( "Examples of How to Use Triangle:\n\n" );
+printf(
+"  `triangle dots' will read points from dots.node, and write their Delaunay\n"
+);
+printf(
+"  triangulation to dots.1.node and dots.1.ele.  (dots.1.node will be\n" );
+printf(
+"  identical to dots.node.)  `triangle -I dots' writes the triangulation to\n"
+);
+printf(
+"  dots.ele instead.  (No additional .node file is needed, so none is\n" );
+printf( "  written.)\n\n" );
+printf(
+"  `triangle -pe object.1' will read a PSLG from object.1.poly (and possibly\n"
+);
+printf(
+"  object.1.node, if the points are omitted from object.1.poly) and write\n" );
+printf( "  their constrained Delaunay triangulation to object.2.node and\n" );
+printf(
+"  object.2.ele.  The segments will be copied to object.2.poly, and all\n" );
+printf( "  edges will be written to object.2.edge.\n\n" );
+printf(
+"  `triangle -pq31.5a.1 object' will read a PSLG from object.poly (and\n" );
+printf(
+"  possibly object.node), generate a mesh whose angles are all greater than\n"
+);
+printf(
+"  31.5 degrees and whose triangles all have area smaller than 0.1, and\n" );
+printf(
+"  write the mesh to object.1.node and object.1.ele.  Each segment may have\n"
+);
+printf(
+"  been broken up into multiple edges; the resulting constrained edges are\n" );
+printf( "  written to object.1.poly.\n\n" );
+printf(
+"  Here is a sample file `box.poly' describing a square with a square hole:\n"
+);
+printf( "\n" );
+printf(
+"    # A box with eight points in 2D, no attributes, one boundary marker.\n" );
+printf( "    8 2 0 1\n" );
+printf( "    # Outer box has these vertices:\n" );
+printf( "     1   0 0   0\n" );
+printf( "     2   0 3   0\n" );
+printf( "     3   3 0   0\n" );
+printf( "     4   3 3   33     # A special marker for this point.\n" );
+printf( "    # Inner square has these vertices:\n" );
+printf( "     5   1 1   0\n" );
+printf( "     6   1 2   0\n" );
+printf( "     7   2 1   0\n" );
+printf( "     8   2 2   0\n" );
+printf( "    # Five segments with boundary markers.\n" );
+printf( "    5 1\n" );
+printf( "     1   1 2   5      # Left side of outer box.\n" );
+printf( "     2   5 7   0      # Segments 2 through 5 enclose the hole.\n" );
+printf( "     3   7 8   0\n" );
+printf( "     4   8 6   10\n" );
+printf( "     5   6 5   0\n" );
+printf( "    # One hole in the middle of the inner square.\n" );
+printf( "    1\n" );
+printf( "     1   1.5 1.5\n\n" );
+printf(
+"  Note that some segments are missing from the outer square, so one must\n" );
+printf(
+"  use the `-c' switch.  After `triangle -pqc box.poly', here is the output\n"
+);
+printf(
+"  file `box.1.node', with twelve points.  The last four points were added\n" );
+printf(
+"  to meet the angle constraint.  Points 1, 2, and 9 have markers from\n" );
+printf(
+"  segment 1.  Points 6 and 8 have markers from segment 4.  All the other\n" );
+printf(
+"  points but 4 have been marked to indicate that they lie on a boundary.\n" );
+printf( "\n" );
+printf( "    12  2  0  1\n" );
+printf( "       1    0   0      5\n" );
+printf( "       2    0   3      5\n" );
+printf( "       3    3   0      1\n" );
+printf( "       4    3   3     33\n" );
+printf( "       5    1   1      1\n" );
+printf( "       6    1   2     10\n" );
+printf( "       7    2   1      1\n" );
+printf( "       8    2   2     10\n" );
+printf( "       9    0   1.5    5\n" );
+printf( "      10    1.5   0    1\n" );
+printf( "      11    3   1.5    1\n" );
+printf( "      12    1.5   3    1\n" );
+printf( "    # Generated by triangle -pqc box.poly\n\n" );
+printf( "  Here is the output file `box.1.ele', with twelve triangles.\n\n" );
+printf( "    12  3  0\n" );
+printf( "       1     5   6   9\n" );
+printf( "       2    10   3   7\n" );
+printf( "       3     6   8  12\n" );
+printf( "       4     9   1   5\n" );
+printf( "       5     6   2   9\n" );
+printf( "       6     7   3  11\n" );
+printf( "       7    11   4   8\n" );
+printf( "       8     7   5  10\n" );
+printf( "       9    12   2   6\n" );
+printf( "      10     8   7  11\n" );
+printf( "      11     5   1  10\n" );
+printf( "      12     8   4  12\n" );
+printf( "    # Generated by triangle -pqc box.poly\n\n" );
+printf(
+"  Here is the output file `box.1.poly'.  Note that segments have been added\n"
+);
+printf(
+"  to represent the convex hull, and some segments have been split by newly\n"
+);
+printf(
+"  added points.  Note also that <# of points> is set to zero to indicate\n" );
+printf( "  that the points should be read from the .node file.\n\n" );
+printf( "    0  2  0  1\n" );
+printf( "    12  1\n" );
+printf( "       1     1   9     5\n" );
+printf( "       2     5   7     1\n" );
+printf( "       3     8   7     1\n" );
+printf( "       4     6   8    10\n" );
+printf( "       5     5   6     1\n" );
+printf( "       6     3  10     1\n" );
+printf( "       7     4  11     1\n" );
+printf( "       8     2  12     1\n" );
+printf( "       9     9   2     5\n" );
+printf( "      10    10   1     1\n" );
+printf( "      11    11   3     1\n" );
+printf( "      12    12   4     1\n" );
+printf( "    1\n" );
+printf( "       1   1.5 1.5\n" );
+printf( "    # Generated by triangle -pqc box.poly\n\n" );
+printf( "Refinement and Area Constraints:\n\n" );
+printf(
+"  The -r switch causes a mesh (.node and .ele files) to be read and\n" );
+printf(
+"  refined.  If the -p switch is also used, a .poly file is read and used to\n"
+);
+printf(
+"  specify edges that are constrained and cannot be eliminated (although\n" );
+printf(
+"  they can be divided into smaller edges) by the refinement process.\n" );
+printf( "\n" );
+printf(
+"  When you refine a mesh, you generally want to impose tighter quality\n" );
+printf(
+"  constraints.  One way to accomplish this is to use -q with a larger\n" );
+printf(
+"  angle, or -a followed by a smaller area than you used to generate the\n" );
+printf(
+"  mesh you are refining.  Another way to do this is to create an .area\n" );
+printf(
+"  file, which specifies a maximum area for each triangle, and use the -a\n" );
+printf(
+"  switch (without a number following).  Each triangle's area constraint is\n"
+);
+printf(
+"  applied to that triangle.  Area constraints tend to diffuse as the mesh\n" );
+printf(
+"  is refined, so if there are large variations in area constraint between\n" );
+printf( "  adjacent triangles, you may not get the results you want.\n\n" );
+printf(
+"  If you are refining a mesh composed of linear (three-node) elements, the\n"
+);
+printf(
+"  output mesh will contain all the nodes present in the input mesh, in the\n"
+);
+printf(
+"  same order, with new nodes added at the end of the .node file.  However,\n"
+);
+printf(
+"  there is no guarantee that each output element is contained in a single\n" );
+printf(
+"  input element.  Often, output elements will overlap two input elements,\n" );
+printf(
+"  and input edges are not present in the output mesh.  Hence, a sequence of\n"
+);
+printf(
+"  refined meshes will form a hierarchy of nodes, but not a hierarchy of\n" );
+printf(
+"  elements.  If you a refining a mesh of higher-order elements, the\n" );
+printf(
+"  hierarchical property applies only to the nodes at the corners of an\n" );
+printf( "  element; other nodes may not be present in the refined mesh.\n\n" );
+printf(
+"  It is important to understand that maximum area constraints in .poly\n" );
+printf(
+"  files are handled differently from those in .area files.  A maximum area\n"
+);
+printf(
+"  in a .poly file applies to the whole (segment-bounded) region in which a\n"
+);
+printf(
+"  point falls, whereas a maximum area in an .area file applies to only one\n"
+);
+printf(
+"  triangle.  Area constraints in .poly files are used only when a mesh is\n" );
+printf(
+"  first generated, whereas area constraints in .area files are used only to\n"
+);
+printf(
+"  refine an existing mesh, and are typically based on a posteriori error\n" );
+printf(
+"  estimates resulting from a finite element simulation on that mesh.\n" );
+printf( "\n" );
+printf(
+"  `triangle -rq25 object.1' will read object.1.node and object.1.ele, then\n"
+);
+printf(
+"  refine the triangulation to enforce a 25 degree minimum angle, and then\n" );
+printf(
+"  write the refined triangulation to object.2.node and object.2.ele.\n" );
+printf( "\n" );
+printf(
+"  `triangle -rpaa6.2 z.3' will read z.3.node, z.3.ele, z.3.poly, and\n" );
+printf(
+"  z.3.area.  After reconstructing the mesh and its segments, Triangle will\n"
+);
+printf(
+"  refine the mesh so that no triangle has area greater than 6.2, and\n" );
+printf(
+"  furthermore the triangles satisfy the maximum area constraints in\n" );
+printf(
+"  z.3.area.  The output is written to z.4.node, z.4.ele, and z.4.poly.\n" );
+printf( "\n" );
+printf(
+"  The sequence `triangle -qa1 x', `triangle -rqa.3 x.1', `triangle -rqa.1\n" );
+printf(
+"  x.2' creates a sequence of successively finer meshes x.1, x.2, and x.3,\n" );
+printf( "  suitable for multigrid.\n\n" );
+printf( "Convex Hulls and Mesh Boundaries:\n\n" );
+printf(
+"  If the input is a point set (rather than a PSLG), Triangle produces its\n" );
+printf(
+"  convex hull as a by-product in the output .poly file if you use the -c\n" );
+printf(
+"  switch.  There are faster algorithms for finding a two-dimensional convex\n"
+);
+printf(
+"  hull than triangulation, of course, but this one comes for free.  If the\n"
+);
+printf(
+"  input is an unconstrained mesh (you are using the -r switch but not the\n" );
+printf(
+"  -p switch), Triangle produces a list of its boundary edges (including\n" );
+printf( "  hole boundaries) as a by-product if you use the -c switch.\n\n" );
+printf( "Voronoi Diagrams:\n\n" );
+printf(
+"  The -v switch produces a Voronoi diagram, in files suffixed .v.node and\n" );
+printf(
+"  .v.edge.  For example, `triangle -v points' will read points.node,\n" );
+printf(
+"  produce its Delaunay triangulation in points.1.node and points.1.ele,\n" );
+printf(
+"  and produce its Voronoi diagram in points.1.v.node and points.1.v.edge.\n" );
+printf(
+"  The .v.node file contains a list of all Voronoi vertices, and the .v.edge\n"
+);
+printf(
+"  file contains a list of all Voronoi edges, some of which may be infinite\n"
+);
+printf(
+"  rays.  (The choice of filenames makes it easy to run the set of Voronoi\n" );
+printf( "  vertices through Triangle, if so desired.)\n\n" );
+printf(
+"  This implementation does not use exact arithmetic to compute the Voronoi\n"
+);
+printf(
+"  vertices, and does not check whether neighboring vertices are identical.\n"
+);
+printf(
+"  Be forewarned that if the Delaunay triangulation is degenerate or\n" );
+printf(
+"  near-degenerate, the Voronoi diagram may have duplicate points, crossing\n"
+);
+printf(
+"  edges, or infinite rays whose direction vector is zero.  Also, if you\n" );
+printf(
+"  generate a constrained (as opposed to conforming) Delaunay triangulation,\n"
+);
+printf(
+"  or if the triangulation has holes, the corresponding Voronoi diagram is\n" );
+printf( "  likely to have crossing edges and unlikely to make sense.\n\n" );
+printf( "Mesh Topology:\n\n" );
+printf(
+"  You may wish to know which triangles are adjacent to a certain Delaunay\n" );
+printf(
+"  edge in an .edge file, which Voronoi regions are adjacent to a certain\n" );
+printf(
+"  Voronoi edge in a .v.edge file, or which Voronoi regions are adjacent to\n"
+);
+printf(
+"  each other.  All of this information can be found by cross-referencing\n" );
+printf(
+"  output files with the recollection that the Delaunay triangulation and\n" );
+printf( "  the Voronoi diagrams are planar duals.\n\n" );
+printf(
+"  Specifically, edge i of an .edge file is the dual of Voronoi edge i of\n" );
+printf(
+"  the corresponding .v.edge file, and is rotated 90 degrees counterclock-\n" );
+printf(
+"  wise from the Voronoi edge.  Triangle j of an .ele file is the dual of\n" );
+printf(
+"  vertex j of the corresponding .v.node file; and Voronoi region k is the\n" );
+printf( "  dual of point k of the corresponding .node file.\n\n" );
+printf(
+"  Hence, to find the triangles adjacent to a Delaunay edge, look at the\n" );
+printf(
+"  vertices of the corresponding Voronoi edge; their dual triangles are on\n" );
+printf(
+"  the left and right of the Delaunay edge, respectively.  To find the\n" );
+printf(
+"  Voronoi regions adjacent to a Voronoi edge, look at the endpoints of the\n"
+);
+printf(
+"  corresponding Delaunay edge; their dual regions are on the right and left\n"
+);
+printf(
+"  of the Voronoi edge, respectively.  To find which Voronoi regions are\n" );
+printf( "  adjacent to each other, just read the list of Delaunay edges.\n" );
+printf( "\n" );
+printf( "Statistics:\n" );
+printf( "\n" );
+printf(
+"  After generating a mesh, Triangle prints a count of the number of points,\n"
+);
+printf(
+"  triangles, edges, boundary edges, and segments in the output mesh.  If\n" );
+printf(
+"  you've forgotten the statistics for an existing mesh, the -rNEP switches\n"
+);
+printf(
+"  (or -rpNEP if you've got a .poly file for the existing mesh) will\n" );
+printf( "  regenerate these statistics without writing any output.\n\n" );
+printf(
+"  The -V switch produces extended statistics, including a rough estimate\n" );
+printf(
+"  of memory use and a histogram of triangle aspect ratios and angles in the\n"
+);
+printf( "  mesh.\n\n" );
+printf( "Exact Arithmetic:\n\n" );
+printf(
+"  Triangle uses adaptive exact arithmetic to perform what computational\n" );
+printf(
+"  geometers call the `orientation' and `incircle' tests.  If the floating-\n"
+);
+printf(
+"  point arithmetic of your machine conforms to the IEEE 754 standard (as\n" );
+printf(
+"  most workstations do), and does not use extended precision internal\n" );
+printf(
+"  registers, then your output is guaranteed to be an absolutely true\n" );
+printf( "  Delaunay or conforming Delaunay triangulation, roundoff error\n" );
+printf(
+"  notwithstanding.  The word `adaptive' implies that these arithmetic\n" );
+printf(
+"  routines compute the result only to the precision necessary to guarantee\n"
+);
+printf(
+"  correctness, so they are usually nearly as fast as their approximate\n" );
+printf(
+"  counterparts.  The exact tests can be disabled with the -X switch.  On\n" );
+printf(
+"  most inputs, this switch will reduce the computation time by about eight\n"
+);
+printf(
+"  percent - it's not worth the risk.  There are rare difficult inputs\n" );
+printf(
+"  (having many collinear and cocircular points), however, for which the\n" );
+printf(
+"  difference could be a factor of two.  These are precisely the inputs most\n"
+);
+printf( "  likely to cause errors if you use the -X switch.\n\n" );
+printf(
+"  Unfortunately, these routines don't solve every numerical problem.  Exact\n"
+);
+printf(
+"  arithmetic is not used to compute the positions of points, because the\n" );
+printf(
+"  bit complexity of point coordinates would grow without bound.  Hence,\n" );
+printf(
+"  segment intersections aren't computed exactly; in very unusual cases,\n" );
+printf(
+"  roundoff error in computing an intersection point might actually lead to\n"
+);
+printf(
+"  an inverted triangle and an invalid triangulation.  (This is one reason\n" );
+printf(
+"  to compute your own intersection points in your .poly files.)  Similarly,\n"
+);
+printf(
+"  exact arithmetic is not used to compute the vertices of the Voronoi\n" );
+printf( "  diagram.\n\n" );
+printf(
+"  Underflow and overflow can also cause difficulties; the exact arithmetic\n"
+);
+printf(
+"  routines do not ameliorate out-of-bounds exponents, which can arise\n" );
+printf(
+"  during the orientation and incircle tests.  As a rule of thumb, you\n" );
+printf(
+"  should ensure that your input values are within a range such that their\n" );
+printf(
+"  third powers can be taken without underflow or overflow.  Underflow can\n" );
+printf(
+"  silently prevent the tests from being performed exactly, while overflow\n" );
+printf( "  will typically cause a floating exception.\n\n" );
+printf( "Calling Triangle from Another Program:\n\n" );
+printf( "  Read the file triangle.h for details.\n\n" );
+printf( "Troubleshooting:\n\n" );
+printf( "  Please read this section before mailing me bugs.\n\n" );
+printf( "  `My output mesh has no triangles!'\n\n" );
+printf(
+"    If you're using a PSLG, you've probably failed to specify a proper set\n"
+);
+printf(
+"    of bounding segments, or forgotten to use the -c switch.  Or you may\n" );
+printf(
+"    have placed a hole badly.  To test these possibilities, try again with\n"
+);
+printf(
+"    the -c and -O switches.  Alternatively, all your input points may be\n" );
+printf(
+"    collinear, in which case you can hardly expect to triangulate them.\n" );
+printf( "\n" );
+printf( "  `Triangle doesn't terminate, or just crashes.'\n" );
+printf( "\n" );
+printf(
+"    Bad things can happen when triangles get so small that the distance\n" );
+printf(
+"    between their vertices isn't much larger than the precision of your\n" );
+printf(
+"    machine's arithmetic.  If you've compiled Triangle for single-precision\n"
+);
+printf(
+"    arithmetic, you might do better by recompiling it for double-precision.\n"
+);
+printf(
+"    Then again, you might just have to settle for more lenient constraints\n"
+);
+printf(
+"    on the minimum angle and the maximum area than you had planned.\n" );
+printf( "\n" );
+printf(
+"    You can minimize precision problems by ensuring that the origin lies\n" );
+printf(
+"    inside your point set, or even inside the densest part of your\n" );
+printf(
+"    mesh.  On the other hand, if you're triangulating an object whose x\n" );
+printf(
+"    coordinates all fall between 6247133 and 6247134, you're not leaving\n" );
+printf( "    much floating-point precision for Triangle to work with.\n\n" );
+printf(
+"    Precision problems can occur covertly if the input PSLG contains two\n" );
+printf(
+"    segments that meet (or intersect) at a very small angle, or if such an\n"
+);
+printf(
+"    angle is introduced by the -c switch, which may occur if a point lies\n" );
+printf(
+"    ever-so-slightly inside the convex hull, and is connected by a PSLG\n" );
+printf(
+"    segment to a point on the convex hull.  If you don't realize that a\n" );
+printf(
+"    small angle is being formed, you might never discover why Triangle is\n" );
+printf(
+"    crashing.  To check for this possibility, use the -S switch (with an\n" );
+printf(
+"    appropriate limit on the number of Steiner points, found by trial-and-\n"
+);
+printf(
+"    error) to stop Triangle early, and view the output .poly file with\n" );
+printf(
+"    Show Me (described below).  Look carefully for small angles between\n" );
+printf(
+"    segments; zoom in closely, as such segments might look like a single\n" );
+printf( "    segment from a distance.\n\n" );
+printf(
+"    If some of the input values are too large, Triangle may suffer a\n" );
+printf(
+"    floating exception due to overflow when attempting to perform an\n" );
+printf(
+"    orientation or incircle test.  (Read the section on exact arithmetic\n" );
+printf(
+"    above.)  Again, I recommend compiling Triangle for double (rather\n" );
+printf( "    than single) precision arithmetic.\n\n" );
+printf(
+"  `The numbering of the output points doesn't match the input points.'\n" );
+printf( "\n" );
+printf(
+"    You may have eaten some of your input points with a hole, or by placing\n"
+);
+printf( "    them outside the area enclosed by segments.\n\n" );
+printf(
+"  `Triangle executes without incident, but when I look at the resulting\n" );
+printf(
+"  mesh, it has overlapping triangles or other geometric inconsistencies.'\n" );
+printf( "\n" );
+printf(
+"    If you select the -X switch, Triangle's divide-and-conquer Delaunay\n" );
+printf(
+"    triangulation algorithm occasionally makes mistakes due to floating-\n" );
+printf(
+"    point roundoff error.  Although these errors are rare, don't use the -X\n"
+);
+printf( "    switch.  If you still have problems, please report the bug.\n" );
+printf( "\n" );
+printf(
+"  Strange things can happen if you've taken liberties with your PSLG.  Do\n" );
+printf(
+"  you have a point lying in the middle of a segment?  Triangle sometimes\n" );
+printf(
+"  copes poorly with that sort of thing.  Do you want to lay out a collinear\n"
+);
+printf(
+"  row of evenly spaced, segment-connected points?  Have you simply defined\n"
+);
+printf(
+"  one long segment connecting the leftmost point to the rightmost point,\n" );
+printf(
+"  and a bunch of points lying along it?  This method occasionally works,\n" );
+printf(
+"  especially with horizontal and vertical lines, but often it doesn't, and\n"
+);
+printf(
+"  you'll have to connect each adjacent pair of points with a separate\n" );
+printf( "  segment.  If you don't like it, tough.\n\n" );
+printf(
+"  Furthermore, if you have segments that intersect other than at their\n" );
+printf(
+"  endpoints, try not to let the intersections fall extremely close to PSLG\n"
+);
+printf( "  points or each other.\n\n" );
+printf(
+"  If you have problems refining a triangulation not produced by Triangle:\n" );
+printf(
+"  Are you sure the triangulation is geometrically valid?  Is it formatted\n" );
+printf(
+"  correctly for Triangle?  Are the triangles all listed so the first three\n"
+);
+printf( "  points are their corners in counterclockwise order?\n\n" );
+printf( "Show Me:\n\n" );
+printf(
+"  Triangle comes with a separate program named `Show Me', whose primary\n" );
+printf(
+"  purpose is to draw meshes on your screen or in PostScript.  Its secondary\n"
+);
+printf(
+"  purpose is to check the validity of your input files, and do so more\n" );
+printf(
+"  thoroughly than Triangle does.  Show Me requires that you have the X\n" );
+printf(
+"  Windows system.  If you didn't receive Show Me with Triangle, complain to\n"
+);
+printf( "  whomever you obtained Triangle from, then send me mail.\n\n" );
+printf( "Triangle on the Web:\n\n" );
+printf(
+"  To see an illustrated, updated version of these instructions, check out\n" );
+printf( "\n" );
+printf( "    http://www.cs.cmu.edu/~quake/triangle.html\n" );
+printf( "\n" );
+printf( "A Brief Plea:\n" );
+printf( "\n" );
+printf(
+"  If you use Triangle, and especially if you use it to accomplish real\n" );
+printf(
+"  work, I would like very much to hear from you.  A short letter or email\n" );
+printf(
+"  (to jrs@cs.cmu.edu) describing how you use Triangle will mean a lot to\n" );
+printf(
+"  me.  The more people I know are using this program, the more easily I can\n"
+);
+printf(
+"  justify spending time on improvements and on the three-dimensional\n" );
+printf(
+"  successor to Triangle, which in turn will benefit you.  Also, I can put\n" );
+printf(
+"  you on a list to receive email whenever a new version of Triangle is\n" );
+printf( "  available.\n\n" );
+printf(
+"  If you use a mesh generated by Triangle in a publication, please include\n"
+);
+printf( "  an acknowledgment as well.\n\n" );
+printf( "Research credit:\n\n" );
+printf(
+"  Of course, I can take credit for only a fraction of the ideas that made\n" );
+printf(
+"  this mesh generator possible.  Triangle owes its existence to the efforts\n"
+);
+printf(
+"  of many fine computational geometers and other researchers, including\n" );
+printf(
+"  Marshall Bern, L. Paul Chew, Boris Delaunay, Rex A. Dwyer, David\n" );
+printf(
+"  Eppstein, Steven Fortune, Leonidas J. Guibas, Donald E. Knuth, C. L.\n" );
+printf(
+"  Lawson, Der-Tsai Lee, Ernst P. Mucke, Douglas M. Priest, Jim Ruppert,\n" );
+printf(
+"  Isaac Saias, Bruce J. Schachter, Micha Sharir, Jorge Stolfi, Christopher\n"
+);
+printf(
+"  J. Van Wyk, David F. Watson, and Binhai Zhu.  See the comments at the\n" );
+printf( "  beginning of the source code for references.\n\n" );
+exit( 0 );
 }
 
 #endif /* not TRILIBRARY */
@@ -2654,10 +2773,10 @@ void info(){
 /*****************************************************************************/
 
 void internalerror(){
-       printf( "  Please report this bug to jrs@cs.cmu.edu\n" );
-       printf( "  Include the message above, your input data set, and the exact\n" );
-       printf( "    command line you used to run Triangle.\n" );
-       exit( 1 );
+printf( "  Please report this bug to jrs@cs.cmu.edu\n" );
+printf( "  Include the message above, your input data set, and the exact\n" );
+printf( "    command line you used to run Triangle.\n" );
+exit( 1 );
 }
 
 /*****************************************************************************/
@@ -2673,324 +2792,341 @@ void parsecommandline( argc, argv )
 int argc;
 char **argv;
 {
-#ifdef TRILIBRARY
-#define STARTINDEX 0
+#ifdef
+TRILIBRARY
+#define
+STARTINDEX 0
 #else /* not TRILIBRARY */
-#define STARTINDEX 1
-       int increment;
-       int meshnumber;
+#define
+STARTINDEX 1
+int increment;
+int meshnumber;
 #endif /* not TRILIBRARY */
-       int i, j;
-#ifndef CDT_ONLY
-       int k;
-       char workstring[FILENAMESIZE];
+int i, j;
+#ifndef
+CDT_ONLY
+int k;
+char workstring[FILENAMESIZE];
 #endif
 
-       poly = refine = quality = vararea = fixedarea = regionattrib = convex = 0;
-       firstnumber = 1;
-       edgesout = voronoi = neighbors = geomview = 0;
-       nobound = nopolywritten = nonodewritten = noelewritten = noiterationnum = 0;
-       noholes = noexact = 0;
-       incremental = sweepline = 0;
-       dwyer = 1;
-       splitseg = 0;
-       docheck = 0;
-       nobisect = 0;
-       steiner = -1;
-       order = 1;
-       minangle = 0.0;
-       maxarea = -1.0;
-       quiet = verbose = 0;
-#ifndef TRILIBRARY
-       innodefilename[0] = '\0';
+poly = refine = quality = vararea = fixedarea = regionattrib = convex = 0;
+firstnumber = 1;
+edgesout = voronoi = neighbors = geomview = 0;
+nobound = nopolywritten = nonodewritten = noelewritten = noiterationnum = 0;
+noholes = noexact = 0;
+incremental = sweepline = 0;
+dwyer = 1;
+splitseg = 0;
+docheck = 0;
+nobisect = 0;
+steiner = -1;
+order = 1;
+minangle = 0.0;
+maxarea = -1.0;
+quiet = verbose = 0;
+#ifndef
+TRILIBRARY
+innodefilename[0] = '\0';
 #endif /* not TRILIBRARY */
 
-       for ( i = STARTINDEX; i < argc; i++ ) {
-#ifndef TRILIBRARY
-               if ( argv[i][0] == '-' ) {
+for ( i = STARTINDEX; i < argc; i++ ) {
+#ifndef
+TRILIBRARY
+if ( argv[i][0] == '-' ) {
 #endif /* not TRILIBRARY */
-               for ( j = STARTINDEX; argv[i][j] != '\0'; j++ ) {
-                       if ( argv[i][j] == 'p' ) {
-                               poly = 1;
-                       }
-#ifndef CDT_ONLY
-                       if ( argv[i][j] == 'r' ) {
-                               refine = 1;
-                       }
-                       if ( argv[i][j] == 'q' ) {
-                               quality = 1;
-                               if ( ( ( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' ) ) ||
-                                        ( argv[i][j + 1] == '.' ) ) {
-                                       k = 0;
-                                       while ( ( ( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' ) ) ||
-                                                       ( argv[i][j + 1] == '.' ) ) {
-                                               j++;
-                                               workstring[k] = argv[i][j];
-                                               k++;
-                                       }
-                                       workstring[k] = '\0';
-                                       minangle = (REAL) strtod( workstring, (char **) NULL );
-                               }
-                               else {
-                                       minangle = 20.0;
-                               }
-                       }
-                       if ( argv[i][j] == 'a' ) {
-                               quality = 1;
-                               if ( ( ( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' ) ) ||
-                                        ( argv[i][j + 1] == '.' ) ) {
-                                       fixedarea = 1;
-                                       k = 0;
-                                       while ( ( ( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' ) ) ||
-                                                       ( argv[i][j + 1] == '.' ) ) {
-                                               j++;
-                                               workstring[k] = argv[i][j];
-                                               k++;
-                                       }
-                                       workstring[k] = '\0';
-                                       maxarea = (REAL) strtod( workstring, (char **) NULL );
-                                       if ( maxarea <= 0.0 ) {
-                                               printf( "Error:  Maximum area must be greater than zero.\n" );
-                                               exit( 1 );
-                                       }
-                               }
-                               else {
-                                       vararea = 1;
-                               }
-                       }
+for ( j = STARTINDEX; argv[i][j] != '\0'; j++ ) {
+if ( argv[i][j] == 'p' ) {
+poly = 1;
+}
+#ifndef
+CDT_ONLY
+if ( argv[i][j] == 'r' ) {
+refine = 1;
+}
+if ( argv[i][j] == 'q' ) {
+quality = 1;
+if ((( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' )) ||
+( argv[i][j + 1] == '.' )) {
+k = 0;
+while ((( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' )) ||
+( argv[i][j + 1] == '.' )) {
+j++;
+workstring[k] = argv[i][j];
+k++;
+}
+workstring[k] = '\0';
+minangle = (REAL) strtod( workstring, (char **) NULL );
+}
+else {
+minangle = 20.0;
+}
+}
+if ( argv[i][j] == 'a' ) {
+quality = 1;
+if ((( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' )) ||
+( argv[i][j + 1] == '.' )) {
+fixedarea = 1;
+k = 0;
+while ((( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' )) ||
+( argv[i][j + 1] == '.' )) {
+j++;
+workstring[k] = argv[i][j];
+k++;
+}
+workstring[k] = '\0';
+maxarea = (REAL) strtod( workstring, (char **) NULL );
+if ( maxarea <= 0.0 ) {
+printf( "Error:  Maximum area must be greater than zero.\n" );
+exit( 1 );
+}
+}
+else {
+vararea = 1;
+}
+}
 #endif /* not CDT_ONLY */
-                       if ( argv[i][j] == 'A' ) {
-                               regionattrib = 1;
-                       }
-                       if ( argv[i][j] == 'c' ) {
-                               convex = 1;
-                       }
-                       if ( argv[i][j] == 'z' ) {
-                               firstnumber = 0;
-                       }
-                       if ( argv[i][j] == 'e' ) {
-                               edgesout = 1;
-                       }
-                       if ( argv[i][j] == 'v' ) {
-                               voronoi = 1;
-                       }
-                       if ( argv[i][j] == 'n' ) {
-                               neighbors = 1;
-                       }
-                       if ( argv[i][j] == 'g' ) {
-                               geomview = 1;
-                       }
-                       if ( argv[i][j] == 'B' ) {
-                               nobound = 1;
-                       }
-                       if ( argv[i][j] == 'P' ) {
-                               nopolywritten = 1;
-                       }
-                       if ( argv[i][j] == 'N' ) {
-                               nonodewritten = 1;
-                       }
-                       if ( argv[i][j] == 'E' ) {
-                               noelewritten = 1;
-                       }
-#ifndef TRILIBRARY
-                       if ( argv[i][j] == 'I' ) {
-                               noiterationnum = 1;
-                       }
+if ( argv[i][j] == 'A' ) {
+regionattrib = 1;
+}
+if ( argv[i][j] == 'c' ) {
+convex = 1;
+}
+if ( argv[i][j] == 'z' ) {
+firstnumber = 0;
+}
+if ( argv[i][j] == 'e' ) {
+edgesout = 1;
+}
+if ( argv[i][j] == 'v' ) {
+voronoi = 1;
+}
+if ( argv[i][j] == 'n' ) {
+neighbors = 1;
+}
+if ( argv[i][j] == 'g' ) {
+geomview = 1;
+}
+if ( argv[i][j] == 'B' ) {
+nobound = 1;
+}
+if ( argv[i][j] == 'P' ) {
+nopolywritten = 1;
+}
+if ( argv[i][j] == 'N' ) {
+nonodewritten = 1;
+}
+if ( argv[i][j] == 'E' ) {
+noelewritten = 1;
+}
+#ifndef
+TRILIBRARY
+if ( argv[i][j] == 'I' ) {
+noiterationnum = 1;
+}
 #endif /* not TRILIBRARY */
-                       if ( argv[i][j] == 'O' ) {
-                               noholes = 1;
-                       }
-                       if ( argv[i][j] == 'X' ) {
-                               noexact = 1;
-                       }
-                       if ( argv[i][j] == 'o' ) {
-                               if ( argv[i][j + 1] == '2' ) {
-                                       j++;
-                                       order = 2;
-                               }
-                       }
-#ifndef CDT_ONLY
-                       if ( argv[i][j] == 'Y' ) {
-                               nobisect++;
-                       }
-                       if ( argv[i][j] == 'S' ) {
-                               steiner = 0;
-                               while ( ( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' ) ) {
-                                       j++;
-                                       steiner = steiner * 10 + (int) ( argv[i][j] - '0' );
-                               }
-                       }
+if ( argv[i][j] == 'O' ) {
+noholes = 1;
+}
+if ( argv[i][j] == 'X' ) {
+noexact = 1;
+}
+if ( argv[i][j] == 'o' ) {
+if ( argv[i][j + 1] == '2' ) {
+j++;
+order = 2;
+}
+}
+#ifndef
+CDT_ONLY
+if ( argv[i][j] == 'Y' ) {
+nobisect++;
+}
+if ( argv[i][j] == 'S' ) {
+steiner = 0;
+while (( argv[i][j + 1] >= '0' ) && ( argv[i][j + 1] <= '9' )) {
+j++;
+steiner = steiner * 10 + (int) ( argv[i][j] - '0' );
+}
+}
 #endif /* not CDT_ONLY */
-#ifndef REDUCED
-                       if ( argv[i][j] == 'i' ) {
-                               incremental = 1;
-                       }
-                       if ( argv[i][j] == 'F' ) {
-                               sweepline = 1;
-                       }
+#ifndef
+REDUCED
+if ( argv[i][j] == 'i' ) {
+incremental = 1;
+}
+if ( argv[i][j] == 'F' ) {
+sweepline = 1;
+}
 #endif /* not REDUCED */
-                       if ( argv[i][j] == 'l' ) {
-                               dwyer = 0;
-                       }
-#ifndef REDUCED
-#ifndef CDT_ONLY
-                       if ( argv[i][j] == 's' ) {
-                               splitseg = 1;
-                       }
+if ( argv[i][j] == 'l' ) {
+dwyer = 0;
+}
+#ifndef
+REDUCED
+#ifndef
+CDT_ONLY
+if ( argv[i][j] == 's' ) {
+splitseg = 1;
+}
 #endif /* not CDT_ONLY */
-                       if ( argv[i][j] == 'C' ) {
-                               docheck = 1;
-                       }
+if ( argv[i][j] == 'C' ) {
+docheck = 1;
+}
 #endif /* not REDUCED */
-                       if ( argv[i][j] == 'Q' ) {
-                               quiet = 1;
-                       }
-                       if ( argv[i][j] == 'V' ) {
-                               verbose++;
-                       }
-#ifndef TRILIBRARY
-                       if ( ( argv[i][j] == 'h' ) || ( argv[i][j] == 'H' ) ||
-                                ( argv[i][j] == '?' ) ) {
-                               info();
-                       }
+if ( argv[i][j] == 'Q' ) {
+quiet = 1;
+}
+if ( argv[i][j] == 'V' ) {
+verbose++;
+}
+#ifndef
+TRILIBRARY
+if (( argv[i][j] == 'h' ) || ( argv[i][j] == 'H' ) ||
+( argv[i][j] == '?' )) {
+info();
+}
 #endif /* not TRILIBRARY */
-               }
-#ifndef TRILIBRARY
-       } else {
-               strncpy( innodefilename, argv[i], FILENAMESIZE - 1 );
-               innodefilename[FILENAMESIZE - 1] = '\0';
-       }
+}
+#ifndef
+TRILIBRARY
+} else {
+strncpy( innodefilename, argv[i], FILENAMESIZE - 1 );
+innodefilename[FILENAMESIZE - 1] = '\0';
+}
 #endif /* not TRILIBRARY */
-       }
-#ifndef TRILIBRARY
-       if ( innodefilename[0] == '\0' ) {
-               syntax();
-       }
-       if ( !strcmp( &innodefilename[strlen( innodefilename ) - 5], ".node" ) ) {
-               innodefilename[strlen( innodefilename ) - 5] = '\0';
-       }
-       if ( !strcmp( &innodefilename[strlen( innodefilename ) - 5], ".poly" ) ) {
-               innodefilename[strlen( innodefilename ) - 5] = '\0';
-               poly = 1;
-       }
-#ifndef CDT_ONLY
-       if ( !strcmp( &innodefilename[strlen( innodefilename ) - 4], ".ele" ) ) {
-               innodefilename[strlen( innodefilename ) - 4] = '\0';
-               refine = 1;
-       }
-       if ( !strcmp( &innodefilename[strlen( innodefilename ) - 5], ".area" ) ) {
-               innodefilename[strlen( innodefilename ) - 5] = '\0';
-               refine = 1;
-               quality = 1;
-               vararea = 1;
-       }
+}
+#ifndef
+TRILIBRARY
+if ( innodefilename[0] == '\0' ) {
+syntax();
+}
+if ( !strcmp( &innodefilename[strlen( innodefilename ) - 5], ".node" )) {
+innodefilename[strlen( innodefilename ) - 5] = '\0';
+}
+if ( !strcmp( &innodefilename[strlen( innodefilename ) - 5], ".poly" )) {
+innodefilename[strlen( innodefilename ) - 5] = '\0';
+poly = 1;
+}
+#ifndef
+CDT_ONLY
+if ( !strcmp( &innodefilename[strlen( innodefilename ) - 4], ".ele" )) {
+innodefilename[strlen( innodefilename ) - 4] = '\0';
+refine = 1;
+}
+if ( !strcmp( &innodefilename[strlen( innodefilename ) - 5], ".area" )) {
+innodefilename[strlen( innodefilename ) - 5] = '\0';
+refine = 1;
+quality = 1;
+vararea = 1;
+}
 #endif /* not CDT_ONLY */
 #endif /* not TRILIBRARY */
-       steinerleft = steiner;
-       useshelles = poly || refine || quality || convex;
-       goodangle = (REAL)cos( minangle * PI / 180.0 );
-       goodangle *= goodangle;
-       if ( refine && noiterationnum ) {
-               printf(
-                       "Error:  You cannot use the -I switch when refining a triangulation.\n" );
-               exit( 1 );
-       }
-       /* Be careful not to allocate space for element area constraints that */
-       /*   will never be assigned any value (other than the default -1.0).  */
-       if ( !refine && !poly ) {
-               vararea = 0;
-       }
-       /* Be careful not to add an extra attribute to each element unless the */
-       /*   input supports it (PSLG in, but not refining a preexisting mesh). */
-       if ( refine || !poly ) {
-               regionattrib = 0;
-       }
-
-#ifndef TRILIBRARY
-       strcpy( inpolyfilename, innodefilename );
-       strcpy( inelefilename, innodefilename );
-       strcpy( areafilename, innodefilename );
-       increment = 0;
-       strcpy( workstring, innodefilename );
-       j = 1;
-       while ( workstring[j] != '\0' ) {
-               if ( ( workstring[j] == '.' ) && ( workstring[j + 1] != '\0' ) ) {
-                       increment = j + 1;
-               }
-               j++;
-       }
-       meshnumber = 0;
-       if ( increment > 0 ) {
-               j = increment;
-               do {
-                       if ( ( workstring[j] >= '0' ) && ( workstring[j] <= '9' ) ) {
-                               meshnumber = meshnumber * 10 + (int) ( workstring[j] - '0' );
-                       }
-                       else {
-                               increment = 0;
-                       }
-                       j++;
-               } while ( workstring[j] != '\0' );
-       }
-       if ( noiterationnum ) {
-               strcpy( outnodefilename, innodefilename );
-               strcpy( outelefilename, innodefilename );
-               strcpy( edgefilename, innodefilename );
-               strcpy( vnodefilename, innodefilename );
-               strcpy( vedgefilename, innodefilename );
-               strcpy( neighborfilename, innodefilename );
-               strcpy( offfilename, innodefilename );
-               strcat( outnodefilename, ".node" );
-               strcat( outelefilename, ".ele" );
-               strcat( edgefilename, ".edge" );
-               strcat( vnodefilename, ".v.node" );
-               strcat( vedgefilename, ".v.edge" );
-               strcat( neighborfilename, ".neigh" );
-               strcat( offfilename, ".off" );
-       }
-       else if ( increment == 0 ) {
-               strcpy( outnodefilename, innodefilename );
-               strcpy( outpolyfilename, innodefilename );
-               strcpy( outelefilename, innodefilename );
-               strcpy( edgefilename, innodefilename );
-               strcpy( vnodefilename, innodefilename );
-               strcpy( vedgefilename, innodefilename );
-               strcpy( neighborfilename, innodefilename );
-               strcpy( offfilename, innodefilename );
-               strcat( outnodefilename, ".1.node" );
-               strcat( outpolyfilename, ".1.poly" );
-               strcat( outelefilename, ".1.ele" );
-               strcat( edgefilename, ".1.edge" );
-               strcat( vnodefilename, ".1.v.node" );
-               strcat( vedgefilename, ".1.v.edge" );
-               strcat( neighborfilename, ".1.neigh" );
-               strcat( offfilename, ".1.off" );
-       }
-       else {
-               workstring[increment] = '%';
-               workstring[increment + 1] = 'd';
-               workstring[increment + 2] = '\0';
-               sprintf( outnodefilename, workstring, meshnumber + 1 );
-               strcpy( outpolyfilename, outnodefilename );
-               strcpy( outelefilename, outnodefilename );
-               strcpy( edgefilename, outnodefilename );
-               strcpy( vnodefilename, outnodefilename );
-               strcpy( vedgefilename, outnodefilename );
-               strcpy( neighborfilename, outnodefilename );
-               strcpy( offfilename, outnodefilename );
-               strcat( outnodefilename, ".node" );
-               strcat( outpolyfilename, ".poly" );
-               strcat( outelefilename, ".ele" );
-               strcat( edgefilename, ".edge" );
-               strcat( vnodefilename, ".v.node" );
-               strcat( vedgefilename, ".v.edge" );
-               strcat( neighborfilename, ".neigh" );
-               strcat( offfilename, ".off" );
-       }
-       strcat( innodefilename, ".node" );
-       strcat( inpolyfilename, ".poly" );
-       strcat( inelefilename, ".ele" );
-       strcat( areafilename, ".area" );
+steinerleft = steiner;
+useshelles = poly || refine || quality || convex;
+goodangle = (REAL)cos( minangle * PI / 180.0 );
+goodangle *= goodangle;
+if ( refine && noiterationnum ) {
+printf(
+"Error:  You cannot use the -I switch when refining a triangulation.\n" );
+exit( 1 );
+}
+/* Be careful not to allocate space for element area constraints that */
+/*   will never be assigned any value (other than the default -1.0).  */
+if ( !refine && !poly ) {
+vararea = 0;
+}
+/* Be careful not to add an extra attribute to each element unless the */
+/*   input supports it (PSLG in, but not refining a preexisting mesh). */
+if ( refine || !poly ) {
+regionattrib = 0;
+}
+
+#ifndef
+TRILIBRARY
+strcpy( inpolyfilename, innodefilename );
+strcpy( inelefilename, innodefilename );
+strcpy( areafilename, innodefilename );
+increment = 0;
+strcpy( workstring, innodefilename );
+j = 1;
+while ( workstring[j] != '\0' ) {
+if (( workstring[j] == '.' ) && ( workstring[j + 1] != '\0' )) {
+increment = j + 1;
+}
+j++;
+}
+meshnumber = 0;
+if ( increment > 0 ) {
+j = increment;
+do {
+if (( workstring[j] >= '0' ) && ( workstring[j] <= '9' )) {
+meshnumber = meshnumber * 10 + (int) ( workstring[j] - '0' );
+}
+else {
+increment = 0;
+}
+j++;
+} while ( workstring[j] != '\0' );
+}
+if ( noiterationnum ) {
+strcpy( outnodefilename, innodefilename );
+strcpy( outelefilename, innodefilename );
+strcpy( edgefilename, innodefilename );
+strcpy( vnodefilename, innodefilename );
+strcpy( vedgefilename, innodefilename );
+strcpy( neighborfilename, innodefilename );
+strcpy( offfilename, innodefilename );
+strcat( outnodefilename, ".node" );
+strcat( outelefilename, ".ele" );
+strcat( edgefilename, ".edge" );
+strcat( vnodefilename, ".v.node" );
+strcat( vedgefilename, ".v.edge" );
+strcat( neighborfilename, ".neigh" );
+strcat( offfilename, ".off" );
+}
+else if ( increment == 0 ) {
+strcpy( outnodefilename, innodefilename );
+strcpy( outpolyfilename, innodefilename );
+strcpy( outelefilename, innodefilename );
+strcpy( edgefilename, innodefilename );
+strcpy( vnodefilename, innodefilename );
+strcpy( vedgefilename, innodefilename );
+strcpy( neighborfilename, innodefilename );
+strcpy( offfilename, innodefilename );
+strcat( outnodefilename, ".1.node" );
+strcat( outpolyfilename, ".1.poly" );
+strcat( outelefilename, ".1.ele" );
+strcat( edgefilename, ".1.edge" );
+strcat( vnodefilename, ".1.v.node" );
+strcat( vedgefilename, ".1.v.edge" );
+strcat( neighborfilename, ".1.neigh" );
+strcat( offfilename, ".1.off" );
+}
+else {
+workstring[increment] = '%';
+workstring[increment + 1] = 'd';
+workstring[increment + 2] = '\0';
+sprintf( outnodefilename, workstring, meshnumber + 1 );
+strcpy( outpolyfilename, outnodefilename );
+strcpy( outelefilename, outnodefilename );
+strcpy( edgefilename, outnodefilename );
+strcpy( vnodefilename, outnodefilename );
+strcpy( vedgefilename, outnodefilename );
+strcpy( neighborfilename, outnodefilename );
+strcpy( offfilename, outnodefilename );
+strcat( outnodefilename, ".node" );
+strcat( outpolyfilename, ".poly" );
+strcat( outelefilename, ".ele" );
+strcat( edgefilename, ".edge" );
+strcat( vnodefilename, ".v.node" );
+strcat( vedgefilename, ".v.edge" );
+strcat( neighborfilename, ".neigh" );
+strcat( offfilename, ".off" );
+}
+strcat( innodefilename, ".node" );
+strcat( inpolyfilename, ".poly" );
+strcat( inelefilename, ".ele" );
+strcat( areafilename, ".area" );
 #endif /* not TRILIBRARY */
 }
 
@@ -3016,83 +3152,83 @@ char **argv;
 void printtriangle( t )
 struct triedge *t;
 {
-       struct triedge printtri;
-       struct edge printsh;
-       point printpoint;
-
-       printf( "triangle x%lx with orientation %d:\n", (unsigned long) t->tri,
-                       t->orient );
-       decode( t->tri[0], printtri );
-       if ( printtri.tri == dummytri ) {
-               printf( "    [0] = Outer space\n" );
-       }
-       else {
-               printf( "    [0] = x%lx  %d\n", (unsigned long) printtri.tri,
-                               printtri.orient );
-       }
-       decode( t->tri[1], printtri );
-       if ( printtri.tri == dummytri ) {
-               printf( "    [1] = Outer space\n" );
-       }
-       else {
-               printf( "    [1] = x%lx  %d\n", (unsigned long) printtri.tri,
-                               printtri.orient );
-       }
-       decode( t->tri[2], printtri );
-       if ( printtri.tri == dummytri ) {
-               printf( "    [2] = Outer space\n" );
-       }
-       else {
-               printf( "    [2] = x%lx  %d\n", (unsigned long) printtri.tri,
-                               printtri.orient );
-       }
-       org( *t, printpoint );
-       if ( printpoint == (point) NULL ) {
-               printf( "    Origin[%d] = NULL\n", ( t->orient + 1 ) % 3 + 3 );
-       }
-       else{
-               printf( "    Origin[%d] = x%lx  (%.12g, %.12g)\n",
-                               ( t->orient + 1 ) % 3 + 3, (unsigned long) printpoint,
-                               printpoint[0], printpoint[1] );
-       }
-       dest( *t, printpoint );
-       if ( printpoint == (point) NULL ) {
-               printf( "    Dest  [%d] = NULL\n", ( t->orient + 2 ) % 3 + 3 );
-       }
-       else{
-               printf( "    Dest  [%d] = x%lx  (%.12g, %.12g)\n",
-                               ( t->orient + 2 ) % 3 + 3, (unsigned long) printpoint,
-                               printpoint[0], printpoint[1] );
-       }
-       apex( *t, printpoint );
-       if ( printpoint == (point) NULL ) {
-               printf( "    Apex  [%d] = NULL\n", t->orient + 3 );
-       }
-       else{
-               printf( "    Apex  [%d] = x%lx  (%.12g, %.12g)\n",
-                               t->orient + 3, (unsigned long) printpoint,
-                               printpoint[0], printpoint[1] );
-       }
-       if ( useshelles ) {
-               sdecode( t->tri[6], printsh );
-               if ( printsh.sh != dummysh ) {
-                       printf( "    [6] = x%lx  %d\n", (unsigned long) printsh.sh,
-                                       printsh.shorient );
-               }
-               sdecode( t->tri[7], printsh );
-               if ( printsh.sh != dummysh ) {
-                       printf( "    [7] = x%lx  %d\n", (unsigned long) printsh.sh,
-                                       printsh.shorient );
-               }
-               sdecode( t->tri[8], printsh );
-               if ( printsh.sh != dummysh ) {
-                       printf( "    [8] = x%lx  %d\n", (unsigned long) printsh.sh,
-                                       printsh.shorient );
-               }
-       }
-       if ( vararea ) {
-               printf( "    Area constraint:  %.4g\n", areabound( *t ) );
-       }
+struct triedge printtri;
+struct edge printsh;
+point printpoint;
+
+printf( "triangle x%lx with orientation %d:\n", (unsigned long) t->tri,
+t->orient );
+decode( t->tri[0], printtri );
+if ( printtri.tri == dummytri ) {
+printf( "    [0] = Outer space\n" );
+}
+else {
+printf( "    [0] = x%lx  %d\n", (unsigned long) printtri.tri,
+printtri.orient );
+}
+decode( t->tri[1], printtri );
+if ( printtri.tri == dummytri ) {
+printf( "    [1] = Outer space\n" );
+}
+else {
+printf( "    [1] = x%lx  %d\n", (unsigned long) printtri.tri,
+printtri.orient );
+}
+decode( t->tri[2], printtri );
+if ( printtri.tri == dummytri ) {
+printf( "    [2] = Outer space\n" );
+}
+else {
+printf( "    [2] = x%lx  %d\n", (unsigned long) printtri.tri,
+printtri.orient );
+}
+org( *t, printpoint );
+if ( printpoint == (point) NULL ) {
+printf( "    Origin[%d] = NULL\n", ( t->orient + 1 ) % 3 + 3 );
+}
+else{
+printf( "    Origin[%d] = x%lx  (%.12g, %.12g)\n",
+( t->orient + 1 ) % 3 + 3, (unsigned long) printpoint,
+printpoint[0], printpoint[1] );
+}
+dest( *t, printpoint );
+if ( printpoint == (point) NULL ) {
+printf( "    Dest  [%d] = NULL\n", ( t->orient + 2 ) % 3 + 3 );
+}
+else{
+printf( "    Dest  [%d] = x%lx  (%.12g, %.12g)\n",
+( t->orient + 2 ) % 3 + 3, (unsigned long) printpoint,
+printpoint[0], printpoint[1] );
+}
+apex( *t, printpoint );
+if ( printpoint == (point) NULL ) {
+printf( "    Apex  [%d] = NULL\n", t->orient + 3 );
+}
+else{
+printf( "    Apex  [%d] = x%lx  (%.12g, %.12g)\n",
+t->orient + 3, (unsigned long) printpoint,
+printpoint[0], printpoint[1] );
+}
+if ( useshelles ) {
+sdecode( t->tri[6], printsh );
+if ( printsh.sh != dummysh ) {
+printf( "    [6] = x%lx  %d\n", (unsigned long) printsh.sh,
+printsh.shorient );
+}
+sdecode( t->tri[7], printsh );
+if ( printsh.sh != dummysh ) {
+printf( "    [7] = x%lx  %d\n", (unsigned long) printsh.sh,
+printsh.shorient );
+}
+sdecode( t->tri[8], printsh );
+if ( printsh.sh != dummysh ) {
+printf( "    [8] = x%lx  %d\n", (unsigned long) printsh.sh,
+printsh.shorient );
+}
+}
+if ( vararea ) {
+printf( "    Area constraint:  %.4g\n", areabound( *t ));
+}
 }
 
 /*****************************************************************************/
@@ -3109,62 +3245,62 @@ struct triedge *t;
 void printshelle( s )
 struct edge *s;
 {
-       struct edge printsh;
-       struct triedge printtri;
-       point printpoint;
-
-       printf( "shell edge x%lx with orientation %d and mark %d:\n",
-                       (unsigned long) s->sh, s->shorient, mark( *s ) );
-       sdecode( s->sh[0], printsh );
-       if ( printsh.sh == dummysh ) {
-               printf( "    [0] = No shell\n" );
-       }
-       else {
-               printf( "    [0] = x%lx  %d\n", (unsigned long) printsh.sh,
-                               printsh.shorient );
-       }
-       sdecode( s->sh[1], printsh );
-       if ( printsh.sh == dummysh ) {
-               printf( "    [1] = No shell\n" );
-       }
-       else {
-               printf( "    [1] = x%lx  %d\n", (unsigned long) printsh.sh,
-                               printsh.shorient );
-       }
-       sorg( *s, printpoint );
-       if ( printpoint == (point) NULL ) {
-               printf( "    Origin[%d] = NULL\n", 2 + s->shorient );
-       }
-       else{
-               printf( "    Origin[%d] = x%lx  (%.12g, %.12g)\n",
-                               2 + s->shorient, (unsigned long) printpoint,
-                               printpoint[0], printpoint[1] );
-       }
-       sdest( *s, printpoint );
-       if ( printpoint == (point) NULL ) {
-               printf( "    Dest  [%d] = NULL\n", 3 - s->shorient );
-       }
-       else{
-               printf( "    Dest  [%d] = x%lx  (%.12g, %.12g)\n",
-                               3 - s->shorient, (unsigned long) printpoint,
-                               printpoint[0], printpoint[1] );
-       }
-       decode( s->sh[4], printtri );
-       if ( printtri.tri == dummytri ) {
-               printf( "    [4] = Outer space\n" );
-       }
-       else {
-               printf( "    [4] = x%lx  %d\n", (unsigned long) printtri.tri,
-                               printtri.orient );
-       }
-       decode( s->sh[5], printtri );
-       if ( printtri.tri == dummytri ) {
-               printf( "    [5] = Outer space\n" );
-       }
-       else {
-               printf( "    [5] = x%lx  %d\n", (unsigned long) printtri.tri,
-                               printtri.orient );
-       }
+struct edge printsh;
+struct triedge printtri;
+point printpoint;
+
+printf( "shell edge x%lx with orientation %d and mark %d:\n",
+(unsigned long) s->sh, s->shorient, mark( *s ));
+sdecode( s->sh[0], printsh );
+if ( printsh.sh == dummysh ) {
+printf( "    [0] = No shell\n" );
+}
+else {
+printf( "    [0] = x%lx  %d\n", (unsigned long) printsh.sh,
+printsh.shorient );
+}
+sdecode( s->sh[1], printsh );
+if ( printsh.sh == dummysh ) {
+printf( "    [1] = No shell\n" );
+}
+else {
+printf( "    [1] = x%lx  %d\n", (unsigned long) printsh.sh,
+printsh.shorient );
+}
+sorg( *s, printpoint );
+if ( printpoint == (point) NULL ) {
+printf( "    Origin[%d] = NULL\n", 2 + s->shorient );
+}
+else{
+printf( "    Origin[%d] = x%lx  (%.12g, %.12g)\n",
+2 + s->shorient, (unsigned long) printpoint,
+printpoint[0], printpoint[1] );
+}
+sdest( *s, printpoint );
+if ( printpoint == (point) NULL ) {
+printf( "    Dest  [%d] = NULL\n", 3 - s->shorient );
+}
+else{
+printf( "    Dest  [%d] = x%lx  (%.12g, %.12g)\n",
+3 - s->shorient, (unsigned long) printpoint,
+printpoint[0], printpoint[1] );
+}
+decode( s->sh[4], printtri );
+if ( printtri.tri == dummytri ) {
+printf( "    [4] = Outer space\n" );
+}
+else {
+printf( "    [4] = x%lx  %d\n", (unsigned long) printtri.tri,
+printtri.orient );
+}
+decode( s->sh[5], printtri );
+if ( printtri.tri == dummytri ) {
+printf( "    [5] = Outer space\n" );
+}
+else {
+printf( "    [5] = x%lx  %d\n", (unsigned long) printtri.tri,
+printtri.orient );
+}
 }
 
 /**                                                                         **/
@@ -3201,42 +3337,42 @@ int itemcount;
 enum wordtype wtype;
 int alignment;
 {
-       int wordsize;
-
-       /* Initialize values in the pool. */
-       pool->itemwordtype = wtype;
-       wordsize = ( pool->itemwordtype == POINTER ) ? sizeof( VOID * ) : sizeof( REAL );
-       /* Find the proper alignment, which must be at least as large as:   */
-       /*   - The parameter `alignment'.                                   */
-       /*   - The primary word type, to avoid unaligned accesses.          */
-       /*   - sizeof(VOID *), so the stack of dead items can be maintained */
-       /*       without unaligned accesses.                                */
-       if ( alignment > wordsize ) {
-               pool->alignbytes = alignment;
-       }
-       else {
-               pool->alignbytes = wordsize;
-       }
-       if ( sizeof( VOID * ) > pool->alignbytes ) {
-               pool->alignbytes = sizeof( VOID * );
-       }
-       pool->itemwords = ( ( bytecount + pool->alignbytes - 1 ) / pool->alignbytes )
-                                         * ( pool->alignbytes / wordsize );
-       pool->itembytes = pool->itemwords * wordsize;
-       pool->itemsperblock = itemcount;
-
-       /* Allocate a block of items.  Space for `itemsperblock' items and one    */
-       /*   pointer (to point to the next block) are allocated, as well as space */
-       /*   to ensure alignment of the items.                                    */
-       pool->firstblock = (VOID **) malloc( pool->itemsperblock * pool->itembytes
-                                                                                + sizeof( VOID * ) + pool->alignbytes );
-       if ( pool->firstblock == (VOID **) NULL ) {
-               printf( "Error:  Out of memory.\n" );
-               exit( 1 );
-       }
-       /* Set the next block pointer to NULL. */
-       *( pool->firstblock ) = (VOID *) NULL;
-       poolrestart( pool );
+int wordsize;
+
+/* Initialize values in the pool. */
+pool->itemwordtype = wtype;
+wordsize = ( pool->itemwordtype == POINTER ) ? sizeof( VOID * ) : sizeof( REAL );
+/* Find the proper alignment, which must be at least as large as:   */
+/*   - The parameter `alignment'.                                   */
+/*   - The primary word type, to avoid unaligned accesses.          */
+/*   - sizeof(VOID *), so the stack of dead items can be maintained */
+/*       without unaligned accesses.                                */
+if ( alignment > wordsize ) {
+pool->alignbytes = alignment;
+}
+else {
+pool->alignbytes = wordsize;
+}
+if ( sizeof( VOID * ) > pool->alignbytes ) {
+pool->alignbytes = sizeof( VOID * );
+}
+pool->itemwords = (( bytecount + pool->alignbytes - 1 ) / pool->alignbytes )
+* ( pool->alignbytes / wordsize );
+pool->itembytes = pool->itemwords * wordsize;
+pool->itemsperblock = itemcount;
+
+/* Allocate a block of items.  Space for `itemsperblock' items and one    */
+/*   pointer (to point to the next block) are allocated, as well as space */
+/*   to ensure alignment of the items.                                    */
+pool->firstblock = (VOID **) malloc( pool->itemsperblock * pool->itembytes
++ sizeof( VOID * ) + pool->alignbytes );
+if ( pool->firstblock == (VOID **) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+/* Set the next block pointer to NULL. */
+*( pool->firstblock ) = (VOID *) NULL;
+poolrestart( pool );
 }
 
 /*****************************************************************************/
@@ -3252,23 +3388,23 @@ int alignment;
 void poolrestart( pool )
 struct memorypool *pool;
 {
-       unsigned long alignptr;
-
-       pool->items = 0;
-       pool->maxitems = 0;
-
-       /* Set the currently active block. */
-       pool->nowblock = pool->firstblock;
-       /* Find the first item in the pool.  Increment by the size of (VOID *). */
-       alignptr = (unsigned long) ( pool->nowblock + 1 );
-       /* Align the item on an `alignbytes'-byte boundary. */
-       pool->nextitem = (VOID *)
-                                        ( alignptr + (unsigned long) pool->alignbytes
-                                          - ( alignptr % (unsigned long) pool->alignbytes ) );
-       /* There are lots of unallocated items left in this block. */
-       pool->unallocateditems = pool->itemsperblock;
-       /* The stack of deallocated items is empty. */
-       pool->deaditemstack = (VOID *) NULL;
+unsigned long alignptr;
+
+pool->items = 0;
+pool->maxitems = 0;
+
+/* Set the currently active block. */
+pool->nowblock = pool->firstblock;
+/* Find the first item in the pool.  Increment by the size of (VOID *). */
+alignptr = (unsigned long) ( pool->nowblock + 1 );
+/* Align the item on an `alignbytes'-byte boundary. */
+pool->nextitem = (VOID *)
+( alignptr + (unsigned long) pool->alignbytes
+- ( alignptr % (unsigned long) pool->alignbytes ));
+/* There are lots of unallocated items left in this block. */
+pool->unallocateditems = pool->itemsperblock;
+/* The stack of deallocated items is empty. */
+pool->deaditemstack = (VOID *) NULL;
 }
 
 /*****************************************************************************/
@@ -3280,11 +3416,11 @@ struct memorypool *pool;
 void pooldeinit( pool )
 struct memorypool *pool;
 {
-       while ( pool->firstblock != (VOID **) NULL ) {
-               pool->nowblock = (VOID **) *( pool->firstblock );
-               free( pool->firstblock );
-               pool->firstblock = pool->nowblock;
-       }
+while ( pool->firstblock != (VOID **) NULL ) {
+pool->nowblock = (VOID **) *( pool->firstblock );
+free( pool->firstblock );
+pool->firstblock = pool->nowblock;
+}
 }
 
 /*****************************************************************************/
@@ -3296,58 +3432,58 @@ struct memorypool *pool;
 VOID *poolalloc( pool )
 struct memorypool *pool;
 {
-       VOID *newitem;
-       VOID **newblock;
-       unsigned long alignptr;
-
-       /* First check the linked list of dead items.  If the list is not   */
-       /*   empty, allocate an item from the list rather than a fresh one. */
-       if ( pool->deaditemstack != (VOID *) NULL ) {
-               newitem = pool->deaditemstack;           /* Take first item in list. */
-               pool->deaditemstack = *(VOID **) pool->deaditemstack;
-       }
-       else {
-               /* Check if there are any free items left in the current block. */
-               if ( pool->unallocateditems == 0 ) {
-                       /* Check if another block must be allocated. */
-                       if ( *( pool->nowblock ) == (VOID *) NULL ) {
-                               /* Allocate a new block of items, pointed to by the previous block. */
-                               newblock = (VOID **) malloc( pool->itemsperblock * pool->itembytes
-                                                                                        + sizeof( VOID * ) + pool->alignbytes );
-                               if ( newblock == (VOID **) NULL ) {
-                                       printf( "Error:  Out of memory.\n" );
-                                       exit( 1 );
-                               }
-                               *( pool->nowblock ) = (VOID *) newblock;
-                               /* The next block pointer is NULL. */
-                               *newblock = (VOID *) NULL;
-                       }
-                       /* Move to the new block. */
-                       pool->nowblock = (VOID **) *( pool->nowblock );
-                       /* Find the first item in the block.    */
-                       /*   Increment by the size of (VOID *). */
-                       alignptr = (unsigned long) ( pool->nowblock + 1 );
-                       /* Align the item on an `alignbytes'-byte boundary. */
-                       pool->nextitem = (VOID *)
-                                                        ( alignptr + (unsigned long) pool->alignbytes
-                                                          - ( alignptr % (unsigned long) pool->alignbytes ) );
-                       /* There are lots of unallocated items left in this block. */
-                       pool->unallocateditems = pool->itemsperblock;
-               }
-               /* Allocate a new item. */
-               newitem = pool->nextitem;
-               /* Advance `nextitem' pointer to next free item in block. */
-               if ( pool->itemwordtype == POINTER ) {
-                       pool->nextitem = (VOID *) ( (VOID **) pool->nextitem + pool->itemwords );
-               }
-               else {
-                       pool->nextitem = (VOID *) ( (REAL *) pool->nextitem + pool->itemwords );
-               }
-               pool->unallocateditems--;
-               pool->maxitems++;
-       }
-       pool->items++;
-       return newitem;
+VOID *newitem;
+VOID **newblock;
+unsigned long alignptr;
+
+/* First check the linked list of dead items.  If the list is not   */
+/*   empty, allocate an item from the list rather than a fresh one. */
+if ( pool->deaditemstack != (VOID *) NULL ) {
+newitem = pool->deaditemstack;           /* Take first item in list. */
+pool->deaditemstack = *(VOID **) pool->deaditemstack;
+}
+else {
+/* Check if there are any free items left in the current block. */
+if ( pool->unallocateditems == 0 ) {
+/* Check if another block must be allocated. */
+if ( *( pool->nowblock ) == (VOID *) NULL ) {
+/* Allocate a new block of items, pointed to by the previous block. */
+newblock = (VOID **) malloc( pool->itemsperblock * pool->itembytes
++ sizeof( VOID * ) + pool->alignbytes );
+if ( newblock == (VOID **) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+*( pool->nowblock ) = (VOID *) newblock;
+/* The next block pointer is NULL. */
+*newblock = (VOID *) NULL;
+}
+/* Move to the new block. */
+pool->nowblock = (VOID **) *( pool->nowblock );
+/* Find the first item in the block.    */
+/*   Increment by the size of (VOID *). */
+alignptr = (unsigned long) ( pool->nowblock + 1 );
+/* Align the item on an `alignbytes'-byte boundary. */
+pool->nextitem = (VOID *)
+( alignptr + (unsigned long) pool->alignbytes
+- ( alignptr % (unsigned long) pool->alignbytes ));
+/* There are lots of unallocated items left in this block. */
+pool->unallocateditems = pool->itemsperblock;
+}
+/* Allocate a new item. */
+newitem = pool->nextitem;
+/* Advance `nextitem' pointer to next free item in block. */
+if ( pool->itemwordtype == POINTER ) {
+pool->nextitem = (VOID *) ((VOID **) pool->nextitem + pool->itemwords );
+}
+else {
+pool->nextitem = (VOID *) ((REAL *) pool->nextitem + pool->itemwords );
+}
+pool->unallocateditems--;
+pool->maxitems++;
+}
+pool->items++;
+return newitem;
 }
 
 /*****************************************************************************/
@@ -3362,10 +3498,10 @@ void pooldealloc( pool, dyingitem )
 struct memorypool *pool;
 VOID *dyingitem;
 {
-       /* Push freshly killed item onto stack. */
-       *( (VOID **) dyingitem ) = pool->deaditemstack;
-       pool->deaditemstack = dyingitem;
-       pool->items--;
+/* Push freshly killed item onto stack. */
+*((VOID **) dyingitem ) = pool->deaditemstack;
+pool->deaditemstack = dyingitem;
+pool->items--;
 }
 
 /*****************************************************************************/
@@ -3379,18 +3515,18 @@ VOID *dyingitem;
 void traversalinit( pool )
 struct memorypool *pool;
 {
-       unsigned long alignptr;
-
-       /* Begin the traversal in the first block. */
-       pool->pathblock = pool->firstblock;
-       /* Find the first item in the block.  Increment by the size of (VOID *). */
-       alignptr = (unsigned long) ( pool->pathblock + 1 );
-       /* Align with item on an `alignbytes'-byte boundary. */
-       pool->pathitem = (VOID *)
-                                        ( alignptr + (unsigned long) pool->alignbytes
-                                          - ( alignptr % (unsigned long) pool->alignbytes ) );
-       /* Set the number of items left in the current block. */
-       pool->pathitemsleft = pool->itemsperblock;
+unsigned long alignptr;
+
+/* Begin the traversal in the first block. */
+pool->pathblock = pool->firstblock;
+/* Find the first item in the block.  Increment by the size of (VOID *). */
+alignptr = (unsigned long) ( pool->pathblock + 1 );
+/* Align with item on an `alignbytes'-byte boundary. */
+pool->pathitem = (VOID *)
+( alignptr + (unsigned long) pool->alignbytes
+- ( alignptr % (unsigned long) pool->alignbytes ));
+/* Set the number of items left in the current block. */
+pool->pathitemsleft = pool->itemsperblock;
 }
 
 /*****************************************************************************/
@@ -3410,36 +3546,36 @@ struct memorypool *pool;
 VOID *traverse( pool )
 struct memorypool *pool;
 {
-       VOID *newitem;
-       unsigned long alignptr;
-
-       /* Stop upon exhausting the list of items. */
-       if ( pool->pathitem == pool->nextitem ) {
-               return (VOID *) NULL;
-       }
-       /* Check whether any untraversed items remain in the current block. */
-       if ( pool->pathitemsleft == 0 ) {
-               /* Find the next block. */
-               pool->pathblock = (VOID **) *( pool->pathblock );
-               /* Find the first item in the block.  Increment by the size of (VOID *). */
-               alignptr = (unsigned long) ( pool->pathblock + 1 );
-               /* Align with item on an `alignbytes'-byte boundary. */
-               pool->pathitem = (VOID *)
-                                                ( alignptr + (unsigned long) pool->alignbytes
-                                                  - ( alignptr % (unsigned long) pool->alignbytes ) );
-               /* Set the number of items left in the current block. */
-               pool->pathitemsleft = pool->itemsperblock;
-       }
-       newitem = pool->pathitem;
-       /* Find the next item in the block. */
-       if ( pool->itemwordtype == POINTER ) {
-               pool->pathitem = (VOID *) ( (VOID **) pool->pathitem + pool->itemwords );
-       }
-       else {
-               pool->pathitem = (VOID *) ( (REAL *) pool->pathitem + pool->itemwords );
-       }
-       pool->pathitemsleft--;
-       return newitem;
+VOID *newitem;
+unsigned long alignptr;
+
+/* Stop upon exhausting the list of items. */
+if ( pool->pathitem == pool->nextitem ) {
+return (VOID *) NULL;
+}
+/* Check whether any untraversed items remain in the current block. */
+if ( pool->pathitemsleft == 0 ) {
+/* Find the next block. */
+pool->pathblock = (VOID **) *( pool->pathblock );
+/* Find the first item in the block.  Increment by the size of (VOID *). */
+alignptr = (unsigned long) ( pool->pathblock + 1 );
+/* Align with item on an `alignbytes'-byte boundary. */
+pool->pathitem = (VOID *)
+( alignptr + (unsigned long) pool->alignbytes
+- ( alignptr % (unsigned long) pool->alignbytes ));
+/* Set the number of items left in the current block. */
+pool->pathitemsleft = pool->itemsperblock;
+}
+newitem = pool->pathitem;
+/* Find the next item in the block. */
+if ( pool->itemwordtype == POINTER ) {
+pool->pathitem = (VOID *) ((VOID **) pool->pathitem + pool->itemwords );
+}
+else {
+pool->pathitem = (VOID *) ((REAL *) pool->pathitem + pool->itemwords );
+}
+pool->pathitemsleft--;
+return newitem;
 }
 
 /*****************************************************************************/
@@ -3463,73 +3599,73 @@ void dummyinit( trianglewords, shellewords )
 int trianglewords;
 int shellewords;
 {
-       unsigned long alignptr;
-
-       /* `triwords' and `shwords' are used by the mesh manipulation primitives */
-       /*   to extract orientations of triangles and shell edges from pointers. */
-       triwords = trianglewords;     /* Initialize `triwords' once and for all. */
-       shwords = shellewords;         /* Initialize `shwords' once and for all. */
-
-       /* Set up `dummytri', the `triangle' that occupies "outer space". */
-       dummytribase = (triangle *) malloc( triwords * sizeof( triangle )
-                                                                               + triangles.alignbytes );
-       if ( dummytribase == (triangle *) NULL ) {
-               printf( "Error:  Out of memory.\n" );
-               exit( 1 );
-       }
-       /* Align `dummytri' on a `triangles.alignbytes'-byte boundary. */
-       alignptr = (unsigned long) dummytribase;
-       dummytri = (triangle *)
-                          ( alignptr + (unsigned long) triangles.alignbytes
-                                - ( alignptr % (unsigned long) triangles.alignbytes ) );
-       /* Initialize the three adjoining triangles to be "outer space".  These  */
-       /*   will eventually be changed by various bonding operations, but their */
-       /*   values don't really matter, as long as they can legally be          */
-       /*   dereferenced.                                                       */
-       dummytri[0] = (triangle) dummytri;
-       dummytri[1] = (triangle) dummytri;
-       dummytri[2] = (triangle) dummytri;
-       /* Three NULL vertex points. */
-       dummytri[3] = (triangle) NULL;
-       dummytri[4] = (triangle) NULL;
-       dummytri[5] = (triangle) NULL;
-
-       if ( useshelles ) {
-               /* Set up `dummysh', the omnipresent "shell edge" pointed to by any      */
-               /*   triangle side or shell edge end that isn't attached to a real shell */
-               /*   edge.                                                               */
-               dummyshbase = (shelle *) malloc( shwords * sizeof( shelle )
-                                                                                + shelles.alignbytes );
-               if ( dummyshbase == (shelle *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-               /* Align `dummysh' on a `shelles.alignbytes'-byte boundary. */
-               alignptr = (unsigned long) dummyshbase;
-               dummysh = (shelle *)
-                                 ( alignptr + (unsigned long) shelles.alignbytes
-                                       - ( alignptr % (unsigned long) shelles.alignbytes ) );
-               /* Initialize the two adjoining shell edges to be the omnipresent shell */
-               /*   edge.  These will eventually be changed by various bonding         */
-               /*   operations, but their values don't really matter, as long as they  */
-               /*   can legally be dereferenced.                                       */
-               dummysh[0] = (shelle) dummysh;
-               dummysh[1] = (shelle) dummysh;
-               /* Two NULL vertex points. */
-               dummysh[2] = (shelle) NULL;
-               dummysh[3] = (shelle) NULL;
-               /* Initialize the two adjoining triangles to be "outer space". */
-               dummysh[4] = (shelle) dummytri;
-               dummysh[5] = (shelle) dummytri;
-               /* Set the boundary marker to zero. */
-               *(int *) ( dummysh + 6 ) = 0;
-
-               /* Initialize the three adjoining shell edges of `dummytri' to be */
-               /*   the omnipresent shell edge.                                  */
-               dummytri[6] = (triangle) dummysh;
-               dummytri[7] = (triangle) dummysh;
-               dummytri[8] = (triangle) dummysh;
-       }
+unsigned long alignptr;
+
+/* `triwords' and `shwords' are used by the mesh manipulation primitives */
+/*   to extract orientations of triangles and shell edges from pointers. */
+triwords = trianglewords;     /* Initialize `triwords' once and for all. */
+shwords = shellewords;         /* Initialize `shwords' once and for all. */
+
+/* Set up `dummytri', the `triangle' that occupies "outer space". */
+dummytribase = (triangle *) malloc( triwords * sizeof( triangle )
++ triangles.alignbytes );
+if ( dummytribase == (triangle *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+/* Align `dummytri' on a `triangles.alignbytes'-byte boundary. */
+alignptr = (unsigned long) dummytribase;
+dummytri = (triangle *)
+( alignptr + (unsigned long) triangles.alignbytes
+- ( alignptr % (unsigned long) triangles.alignbytes ));
+/* Initialize the three adjoining triangles to be "outer space".  These  */
+/*   will eventually be changed by various bonding operations, but their */
+/*   values don't really matter, as long as they can legally be          */
+/*   dereferenced.                                                       */
+dummytri[0] = (triangle) dummytri;
+dummytri[1] = (triangle) dummytri;
+dummytri[2] = (triangle) dummytri;
+/* Three NULL vertex points. */
+dummytri[3] = (triangle) NULL;
+dummytri[4] = (triangle) NULL;
+dummytri[5] = (triangle) NULL;
+
+if ( useshelles ) {
+/* Set up `dummysh', the omnipresent "shell edge" pointed to by any      */
+/*   triangle side or shell edge end that isn't attached to a real shell */
+/*   edge.                                                               */
+dummyshbase = (shelle *) malloc( shwords * sizeof( shelle )
++ shelles.alignbytes );
+if ( dummyshbase == (shelle *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+/* Align `dummysh' on a `shelles.alignbytes'-byte boundary. */
+alignptr = (unsigned long) dummyshbase;
+dummysh = (shelle *)
+( alignptr + (unsigned long) shelles.alignbytes
+- ( alignptr % (unsigned long) shelles.alignbytes ));
+/* Initialize the two adjoining shell edges to be the omnipresent shell */
+/*   edge.  These will eventually be changed by various bonding         */
+/*   operations, but their values don't really matter, as long as they  */
+/*   can legally be dereferenced.                                       */
+dummysh[0] = (shelle) dummysh;
+dummysh[1] = (shelle) dummysh;
+/* Two NULL vertex points. */
+dummysh[2] = (shelle) NULL;
+dummysh[3] = (shelle) NULL;
+/* Initialize the two adjoining triangles to be "outer space". */
+dummysh[4] = (shelle) dummytri;
+dummysh[5] = (shelle) dummytri;
+/* Set the boundary marker to zero. */
+*(int *) ( dummysh + 6 ) = 0;
+
+/* Initialize the three adjoining shell edges of `dummytri' to be */
+/*   the omnipresent shell edge.                                  */
+dummytri[6] = (triangle) dummysh;
+dummytri[7] = (triangle) dummysh;
+dummytri[8] = (triangle) dummysh;
+}
 }
 
 /*****************************************************************************/
@@ -3543,22 +3679,22 @@ int shellewords;
 /*****************************************************************************/
 
 void initializepointpool(){
-       int pointsize;
-
-       /* The index within each point at which the boundary marker is found.  */
-       /*   Ensure the point marker is aligned to a sizeof(int)-byte address. */
-       pointmarkindex = ( ( mesh_dim + nextras ) * sizeof( REAL ) + sizeof( int ) - 1 )
-                                        / sizeof( int );
-       pointsize = ( pointmarkindex + 1 ) * sizeof( int );
-       if ( poly ) {
-               /* The index within each point at which a triangle pointer is found.   */
-               /*   Ensure the pointer is aligned to a sizeof(triangle)-byte address. */
-               point2triindex = ( pointsize + sizeof( triangle ) - 1 ) / sizeof( triangle );
-               pointsize = ( point2triindex + 1 ) * sizeof( triangle );
-       }
-       /* Initialize the pool of points. */
-       poolinit( &points, pointsize, POINTPERBLOCK,
-                         ( sizeof( REAL ) >= sizeof( triangle ) ) ? FLOATINGPOINT : POINTER, 0 );
+int pointsize;
+
+/* The index within each point at which the boundary marker is found.  */
+/*   Ensure the point marker is aligned to a sizeof(int)-byte address. */
+pointmarkindex = (( mesh_dim + nextras ) * sizeof( REAL ) + sizeof( int ) - 1 )
+/ sizeof( int );
+pointsize = ( pointmarkindex + 1 ) * sizeof( int );
+if ( poly ) {
+/* The index within each point at which a triangle pointer is found.   */
+/*   Ensure the pointer is aligned to a sizeof(triangle)-byte address. */
+point2triindex = ( pointsize + sizeof( triangle ) - 1 ) / sizeof( triangle );
+pointsize = ( point2triindex + 1 ) * sizeof( triangle );
+}
+/* Initialize the pool of points. */
+poolinit( &points, pointsize, POINTPERBLOCK,
+( sizeof( REAL ) >= sizeof( triangle )) ? FLOATINGPOINT : POINTER, 0 );
 }
 
 /*****************************************************************************/
@@ -3573,54 +3709,54 @@ void initializepointpool(){
 /*****************************************************************************/
 
 void initializetrisegpools(){
-       int trisize;
-
-       /* The index within each triangle at which the extra nodes (above three)  */
-       /*   associated with high order elements are found.  There are three      */
-       /*   pointers to other triangles, three pointers to corners, and possibly */
-       /*   three pointers to shell edges before the extra nodes.                */
-       highorderindex = 6 + ( useshelles * 3 );
-       /* The number of bytes occupied by a triangle. */
-       trisize = ( ( order + 1 ) * ( order + 2 ) / 2 + ( highorderindex - 3 ) ) *
-                         sizeof( triangle );
-       /* The index within each triangle at which its attributes are found, */
-       /*   where the index is measured in REALs.                           */
-       elemattribindex = ( trisize + sizeof( REAL ) - 1 ) / sizeof( REAL );
-       /* The index within each triangle at which the maximum area constraint  */
-       /*   is found, where the index is measured in REALs.  Note that if the  */
-       /*   `regionattrib' flag is set, an additional attribute will be added. */
-       areaboundindex = elemattribindex + eextras + regionattrib;
-       /* If triangle attributes or an area bound are needed, increase the number */
-       /*   of bytes occupied by a triangle.                                      */
-       if ( vararea ) {
-               trisize = ( areaboundindex + 1 ) * sizeof( REAL );
-       }
-       else if ( eextras + regionattrib > 0 ) {
-               trisize = areaboundindex * sizeof( REAL );
-       }
-       /* If a Voronoi diagram or triangle neighbor graph is requested, make    */
-       /*   sure there's room to store an integer index in each triangle.  This */
-       /*   integer index can occupy the same space as the shell edges or       */
-       /*   attributes or area constraint or extra nodes.                       */
-       if ( ( voronoi || neighbors ) &&
-                ( trisize < 6 * sizeof( triangle ) + sizeof( int ) ) ) {
-               trisize = 6 * sizeof( triangle ) + sizeof( int );
-       }
-       /* Having determined the memory size of a triangle, initialize the pool. */
-       poolinit( &triangles, trisize, TRIPERBLOCK, POINTER, 4 );
-
-       if ( useshelles ) {
-               /* Initialize the pool of shell edges. */
-               poolinit( &shelles, 6 * sizeof( triangle ) + sizeof( int ), SHELLEPERBLOCK,
-                                 POINTER, 4 );
-
-               /* Initialize the "outer space" triangle and omnipresent shell edge. */
-               dummyinit( triangles.itemwords, shelles.itemwords );
-       }
-       else {
-               /* Initialize the "outer space" triangle. */
-               dummyinit( triangles.itemwords, 0 );
-       }
+int trisize;
+
+/* The index within each triangle at which the extra nodes (above three)  */
+/*   associated with high order elements are found.  There are three      */
+/*   pointers to other triangles, three pointers to corners, and possibly */
+/*   three pointers to shell edges before the extra nodes.                */
+highorderindex = 6 + ( useshelles * 3 );
+/* The number of bytes occupied by a triangle. */
+trisize = (( order + 1 ) * ( order + 2 ) / 2 + ( highorderindex - 3 )) *
+sizeof( triangle );
+/* The index within each triangle at which its attributes are found, */
+/*   where the index is measured in REALs.                           */
+elemattribindex = ( trisize + sizeof( REAL ) - 1 ) / sizeof( REAL );
+/* The index within each triangle at which the maximum area constraint  */
+/*   is found, where the index is measured in REALs.  Note that if the  */
+/*   `regionattrib' flag is set, an additional attribute will be added. */
+areaboundindex = elemattribindex + eextras + regionattrib;
+/* If triangle attributes or an area bound are needed, increase the number */
+/*   of bytes occupied by a triangle.                                      */
+if ( vararea ) {
+trisize = ( areaboundindex + 1 ) * sizeof( REAL );
+}
+else if ( eextras + regionattrib > 0 ) {
+trisize = areaboundindex * sizeof( REAL );
+}
+/* If a Voronoi diagram or triangle neighbor graph is requested, make    */
+/*   sure there's room to store an integer index in each triangle.  This */
+/*   integer index can occupy the same space as the shell edges or       */
+/*   attributes or area constraint or extra nodes.                       */
+if (( voronoi || neighbors ) &&
+( trisize < 6 * sizeof( triangle ) + sizeof( int ))) {
+trisize = 6 * sizeof( triangle ) + sizeof( int );
+}
+/* Having determined the memory size of a triangle, initialize the pool. */
+poolinit( &triangles, trisize, TRIPERBLOCK, POINTER, 4 );
+
+if ( useshelles ) {
+/* Initialize the pool of shell edges. */
+poolinit( &shelles, 6 * sizeof( triangle ) + sizeof( int ), SHELLEPERBLOCK,
+POINTER, 4 );
+
+/* Initialize the "outer space" triangle and omnipresent shell edge. */
+dummyinit( triangles.itemwords, shelles.itemwords );
+}
+else {
+/* Initialize the "outer space" triangle. */
+dummyinit( triangles.itemwords, 0 );
+}
 }
 
 /*****************************************************************************/
@@ -3632,12 +3768,12 @@ void initializetrisegpools(){
 void triangledealloc( dyingtriangle )
 triangle * dyingtriangle;
 {
-       /* Set triangle's vertices to NULL.  This makes it possible to        */
-       /*   detect dead triangles when traversing the list of all triangles. */
-       dyingtriangle[3] = (triangle) NULL;
-       dyingtriangle[4] = (triangle) NULL;
-       dyingtriangle[5] = (triangle) NULL;
-       pooldealloc( &triangles, (VOID *) dyingtriangle );
+/* Set triangle's vertices to NULL.  This makes it possible to        */
+/*   detect dead triangles when traversing the list of all triangles. */
+dyingtriangle[3] = (triangle) NULL;
+dyingtriangle[4] = (triangle) NULL;
+dyingtriangle[5] = (triangle) NULL;
+pooldealloc( &triangles, (VOID *) dyingtriangle );
 }
 
 /*****************************************************************************/
@@ -3647,15 +3783,15 @@ triangle * dyingtriangle;
 /*****************************************************************************/
 
 triangle *triangletraverse(){
-       triangle *newtriangle;
+triangle *newtriangle;
 
-       do {
-               newtriangle = (triangle *) traverse( &triangles );
-               if ( newtriangle == (triangle *) NULL ) {
-                       return (triangle *) NULL;
-               }
-       } while ( newtriangle[3] == (triangle) NULL );        /* Skip dead ones. */
-       return newtriangle;
+do {
+newtriangle = (triangle *) traverse( &triangles );
+if ( newtriangle == (triangle *) NULL ) {
+return (triangle *) NULL;
+}
+} while ( newtriangle[3] == (triangle) NULL );        /* Skip dead ones. */
+return newtriangle;
 }
 
 /*****************************************************************************/
@@ -3667,11 +3803,11 @@ triangle *triangletraverse(){
 void shelledealloc( dyingshelle )
 shelle * dyingshelle;
 {
-       /* Set shell edge's vertices to NULL.  This makes it possible to */
-       /*   detect dead shells when traversing the list of all shells.  */
-       dyingshelle[2] = (shelle) NULL;
-       dyingshelle[3] = (shelle) NULL;
-       pooldealloc( &shelles, (VOID *) dyingshelle );
+/* Set shell edge's vertices to NULL.  This makes it possible to */
+/*   detect dead shells when traversing the list of all shells.  */
+dyingshelle[2] = (shelle) NULL;
+dyingshelle[3] = (shelle) NULL;
+pooldealloc( &shelles, (VOID *) dyingshelle );
 }
 
 /*****************************************************************************/
@@ -3681,15 +3817,15 @@ shelle * dyingshelle;
 /*****************************************************************************/
 
 shelle *shelletraverse(){
-       shelle *newshelle;
+shelle *newshelle;
 
-       do {
-               newshelle = (shelle *) traverse( &shelles );
-               if ( newshelle == (shelle *) NULL ) {
-                       return (shelle *) NULL;
-               }
-       } while ( newshelle[2] == (shelle) NULL );            /* Skip dead ones. */
-       return newshelle;
+do {
+newshelle = (shelle *) traverse( &shelles );
+if ( newshelle == (shelle *) NULL ) {
+return (shelle *) NULL;
+}
+} while ( newshelle[2] == (shelle) NULL );            /* Skip dead ones. */
+return newshelle;
 }
 
 /*****************************************************************************/
@@ -3701,10 +3837,10 @@ shelle *shelletraverse(){
 void pointdealloc( dyingpoint )
 point dyingpoint;
 {
-       /* Mark the point as dead.  This makes it possible to detect dead points */
-       /*   when traversing the list of all points.                             */
-       setpointmark( dyingpoint, DEADPOINT );
-       pooldealloc( &points, (VOID *) dyingpoint );
+/* Mark the point as dead.  This makes it possible to detect dead points */
+/*   when traversing the list of all points.                             */
+setpointmark( dyingpoint, DEADPOINT );
+pooldealloc( &points, (VOID *) dyingpoint );
 }
 
 /*****************************************************************************/
@@ -3714,15 +3850,15 @@ point dyingpoint;
 /*****************************************************************************/
 
 point pointtraverse(){
-       point newpoint;
+point newpoint;
 
-       do {
-               newpoint = (point) traverse( &points );
-               if ( newpoint == (point) NULL ) {
-                       return (point) NULL;
-               }
-       } while ( pointmark( newpoint ) == DEADPOINT );       /* Skip dead ones. */
-       return newpoint;
+do {
+newpoint = (point) traverse( &points );
+if ( newpoint == (point) NULL ) {
+return (point) NULL;
+}
+} while ( pointmark( newpoint ) == DEADPOINT );       /* Skip dead ones. */
+return newpoint;
 }
 
 /*****************************************************************************/
@@ -3732,15 +3868,16 @@ point pointtraverse(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void badsegmentdealloc( dyingseg )
 struct edge *dyingseg;
 {
-       /* Set segment's orientation to -1.  This makes it possible to      */
-       /*   detect dead segments when traversing the list of all segments. */
-       dyingseg->shorient = -1;
-       pooldealloc( &badsegments, (VOID *) dyingseg );
+/* Set segment's orientation to -1.  This makes it possible to      */
+/*   detect dead segments when traversing the list of all segments. */
+dyingseg->shorient = -1;
+pooldealloc( &badsegments, (VOID *) dyingseg );
 }
 
 #endif /* not CDT_ONLY */
@@ -3751,18 +3888,19 @@ struct edge *dyingseg;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 struct edge *badsegmenttraverse(){
-       struct edge *newseg;
+struct edge *newseg;
 
-       do {
-               newseg = (struct edge *) traverse( &badsegments );
-               if ( newseg == (struct edge *) NULL ) {
-                       return (struct edge *) NULL;
-               }
-       } while ( newseg->shorient == -1 );                   /* Skip dead ones. */
-       return newseg;
+do {
+newseg = (struct edge *) traverse( &badsegments );
+if ( newseg == (struct edge *) NULL ) {
+return (struct edge *) NULL;
+}
+} while ( newseg->shorient == -1 );                   /* Skip dead ones. */
+return newseg;
 }
 
 #endif /* not CDT_ONLY */
@@ -3782,27 +3920,27 @@ struct edge *badsegmenttraverse(){
 point getpoint( number )
 int number;
 {
-       VOID **getblock;
-       point foundpoint;
-       unsigned long alignptr;
-       int current;
-
-       getblock = points.firstblock;
-       current = firstnumber;
-       /* Find the right block. */
-       while ( current + points.itemsperblock <= number ) {
-               getblock = (VOID **) *getblock;
-               current += points.itemsperblock;
-       }
-       /* Now find the right point. */
-       alignptr = (unsigned long) ( getblock + 1 );
-       foundpoint = (point) ( alignptr + (unsigned long) points.alignbytes
-                                                  - ( alignptr % (unsigned long) points.alignbytes ) );
-       while ( current < number ) {
-               foundpoint += points.itemwords;
-               current++;
-       }
-       return foundpoint;
+VOID **getblock;
+point foundpoint;
+unsigned long alignptr;
+int current;
+
+getblock = points.firstblock;
+current = firstnumber;
+/* Find the right block. */
+while ( current + points.itemsperblock <= number ) {
+getblock = (VOID **) *getblock;
+current += points.itemsperblock;
+}
+/* Now find the right point. */
+alignptr = (unsigned long) ( getblock + 1 );
+foundpoint = (point) ( alignptr + (unsigned long) points.alignbytes
+- ( alignptr % (unsigned long) points.alignbytes ));
+while ( current < number ) {
+foundpoint += points.itemwords;
+current++;
+}
+return foundpoint;
 }
 
 /*****************************************************************************/
@@ -3812,20 +3950,21 @@ int number;
 /*****************************************************************************/
 
 void triangledeinit(){
-       pooldeinit( &triangles );
-       free( dummytribase );
-       if ( useshelles ) {
-               pooldeinit( &shelles );
-               free( dummyshbase );
-       }
-       pooldeinit( &points );
-#ifndef CDT_ONLY
-       if ( quality ) {
-               pooldeinit( &badsegments );
-               if ( ( minangle > 0.0 ) || vararea || fixedarea ) {
-                       pooldeinit( &badtriangles );
-               }
-       }
+pooldeinit( &triangles );
+free( dummytribase );
+if ( useshelles ) {
+pooldeinit( &shelles );
+free( dummyshbase );
+}
+pooldeinit( &points );
+#ifndef
+CDT_ONLY
+if ( quality ) {
+pooldeinit( &badsegments );
+if (( minangle > 0.0 ) || vararea || fixedarea ) {
+pooldeinit( &badtriangles );
+}
+}
 #endif /* not CDT_ONLY */
 }
 
@@ -3846,32 +3985,32 @@ void triangledeinit(){
 void maketriangle( newtriedge )
 struct triedge *newtriedge;
 {
-       int i;
-
-       newtriedge->tri = (triangle *) poolalloc( &triangles );
-       /* Initialize the three adjoining triangles to be "outer space". */
-       newtriedge->tri[0] = (triangle) dummytri;
-       newtriedge->tri[1] = (triangle) dummytri;
-       newtriedge->tri[2] = (triangle) dummytri;
-       /* Three NULL vertex points. */
-       newtriedge->tri[3] = (triangle) NULL;
-       newtriedge->tri[4] = (triangle) NULL;
-       newtriedge->tri[5] = (triangle) NULL;
-       /* Initialize the three adjoining shell edges to be the omnipresent */
-       /*   shell edge.                                                    */
-       if ( useshelles ) {
-               newtriedge->tri[6] = (triangle) dummysh;
-               newtriedge->tri[7] = (triangle) dummysh;
-               newtriedge->tri[8] = (triangle) dummysh;
-       }
-       for ( i = 0; i < eextras; i++ ) {
-               setelemattribute( *newtriedge, i, 0.0 );
-       }
-       if ( vararea ) {
-               setareabound( *newtriedge, -1.0 );
-       }
-
-       newtriedge->orient = 0;
+int i;
+
+newtriedge->tri = (triangle *) poolalloc( &triangles );
+/* Initialize the three adjoining triangles to be "outer space". */
+newtriedge->tri[0] = (triangle) dummytri;
+newtriedge->tri[1] = (triangle) dummytri;
+newtriedge->tri[2] = (triangle) dummytri;
+/* Three NULL vertex points. */
+newtriedge->tri[3] = (triangle) NULL;
+newtriedge->tri[4] = (triangle) NULL;
+newtriedge->tri[5] = (triangle) NULL;
+/* Initialize the three adjoining shell edges to be the omnipresent */
+/*   shell edge.                                                    */
+if ( useshelles ) {
+newtriedge->tri[6] = (triangle) dummysh;
+newtriedge->tri[7] = (triangle) dummysh;
+newtriedge->tri[8] = (triangle) dummysh;
+}
+for ( i = 0; i < eextras; i++ ) {
+setelemattribute( *newtriedge, i, 0.0 );
+}
+if ( vararea ) {
+setareabound( *newtriedge, -1.0 );
+}
+
+newtriedge->orient = 0;
 }
 
 /*****************************************************************************/
@@ -3883,21 +4022,21 @@ struct triedge *newtriedge;
 void makeshelle( newedge )
 struct edge *newedge;
 {
-       newedge->sh = (shelle *) poolalloc( &shelles );
-       /* Initialize the two adjoining shell edges to be the omnipresent */
-       /*   shell edge.                                                  */
-       newedge->sh[0] = (shelle) dummysh;
-       newedge->sh[1] = (shelle) dummysh;
-       /* Two NULL vertex points. */
-       newedge->sh[2] = (shelle) NULL;
-       newedge->sh[3] = (shelle) NULL;
-       /* Initialize the two adjoining triangles to be "outer space". */
-       newedge->sh[4] = (shelle) dummytri;
-       newedge->sh[5] = (shelle) dummytri;
-       /* Set the boundary marker to zero. */
-       setmark( *newedge, 0 );
-
-       newedge->shorient = 0;
+newedge->sh = (shelle *) poolalloc( &shelles );
+/* Initialize the two adjoining shell edges to be the omnipresent */
+/*   shell edge.                                                  */
+newedge->sh[0] = (shelle) dummysh;
+newedge->sh[1] = (shelle) dummysh;
+/* Two NULL vertex points. */
+newedge->sh[2] = (shelle) NULL;
+newedge->sh[3] = (shelle) NULL;
+/* Initialize the two adjoining triangles to be "outer space". */
+newedge->sh[4] = (shelle) dummytri;
+newedge->sh[5] = (shelle) dummytri;
+/* Set the boundary marker to zero. */
+setmark( *newedge, 0 );
+
+newedge->shorient = 0;
 }
 
 /**                                                                         **/
@@ -3918,7 +4057,8 @@ struct edge *newedge;
 /*   which is disastrously slow.  A faster way on IEEE machines might be to  */
 /*   mask the appropriate bit, but that's difficult to do in C.              */
 
-#define Absolute( a )  ( ( a ) >= 0.0 ? ( a ) : -( a ) )
+#define
+Absolute( a )  (( a ) >= 0.0 ? ( a ) : -( a ))
 /* #define Absolute(a)  fabs(a) */
 
 /* Many of the operations are broken up into two pieces, a main part that    */
@@ -3934,95 +4074,111 @@ struct edge *newedge;
 /*   The input parameter `x' (or the highest numbered `x_' parameter) must   */
 /*   also be declared `INEXACT'.                                             */
 
-#define Fast_Two_Sum_Tail( a, b, x, y )        \
-       bvirt = x - a; \
-       y = b - bvirt
-
-#define Fast_Two_Sum( a, b, x, y ) \
-       x = (REAL) ( a + b ); \
-       Fast_Two_Sum_Tail( a, b, x, y )
-
-#define Two_Sum_Tail( a, b, x, y ) \
-       bvirt = (REAL) ( x - a ); \
-       avirt = x - bvirt; \
-       bround = b - bvirt;     \
-       around = a - avirt;     \
-       y = around + bround
-
-#define Two_Sum( a, b, x, y ) \
-       x = (REAL) ( a + b ); \
-       Two_Sum_Tail( a, b, x, y )
-
-#define Two_Diff_Tail( a, b, x, y )    \
-       bvirt = (REAL) ( a - x ); \
-       avirt = x + bvirt; \
-       bround = bvirt - b;     \
-       around = a - avirt;     \
-       y = around + bround
-
-#define Two_Diff( a, b, x, y ) \
-       x = (REAL) ( a - b ); \
-       Two_Diff_Tail( a, b, x, y )
-
-#define Split( a, ahi, alo ) \
-       c = (REAL) ( splitter * a ); \
-       abig = (REAL) ( c - a ); \
-       ahi = (REAL)( c - abig ); \
-       alo = (REAL)( a - ahi )
-
-#define Two_Product_Tail( a, b, x, y ) \
-       Split( a, ahi, alo ); \
-       Split( b, bhi, blo ); \
-       err1 = x - ( ahi * bhi ); \
-       err2 = err1 - ( alo * bhi ); \
-       err3 = err2 - ( ahi * blo ); \
-       y = ( alo * blo ) - err3
-
-#define Two_Product( a, b, x, y ) \
-       x = (REAL) ( a * b ); \
-       Two_Product_Tail( a, b, x, y )
+#define
+Fast_Two_Sum_Tail( a, b, x, y )    \
+    bvirt = x - a; \
+    y = b - bvirt
+
+#define
+Fast_Two_Sum( a, b, x, y ) \
+    x = (REAL) ( a + b ); \
+    Fast_Two_Sum_Tail( a, b, x, y )
+
+#define
+Two_Sum_Tail( a, b, x, y ) \
+    bvirt = (REAL) ( x - a ); \
+    avirt = x - bvirt; \
+    bround = b - bvirt;    \
+    around = a - avirt;    \
+    y = around + bround
+
+#define
+Two_Sum( a, b, x, y ) \
+    x = (REAL) ( a + b ); \
+    Two_Sum_Tail( a, b, x, y )
+
+#define
+Two_Diff_Tail( a, b, x, y )    \
+    bvirt = (REAL) ( a - x ); \
+    avirt = x + bvirt; \
+    bround = bvirt - b;    \
+    around = a - avirt;    \
+    y = around + bround
+
+#define
+Two_Diff( a, b, x, y ) \
+    x = (REAL) ( a - b ); \
+    Two_Diff_Tail( a, b, x, y )
+
+#define
+Split( a, ahi, alo ) \
+    c = (REAL) ( splitter * a ); \
+    abig = (REAL) ( c - a ); \
+    ahi = (REAL)( c - abig ); \
+    alo = (REAL)( a - ahi )
+
+#define
+Two_Product_Tail( a, b, x, y ) \
+    Split( a, ahi, alo ); \
+    Split( b, bhi, blo ); \
+    err1 = x - ( ahi * bhi ); \
+    err2 = err1 - ( alo * bhi ); \
+    err3 = err2 - ( ahi * blo ); \
+    y = ( alo * blo ) - err3
+
+#define
+Two_Product( a, b, x, y ) \
+    x = (REAL) ( a * b ); \
+    Two_Product_Tail( a, b, x, y )
 
 /* Two_Product_Presplit() is Two_Product() where one of the inputs has       */
 /*   already been split.  Avoids redundant splitting.                        */
 
-#define Two_Product_Presplit( a, b, bhi, blo, x, y ) \
-       x = (REAL) ( a * b ); \
-       Split( a, ahi, alo ); \
-       err1 = x - ( ahi * bhi ); \
-       err2 = err1 - ( alo * bhi ); \
-       err3 = err2 - ( ahi * blo ); \
-       y = ( alo * blo ) - err3
+#define
+Two_Product_Presplit( a, b, bhi, blo, x, y ) \
+    x = (REAL) ( a * b ); \
+    Split( a, ahi, alo ); \
+    err1 = x - ( ahi * bhi ); \
+    err2 = err1 - ( alo * bhi ); \
+    err3 = err2 - ( ahi * blo ); \
+    y = ( alo * blo ) - err3
 
 /* Square() can be done more quickly than Two_Product().                     */
 
-#define Square_Tail( a, x, y ) \
-       Split( a, ahi, alo ); \
-       err1 = x - ( ahi * ahi ); \
-       err3 = err1 - ( ( ahi + ahi ) * alo ); \
-       y = ( alo * alo ) - err3
+#define
+Square_Tail( a, x, y ) \
+    Split( a, ahi, alo ); \
+    err1 = x - ( ahi * ahi ); \
+    err3 = err1 - (( ahi + ahi ) * alo ); \
+    y = ( alo * alo ) - err3
 
-#define Square( a, x, y ) \
-       x = (REAL) ( a * a ); \
-       Square_Tail( a, x, y )
+#define
+Square( a, x, y ) \
+    x = (REAL) ( a * a ); \
+    Square_Tail( a, x, y )
 
 /* Macros for summing expansions of various fixed lengths.  These are all    */
 /*   unrolled versions of Expansion_Sum().                                   */
 
-#define Two_One_Sum( a1, a0, b, x2, x1, x0 ) \
-       Two_Sum( a0, b, _i, x0 ); \
-       Two_Sum( a1, _i, x2, x1 )
+#define
+Two_One_Sum( a1, a0, b, x2, x1, x0 ) \
+    Two_Sum( a0, b, _i, x0 ); \
+    Two_Sum( a1, _i, x2, x1 )
 
-#define Two_One_Diff( a1, a0, b, x2, x1, x0 ) \
-       Two_Diff( a0, b, _i, x0 ); \
-       Two_Sum( a1, _i, x2, x1 )
+#define
+Two_One_Diff( a1, a0, b, x2, x1, x0 ) \
+    Two_Diff( a0, b, _i, x0 ); \
+    Two_Sum( a1, _i, x2, x1 )
 
-#define Two_Two_Sum( a1, a0, b1, b0, x3, x2, x1, x0 ) \
-       Two_One_Sum( a1, a0, b0, _j, _0, x0 ); \
-       Two_One_Sum( _j, _0, b1, x3, x2, x1 )
+#define
+Two_Two_Sum( a1, a0, b1, b0, x3, x2, x1, x0 ) \
+    Two_One_Sum( a1, a0, b0, _j, _0, x0 ); \
+    Two_One_Sum( _j, _0, b1, x3, x2, x1 )
 
-#define Two_Two_Diff( a1, a0, b1, b0, x3, x2, x1, x0 ) \
-       Two_One_Diff( a1, a0, b0, _j, _0, x0 ); \
-       Two_One_Diff( _j, _0, b1, x3, x2, x1 )
+#define
+Two_Two_Diff( a1, a0, b1, b0, x3, x2, x1, x0 ) \
+    Two_One_Diff( a1, a0, b0, _j, _0, x0 );    \
+    Two_One_Diff( _j, _0, b1, x3, x2, x1 )
 
 /*****************************************************************************/
 /*                                                                           */
@@ -4044,41 +4200,41 @@ struct edge *newedge;
 /*****************************************************************************/
 
 void exactinit(){
-       REAL half;
-       REAL check, lastcheck;
-       int every_other;
-
-       every_other = 1;
-       half = 0.5;
-       epsilon = 1.0;
-       splitter = 1.0;
-       check = 1.0;
-       /* Repeatedly divide `epsilon' by two until it is too small to add to      */
-       /*   one without causing roundoff.  (Also check if the sum is equal to     */
-       /*   the previous sum, for machines that round up instead of using exact   */
-       /*   rounding.  Not that these routines will work on such machines anyway. */
-       do {
-               lastcheck = check;
-               epsilon *= half;
-               if ( every_other ) {
-                       splitter *= 2.0;
-               }
-               every_other = !every_other;
-               check = (REAL)( 1.0 + epsilon );
-       } while ( ( check != 1.0 ) && ( check != lastcheck ) );
-       splitter += 1.0;
-       if ( verbose > 1 ) {
-               printf( "Floating point roundoff is of magnitude %.17g\n", epsilon );
-               printf( "Floating point splitter is %.17g\n", splitter );
-       }
-       /* Error bounds for orientation and incircle tests. */
-       resulterrbound = (REAL)( ( 3.0 + 8.0 * epsilon ) * epsilon );
-       ccwerrboundA = (REAL)( ( 3.0 + 16.0 * epsilon ) * epsilon );
-       ccwerrboundB = (REAL)( ( 2.0 + 12.0 * epsilon ) * epsilon );
-       ccwerrboundC = (REAL)( ( 9.0 + 64.0 * epsilon ) * epsilon * epsilon );
-       iccerrboundA = (REAL)( ( 10.0 + 96.0 * epsilon ) * epsilon );
-       iccerrboundB = (REAL)( ( 4.0 + 48.0 * epsilon ) * epsilon );
-       iccerrboundC = (REAL)( ( 44.0 + 576.0 * epsilon ) * epsilon * epsilon );
+REAL half;
+REAL check, lastcheck;
+int every_other;
+
+every_other = 1;
+half = 0.5;
+epsilon = 1.0;
+splitter = 1.0;
+check = 1.0;
+/* Repeatedly divide `epsilon' by two until it is too small to add to      */
+/*   one without causing roundoff.  (Also check if the sum is equal to     */
+/*   the previous sum, for machines that round up instead of using exact   */
+/*   rounding.  Not that these routines will work on such machines anyway. */
+do {
+lastcheck = check;
+epsilon *= half;
+if ( every_other ) {
+splitter *= 2.0;
+}
+every_other = !every_other;
+check = (REAL)( 1.0 + epsilon );
+} while (( check != 1.0 ) && ( check != lastcheck ));
+splitter += 1.0;
+if ( verbose > 1 ) {
+printf( "Floating point roundoff is of magnitude %.17g\n", epsilon );
+printf( "Floating point splitter is %.17g\n", splitter );
+}
+/* Error bounds for orientation and incircle tests. */
+resulterrbound = (REAL)(( 3.0 + 8.0 * epsilon ) * epsilon );
+ccwerrboundA = (REAL)(( 3.0 + 16.0 * epsilon ) * epsilon );
+ccwerrboundB = (REAL)(( 2.0 + 12.0 * epsilon ) * epsilon );
+ccwerrboundC = (REAL)(( 9.0 + 64.0 * epsilon ) * epsilon * epsilon );
+iccerrboundA = (REAL)(( 10.0 + 96.0 * epsilon ) * epsilon );
+iccerrboundB = (REAL)(( 4.0 + 48.0 * epsilon ) * epsilon );
+iccerrboundC = (REAL)(( 44.0 + 576.0 * epsilon ) * epsilon * epsilon );
 }
 
 /*****************************************************************************/
@@ -4102,74 +4258,74 @@ int flen;
 REAL *f;
 REAL *h;
 {
-       REAL Q;
-       INEXACT REAL Qnew;
-       INEXACT REAL hh;
-       INEXACT REAL bvirt;
-       REAL avirt, bround, around;
-       int eindex, findex, hindex;
-       REAL enow, fnow;
-
-       enow = e[0];
-       fnow = f[0];
-       eindex = findex = 0;
-       if ( ( fnow > enow ) == ( fnow > -enow ) ) {
-               Q = enow;
-               enow = e[++eindex];
-       }
-       else {
-               Q = fnow;
-               fnow = f[++findex];
-       }
-       hindex = 0;
-       if ( ( eindex < elen ) && ( findex < flen ) ) {
-               if ( ( fnow > enow ) == ( fnow > -enow ) ) {
-                       Fast_Two_Sum( enow, Q, Qnew, hh );
-                       enow = e[++eindex];
-               }
-               else {
-                       Fast_Two_Sum( fnow, Q, Qnew, hh );
-                       fnow = f[++findex];
-               }
-               Q = Qnew;
-               if ( hh != 0.0 ) {
-                       h[hindex++] = hh;
-               }
-               while ( ( eindex < elen ) && ( findex < flen ) ) {
-                       if ( ( fnow > enow ) == ( fnow > -enow ) ) {
-                               Two_Sum( Q, enow, Qnew, hh );
-                               enow = e[++eindex];
-                       }
-                       else {
-                               Two_Sum( Q, fnow, Qnew, hh );
-                               fnow = f[++findex];
-                       }
-                       Q = Qnew;
-                       if ( hh != 0.0 ) {
-                               h[hindex++] = hh;
-                       }
-               }
-       }
-       while ( eindex < elen ) {
-               Two_Sum( Q, enow, Qnew, hh );
-               enow = e[++eindex];
-               Q = Qnew;
-               if ( hh != 0.0 ) {
-                       h[hindex++] = hh;
-               }
-       }
-       while ( findex < flen ) {
-               Two_Sum( Q, fnow, Qnew, hh );
-               fnow = f[++findex];
-               Q = Qnew;
-               if ( hh != 0.0 ) {
-                       h[hindex++] = hh;
-               }
-       }
-       if ( ( Q != 0.0 ) || ( hindex == 0 ) ) {
-               h[hindex++] = Q;
-       }
-       return hindex;
+REAL Q;
+INEXACT REAL Qnew;
+INEXACT REAL hh;
+INEXACT REAL bvirt;
+REAL avirt, bround, around;
+int eindex, findex, hindex;
+REAL enow, fnow;
+
+enow = e[0];
+fnow = f[0];
+eindex = findex = 0;
+if (( fnow > enow ) == ( fnow > -enow )) {
+Q = enow;
+enow = e[++eindex];
+}
+else {
+Q = fnow;
+fnow = f[++findex];
+}
+hindex = 0;
+if (( eindex < elen ) && ( findex < flen )) {
+if (( fnow > enow ) == ( fnow > -enow )) {
+Fast_Two_Sum( enow, Q, Qnew, hh );
+enow = e[++eindex];
+}
+else {
+Fast_Two_Sum( fnow, Q, Qnew, hh );
+fnow = f[++findex];
+}
+Q = Qnew;
+if ( hh != 0.0 ) {
+h[hindex++] = hh;
+}
+while (( eindex < elen ) && ( findex < flen )) {
+if (( fnow > enow ) == ( fnow > -enow )) {
+Two_Sum( Q, enow, Qnew, hh );
+enow = e[++eindex];
+}
+else {
+Two_Sum( Q, fnow, Qnew, hh );
+fnow = f[++findex];
+}
+Q = Qnew;
+if ( hh != 0.0 ) {
+h[hindex++] = hh;
+}
+}
+}
+while ( eindex < elen ) {
+Two_Sum( Q, enow, Qnew, hh );
+enow = e[++eindex];
+Q = Qnew;
+if ( hh != 0.0 ) {
+h[hindex++] = hh;
+}
+}
+while ( findex < flen ) {
+Two_Sum( Q, fnow, Qnew, hh );
+fnow = f[++findex];
+Q = Qnew;
+if ( hh != 0.0 ) {
+h[hindex++] = hh;
+}
+}
+if (( Q != 0.0 ) || ( hindex == 0 )) {
+h[hindex++] = Q;
+}
+return hindex;
 }
 
 /*****************************************************************************/
@@ -4193,41 +4349,41 @@ REAL *e;
 REAL b;
 REAL *h;
 {
-       INEXACT REAL Q, sum;
-       REAL hh;
-       INEXACT REAL product1;
-       REAL product0;
-       int eindex, hindex;
-       REAL enow;
-       INEXACT REAL bvirt;
-       REAL avirt, bround, around;
-       INEXACT REAL c;
-       INEXACT REAL abig;
-       REAL ahi, alo, bhi, blo;
-       REAL err1, err2, err3;
-
-       Split( b, bhi, blo );
-       Two_Product_Presplit( e[0], b, bhi, blo, Q, hh );
-       hindex = 0;
-       if ( hh != 0 ) {
-               h[hindex++] = hh;
-       }
-       for ( eindex = 1; eindex < elen; eindex++ ) {
-               enow = e[eindex];
-               Two_Product_Presplit( enow, b, bhi, blo, product1, product0 );
-               Two_Sum( Q, product0, sum, hh );
-               if ( hh != 0 ) {
-                       h[hindex++] = hh;
-               }
-               Fast_Two_Sum( product1, sum, Q, hh );
-               if ( hh != 0 ) {
-                       h[hindex++] = hh;
-               }
-       }
-       if ( ( Q != 0.0 ) || ( hindex == 0 ) ) {
-               h[hindex++] = Q;
-       }
-       return hindex;
+INEXACT REAL Q, sum;
+REAL hh;
+INEXACT REAL product1;
+REAL product0;
+int eindex, hindex;
+REAL enow;
+INEXACT REAL bvirt;
+REAL avirt, bround, around;
+INEXACT REAL c;
+INEXACT REAL abig;
+REAL ahi, alo, bhi, blo;
+REAL err1, err2, err3;
+
+Split( b, bhi, blo );
+Two_Product_Presplit( e[0], b, bhi, blo, Q, hh );
+hindex = 0;
+if ( hh != 0 ) {
+h[hindex++] = hh;
+}
+for ( eindex = 1; eindex < elen; eindex++ ) {
+enow = e[eindex];
+Two_Product_Presplit( enow, b, bhi, blo, product1, product0 );
+Two_Sum( Q, product0, sum, hh );
+if ( hh != 0 ) {
+h[hindex++] = hh;
+}
+Fast_Two_Sum( product1, sum, Q, hh );
+if ( hh != 0 ) {
+h[hindex++] = hh;
+}
+}
+if (( Q != 0.0 ) || ( hindex == 0 )) {
+h[hindex++] = Q;
+}
+return hindex;
 }
 
 /*****************************************************************************/
@@ -4242,14 +4398,14 @@ REAL estimate( elen, e )
 int elen;
 REAL *e;
 {
-       REAL Q;
-       int eindex;
+REAL Q;
+int eindex;
 
-       Q = e[0];
-       for ( eindex = 1; eindex < elen; eindex++ ) {
-               Q += e[eindex];
-       }
-       return Q;
+Q = e[0];
+for ( eindex = 1; eindex < elen; eindex++ ) {
+Q += e[eindex];
+}
+return Q;
 }
 
 /*****************************************************************************/
@@ -4278,82 +4434,82 @@ point pb;
 point pc;
 REAL detsum;
 {
-       INEXACT REAL acx, acy, bcx, bcy;
-       REAL acxtail, acytail, bcxtail, bcytail;
-       INEXACT REAL detleft, detright;
-       REAL detlefttail, detrighttail;
-       REAL det, errbound;
-       REAL B[4], C1[8], C2[12], D[16];
-       INEXACT REAL B3;
-       int C1length, C2length, Dlength;
-       REAL u[4];
-       INEXACT REAL u3;
-       INEXACT REAL s1, t1;
-       REAL s0, t0;
-
-       INEXACT REAL bvirt;
-       REAL avirt, bround, around;
-       INEXACT REAL c;
-       INEXACT REAL abig;
-       REAL ahi, alo, bhi, blo;
-       REAL err1, err2, err3;
-       INEXACT REAL _i, _j;
-       REAL _0;
-
-       acx = (REAL) ( pa[0] - pc[0] );
-       bcx = (REAL) ( pb[0] - pc[0] );
-       acy = (REAL) ( pa[1] - pc[1] );
-       bcy = (REAL) ( pb[1] - pc[1] );
-
-       Two_Product( acx, bcy, detleft, detlefttail );
-       Two_Product( acy, bcx, detright, detrighttail );
-
-       Two_Two_Diff( detleft, detlefttail, detright, detrighttail,
-                                 B3, B[2], B[1], B[0] );
-       B[3] = B3;
-
-       det = estimate( 4, B );
-       errbound = (REAL)( ccwerrboundB * detsum );
-       if ( ( det >= errbound ) || ( -det >= errbound ) ) {
-               return det;
-       }
-
-       Two_Diff_Tail( pa[0], pc[0], acx, acxtail );
-       Two_Diff_Tail( pb[0], pc[0], bcx, bcxtail );
-       Two_Diff_Tail( pa[1], pc[1], acy, acytail );
-       Two_Diff_Tail( pb[1], pc[1], bcy, bcytail );
-
-       if ( ( acxtail == 0.0 ) && ( acytail == 0.0 )
-                && ( bcxtail == 0.0 ) && ( bcytail == 0.0 ) ) {
-               return det;
-       }
-
-       errbound = (REAL)( ccwerrboundC * detsum + resulterrbound * Absolute( det ) );
-       det += ( acx * bcytail + bcy * acxtail )
-                  - ( acy * bcxtail + bcx * acytail );
-       if ( ( det >= errbound ) || ( -det >= errbound ) ) {
-               return det;
-       }
-
-       Two_Product( acxtail, bcy, s1, s0 );
-       Two_Product( acytail, bcx, t1, t0 );
-       Two_Two_Diff( s1, s0, t1, t0, u3, u[2], u[1], u[0] );
-       u[3] = u3;
-       C1length = fast_expansion_sum_zeroelim( 4, B, 4, u, C1 );
-
-       Two_Product( acx, bcytail, s1, s0 );
-       Two_Product( acy, bcxtail, t1, t0 );
-       Two_Two_Diff( s1, s0, t1, t0, u3, u[2], u[1], u[0] );
-       u[3] = u3;
-       C2length = fast_expansion_sum_zeroelim( C1length, C1, 4, u, C2 );
-
-       Two_Product( acxtail, bcytail, s1, s0 );
-       Two_Product( acytail, bcxtail, t1, t0 );
-       Two_Two_Diff( s1, s0, t1, t0, u3, u[2], u[1], u[0] );
-       u[3] = u3;
-       Dlength = fast_expansion_sum_zeroelim( C2length, C2, 4, u, D );
-
-       return( D[Dlength - 1] );
+INEXACT REAL acx, acy, bcx, bcy;
+REAL acxtail, acytail, bcxtail, bcytail;
+INEXACT REAL detleft, detright;
+REAL detlefttail, detrighttail;
+REAL det, errbound;
+REAL B[4], C1[8], C2[12], D[16];
+INEXACT REAL B3;
+int C1length, C2length, Dlength;
+REAL u[4];
+INEXACT REAL u3;
+INEXACT REAL s1, t1;
+REAL s0, t0;
+
+INEXACT REAL bvirt;
+REAL avirt, bround, around;
+INEXACT REAL c;
+INEXACT REAL abig;
+REAL ahi, alo, bhi, blo;
+REAL err1, err2, err3;
+INEXACT REAL _i, _j;
+REAL _0;
+
+acx = (REAL) ( pa[0] - pc[0] );
+bcx = (REAL) ( pb[0] - pc[0] );
+acy = (REAL) ( pa[1] - pc[1] );
+bcy = (REAL) ( pb[1] - pc[1] );
+
+Two_Product( acx, bcy, detleft, detlefttail );
+Two_Product( acy, bcx, detright, detrighttail );
+
+Two_Two_Diff( detleft, detlefttail, detright, detrighttail,
+B3, B[2], B[1], B[0] );
+B[3] = B3;
+
+det = estimate( 4, B );
+errbound = (REAL)( ccwerrboundB * detsum );
+if (( det >= errbound ) || ( -det >= errbound )) {
+return det;
+}
+
+Two_Diff_Tail( pa[0], pc[0], acx, acxtail );
+Two_Diff_Tail( pb[0], pc[0], bcx, bcxtail );
+Two_Diff_Tail( pa[1], pc[1], acy, acytail );
+Two_Diff_Tail( pb[1], pc[1], bcy, bcytail );
+
+if (( acxtail == 0.0 ) && ( acytail == 0.0 )
+&& ( bcxtail == 0.0 ) && ( bcytail == 0.0 )) {
+return det;
+}
+
+errbound = (REAL)( ccwerrboundC * detsum + resulterrbound * Absolute( det ));
+det += ( acx * bcytail + bcy * acxtail )
+- ( acy * bcxtail + bcx * acytail );
+if (( det >= errbound ) || ( -det >= errbound )) {
+return det;
+}
+
+Two_Product( acxtail, bcy, s1, s0 );
+Two_Product( acytail, bcx, t1, t0 );
+Two_Two_Diff( s1, s0, t1, t0, u3, u[2], u[1], u[0] );
+u[3] = u3;
+C1length = fast_expansion_sum_zeroelim( 4, B, 4, u, C1 );
+
+Two_Product( acx, bcytail, s1, s0 );
+Two_Product( acy, bcxtail, t1, t0 );
+Two_Two_Diff( s1, s0, t1, t0, u3, u[2], u[1], u[0] );
+u[3] = u3;
+C2length = fast_expansion_sum_zeroelim( C1length, C1, 4, u, C2 );
+
+Two_Product( acxtail, bcytail, s1, s0 );
+Two_Product( acytail, bcxtail, t1, t0 );
+Two_Two_Diff( s1, s0, t1, t0, u3, u[2], u[1], u[0] );
+u[3] = u3;
+Dlength = fast_expansion_sum_zeroelim( C2length, C2, 4, u, D );
+
+return( D[Dlength - 1] );
 }
 
 REAL counterclockwise( pa, pb, pc )
@@ -4361,45 +4517,45 @@ point pa;
 point pb;
 point pc;
 {
-       REAL detleft, detright, det;
-       REAL detsum, errbound;
+REAL detleft, detright, det;
+REAL detsum, errbound;
 
-       counterclockcount++;
+counterclockcount++;
 
-       detleft = ( pa[0] - pc[0] ) * ( pb[1] - pc[1] );
-       detright = ( pa[1] - pc[1] ) * ( pb[0] - pc[0] );
-       det = detleft - detright;
+detleft = ( pa[0] - pc[0] ) * ( pb[1] - pc[1] );
+detright = ( pa[1] - pc[1] ) * ( pb[0] - pc[0] );
+det = detleft - detright;
 
-       if ( noexact ) {
-               return det;
-       }
+if ( noexact ) {
+return det;
+}
 
-       if ( detleft > 0.0 ) {
-               if ( detright <= 0.0 ) {
-                       return det;
-               }
-               else {
-                       detsum = detleft + detright;
-               }
-       }
-       else if ( detleft < 0.0 ) {
-               if ( detright >= 0.0 ) {
-                       return det;
-               }
-               else {
-                       detsum = -detleft - detright;
-               }
-       }
-       else {
-               return det;
-       }
+if ( detleft > 0.0 ) {
+if ( detright <= 0.0 ) {
+return det;
+}
+else {
+detsum = detleft + detright;
+}
+}
+else if ( detleft < 0.0 ) {
+if ( detright >= 0.0 ) {
+return det;
+}
+else {
+detsum = -detleft - detright;
+}
+}
+else {
+return det;
+}
 
-       errbound = ccwerrboundA * detsum;
-       if ( ( det >= errbound ) || ( -det >= errbound ) ) {
-               return det;
-       }
+errbound = ccwerrboundA * detsum;
+if (( det >= errbound ) || ( -det >= errbound )) {
+return det;
+}
 
-       return counterclockwiseadapt( pa, pb, pc, detsum );
+return counterclockwiseadapt( pa, pb, pc, detsum );
 }
 
 /*****************************************************************************/
@@ -4428,626 +4584,626 @@ point pc;
 point pd;
 REAL permanent;
 {
-       INEXACT REAL adx, bdx, cdx, ady, bdy, cdy;
-       REAL det, errbound;
-
-       INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1;
-       REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0;
-       REAL bc[4], ca[4], ab[4];
-       INEXACT REAL bc3, ca3, ab3;
-       REAL axbc[8], axxbc[16], aybc[8], ayybc[16], adet[32];
-       int axbclen, axxbclen, aybclen, ayybclen, alen;
-       REAL bxca[8], bxxca[16], byca[8], byyca[16], bdet[32];
-       int bxcalen, bxxcalen, bycalen, byycalen, blen;
-       REAL cxab[8], cxxab[16], cyab[8], cyyab[16], cdet[32];
-       int cxablen, cxxablen, cyablen, cyyablen, clen;
-       REAL abdet[64];
-       int ablen;
-       REAL fin1[1152], fin2[1152];
-       REAL *finnow, *finother, *finswap;
-       int finlength;
-
-       REAL adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;
-       INEXACT REAL adxadx1, adyady1, bdxbdx1, bdybdy1, cdxcdx1, cdycdy1;
-       REAL adxadx0, adyady0, bdxbdx0, bdybdy0, cdxcdx0, cdycdy0;
-       REAL aa[4], bb[4], cc[4];
-       INEXACT REAL aa3, bb3, cc3;
-       INEXACT REAL ti1, tj1;
-       REAL ti0, tj0;
-       REAL u[4], v[4];
-       INEXACT REAL u3, v3;
-       REAL temp8[8], temp16a[16], temp16b[16], temp16c[16];
-       REAL temp32a[32], temp32b[32], temp48[48], temp64[64];
-       int temp8len, temp16alen, temp16blen, temp16clen;
-       int temp32alen, temp32blen, temp48len, temp64len;
-       REAL axtbb[8], axtcc[8], aytbb[8], aytcc[8];
-       int axtbblen, axtcclen, aytbblen, aytcclen;
-       REAL bxtaa[8], bxtcc[8], bytaa[8], bytcc[8];
-       int bxtaalen, bxtcclen, bytaalen, bytcclen;
-       REAL cxtaa[8], cxtbb[8], cytaa[8], cytbb[8];
-       int cxtaalen, cxtbblen, cytaalen, cytbblen;
-       REAL axtbc[8], aytbc[8], bxtca[8], bytca[8], cxtab[8], cytab[8];
-       int axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;
-       REAL axtbct[16], aytbct[16], bxtcat[16], bytcat[16], cxtabt[16], cytabt[16];
-       int axtbctlen, aytbctlen, bxtcatlen, bytcatlen, cxtabtlen, cytabtlen;
-       REAL axtbctt[8], aytbctt[8], bxtcatt[8];
-       REAL bytcatt[8], cxtabtt[8], cytabtt[8];
-       int axtbcttlen, aytbcttlen, bxtcattlen, bytcattlen, cxtabttlen, cytabttlen;
-       REAL abt[8], bct[8], cat[8];
-       int abtlen, bctlen, catlen;
-       REAL abtt[4], bctt[4], catt[4];
-       int abttlen, bcttlen, cattlen;
-       INEXACT REAL abtt3, bctt3, catt3;
-       REAL negate;
-
-       INEXACT REAL bvirt;
-       REAL avirt, bround, around;
-       INEXACT REAL c;
-       INEXACT REAL abig;
-       REAL ahi, alo, bhi, blo;
-       REAL err1, err2, err3;
-       INEXACT REAL _i, _j;
-       REAL _0;
-
-       adx = (REAL) ( pa[0] - pd[0] );
-       bdx = (REAL) ( pb[0] - pd[0] );
-       cdx = (REAL) ( pc[0] - pd[0] );
-       ady = (REAL) ( pa[1] - pd[1] );
-       bdy = (REAL) ( pb[1] - pd[1] );
-       cdy = (REAL) ( pc[1] - pd[1] );
-
-       Two_Product( bdx, cdy, bdxcdy1, bdxcdy0 );
-       Two_Product( cdx, bdy, cdxbdy1, cdxbdy0 );
-       Two_Two_Diff( bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0] );
-       bc[3] = bc3;
-       axbclen = scale_expansion_zeroelim( 4, bc, adx, axbc );
-       axxbclen = scale_expansion_zeroelim( axbclen, axbc, adx, axxbc );
-       aybclen = scale_expansion_zeroelim( 4, bc, ady, aybc );
-       ayybclen = scale_expansion_zeroelim( aybclen, aybc, ady, ayybc );
-       alen = fast_expansion_sum_zeroelim( axxbclen, axxbc, ayybclen, ayybc, adet );
-
-       Two_Product( cdx, ady, cdxady1, cdxady0 );
-       Two_Product( adx, cdy, adxcdy1, adxcdy0 );
-       Two_Two_Diff( cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0] );
-       ca[3] = ca3;
-       bxcalen = scale_expansion_zeroelim( 4, ca, bdx, bxca );
-       bxxcalen = scale_expansion_zeroelim( bxcalen, bxca, bdx, bxxca );
-       bycalen = scale_expansion_zeroelim( 4, ca, bdy, byca );
-       byycalen = scale_expansion_zeroelim( bycalen, byca, bdy, byyca );
-       blen = fast_expansion_sum_zeroelim( bxxcalen, bxxca, byycalen, byyca, bdet );
-
-       Two_Product( adx, bdy, adxbdy1, adxbdy0 );
-       Two_Product( bdx, ady, bdxady1, bdxady0 );
-       Two_Two_Diff( adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0] );
-       ab[3] = ab3;
-       cxablen = scale_expansion_zeroelim( 4, ab, cdx, cxab );
-       cxxablen = scale_expansion_zeroelim( cxablen, cxab, cdx, cxxab );
-       cyablen = scale_expansion_zeroelim( 4, ab, cdy, cyab );
-       cyyablen = scale_expansion_zeroelim( cyablen, cyab, cdy, cyyab );
-       clen = fast_expansion_sum_zeroelim( cxxablen, cxxab, cyyablen, cyyab, cdet );
-
-       ablen = fast_expansion_sum_zeroelim( alen, adet, blen, bdet, abdet );
-       finlength = fast_expansion_sum_zeroelim( ablen, abdet, clen, cdet, fin1 );
-
-       det = estimate( finlength, fin1 );
-       errbound = (REAL)( iccerrboundB * permanent );
-       if ( ( det >= errbound ) || ( -det >= errbound ) ) {
-               return det;
-       }
-
-       Two_Diff_Tail( pa[0], pd[0], adx, adxtail );
-       Two_Diff_Tail( pa[1], pd[1], ady, adytail );
-       Two_Diff_Tail( pb[0], pd[0], bdx, bdxtail );
-       Two_Diff_Tail( pb[1], pd[1], bdy, bdytail );
-       Two_Diff_Tail( pc[0], pd[0], cdx, cdxtail );
-       Two_Diff_Tail( pc[1], pd[1], cdy, cdytail );
-       if ( ( adxtail == 0.0 ) && ( bdxtail == 0.0 ) && ( cdxtail == 0.0 )
-                && ( adytail == 0.0 ) && ( bdytail == 0.0 ) && ( cdytail == 0.0 ) ) {
-               return det;
-       }
-
-       errbound = (REAL)( iccerrboundC * permanent + resulterrbound * Absolute( det ) );
-       det += (REAL)( ( ( adx * adx + ady * ady ) * ( ( bdx * cdytail + cdy * bdxtail )
-                                                                                                  - ( bdy * cdxtail + cdx * bdytail ) )
-                                        + 2.0 * ( adx * adxtail + ady * adytail ) * ( bdx * cdy - bdy * cdx ) )
-                                  + ( ( bdx * bdx + bdy * bdy ) * ( ( cdx * adytail + ady * cdxtail )
-                                                                                                        - ( cdy * adxtail + adx * cdytail ) )
-                                          + 2.0 * ( bdx * bdxtail + bdy * bdytail ) * ( cdx * ady - cdy * adx ) )
-                                  + ( ( cdx * cdx + cdy * cdy ) * ( ( adx * bdytail + bdy * adxtail )
-                                                                                                        - ( ady * bdxtail + bdx * adytail ) )
-                                          + 2.0 * ( cdx * cdxtail + cdy * cdytail ) * ( adx * bdy - ady * bdx ) ) );
-       if ( ( det >= errbound ) || ( -det >= errbound ) ) {
-               return det;
-       }
-
-       finnow = fin1;
-       finother = fin2;
-
-       if ( ( bdxtail != 0.0 ) || ( bdytail != 0.0 )
-                || ( cdxtail != 0.0 ) || ( cdytail != 0.0 ) ) {
-               Square( adx, adxadx1, adxadx0 );
-               Square( ady, adyady1, adyady0 );
-               Two_Two_Sum( adxadx1, adxadx0, adyady1, adyady0, aa3, aa[2], aa[1], aa[0] );
-               aa[3] = aa3;
-       }
-       if ( ( cdxtail != 0.0 ) || ( cdytail != 0.0 )
-                || ( adxtail != 0.0 ) || ( adytail != 0.0 ) ) {
-               Square( bdx, bdxbdx1, bdxbdx0 );
-               Square( bdy, bdybdy1, bdybdy0 );
-               Two_Two_Sum( bdxbdx1, bdxbdx0, bdybdy1, bdybdy0, bb3, bb[2], bb[1], bb[0] );
-               bb[3] = bb3;
-       }
-       if ( ( adxtail != 0.0 ) || ( adytail != 0.0 )
-                || ( bdxtail != 0.0 ) || ( bdytail != 0.0 ) ) {
-               Square( cdx, cdxcdx1, cdxcdx0 );
-               Square( cdy, cdycdy1, cdycdy0 );
-               Two_Two_Sum( cdxcdx1, cdxcdx0, cdycdy1, cdycdy0, cc3, cc[2], cc[1], cc[0] );
-               cc[3] = cc3;
-       }
-
-       if ( adxtail != 0.0 ) {
-               axtbclen = scale_expansion_zeroelim( 4, bc, adxtail, axtbc );
-               temp16alen = scale_expansion_zeroelim( axtbclen, axtbc, 2.0 * adx,
-                                                                                          temp16a );
-
-               axtcclen = scale_expansion_zeroelim( 4, cc, adxtail, axtcc );
-               temp16blen = scale_expansion_zeroelim( axtcclen, axtcc, bdy, temp16b );
-
-               axtbblen = scale_expansion_zeroelim( 4, bb, adxtail, axtbb );
-               temp16clen = scale_expansion_zeroelim( axtbblen, axtbb, -cdy, temp16c );
-
-               temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                 temp16blen, temp16b, temp32a );
-               temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
-                                                                                                temp32alen, temp32a, temp48 );
-               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                temp48, finother );
-               finswap = finnow; finnow = finother; finother = finswap;
-       }
-       if ( adytail != 0.0 ) {
-               aytbclen = scale_expansion_zeroelim( 4, bc, adytail, aytbc );
-               temp16alen = scale_expansion_zeroelim( aytbclen, aytbc, 2.0 * ady,
-                                                                                          temp16a );
-
-               aytbblen = scale_expansion_zeroelim( 4, bb, adytail, aytbb );
-               temp16blen = scale_expansion_zeroelim( aytbblen, aytbb, cdx, temp16b );
-
-               aytcclen = scale_expansion_zeroelim( 4, cc, adytail, aytcc );
-               temp16clen = scale_expansion_zeroelim( aytcclen, aytcc, -bdx, temp16c );
-
-               temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                 temp16blen, temp16b, temp32a );
-               temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
-                                                                                                temp32alen, temp32a, temp48 );
-               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                temp48, finother );
-               finswap = finnow; finnow = finother; finother = finswap;
-       }
-       if ( bdxtail != 0.0 ) {
-               bxtcalen = scale_expansion_zeroelim( 4, ca, bdxtail, bxtca );
-               temp16alen = scale_expansion_zeroelim( bxtcalen, bxtca, 2.0 * bdx,
-                                                                                          temp16a );
-
-               bxtaalen = scale_expansion_zeroelim( 4, aa, bdxtail, bxtaa );
-               temp16blen = scale_expansion_zeroelim( bxtaalen, bxtaa, cdy, temp16b );
-
-               bxtcclen = scale_expansion_zeroelim( 4, cc, bdxtail, bxtcc );
-               temp16clen = scale_expansion_zeroelim( bxtcclen, bxtcc, -ady, temp16c );
-
-               temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                 temp16blen, temp16b, temp32a );
-               temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
-                                                                                                temp32alen, temp32a, temp48 );
-               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                temp48, finother );
-               finswap = finnow; finnow = finother; finother = finswap;
-       }
-       if ( bdytail != 0.0 ) {
-               bytcalen = scale_expansion_zeroelim( 4, ca, bdytail, bytca );
-               temp16alen = scale_expansion_zeroelim( bytcalen, bytca, 2.0 * bdy,
-                                                                                          temp16a );
-
-               bytcclen = scale_expansion_zeroelim( 4, cc, bdytail, bytcc );
-               temp16blen = scale_expansion_zeroelim( bytcclen, bytcc, adx, temp16b );
-
-               bytaalen = scale_expansion_zeroelim( 4, aa, bdytail, bytaa );
-               temp16clen = scale_expansion_zeroelim( bytaalen, bytaa, -cdx, temp16c );
-
-               temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                 temp16blen, temp16b, temp32a );
-               temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
-                                                                                                temp32alen, temp32a, temp48 );
-               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                temp48, finother );
-               finswap = finnow; finnow = finother; finother = finswap;
-       }
-       if ( cdxtail != 0.0 ) {
-               cxtablen = scale_expansion_zeroelim( 4, ab, cdxtail, cxtab );
-               temp16alen = scale_expansion_zeroelim( cxtablen, cxtab, 2.0 * cdx,
-                                                                                          temp16a );
-
-               cxtbblen = scale_expansion_zeroelim( 4, bb, cdxtail, cxtbb );
-               temp16blen = scale_expansion_zeroelim( cxtbblen, cxtbb, ady, temp16b );
-
-               cxtaalen = scale_expansion_zeroelim( 4, aa, cdxtail, cxtaa );
-               temp16clen = scale_expansion_zeroelim( cxtaalen, cxtaa, -bdy, temp16c );
-
-               temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                 temp16blen, temp16b, temp32a );
-               temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
-                                                                                                temp32alen, temp32a, temp48 );
-               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                temp48, finother );
-               finswap = finnow; finnow = finother; finother = finswap;
-       }
-       if ( cdytail != 0.0 ) {
-               cytablen = scale_expansion_zeroelim( 4, ab, cdytail, cytab );
-               temp16alen = scale_expansion_zeroelim( cytablen, cytab, 2.0 * cdy,
-                                                                                          temp16a );
-
-               cytaalen = scale_expansion_zeroelim( 4, aa, cdytail, cytaa );
-               temp16blen = scale_expansion_zeroelim( cytaalen, cytaa, bdx, temp16b );
-
-               cytbblen = scale_expansion_zeroelim( 4, bb, cdytail, cytbb );
-               temp16clen = scale_expansion_zeroelim( cytbblen, cytbb, -adx, temp16c );
-
-               temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                 temp16blen, temp16b, temp32a );
-               temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
-                                                                                                temp32alen, temp32a, temp48 );
-               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                temp48, finother );
-               finswap = finnow; finnow = finother; finother = finswap;
-       }
-
-       if ( ( adxtail != 0.0 ) || ( adytail != 0.0 ) ) {
-               if ( ( bdxtail != 0.0 ) || ( bdytail != 0.0 )
-                        || ( cdxtail != 0.0 ) || ( cdytail != 0.0 ) ) {
-                       Two_Product( bdxtail, cdy, ti1, ti0 );
-                       Two_Product( bdx, cdytail, tj1, tj0 );
-                       Two_Two_Sum( ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0] );
-                       u[3] = u3;
-                       negate = -bdy;
-                       Two_Product( cdxtail, negate, ti1, ti0 );
-                       negate = -bdytail;
-                       Two_Product( cdx, negate, tj1, tj0 );
-                       Two_Two_Sum( ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0] );
-                       v[3] = v3;
-                       bctlen = fast_expansion_sum_zeroelim( 4, u, 4, v, bct );
-
-                       Two_Product( bdxtail, cdytail, ti1, ti0 );
-                       Two_Product( cdxtail, bdytail, tj1, tj0 );
-                       Two_Two_Diff( ti1, ti0, tj1, tj0, bctt3, bctt[2], bctt[1], bctt[0] );
-                       bctt[3] = bctt3;
-                       bcttlen = 4;
-               }
-               else {
-                       bct[0] = 0.0;
-                       bctlen = 1;
-                       bctt[0] = 0.0;
-                       bcttlen = 1;
-               }
-
-               if ( adxtail != 0.0 ) {
-                       temp16alen = scale_expansion_zeroelim( axtbclen, axtbc, adxtail, temp16a );
-                       axtbctlen = scale_expansion_zeroelim( bctlen, bct, adxtail, axtbct );
-                       temp32alen = scale_expansion_zeroelim( axtbctlen, axtbct, 2.0 * adx,
-                                                                                                  temp32a );
-                       temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                        temp32alen, temp32a, temp48 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                        temp48, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-                       if ( bdytail != 0.0 ) {
-                               temp8len = scale_expansion_zeroelim( 4, cc, adxtail, temp8 );
-                               temp16alen = scale_expansion_zeroelim( temp8len, temp8, bdytail,
-                                                                                                          temp16a );
-                               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
-                                                                                                                temp16a, finother );
-                               finswap = finnow; finnow = finother; finother = finswap;
-                       }
-                       if ( cdytail != 0.0 ) {
-                               temp8len = scale_expansion_zeroelim( 4, bb, -adxtail, temp8 );
-                               temp16alen = scale_expansion_zeroelim( temp8len, temp8, cdytail,
-                                                                                                          temp16a );
-                               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
-                                                                                                                temp16a, finother );
-                               finswap = finnow; finnow = finother; finother = finswap;
-                       }
-
-                       temp32alen = scale_expansion_zeroelim( axtbctlen, axtbct, adxtail,
-                                                                                                  temp32a );
-                       axtbcttlen = scale_expansion_zeroelim( bcttlen, bctt, adxtail, axtbctt );
-                       temp16alen = scale_expansion_zeroelim( axtbcttlen, axtbctt, 2.0 * adx,
-                                                                                                  temp16a );
-                       temp16blen = scale_expansion_zeroelim( axtbcttlen, axtbctt, adxtail,
-                                                                                                  temp16b );
-                       temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                         temp16blen, temp16b, temp32b );
-                       temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
-                                                                                                        temp32blen, temp32b, temp64 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
-                                                                                                        temp64, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-               }
-               if ( adytail != 0.0 ) {
-                       temp16alen = scale_expansion_zeroelim( aytbclen, aytbc, adytail, temp16a );
-                       aytbctlen = scale_expansion_zeroelim( bctlen, bct, adytail, aytbct );
-                       temp32alen = scale_expansion_zeroelim( aytbctlen, aytbct, 2.0 * ady,
-                                                                                                  temp32a );
-                       temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                        temp32alen, temp32a, temp48 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                        temp48, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-
-
-                       temp32alen = scale_expansion_zeroelim( aytbctlen, aytbct, adytail,
-                                                                                                  temp32a );
-                       aytbcttlen = scale_expansion_zeroelim( bcttlen, bctt, adytail, aytbctt );
-                       temp16alen = scale_expansion_zeroelim( aytbcttlen, aytbctt, 2.0 * ady,
-                                                                                                  temp16a );
-                       temp16blen = scale_expansion_zeroelim( aytbcttlen, aytbctt, adytail,
-                                                                                                  temp16b );
-                       temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                         temp16blen, temp16b, temp32b );
-                       temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
-                                                                                                        temp32blen, temp32b, temp64 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
-                                                                                                        temp64, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-               }
-       }
-       if ( ( bdxtail != 0.0 ) || ( bdytail != 0.0 ) ) {
-               if ( ( cdxtail != 0.0 ) || ( cdytail != 0.0 )
-                        || ( adxtail != 0.0 ) || ( adytail != 0.0 ) ) {
-                       Two_Product( cdxtail, ady, ti1, ti0 );
-                       Two_Product( cdx, adytail, tj1, tj0 );
-                       Two_Two_Sum( ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0] );
-                       u[3] = u3;
-                       negate = -cdy;
-                       Two_Product( adxtail, negate, ti1, ti0 );
-                       negate = -cdytail;
-                       Two_Product( adx, negate, tj1, tj0 );
-                       Two_Two_Sum( ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0] );
-                       v[3] = v3;
-                       catlen = fast_expansion_sum_zeroelim( 4, u, 4, v, cat );
-
-                       Two_Product( cdxtail, adytail, ti1, ti0 );
-                       Two_Product( adxtail, cdytail, tj1, tj0 );
-                       Two_Two_Diff( ti1, ti0, tj1, tj0, catt3, catt[2], catt[1], catt[0] );
-                       catt[3] = catt3;
-                       cattlen = 4;
-               }
-               else {
-                       cat[0] = 0.0;
-                       catlen = 1;
-                       catt[0] = 0.0;
-                       cattlen = 1;
-               }
-
-               if ( bdxtail != 0.0 ) {
-                       temp16alen = scale_expansion_zeroelim( bxtcalen, bxtca, bdxtail, temp16a );
-                       bxtcatlen = scale_expansion_zeroelim( catlen, cat, bdxtail, bxtcat );
-                       temp32alen = scale_expansion_zeroelim( bxtcatlen, bxtcat, 2.0 * bdx,
-                                                                                                  temp32a );
-                       temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                        temp32alen, temp32a, temp48 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                        temp48, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-                       if ( cdytail != 0.0 ) {
-                               temp8len = scale_expansion_zeroelim( 4, aa, bdxtail, temp8 );
-                               temp16alen = scale_expansion_zeroelim( temp8len, temp8, cdytail,
-                                                                                                          temp16a );
-                               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
-                                                                                                                temp16a, finother );
-                               finswap = finnow; finnow = finother; finother = finswap;
-                       }
-                       if ( adytail != 0.0 ) {
-                               temp8len = scale_expansion_zeroelim( 4, cc, -bdxtail, temp8 );
-                               temp16alen = scale_expansion_zeroelim( temp8len, temp8, adytail,
-                                                                                                          temp16a );
-                               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
-                                                                                                                temp16a, finother );
-                               finswap = finnow; finnow = finother; finother = finswap;
-                       }
-
-                       temp32alen = scale_expansion_zeroelim( bxtcatlen, bxtcat, bdxtail,
-                                                                                                  temp32a );
-                       bxtcattlen = scale_expansion_zeroelim( cattlen, catt, bdxtail, bxtcatt );
-                       temp16alen = scale_expansion_zeroelim( bxtcattlen, bxtcatt, 2.0 * bdx,
-                                                                                                  temp16a );
-                       temp16blen = scale_expansion_zeroelim( bxtcattlen, bxtcatt, bdxtail,
-                                                                                                  temp16b );
-                       temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                         temp16blen, temp16b, temp32b );
-                       temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
-                                                                                                        temp32blen, temp32b, temp64 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
-                                                                                                        temp64, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-               }
-               if ( bdytail != 0.0 ) {
-                       temp16alen = scale_expansion_zeroelim( bytcalen, bytca, bdytail, temp16a );
-                       bytcatlen = scale_expansion_zeroelim( catlen, cat, bdytail, bytcat );
-                       temp32alen = scale_expansion_zeroelim( bytcatlen, bytcat, 2.0 * bdy,
-                                                                                                  temp32a );
-                       temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                        temp32alen, temp32a, temp48 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                        temp48, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-
-
-                       temp32alen = scale_expansion_zeroelim( bytcatlen, bytcat, bdytail,
-                                                                                                  temp32a );
-                       bytcattlen = scale_expansion_zeroelim( cattlen, catt, bdytail, bytcatt );
-                       temp16alen = scale_expansion_zeroelim( bytcattlen, bytcatt, 2.0 * bdy,
-                                                                                                  temp16a );
-                       temp16blen = scale_expansion_zeroelim( bytcattlen, bytcatt, bdytail,
-                                                                                                  temp16b );
-                       temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                         temp16blen, temp16b, temp32b );
-                       temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
-                                                                                                        temp32blen, temp32b, temp64 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
-                                                                                                        temp64, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-               }
-       }
-       if ( ( cdxtail != 0.0 ) || ( cdytail != 0.0 ) ) {
-               if ( ( adxtail != 0.0 ) || ( adytail != 0.0 )
-                        || ( bdxtail != 0.0 ) || ( bdytail != 0.0 ) ) {
-                       Two_Product( adxtail, bdy, ti1, ti0 );
-                       Two_Product( adx, bdytail, tj1, tj0 );
-                       Two_Two_Sum( ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0] );
-                       u[3] = u3;
-                       negate = -ady;
-                       Two_Product( bdxtail, negate, ti1, ti0 );
-                       negate = -adytail;
-                       Two_Product( bdx, negate, tj1, tj0 );
-                       Two_Two_Sum( ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0] );
-                       v[3] = v3;
-                       abtlen = fast_expansion_sum_zeroelim( 4, u, 4, v, abt );
-
-                       Two_Product( adxtail, bdytail, ti1, ti0 );
-                       Two_Product( bdxtail, adytail, tj1, tj0 );
-                       Two_Two_Diff( ti1, ti0, tj1, tj0, abtt3, abtt[2], abtt[1], abtt[0] );
-                       abtt[3] = abtt3;
-                       abttlen = 4;
-               }
-               else {
-                       abt[0] = 0.0;
-                       abtlen = 1;
-                       abtt[0] = 0.0;
-                       abttlen = 1;
-               }
-
-               if ( cdxtail != 0.0 ) {
-                       temp16alen = scale_expansion_zeroelim( cxtablen, cxtab, cdxtail, temp16a );
-                       cxtabtlen = scale_expansion_zeroelim( abtlen, abt, cdxtail, cxtabt );
-                       temp32alen = scale_expansion_zeroelim( cxtabtlen, cxtabt, 2.0 * cdx,
-                                                                                                  temp32a );
-                       temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                        temp32alen, temp32a, temp48 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                        temp48, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-                       if ( adytail != 0.0 ) {
-                               temp8len = scale_expansion_zeroelim( 4, bb, cdxtail, temp8 );
-                               temp16alen = scale_expansion_zeroelim( temp8len, temp8, adytail,
-                                                                                                          temp16a );
-                               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
-                                                                                                                temp16a, finother );
-                               finswap = finnow; finnow = finother; finother = finswap;
-                       }
-                       if ( bdytail != 0.0 ) {
-                               temp8len = scale_expansion_zeroelim( 4, aa, -cdxtail, temp8 );
-                               temp16alen = scale_expansion_zeroelim( temp8len, temp8, bdytail,
-                                                                                                          temp16a );
-                               finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
-                                                                                                                temp16a, finother );
-                               finswap = finnow; finnow = finother; finother = finswap;
-                       }
-
-                       temp32alen = scale_expansion_zeroelim( cxtabtlen, cxtabt, cdxtail,
-                                                                                                  temp32a );
-                       cxtabttlen = scale_expansion_zeroelim( abttlen, abtt, cdxtail, cxtabtt );
-                       temp16alen = scale_expansion_zeroelim( cxtabttlen, cxtabtt, 2.0 * cdx,
-                                                                                                  temp16a );
-                       temp16blen = scale_expansion_zeroelim( cxtabttlen, cxtabtt, cdxtail,
-                                                                                                  temp16b );
-                       temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                         temp16blen, temp16b, temp32b );
-                       temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
-                                                                                                        temp32blen, temp32b, temp64 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
-                                                                                                        temp64, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-               }
-               if ( cdytail != 0.0 ) {
-                       temp16alen = scale_expansion_zeroelim( cytablen, cytab, cdytail, temp16a );
-                       cytabtlen = scale_expansion_zeroelim( abtlen, abt, cdytail, cytabt );
-                       temp32alen = scale_expansion_zeroelim( cytabtlen, cytabt, 2.0 * cdy,
-                                                                                                  temp32a );
-                       temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                        temp32alen, temp32a, temp48 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
-                                                                                                        temp48, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-
-
-                       temp32alen = scale_expansion_zeroelim( cytabtlen, cytabt, cdytail,
-                                                                                                  temp32a );
-                       cytabttlen = scale_expansion_zeroelim( abttlen, abtt, cdytail, cytabtt );
-                       temp16alen = scale_expansion_zeroelim( cytabttlen, cytabtt, 2.0 * cdy,
-                                                                                                  temp16a );
-                       temp16blen = scale_expansion_zeroelim( cytabttlen, cytabtt, cdytail,
-                                                                                                  temp16b );
-                       temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
-                                                                                                         temp16blen, temp16b, temp32b );
-                       temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
-                                                                                                        temp32blen, temp32b, temp64 );
-                       finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
-                                                                                                        temp64, finother );
-                       finswap = finnow; finnow = finother; finother = finswap;
-               }
-       }
-
-       return finnow[finlength - 1];
+INEXACT REAL adx, bdx, cdx, ady, bdy, cdy;
+REAL det, errbound;
+
+INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1;
+REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0;
+REAL bc[4], ca[4], ab[4];
+INEXACT REAL bc3, ca3, ab3;
+REAL axbc[8], axxbc[16], aybc[8], ayybc[16], adet[32];
+int axbclen, axxbclen, aybclen, ayybclen, alen;
+REAL bxca[8], bxxca[16], byca[8], byyca[16], bdet[32];
+int bxcalen, bxxcalen, bycalen, byycalen, blen;
+REAL cxab[8], cxxab[16], cyab[8], cyyab[16], cdet[32];
+int cxablen, cxxablen, cyablen, cyyablen, clen;
+REAL abdet[64];
+int ablen;
+REAL fin1[1152], fin2[1152];
+REAL *finnow, *finother, *finswap;
+int finlength;
+
+REAL adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;
+INEXACT REAL adxadx1, adyady1, bdxbdx1, bdybdy1, cdxcdx1, cdycdy1;
+REAL adxadx0, adyady0, bdxbdx0, bdybdy0, cdxcdx0, cdycdy0;
+REAL aa[4], bb[4], cc[4];
+INEXACT REAL aa3, bb3, cc3;
+INEXACT REAL ti1, tj1;
+REAL ti0, tj0;
+REAL u[4], v[4];
+INEXACT REAL u3, v3;
+REAL temp8[8], temp16a[16], temp16b[16], temp16c[16];
+REAL temp32a[32], temp32b[32], temp48[48], temp64[64];
+int temp8len, temp16alen, temp16blen, temp16clen;
+int temp32alen, temp32blen, temp48len, temp64len;
+REAL axtbb[8], axtcc[8], aytbb[8], aytcc[8];
+int axtbblen, axtcclen, aytbblen, aytcclen;
+REAL bxtaa[8], bxtcc[8], bytaa[8], bytcc[8];
+int bxtaalen, bxtcclen, bytaalen, bytcclen;
+REAL cxtaa[8], cxtbb[8], cytaa[8], cytbb[8];
+int cxtaalen, cxtbblen, cytaalen, cytbblen;
+REAL axtbc[8], aytbc[8], bxtca[8], bytca[8], cxtab[8], cytab[8];
+int axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;
+REAL axtbct[16], aytbct[16], bxtcat[16], bytcat[16], cxtabt[16], cytabt[16];
+int axtbctlen, aytbctlen, bxtcatlen, bytcatlen, cxtabtlen, cytabtlen;
+REAL axtbctt[8], aytbctt[8], bxtcatt[8];
+REAL bytcatt[8], cxtabtt[8], cytabtt[8];
+int axtbcttlen, aytbcttlen, bxtcattlen, bytcattlen, cxtabttlen, cytabttlen;
+REAL abt[8], bct[8], cat[8];
+int abtlen, bctlen, catlen;
+REAL abtt[4], bctt[4], catt[4];
+int abttlen, bcttlen, cattlen;
+INEXACT REAL abtt3, bctt3, catt3;
+REAL negate;
+
+INEXACT REAL bvirt;
+REAL avirt, bround, around;
+INEXACT REAL c;
+INEXACT REAL abig;
+REAL ahi, alo, bhi, blo;
+REAL err1, err2, err3;
+INEXACT REAL _i, _j;
+REAL _0;
+
+adx = (REAL) ( pa[0] - pd[0] );
+bdx = (REAL) ( pb[0] - pd[0] );
+cdx = (REAL) ( pc[0] - pd[0] );
+ady = (REAL) ( pa[1] - pd[1] );
+bdy = (REAL) ( pb[1] - pd[1] );
+cdy = (REAL) ( pc[1] - pd[1] );
+
+Two_Product( bdx, cdy, bdxcdy1, bdxcdy0 );
+Two_Product( cdx, bdy, cdxbdy1, cdxbdy0 );
+Two_Two_Diff( bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0] );
+bc[3] = bc3;
+axbclen = scale_expansion_zeroelim( 4, bc, adx, axbc );
+axxbclen = scale_expansion_zeroelim( axbclen, axbc, adx, axxbc );
+aybclen = scale_expansion_zeroelim( 4, bc, ady, aybc );
+ayybclen = scale_expansion_zeroelim( aybclen, aybc, ady, ayybc );
+alen = fast_expansion_sum_zeroelim( axxbclen, axxbc, ayybclen, ayybc, adet );
+
+Two_Product( cdx, ady, cdxady1, cdxady0 );
+Two_Product( adx, cdy, adxcdy1, adxcdy0 );
+Two_Two_Diff( cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0] );
+ca[3] = ca3;
+bxcalen = scale_expansion_zeroelim( 4, ca, bdx, bxca );
+bxxcalen = scale_expansion_zeroelim( bxcalen, bxca, bdx, bxxca );
+bycalen = scale_expansion_zeroelim( 4, ca, bdy, byca );
+byycalen = scale_expansion_zeroelim( bycalen, byca, bdy, byyca );
+blen = fast_expansion_sum_zeroelim( bxxcalen, bxxca, byycalen, byyca, bdet );
+
+Two_Product( adx, bdy, adxbdy1, adxbdy0 );
+Two_Product( bdx, ady, bdxady1, bdxady0 );
+Two_Two_Diff( adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0] );
+ab[3] = ab3;
+cxablen = scale_expansion_zeroelim( 4, ab, cdx, cxab );
+cxxablen = scale_expansion_zeroelim( cxablen, cxab, cdx, cxxab );
+cyablen = scale_expansion_zeroelim( 4, ab, cdy, cyab );
+cyyablen = scale_expansion_zeroelim( cyablen, cyab, cdy, cyyab );
+clen = fast_expansion_sum_zeroelim( cxxablen, cxxab, cyyablen, cyyab, cdet );
+
+ablen = fast_expansion_sum_zeroelim( alen, adet, blen, bdet, abdet );
+finlength = fast_expansion_sum_zeroelim( ablen, abdet, clen, cdet, fin1 );
+
+det = estimate( finlength, fin1 );
+errbound = (REAL)( iccerrboundB * permanent );
+if (( det >= errbound ) || ( -det >= errbound )) {
+return det;
 }
 
-REAL incircle( pa, pb, pc, pd )
-point pa;
-point pb;
-point pc;
-point pd;
-{
-       REAL adx, bdx, cdx, ady, bdy, cdy;
-       REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady;
-       REAL alift, blift, clift;
-       REAL det;
-       REAL permanent, errbound;
+Two_Diff_Tail( pa[0], pd[0], adx, adxtail );
+Two_Diff_Tail( pa[1], pd[1], ady, adytail );
+Two_Diff_Tail( pb[0], pd[0], bdx, bdxtail );
+Two_Diff_Tail( pb[1], pd[1], bdy, bdytail );
+Two_Diff_Tail( pc[0], pd[0], cdx, cdxtail );
+Two_Diff_Tail( pc[1], pd[1], cdy, cdytail );
+if (( adxtail == 0.0 ) && ( bdxtail == 0.0 ) && ( cdxtail == 0.0 )
+&& ( adytail == 0.0 ) && ( bdytail == 0.0 ) && ( cdytail == 0.0 )) {
+return det;
+}
+
+errbound = (REAL)( iccerrboundC * permanent + resulterrbound * Absolute( det ));
+det += (REAL)((( adx * adx + ady * ady ) * (( bdx * cdytail + cdy * bdxtail )
+- ( bdy * cdxtail + cdx * bdytail ))
++ 2.0 * ( adx * adxtail + ady * adytail ) * ( bdx * cdy - bdy * cdx ))
++ (( bdx * bdx + bdy * bdy ) * (( cdx * adytail + ady * cdxtail )
+- ( cdy * adxtail + adx * cdytail ))
++ 2.0 * ( bdx * bdxtail + bdy * bdytail ) * ( cdx * ady - cdy * adx ))
++ (( cdx * cdx + cdy * cdy ) * (( adx * bdytail + bdy * adxtail )
+- ( ady * bdxtail + bdx * adytail ))
++ 2.0 * ( cdx * cdxtail + cdy * cdytail ) * ( adx * bdy - ady * bdx )));
+if (( det >= errbound ) || ( -det >= errbound )) {
+return det;
+}
+
+finnow = fin1;
+finother = fin2;
+
+if (( bdxtail != 0.0 ) || ( bdytail != 0.0 )
+|| ( cdxtail != 0.0 ) || ( cdytail != 0.0 )) {
+Square( adx, adxadx1, adxadx0 );
+Square( ady, adyady1, adyady0 );
+Two_Two_Sum( adxadx1, adxadx0, adyady1, adyady0, aa3, aa[2], aa[1], aa[0] );
+aa[3] = aa3;
+}
+if (( cdxtail != 0.0 ) || ( cdytail != 0.0 )
+|| ( adxtail != 0.0 ) || ( adytail != 0.0 )) {
+Square( bdx, bdxbdx1, bdxbdx0 );
+Square( bdy, bdybdy1, bdybdy0 );
+Two_Two_Sum( bdxbdx1, bdxbdx0, bdybdy1, bdybdy0, bb3, bb[2], bb[1], bb[0] );
+bb[3] = bb3;
+}
+if (( adxtail != 0.0 ) || ( adytail != 0.0 )
+|| ( bdxtail != 0.0 ) || ( bdytail != 0.0 )) {
+Square( cdx, cdxcdx1, cdxcdx0 );
+Square( cdy, cdycdy1, cdycdy0 );
+Two_Two_Sum( cdxcdx1, cdxcdx0, cdycdy1, cdycdy0, cc3, cc[2], cc[1], cc[0] );
+cc[3] = cc3;
+}
+
+if ( adxtail != 0.0 ) {
+axtbclen = scale_expansion_zeroelim( 4, bc, adxtail, axtbc );
+temp16alen = scale_expansion_zeroelim( axtbclen, axtbc, 2.0 * adx,
+temp16a );
+
+axtcclen = scale_expansion_zeroelim( 4, cc, adxtail, axtcc );
+temp16blen = scale_expansion_zeroelim( axtcclen, axtcc, bdy, temp16b );
+
+axtbblen = scale_expansion_zeroelim( 4, bb, adxtail, axtbb );
+temp16clen = scale_expansion_zeroelim( axtbblen, axtbb, -cdy, temp16c );
+
+temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( adytail != 0.0 ) {
+aytbclen = scale_expansion_zeroelim( 4, bc, adytail, aytbc );
+temp16alen = scale_expansion_zeroelim( aytbclen, aytbc, 2.0 * ady,
+temp16a );
+
+aytbblen = scale_expansion_zeroelim( 4, bb, adytail, aytbb );
+temp16blen = scale_expansion_zeroelim( aytbblen, aytbb, cdx, temp16b );
+
+aytcclen = scale_expansion_zeroelim( 4, cc, adytail, aytcc );
+temp16clen = scale_expansion_zeroelim( aytcclen, aytcc, -bdx, temp16c );
+
+temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( bdxtail != 0.0 ) {
+bxtcalen = scale_expansion_zeroelim( 4, ca, bdxtail, bxtca );
+temp16alen = scale_expansion_zeroelim( bxtcalen, bxtca, 2.0 * bdx,
+temp16a );
+
+bxtaalen = scale_expansion_zeroelim( 4, aa, bdxtail, bxtaa );
+temp16blen = scale_expansion_zeroelim( bxtaalen, bxtaa, cdy, temp16b );
+
+bxtcclen = scale_expansion_zeroelim( 4, cc, bdxtail, bxtcc );
+temp16clen = scale_expansion_zeroelim( bxtcclen, bxtcc, -ady, temp16c );
+
+temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( bdytail != 0.0 ) {
+bytcalen = scale_expansion_zeroelim( 4, ca, bdytail, bytca );
+temp16alen = scale_expansion_zeroelim( bytcalen, bytca, 2.0 * bdy,
+temp16a );
+
+bytcclen = scale_expansion_zeroelim( 4, cc, bdytail, bytcc );
+temp16blen = scale_expansion_zeroelim( bytcclen, bytcc, adx, temp16b );
+
+bytaalen = scale_expansion_zeroelim( 4, aa, bdytail, bytaa );
+temp16clen = scale_expansion_zeroelim( bytaalen, bytaa, -cdx, temp16c );
+
+temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( cdxtail != 0.0 ) {
+cxtablen = scale_expansion_zeroelim( 4, ab, cdxtail, cxtab );
+temp16alen = scale_expansion_zeroelim( cxtablen, cxtab, 2.0 * cdx,
+temp16a );
+
+cxtbblen = scale_expansion_zeroelim( 4, bb, cdxtail, cxtbb );
+temp16blen = scale_expansion_zeroelim( cxtbblen, cxtbb, ady, temp16b );
+
+cxtaalen = scale_expansion_zeroelim( 4, aa, cdxtail, cxtaa );
+temp16clen = scale_expansion_zeroelim( cxtaalen, cxtaa, -bdy, temp16c );
+
+temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( cdytail != 0.0 ) {
+cytablen = scale_expansion_zeroelim( 4, ab, cdytail, cytab );
+temp16alen = scale_expansion_zeroelim( cytablen, cytab, 2.0 * cdy,
+temp16a );
+
+cytaalen = scale_expansion_zeroelim( 4, aa, cdytail, cytaa );
+temp16blen = scale_expansion_zeroelim( cytaalen, cytaa, bdx, temp16b );
+
+cytbblen = scale_expansion_zeroelim( 4, bb, cdytail, cytbb );
+temp16clen = scale_expansion_zeroelim( cytbblen, cytbb, -adx, temp16c );
+
+temp32alen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16clen, temp16c,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+
+if (( adxtail != 0.0 ) || ( adytail != 0.0 )) {
+if (( bdxtail != 0.0 ) || ( bdytail != 0.0 )
+|| ( cdxtail != 0.0 ) || ( cdytail != 0.0 )) {
+Two_Product( bdxtail, cdy, ti1, ti0 );
+Two_Product( bdx, cdytail, tj1, tj0 );
+Two_Two_Sum( ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0] );
+u[3] = u3;
+negate = -bdy;
+Two_Product( cdxtail, negate, ti1, ti0 );
+negate = -bdytail;
+Two_Product( cdx, negate, tj1, tj0 );
+Two_Two_Sum( ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0] );
+v[3] = v3;
+bctlen = fast_expansion_sum_zeroelim( 4, u, 4, v, bct );
+
+Two_Product( bdxtail, cdytail, ti1, ti0 );
+Two_Product( cdxtail, bdytail, tj1, tj0 );
+Two_Two_Diff( ti1, ti0, tj1, tj0, bctt3, bctt[2], bctt[1], bctt[0] );
+bctt[3] = bctt3;
+bcttlen = 4;
+}
+else {
+bct[0] = 0.0;
+bctlen = 1;
+bctt[0] = 0.0;
+bcttlen = 1;
+}
+
+if ( adxtail != 0.0 ) {
+temp16alen = scale_expansion_zeroelim( axtbclen, axtbc, adxtail, temp16a );
+axtbctlen = scale_expansion_zeroelim( bctlen, bct, adxtail, axtbct );
+temp32alen = scale_expansion_zeroelim( axtbctlen, axtbct, 2.0 * adx,
+temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+if ( bdytail != 0.0 ) {
+temp8len = scale_expansion_zeroelim( 4, cc, adxtail, temp8 );
+temp16alen = scale_expansion_zeroelim( temp8len, temp8, bdytail,
+temp16a );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
+temp16a, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( cdytail != 0.0 ) {
+temp8len = scale_expansion_zeroelim( 4, bb, -adxtail, temp8 );
+temp16alen = scale_expansion_zeroelim( temp8len, temp8, cdytail,
+temp16a );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
+temp16a, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
 
-       incirclecount++;
+temp32alen = scale_expansion_zeroelim( axtbctlen, axtbct, adxtail,
+temp32a );
+axtbcttlen = scale_expansion_zeroelim( bcttlen, bctt, adxtail, axtbctt );
+temp16alen = scale_expansion_zeroelim( axtbcttlen, axtbctt, 2.0 * adx,
+temp16a );
+temp16blen = scale_expansion_zeroelim( axtbcttlen, axtbctt, adxtail,
+temp16b );
+temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32b );
+temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
+temp32blen, temp32b, temp64 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
+temp64, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( adytail != 0.0 ) {
+temp16alen = scale_expansion_zeroelim( aytbclen, aytbc, adytail, temp16a );
+aytbctlen = scale_expansion_zeroelim( bctlen, bct, adytail, aytbct );
+temp32alen = scale_expansion_zeroelim( aytbctlen, aytbct, 2.0 * ady,
+temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+
+
+temp32alen = scale_expansion_zeroelim( aytbctlen, aytbct, adytail,
+temp32a );
+aytbcttlen = scale_expansion_zeroelim( bcttlen, bctt, adytail, aytbctt );
+temp16alen = scale_expansion_zeroelim( aytbcttlen, aytbctt, 2.0 * ady,
+temp16a );
+temp16blen = scale_expansion_zeroelim( aytbcttlen, aytbctt, adytail,
+temp16b );
+temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32b );
+temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
+temp32blen, temp32b, temp64 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
+temp64, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+}
+if (( bdxtail != 0.0 ) || ( bdytail != 0.0 )) {
+if (( cdxtail != 0.0 ) || ( cdytail != 0.0 )
+|| ( adxtail != 0.0 ) || ( adytail != 0.0 )) {
+Two_Product( cdxtail, ady, ti1, ti0 );
+Two_Product( cdx, adytail, tj1, tj0 );
+Two_Two_Sum( ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0] );
+u[3] = u3;
+negate = -cdy;
+Two_Product( adxtail, negate, ti1, ti0 );
+negate = -cdytail;
+Two_Product( adx, negate, tj1, tj0 );
+Two_Two_Sum( ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0] );
+v[3] = v3;
+catlen = fast_expansion_sum_zeroelim( 4, u, 4, v, cat );
+
+Two_Product( cdxtail, adytail, ti1, ti0 );
+Two_Product( adxtail, cdytail, tj1, tj0 );
+Two_Two_Diff( ti1, ti0, tj1, tj0, catt3, catt[2], catt[1], catt[0] );
+catt[3] = catt3;
+cattlen = 4;
+}
+else {
+cat[0] = 0.0;
+catlen = 1;
+catt[0] = 0.0;
+cattlen = 1;
+}
 
-       adx = pa[0] - pd[0];
-       bdx = pb[0] - pd[0];
-       cdx = pc[0] - pd[0];
-       ady = pa[1] - pd[1];
-       bdy = pb[1] - pd[1];
-       cdy = pc[1] - pd[1];
+if ( bdxtail != 0.0 ) {
+temp16alen = scale_expansion_zeroelim( bxtcalen, bxtca, bdxtail, temp16a );
+bxtcatlen = scale_expansion_zeroelim( catlen, cat, bdxtail, bxtcat );
+temp32alen = scale_expansion_zeroelim( bxtcatlen, bxtcat, 2.0 * bdx,
+temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+if ( cdytail != 0.0 ) {
+temp8len = scale_expansion_zeroelim( 4, aa, bdxtail, temp8 );
+temp16alen = scale_expansion_zeroelim( temp8len, temp8, cdytail,
+temp16a );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
+temp16a, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( adytail != 0.0 ) {
+temp8len = scale_expansion_zeroelim( 4, cc, -bdxtail, temp8 );
+temp16alen = scale_expansion_zeroelim( temp8len, temp8, adytail,
+temp16a );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
+temp16a, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
 
-       bdxcdy = bdx * cdy;
-       cdxbdy = cdx * bdy;
-       alift = adx * adx + ady * ady;
+temp32alen = scale_expansion_zeroelim( bxtcatlen, bxtcat, bdxtail,
+temp32a );
+bxtcattlen = scale_expansion_zeroelim( cattlen, catt, bdxtail, bxtcatt );
+temp16alen = scale_expansion_zeroelim( bxtcattlen, bxtcatt, 2.0 * bdx,
+temp16a );
+temp16blen = scale_expansion_zeroelim( bxtcattlen, bxtcatt, bdxtail,
+temp16b );
+temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32b );
+temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
+temp32blen, temp32b, temp64 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
+temp64, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( bdytail != 0.0 ) {
+temp16alen = scale_expansion_zeroelim( bytcalen, bytca, bdytail, temp16a );
+bytcatlen = scale_expansion_zeroelim( catlen, cat, bdytail, bytcat );
+temp32alen = scale_expansion_zeroelim( bytcatlen, bytcat, 2.0 * bdy,
+temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+
+
+temp32alen = scale_expansion_zeroelim( bytcatlen, bytcat, bdytail,
+temp32a );
+bytcattlen = scale_expansion_zeroelim( cattlen, catt, bdytail, bytcatt );
+temp16alen = scale_expansion_zeroelim( bytcattlen, bytcatt, 2.0 * bdy,
+temp16a );
+temp16blen = scale_expansion_zeroelim( bytcattlen, bytcatt, bdytail,
+temp16b );
+temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32b );
+temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
+temp32blen, temp32b, temp64 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
+temp64, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+}
+if (( cdxtail != 0.0 ) || ( cdytail != 0.0 )) {
+if (( adxtail != 0.0 ) || ( adytail != 0.0 )
+|| ( bdxtail != 0.0 ) || ( bdytail != 0.0 )) {
+Two_Product( adxtail, bdy, ti1, ti0 );
+Two_Product( adx, bdytail, tj1, tj0 );
+Two_Two_Sum( ti1, ti0, tj1, tj0, u3, u[2], u[1], u[0] );
+u[3] = u3;
+negate = -ady;
+Two_Product( bdxtail, negate, ti1, ti0 );
+negate = -adytail;
+Two_Product( bdx, negate, tj1, tj0 );
+Two_Two_Sum( ti1, ti0, tj1, tj0, v3, v[2], v[1], v[0] );
+v[3] = v3;
+abtlen = fast_expansion_sum_zeroelim( 4, u, 4, v, abt );
+
+Two_Product( adxtail, bdytail, ti1, ti0 );
+Two_Product( bdxtail, adytail, tj1, tj0 );
+Two_Two_Diff( ti1, ti0, tj1, tj0, abtt3, abtt[2], abtt[1], abtt[0] );
+abtt[3] = abtt3;
+abttlen = 4;
+}
+else {
+abt[0] = 0.0;
+abtlen = 1;
+abtt[0] = 0.0;
+abttlen = 1;
+}
 
-       cdxady = cdx * ady;
-       adxcdy = adx * cdy;
-       blift = bdx * bdx + bdy * bdy;
+if ( cdxtail != 0.0 ) {
+temp16alen = scale_expansion_zeroelim( cxtablen, cxtab, cdxtail, temp16a );
+cxtabtlen = scale_expansion_zeroelim( abtlen, abt, cdxtail, cxtabt );
+temp32alen = scale_expansion_zeroelim( cxtabtlen, cxtabt, 2.0 * cdx,
+temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+if ( adytail != 0.0 ) {
+temp8len = scale_expansion_zeroelim( 4, bb, cdxtail, temp8 );
+temp16alen = scale_expansion_zeroelim( temp8len, temp8, adytail,
+temp16a );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
+temp16a, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( bdytail != 0.0 ) {
+temp8len = scale_expansion_zeroelim( 4, aa, -cdxtail, temp8 );
+temp16alen = scale_expansion_zeroelim( temp8len, temp8, bdytail,
+temp16a );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp16alen,
+temp16a, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
 
-       adxbdy = adx * bdy;
-       bdxady = bdx * ady;
-       clift = cdx * cdx + cdy * cdy;
+temp32alen = scale_expansion_zeroelim( cxtabtlen, cxtabt, cdxtail,
+temp32a );
+cxtabttlen = scale_expansion_zeroelim( abttlen, abtt, cdxtail, cxtabtt );
+temp16alen = scale_expansion_zeroelim( cxtabttlen, cxtabtt, 2.0 * cdx,
+temp16a );
+temp16blen = scale_expansion_zeroelim( cxtabttlen, cxtabtt, cdxtail,
+temp16b );
+temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32b );
+temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
+temp32blen, temp32b, temp64 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
+temp64, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+if ( cdytail != 0.0 ) {
+temp16alen = scale_expansion_zeroelim( cytablen, cytab, cdytail, temp16a );
+cytabtlen = scale_expansion_zeroelim( abtlen, abt, cdytail, cytabt );
+temp32alen = scale_expansion_zeroelim( cytabtlen, cytabt, 2.0 * cdy,
+temp32a );
+temp48len = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp32alen, temp32a, temp48 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp48len,
+temp48, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+
+
+temp32alen = scale_expansion_zeroelim( cytabtlen, cytabt, cdytail,
+temp32a );
+cytabttlen = scale_expansion_zeroelim( abttlen, abtt, cdytail, cytabtt );
+temp16alen = scale_expansion_zeroelim( cytabttlen, cytabtt, 2.0 * cdy,
+temp16a );
+temp16blen = scale_expansion_zeroelim( cytabttlen, cytabtt, cdytail,
+temp16b );
+temp32blen = fast_expansion_sum_zeroelim( temp16alen, temp16a,
+temp16blen, temp16b, temp32b );
+temp64len = fast_expansion_sum_zeroelim( temp32alen, temp32a,
+temp32blen, temp32b, temp64 );
+finlength = fast_expansion_sum_zeroelim( finlength, finnow, temp64len,
+temp64, finother );
+finswap = finnow; finnow = finother; finother = finswap;
+}
+}
 
-       det = alift * ( bdxcdy - cdxbdy )
-                 + blift * ( cdxady - adxcdy )
-                 + clift * ( adxbdy - bdxady );
+return finnow[finlength - 1];
+}
 
-       if ( noexact ) {
-               return det;
-       }
+REAL incircle( pa, pb, pc, pd )
+point pa;
+point pb;
+point pc;
+point pd;
+{
+REAL adx, bdx, cdx, ady, bdy, cdy;
+REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady;
+REAL alift, blift, clift;
+REAL det;
+REAL permanent, errbound;
+
+incirclecount++;
+
+adx = pa[0] - pd[0];
+bdx = pb[0] - pd[0];
+cdx = pc[0] - pd[0];
+ady = pa[1] - pd[1];
+bdy = pb[1] - pd[1];
+cdy = pc[1] - pd[1];
+
+bdxcdy = bdx * cdy;
+cdxbdy = cdx * bdy;
+alift = adx * adx + ady * ady;
+
+cdxady = cdx * ady;
+adxcdy = adx * cdy;
+blift = bdx * bdx + bdy * bdy;
+
+adxbdy = adx * bdy;
+bdxady = bdx * ady;
+clift = cdx * cdx + cdy * cdy;
+
+det = alift * ( bdxcdy - cdxbdy )
++ blift * ( cdxady - adxcdy )
++ clift * ( adxbdy - bdxady );
+
+if ( noexact ) {
+return det;
+}
 
-       permanent = ( Absolute( bdxcdy ) + Absolute( cdxbdy ) ) * alift
-                               + ( Absolute( cdxady ) + Absolute( adxcdy ) ) * blift
-                               + ( Absolute( adxbdy ) + Absolute( bdxady ) ) * clift;
-       errbound = iccerrboundA * permanent;
-       if ( ( det > errbound ) || ( -det > errbound ) ) {
-               return det;
-       }
+permanent = ( Absolute( bdxcdy ) + Absolute( cdxbdy )) * alift
++ ( Absolute( cdxady ) + Absolute( adxcdy )) * blift
++ ( Absolute( adxbdy ) + Absolute( bdxady )) * clift;
+errbound = iccerrboundA * permanent;
+if (( det > errbound ) || ( -det > errbound )) {
+return det;
+}
 
-       return incircleadapt( pa, pb, pc, pd, permanent );
+return incircleadapt( pa, pb, pc, pd, permanent );
 }
 
 /**                                                                         **/
@@ -5061,18 +5217,18 @@ point pd;
 /*****************************************************************************/
 
 void triangleinit(){
-       points.maxitems = triangles.maxitems = shelles.maxitems = viri.maxitems =
-                                                                                                                                 badsegments.maxitems = badtriangles.maxitems = splaynodes.maxitems = 0l;
-       points.itembytes = triangles.itembytes = shelles.itembytes = viri.itembytes =
-                                                                                                                                        badsegments.itembytes = badtriangles.itembytes = splaynodes.itembytes = 0;
-       recenttri.tri = (triangle *) NULL;  /* No triangle has been visited yet. */
-       samples = 1;          /* Point location should take at least one sample. */
-       checksegments = 0;    /* There are no segments in the triangulation yet. */
-       incirclecount = counterclockcount = hyperbolacount = 0;
-       circumcentercount = circletopcount = 0;
-       randomseed = 1;
-
-       exactinit();                   /* Initialize exact arithmetic constants. */
+points.maxitems = triangles.maxitems = shelles.maxitems = viri.maxitems =
+badsegments.maxitems = badtriangles.maxitems = splaynodes.maxitems = 0l;
+points.itembytes = triangles.itembytes = shelles.itembytes = viri.itembytes =
+badsegments.itembytes = badtriangles.itembytes = splaynodes.itembytes = 0;
+recenttri.tri = (triangle *) NULL;  /* No triangle has been visited yet. */
+samples = 1;          /* Point location should take at least one sample. */
+checksegments = 0;    /* There are no segments in the triangulation yet. */
+incirclecount = counterclockcount = hyperbolacount = 0;
+circumcentercount = circletopcount = 0;
+randomseed = 1;
+
+exactinit();                   /* Initialize exact arithmetic constants. */
 }
 
 /*****************************************************************************/
@@ -5088,8 +5244,8 @@ void triangleinit(){
 unsigned long randomnation( choices )
 unsigned int choices;
 {
-       randomseed = ( randomseed * 1366l + 150889l ) % 714025l;
-       return randomseed / ( 714025l / choices + 1 );
+randomseed = ( randomseed * 1366l + 150889l ) % 714025l;
+return randomseed / ( 714025l / choices + 1 );
 }
 
 /********* Mesh quality testing routines begin here                  *********/
@@ -5102,89 +5258,90 @@ unsigned int choices;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 void checkmesh(){
-       struct triedge triangleloop;
-       struct triedge oppotri, oppooppotri;
-       point triorg, tridest, triapex;
-       point oppoorg, oppodest;
-       int horrors;
-       int saveexact;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-       /* Temporarily turn on exact arithmetic if it's off. */
-       saveexact = noexact;
-       noexact = 0;
-       if ( !quiet ) {
-               printf( "  Checking consistency of mesh...\n" );
-       }
-       horrors = 0;
-       /* Run through the list of triangles, checking each one. */
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               /* Check all three edges of the triangle. */
-               for ( triangleloop.orient = 0; triangleloop.orient < 3;
-                         triangleloop.orient++ ) {
-                       org( triangleloop, triorg );
-                       dest( triangleloop, tridest );
-                       if ( triangleloop.orient == 0 ) { /* Only test for inversion once. */
-                               /* Test if the triangle is flat or inverted. */
-                               apex( triangleloop, triapex );
-                               if ( counterclockwise( triorg, tridest, triapex ) <= 0.0 ) {
-                                       printf( "  !! !! Inverted " );
-                                       printtriangle( &triangleloop );
-                                       horrors++;
-                               }
-                       }
-                       /* Find the neighboring triangle on this edge. */
-                       sym( triangleloop, oppotri );
-                       if ( oppotri.tri != dummytri ) {
-                               /* Check that the triangle's neighbor knows it's a neighbor. */
-                               sym( oppotri, oppooppotri );
-                               if ( ( triangleloop.tri != oppooppotri.tri )
-                                        || ( triangleloop.orient != oppooppotri.orient ) ) {
-                                       printf( "  !! !! Asymmetric triangle-triangle bond:\n" );
-                                       if ( triangleloop.tri == oppooppotri.tri ) {
-                                               printf( "   (Right triangle, wrong orientation)\n" );
-                                       }
-                                       printf( "    First " );
-                                       printtriangle( &triangleloop );
-                                       printf( "    Second (nonreciprocating) " );
-                                       printtriangle( &oppotri );
-                                       horrors++;
-                               }
-                               /* Check that both triangles agree on the identities */
-                               /*   of their shared vertices.                       */
-                               org( oppotri, oppoorg );
-                               dest( oppotri, oppodest );
-                               if ( ( triorg != oppodest ) || ( tridest != oppoorg ) ) {
-                                       printf( "  !! !! Mismatched edge coordinates between two triangles:\n"
-                                                       );
-                                       printf( "    First mismatched " );
-                                       printtriangle( &triangleloop );
-                                       printf( "    Second mismatched " );
-                                       printtriangle( &oppotri );
-                                       horrors++;
-                               }
-                       }
-               }
-               triangleloop.tri = triangletraverse();
-       }
-       if ( horrors == 0 ) {
-               if ( !quiet ) {
-                       printf( "  In my studied opinion, the mesh appears to be consistent.\n" );
-               }
-       }
-       else if ( horrors == 1 ) {
-               printf( "  !! !! !! !! Precisely one festering wound discovered.\n" );
-       }
-       else {
-               printf( "  !! !! !! !! %d abominations witnessed.\n", horrors );
-       }
-       /* Restore the status of exact arithmetic. */
-       noexact = saveexact;
+struct triedge triangleloop;
+struct triedge oppotri, oppooppotri;
+point triorg, tridest, triapex;
+point oppoorg, oppodest;
+int horrors;
+int saveexact;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+/* Temporarily turn on exact arithmetic if it's off. */
+saveexact = noexact;
+noexact = 0;
+if ( !quiet ) {
+printf( "  Checking consistency of mesh...\n" );
+}
+horrors = 0;
+/* Run through the list of triangles, checking each one. */
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+while ( triangleloop.tri != (triangle *) NULL ) {
+/* Check all three edges of the triangle. */
+for ( triangleloop.orient = 0; triangleloop.orient < 3;
+triangleloop.orient++ ) {
+org( triangleloop, triorg );
+dest( triangleloop, tridest );
+if ( triangleloop.orient == 0 ) { /* Only test for inversion once. */
+/* Test if the triangle is flat or inverted. */
+apex( triangleloop, triapex );
+if ( counterclockwise( triorg, tridest, triapex ) <= 0.0 ) {
+printf( "  !! !! Inverted " );
+printtriangle( &triangleloop );
+horrors++;
+}
+}
+/* Find the neighboring triangle on this edge. */
+sym( triangleloop, oppotri );
+if ( oppotri.tri != dummytri ) {
+/* Check that the triangle's neighbor knows it's a neighbor. */
+sym( oppotri, oppooppotri );
+if (( triangleloop.tri != oppooppotri.tri )
+|| ( triangleloop.orient != oppooppotri.orient )) {
+printf( "  !! !! Asymmetric triangle-triangle bond:\n" );
+if ( triangleloop.tri == oppooppotri.tri ) {
+printf( "   (Right triangle, wrong orientation)\n" );
+}
+printf( "    First " );
+printtriangle( &triangleloop );
+printf( "    Second (nonreciprocating) " );
+printtriangle( &oppotri );
+horrors++;
+}
+/* Check that both triangles agree on the identities */
+/*   of their shared vertices.                       */
+org( oppotri, oppoorg );
+dest( oppotri, oppodest );
+if (( triorg != oppodest ) || ( tridest != oppoorg )) {
+printf( "  !! !! Mismatched edge coordinates between two triangles:\n"
+);
+printf( "    First mismatched " );
+printtriangle( &triangleloop );
+printf( "    Second mismatched " );
+printtriangle( &oppotri );
+horrors++;
+}
+}
+}
+triangleloop.tri = triangletraverse();
+}
+if ( horrors == 0 ) {
+if ( !quiet ) {
+printf( "  In my studied opinion, the mesh appears to be consistent.\n" );
+}
+}
+else if ( horrors == 1 ) {
+printf( "  !! !! !! !! Precisely one festering wound discovered.\n" );
+}
+else {
+printf( "  !! !! !! !! %d abominations witnessed.\n", horrors );
+}
+/* Restore the status of exact arithmetic. */
+noexact = saveexact;
 }
 
 #endif /* not REDUCED */
@@ -5195,81 +5352,82 @@ void checkmesh(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 void checkdelaunay(){
-       struct triedge triangleloop;
-       struct triedge oppotri;
-       struct edge opposhelle;
-       point triorg, tridest, triapex;
-       point oppoapex;
-       int shouldbedelaunay;
-       int horrors;
-       int saveexact;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       /* Temporarily turn on exact arithmetic if it's off. */
-       saveexact = noexact;
-       noexact = 0;
-       if ( !quiet ) {
-               printf( "  Checking Delaunay property of mesh...\n" );
-       }
-       horrors = 0;
-       /* Run through the list of triangles, checking each one. */
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               /* Check all three edges of the triangle. */
-               for ( triangleloop.orient = 0; triangleloop.orient < 3;
-                         triangleloop.orient++ ) {
-                       org( triangleloop, triorg );
-                       dest( triangleloop, tridest );
-                       apex( triangleloop, triapex );
-                       sym( triangleloop, oppotri );
-                       apex( oppotri, oppoapex );
-                       /* Only test that the edge is locally Delaunay if there is an   */
-                       /*   adjoining triangle whose pointer is larger (to ensure that */
-                       /*   each pair isn't tested twice).                             */
-                       shouldbedelaunay = ( oppotri.tri != dummytri )
-                                                          && ( triapex != (point) NULL ) && ( oppoapex != (point) NULL )
-                                                          && ( triangleloop.tri < oppotri.tri );
-                       if ( checksegments && shouldbedelaunay ) {
-                               /* If a shell edge separates the triangles, then the edge is */
-                               /*   constrained, so no local Delaunay test should be done.  */
-                               tspivot( triangleloop, opposhelle );
-                               if ( opposhelle.sh != dummysh ) {
-                                       shouldbedelaunay = 0;
-                               }
-                       }
-                       if ( shouldbedelaunay ) {
-                               if ( incircle( triorg, tridest, triapex, oppoapex ) > 0.0 ) {
-                                       printf( "  !! !! Non-Delaunay pair of triangles:\n" );
-                                       printf( "    First non-Delaunay " );
-                                       printtriangle( &triangleloop );
-                                       printf( "    Second non-Delaunay " );
-                                       printtriangle( &oppotri );
-                                       horrors++;
-                               }
-                       }
-               }
-               triangleloop.tri = triangletraverse();
-       }
-       if ( horrors == 0 ) {
-               if ( !quiet ) {
-                       printf(
-                               "  By virtue of my perceptive intelligence, I declare the mesh Delaunay.\n" );
-               }
-       }
-       else if ( horrors == 1 ) {
-               printf(
-                       "  !! !! !! !! Precisely one terrifying transgression identified.\n" );
-       }
-       else {
-               printf( "  !! !! !! !! %d obscenities viewed with horror.\n", horrors );
-       }
-       /* Restore the status of exact arithmetic. */
-       noexact = saveexact;
+struct triedge triangleloop;
+struct triedge oppotri;
+struct edge opposhelle;
+point triorg, tridest, triapex;
+point oppoapex;
+int shouldbedelaunay;
+int horrors;
+int saveexact;
+triangle ptr;                       /* Temporary variable used by sym(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+/* Temporarily turn on exact arithmetic if it's off. */
+saveexact = noexact;
+noexact = 0;
+if ( !quiet ) {
+printf( "  Checking Delaunay property of mesh...\n" );
+}
+horrors = 0;
+/* Run through the list of triangles, checking each one. */
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+while ( triangleloop.tri != (triangle *) NULL ) {
+/* Check all three edges of the triangle. */
+for ( triangleloop.orient = 0; triangleloop.orient < 3;
+triangleloop.orient++ ) {
+org( triangleloop, triorg );
+dest( triangleloop, tridest );
+apex( triangleloop, triapex );
+sym( triangleloop, oppotri );
+apex( oppotri, oppoapex );
+/* Only test that the edge is locally Delaunay if there is an   */
+/*   adjoining triangle whose pointer is larger (to ensure that */
+/*   each pair isn't tested twice).                             */
+shouldbedelaunay = ( oppotri.tri != dummytri )
+&& ( triapex != (point) NULL ) && ( oppoapex != (point) NULL )
+&& ( triangleloop.tri < oppotri.tri );
+if ( checksegments && shouldbedelaunay ) {
+/* If a shell edge separates the triangles, then the edge is */
+/*   constrained, so no local Delaunay test should be done.  */
+tspivot( triangleloop, opposhelle );
+if ( opposhelle.sh != dummysh ) {
+shouldbedelaunay = 0;
+}
+}
+if ( shouldbedelaunay ) {
+if ( incircle( triorg, tridest, triapex, oppoapex ) > 0.0 ) {
+printf( "  !! !! Non-Delaunay pair of triangles:\n" );
+printf( "    First non-Delaunay " );
+printtriangle( &triangleloop );
+printf( "    Second non-Delaunay " );
+printtriangle( &oppotri );
+horrors++;
+}
+}
+}
+triangleloop.tri = triangletraverse();
+}
+if ( horrors == 0 ) {
+if ( !quiet ) {
+printf(
+"  By virtue of my perceptive intelligence, I declare the mesh Delaunay.\n" );
+}
+}
+else if ( horrors == 1 ) {
+printf(
+"  !! !! !! !! Precisely one terrifying transgression identified.\n" );
+}
+else {
+printf( "  !! !! !! !! %d obscenities viewed with horror.\n", horrors );
+}
+/* Restore the status of exact arithmetic. */
+noexact = saveexact;
 }
 
 #endif /* not REDUCED */
@@ -5284,7 +5442,8 @@ void checkdelaunay(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void enqueuebadtri( instri, angle, insapex, insorg, insdest )
 struct triedge *instri;
@@ -5293,38 +5452,38 @@ point insapex;
 point insorg;
 point insdest;
 {
-       struct badface *newface;
-       int queuenumber;
-
-       if ( verbose > 2 ) {
-               printf( "  Queueing bad triangle:\n" );
-               printf( "    (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", insorg[0],
-                               insorg[1], insdest[0], insdest[1], insapex[0], insapex[1] );
-       }
-       /* Allocate space for the bad triangle. */
-       newface = (struct badface *) poolalloc( &badtriangles );
-       triedgecopy( *instri, newface->badfacetri );
-       newface->key = angle;
-       newface->faceapex = insapex;
-       newface->faceorg = insorg;
-       newface->facedest = insdest;
-       newface->nextface = (struct badface *) NULL;
-       /* Determine the appropriate queue to put the bad triangle into. */
-       if ( angle > 0.6 ) {
-               queuenumber = (int) ( 160.0 * ( angle - 0.6 ) );
-               if ( queuenumber > 63 ) {
-                       queuenumber = 63;
-               }
-       }
-       else {
-               /* It's not a bad angle; put the triangle in the lowest-priority queue. */
-               queuenumber = 0;
-       }
-       /* Add the triangle to the end of a queue. */
-       *queuetail[queuenumber] = newface;
-       /* Maintain a pointer to the NULL pointer at the end of the queue. */
-       queuetail[queuenumber] = &newface->nextface;
-}
+struct badface *newface;
+int queuenumber;
+
+if ( verbose > 2 ) {
+printf( "  Queueing bad triangle:\n" );
+printf( "    (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", insorg[0],
+insorg[1], insdest[0], insdest[1], insapex[0], insapex[1] );
+}
+/* Allocate space for the bad triangle. */
+newface = (struct badface *) poolalloc( &badtriangles );
+triedgecopy( *instri, newface->badfacetri );
+newface->key = angle;
+newface->faceapex = insapex;
+newface->faceorg = insorg;
+newface->facedest = insdest;
+newface->nextface = (struct badface *) NULL;
+/* Determine the appropriate queue to put the bad triangle into. */
+if ( angle > 0.6 ) {
+queuenumber = (int) ( 160.0 * ( angle - 0.6 ));
+if ( queuenumber > 63 ) {
+queuenumber = 63;
+}
+}
+else {
+/* It's not a bad angle; put the triangle in the lowest-priority queue. */
+queuenumber = 0;
+}
+/* Add the triangle to the end of a queue. */
+*queuetail[queuenumber] = newface;
+/* Maintain a pointer to the NULL pointer at the end of the queue. */
+queuetail[queuenumber] = &newface->nextface;
+}
 
 #endif /* not CDT_ONLY */
 
@@ -5334,26 +5493,27 @@ point insdest;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 struct badface *dequeuebadtri(){
-       struct badface *result;
-       int queuenumber;
-
-       /* Look for a nonempty queue. */
-       for ( queuenumber = 63; queuenumber >= 0; queuenumber-- ) {
-               result = queuefront[queuenumber];
-               if ( result != (struct badface *) NULL ) {
-                       /* Remove the triangle from the queue. */
-                       queuefront[queuenumber] = result->nextface;
-                       /* Maintain a pointer to the NULL pointer at the end of the queue. */
-                       if ( queuefront[queuenumber] == (struct badface *) NULL ) {
-                               queuetail[queuenumber] = &queuefront[queuenumber];
-                       }
-                       return result;
-               }
-       }
-       return (struct badface *) NULL;
+struct badface *result;
+int queuenumber;
+
+/* Look for a nonempty queue. */
+for ( queuenumber = 63; queuenumber >= 0; queuenumber-- ) {
+result = queuefront[queuenumber];
+if ( result != (struct badface *) NULL ) {
+/* Remove the triangle from the queue. */
+queuefront[queuenumber] = result->nextface;
+/* Maintain a pointer to the NULL pointer at the end of the queue. */
+if ( queuefront[queuenumber] == (struct badface *) NULL ) {
+queuetail[queuenumber] = &queuefront[queuenumber];
+}
+return result;
+}
+}
+return (struct badface *) NULL;
 }
 
 #endif /* not CDT_ONLY */
@@ -5371,75 +5531,76 @@ struct badface *dequeuebadtri(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 int checkedge4encroach( testedge )
 struct edge *testedge;
 {
-       struct triedge neighbortri;
-       struct edge testsym;
-       struct edge *badedge;
-       int addtolist;
-       int sides;
-       point eorg, edest, eapex;
-       triangle ptr;                   /* Temporary variable used by stpivot(). */
-
-       addtolist = 0;
-       sides = 0;
-
-       sorg( *testedge, eorg );
-       sdest( *testedge, edest );
-       /* Check one neighbor of the shell edge. */
-       stpivot( *testedge, neighbortri );
-       /* Does the neighbor exist, or is this a boundary edge? */
-       if ( neighbortri.tri != dummytri ) {
-               sides++;
-               /* Find a vertex opposite this edge. */
-               apex( neighbortri, eapex );
-               /* Check whether the vertex is inside the diametral circle of the  */
-               /*   shell edge.  Pythagoras' Theorem is used to check whether the */
-               /*   angle at the vertex is greater than 90 degrees.               */
-               if ( eapex[0] * ( eorg[0] + edest[0] ) + eapex[1] * ( eorg[1] + edest[1] ) >
-                        eapex[0] * eapex[0] + eorg[0] * edest[0] +
-                        eapex[1] * eapex[1] + eorg[1] * edest[1] ) {
-                       addtolist = 1;
-               }
-       }
-       /* Check the other neighbor of the shell edge. */
-       ssym( *testedge, testsym );
-       stpivot( testsym, neighbortri );
-       /* Does the neighbor exist, or is this a boundary edge? */
-       if ( neighbortri.tri != dummytri ) {
-               sides++;
-               /* Find the other vertex opposite this edge. */
-               apex( neighbortri, eapex );
-               /* Check whether the vertex is inside the diametral circle of the  */
-               /*   shell edge.  Pythagoras' Theorem is used to check whether the */
-               /*   angle at the vertex is greater than 90 degrees.               */
-               if ( eapex[0] * ( eorg[0] + edest[0] ) +
-                        eapex[1] * ( eorg[1] + edest[1] ) >
-                        eapex[0] * eapex[0] + eorg[0] * edest[0] +
-                        eapex[1] * eapex[1] + eorg[1] * edest[1] ) {
-                       addtolist += 2;
-               }
-       }
-
-       if ( addtolist && ( !nobisect || ( ( nobisect == 1 ) && ( sides == 2 ) ) ) ) {
-               if ( verbose > 2 ) {
-                       printf( "  Queueing encroached segment (%.12g, %.12g) (%.12g, %.12g).\n",
-                                       eorg[0], eorg[1], edest[0], edest[1] );
-               }
-               /* Add the shell edge to the list of encroached segments. */
-               /*   Be sure to get the orientation right.                */
-               badedge = (struct edge *) poolalloc( &badsegments );
-               if ( addtolist == 1 ) {
-                       shellecopy( *testedge, *badedge );
-               }
-               else {
-                       shellecopy( testsym, *badedge );
-               }
-       }
-       return addtolist;
+struct triedge neighbortri;
+struct edge testsym;
+struct edge *badedge;
+int addtolist;
+int sides;
+point eorg, edest, eapex;
+triangle ptr;                   /* Temporary variable used by stpivot(). */
+
+addtolist = 0;
+sides = 0;
+
+sorg( *testedge, eorg );
+sdest( *testedge, edest );
+/* Check one neighbor of the shell edge. */
+stpivot( *testedge, neighbortri );
+/* Does the neighbor exist, or is this a boundary edge? */
+if ( neighbortri.tri != dummytri ) {
+sides++;
+/* Find a vertex opposite this edge. */
+apex( neighbortri, eapex );
+/* Check whether the vertex is inside the diametral circle of the  */
+/*   shell edge.  Pythagoras' Theorem is used to check whether the */
+/*   angle at the vertex is greater than 90 degrees.               */
+if ( eapex[0] * ( eorg[0] + edest[0] ) + eapex[1] * ( eorg[1] + edest[1] ) >
+eapex[0] * eapex[0] + eorg[0] * edest[0] +
+eapex[1] * eapex[1] + eorg[1] * edest[1] ) {
+addtolist = 1;
+}
+}
+/* Check the other neighbor of the shell edge. */
+ssym( *testedge, testsym );
+stpivot( testsym, neighbortri );
+/* Does the neighbor exist, or is this a boundary edge? */
+if ( neighbortri.tri != dummytri ) {
+sides++;
+/* Find the other vertex opposite this edge. */
+apex( neighbortri, eapex );
+/* Check whether the vertex is inside the diametral circle of the  */
+/*   shell edge.  Pythagoras' Theorem is used to check whether the */
+/*   angle at the vertex is greater than 90 degrees.               */
+if ( eapex[0] * ( eorg[0] + edest[0] ) +
+eapex[1] * ( eorg[1] + edest[1] ) >
+eapex[0] * eapex[0] + eorg[0] * edest[0] +
+eapex[1] * eapex[1] + eorg[1] * edest[1] ) {
+addtolist += 2;
+}
+}
+
+if ( addtolist && ( !nobisect || (( nobisect == 1 ) && ( sides == 2 )))) {
+if ( verbose > 2 ) {
+printf( "  Queueing encroached segment (%.12g, %.12g) (%.12g, %.12g).\n",
+eorg[0], eorg[1], edest[0], edest[1] );
+}
+/* Add the shell edge to the list of encroached segments. */
+/*   Be sure to get the orientation right.                */
+badedge = (struct edge *) poolalloc( &badsegments );
+if ( addtolist == 1 ) {
+shellecopy( *testedge, *badedge );
+}
+else {
+shellecopy( testsym, *badedge );
+}
+}
+return addtolist;
 }
 
 #endif /* not CDT_ONLY */
@@ -5454,112 +5615,113 @@ struct edge *testedge;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void testtriangle( testtri )
 struct triedge *testtri;
 {
-       struct triedge sametesttri;
-       struct edge edge1, edge2;
-       point torg, tdest, tapex;
-       point anglevertex;
-       REAL dxod, dyod, dxda, dyda, dxao, dyao;
-       REAL dxod2, dyod2, dxda2, dyda2, dxao2, dyao2;
-       REAL apexlen, orglen, destlen;
-       REAL angle;
-       REAL area;
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       org( *testtri, torg );
-       dest( *testtri, tdest );
-       apex( *testtri, tapex );
-       dxod = torg[0] - tdest[0];
-       dyod = torg[1] - tdest[1];
-       dxda = tdest[0] - tapex[0];
-       dyda = tdest[1] - tapex[1];
-       dxao = tapex[0] - torg[0];
-       dyao = tapex[1] - torg[1];
-       dxod2 = dxod * dxod;
-       dyod2 = dyod * dyod;
-       dxda2 = dxda * dxda;
-       dyda2 = dyda * dyda;
-       dxao2 = dxao * dxao;
-       dyao2 = dyao * dyao;
-       /* Find the lengths of the triangle's three edges. */
-       apexlen = dxod2 + dyod2;
-       orglen = dxda2 + dyda2;
-       destlen = dxao2 + dyao2;
-       if ( ( apexlen < orglen ) && ( apexlen < destlen ) ) {
-               /* The edge opposite the apex is shortest. */
-               /* Find the square of the cosine of the angle at the apex. */
-               angle = dxda * dxao + dyda * dyao;
-               angle = angle * angle / ( orglen * destlen );
-               anglevertex = tapex;
-               lnext( *testtri, sametesttri );
-               tspivot( sametesttri, edge1 );
-               lnextself( sametesttri );
-               tspivot( sametesttri, edge2 );
-       }
-       else if ( orglen < destlen ) {
-               /* The edge opposite the origin is shortest. */
-               /* Find the square of the cosine of the angle at the origin. */
-               angle = dxod * dxao + dyod * dyao;
-               angle = angle * angle / ( apexlen * destlen );
-               anglevertex = torg;
-               tspivot( *testtri, edge1 );
-               lprev( *testtri, sametesttri );
-               tspivot( sametesttri, edge2 );
-       }
-       else {
-               /* The edge opposite the destination is shortest. */
-               /* Find the square of the cosine of the angle at the destination. */
-               angle = dxod * dxda + dyod * dyda;
-               angle = angle * angle / ( apexlen * orglen );
-               anglevertex = tdest;
-               tspivot( *testtri, edge1 );
-               lnext( *testtri, sametesttri );
-               tspivot( sametesttri, edge2 );
-       }
-       /* Check if both edges that form the angle are segments. */
-       if ( ( edge1.sh != dummysh ) && ( edge2.sh != dummysh ) ) {
-               /* The angle is a segment intersection. */
-               if ( ( angle > 0.9924 ) && !quiet ) {          /* Roughly 5 degrees. */
-                       if ( angle > 1.0 ) {
-                               /* Beware of a floating exception in acos(). */
-                               angle = 1.0;
-                       }
-                       /* Find the actual angle in degrees, for printing. */
-                       angle = acos( sqrt( angle ) ) * ( 180.0 / PI );
-                       printf(
-                               "Warning:  Small angle (%.4g degrees) between segments at point\n",
-                               angle );
-                       printf( "  (%.12g, %.12g)\n", anglevertex[0], anglevertex[1] );
-               }
-               /* Don't add this bad triangle to the list; there's nothing that */
-               /*   can be done about a small angle between two segments.       */
-               angle = 0.0;
-       }
-       /* Check whether the angle is smaller than permitted. */
-       if ( angle > goodangle ) {
-               /* Add this triangle to the list of bad triangles. */
-               enqueuebadtri( testtri, angle, tapex, torg, tdest );
-               return;
-       }
-       if ( vararea || fixedarea ) {
-               /* Check whether the area is larger than permitted. */
-               area = 0.5 * ( dxod * dyda - dyod * dxda );
-               if ( fixedarea && ( area > maxarea ) ) {
-                       /* Add this triangle to the list of bad triangles. */
-                       enqueuebadtri( testtri, angle, tapex, torg, tdest );
-               }
-               else if ( vararea ) {
-                       /* Nonpositive area constraints are treated as unconstrained. */
-                       if ( ( area > areabound( *testtri ) ) && ( areabound( *testtri ) > 0.0 ) ) {
-                               /* Add this triangle to the list of bad triangles. */
-                               enqueuebadtri( testtri, angle, tapex, torg, tdest );
-                       }
-               }
-       }
+struct triedge sametesttri;
+struct edge edge1, edge2;
+point torg, tdest, tapex;
+point anglevertex;
+REAL dxod, dyod, dxda, dyda, dxao, dyao;
+REAL dxod2, dyod2, dxda2, dyda2, dxao2, dyao2;
+REAL apexlen, orglen, destlen;
+REAL angle;
+REAL area;
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+org( *testtri, torg );
+dest( *testtri, tdest );
+apex( *testtri, tapex );
+dxod = torg[0] - tdest[0];
+dyod = torg[1] - tdest[1];
+dxda = tdest[0] - tapex[0];
+dyda = tdest[1] - tapex[1];
+dxao = tapex[0] - torg[0];
+dyao = tapex[1] - torg[1];
+dxod2 = dxod * dxod;
+dyod2 = dyod * dyod;
+dxda2 = dxda * dxda;
+dyda2 = dyda * dyda;
+dxao2 = dxao * dxao;
+dyao2 = dyao * dyao;
+/* Find the lengths of the triangle's three edges. */
+apexlen = dxod2 + dyod2;
+orglen = dxda2 + dyda2;
+destlen = dxao2 + dyao2;
+if (( apexlen < orglen ) && ( apexlen < destlen )) {
+/* The edge opposite the apex is shortest. */
+/* Find the square of the cosine of the angle at the apex. */
+angle = dxda * dxao + dyda * dyao;
+angle = angle * angle / ( orglen * destlen );
+anglevertex = tapex;
+lnext( *testtri, sametesttri );
+tspivot( sametesttri, edge1 );
+lnextself( sametesttri );
+tspivot( sametesttri, edge2 );
+}
+else if ( orglen < destlen ) {
+/* The edge opposite the origin is shortest. */
+/* Find the square of the cosine of the angle at the origin. */
+angle = dxod * dxao + dyod * dyao;
+angle = angle * angle / ( apexlen * destlen );
+anglevertex = torg;
+tspivot( *testtri, edge1 );
+lprev( *testtri, sametesttri );
+tspivot( sametesttri, edge2 );
+}
+else {
+/* The edge opposite the destination is shortest. */
+/* Find the square of the cosine of the angle at the destination. */
+angle = dxod * dxda + dyod * dyda;
+angle = angle * angle / ( apexlen * orglen );
+anglevertex = tdest;
+tspivot( *testtri, edge1 );
+lnext( *testtri, sametesttri );
+tspivot( sametesttri, edge2 );
+}
+/* Check if both edges that form the angle are segments. */
+if (( edge1.sh != dummysh ) && ( edge2.sh != dummysh )) {
+/* The angle is a segment intersection. */
+if (( angle > 0.9924 ) && !quiet ) {          /* Roughly 5 degrees. */
+if ( angle > 1.0 ) {
+/* Beware of a floating exception in acos(). */
+angle = 1.0;
+}
+/* Find the actual angle in degrees, for printing. */
+angle = acos( sqrt( angle )) * ( 180.0 / PI );
+printf(
+"Warning:  Small angle (%.4g degrees) between segments at point\n",
+angle );
+printf( "  (%.12g, %.12g)\n", anglevertex[0], anglevertex[1] );
+}
+/* Don't add this bad triangle to the list; there's nothing that */
+/*   can be done about a small angle between two segments.       */
+angle = 0.0;
+}
+/* Check whether the angle is smaller than permitted. */
+if ( angle > goodangle ) {
+/* Add this triangle to the list of bad triangles. */
+enqueuebadtri( testtri, angle, tapex, torg, tdest );
+return;
+}
+if ( vararea || fixedarea ) {
+/* Check whether the area is larger than permitted. */
+area = 0.5 * ( dxod * dyda - dyod * dxda );
+if ( fixedarea && ( area > maxarea )) {
+/* Add this triangle to the list of bad triangles. */
+enqueuebadtri( testtri, angle, tapex, torg, tdest );
+}
+else if ( vararea ) {
+/* Nonpositive area constraints are treated as unconstrained. */
+if (( area > areabound( *testtri )) && ( areabound( *testtri ) > 0.0 )) {
+/* Add this triangle to the list of bad triangles. */
+enqueuebadtri( testtri, angle, tapex, torg, tdest );
+}
+}
+}
 }
 
 #endif /* not CDT_ONLY */
@@ -5586,23 +5748,23 @@ struct triedge *testtri;
 /*****************************************************************************/
 
 void makepointmap(){
-       struct triedge triangleloop;
-       point triorg;
+struct triedge triangleloop;
+point triorg;
 
-       if ( verbose ) {
-               printf( "    Constructing mapping from points to triangles.\n" );
-       }
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               /* Check all three points of the triangle. */
-               for ( triangleloop.orient = 0; triangleloop.orient < 3;
-                         triangleloop.orient++ ) {
-                       org( triangleloop, triorg );
-                       setpoint2tri( triorg, encode( triangleloop ) );
-               }
-               triangleloop.tri = triangletraverse();
-       }
+if ( verbose ) {
+printf( "    Constructing mapping from points to triangles.\n" );
+}
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+while ( triangleloop.tri != (triangle *) NULL ) {
+/* Check all three points of the triangle. */
+for ( triangleloop.orient = 0; triangleloop.orient < 3;
+triangleloop.orient++ ) {
+org( triangleloop, triorg );
+setpoint2tri( triorg, encode( triangleloop ));
+}
+triangleloop.tri = triangletraverse();
+}
 }
 
 /*****************************************************************************/
@@ -5673,103 +5835,103 @@ enum locateresult preciselocate( searchpoint, searchtri )
 point searchpoint;
 struct triedge *searchtri;
 {
-       struct triedge backtracktri;
-       point forg, fdest, fapex;
-       point swappoint;
-       REAL orgorient, destorient;
-       int moveleft;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-       if ( verbose > 2 ) {
-               printf( "  Searching for point (%.12g, %.12g).\n",
-                               searchpoint[0], searchpoint[1] );
-       }
-       /* Where are we? */
-       org( *searchtri, forg );
-       dest( *searchtri, fdest );
-       apex( *searchtri, fapex );
-       while ( 1 ) {
-               if ( verbose > 2 ) {
-                       printf( "    At (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
-                                       forg[0], forg[1], fdest[0], fdest[1], fapex[0], fapex[1] );
-               }
-               /* Check whether the apex is the point we seek. */
-               if ( ( fapex[0] == searchpoint[0] ) && ( fapex[1] == searchpoint[1] ) ) {
-                       lprevself( *searchtri );
-                       return ONVERTEX;
-               }
-               /* Does the point lie on the other side of the line defined by the */
-               /*   triangle edge opposite the triangle's destination?            */
-               destorient = counterclockwise( forg, fapex, searchpoint );
-               /* Does the point lie on the other side of the line defined by the */
-               /*   triangle edge opposite the triangle's origin?                 */
-               orgorient = counterclockwise( fapex, fdest, searchpoint );
-               if ( destorient > 0.0 ) {
-                       if ( orgorient > 0.0 ) {
-                               /* Move left if the inner product of (fapex - searchpoint) and  */
-                               /*   (fdest - forg) is positive.  This is equivalent to drawing */
-                               /*   a line perpendicular to the line (forg, fdest) passing     */
-                               /*   through `fapex', and determining which side of this line   */
-                               /*   `searchpoint' falls on.                                    */
-                               moveleft = ( fapex[0] - searchpoint[0] ) * ( fdest[0] - forg[0] ) +
-                                                  ( fapex[1] - searchpoint[1] ) * ( fdest[1] - forg[1] ) > 0.0;
-                       }
-                       else {
-                               moveleft = 1;
-                       }
-               }
-               else {
-                       if ( orgorient > 0.0 ) {
-                               moveleft = 0;
-                       }
-                       else {
-                               /* The point we seek must be on the boundary of or inside this */
-                               /*   triangle.                                                 */
-                               if ( destorient == 0.0 ) {
-                                       lprevself( *searchtri );
-                                       return ONEDGE;
-                               }
-                               if ( orgorient == 0.0 ) {
-                                       lnextself( *searchtri );
-                                       return ONEDGE;
-                               }
-                               return INTRIANGLE;
-                       }
-               }
-
-               /* Move to another triangle.  Leave a trace `backtracktri' in case */
-               /*   floating-point roundoff or some such bogey causes us to walk  */
-               /*   off a boundary of the triangulation.  We can just bounce off  */
-               /*   the boundary as if it were an elastic band.                   */
-               if ( moveleft ) {
-                       lprev( *searchtri, backtracktri );
-                       fdest = fapex;
-               }
-               else {
-                       lnext( *searchtri, backtracktri );
-                       forg = fapex;
-               }
-               sym( backtracktri, *searchtri );
-
-               /* Check for walking off the edge. */
-               if ( searchtri->tri == dummytri ) {
-                       /* Turn around. */
-                       triedgecopy( backtracktri, *searchtri );
-                       swappoint = forg;
-                       forg = fdest;
-                       fdest = swappoint;
-                       apex( *searchtri, fapex );
-                       /* Check if the point really is beyond the triangulation boundary. */
-                       destorient = counterclockwise( forg, fapex, searchpoint );
-                       orgorient = counterclockwise( fapex, fdest, searchpoint );
-                       if ( ( orgorient < 0.0 ) && ( destorient < 0.0 ) ) {
-                               return OUTSIDE;
-                       }
-               }
-               else {
-                       apex( *searchtri, fapex );
-               }
-       }
+struct triedge backtracktri;
+point forg, fdest, fapex;
+point swappoint;
+REAL orgorient, destorient;
+int moveleft;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+if ( verbose > 2 ) {
+printf( "  Searching for point (%.12g, %.12g).\n",
+searchpoint[0], searchpoint[1] );
+}
+/* Where are we? */
+org( *searchtri, forg );
+dest( *searchtri, fdest );
+apex( *searchtri, fapex );
+while ( 1 ) {
+if ( verbose > 2 ) {
+printf( "    At (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
+forg[0], forg[1], fdest[0], fdest[1], fapex[0], fapex[1] );
+}
+/* Check whether the apex is the point we seek. */
+if (( fapex[0] == searchpoint[0] ) && ( fapex[1] == searchpoint[1] )) {
+lprevself( *searchtri );
+return ONVERTEX;
+}
+/* Does the point lie on the other side of the line defined by the */
+/*   triangle edge opposite the triangle's destination?            */
+destorient = counterclockwise( forg, fapex, searchpoint );
+/* Does the point lie on the other side of the line defined by the */
+/*   triangle edge opposite the triangle's origin?                 */
+orgorient = counterclockwise( fapex, fdest, searchpoint );
+if ( destorient > 0.0 ) {
+if ( orgorient > 0.0 ) {
+/* Move left if the inner product of (fapex - searchpoint) and  */
+/*   (fdest - forg) is positive.  This is equivalent to drawing */
+/*   a line perpendicular to the line (forg, fdest) passing     */
+/*   through `fapex', and determining which side of this line   */
+/*   `searchpoint' falls on.                                    */
+moveleft = ( fapex[0] - searchpoint[0] ) * ( fdest[0] - forg[0] ) +
+( fapex[1] - searchpoint[1] ) * ( fdest[1] - forg[1] ) > 0.0;
+}
+else {
+moveleft = 1;
+}
+}
+else {
+if ( orgorient > 0.0 ) {
+moveleft = 0;
+}
+else {
+/* The point we seek must be on the boundary of or inside this */
+/*   triangle.                                                 */
+if ( destorient == 0.0 ) {
+lprevself( *searchtri );
+return ONEDGE;
+}
+if ( orgorient == 0.0 ) {
+lnextself( *searchtri );
+return ONEDGE;
+}
+return INTRIANGLE;
+}
+}
+
+/* Move to another triangle.  Leave a trace `backtracktri' in case */
+/*   floating-point roundoff or some such bogey causes us to walk  */
+/*   off a boundary of the triangulation.  We can just bounce off  */
+/*   the boundary as if it were an elastic band.                   */
+if ( moveleft ) {
+lprev( *searchtri, backtracktri );
+fdest = fapex;
+}
+else {
+lnext( *searchtri, backtracktri );
+forg = fapex;
+}
+sym( backtracktri, *searchtri );
+
+/* Check for walking off the edge. */
+if ( searchtri->tri == dummytri ) {
+/* Turn around. */
+triedgecopy( backtracktri, *searchtri );
+swappoint = forg;
+forg = fdest;
+fdest = swappoint;
+apex( *searchtri, fapex );
+/* Check if the point really is beyond the triangulation boundary. */
+destorient = counterclockwise( forg, fapex, searchpoint );
+orgorient = counterclockwise( fapex, fdest, searchpoint );
+if (( orgorient < 0.0 ) && ( destorient < 0.0 )) {
+return OUTSIDE;
+}
+}
+else {
+apex( *searchtri, fapex );
+}
+}
 }
 
 /*****************************************************************************/
@@ -5812,121 +5974,121 @@ enum locateresult locate( searchpoint, searchtri )
 point searchpoint;
 struct triedge *searchtri;
 {
-       VOID **sampleblock;
-       triangle *firsttri;
-       struct triedge sampletri;
-       point torg, tdest;
-       unsigned long alignptr;
-       REAL searchdist, dist;
-       REAL ahead;
-       long sampleblocks, samplesperblock, samplenum;
-       long triblocks;
-       long i, j;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-       if ( verbose > 2 ) {
-               printf( "  Randomly sampling for a triangle near point (%.12g, %.12g).\n",
-                               searchpoint[0], searchpoint[1] );
-       }
-       /* Record the distance from the suggested starting triangle to the */
-       /*   point we seek.                                                */
-       org( *searchtri, torg );
-       searchdist = ( searchpoint[0] - torg[0] ) * ( searchpoint[0] - torg[0] )
-                                + ( searchpoint[1] - torg[1] ) * ( searchpoint[1] - torg[1] );
-       if ( verbose > 2 ) {
-               printf( "    Boundary triangle has origin (%.12g, %.12g).\n",
-                               torg[0], torg[1] );
-       }
-
-       /* If a recently encountered triangle has been recorded and has not been */
-       /*   deallocated, test it as a good starting point.                      */
-       if ( recenttri.tri != (triangle *) NULL ) {
-               if ( recenttri.tri[3] != (triangle) NULL ) {
-                       org( recenttri, torg );
-                       if ( ( torg[0] == searchpoint[0] ) && ( torg[1] == searchpoint[1] ) ) {
-                               triedgecopy( recenttri, *searchtri );
-                               return ONVERTEX;
-                       }
-                       dist = ( searchpoint[0] - torg[0] ) * ( searchpoint[0] - torg[0] )
-                                  + ( searchpoint[1] - torg[1] ) * ( searchpoint[1] - torg[1] );
-                       if ( dist < searchdist ) {
-                               triedgecopy( recenttri, *searchtri );
-                               searchdist = dist;
-                               if ( verbose > 2 ) {
-                                       printf( "    Choosing recent triangle with origin (%.12g, %.12g).\n",
-                                                       torg[0], torg[1] );
-                               }
-                       }
-               }
-       }
-
-       /* The number of random samples taken is proportional to the cube root of */
-       /*   the number of triangles in the mesh.  The next bit of code assumes   */
-       /*   that the number of triangles increases monotonically.                */
-       while ( SAMPLEFACTOR * samples * samples * samples < triangles.items ) {
-               samples++;
-       }
-       triblocks = ( triangles.maxitems + TRIPERBLOCK - 1 ) / TRIPERBLOCK;
-       samplesperblock = 1 + ( samples / triblocks );
-       sampleblocks = samples / samplesperblock;
-       sampleblock = triangles.firstblock;
-       sampletri.orient = 0;
-       for ( i = 0; i < sampleblocks; i++ ) {
-               alignptr = (unsigned long) ( sampleblock + 1 );
-               firsttri = (triangle *) ( alignptr + (unsigned long) triangles.alignbytes
-                                                                 - ( alignptr % (unsigned long) triangles.alignbytes ) );
-               for ( j = 0; j < samplesperblock; j++ ) {
-                       if ( i == triblocks - 1 ) {
-                               samplenum = randomnation( (int)
-                                                                                 ( triangles.maxitems - ( i * TRIPERBLOCK ) ) );
-                       }
-                       else {
-                               samplenum = randomnation( TRIPERBLOCK );
-                       }
-                       sampletri.tri = (triangle *)
-                                                       ( firsttri + ( samplenum * triangles.itemwords ) );
-                       if ( sampletri.tri[3] != (triangle) NULL ) {
-                               org( sampletri, torg );
-                               dist = ( searchpoint[0] - torg[0] ) * ( searchpoint[0] - torg[0] )
-                                          + ( searchpoint[1] - torg[1] ) * ( searchpoint[1] - torg[1] );
-                               if ( dist < searchdist ) {
-                                       triedgecopy( sampletri, *searchtri );
-                                       searchdist = dist;
-                                       if ( verbose > 2 ) {
-                                               printf( "    Choosing triangle with origin (%.12g, %.12g).\n",
-                                                               torg[0], torg[1] );
-                                       }
-                               }
-                       }
-               }
-               sampleblock = (VOID **) *sampleblock;
-       }
-       /* Where are we? */
-       org( *searchtri, torg );
-       dest( *searchtri, tdest );
-       /* Check the starting triangle's vertices. */
-       if ( ( torg[0] == searchpoint[0] ) && ( torg[1] == searchpoint[1] ) ) {
-               return ONVERTEX;
-       }
-       if ( ( tdest[0] == searchpoint[0] ) && ( tdest[1] == searchpoint[1] ) ) {
-               lnextself( *searchtri );
-               return ONVERTEX;
-       }
-       /* Orient `searchtri' to fit the preconditions of calling preciselocate(). */
-       ahead = counterclockwise( torg, tdest, searchpoint );
-       if ( ahead < 0.0 ) {
-               /* Turn around so that `searchpoint' is to the left of the */
-               /*   edge specified by `searchtri'.                        */
-               symself( *searchtri );
-       }
-       else if ( ahead == 0.0 ) {
-               /* Check if `searchpoint' is between `torg' and `tdest'. */
-               if ( ( ( torg[0] < searchpoint[0] ) == ( searchpoint[0] < tdest[0] ) )
-                        && ( ( torg[1] < searchpoint[1] ) == ( searchpoint[1] < tdest[1] ) ) ) {
-                       return ONEDGE;
-               }
-       }
-       return preciselocate( searchpoint, searchtri );
+VOID **sampleblock;
+triangle *firsttri;
+struct triedge sampletri;
+point torg, tdest;
+unsigned long alignptr;
+REAL searchdist, dist;
+REAL ahead;
+long sampleblocks, samplesperblock, samplenum;
+long triblocks;
+long i, j;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+if ( verbose > 2 ) {
+printf( "  Randomly sampling for a triangle near point (%.12g, %.12g).\n",
+searchpoint[0], searchpoint[1] );
+}
+/* Record the distance from the suggested starting triangle to the */
+/*   point we seek.                                                */
+org( *searchtri, torg );
+searchdist = ( searchpoint[0] - torg[0] ) * ( searchpoint[0] - torg[0] )
++ ( searchpoint[1] - torg[1] ) * ( searchpoint[1] - torg[1] );
+if ( verbose > 2 ) {
+printf( "    Boundary triangle has origin (%.12g, %.12g).\n",
+torg[0], torg[1] );
+}
+
+/* If a recently encountered triangle has been recorded and has not been */
+/*   deallocated, test it as a good starting point.                      */
+if ( recenttri.tri != (triangle *) NULL ) {
+if ( recenttri.tri[3] != (triangle) NULL ) {
+org( recenttri, torg );
+if (( torg[0] == searchpoint[0] ) && ( torg[1] == searchpoint[1] )) {
+triedgecopy( recenttri, *searchtri );
+return ONVERTEX;
+}
+dist = ( searchpoint[0] - torg[0] ) * ( searchpoint[0] - torg[0] )
++ ( searchpoint[1] - torg[1] ) * ( searchpoint[1] - torg[1] );
+if ( dist < searchdist ) {
+triedgecopy( recenttri, *searchtri );
+searchdist = dist;
+if ( verbose > 2 ) {
+printf( "    Choosing recent triangle with origin (%.12g, %.12g).\n",
+torg[0], torg[1] );
+}
+}
+}
+}
+
+/* The number of random samples taken is proportional to the cube root of */
+/*   the number of triangles in the mesh.  The next bit of code assumes   */
+/*   that the number of triangles increases monotonically.                */
+while ( SAMPLEFACTOR * samples * samples * samples < triangles.items ) {
+samples++;
+}
+triblocks = ( triangles.maxitems + TRIPERBLOCK - 1 ) / TRIPERBLOCK;
+samplesperblock = 1 + ( samples / triblocks );
+sampleblocks = samples / samplesperblock;
+sampleblock = triangles.firstblock;
+sampletri.orient = 0;
+for ( i = 0; i < sampleblocks; i++ ) {
+alignptr = (unsigned long) ( sampleblock + 1 );
+firsttri = (triangle *) ( alignptr + (unsigned long) triangles.alignbytes
+- ( alignptr % (unsigned long) triangles.alignbytes ));
+for ( j = 0; j < samplesperblock; j++ ) {
+if ( i == triblocks - 1 ) {
+samplenum = randomnation((int)
+( triangles.maxitems - ( i * TRIPERBLOCK )));
+}
+else {
+samplenum = randomnation( TRIPERBLOCK );
+}
+sampletri.tri = (triangle *)
+( firsttri + ( samplenum * triangles.itemwords ));
+if ( sampletri.tri[3] != (triangle) NULL ) {
+org( sampletri, torg );
+dist = ( searchpoint[0] - torg[0] ) * ( searchpoint[0] - torg[0] )
++ ( searchpoint[1] - torg[1] ) * ( searchpoint[1] - torg[1] );
+if ( dist < searchdist ) {
+triedgecopy( sampletri, *searchtri );
+searchdist = dist;
+if ( verbose > 2 ) {
+printf( "    Choosing triangle with origin (%.12g, %.12g).\n",
+torg[0], torg[1] );
+}
+}
+}
+}
+sampleblock = (VOID **) *sampleblock;
+}
+/* Where are we? */
+org( *searchtri, torg );
+dest( *searchtri, tdest );
+/* Check the starting triangle's vertices. */
+if (( torg[0] == searchpoint[0] ) && ( torg[1] == searchpoint[1] )) {
+return ONVERTEX;
+}
+if (( tdest[0] == searchpoint[0] ) && ( tdest[1] == searchpoint[1] )) {
+lnextself( *searchtri );
+return ONVERTEX;
+}
+/* Orient `searchtri' to fit the preconditions of calling preciselocate(). */
+ahead = counterclockwise( torg, tdest, searchpoint );
+if ( ahead < 0.0 ) {
+/* Turn around so that `searchpoint' is to the left of the */
+/*   edge specified by `searchtri'.                        */
+symself( *searchtri );
+}
+else if ( ahead == 0.0 ) {
+/* Check if `searchpoint' is between `torg' and `tdest'. */
+if ((( torg[0] < searchpoint[0] ) == ( searchpoint[0] < tdest[0] ))
+&& (( torg[1] < searchpoint[1] ) == ( searchpoint[1] < tdest[1] ))) {
+return ONEDGE;
+}
+}
+return preciselocate( searchpoint, searchtri );
 }
 
 /**                                                                         **/
@@ -5952,47 +6114,47 @@ void insertshelle( tri, shellemark )
 struct triedge *tri;          /* Edge at which to insert the new shell edge. */
 int shellemark;                            /* Marker for the new shell edge. */
 {
-       struct triedge oppotri;
-       struct edge newshelle;
-       point triorg, tridest;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       /* Mark points if possible. */
-       org( *tri, triorg );
-       dest( *tri, tridest );
-       if ( pointmark( triorg ) == 0 ) {
-               setpointmark( triorg, shellemark );
-       }
-       if ( pointmark( tridest ) == 0 ) {
-               setpointmark( tridest, shellemark );
-       }
-       /* Check if there's already a shell edge here. */
-       tspivot( *tri, newshelle );
-       if ( newshelle.sh == dummysh ) {
-               /* Make new shell edge and initialize its vertices. */
-               makeshelle( &newshelle );
-               setsorg( newshelle, tridest );
-               setsdest( newshelle, triorg );
-               /* Bond new shell edge to the two triangles it is sandwiched between. */
-               /*   Note that the facing triangle `oppotri' might be equal to        */
-               /*   `dummytri' (outer space), but the new shell edge is bonded to it */
-               /*   all the same.                                                    */
-               tsbond( *tri, newshelle );
-               sym( *tri, oppotri );
-               ssymself( newshelle );
-               tsbond( oppotri, newshelle );
-               setmark( newshelle, shellemark );
-               if ( verbose > 2 ) {
-                       printf( "  Inserting new " );
-                       printshelle( &newshelle );
-               }
-       }
-       else {
-               if ( mark( newshelle ) == 0 ) {
-                       setmark( newshelle, shellemark );
-               }
-       }
+struct triedge oppotri;
+struct edge newshelle;
+point triorg, tridest;
+triangle ptr;                       /* Temporary variable used by sym(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+/* Mark points if possible. */
+org( *tri, triorg );
+dest( *tri, tridest );
+if ( pointmark( triorg ) == 0 ) {
+setpointmark( triorg, shellemark );
+}
+if ( pointmark( tridest ) == 0 ) {
+setpointmark( tridest, shellemark );
+}
+/* Check if there's already a shell edge here. */
+tspivot( *tri, newshelle );
+if ( newshelle.sh == dummysh ) {
+/* Make new shell edge and initialize its vertices. */
+makeshelle( &newshelle );
+setsorg( newshelle, tridest );
+setsdest( newshelle, triorg );
+/* Bond new shell edge to the two triangles it is sandwiched between. */
+/*   Note that the facing triangle `oppotri' might be equal to        */
+/*   `dummytri' (outer space), but the new shell edge is bonded to it */
+/*   all the same.                                                    */
+tsbond( *tri, newshelle );
+sym( *tri, oppotri );
+ssymself( newshelle );
+tsbond( oppotri, newshelle );
+setmark( newshelle, shellemark );
+if ( verbose > 2 ) {
+printf( "  Inserting new " );
+printshelle( &newshelle );
+}
+}
+else {
+if ( mark( newshelle ) == 0 ) {
+setmark( newshelle, shellemark );
+}
+}
 }
 
 /*****************************************************************************/
@@ -6051,101 +6213,102 @@ int shellemark;                            /* Marker for the new shell edge. */
 void flip( flipedge )
 struct triedge *flipedge;                    /* Handle for the triangle abc. */
 {
-       struct triedge botleft, botright;
-       struct triedge topleft, topright;
-       struct triedge top;
-       struct triedge botlcasing, botrcasing;
-       struct triedge toplcasing, toprcasing;
-       struct edge botlshelle, botrshelle;
-       struct edge toplshelle, toprshelle;
-       point leftpoint, rightpoint, botpoint;
-       point farpoint;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       /* Identify the vertices of the quadrilateral. */
-       org( *flipedge, rightpoint );
-       dest( *flipedge, leftpoint );
-       apex( *flipedge, botpoint );
-       sym( *flipedge, top );
-#ifdef SELF_CHECK
-       if ( top.tri == dummytri ) {
-               printf( "Internal error in flip():  Attempt to flip on boundary.\n" );
-               lnextself( *flipedge );
-               return;
-       }
-       if ( checksegments ) {
-               tspivot( *flipedge, toplshelle );
-               if ( toplshelle.sh != dummysh ) {
-                       printf( "Internal error in flip():  Attempt to flip a segment.\n" );
-                       lnextself( *flipedge );
-                       return;
-               }
-       }
+struct triedge botleft, botright;
+struct triedge topleft, topright;
+struct triedge top;
+struct triedge botlcasing, botrcasing;
+struct triedge toplcasing, toprcasing;
+struct edge botlshelle, botrshelle;
+struct edge toplshelle, toprshelle;
+point leftpoint, rightpoint, botpoint;
+point farpoint;
+triangle ptr;                       /* Temporary variable used by sym(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+/* Identify the vertices of the quadrilateral. */
+org( *flipedge, rightpoint );
+dest( *flipedge, leftpoint );
+apex( *flipedge, botpoint );
+sym( *flipedge, top );
+#ifdef
+SELF_CHECK
+if ( top.tri == dummytri ) {
+printf( "Internal error in flip():  Attempt to flip on boundary.\n" );
+lnextself( *flipedge );
+return;
+}
+if ( checksegments ) {
+tspivot( *flipedge, toplshelle );
+if ( toplshelle.sh != dummysh ) {
+printf( "Internal error in flip():  Attempt to flip a segment.\n" );
+lnextself( *flipedge );
+return;
+}
+}
 #endif /* SELF_CHECK */
-       apex( top, farpoint );
-
-       /* Identify the casing of the quadrilateral. */
-       lprev( top, topleft );
-       sym( topleft, toplcasing );
-       lnext( top, topright );
-       sym( topright, toprcasing );
-       lnext( *flipedge, botleft );
-       sym( botleft, botlcasing );
-       lprev( *flipedge, botright );
-       sym( botright, botrcasing );
-       /* Rotate the quadrilateral one-quarter turn counterclockwise. */
-       bond( topleft, botlcasing );
-       bond( botleft, botrcasing );
-       bond( botright, toprcasing );
-       bond( topright, toplcasing );
-
-       if ( checksegments ) {
-               /* Check for shell edges and rebond them to the quadrilateral. */
-               tspivot( topleft, toplshelle );
-               tspivot( botleft, botlshelle );
-               tspivot( botright, botrshelle );
-               tspivot( topright, toprshelle );
-               if ( toplshelle.sh == dummysh ) {
-                       tsdissolve( topright );
-               }
-               else {
-                       tsbond( topright, toplshelle );
-               }
-               if ( botlshelle.sh == dummysh ) {
-                       tsdissolve( topleft );
-               }
-               else {
-                       tsbond( topleft, botlshelle );
-               }
-               if ( botrshelle.sh == dummysh ) {
-                       tsdissolve( botleft );
-               }
-               else {
-                       tsbond( botleft, botrshelle );
-               }
-               if ( toprshelle.sh == dummysh ) {
-                       tsdissolve( botright );
-               }
-               else {
-                       tsbond( botright, toprshelle );
-               }
-       }
-
-       /* New point assignments for the rotated quadrilateral. */
-       setorg( *flipedge, farpoint );
-       setdest( *flipedge, botpoint );
-       setapex( *flipedge, rightpoint );
-       setorg( top, botpoint );
-       setdest( top, farpoint );
-       setapex( top, leftpoint );
-       if ( verbose > 2 ) {
-               printf( "  Edge flip results in left " );
-               lnextself( topleft );
-               printtriangle( &topleft );
-               printf( "  and right " );
-               printtriangle( flipedge );
-       }
+apex( top, farpoint );
+
+/* Identify the casing of the quadrilateral. */
+lprev( top, topleft );
+sym( topleft, toplcasing );
+lnext( top, topright );
+sym( topright, toprcasing );
+lnext( *flipedge, botleft );
+sym( botleft, botlcasing );
+lprev( *flipedge, botright );
+sym( botright, botrcasing );
+/* Rotate the quadrilateral one-quarter turn counterclockwise. */
+bond( topleft, botlcasing );
+bond( botleft, botrcasing );
+bond( botright, toprcasing );
+bond( topright, toplcasing );
+
+if ( checksegments ) {
+/* Check for shell edges and rebond them to the quadrilateral. */
+tspivot( topleft, toplshelle );
+tspivot( botleft, botlshelle );
+tspivot( botright, botrshelle );
+tspivot( topright, toprshelle );
+if ( toplshelle.sh == dummysh ) {
+tsdissolve( topright );
+}
+else {
+tsbond( topright, toplshelle );
+}
+if ( botlshelle.sh == dummysh ) {
+tsdissolve( topleft );
+}
+else {
+tsbond( topleft, botlshelle );
+}
+if ( botrshelle.sh == dummysh ) {
+tsdissolve( botleft );
+}
+else {
+tsbond( botleft, botrshelle );
+}
+if ( toprshelle.sh == dummysh ) {
+tsdissolve( botright );
+}
+else {
+tsbond( botright, toprshelle );
+}
+}
+
+/* New point assignments for the rotated quadrilateral. */
+setorg( *flipedge, farpoint );
+setdest( *flipedge, botpoint );
+setapex( *flipedge, rightpoint );
+setorg( top, botpoint );
+setdest( top, farpoint );
+setapex( top, leftpoint );
+if ( verbose > 2 ) {
+printf( "  Edge flip results in left " );
+lnextself( topleft );
+printtriangle( &topleft );
+printf( "  and right " );
+printtriangle( flipedge );
+}
 }
 
 /*****************************************************************************/
@@ -6196,544 +6359,549 @@ struct triedge *flipedge;                    /* Handle for the triangle abc. */
 /*****************************************************************************/
 
 enum insertsiteresult insertsite( insertpoint, searchtri, splitedge,
-                                                                 segmentflaws, triflaws )
+segmentflaws, triflaws )
 point insertpoint;
 struct triedge *searchtri;
 struct edge *splitedge;
 int segmentflaws;
 int triflaws;
 {
-       struct triedge horiz;
-       struct triedge top;
-       struct triedge botleft, botright;
-       struct triedge topleft, topright;
-       struct triedge newbotleft, newbotright;
-       struct triedge newtopright;
-       struct triedge botlcasing, botrcasing;
-       struct triedge toplcasing, toprcasing;
-       struct triedge testtri;
-       struct edge botlshelle, botrshelle;
-       struct edge toplshelle, toprshelle;
-       struct edge brokenshelle;
-       struct edge checkshelle;
-       struct edge rightedge;
-       struct edge newedge;
-       struct edge *encroached;
-       point first;
-       point leftpoint, rightpoint, botpoint, toppoint, farpoint;
-       REAL attrib;
-       REAL area;
-       enum insertsiteresult success;
-       enum locateresult intersect;
-       int doflip;
-       int mirrorflag;
-       int i;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-       shelle sptr;       /* Temporary variable used by spivot() and tspivot(). */
-
-       if ( verbose > 1 ) {
-               printf( "  Inserting (%.12g, %.12g).\n", insertpoint[0], insertpoint[1] );
-       }
-       if ( splitedge == (struct edge *) NULL ) {
-               /* Find the location of the point to be inserted.  Check if a good */
-               /*   starting triangle has already been provided by the caller.    */
-               if ( searchtri->tri == (triangle *) NULL ) {
-                       /* Find a boundary triangle. */
-                       horiz.tri = dummytri;
-                       horiz.orient = 0;
-                       symself( horiz );
-                       /* Search for a triangle containing `insertpoint'. */
-                       intersect = locate( insertpoint, &horiz );
-               }
-               else {
-                       /* Start searching from the triangle provided by the caller. */
-                       triedgecopy( *searchtri, horiz );
-                       intersect = preciselocate( insertpoint, &horiz );
-               }
-       }
-       else {
-               /* The calling routine provides the edge in which the point is inserted. */
-               triedgecopy( *searchtri, horiz );
-               intersect = ONEDGE;
-       }
-       if ( intersect == ONVERTEX ) {
-               /* There's already a vertex there.  Return in `searchtri' a triangle */
-               /*   whose origin is the existing vertex.                            */
-               triedgecopy( horiz, *searchtri );
-               triedgecopy( horiz, recenttri );
-               return DUPLICATEPOINT;
-       }
-       if ( ( intersect == ONEDGE ) || ( intersect == OUTSIDE ) ) {
-               /* The vertex falls on an edge or boundary. */
-               if ( checksegments && ( splitedge == (struct edge *) NULL ) ) {
-                       /* Check whether the vertex falls on a shell edge. */
-                       tspivot( horiz, brokenshelle );
-                       if ( brokenshelle.sh != dummysh ) {
-                               /* The vertex falls on a shell edge. */
-                               if ( segmentflaws ) {
-                                       if ( nobisect == 0 ) {
-                                               /* Add the shell edge to the list of encroached segments. */
-                                               encroached = (struct edge *) poolalloc( &badsegments );
-                                               shellecopy( brokenshelle, *encroached );
-                                       }
-                                       else if ( ( nobisect == 1 ) && ( intersect == ONEDGE ) ) {
-                                               /* This segment may be split only if it is an internal boundary. */
-                                               sym( horiz, testtri );
-                                               if ( testtri.tri != dummytri ) {
-                                                       /* Add the shell edge to the list of encroached segments. */
-                                                       encroached = (struct edge *) poolalloc( &badsegments );
-                                                       shellecopy( brokenshelle, *encroached );
-                                               }
-                                       }
-                               }
-                               /* Return a handle whose primary edge contains the point, */
-                               /*   which has not been inserted.                         */
-                               triedgecopy( horiz, *searchtri );
-                               triedgecopy( horiz, recenttri );
-                               return VIOLATINGPOINT;
-                       }
-               }
-               /* Insert the point on an edge, dividing one triangle into two (if */
-               /*   the edge lies on a boundary) or two triangles into four.      */
-               lprev( horiz, botright );
-               sym( botright, botrcasing );
-               sym( horiz, topright );
-               /* Is there a second triangle?  (Or does this edge lie on a boundary?) */
-               mirrorflag = topright.tri != dummytri;
-               if ( mirrorflag ) {
-                       lnextself( topright );
-                       sym( topright, toprcasing );
-                       maketriangle( &newtopright );
-               }
-               else {
-                       /* Splitting the boundary edge increases the number of boundary edges. */
-                       hullsize++;
-               }
-               maketriangle( &newbotright );
-
-               /* Set the vertices of changed and new triangles. */
-               org( horiz, rightpoint );
-               dest( horiz, leftpoint );
-               apex( horiz, botpoint );
-               setorg( newbotright, botpoint );
-               setdest( newbotright, rightpoint );
-               setapex( newbotright, insertpoint );
-               setorg( horiz, insertpoint );
-               for ( i = 0; i < eextras; i++ ) {
-                       /* Set the element attributes of a new triangle. */
-                       setelemattribute( newbotright, i, elemattribute( botright, i ) );
-               }
-               if ( vararea ) {
-                       /* Set the area constraint of a new triangle. */
-                       setareabound( newbotright, areabound( botright ) );
-               }
-               if ( mirrorflag ) {
-                       dest( topright, toppoint );
-                       setorg( newtopright, rightpoint );
-                       setdest( newtopright, toppoint );
-                       setapex( newtopright, insertpoint );
-                       setorg( topright, insertpoint );
-                       for ( i = 0; i < eextras; i++ ) {
-                               /* Set the element attributes of another new triangle. */
-                               setelemattribute( newtopright, i, elemattribute( topright, i ) );
-                       }
-                       if ( vararea ) {
-                               /* Set the area constraint of another new triangle. */
-                               setareabound( newtopright, areabound( topright ) );
-                       }
-               }
-
-               /* There may be shell edges that need to be bonded */
-               /*   to the new triangle(s).                       */
-               if ( checksegments ) {
-                       tspivot( botright, botrshelle );
-                       if ( botrshelle.sh != dummysh ) {
-                               tsdissolve( botright );
-                               tsbond( newbotright, botrshelle );
-                       }
-                       if ( mirrorflag ) {
-                               tspivot( topright, toprshelle );
-                               if ( toprshelle.sh != dummysh ) {
-                                       tsdissolve( topright );
-                                       tsbond( newtopright, toprshelle );
-                               }
-                       }
-               }
-
-               /* Bond the new triangle(s) to the surrounding triangles. */
-               bond( newbotright, botrcasing );
-               lprevself( newbotright );
-               bond( newbotright, botright );
-               lprevself( newbotright );
-               if ( mirrorflag ) {
-                       bond( newtopright, toprcasing );
-                       lnextself( newtopright );
-                       bond( newtopright, topright );
-                       lnextself( newtopright );
-                       bond( newtopright, newbotright );
-               }
-
-               if ( splitedge != (struct edge *) NULL ) {
-                       /* Split the shell edge into two. */
-                       setsdest( *splitedge, insertpoint );
-                       ssymself( *splitedge );
-                       spivot( *splitedge, rightedge );
-                       insertshelle( &newbotright, mark( *splitedge ) );
-                       tspivot( newbotright, newedge );
-                       sbond( *splitedge, newedge );
-                       ssymself( newedge );
-                       sbond( newedge, rightedge );
-                       ssymself( *splitedge );
-               }
-
-#ifdef SELF_CHECK
-               if ( counterclockwise( rightpoint, leftpoint, botpoint ) < 0.0 ) {
-                       printf( "Internal error in insertsite():\n" );
-                       printf( "  Clockwise triangle prior to edge point insertion (bottom).\n" );
-               }
-               if ( mirrorflag ) {
-                       if ( counterclockwise( leftpoint, rightpoint, toppoint ) < 0.0 ) {
-                               printf( "Internal error in insertsite():\n" );
-                               printf( "  Clockwise triangle prior to edge point insertion (top).\n" );
-                       }
-                       if ( counterclockwise( rightpoint, toppoint, insertpoint ) < 0.0 ) {
-                               printf( "Internal error in insertsite():\n" );
-                               printf( "  Clockwise triangle after edge point insertion (top right).\n"
-                                               );
-                       }
-                       if ( counterclockwise( toppoint, leftpoint, insertpoint ) < 0.0 ) {
-                               printf( "Internal error in insertsite():\n" );
-                               printf( "  Clockwise triangle after edge point insertion (top left).\n"
-                                               );
-                       }
-               }
-               if ( counterclockwise( leftpoint, botpoint, insertpoint ) < 0.0 ) {
-                       printf( "Internal error in insertsite():\n" );
-                       printf( "  Clockwise triangle after edge point insertion (bottom left).\n"
-                                       );
-               }
-               if ( counterclockwise( botpoint, rightpoint, insertpoint ) < 0.0 ) {
-                       printf( "Internal error in insertsite():\n" );
-                       printf(
-                               "  Clockwise triangle after edge point insertion (bottom right).\n" );
-               }
+struct triedge horiz;
+struct triedge top;
+struct triedge botleft, botright;
+struct triedge topleft, topright;
+struct triedge newbotleft, newbotright;
+struct triedge newtopright;
+struct triedge botlcasing, botrcasing;
+struct triedge toplcasing, toprcasing;
+struct triedge testtri;
+struct edge botlshelle, botrshelle;
+struct edge toplshelle, toprshelle;
+struct edge brokenshelle;
+struct edge checkshelle;
+struct edge rightedge;
+struct edge newedge;
+struct edge *encroached;
+point first;
+point leftpoint, rightpoint, botpoint, toppoint, farpoint;
+REAL attrib;
+REAL area;
+enum insertsiteresult success;
+enum locateresult intersect;
+int doflip;
+int mirrorflag;
+int i;
+triangle ptr;                       /* Temporary variable used by sym(). */
+shelle sptr;       /* Temporary variable used by spivot() and tspivot(). */
+
+if ( verbose > 1 ) {
+printf( "  Inserting (%.12g, %.12g).\n", insertpoint[0], insertpoint[1] );
+}
+if ( splitedge == (struct edge *) NULL ) {
+/* Find the location of the point to be inserted.  Check if a good */
+/*   starting triangle has already been provided by the caller.    */
+if ( searchtri->tri == (triangle *) NULL ) {
+/* Find a boundary triangle. */
+horiz.tri = dummytri;
+horiz.orient = 0;
+symself( horiz );
+/* Search for a triangle containing `insertpoint'. */
+intersect = locate( insertpoint, &horiz );
+}
+else {
+/* Start searching from the triangle provided by the caller. */
+triedgecopy( *searchtri, horiz );
+intersect = preciselocate( insertpoint, &horiz );
+}
+}
+else {
+/* The calling routine provides the edge in which the point is inserted. */
+triedgecopy( *searchtri, horiz );
+intersect = ONEDGE;
+}
+if ( intersect == ONVERTEX ) {
+/* There's already a vertex there.  Return in `searchtri' a triangle */
+/*   whose origin is the existing vertex.                            */
+triedgecopy( horiz, *searchtri );
+triedgecopy( horiz, recenttri );
+return DUPLICATEPOINT;
+}
+if (( intersect == ONEDGE ) || ( intersect == OUTSIDE )) {
+/* The vertex falls on an edge or boundary. */
+if ( checksegments && ( splitedge == (struct edge *) NULL )) {
+/* Check whether the vertex falls on a shell edge. */
+tspivot( horiz, brokenshelle );
+if ( brokenshelle.sh != dummysh ) {
+/* The vertex falls on a shell edge. */
+if ( segmentflaws ) {
+if ( nobisect == 0 ) {
+/* Add the shell edge to the list of encroached segments. */
+encroached = (struct edge *) poolalloc( &badsegments );
+shellecopy( brokenshelle, *encroached );
+}
+else if (( nobisect == 1 ) && ( intersect == ONEDGE )) {
+/* This segment may be split only if it is an internal boundary. */
+sym( horiz, testtri );
+if ( testtri.tri != dummytri ) {
+/* Add the shell edge to the list of encroached segments. */
+encroached = (struct edge *) poolalloc( &badsegments );
+shellecopy( brokenshelle, *encroached );
+}
+}
+}
+/* Return a handle whose primary edge contains the point, */
+/*   which has not been inserted.                         */
+triedgecopy( horiz, *searchtri );
+triedgecopy( horiz, recenttri );
+return VIOLATINGPOINT;
+}
+}
+/* Insert the point on an edge, dividing one triangle into two (if */
+/*   the edge lies on a boundary) or two triangles into four.      */
+lprev( horiz, botright );
+sym( botright, botrcasing );
+sym( horiz, topright );
+/* Is there a second triangle?  (Or does this edge lie on a boundary?) */
+mirrorflag = topright.tri != dummytri;
+if ( mirrorflag ) {
+lnextself( topright );
+sym( topright, toprcasing );
+maketriangle( &newtopright );
+}
+else {
+/* Splitting the boundary edge increases the number of boundary edges. */
+hullsize++;
+}
+maketriangle( &newbotright );
+
+/* Set the vertices of changed and new triangles. */
+org( horiz, rightpoint );
+dest( horiz, leftpoint );
+apex( horiz, botpoint );
+setorg( newbotright, botpoint );
+setdest( newbotright, rightpoint );
+setapex( newbotright, insertpoint );
+setorg( horiz, insertpoint );
+for ( i = 0; i < eextras; i++ ) {
+/* Set the element attributes of a new triangle. */
+setelemattribute( newbotright, i, elemattribute( botright, i ));
+}
+if ( vararea ) {
+/* Set the area constraint of a new triangle. */
+setareabound( newbotright, areabound( botright ));
+}
+if ( mirrorflag ) {
+dest( topright, toppoint );
+setorg( newtopright, rightpoint );
+setdest( newtopright, toppoint );
+setapex( newtopright, insertpoint );
+setorg( topright, insertpoint );
+for ( i = 0; i < eextras; i++ ) {
+/* Set the element attributes of another new triangle. */
+setelemattribute( newtopright, i, elemattribute( topright, i ));
+}
+if ( vararea ) {
+/* Set the area constraint of another new triangle. */
+setareabound( newtopright, areabound( topright ));
+}
+}
+
+/* There may be shell edges that need to be bonded */
+/*   to the new triangle(s).                       */
+if ( checksegments ) {
+tspivot( botright, botrshelle );
+if ( botrshelle.sh != dummysh ) {
+tsdissolve( botright );
+tsbond( newbotright, botrshelle );
+}
+if ( mirrorflag ) {
+tspivot( topright, toprshelle );
+if ( toprshelle.sh != dummysh ) {
+tsdissolve( topright );
+tsbond( newtopright, toprshelle );
+}
+}
+}
+
+/* Bond the new triangle(s) to the surrounding triangles. */
+bond( newbotright, botrcasing );
+lprevself( newbotright );
+bond( newbotright, botright );
+lprevself( newbotright );
+if ( mirrorflag ) {
+bond( newtopright, toprcasing );
+lnextself( newtopright );
+bond( newtopright, topright );
+lnextself( newtopright );
+bond( newtopright, newbotright );
+}
+
+if ( splitedge != (struct edge *) NULL ) {
+/* Split the shell edge into two. */
+setsdest( *splitedge, insertpoint );
+ssymself( *splitedge );
+spivot( *splitedge, rightedge );
+insertshelle( &newbotright, mark( *splitedge ));
+tspivot( newbotright, newedge );
+sbond( *splitedge, newedge );
+ssymself( newedge );
+sbond( newedge, rightedge );
+ssymself( *splitedge );
+}
+
+#ifdef
+SELF_CHECK
+if ( counterclockwise( rightpoint, leftpoint, botpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle prior to edge point insertion (bottom).\n" );
+}
+if ( mirrorflag ) {
+if ( counterclockwise( leftpoint, rightpoint, toppoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle prior to edge point insertion (top).\n" );
+}
+if ( counterclockwise( rightpoint, toppoint, insertpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle after edge point insertion (top right).\n"
+);
+}
+if ( counterclockwise( toppoint, leftpoint, insertpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle after edge point insertion (top left).\n"
+);
+}
+}
+if ( counterclockwise( leftpoint, botpoint, insertpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle after edge point insertion (bottom left).\n"
+);
+}
+if ( counterclockwise( botpoint, rightpoint, insertpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf(
+"  Clockwise triangle after edge point insertion (bottom right).\n" );
+}
 #endif /* SELF_CHECK */
-               if ( verbose > 2 ) {
-                       printf( "  Updating bottom left " );
-                       printtriangle( &botright );
-                       if ( mirrorflag ) {
-                               printf( "  Updating top left " );
-                               printtriangle( &topright );
-                               printf( "  Creating top right " );
-                               printtriangle( &newtopright );
-                       }
-                       printf( "  Creating bottom right " );
-                       printtriangle( &newbotright );
-               }
-
-               /* Position `horiz' on the first edge to check for */
-               /*   the Delaunay property.                        */
-               lnextself( horiz );
-       }
-       else {
-               /* Insert the point in a triangle, splitting it into three. */
-               lnext( horiz, botleft );
-               lprev( horiz, botright );
-               sym( botleft, botlcasing );
-               sym( botright, botrcasing );
-               maketriangle( &newbotleft );
-               maketriangle( &newbotright );
-
-               /* Set the vertices of changed and new triangles. */
-               org( horiz, rightpoint );
-               dest( horiz, leftpoint );
-               apex( horiz, botpoint );
-               setorg( newbotleft, leftpoint );
-               setdest( newbotleft, botpoint );
-               setapex( newbotleft, insertpoint );
-               setorg( newbotright, botpoint );
-               setdest( newbotright, rightpoint );
-               setapex( newbotright, insertpoint );
-               setapex( horiz, insertpoint );
-               for ( i = 0; i < eextras; i++ ) {
-                       /* Set the element attributes of the new triangles. */
-                       attrib = elemattribute( horiz, i );
-                       setelemattribute( newbotleft, i, attrib );
-                       setelemattribute( newbotright, i, attrib );
-               }
-               if ( vararea ) {
-                       /* Set the area constraint of the new triangles. */
-                       area = areabound( horiz );
-                       setareabound( newbotleft, area );
-                       setareabound( newbotright, area );
-               }
-
-               /* There may be shell edges that need to be bonded */
-               /*   to the new triangles.                         */
-               if ( checksegments ) {
-                       tspivot( botleft, botlshelle );
-                       if ( botlshelle.sh != dummysh ) {
-                               tsdissolve( botleft );
-                               tsbond( newbotleft, botlshelle );
-                       }
-                       tspivot( botright, botrshelle );
-                       if ( botrshelle.sh != dummysh ) {
-                               tsdissolve( botright );
-                               tsbond( newbotright, botrshelle );
-                       }
-               }
-
-               /* Bond the new triangles to the surrounding triangles. */
-               bond( newbotleft, botlcasing );
-               bond( newbotright, botrcasing );
-               lnextself( newbotleft );
-               lprevself( newbotright );
-               bond( newbotleft, newbotright );
-               lnextself( newbotleft );
-               bond( botleft, newbotleft );
-               lprevself( newbotright );
-               bond( botright, newbotright );
-
-#ifdef SELF_CHECK
-               if ( counterclockwise( rightpoint, leftpoint, botpoint ) < 0.0 ) {
-                       printf( "Internal error in insertsite():\n" );
-                       printf( "  Clockwise triangle prior to point insertion.\n" );
-               }
-               if ( counterclockwise( rightpoint, leftpoint, insertpoint ) < 0.0 ) {
-                       printf( "Internal error in insertsite():\n" );
-                       printf( "  Clockwise triangle after point insertion (top).\n" );
-               }
-               if ( counterclockwise( leftpoint, botpoint, insertpoint ) < 0.0 ) {
-                       printf( "Internal error in insertsite():\n" );
-                       printf( "  Clockwise triangle after point insertion (left).\n" );
-               }
-               if ( counterclockwise( botpoint, rightpoint, insertpoint ) < 0.0 ) {
-                       printf( "Internal error in insertsite():\n" );
-                       printf( "  Clockwise triangle after point insertion (right).\n" );
-               }
+if ( verbose > 2 ) {
+printf( "  Updating bottom left " );
+printtriangle( &botright );
+if ( mirrorflag ) {
+printf( "  Updating top left " );
+printtriangle( &topright );
+printf( "  Creating top right " );
+printtriangle( &newtopright );
+}
+printf( "  Creating bottom right " );
+printtriangle( &newbotright );
+}
+
+/* Position `horiz' on the first edge to check for */
+/*   the Delaunay property.                        */
+lnextself( horiz );
+}
+else {
+/* Insert the point in a triangle, splitting it into three. */
+lnext( horiz, botleft );
+lprev( horiz, botright );
+sym( botleft, botlcasing );
+sym( botright, botrcasing );
+maketriangle( &newbotleft );
+maketriangle( &newbotright );
+
+/* Set the vertices of changed and new triangles. */
+org( horiz, rightpoint );
+dest( horiz, leftpoint );
+apex( horiz, botpoint );
+setorg( newbotleft, leftpoint );
+setdest( newbotleft, botpoint );
+setapex( newbotleft, insertpoint );
+setorg( newbotright, botpoint );
+setdest( newbotright, rightpoint );
+setapex( newbotright, insertpoint );
+setapex( horiz, insertpoint );
+for ( i = 0; i < eextras; i++ ) {
+/* Set the element attributes of the new triangles. */
+attrib = elemattribute( horiz, i );
+setelemattribute( newbotleft, i, attrib );
+setelemattribute( newbotright, i, attrib );
+}
+if ( vararea ) {
+/* Set the area constraint of the new triangles. */
+area = areabound( horiz );
+setareabound( newbotleft, area );
+setareabound( newbotright, area );
+}
+
+/* There may be shell edges that need to be bonded */
+/*   to the new triangles.                         */
+if ( checksegments ) {
+tspivot( botleft, botlshelle );
+if ( botlshelle.sh != dummysh ) {
+tsdissolve( botleft );
+tsbond( newbotleft, botlshelle );
+}
+tspivot( botright, botrshelle );
+if ( botrshelle.sh != dummysh ) {
+tsdissolve( botright );
+tsbond( newbotright, botrshelle );
+}
+}
+
+/* Bond the new triangles to the surrounding triangles. */
+bond( newbotleft, botlcasing );
+bond( newbotright, botrcasing );
+lnextself( newbotleft );
+lprevself( newbotright );
+bond( newbotleft, newbotright );
+lnextself( newbotleft );
+bond( botleft, newbotleft );
+lprevself( newbotright );
+bond( botright, newbotright );
+
+#ifdef
+SELF_CHECK
+if ( counterclockwise( rightpoint, leftpoint, botpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle prior to point insertion.\n" );
+}
+if ( counterclockwise( rightpoint, leftpoint, insertpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle after point insertion (top).\n" );
+}
+if ( counterclockwise( leftpoint, botpoint, insertpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle after point insertion (left).\n" );
+}
+if ( counterclockwise( botpoint, rightpoint, insertpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle after point insertion (right).\n" );
+}
 #endif /* SELF_CHECK */
-               if ( verbose > 2 ) {
-                       printf( "  Updating top " );
-                       printtriangle( &horiz );
-                       printf( "  Creating left " );
-                       printtriangle( &newbotleft );
-                       printf( "  Creating right " );
-                       printtriangle( &newbotright );
-               }
-       }
-
-       /* The insertion is successful by default, unless an encroached */
-       /*   edge is found.                                             */
-       success = SUCCESSFULPOINT;
-       /* Circle around the newly inserted vertex, checking each edge opposite */
-       /*   it for the Delaunay property.  Non-Delaunay edges are flipped.     */
-       /*   `horiz' is always the edge being checked.  `first' marks where to  */
-       /*   stop circling.                                                     */
-       org( horiz, first );
-       rightpoint = first;
-       dest( horiz, leftpoint );
-       /* Circle until finished. */
-       while ( 1 ) {
-               /* By default, the edge will be flipped. */
-               doflip = 1;
-               if ( checksegments ) {
-                       /* Check for a segment, which cannot be flipped. */
-                       tspivot( horiz, checkshelle );
-                       if ( checkshelle.sh != dummysh ) {
-                               /* The edge is a segment and cannot be flipped. */
-                               doflip = 0;
-#ifndef CDT_ONLY
-                               if ( segmentflaws ) {
-                                       /* Does the new point encroach upon this segment? */
-                                       if ( checkedge4encroach( &checkshelle ) ) {
-                                               success = ENCROACHINGPOINT;
-                                       }
-                               }
+if ( verbose > 2 ) {
+printf( "  Updating top " );
+printtriangle( &horiz );
+printf( "  Creating left " );
+printtriangle( &newbotleft );
+printf( "  Creating right " );
+printtriangle( &newbotright );
+}
+}
+
+/* The insertion is successful by default, unless an encroached */
+/*   edge is found.                                             */
+success = SUCCESSFULPOINT;
+/* Circle around the newly inserted vertex, checking each edge opposite */
+/*   it for the Delaunay property.  Non-Delaunay edges are flipped.     */
+/*   `horiz' is always the edge being checked.  `first' marks where to  */
+/*   stop circling.                                                     */
+org( horiz, first );
+rightpoint = first;
+dest( horiz, leftpoint );
+/* Circle until finished. */
+while ( 1 ) {
+/* By default, the edge will be flipped. */
+doflip = 1;
+if ( checksegments ) {
+/* Check for a segment, which cannot be flipped. */
+tspivot( horiz, checkshelle );
+if ( checkshelle.sh != dummysh ) {
+/* The edge is a segment and cannot be flipped. */
+doflip = 0;
+#ifndef
+CDT_ONLY
+if ( segmentflaws ) {
+/* Does the new point encroach upon this segment? */
+if ( checkedge4encroach( &checkshelle )) {
+success = ENCROACHINGPOINT;
+}
+}
 #endif /* not CDT_ONLY */
-                       }
-               }
-               if ( doflip ) {
-                       /* Check if the edge is a boundary edge. */
-                       sym( horiz, top );
-                       if ( top.tri == dummytri ) {
-                               /* The edge is a boundary edge and cannot be flipped. */
-                               doflip = 0;
-                       }
-                       else {
-                               /* Find the point on the other side of the edge. */
-                               apex( top, farpoint );
-                               /* In the incremental Delaunay triangulation algorithm, any of    */
-                               /*   `leftpoint', `rightpoint', and `farpoint' could be vertices  */
-                               /*   of the triangular bounding box.  These vertices must be      */
-                               /*   treated as if they are infinitely distant, even though their */
-                               /*   "coordinates" are not.                                       */
-                               if ( ( leftpoint == infpoint1 ) || ( leftpoint == infpoint2 )
-                                        || ( leftpoint == infpoint3 ) ) {
-                                       /* `leftpoint' is infinitely distant.  Check the convexity of */
-                                       /*   the boundary of the triangulation.  'farpoint' might be  */
-                                       /*   infinite as well, but trust me, this same condition      */
-                                       /*   should be applied.                                       */
-                                       doflip = counterclockwise( insertpoint, rightpoint, farpoint ) > 0.0;
-                               }
-                               else if ( ( rightpoint == infpoint1 ) || ( rightpoint == infpoint2 )
-                                                 || ( rightpoint == infpoint3 ) ) {
-                                       /* `rightpoint' is infinitely distant.  Check the convexity of */
-                                       /*   the boundary of the triangulation.  'farpoint' might be  */
-                                       /*   infinite as well, but trust me, this same condition      */
-                                       /*   should be applied.                                       */
-                                       doflip = counterclockwise( farpoint, leftpoint, insertpoint ) > 0.0;
-                               }
-                               else if ( ( farpoint == infpoint1 ) || ( farpoint == infpoint2 )
-                                                 || ( farpoint == infpoint3 ) ) {
-                                       /* `farpoint' is infinitely distant and cannot be inside */
-                                       /*   the circumcircle of the triangle `horiz'.           */
-                                       doflip = 0;
-                               }
-                               else {
-                                       /* Test whether the edge is locally Delaunay. */
-                                       doflip = incircle( leftpoint, insertpoint, rightpoint, farpoint )
-                                                        > 0.0;
-                               }
-                               if ( doflip ) {
-                                       /* We made it!  Flip the edge `horiz' by rotating its containing */
-                                       /*   quadrilateral (the two triangles adjacent to `horiz').      */
-                                       /* Identify the casing of the quadrilateral. */
-                                       lprev( top, topleft );
-                                       sym( topleft, toplcasing );
-                                       lnext( top, topright );
-                                       sym( topright, toprcasing );
-                                       lnext( horiz, botleft );
-                                       sym( botleft, botlcasing );
-                                       lprev( horiz, botright );
-                                       sym( botright, botrcasing );
-                                       /* Rotate the quadrilateral one-quarter turn counterclockwise. */
-                                       bond( topleft, botlcasing );
-                                       bond( botleft, botrcasing );
-                                       bond( botright, toprcasing );
-                                       bond( topright, toplcasing );
-                                       if ( checksegments ) {
-                                               /* Check for shell edges and rebond them to the quadrilateral. */
-                                               tspivot( topleft, toplshelle );
-                                               tspivot( botleft, botlshelle );
-                                               tspivot( botright, botrshelle );
-                                               tspivot( topright, toprshelle );
-                                               if ( toplshelle.sh == dummysh ) {
-                                                       tsdissolve( topright );
-                                               }
-                                               else {
-                                                       tsbond( topright, toplshelle );
-                                               }
-                                               if ( botlshelle.sh == dummysh ) {
-                                                       tsdissolve( topleft );
-                                               }
-                                               else {
-                                                       tsbond( topleft, botlshelle );
-                                               }
-                                               if ( botrshelle.sh == dummysh ) {
-                                                       tsdissolve( botleft );
-                                               }
-                                               else {
-                                                       tsbond( botleft, botrshelle );
-                                               }
-                                               if ( toprshelle.sh == dummysh ) {
-                                                       tsdissolve( botright );
-                                               }
-                                               else {
-                                                       tsbond( botright, toprshelle );
-                                               }
-                                       }
-                                       /* New point assignments for the rotated quadrilateral. */
-                                       setorg( horiz, farpoint );
-                                       setdest( horiz, insertpoint );
-                                       setapex( horiz, rightpoint );
-                                       setorg( top, insertpoint );
-                                       setdest( top, farpoint );
-                                       setapex( top, leftpoint );
-                                       for ( i = 0; i < eextras; i++ ) {
-                                               /* Take the average of the two triangles' attributes. */
-                                               attrib = (REAL)( 0.5 * ( elemattribute( top, i ) + elemattribute( horiz, i ) ) );
-                                               setelemattribute( top, i, attrib );
-                                               setelemattribute( horiz, i, attrib );
-                                       }
-                                       if ( vararea ) {
-                                               if ( ( areabound( top ) <= 0.0 ) || ( areabound( horiz ) <= 0.0 ) ) {
-                                                       area = -1.0;
-                                               }
-                                               else {
-                                                       /* Take the average of the two triangles' area constraints.    */
-                                                       /*   This prevents small area constraints from migrating a     */
-                                                       /*   long, long way from their original location due to flips. */
-                                                       area = (REAL)( 0.5 * ( areabound( top ) + areabound( horiz ) ) );
-                                               }
-                                               setareabound( top, area );
-                                               setareabound( horiz, area );
-                                       }
-#ifdef SELF_CHECK
-                                       if ( insertpoint != (point) NULL ) {
-                                               if ( counterclockwise( leftpoint, insertpoint, rightpoint ) < 0.0 ) {
-                                                       printf( "Internal error in insertsite():\n" );
-                                                       printf( "  Clockwise triangle prior to edge flip (bottom).\n" );
-                                               }
-                                               /* The following test has been removed because constrainededge() */
-                                               /*   sometimes generates inverted triangles that insertsite()    */
-                                               /*   removes.                                                    */
+}
+}
+if ( doflip ) {
+/* Check if the edge is a boundary edge. */
+sym( horiz, top );
+if ( top.tri == dummytri ) {
+/* The edge is a boundary edge and cannot be flipped. */
+doflip = 0;
+}
+else {
+/* Find the point on the other side of the edge. */
+apex( top, farpoint );
+/* In the incremental Delaunay triangulation algorithm, any of    */
+/*   `leftpoint', `rightpoint', and `farpoint' could be vertices  */
+/*   of the triangular bounding box.  These vertices must be      */
+/*   treated as if they are infinitely distant, even though their */
+/*   "coordinates" are not.                                       */
+if (( leftpoint == infpoint1 ) || ( leftpoint == infpoint2 )
+|| ( leftpoint == infpoint3 )) {
+/* `leftpoint' is infinitely distant.  Check the convexity of */
+/*   the boundary of the triangulation.  'farpoint' might be  */
+/*   infinite as well, but trust me, this same condition      */
+/*   should be applied.                                       */
+doflip = counterclockwise( insertpoint, rightpoint, farpoint ) > 0.0;
+}
+else if (( rightpoint == infpoint1 ) || ( rightpoint == infpoint2 )
+|| ( rightpoint == infpoint3 )) {
+/* `rightpoint' is infinitely distant.  Check the convexity of */
+/*   the boundary of the triangulation.  'farpoint' might be  */
+/*   infinite as well, but trust me, this same condition      */
+/*   should be applied.                                       */
+doflip = counterclockwise( farpoint, leftpoint, insertpoint ) > 0.0;
+}
+else if (( farpoint == infpoint1 ) || ( farpoint == infpoint2 )
+|| ( farpoint == infpoint3 )) {
+/* `farpoint' is infinitely distant and cannot be inside */
+/*   the circumcircle of the triangle `horiz'.           */
+doflip = 0;
+}
+else {
+/* Test whether the edge is locally Delaunay. */
+doflip = incircle( leftpoint, insertpoint, rightpoint, farpoint )
+> 0.0;
+}
+if ( doflip ) {
+/* We made it!  Flip the edge `horiz' by rotating its containing */
+/*   quadrilateral (the two triangles adjacent to `horiz').      */
+/* Identify the casing of the quadrilateral. */
+lprev( top, topleft );
+sym( topleft, toplcasing );
+lnext( top, topright );
+sym( topright, toprcasing );
+lnext( horiz, botleft );
+sym( botleft, botlcasing );
+lprev( horiz, botright );
+sym( botright, botrcasing );
+/* Rotate the quadrilateral one-quarter turn counterclockwise. */
+bond( topleft, botlcasing );
+bond( botleft, botrcasing );
+bond( botright, toprcasing );
+bond( topright, toplcasing );
+if ( checksegments ) {
+/* Check for shell edges and rebond them to the quadrilateral. */
+tspivot( topleft, toplshelle );
+tspivot( botleft, botlshelle );
+tspivot( botright, botrshelle );
+tspivot( topright, toprshelle );
+if ( toplshelle.sh == dummysh ) {
+tsdissolve( topright );
+}
+else {
+tsbond( topright, toplshelle );
+}
+if ( botlshelle.sh == dummysh ) {
+tsdissolve( topleft );
+}
+else {
+tsbond( topleft, botlshelle );
+}
+if ( botrshelle.sh == dummysh ) {
+tsdissolve( botleft );
+}
+else {
+tsbond( botleft, botrshelle );
+}
+if ( toprshelle.sh == dummysh ) {
+tsdissolve( botright );
+}
+else {
+tsbond( botright, toprshelle );
+}
+}
+/* New point assignments for the rotated quadrilateral. */
+setorg( horiz, farpoint );
+setdest( horiz, insertpoint );
+setapex( horiz, rightpoint );
+setorg( top, insertpoint );
+setdest( top, farpoint );
+setapex( top, leftpoint );
+for ( i = 0; i < eextras; i++ ) {
+/* Take the average of the two triangles' attributes. */
+attrib = (REAL)( 0.5 * ( elemattribute( top, i ) + elemattribute( horiz, i )));
+setelemattribute( top, i, attrib );
+setelemattribute( horiz, i, attrib );
+}
+if ( vararea ) {
+if (( areabound( top ) <= 0.0 ) || ( areabound( horiz ) <= 0.0 )) {
+area = -1.0;
+}
+else {
+/* Take the average of the two triangles' area constraints.    */
+/*   This prevents small area constraints from migrating a     */
+/*   long, long way from their original location due to flips. */
+area = (REAL)( 0.5 * ( areabound( top ) + areabound( horiz )));
+}
+setareabound( top, area );
+setareabound( horiz, area );
+}
+#ifdef
+SELF_CHECK
+if ( insertpoint != (point) NULL ) {
+if ( counterclockwise( leftpoint, insertpoint, rightpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle prior to edge flip (bottom).\n" );
+}
+/* The following test has been removed because constrainededge() */
+/*   sometimes generates inverted triangles that insertsite()    */
+/*   removes.                                                    */
 /*
             if (counterclockwise(rightpoint, farpoint, leftpoint) < 0.0) {
               printf("Internal error in insertsite():\n");
               printf("  Clockwise triangle prior to edge flip (top).\n");
             }
  */
-                                               if ( counterclockwise( farpoint, leftpoint, insertpoint ) < 0.0 ) {
-                                                       printf( "Internal error in insertsite():\n" );
-                                                       printf( "  Clockwise triangle after edge flip (left).\n" );
-                                               }
-                                               if ( counterclockwise( insertpoint, rightpoint, farpoint ) < 0.0 ) {
-                                                       printf( "Internal error in insertsite():\n" );
-                                                       printf( "  Clockwise triangle after edge flip (right).\n" );
-                                               }
-                                       }
+if ( counterclockwise( farpoint, leftpoint, insertpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle after edge flip (left).\n" );
+}
+if ( counterclockwise( insertpoint, rightpoint, farpoint ) < 0.0 ) {
+printf( "Internal error in insertsite():\n" );
+printf( "  Clockwise triangle after edge flip (right).\n" );
+}
+}
 #endif /* SELF_CHECK */
-                                       if ( verbose > 2 ) {
-                                               printf( "  Edge flip results in left " );
-                                               lnextself( topleft );
-                                               printtriangle( &topleft );
-                                               printf( "  and right " );
-                                               printtriangle( &horiz );
-                                       }
-                                       /* On the next iterations, consider the two edges that were  */
-                                       /*   exposed (this is, are now visible to the newly inserted */
-                                       /*   point) by the edge flip.                                */
-                                       lprevself( horiz );
-                                       leftpoint = farpoint;
-                               }
-                       }
-               }
-               if ( !doflip ) {
-                       /* The handle `horiz' is accepted as locally Delaunay. */
-#ifndef CDT_ONLY
-                       if ( triflaws ) {
-                               /* Check the triangle `horiz' for quality. */
-                               testtriangle( &horiz );
-                       }
+if ( verbose > 2 ) {
+printf( "  Edge flip results in left " );
+lnextself( topleft );
+printtriangle( &topleft );
+printf( "  and right " );
+printtriangle( &horiz );
+}
+/* On the next iterations, consider the two edges that were  */
+/*   exposed (this is, are now visible to the newly inserted */
+/*   point) by the edge flip.                                */
+lprevself( horiz );
+leftpoint = farpoint;
+}
+}
+}
+if ( !doflip ) {
+/* The handle `horiz' is accepted as locally Delaunay. */
+#ifndef
+CDT_ONLY
+if ( triflaws ) {
+/* Check the triangle `horiz' for quality. */
+testtriangle( &horiz );
+}
 #endif /* not CDT_ONLY */
-                       /* Look for the next edge around the newly inserted point. */
-                       lnextself( horiz );
-                       sym( horiz, testtri );
-                       /* Check for finishing a complete revolution about the new point, or */
-                       /*   falling off the edge of the triangulation.  The latter will     */
-                       /*   happen when a point is inserted at a boundary.                  */
-                       if ( ( leftpoint == first ) || ( testtri.tri == dummytri ) ) {
-                               /* We're done.  Return a triangle whose origin is the new point. */
-                               lnext( horiz, *searchtri );
-                               lnext( horiz, recenttri );
-                               return success;
-                       }
-                       /* Finish finding the next edge around the newly inserted point. */
-                       lnext( testtri, horiz );
-                       rightpoint = leftpoint;
-                       dest( horiz, leftpoint );
-               }
-       }
+/* Look for the next edge around the newly inserted point. */
+lnextself( horiz );
+sym( horiz, testtri );
+/* Check for finishing a complete revolution about the new point, or */
+/*   falling off the edge of the triangulation.  The latter will     */
+/*   happen when a point is inserted at a boundary.                  */
+if (( leftpoint == first ) || ( testtri.tri == dummytri )) {
+/* We're done.  Return a triangle whose origin is the new point. */
+lnext( horiz, *searchtri );
+lnext( horiz, recenttri );
+return success;
+}
+/* Finish finding the next edge around the newly inserted point. */
+lnext( testtri, horiz );
+rightpoint = leftpoint;
+dest( horiz, leftpoint );
+}
+}
 }
 
 /*****************************************************************************/
@@ -6807,69 +6975,70 @@ int edgecount;
 int doflip;
 int triflaws;
 {
-       struct triedge testtri;
-       struct triedge besttri;
-       struct triedge tempedge;
-       point leftbasepoint, rightbasepoint;
-       point testpoint;
-       point bestpoint;
-       int bestnumber;
-       int i;
-       triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */
-
-       /* Identify the base vertices. */
-       apex( *lastedge, leftbasepoint );
-       dest( *firstedge, rightbasepoint );
-       if ( verbose > 2 ) {
-               printf( "  Triangulating interior polygon at edge\n" );
-               printf( "    (%.12g, %.12g) (%.12g, %.12g)\n", leftbasepoint[0],
-                               leftbasepoint[1], rightbasepoint[0], rightbasepoint[1] );
-       }
-       /* Find the best vertex to connect the base to. */
-       onext( *firstedge, besttri );
-       dest( besttri, bestpoint );
-       triedgecopy( besttri, testtri );
-       bestnumber = 1;
-       for ( i = 2; i <= edgecount - 2; i++ ) {
-               onextself( testtri );
-               dest( testtri, testpoint );
-               /* Is this a better vertex? */
-               if ( incircle( leftbasepoint, rightbasepoint, bestpoint, testpoint ) > 0.0 ) {
-                       triedgecopy( testtri, besttri );
-                       bestpoint = testpoint;
-                       bestnumber = i;
-               }
-       }
-       if ( verbose > 2 ) {
-               printf( "    Connecting edge to (%.12g, %.12g)\n", bestpoint[0],
-                               bestpoint[1] );
-       }
-       if ( bestnumber > 1 ) {
-               /* Recursively triangulate the smaller polygon on the right. */
-               oprev( besttri, tempedge );
-               triangulatepolygon( firstedge, &tempedge, bestnumber + 1, 1, triflaws );
-       }
-       if ( bestnumber < edgecount - 2 ) {
-               /* Recursively triangulate the smaller polygon on the left. */
-               sym( besttri, tempedge );
-               triangulatepolygon( &besttri, lastedge, edgecount - bestnumber, 1,
-                                                       triflaws );
-               /* Find `besttri' again; it may have been lost to edge flips. */
-               sym( tempedge, besttri );
-       }
-       if ( doflip ) {
-               /* Do one final edge flip. */
-               flip( &besttri );
-#ifndef CDT_ONLY
-               if ( triflaws ) {
-                       /* Check the quality of the newly committed triangle. */
-                       sym( besttri, testtri );
-                       testtriangle( &testtri );
-               }
+struct triedge testtri;
+struct triedge besttri;
+struct triedge tempedge;
+point leftbasepoint, rightbasepoint;
+point testpoint;
+point bestpoint;
+int bestnumber;
+int i;
+triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */
+
+/* Identify the base vertices. */
+apex( *lastedge, leftbasepoint );
+dest( *firstedge, rightbasepoint );
+if ( verbose > 2 ) {
+printf( "  Triangulating interior polygon at edge\n" );
+printf( "    (%.12g, %.12g) (%.12g, %.12g)\n", leftbasepoint[0],
+leftbasepoint[1], rightbasepoint[0], rightbasepoint[1] );
+}
+/* Find the best vertex to connect the base to. */
+onext( *firstedge, besttri );
+dest( besttri, bestpoint );
+triedgecopy( besttri, testtri );
+bestnumber = 1;
+for ( i = 2; i <= edgecount - 2; i++ ) {
+onextself( testtri );
+dest( testtri, testpoint );
+/* Is this a better vertex? */
+if ( incircle( leftbasepoint, rightbasepoint, bestpoint, testpoint ) > 0.0 ) {
+triedgecopy( testtri, besttri );
+bestpoint = testpoint;
+bestnumber = i;
+}
+}
+if ( verbose > 2 ) {
+printf( "    Connecting edge to (%.12g, %.12g)\n", bestpoint[0],
+bestpoint[1] );
+}
+if ( bestnumber > 1 ) {
+/* Recursively triangulate the smaller polygon on the right. */
+oprev( besttri, tempedge );
+triangulatepolygon( firstedge, &tempedge, bestnumber + 1, 1, triflaws );
+}
+if ( bestnumber < edgecount - 2 ) {
+/* Recursively triangulate the smaller polygon on the left. */
+sym( besttri, tempedge );
+triangulatepolygon( &besttri, lastedge, edgecount - bestnumber, 1,
+triflaws );
+/* Find `besttri' again; it may have been lost to edge flips. */
+sym( tempedge, besttri );
+}
+if ( doflip ) {
+/* Do one final edge flip. */
+flip( &besttri );
+#ifndef
+CDT_ONLY
+if ( triflaws ) {
+/* Check the quality of the newly committed triangle. */
+sym( besttri, testtri );
+testtriangle( &testtri );
+}
 #endif /* not CDT_ONLY */
-       }
-       /* Return the base triangle. */
-       triedgecopy( besttri, *lastedge );
+}
+/* Return the base triangle. */
+triedgecopy( besttri, *lastedge );
 }
 
 /*****************************************************************************/
@@ -6886,86 +7055,89 @@ int triflaws;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void deletesite( deltri )
 struct triedge *deltri;
 {
-       struct triedge countingtri;
-       struct triedge firstedge, lastedge;
-       struct triedge deltriright;
-       struct triedge lefttri, righttri;
-       struct triedge leftcasing, rightcasing;
-       struct edge leftshelle, rightshelle;
-       point delpoint;
-       point neworg;
-       int edgecount;
-       triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       org( *deltri, delpoint );
-       if ( verbose > 1 ) {
-               printf( "  Deleting (%.12g, %.12g).\n", delpoint[0], delpoint[1] );
-       }
-       pointdealloc( delpoint );
-
-       /* Count the degree of the point being deleted. */
-       onext( *deltri, countingtri );
-       edgecount = 1;
-       while ( !triedgeequal( *deltri, countingtri ) ) {
-#ifdef SELF_CHECK
-               if ( countingtri.tri == dummytri ) {
-                       printf( "Internal error in deletesite():\n" );
-                       printf( "  Attempt to delete boundary point.\n" );
-                       internalerror();
-               }
+struct triedge countingtri;
+struct triedge firstedge, lastedge;
+struct triedge deltriright;
+struct triedge lefttri, righttri;
+struct triedge leftcasing, rightcasing;
+struct edge leftshelle, rightshelle;
+point delpoint;
+point neworg;
+int edgecount;
+triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+org( *deltri, delpoint );
+if ( verbose > 1 ) {
+printf( "  Deleting (%.12g, %.12g).\n", delpoint[0], delpoint[1] );
+}
+pointdealloc( delpoint );
+
+/* Count the degree of the point being deleted. */
+onext( *deltri, countingtri );
+edgecount = 1;
+while ( !triedgeequal( *deltri, countingtri )) {
+#ifdef
+SELF_CHECK
+if ( countingtri.tri == dummytri ) {
+printf( "Internal error in deletesite():\n" );
+printf( "  Attempt to delete boundary point.\n" );
+internalerror();
+}
 #endif /* SELF_CHECK */
-               edgecount++;
-               onextself( countingtri );
-       }
-
-#ifdef SELF_CHECK
-       if ( edgecount < 3 ) {
-               printf( "Internal error in deletesite():\n  Point has degree %d.\n",
-                               edgecount );
-               internalerror();
-       }
+edgecount++;
+onextself( countingtri );
+}
+
+#ifdef
+SELF_CHECK
+if ( edgecount < 3 ) {
+printf( "Internal error in deletesite():\n  Point has degree %d.\n",
+edgecount );
+internalerror();
+}
 #endif /* SELF_CHECK */
-       if ( edgecount > 3 ) {
-               /* Triangulate the polygon defined by the union of all triangles */
-               /*   adjacent to the point being deleted.  Check the quality of  */
-               /*   the resulting triangles.                                    */
-               onext( *deltri, firstedge );
-               oprev( *deltri, lastedge );
-               triangulatepolygon( &firstedge, &lastedge, edgecount, 0, !nobisect );
-       }
-       /* Splice out two triangles. */
-       lprev( *deltri, deltriright );
-       dnext( *deltri, lefttri );
-       sym( lefttri, leftcasing );
-       oprev( deltriright, righttri );
-       sym( righttri, rightcasing );
-       bond( *deltri, leftcasing );
-       bond( deltriright, rightcasing );
-       tspivot( lefttri, leftshelle );
-       if ( leftshelle.sh != dummysh ) {
-               tsbond( *deltri, leftshelle );
-       }
-       tspivot( righttri, rightshelle );
-       if ( rightshelle.sh != dummysh ) {
-               tsbond( deltriright, rightshelle );
-       }
-
-       /* Set the new origin of `deltri' and check its quality. */
-       org( lefttri, neworg );
-       setorg( *deltri, neworg );
-       if ( !nobisect ) {
-               testtriangle( deltri );
-       }
-
-       /* Delete the two spliced-out triangles. */
-       triangledealloc( lefttri.tri );
-       triangledealloc( righttri.tri );
+if ( edgecount > 3 ) {
+/* Triangulate the polygon defined by the union of all triangles */
+/*   adjacent to the point being deleted.  Check the quality of  */
+/*   the resulting triangles.                                    */
+onext( *deltri, firstedge );
+oprev( *deltri, lastedge );
+triangulatepolygon( &firstedge, &lastedge, edgecount, 0, !nobisect );
+}
+/* Splice out two triangles. */
+lprev( *deltri, deltriright );
+dnext( *deltri, lefttri );
+sym( lefttri, leftcasing );
+oprev( deltriright, righttri );
+sym( righttri, rightcasing );
+bond( *deltri, leftcasing );
+bond( deltriright, rightcasing );
+tspivot( lefttri, leftshelle );
+if ( leftshelle.sh != dummysh ) {
+tsbond( *deltri, leftshelle );
+}
+tspivot( righttri, rightshelle );
+if ( rightshelle.sh != dummysh ) {
+tsbond( deltriright, rightshelle );
+}
+
+/* Set the new origin of `deltri' and check its quality. */
+org( lefttri, neworg );
+setorg( *deltri, neworg );
+if ( !nobisect ) {
+testtriangle( deltri );
+}
+
+/* Delete the two spliced-out triangles. */
+triangledealloc( lefttri.tri );
+triangledealloc( righttri.tri );
 }
 
 #endif /* not CDT_ONLY */
@@ -7023,57 +7195,57 @@ void pointsort( sortarray, arraysize )
 point * sortarray;
 int arraysize;
 {
-       int left, right;
-       int pivot;
-       REAL pivotx, pivoty;
-       point temp;
-
-       if ( arraysize == 2 ) {
-               /* Recursive base case. */
-               if ( ( sortarray[0][0] > sortarray[1][0] ) ||
-                        ( ( sortarray[0][0] == sortarray[1][0] ) &&
-                          ( sortarray[0][1] > sortarray[1][1] ) ) ) {
-                       temp = sortarray[1];
-                       sortarray[1] = sortarray[0];
-                       sortarray[0] = temp;
-               }
-               return;
-       }
-       /* Choose a random pivot to split the array. */
-       pivot = (int) randomnation( arraysize );
-       pivotx = sortarray[pivot][0];
-       pivoty = sortarray[pivot][1];
-       /* Split the array. */
-       left = -1;
-       right = arraysize;
-       while ( left < right ) {
-               /* Search for a point whose x-coordinate is too large for the left. */
-               do {
-                       left++;
-               } while ( ( left <= right ) && ( ( sortarray[left][0] < pivotx ) ||
-                                                                                ( ( sortarray[left][0] == pivotx ) &&
-                                                                                  ( sortarray[left][1] < pivoty ) ) ) );
-               /* Search for a point whose x-coordinate is too small for the right. */
-               do {
-                       right--;
-               } while ( ( left <= right ) && ( ( sortarray[right][0] > pivotx ) ||
-                                                                                ( ( sortarray[right][0] == pivotx ) &&
-                                                                                  ( sortarray[right][1] > pivoty ) ) ) );
-               if ( left < right ) {
-                       /* Swap the left and right points. */
-                       temp = sortarray[left];
-                       sortarray[left] = sortarray[right];
-                       sortarray[right] = temp;
-               }
-       }
-       if ( left > 1 ) {
-               /* Recursively sort the left subset. */
-               pointsort( sortarray, left );
-       }
-       if ( right < arraysize - 2 ) {
-               /* Recursively sort the right subset. */
-               pointsort( &sortarray[right + 1], arraysize - right - 1 );
-       }
+int left, right;
+int pivot;
+REAL pivotx, pivoty;
+point temp;
+
+if ( arraysize == 2 ) {
+/* Recursive base case. */
+if (( sortarray[0][0] > sortarray[1][0] ) ||
+(( sortarray[0][0] == sortarray[1][0] ) &&
+( sortarray[0][1] > sortarray[1][1] ))) {
+temp = sortarray[1];
+sortarray[1] = sortarray[0];
+sortarray[0] = temp;
+}
+return;
+}
+/* Choose a random pivot to split the array. */
+pivot = (int) randomnation( arraysize );
+pivotx = sortarray[pivot][0];
+pivoty = sortarray[pivot][1];
+/* Split the array. */
+left = -1;
+right = arraysize;
+while ( left < right ) {
+/* Search for a point whose x-coordinate is too large for the left. */
+do {
+left++;
+} while (( left <= right ) && (( sortarray[left][0] < pivotx ) ||
+(( sortarray[left][0] == pivotx ) &&
+( sortarray[left][1] < pivoty ))));
+/* Search for a point whose x-coordinate is too small for the right. */
+do {
+right--;
+} while (( left <= right ) && (( sortarray[right][0] > pivotx ) ||
+(( sortarray[right][0] == pivotx ) &&
+( sortarray[right][1] > pivoty ))));
+if ( left < right ) {
+/* Swap the left and right points. */
+temp = sortarray[left];
+sortarray[left] = sortarray[right];
+sortarray[right] = temp;
+}
+}
+if ( left > 1 ) {
+/* Recursively sort the left subset. */
+pointsort( sortarray, left );
+}
+if ( right < arraysize - 2 ) {
+/* Recursively sort the right subset. */
+pointsort( &sortarray[right + 1], arraysize - right - 1 );
+}
 }
 
 /*****************************************************************************/
@@ -7094,60 +7266,60 @@ int arraysize;
 int median;
 int axis;
 {
-       int left, right;
-       int pivot;
-       REAL pivot1, pivot2;
-       point temp;
-
-       if ( arraysize == 2 ) {
-               /* Recursive base case. */
-               if ( ( sortarray[0][axis] > sortarray[1][axis] ) ||
-                        ( ( sortarray[0][axis] == sortarray[1][axis] ) &&
-                          ( sortarray[0][1 - axis] > sortarray[1][1 - axis] ) ) ) {
-                       temp = sortarray[1];
-                       sortarray[1] = sortarray[0];
-                       sortarray[0] = temp;
-               }
-               return;
-       }
-       /* Choose a random pivot to split the array. */
-       pivot = (int) randomnation( arraysize );
-       pivot1 = sortarray[pivot][axis];
-       pivot2 = sortarray[pivot][1 - axis];
-       /* Split the array. */
-       left = -1;
-       right = arraysize;
-       while ( left < right ) {
-               /* Search for a point whose x-coordinate is too large for the left. */
-               do {
-                       left++;
-               } while ( ( left <= right ) && ( ( sortarray[left][axis] < pivot1 ) ||
-                                                                                ( ( sortarray[left][axis] == pivot1 ) &&
-                                                                                  ( sortarray[left][1 - axis] < pivot2 ) ) ) );
-               /* Search for a point whose x-coordinate is too small for the right. */
-               do {
-                       right--;
-               } while ( ( left <= right ) && ( ( sortarray[right][axis] > pivot1 ) ||
-                                                                                ( ( sortarray[right][axis] == pivot1 ) &&
-                                                                                  ( sortarray[right][1 - axis] > pivot2 ) ) ) );
-               if ( left < right ) {
-                       /* Swap the left and right points. */
-                       temp = sortarray[left];
-                       sortarray[left] = sortarray[right];
-                       sortarray[right] = temp;
-               }
-       }
-       /* Unlike in pointsort(), at most one of the following */
-       /*   conditionals is true.                             */
-       if ( left > median ) {
-               /* Recursively shuffle the left subset. */
-               pointmedian( sortarray, left, median, axis );
-       }
-       if ( right < median - 1 ) {
-               /* Recursively shuffle the right subset. */
-               pointmedian( &sortarray[right + 1], arraysize - right - 1,
-                                        median - right - 1, axis );
-       }
+int left, right;
+int pivot;
+REAL pivot1, pivot2;
+point temp;
+
+if ( arraysize == 2 ) {
+/* Recursive base case. */
+if (( sortarray[0][axis] > sortarray[1][axis] ) ||
+(( sortarray[0][axis] == sortarray[1][axis] ) &&
+( sortarray[0][1 - axis] > sortarray[1][1 - axis] ))) {
+temp = sortarray[1];
+sortarray[1] = sortarray[0];
+sortarray[0] = temp;
+}
+return;
+}
+/* Choose a random pivot to split the array. */
+pivot = (int) randomnation( arraysize );
+pivot1 = sortarray[pivot][axis];
+pivot2 = sortarray[pivot][1 - axis];
+/* Split the array. */
+left = -1;
+right = arraysize;
+while ( left < right ) {
+/* Search for a point whose x-coordinate is too large for the left. */
+do {
+left++;
+} while (( left <= right ) && (( sortarray[left][axis] < pivot1 ) ||
+(( sortarray[left][axis] == pivot1 ) &&
+( sortarray[left][1 - axis] < pivot2 ))));
+/* Search for a point whose x-coordinate is too small for the right. */
+do {
+right--;
+} while (( left <= right ) && (( sortarray[right][axis] > pivot1 ) ||
+(( sortarray[right][axis] == pivot1 ) &&
+( sortarray[right][1 - axis] > pivot2 ))));
+if ( left < right ) {
+/* Swap the left and right points. */
+temp = sortarray[left];
+sortarray[left] = sortarray[right];
+sortarray[right] = temp;
+}
+}
+/* Unlike in pointsort(), at most one of the following */
+/*   conditionals is true.                             */
+if ( left > median ) {
+/* Recursively shuffle the left subset. */
+pointmedian( sortarray, left, median, axis );
+}
+if ( right < median - 1 ) {
+/* Recursively shuffle the right subset. */
+pointmedian( &sortarray[right + 1], arraysize - right - 1,
+median - right - 1, axis );
+}
 }
 
 /*****************************************************************************/
@@ -7166,23 +7338,23 @@ point * sortarray;
 int arraysize;
 int axis;
 {
-       int divider;
+int divider;
 
-       divider = arraysize >> 1;
-       if ( arraysize <= 3 ) {
-               /* Recursive base case:  subsets of two or three points will be      */
-               /*   handled specially, and should always be sorted by x-coordinate. */
-               axis = 0;
-       }
-       /* Partition with a horizontal or vertical cut. */
-       pointmedian( sortarray, arraysize, divider, axis );
-       /* Recursively partition the subsets with a cross cut. */
-       if ( arraysize - divider >= 2 ) {
-               if ( divider >= 2 ) {
-                       alternateaxes( sortarray, divider, 1 - axis );
-               }
-               alternateaxes( &sortarray[divider], arraysize - divider, 1 - axis );
-       }
+divider = arraysize >> 1;
+if ( arraysize <= 3 ) {
+/* Recursive base case:  subsets of two or three points will be      */
+/*   handled specially, and should always be sorted by x-coordinate. */
+axis = 0;
+}
+/* Partition with a horizontal or vertical cut. */
+pointmedian( sortarray, arraysize, divider, axis );
+/* Recursively partition the subsets with a cross cut. */
+if ( arraysize - divider >= 2 ) {
+if ( divider >= 2 ) {
+alternateaxes( sortarray, divider, 1 - axis );
+}
+alternateaxes( &sortarray[divider], arraysize - divider, 1 - axis );
+}
 }
 
 /*****************************************************************************/
@@ -7227,293 +7399,293 @@ struct triedge *innerright;
 struct triedge *farright;
 int axis;
 {
-       struct triedge leftcand, rightcand;
-       struct triedge baseedge;
-       struct triedge nextedge;
-       struct triedge sidecasing, topcasing, outercasing;
-       struct triedge checkedge;
-       point innerleftdest;
-       point innerrightorg;
-       point innerleftapex, innerrightapex;
-       point farleftpt, farrightpt;
-       point farleftapex, farrightapex;
-       point lowerleft, lowerright;
-       point upperleft, upperright;
-       point nextapex;
-       point checkvertex;
-       int changemade;
-       int badedge;
-       int leftfinished, rightfinished;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-       dest( *innerleft, innerleftdest );
-       apex( *innerleft, innerleftapex );
-       org( *innerright, innerrightorg );
-       apex( *innerright, innerrightapex );
-       /* Special treatment for horizontal cuts. */
-       if ( dwyer && ( axis == 1 ) ) {
-               org( *farleft, farleftpt );
-               apex( *farleft, farleftapex );
-               dest( *farright, farrightpt );
-               apex( *farright, farrightapex );
-               /* The pointers to the extremal points are shifted to point to the */
-               /*   topmost and bottommost point of each hull, rather than the    */
-               /*   leftmost and rightmost points.                                */
-               while ( farleftapex[1] < farleftpt[1] ) {
-                       lnextself( *farleft );
-                       symself( *farleft );
-                       farleftpt = farleftapex;
-                       apex( *farleft, farleftapex );
-               }
-               sym( *innerleft, checkedge );
-               apex( checkedge, checkvertex );
-               while ( checkvertex[1] > innerleftdest[1] ) {
-                       lnext( checkedge, *innerleft );
-                       innerleftapex = innerleftdest;
-                       innerleftdest = checkvertex;
-                       sym( *innerleft, checkedge );
-                       apex( checkedge, checkvertex );
-               }
-               while ( innerrightapex[1] < innerrightorg[1] ) {
-                       lnextself( *innerright );
-                       symself( *innerright );
-                       innerrightorg = innerrightapex;
-                       apex( *innerright, innerrightapex );
-               }
-               sym( *farright, checkedge );
-               apex( checkedge, checkvertex );
-               while ( checkvertex[1] > farrightpt[1] ) {
-                       lnext( checkedge, *farright );
-                       farrightapex = farrightpt;
-                       farrightpt = checkvertex;
-                       sym( *farright, checkedge );
-                       apex( checkedge, checkvertex );
-               }
-       }
-       /* Find a line tangent to and below both hulls. */
-       do {
-               changemade = 0;
-               /* Make innerleftdest the "bottommost" point of the left hull. */
-               if ( counterclockwise( innerleftdest, innerleftapex, innerrightorg ) > 0.0 ) {
-                       lprevself( *innerleft );
-                       symself( *innerleft );
-                       innerleftdest = innerleftapex;
-                       apex( *innerleft, innerleftapex );
-                       changemade = 1;
-               }
-               /* Make innerrightorg the "bottommost" point of the right hull. */
-               if ( counterclockwise( innerrightapex, innerrightorg, innerleftdest ) > 0.0 ) {
-                       lnextself( *innerright );
-                       symself( *innerright );
-                       innerrightorg = innerrightapex;
-                       apex( *innerright, innerrightapex );
-                       changemade = 1;
-               }
-       } while ( changemade );
-       /* Find the two candidates to be the next "gear tooth". */
-       sym( *innerleft, leftcand );
-       sym( *innerright, rightcand );
-       /* Create the bottom new bounding triangle. */
-       maketriangle( &baseedge );
-       /* Connect it to the bounding boxes of the left and right triangulations. */
-       bond( baseedge, *innerleft );
-       lnextself( baseedge );
-       bond( baseedge, *innerright );
-       lnextself( baseedge );
-       setorg( baseedge, innerrightorg );
-       setdest( baseedge, innerleftdest );
-       /* Apex is intentionally left NULL. */
-       if ( verbose > 2 ) {
-               printf( "  Creating base bounding " );
-               printtriangle( &baseedge );
-       }
-       /* Fix the extreme triangles if necessary. */
-       org( *farleft, farleftpt );
-       if ( innerleftdest == farleftpt ) {
-               lnext( baseedge, *farleft );
-       }
-       dest( *farright, farrightpt );
-       if ( innerrightorg == farrightpt ) {
-               lprev( baseedge, *farright );
-       }
-       /* The vertices of the current knitting edge. */
-       lowerleft = innerleftdest;
-       lowerright = innerrightorg;
-       /* The candidate vertices for knitting. */
-       apex( leftcand, upperleft );
-       apex( rightcand, upperright );
-       /* Walk up the gap between the two triangulations, knitting them together. */
-       while ( 1 ) {
-               /* Have we reached the top?  (This isn't quite the right question,       */
-               /*   because even though the left triangulation might seem finished now, */
-               /*   moving up on the right triangulation might reveal a new point of    */
-               /*   the left triangulation.  And vice-versa.)                           */
-               leftfinished = counterclockwise( upperleft, lowerleft, lowerright ) <= 0.0;
-               rightfinished = counterclockwise( upperright, lowerleft, lowerright ) <= 0.0;
-               if ( leftfinished && rightfinished ) {
-                       /* Create the top new bounding triangle. */
-                       maketriangle( &nextedge );
-                       setorg( nextedge, lowerleft );
-                       setdest( nextedge, lowerright );
-                       /* Apex is intentionally left NULL. */
-                       /* Connect it to the bounding boxes of the two triangulations. */
-                       bond( nextedge, baseedge );
-                       lnextself( nextedge );
-                       bond( nextedge, rightcand );
-                       lnextself( nextedge );
-                       bond( nextedge, leftcand );
-                       if ( verbose > 2 ) {
-                               printf( "  Creating top bounding " );
-                               printtriangle( &baseedge );
-                       }
-                       /* Special treatment for horizontal cuts. */
-                       if ( dwyer && ( axis == 1 ) ) {
-                               org( *farleft, farleftpt );
-                               apex( *farleft, farleftapex );
-                               dest( *farright, farrightpt );
-                               apex( *farright, farrightapex );
-                               sym( *farleft, checkedge );
-                               apex( checkedge, checkvertex );
-                               /* The pointers to the extremal points are restored to the leftmost */
-                               /*   and rightmost points (rather than topmost and bottommost).     */
-                               while ( checkvertex[0] < farleftpt[0] ) {
-                                       lprev( checkedge, *farleft );
-                                       farleftapex = farleftpt;
-                                       farleftpt = checkvertex;
-                                       sym( *farleft, checkedge );
-                                       apex( checkedge, checkvertex );
-                               }
-                               while ( farrightapex[0] > farrightpt[0] ) {
-                                       lprevself( *farright );
-                                       symself( *farright );
-                                       farrightpt = farrightapex;
-                                       apex( *farright, farrightapex );
-                               }
-                       }
-                       return;
-               }
-               /* Consider eliminating edges from the left triangulation. */
-               if ( !leftfinished ) {
-                       /* What vertex would be exposed if an edge were deleted? */
-                       lprev( leftcand, nextedge );
-                       symself( nextedge );
-                       apex( nextedge, nextapex );
-                       /* If nextapex is NULL, then no vertex would be exposed; the */
-                       /*   triangulation would have been eaten right through.      */
-                       if ( nextapex != (point) NULL ) {
-                               /* Check whether the edge is Delaunay. */
-                               badedge = incircle( lowerleft, lowerright, upperleft, nextapex ) > 0.0;
-                               while ( badedge ) {
-                                       /* Eliminate the edge with an edge flip.  As a result, the    */
-                                       /*   left triangulation will have one more boundary triangle. */
-                                       lnextself( nextedge );
-                                       sym( nextedge, topcasing );
-                                       lnextself( nextedge );
-                                       sym( nextedge, sidecasing );
-                                       bond( nextedge, topcasing );
-                                       bond( leftcand, sidecasing );
-                                       lnextself( leftcand );
-                                       sym( leftcand, outercasing );
-                                       lprevself( nextedge );
-                                       bond( nextedge, outercasing );
-                                       /* Correct the vertices to reflect the edge flip. */
-                                       setorg( leftcand, lowerleft );
-                                       setdest( leftcand, NULL );
-                                       setapex( leftcand, nextapex );
-                                       setorg( nextedge, NULL );
-                                       setdest( nextedge, upperleft );
-                                       setapex( nextedge, nextapex );
-                                       /* Consider the newly exposed vertex. */
-                                       upperleft = nextapex;
-                                       /* What vertex would be exposed if another edge were deleted? */
-                                       triedgecopy( sidecasing, nextedge );
-                                       apex( nextedge, nextapex );
-                                       if ( nextapex != (point) NULL ) {
-                                               /* Check whether the edge is Delaunay. */
-                                               badedge = incircle( lowerleft, lowerright, upperleft, nextapex )
-                                                                 > 0.0;
-                                       }
-                                       else {
-                                               /* Avoid eating right through the triangulation. */
-                                               badedge = 0;
-                                       }
-                               }
-                       }
-               }
-               /* Consider eliminating edges from the right triangulation. */
-               if ( !rightfinished ) {
-                       /* What vertex would be exposed if an edge were deleted? */
-                       lnext( rightcand, nextedge );
-                       symself( nextedge );
-                       apex( nextedge, nextapex );
-                       /* If nextapex is NULL, then no vertex would be exposed; the */
-                       /*   triangulation would have been eaten right through.      */
-                       if ( nextapex != (point) NULL ) {
-                               /* Check whether the edge is Delaunay. */
-                               badedge = incircle( lowerleft, lowerright, upperright, nextapex ) > 0.0;
-                               while ( badedge ) {
-                                       /* Eliminate the edge with an edge flip.  As a result, the     */
-                                       /*   right triangulation will have one more boundary triangle. */
-                                       lprevself( nextedge );
-                                       sym( nextedge, topcasing );
-                                       lprevself( nextedge );
-                                       sym( nextedge, sidecasing );
-                                       bond( nextedge, topcasing );
-                                       bond( rightcand, sidecasing );
-                                       lprevself( rightcand );
-                                       sym( rightcand, outercasing );
-                                       lnextself( nextedge );
-                                       bond( nextedge, outercasing );
-                                       /* Correct the vertices to reflect the edge flip. */
-                                       setorg( rightcand, NULL );
-                                       setdest( rightcand, lowerright );
-                                       setapex( rightcand, nextapex );
-                                       setorg( nextedge, upperright );
-                                       setdest( nextedge, NULL );
-                                       setapex( nextedge, nextapex );
-                                       /* Consider the newly exposed vertex. */
-                                       upperright = nextapex;
-                                       /* What vertex would be exposed if another edge were deleted? */
-                                       triedgecopy( sidecasing, nextedge );
-                                       apex( nextedge, nextapex );
-                                       if ( nextapex != (point) NULL ) {
-                                               /* Check whether the edge is Delaunay. */
-                                               badedge = incircle( lowerleft, lowerright, upperright, nextapex )
-                                                                 > 0.0;
-                                       }
-                                       else {
-                                               /* Avoid eating right through the triangulation. */
-                                               badedge = 0;
-                                       }
-                               }
-                       }
-               }
-               if ( leftfinished || ( !rightfinished &&
-                                                          ( incircle( upperleft, lowerleft, lowerright, upperright ) > 0.0 ) ) ) {
-                       /* Knit the triangulations, adding an edge from `lowerleft' */
-                       /*   to `upperright'.                                       */
-                       bond( baseedge, rightcand );
-                       lprev( rightcand, baseedge );
-                       setdest( baseedge, lowerleft );
-                       lowerright = upperright;
-                       sym( baseedge, rightcand );
-                       apex( rightcand, upperright );
-               }
-               else {
-                       /* Knit the triangulations, adding an edge from `upperleft' */
-                       /*   to `lowerright'.                                       */
-                       bond( baseedge, leftcand );
-                       lnext( leftcand, baseedge );
-                       setorg( baseedge, lowerright );
-                       lowerleft = upperleft;
-                       sym( baseedge, leftcand );
-                       apex( leftcand, upperleft );
-               }
-               if ( verbose > 2 ) {
-                       printf( "  Connecting " );
-                       printtriangle( &baseedge );
-               }
-       }
+struct triedge leftcand, rightcand;
+struct triedge baseedge;
+struct triedge nextedge;
+struct triedge sidecasing, topcasing, outercasing;
+struct triedge checkedge;
+point innerleftdest;
+point innerrightorg;
+point innerleftapex, innerrightapex;
+point farleftpt, farrightpt;
+point farleftapex, farrightapex;
+point lowerleft, lowerright;
+point upperleft, upperright;
+point nextapex;
+point checkvertex;
+int changemade;
+int badedge;
+int leftfinished, rightfinished;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+dest( *innerleft, innerleftdest );
+apex( *innerleft, innerleftapex );
+org( *innerright, innerrightorg );
+apex( *innerright, innerrightapex );
+/* Special treatment for horizontal cuts. */
+if ( dwyer && ( axis == 1 )) {
+org( *farleft, farleftpt );
+apex( *farleft, farleftapex );
+dest( *farright, farrightpt );
+apex( *farright, farrightapex );
+/* The pointers to the extremal points are shifted to point to the */
+/*   topmost and bottommost point of each hull, rather than the    */
+/*   leftmost and rightmost points.                                */
+while ( farleftapex[1] < farleftpt[1] ) {
+lnextself( *farleft );
+symself( *farleft );
+farleftpt = farleftapex;
+apex( *farleft, farleftapex );
+}
+sym( *innerleft, checkedge );
+apex( checkedge, checkvertex );
+while ( checkvertex[1] > innerleftdest[1] ) {
+lnext( checkedge, *innerleft );
+innerleftapex = innerleftdest;
+innerleftdest = checkvertex;
+sym( *innerleft, checkedge );
+apex( checkedge, checkvertex );
+}
+while ( innerrightapex[1] < innerrightorg[1] ) {
+lnextself( *innerright );
+symself( *innerright );
+innerrightorg = innerrightapex;
+apex( *innerright, innerrightapex );
+}
+sym( *farright, checkedge );
+apex( checkedge, checkvertex );
+while ( checkvertex[1] > farrightpt[1] ) {
+lnext( checkedge, *farright );
+farrightapex = farrightpt;
+farrightpt = checkvertex;
+sym( *farright, checkedge );
+apex( checkedge, checkvertex );
+}
+}
+/* Find a line tangent to and below both hulls. */
+do {
+changemade = 0;
+/* Make innerleftdest the "bottommost" point of the left hull. */
+if ( counterclockwise( innerleftdest, innerleftapex, innerrightorg ) > 0.0 ) {
+lprevself( *innerleft );
+symself( *innerleft );
+innerleftdest = innerleftapex;
+apex( *innerleft, innerleftapex );
+changemade = 1;
+}
+/* Make innerrightorg the "bottommost" point of the right hull. */
+if ( counterclockwise( innerrightapex, innerrightorg, innerleftdest ) > 0.0 ) {
+lnextself( *innerright );
+symself( *innerright );
+innerrightorg = innerrightapex;
+apex( *innerright, innerrightapex );
+changemade = 1;
+}
+} while ( changemade );
+/* Find the two candidates to be the next "gear tooth". */
+sym( *innerleft, leftcand );
+sym( *innerright, rightcand );
+/* Create the bottom new bounding triangle. */
+maketriangle( &baseedge );
+/* Connect it to the bounding boxes of the left and right triangulations. */
+bond( baseedge, *innerleft );
+lnextself( baseedge );
+bond( baseedge, *innerright );
+lnextself( baseedge );
+setorg( baseedge, innerrightorg );
+setdest( baseedge, innerleftdest );
+/* Apex is intentionally left NULL. */
+if ( verbose > 2 ) {
+printf( "  Creating base bounding " );
+printtriangle( &baseedge );
+}
+/* Fix the extreme triangles if necessary. */
+org( *farleft, farleftpt );
+if ( innerleftdest == farleftpt ) {
+lnext( baseedge, *farleft );
+}
+dest( *farright, farrightpt );
+if ( innerrightorg == farrightpt ) {
+lprev( baseedge, *farright );
+}
+/* The vertices of the current knitting edge. */
+lowerleft = innerleftdest;
+lowerright = innerrightorg;
+/* The candidate vertices for knitting. */
+apex( leftcand, upperleft );
+apex( rightcand, upperright );
+/* Walk up the gap between the two triangulations, knitting them together. */
+while ( 1 ) {
+/* Have we reached the top?  (This isn't quite the right question,       */
+/*   because even though the left triangulation might seem finished now, */
+/*   moving up on the right triangulation might reveal a new point of    */
+/*   the left triangulation.  And vice-versa.)                           */
+leftfinished = counterclockwise( upperleft, lowerleft, lowerright ) <= 0.0;
+rightfinished = counterclockwise( upperright, lowerleft, lowerright ) <= 0.0;
+if ( leftfinished && rightfinished ) {
+/* Create the top new bounding triangle. */
+maketriangle( &nextedge );
+setorg( nextedge, lowerleft );
+setdest( nextedge, lowerright );
+/* Apex is intentionally left NULL. */
+/* Connect it to the bounding boxes of the two triangulations. */
+bond( nextedge, baseedge );
+lnextself( nextedge );
+bond( nextedge, rightcand );
+lnextself( nextedge );
+bond( nextedge, leftcand );
+if ( verbose > 2 ) {
+printf( "  Creating top bounding " );
+printtriangle( &baseedge );
+}
+/* Special treatment for horizontal cuts. */
+if ( dwyer && ( axis == 1 )) {
+org( *farleft, farleftpt );
+apex( *farleft, farleftapex );
+dest( *farright, farrightpt );
+apex( *farright, farrightapex );
+sym( *farleft, checkedge );
+apex( checkedge, checkvertex );
+/* The pointers to the extremal points are restored to the leftmost */
+/*   and rightmost points (rather than topmost and bottommost).     */
+while ( checkvertex[0] < farleftpt[0] ) {
+lprev( checkedge, *farleft );
+farleftapex = farleftpt;
+farleftpt = checkvertex;
+sym( *farleft, checkedge );
+apex( checkedge, checkvertex );
+}
+while ( farrightapex[0] > farrightpt[0] ) {
+lprevself( *farright );
+symself( *farright );
+farrightpt = farrightapex;
+apex( *farright, farrightapex );
+}
+}
+return;
+}
+/* Consider eliminating edges from the left triangulation. */
+if ( !leftfinished ) {
+/* What vertex would be exposed if an edge were deleted? */
+lprev( leftcand, nextedge );
+symself( nextedge );
+apex( nextedge, nextapex );
+/* If nextapex is NULL, then no vertex would be exposed; the */
+/*   triangulation would have been eaten right through.      */
+if ( nextapex != (point) NULL ) {
+/* Check whether the edge is Delaunay. */
+badedge = incircle( lowerleft, lowerright, upperleft, nextapex ) > 0.0;
+while ( badedge ) {
+/* Eliminate the edge with an edge flip.  As a result, the    */
+/*   left triangulation will have one more boundary triangle. */
+lnextself( nextedge );
+sym( nextedge, topcasing );
+lnextself( nextedge );
+sym( nextedge, sidecasing );
+bond( nextedge, topcasing );
+bond( leftcand, sidecasing );
+lnextself( leftcand );
+sym( leftcand, outercasing );
+lprevself( nextedge );
+bond( nextedge, outercasing );
+/* Correct the vertices to reflect the edge flip. */
+setorg( leftcand, lowerleft );
+setdest( leftcand, NULL );
+setapex( leftcand, nextapex );
+setorg( nextedge, NULL );
+setdest( nextedge, upperleft );
+setapex( nextedge, nextapex );
+/* Consider the newly exposed vertex. */
+upperleft = nextapex;
+/* What vertex would be exposed if another edge were deleted? */
+triedgecopy( sidecasing, nextedge );
+apex( nextedge, nextapex );
+if ( nextapex != (point) NULL ) {
+/* Check whether the edge is Delaunay. */
+badedge = incircle( lowerleft, lowerright, upperleft, nextapex )
+> 0.0;
+}
+else {
+/* Avoid eating right through the triangulation. */
+badedge = 0;
+}
+}
+}
+}
+/* Consider eliminating edges from the right triangulation. */
+if ( !rightfinished ) {
+/* What vertex would be exposed if an edge were deleted? */
+lnext( rightcand, nextedge );
+symself( nextedge );
+apex( nextedge, nextapex );
+/* If nextapex is NULL, then no vertex would be exposed; the */
+/*   triangulation would have been eaten right through.      */
+if ( nextapex != (point) NULL ) {
+/* Check whether the edge is Delaunay. */
+badedge = incircle( lowerleft, lowerright, upperright, nextapex ) > 0.0;
+while ( badedge ) {
+/* Eliminate the edge with an edge flip.  As a result, the     */
+/*   right triangulation will have one more boundary triangle. */
+lprevself( nextedge );
+sym( nextedge, topcasing );
+lprevself( nextedge );
+sym( nextedge, sidecasing );
+bond( nextedge, topcasing );
+bond( rightcand, sidecasing );
+lprevself( rightcand );
+sym( rightcand, outercasing );
+lnextself( nextedge );
+bond( nextedge, outercasing );
+/* Correct the vertices to reflect the edge flip. */
+setorg( rightcand, NULL );
+setdest( rightcand, lowerright );
+setapex( rightcand, nextapex );
+setorg( nextedge, upperright );
+setdest( nextedge, NULL );
+setapex( nextedge, nextapex );
+/* Consider the newly exposed vertex. */
+upperright = nextapex;
+/* What vertex would be exposed if another edge were deleted? */
+triedgecopy( sidecasing, nextedge );
+apex( nextedge, nextapex );
+if ( nextapex != (point) NULL ) {
+/* Check whether the edge is Delaunay. */
+badedge = incircle( lowerleft, lowerright, upperright, nextapex )
+> 0.0;
+}
+else {
+/* Avoid eating right through the triangulation. */
+badedge = 0;
+}
+}
+}
+}
+if ( leftfinished || ( !rightfinished &&
+( incircle( upperleft, lowerleft, lowerright, upperright ) > 0.0 ))) {
+/* Knit the triangulations, adding an edge from `lowerleft' */
+/*   to `upperright'.                                       */
+bond( baseedge, rightcand );
+lprev( rightcand, baseedge );
+setdest( baseedge, lowerleft );
+lowerright = upperright;
+sym( baseedge, rightcand );
+apex( rightcand, upperright );
+}
+else {
+/* Knit the triangulations, adding an edge from `upperleft' */
+/*   to `lowerright'.                                       */
+bond( baseedge, leftcand );
+lnext( leftcand, baseedge );
+setorg( baseedge, lowerright );
+lowerleft = upperleft;
+sym( baseedge, leftcand );
+apex( leftcand, upperleft );
+}
+if ( verbose > 2 ) {
+printf( "  Connecting " );
+printtriangle( &baseedge );
+}
+}
 }
 
 /*****************************************************************************/
@@ -7540,205 +7712,205 @@ int axis;
 struct triedge *farleft;
 struct triedge *farright;
 {
-       struct triedge midtri, tri1, tri2, tri3;
-       struct triedge innerleft, innerright;
-       REAL area;
-       int divider;
-
-       if ( verbose > 2 ) {
-               printf( "  Triangulating %d points.\n", vertices );
-       }
-       if ( vertices == 2 ) {
-               /* The triangulation of two vertices is an edge.  An edge is */
-               /*   represented by two bounding triangles.                  */
-               maketriangle( farleft );
-               setorg( *farleft, sortarray[0] );
-               setdest( *farleft, sortarray[1] );
-               /* The apex is intentionally left NULL. */
-               maketriangle( farright );
-               setorg( *farright, sortarray[1] );
-               setdest( *farright, sortarray[0] );
-               /* The apex is intentionally left NULL. */
-               bond( *farleft, *farright );
-               lprevself( *farleft );
-               lnextself( *farright );
-               bond( *farleft, *farright );
-               lprevself( *farleft );
-               lnextself( *farright );
-               bond( *farleft, *farright );
-               if ( verbose > 2 ) {
-                       printf( "  Creating " );
-                       printtriangle( farleft );
-                       printf( "  Creating " );
-                       printtriangle( farright );
-               }
-               /* Ensure that the origin of `farleft' is sortarray[0]. */
-               lprev( *farright, *farleft );
-               return;
-       }
-       else if ( vertices == 3 ) {
-               /* The triangulation of three vertices is either a triangle (with */
-               /*   three bounding triangles) or two edges (with four bounding   */
-               /*   triangles).  In either case, four triangles are created.     */
-               maketriangle( &midtri );
-               maketriangle( &tri1 );
-               maketriangle( &tri2 );
-               maketriangle( &tri3 );
-               area = counterclockwise( sortarray[0], sortarray[1], sortarray[2] );
-               if ( area == 0.0 ) {
-                       /* Three collinear points; the triangulation is two edges. */
-                       setorg( midtri, sortarray[0] );
-                       setdest( midtri, sortarray[1] );
-                       setorg( tri1, sortarray[1] );
-                       setdest( tri1, sortarray[0] );
-                       setorg( tri2, sortarray[2] );
-                       setdest( tri2, sortarray[1] );
-                       setorg( tri3, sortarray[1] );
-                       setdest( tri3, sortarray[2] );
-                       /* All apices are intentionally left NULL. */
-                       bond( midtri, tri1 );
-                       bond( tri2, tri3 );
-                       lnextself( midtri );
-                       lprevself( tri1 );
-                       lnextself( tri2 );
-                       lprevself( tri3 );
-                       bond( midtri, tri3 );
-                       bond( tri1, tri2 );
-                       lnextself( midtri );
-                       lprevself( tri1 );
-                       lnextself( tri2 );
-                       lprevself( tri3 );
-                       bond( midtri, tri1 );
-                       bond( tri2, tri3 );
-                       /* Ensure that the origin of `farleft' is sortarray[0]. */
-                       triedgecopy( tri1, *farleft );
-                       /* Ensure that the destination of `farright' is sortarray[2]. */
-                       triedgecopy( tri2, *farright );
-               }
-               else {
-                       /* The three points are not collinear; the triangulation is one */
-                       /*   triangle, namely `midtri'.                                 */
-                       setorg( midtri, sortarray[0] );
-                       setdest( tri1, sortarray[0] );
-                       setorg( tri3, sortarray[0] );
-                       /* Apices of tri1, tri2, and tri3 are left NULL. */
-                       if ( area > 0.0 ) {
-                               /* The vertices are in counterclockwise order. */
-                               setdest( midtri, sortarray[1] );
-                               setorg( tri1, sortarray[1] );
-                               setdest( tri2, sortarray[1] );
-                               setapex( midtri, sortarray[2] );
-                               setorg( tri2, sortarray[2] );
-                               setdest( tri3, sortarray[2] );
-                       }
-                       else {
-                               /* The vertices are in clockwise order. */
-                               setdest( midtri, sortarray[2] );
-                               setorg( tri1, sortarray[2] );
-                               setdest( tri2, sortarray[2] );
-                               setapex( midtri, sortarray[1] );
-                               setorg( tri2, sortarray[1] );
-                               setdest( tri3, sortarray[1] );
-                       }
-                       /* The topology does not depend on how the vertices are ordered. */
-                       bond( midtri, tri1 );
-                       lnextself( midtri );
-                       bond( midtri, tri2 );
-                       lnextself( midtri );
-                       bond( midtri, tri3 );
-                       lprevself( tri1 );
-                       lnextself( tri2 );
-                       bond( tri1, tri2 );
-                       lprevself( tri1 );
-                       lprevself( tri3 );
-                       bond( tri1, tri3 );
-                       lnextself( tri2 );
-                       lprevself( tri3 );
-                       bond( tri2, tri3 );
-                       /* Ensure that the origin of `farleft' is sortarray[0]. */
-                       triedgecopy( tri1, *farleft );
-                       /* Ensure that the destination of `farright' is sortarray[2]. */
-                       if ( area > 0.0 ) {
-                               triedgecopy( tri2, *farright );
-                       }
-                       else {
-                               lnext( *farleft, *farright );
-                       }
-               }
-               if ( verbose > 2 ) {
-                       printf( "  Creating " );
-                       printtriangle( &midtri );
-                       printf( "  Creating " );
-                       printtriangle( &tri1 );
-                       printf( "  Creating " );
-                       printtriangle( &tri2 );
-                       printf( "  Creating " );
-                       printtriangle( &tri3 );
-               }
-               return;
-       }
-       else {
-               /* Split the vertices in half. */
-               divider = vertices >> 1;
-               /* Recursively triangulate each half. */
-               divconqrecurse( sortarray, divider, 1 - axis, farleft, &innerleft );
-               divconqrecurse( &sortarray[divider], vertices - divider, 1 - axis,
-                                               &innerright, farright );
-               if ( verbose > 1 ) {
-                       printf( "  Joining triangulations with %d and %d vertices.\n", divider,
-                                       vertices - divider );
-               }
-               /* Merge the two triangulations into one. */
-               mergehulls( farleft, &innerleft, &innerright, farright, axis );
-       }
-}
+struct triedge midtri, tri1, tri2, tri3;
+struct triedge innerleft, innerright;
+REAL area;
+int divider;
 
-long removeghosts( startghost )
-struct triedge *startghost;
-{
-       struct triedge searchedge;
-       struct triedge dissolveedge;
-       struct triedge deadtri;
-       point markorg;
-       long hullsize;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-       if ( verbose ) {
-               printf( "  Removing ghost triangles.\n" );
-       }
-       /* Find an edge on the convex hull to start point location from. */
-       lprev( *startghost, searchedge );
-       symself( searchedge );
-       dummytri[0] = encode( searchedge );
-       /* Remove the bounding box and count the convex hull edges. */
-       triedgecopy( *startghost, dissolveedge );
-       hullsize = 0;
-       do {
-               hullsize++;
-               lnext( dissolveedge, deadtri );
-               lprevself( dissolveedge );
-               symself( dissolveedge );
-               /* If no PSLG is involved, set the boundary markers of all the points */
-               /*   on the convex hull.  If a PSLG is used, this step is done later. */
-               if ( !poly ) {
-                       /* Watch out for the case where all the input points are collinear. */
-                       if ( dissolveedge.tri != dummytri ) {
-                               org( dissolveedge, markorg );
-                               if ( pointmark( markorg ) == 0 ) {
-                                       setpointmark( markorg, 1 );
-                               }
-                       }
-               }
-               /* Remove a bounding triangle from a convex hull triangle. */
-               dissolve( dissolveedge );
-               /* Find the next bounding triangle. */
-               sym( deadtri, dissolveedge );
-               /* Delete the bounding triangle. */
-               triangledealloc( deadtri.tri );
-       } while ( !triedgeequal( dissolveedge, *startghost ) );
-       return hullsize;
+if ( verbose > 2 ) {
+printf( "  Triangulating %d points.\n", vertices );
 }
-
+if ( vertices == 2 ) {
+/* The triangulation of two vertices is an edge.  An edge is */
+/*   represented by two bounding triangles.                  */
+maketriangle( farleft );
+setorg( *farleft, sortarray[0] );
+setdest( *farleft, sortarray[1] );
+/* The apex is intentionally left NULL. */
+maketriangle( farright );
+setorg( *farright, sortarray[1] );
+setdest( *farright, sortarray[0] );
+/* The apex is intentionally left NULL. */
+bond( *farleft, *farright );
+lprevself( *farleft );
+lnextself( *farright );
+bond( *farleft, *farright );
+lprevself( *farleft );
+lnextself( *farright );
+bond( *farleft, *farright );
+if ( verbose > 2 ) {
+printf( "  Creating " );
+printtriangle( farleft );
+printf( "  Creating " );
+printtriangle( farright );
+}
+/* Ensure that the origin of `farleft' is sortarray[0]. */
+lprev( *farright, *farleft );
+return;
+}
+else if ( vertices == 3 ) {
+/* The triangulation of three vertices is either a triangle (with */
+/*   three bounding triangles) or two edges (with four bounding   */
+/*   triangles).  In either case, four triangles are created.     */
+maketriangle( &midtri );
+maketriangle( &tri1 );
+maketriangle( &tri2 );
+maketriangle( &tri3 );
+area = counterclockwise( sortarray[0], sortarray[1], sortarray[2] );
+if ( area == 0.0 ) {
+/* Three collinear points; the triangulation is two edges. */
+setorg( midtri, sortarray[0] );
+setdest( midtri, sortarray[1] );
+setorg( tri1, sortarray[1] );
+setdest( tri1, sortarray[0] );
+setorg( tri2, sortarray[2] );
+setdest( tri2, sortarray[1] );
+setorg( tri3, sortarray[1] );
+setdest( tri3, sortarray[2] );
+/* All apices are intentionally left NULL. */
+bond( midtri, tri1 );
+bond( tri2, tri3 );
+lnextself( midtri );
+lprevself( tri1 );
+lnextself( tri2 );
+lprevself( tri3 );
+bond( midtri, tri3 );
+bond( tri1, tri2 );
+lnextself( midtri );
+lprevself( tri1 );
+lnextself( tri2 );
+lprevself( tri3 );
+bond( midtri, tri1 );
+bond( tri2, tri3 );
+/* Ensure that the origin of `farleft' is sortarray[0]. */
+triedgecopy( tri1, *farleft );
+/* Ensure that the destination of `farright' is sortarray[2]. */
+triedgecopy( tri2, *farright );
+}
+else {
+/* The three points are not collinear; the triangulation is one */
+/*   triangle, namely `midtri'.                                 */
+setorg( midtri, sortarray[0] );
+setdest( tri1, sortarray[0] );
+setorg( tri3, sortarray[0] );
+/* Apices of tri1, tri2, and tri3 are left NULL. */
+if ( area > 0.0 ) {
+/* The vertices are in counterclockwise order. */
+setdest( midtri, sortarray[1] );
+setorg( tri1, sortarray[1] );
+setdest( tri2, sortarray[1] );
+setapex( midtri, sortarray[2] );
+setorg( tri2, sortarray[2] );
+setdest( tri3, sortarray[2] );
+}
+else {
+/* The vertices are in clockwise order. */
+setdest( midtri, sortarray[2] );
+setorg( tri1, sortarray[2] );
+setdest( tri2, sortarray[2] );
+setapex( midtri, sortarray[1] );
+setorg( tri2, sortarray[1] );
+setdest( tri3, sortarray[1] );
+}
+/* The topology does not depend on how the vertices are ordered. */
+bond( midtri, tri1 );
+lnextself( midtri );
+bond( midtri, tri2 );
+lnextself( midtri );
+bond( midtri, tri3 );
+lprevself( tri1 );
+lnextself( tri2 );
+bond( tri1, tri2 );
+lprevself( tri1 );
+lprevself( tri3 );
+bond( tri1, tri3 );
+lnextself( tri2 );
+lprevself( tri3 );
+bond( tri2, tri3 );
+/* Ensure that the origin of `farleft' is sortarray[0]. */
+triedgecopy( tri1, *farleft );
+/* Ensure that the destination of `farright' is sortarray[2]. */
+if ( area > 0.0 ) {
+triedgecopy( tri2, *farright );
+}
+else {
+lnext( *farleft, *farright );
+}
+}
+if ( verbose > 2 ) {
+printf( "  Creating " );
+printtriangle( &midtri );
+printf( "  Creating " );
+printtriangle( &tri1 );
+printf( "  Creating " );
+printtriangle( &tri2 );
+printf( "  Creating " );
+printtriangle( &tri3 );
+}
+return;
+}
+else {
+/* Split the vertices in half. */
+divider = vertices >> 1;
+/* Recursively triangulate each half. */
+divconqrecurse( sortarray, divider, 1 - axis, farleft, &innerleft );
+divconqrecurse( &sortarray[divider], vertices - divider, 1 - axis,
+&innerright, farright );
+if ( verbose > 1 ) {
+printf( "  Joining triangulations with %d and %d vertices.\n", divider,
+vertices - divider );
+}
+/* Merge the two triangulations into one. */
+mergehulls( farleft, &innerleft, &innerright, farright, axis );
+}
+}
+
+long removeghosts( startghost )
+struct triedge *startghost;
+{
+struct triedge searchedge;
+struct triedge dissolveedge;
+struct triedge deadtri;
+point markorg;
+long hullsize;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+if ( verbose ) {
+printf( "  Removing ghost triangles.\n" );
+}
+/* Find an edge on the convex hull to start point location from. */
+lprev( *startghost, searchedge );
+symself( searchedge );
+dummytri[0] = encode( searchedge );
+/* Remove the bounding box and count the convex hull edges. */
+triedgecopy( *startghost, dissolveedge );
+hullsize = 0;
+do {
+hullsize++;
+lnext( dissolveedge, deadtri );
+lprevself( dissolveedge );
+symself( dissolveedge );
+/* If no PSLG is involved, set the boundary markers of all the points */
+/*   on the convex hull.  If a PSLG is used, this step is done later. */
+if ( !poly ) {
+/* Watch out for the case where all the input points are collinear. */
+if ( dissolveedge.tri != dummytri ) {
+org( dissolveedge, markorg );
+if ( pointmark( markorg ) == 0 ) {
+setpointmark( markorg, 1 );
+}
+}
+}
+/* Remove a bounding triangle from a convex hull triangle. */
+dissolve( dissolveedge );
+/* Find the next bounding triangle. */
+sym( deadtri, dissolveedge );
+/* Delete the bounding triangle. */
+triangledealloc( deadtri.tri );
+} while ( !triedgeequal( dissolveedge, *startghost ));
+return hullsize;
+}
+
 /*****************************************************************************/
 /*                                                                           */
 /*  divconqdelaunay()   Form a Delaunay triangulation by the divide-and-     */
@@ -7750,65 +7922,65 @@ struct triedge *startghost;
 /*****************************************************************************/
 
 long divconqdelaunay(){
-       point *sortarray;
-       struct triedge hullleft, hullright;
-       int divider;
-       int i, j;
-
-       /* Allocate an array of pointers to points for sorting. */
-       sortarray = (point *) malloc( inpoints * sizeof( point ) );
-       if ( sortarray == (point *) NULL ) {
-               printf( "Error:  Out of memory.\n" );
-               exit( 1 );
-       }
-       traversalinit( &points );
-       for ( i = 0; i < inpoints; i++ ) {
-               sortarray[i] = pointtraverse();
-       }
-       if ( verbose ) {
-               printf( "  Sorting points.\n" );
-       }
-       /* Sort the points. */
-       pointsort( sortarray, inpoints );
-       /* Discard duplicate points, which can really mess up the algorithm. */
-       i = 0;
-       for ( j = 1; j < inpoints; j++ ) {
-               if ( ( sortarray[i][0] == sortarray[j][0] )
-                        && ( sortarray[i][1] == sortarray[j][1] ) ) {
-                       if ( !quiet ) {
-                               printf(
-                                       "Warning:  A duplicate point at (%.12g, %.12g) appeared and was ignored.\n",
-                                       sortarray[j][0], sortarray[j][1] );
-                       }
+point *sortarray;
+struct triedge hullleft, hullright;
+int divider;
+int i, j;
+
+/* Allocate an array of pointers to points for sorting. */
+sortarray = (point *) malloc( inpoints * sizeof( point ));
+if ( sortarray == (point *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+traversalinit( &points );
+for ( i = 0; i < inpoints; i++ ) {
+sortarray[i] = pointtraverse();
+}
+if ( verbose ) {
+printf( "  Sorting points.\n" );
+}
+/* Sort the points. */
+pointsort( sortarray, inpoints );
+/* Discard duplicate points, which can really mess up the algorithm. */
+i = 0;
+for ( j = 1; j < inpoints; j++ ) {
+if (( sortarray[i][0] == sortarray[j][0] )
+&& ( sortarray[i][1] == sortarray[j][1] )) {
+if ( !quiet ) {
+printf(
+"Warning:  A duplicate point at (%.12g, %.12g) appeared and was ignored.\n",
+sortarray[j][0], sortarray[j][1] );
+}
 /*  Commented out - would eliminate point from output .node file, but causes
     a failure if some segment has this point as an endpoint.
       setpointmark(sortarray[j], DEADPOINT);
  */
-               }
-               else {
-                       i++;
-                       sortarray[i] = sortarray[j];
-               }
-       }
-       i++;
-       if ( dwyer ) {
-               /* Re-sort the array of points to accommodate alternating cuts. */
-               divider = i >> 1;
-               if ( i - divider >= 2 ) {
-                       if ( divider >= 2 ) {
-                               alternateaxes( sortarray, divider, 1 );
-                       }
-                       alternateaxes( &sortarray[divider], i - divider, 1 );
-               }
-       }
-       if ( verbose ) {
-               printf( "  Forming triangulation.\n" );
-       }
-       /* Form the Delaunay triangulation. */
-       divconqrecurse( sortarray, i, 0, &hullleft, &hullright );
-       free( sortarray );
-
-       return removeghosts( &hullleft );
+}
+else {
+i++;
+sortarray[i] = sortarray[j];
+}
+}
+i++;
+if ( dwyer ) {
+/* Re-sort the array of points to accommodate alternating cuts. */
+divider = i >> 1;
+if ( i - divider >= 2 ) {
+if ( divider >= 2 ) {
+alternateaxes( sortarray, divider, 1 );
+}
+alternateaxes( &sortarray[divider], i - divider, 1 );
+}
+}
+if ( verbose ) {
+printf( "  Forming triangulation.\n" );
+}
+/* Form the Delaunay triangulation. */
+divconqrecurse( sortarray, i, 0, &hullleft, &hullright );
+free( sortarray );
+
+return removeghosts( &hullleft );
 }
 
 /**                                                                         **/
@@ -7830,51 +8002,52 @@ long divconqdelaunay(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 void boundingbox(){
-       struct triedge inftri;        /* Handle for the triangular bounding box. */
-       REAL width;
-
-       if ( verbose ) {
-               printf( "  Creating triangular bounding box.\n" );
-       }
-       /* Find the width (or height, whichever is larger) of the triangulation. */
-       width = xmax - xmin;
-       if ( ymax - ymin > width ) {
-               width = ymax - ymin;
-       }
-       if ( width == 0.0 ) {
-               width = 1.0;
-       }
-       /* Create the vertices of the bounding box. */
-       infpoint1 = (point) malloc( points.itembytes );
-       infpoint2 = (point) malloc( points.itembytes );
-       infpoint3 = (point) malloc( points.itembytes );
-       if ( ( infpoint1 == (point) NULL ) || ( infpoint2 == (point) NULL )
-                || ( infpoint3 == (point) NULL ) ) {
-               printf( "Error:  Out of memory.\n" );
-               exit( 1 );
-       }
-       infpoint1[0] = xmin - 50.0 * width;
-       infpoint1[1] = ymin - 40.0 * width;
-       infpoint2[0] = xmax + 50.0 * width;
-       infpoint2[1] = ymin - 40.0 * width;
-       infpoint3[0] = 0.5 * ( xmin + xmax );
-       infpoint3[1] = ymax + 60.0 * width;
-
-       /* Create the bounding box. */
-       maketriangle( &inftri );
-       setorg( inftri, infpoint1 );
-       setdest( inftri, infpoint2 );
-       setapex( inftri, infpoint3 );
-       /* Link dummytri to the bounding box so we can always find an */
-       /*   edge to begin searching (point location) from.           */
-       dummytri[0] = (triangle) inftri.tri;
-       if ( verbose > 2 ) {
-               printf( "  Creating " );
-               printtriangle( &inftri );
-       }
+struct triedge inftri;        /* Handle for the triangular bounding box. */
+REAL width;
+
+if ( verbose ) {
+printf( "  Creating triangular bounding box.\n" );
+}
+/* Find the width (or height, whichever is larger) of the triangulation. */
+width = xmax - xmin;
+if ( ymax - ymin > width ) {
+width = ymax - ymin;
+}
+if ( width == 0.0 ) {
+width = 1.0;
+}
+/* Create the vertices of the bounding box. */
+infpoint1 = (point) malloc( points.itembytes );
+infpoint2 = (point) malloc( points.itembytes );
+infpoint3 = (point) malloc( points.itembytes );
+if (( infpoint1 == (point) NULL ) || ( infpoint2 == (point) NULL )
+|| ( infpoint3 == (point) NULL )) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+infpoint1[0] = xmin - 50.0 * width;
+infpoint1[1] = ymin - 40.0 * width;
+infpoint2[0] = xmax + 50.0 * width;
+infpoint2[1] = ymin - 40.0 * width;
+infpoint3[0] = 0.5 * ( xmin + xmax );
+infpoint3[1] = ymax + 60.0 * width;
+
+/* Create the bounding box. */
+maketriangle( &inftri );
+setorg( inftri, infpoint1 );
+setdest( inftri, infpoint2 );
+setapex( inftri, infpoint3 );
+/* Link dummytri to the bounding box so we can always find an */
+/*   edge to begin searching (point location) from.           */
+dummytri[0] = (triangle) inftri.tri;
+if ( verbose > 2 ) {
+printf( "  Creating " );
+printtriangle( &inftri );
+}
 }
 
 #endif /* not REDUCED */
@@ -7891,84 +8064,85 @@ void boundingbox(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 long removebox(){
-       struct triedge deadtri;
-       struct triedge searchedge;
-       struct triedge checkedge;
-       struct triedge nextedge, finaledge, dissolveedge;
-       point markorg;
-       long hullsize;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-       if ( verbose ) {
-               printf( "  Removing triangular bounding box.\n" );
-       }
-       /* Find a boundary triangle. */
-       nextedge.tri = dummytri;
-       nextedge.orient = 0;
-       symself( nextedge );
-       /* Mark a place to stop. */
-       lprev( nextedge, finaledge );
-       lnextself( nextedge );
-       symself( nextedge );
-       /* Find a triangle (on the boundary of the point set) that isn't */
-       /*   a bounding box triangle.                                    */
-       lprev( nextedge, searchedge );
-       symself( searchedge );
-       /* Check whether nextedge is another boundary triangle */
-       /*   adjacent to the first one.                        */
-       lnext( nextedge, checkedge );
-       symself( checkedge );
-       if ( checkedge.tri == dummytri ) {
-               /* Go on to the next triangle.  There are only three boundary   */
-               /*   triangles, and this next triangle cannot be the third one, */
-               /*   so it's safe to stop here.                                 */
-               lprevself( searchedge );
-               symself( searchedge );
-       }
-       /* Find a new boundary edge to search from, as the current search */
-       /*   edge lies on a bounding box triangle and will be deleted.    */
-       dummytri[0] = encode( searchedge );
-       hullsize = -2l;
-       while ( !triedgeequal( nextedge, finaledge ) ) {
-               hullsize++;
-               lprev( nextedge, dissolveedge );
-               symself( dissolveedge );
-               /* If not using a PSLG, the vertices should be marked now. */
-               /*   (If using a PSLG, markhull() will do the job.)        */
-               if ( !poly ) {
-                       /* Be careful!  One must check for the case where all the input   */
-                       /*   points are collinear, and thus all the triangles are part of */
-                       /*   the bounding box.  Otherwise, the setpointmark() call below  */
-                       /*   will cause a bad pointer reference.                          */
-                       if ( dissolveedge.tri != dummytri ) {
-                               org( dissolveedge, markorg );
-                               if ( pointmark( markorg ) == 0 ) {
-                                       setpointmark( markorg, 1 );
-                               }
-                       }
-               }
-               /* Disconnect the bounding box triangle from the mesh triangle. */
-               dissolve( dissolveedge );
-               lnext( nextedge, deadtri );
-               sym( deadtri, nextedge );
-               /* Get rid of the bounding box triangle. */
-               triangledealloc( deadtri.tri );
-               /* Do we need to turn the corner? */
-               if ( nextedge.tri == dummytri ) {
-                       /* Turn the corner. */
-                       triedgecopy( dissolveedge, nextedge );
-               }
-       }
-       triangledealloc( finaledge.tri );
-
-       free( infpoint1 );              /* Deallocate the bounding box vertices. */
-       free( infpoint2 );
-       free( infpoint3 );
-
-       return hullsize;
+struct triedge deadtri;
+struct triedge searchedge;
+struct triedge checkedge;
+struct triedge nextedge, finaledge, dissolveedge;
+point markorg;
+long hullsize;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+if ( verbose ) {
+printf( "  Removing triangular bounding box.\n" );
+}
+/* Find a boundary triangle. */
+nextedge.tri = dummytri;
+nextedge.orient = 0;
+symself( nextedge );
+/* Mark a place to stop. */
+lprev( nextedge, finaledge );
+lnextself( nextedge );
+symself( nextedge );
+/* Find a triangle (on the boundary of the point set) that isn't */
+/*   a bounding box triangle.                                    */
+lprev( nextedge, searchedge );
+symself( searchedge );
+/* Check whether nextedge is another boundary triangle */
+/*   adjacent to the first one.                        */
+lnext( nextedge, checkedge );
+symself( checkedge );
+if ( checkedge.tri == dummytri ) {
+/* Go on to the next triangle.  There are only three boundary   */
+/*   triangles, and this next triangle cannot be the third one, */
+/*   so it's safe to stop here.                                 */
+lprevself( searchedge );
+symself( searchedge );
+}
+/* Find a new boundary edge to search from, as the current search */
+/*   edge lies on a bounding box triangle and will be deleted.    */
+dummytri[0] = encode( searchedge );
+hullsize = -2l;
+while ( !triedgeequal( nextedge, finaledge )) {
+hullsize++;
+lprev( nextedge, dissolveedge );
+symself( dissolveedge );
+/* If not using a PSLG, the vertices should be marked now. */
+/*   (If using a PSLG, markhull() will do the job.)        */
+if ( !poly ) {
+/* Be careful!  One must check for the case where all the input   */
+/*   points are collinear, and thus all the triangles are part of */
+/*   the bounding box.  Otherwise, the setpointmark() call below  */
+/*   will cause a bad pointer reference.                          */
+if ( dissolveedge.tri != dummytri ) {
+org( dissolveedge, markorg );
+if ( pointmark( markorg ) == 0 ) {
+setpointmark( markorg, 1 );
+}
+}
+}
+/* Disconnect the bounding box triangle from the mesh triangle. */
+dissolve( dissolveedge );
+lnext( nextedge, deadtri );
+sym( deadtri, nextedge );
+/* Get rid of the bounding box triangle. */
+triangledealloc( deadtri.tri );
+/* Do we need to turn the corner? */
+if ( nextedge.tri == dummytri ) {
+/* Turn the corner. */
+triedgecopy( dissolveedge, nextedge );
+}
+}
+triangledealloc( finaledge.tri );
+
+free( infpoint1 );              /* Deallocate the bounding box vertices. */
+free( infpoint2 );
+free( infpoint3 );
+
+return hullsize;
 }
 
 #endif /* not REDUCED */
@@ -7980,40 +8154,41 @@ long removebox(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 long incrementaldelaunay(){
-       struct triedge starttri;
-       point pointloop;
-       int i;
-
-       /* Create a triangular bounding box. */
-       boundingbox();
-       if ( verbose ) {
-               printf( "  Incrementally inserting points.\n" );
-       }
-       traversalinit( &points );
-       pointloop = pointtraverse();
-       i = 1;
-       while ( pointloop != (point) NULL ) {
-               /* Find a boundary triangle to search from. */
-               starttri.tri = (triangle *) NULL;
-               if ( insertsite( pointloop, &starttri, (struct edge *) NULL, 0, 0 ) ==
-                        DUPLICATEPOINT ) {
-                       if ( !quiet ) {
-                               printf(
-                                       "Warning:  A duplicate point at (%.12g, %.12g) appeared and was ignored.\n",
-                                       pointloop[0], pointloop[1] );
-                       }
+struct triedge starttri;
+point pointloop;
+int i;
+
+/* Create a triangular bounding box. */
+boundingbox();
+if ( verbose ) {
+printf( "  Incrementally inserting points.\n" );
+}
+traversalinit( &points );
+pointloop = pointtraverse();
+i = 1;
+while ( pointloop != (point) NULL ) {
+/* Find a boundary triangle to search from. */
+starttri.tri = (triangle *) NULL;
+if ( insertsite( pointloop, &starttri, (struct edge *) NULL, 0, 0 ) ==
+DUPLICATEPOINT ) {
+if ( !quiet ) {
+printf(
+"Warning:  A duplicate point at (%.12g, %.12g) appeared and was ignored.\n",
+pointloop[0], pointloop[1] );
+}
 /*  Commented out - would eliminate point from output .node file.
       setpointmark(pointloop, DEADPOINT);
  */
-               }
-               pointloop = pointtraverse();
-               i++;
-       }
-       /* Remove the bounding box. */
-       return removebox();
+}
+pointloop = pointtraverse();
+i++;
+}
+/* Remove the bounding box. */
+return removebox();
 }
 
 #endif /* not REDUCED */
@@ -8026,208 +8201,214 @@ long incrementaldelaunay(){
 /**                                                                         **/
 /**                                                                         **/
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 void eventheapinsert( heap, heapsize, newevent )
 struct event **heap;
 int heapsize;
 struct event *newevent;
 {
-       REAL eventx, eventy;
-       int eventnum;
-       int parent;
-       int notdone;
-
-       eventx = newevent->xkey;
-       eventy = newevent->ykey;
-       eventnum = heapsize;
-       notdone = eventnum > 0;
-       while ( notdone ) {
-               parent = ( eventnum - 1 ) >> 1;
-               if ( ( heap[parent]->ykey < eventy ) ||
-                        ( ( heap[parent]->ykey == eventy )
-                          && ( heap[parent]->xkey <= eventx ) ) ) {
-                       notdone = 0;
-               }
-               else {
-                       heap[eventnum] = heap[parent];
-                       heap[eventnum]->heapposition = eventnum;
-
-                       eventnum = parent;
-                       notdone = eventnum > 0;
-               }
-       }
-       heap[eventnum] = newevent;
-       newevent->heapposition = eventnum;
+REAL eventx, eventy;
+int eventnum;
+int parent;
+int notdone;
+
+eventx = newevent->xkey;
+eventy = newevent->ykey;
+eventnum = heapsize;
+notdone = eventnum > 0;
+while ( notdone ) {
+parent = ( eventnum - 1 ) >> 1;
+if (( heap[parent]->ykey < eventy ) ||
+(( heap[parent]->ykey == eventy )
+&& ( heap[parent]->xkey <= eventx ))) {
+notdone = 0;
+}
+else {
+heap[eventnum] = heap[parent];
+heap[eventnum]->heapposition = eventnum;
+
+eventnum = parent;
+notdone = eventnum > 0;
+}
+}
+heap[eventnum] = newevent;
+newevent->heapposition = eventnum;
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 void eventheapify( heap, heapsize, eventnum )
 struct event **heap;
 int heapsize;
 int eventnum;
 {
-       struct event *thisevent;
-       REAL eventx, eventy;
-       int leftchild, rightchild;
-       int smallest;
-       int notdone;
-
-       thisevent = heap[eventnum];
-       eventx = thisevent->xkey;
-       eventy = thisevent->ykey;
-       leftchild = 2 * eventnum + 1;
-       notdone = leftchild < heapsize;
-       while ( notdone ) {
-               if ( ( heap[leftchild]->ykey < eventy ) ||
-                        ( ( heap[leftchild]->ykey == eventy )
-                          && ( heap[leftchild]->xkey < eventx ) ) ) {
-                       smallest = leftchild;
-               }
-               else {
-                       smallest = eventnum;
-               }
-               rightchild = leftchild + 1;
-               if ( rightchild < heapsize ) {
-                       if ( ( heap[rightchild]->ykey < heap[smallest]->ykey ) ||
-                                ( ( heap[rightchild]->ykey == heap[smallest]->ykey )
-                                  && ( heap[rightchild]->xkey < heap[smallest]->xkey ) ) ) {
-                               smallest = rightchild;
-                       }
-               }
-               if ( smallest == eventnum ) {
-                       notdone = 0;
-               }
-               else {
-                       heap[eventnum] = heap[smallest];
-                       heap[eventnum]->heapposition = eventnum;
-                       heap[smallest] = thisevent;
-                       thisevent->heapposition = smallest;
-
-                       eventnum = smallest;
-                       leftchild = 2 * eventnum + 1;
-                       notdone = leftchild < heapsize;
-               }
-       }
+struct event *thisevent;
+REAL eventx, eventy;
+int leftchild, rightchild;
+int smallest;
+int notdone;
+
+thisevent = heap[eventnum];
+eventx = thisevent->xkey;
+eventy = thisevent->ykey;
+leftchild = 2 * eventnum + 1;
+notdone = leftchild < heapsize;
+while ( notdone ) {
+if (( heap[leftchild]->ykey < eventy ) ||
+(( heap[leftchild]->ykey == eventy )
+&& ( heap[leftchild]->xkey < eventx ))) {
+smallest = leftchild;
+}
+else {
+smallest = eventnum;
+}
+rightchild = leftchild + 1;
+if ( rightchild < heapsize ) {
+if (( heap[rightchild]->ykey < heap[smallest]->ykey ) ||
+(( heap[rightchild]->ykey == heap[smallest]->ykey )
+&& ( heap[rightchild]->xkey < heap[smallest]->xkey ))) {
+smallest = rightchild;
+}
+}
+if ( smallest == eventnum ) {
+notdone = 0;
+}
+else {
+heap[eventnum] = heap[smallest];
+heap[eventnum]->heapposition = eventnum;
+heap[smallest] = thisevent;
+thisevent->heapposition = smallest;
+
+eventnum = smallest;
+leftchild = 2 * eventnum + 1;
+notdone = leftchild < heapsize;
+}
+}
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 void eventheapdelete( heap, heapsize, eventnum )
 struct event **heap;
 int heapsize;
 int eventnum;
 {
-       struct event *moveevent;
-       REAL eventx, eventy;
-       int parent;
-       int notdone;
-
-       moveevent = heap[heapsize - 1];
-       if ( eventnum > 0 ) {
-               eventx = moveevent->xkey;
-               eventy = moveevent->ykey;
-               do {
-                       parent = ( eventnum - 1 ) >> 1;
-                       if ( ( heap[parent]->ykey < eventy ) ||
-                                ( ( heap[parent]->ykey == eventy )
-                                  && ( heap[parent]->xkey <= eventx ) ) ) {
-                               notdone = 0;
-                       }
-                       else {
-                               heap[eventnum] = heap[parent];
-                               heap[eventnum]->heapposition = eventnum;
-
-                               eventnum = parent;
-                               notdone = eventnum > 0;
-                       }
-               } while ( notdone );
-       }
-       heap[eventnum] = moveevent;
-       moveevent->heapposition = eventnum;
-       eventheapify( heap, heapsize - 1, eventnum );
+struct event *moveevent;
+REAL eventx, eventy;
+int parent;
+int notdone;
+
+moveevent = heap[heapsize - 1];
+if ( eventnum > 0 ) {
+eventx = moveevent->xkey;
+eventy = moveevent->ykey;
+do {
+parent = ( eventnum - 1 ) >> 1;
+if (( heap[parent]->ykey < eventy ) ||
+(( heap[parent]->ykey == eventy )
+&& ( heap[parent]->xkey <= eventx ))) {
+notdone = 0;
+}
+else {
+heap[eventnum] = heap[parent];
+heap[eventnum]->heapposition = eventnum;
+
+eventnum = parent;
+notdone = eventnum > 0;
+}
+} while ( notdone );
+}
+heap[eventnum] = moveevent;
+moveevent->heapposition = eventnum;
+eventheapify( heap, heapsize - 1, eventnum );
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 void createeventheap( eventheap, events, freeevents )
 struct event ***eventheap;
 struct event **events;
 struct event **freeevents;
 {
-       point thispoint;
-       int maxevents;
-       int i;
-
-       maxevents = ( 3 * inpoints ) / 2;
-       *eventheap = (struct event **) malloc( maxevents * sizeof( struct event * ) );
-       if ( *eventheap == (struct event **) NULL ) {
-               printf( "Error:  Out of memory.\n" );
-               exit( 1 );
-       }
-       *events = (struct event *) malloc( maxevents * sizeof( struct event ) );
-       if ( *events == (struct event *) NULL ) {
-               printf( "Error:  Out of memory.\n" );
-               exit( 1 );
-       }
-       traversalinit( &points );
-       for ( i = 0; i < inpoints; i++ ) {
-               thispoint = pointtraverse();
-               ( *events )[i].eventptr = (VOID *) thispoint;
-               ( *events )[i].xkey = thispoint[0];
-               ( *events )[i].ykey = thispoint[1];
-               eventheapinsert( *eventheap, i, *events + i );
-       }
-       *freeevents = (struct event *) NULL;
-       for ( i = maxevents - 1; i >= inpoints; i-- ) {
-               ( *events )[i].eventptr = (VOID *) *freeevents;
-               *freeevents = *events + i;
-       }
+point thispoint;
+int maxevents;
+int i;
+
+maxevents = ( 3 * inpoints ) / 2;
+*eventheap = (struct event **) malloc( maxevents * sizeof( struct event * ));
+if ( *eventheap == (struct event **) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+*events = (struct event *) malloc( maxevents * sizeof( struct event ));
+if ( *events == (struct event *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+traversalinit( &points );
+for ( i = 0; i < inpoints; i++ ) {
+thispoint = pointtraverse();
+( *events )[i].eventptr = (VOID *) thispoint;
+( *events )[i].xkey = thispoint[0];
+( *events )[i].ykey = thispoint[1];
+eventheapinsert( *eventheap, i, *events + i );
+}
+*freeevents = (struct event *) NULL;
+for ( i = maxevents - 1; i >= inpoints; i-- ) {
+( *events )[i].eventptr = (VOID *) *freeevents;
+*freeevents = *events + i;
+}
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 int rightofhyperbola( fronttri, newsite )
 struct triedge *fronttri;
 point newsite;
 {
-       point leftpoint, rightpoint;
-       REAL dxa, dya, dxb, dyb;
-
-       hyperbolacount++;
-
-       dest( *fronttri, leftpoint );
-       apex( *fronttri, rightpoint );
-       if ( ( leftpoint[1] < rightpoint[1] )
-                || ( ( leftpoint[1] == rightpoint[1] ) && ( leftpoint[0] < rightpoint[0] ) ) ) {
-               if ( newsite[0] >= rightpoint[0] ) {
-                       return 1;
-               }
-       }
-       else {
-               if ( newsite[0] <= leftpoint[0] ) {
-                       return 0;
-               }
-       }
-       dxa = leftpoint[0] - newsite[0];
-       dya = leftpoint[1] - newsite[1];
-       dxb = rightpoint[0] - newsite[0];
-       dyb = rightpoint[1] - newsite[1];
-       return dya * ( dxb * dxb + dyb * dyb ) > dyb * ( dxa * dxa + dya * dya );
+point leftpoint, rightpoint;
+REAL dxa, dya, dxb, dyb;
+
+hyperbolacount++;
+
+dest( *fronttri, leftpoint );
+apex( *fronttri, rightpoint );
+if (( leftpoint[1] < rightpoint[1] )
+|| (( leftpoint[1] == rightpoint[1] ) && ( leftpoint[0] < rightpoint[0] ))) {
+if ( newsite[0] >= rightpoint[0] ) {
+return 1;
+}
+}
+else {
+if ( newsite[0] <= leftpoint[0] ) {
+return 0;
+}
+}
+dxa = leftpoint[0] - newsite[0];
+dya = leftpoint[1] - newsite[1];
+dxb = rightpoint[0] - newsite[0];
+dyb = rightpoint[1] - newsite[1];
+return dya * ( dxb * dxb + dyb * dyb ) > dyb * ( dxa * dxa + dya * dya );
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 REAL circletop( pa, pb, pc, ccwabc )
 point pa;
@@ -8235,27 +8416,28 @@ point pb;
 point pc;
 REAL ccwabc;
 {
-       REAL xac, yac, xbc, ybc, xab, yab;
-       REAL aclen2, bclen2, ablen2;
-
-       circletopcount++;
-
-       xac = pa[0] - pc[0];
-       yac = pa[1] - pc[1];
-       xbc = pb[0] - pc[0];
-       ybc = pb[1] - pc[1];
-       xab = pa[0] - pb[0];
-       yab = pa[1] - pb[1];
-       aclen2 = xac * xac + yac * yac;
-       bclen2 = xbc * xbc + ybc * ybc;
-       ablen2 = xab * xab + yab * yab;
-       return pc[1] + ( xac * bclen2 - xbc * aclen2 + sqrt( aclen2 * bclen2 * ablen2 ) )
-                  / ( 2.0 * ccwabc );
+REAL xac, yac, xbc, ybc, xab, yab;
+REAL aclen2, bclen2, ablen2;
+
+circletopcount++;
+
+xac = pa[0] - pc[0];
+yac = pa[1] - pc[1];
+xbc = pb[0] - pc[0];
+ybc = pb[1] - pc[1];
+xab = pa[0] - pb[0];
+yab = pa[1] - pb[1];
+aclen2 = xac * xac + yac * yac;
+bclen2 = xbc * xbc + ybc * ybc;
+ablen2 = xab * xab + yab * yab;
+return pc[1] + ( xac * bclen2 - xbc * aclen2 + sqrt( aclen2 * bclen2 * ablen2 ))
+/ ( 2.0 * ccwabc );
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 void check4deadevent( checktri, freeevents, eventheap, heapsize )
 struct triedge *checktri;
@@ -8263,180 +8445,183 @@ struct event **freeevents;
 struct event **eventheap;
 int *heapsize;
 {
-       struct event *deadevent;
-       point eventpoint;
-       int eventnum;
-
-       org( *checktri, eventpoint );
-       if ( eventpoint != (point) NULL ) {
-               deadevent = (struct event *) eventpoint;
-               eventnum = deadevent->heapposition;
-               deadevent->eventptr = (VOID *) *freeevents;
-               *freeevents = deadevent;
-               eventheapdelete( eventheap, *heapsize, eventnum );
-               ( *heapsize )--;
-               setorg( *checktri, NULL );
-       }
+struct event *deadevent;
+point eventpoint;
+int eventnum;
+
+org( *checktri, eventpoint );
+if ( eventpoint != (point) NULL ) {
+deadevent = (struct event *) eventpoint;
+eventnum = deadevent->heapposition;
+deadevent->eventptr = (VOID *) *freeevents;
+*freeevents = deadevent;
+eventheapdelete( eventheap, *heapsize, eventnum );
+( *heapsize )--;
+setorg( *checktri, NULL );
+}
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 struct splaynode *splay( splaytree, searchpoint, searchtri )
 struct splaynode *splaytree;
 point searchpoint;
 struct triedge *searchtri;
 {
-       struct splaynode *child, *grandchild;
-       struct splaynode *lefttree, *righttree;
-       struct splaynode *leftright;
-       point checkpoint;
-       int rightofroot, rightofchild;
-
-       if ( splaytree == (struct splaynode *) NULL ) {
-               return (struct splaynode *) NULL;
-       }
-       dest( splaytree->keyedge, checkpoint );
-       if ( checkpoint == splaytree->keydest ) {
-               rightofroot = rightofhyperbola( &splaytree->keyedge, searchpoint );
-               if ( rightofroot ) {
-                       triedgecopy( splaytree->keyedge, *searchtri );
-                       child = splaytree->rchild;
-               }
-               else {
-                       child = splaytree->lchild;
-               }
-               if ( child == (struct splaynode *) NULL ) {
-                       return splaytree;
-               }
-               dest( child->keyedge, checkpoint );
-               if ( checkpoint != child->keydest ) {
-                       child = splay( child, searchpoint, searchtri );
-                       if ( child == (struct splaynode *) NULL ) {
-                               if ( rightofroot ) {
-                                       splaytree->rchild = (struct splaynode *) NULL;
-                               }
-                               else {
-                                       splaytree->lchild = (struct splaynode *) NULL;
-                               }
-                               return splaytree;
-                       }
-               }
-               rightofchild = rightofhyperbola( &child->keyedge, searchpoint );
-               if ( rightofchild ) {
-                       triedgecopy( child->keyedge, *searchtri );
-                       grandchild = splay( child->rchild, searchpoint, searchtri );
-                       child->rchild = grandchild;
-               }
-               else {
-                       grandchild = splay( child->lchild, searchpoint, searchtri );
-                       child->lchild = grandchild;
-               }
-               if ( grandchild == (struct splaynode *) NULL ) {
-                       if ( rightofroot ) {
-                               splaytree->rchild = child->lchild;
-                               child->lchild = splaytree;
-                       }
-                       else {
-                               splaytree->lchild = child->rchild;
-                               child->rchild = splaytree;
-                       }
-                       return child;
-               }
-               if ( rightofchild ) {
-                       if ( rightofroot ) {
-                               splaytree->rchild = child->lchild;
-                               child->lchild = splaytree;
-                       }
-                       else {
-                               splaytree->lchild = grandchild->rchild;
-                               grandchild->rchild = splaytree;
-                       }
-                       child->rchild = grandchild->lchild;
-                       grandchild->lchild = child;
-               }
-               else {
-                       if ( rightofroot ) {
-                               splaytree->rchild = grandchild->lchild;
-                               grandchild->lchild = splaytree;
-                       }
-                       else {
-                               splaytree->lchild = child->rchild;
-                               child->rchild = splaytree;
-                       }
-                       child->lchild = grandchild->rchild;
-                       grandchild->rchild = child;
-               }
-               return grandchild;
-       }
-       else {
-               lefttree = splay( splaytree->lchild, searchpoint, searchtri );
-               righttree = splay( splaytree->rchild, searchpoint, searchtri );
-
-               pooldealloc( &splaynodes, (VOID *) splaytree );
-               if ( lefttree == (struct splaynode *) NULL ) {
-                       return righttree;
-               }
-               else if ( righttree == (struct splaynode *) NULL ) {
-                       return lefttree;
-               }
-               else if ( lefttree->rchild == (struct splaynode *) NULL ) {
-                       lefttree->rchild = righttree->lchild;
-                       righttree->lchild = lefttree;
-                       return righttree;
-               }
-               else if ( righttree->lchild == (struct splaynode *) NULL ) {
-                       righttree->lchild = lefttree->rchild;
-                       lefttree->rchild = righttree;
-                       return lefttree;
-               }
-               else {
+struct splaynode *child, *grandchild;
+struct splaynode *lefttree, *righttree;
+struct splaynode *leftright;
+point checkpoint;
+int rightofroot, rightofchild;
+
+if ( splaytree == (struct splaynode *) NULL ) {
+return (struct splaynode *) NULL;
+}
+dest( splaytree->keyedge, checkpoint );
+if ( checkpoint == splaytree->keydest ) {
+rightofroot = rightofhyperbola( &splaytree->keyedge, searchpoint );
+if ( rightofroot ) {
+triedgecopy( splaytree->keyedge, *searchtri );
+child = splaytree->rchild;
+}
+else {
+child = splaytree->lchild;
+}
+if ( child == (struct splaynode *) NULL ) {
+return splaytree;
+}
+dest( child->keyedge, checkpoint );
+if ( checkpoint != child->keydest ) {
+child = splay( child, searchpoint, searchtri );
+if ( child == (struct splaynode *) NULL ) {
+if ( rightofroot ) {
+splaytree->rchild = (struct splaynode *) NULL;
+}
+else {
+splaytree->lchild = (struct splaynode *) NULL;
+}
+return splaytree;
+}
+}
+rightofchild = rightofhyperbola( &child->keyedge, searchpoint );
+if ( rightofchild ) {
+triedgecopy( child->keyedge, *searchtri );
+grandchild = splay( child->rchild, searchpoint, searchtri );
+child->rchild = grandchild;
+}
+else {
+grandchild = splay( child->lchild, searchpoint, searchtri );
+child->lchild = grandchild;
+}
+if ( grandchild == (struct splaynode *) NULL ) {
+if ( rightofroot ) {
+splaytree->rchild = child->lchild;
+child->lchild = splaytree;
+}
+else {
+splaytree->lchild = child->rchild;
+child->rchild = splaytree;
+}
+return child;
+}
+if ( rightofchild ) {
+if ( rightofroot ) {
+splaytree->rchild = child->lchild;
+child->lchild = splaytree;
+}
+else {
+splaytree->lchild = grandchild->rchild;
+grandchild->rchild = splaytree;
+}
+child->rchild = grandchild->lchild;
+grandchild->lchild = child;
+}
+else {
+if ( rightofroot ) {
+splaytree->rchild = grandchild->lchild;
+grandchild->lchild = splaytree;
+}
+else {
+splaytree->lchild = child->rchild;
+child->rchild = splaytree;
+}
+child->lchild = grandchild->rchild;
+grandchild->rchild = child;
+}
+return grandchild;
+}
+else {
+lefttree = splay( splaytree->lchild, searchpoint, searchtri );
+righttree = splay( splaytree->rchild, searchpoint, searchtri );
+
+pooldealloc( &splaynodes, (VOID *) splaytree );
+if ( lefttree == (struct splaynode *) NULL ) {
+return righttree;
+}
+else if ( righttree == (struct splaynode *) NULL ) {
+return lefttree;
+}
+else if ( lefttree->rchild == (struct splaynode *) NULL ) {
+lefttree->rchild = righttree->lchild;
+righttree->lchild = lefttree;
+return righttree;
+}
+else if ( righttree->lchild == (struct splaynode *) NULL ) {
+righttree->lchild = lefttree->rchild;
+lefttree->rchild = righttree;
+return lefttree;
+}
+else {
 /*      printf("Holy Toledo!!!\n"); */
-                       leftright = lefttree->rchild;
-                       while ( leftright->rchild != (struct splaynode *) NULL ) {
-                               leftright = leftright->rchild;
-                       }
-                       leftright->rchild = righttree;
-                       return lefttree;
-               }
-       }
+leftright = lefttree->rchild;
+while ( leftright->rchild != (struct splaynode *) NULL ) {
+leftright = leftright->rchild;
+}
+leftright->rchild = righttree;
+return lefttree;
+}
+}
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 struct splaynode *splayinsert( splayroot, newkey, searchpoint )
 struct splaynode *splayroot;
 struct triedge *newkey;
 point searchpoint;
 {
-       struct splaynode *newsplaynode;
-
-       newsplaynode = (struct splaynode *) poolalloc( &splaynodes );
-       triedgecopy( *newkey, newsplaynode->keyedge );
-       dest( *newkey, newsplaynode->keydest );
-       if ( splayroot == (struct splaynode *) NULL ) {
-               newsplaynode->lchild = (struct splaynode *) NULL;
-               newsplaynode->rchild = (struct splaynode *) NULL;
-       }
-       else if ( rightofhyperbola( &splayroot->keyedge, searchpoint ) ) {
-               newsplaynode->lchild = splayroot;
-               newsplaynode->rchild = splayroot->rchild;
-               splayroot->rchild = (struct splaynode *) NULL;
-       }
-       else {
-               newsplaynode->lchild = splayroot->lchild;
-               newsplaynode->rchild = splayroot;
-               splayroot->lchild = (struct splaynode *) NULL;
-       }
-       return newsplaynode;
+struct splaynode *newsplaynode;
+
+newsplaynode = (struct splaynode *) poolalloc( &splaynodes );
+triedgecopy( *newkey, newsplaynode->keyedge );
+dest( *newkey, newsplaynode->keydest );
+if ( splayroot == (struct splaynode *) NULL ) {
+newsplaynode->lchild = (struct splaynode *) NULL;
+newsplaynode->rchild = (struct splaynode *) NULL;
+}
+else if ( rightofhyperbola( &splayroot->keyedge, searchpoint )) {
+newsplaynode->lchild = splayroot;
+newsplaynode->rchild = splayroot->rchild;
+splayroot->rchild = (struct splaynode *) NULL;
+}
+else {
+newsplaynode->lchild = splayroot->lchild;
+newsplaynode->rchild = splayroot;
+splayroot->lchild = (struct splaynode *) NULL;
+}
+return newsplaynode;
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 struct splaynode *circletopinsert( splayroot, newkey, pa, pb, pc, topy )
 struct splaynode *splayroot;
@@ -8446,177 +8631,179 @@ point pb;
 point pc;
 REAL topy;
 {
-       REAL ccwabc;
-       REAL xac, yac, xbc, ybc;
-       REAL aclen2, bclen2;
-       REAL searchpoint[2];
-       struct triedge dummytri;
-
-       ccwabc = counterclockwise( pa, pb, pc );
-       xac = pa[0] - pc[0];
-       yac = pa[1] - pc[1];
-       xbc = pb[0] - pc[0];
-       ybc = pb[1] - pc[1];
-       aclen2 = xac * xac + yac * yac;
-       bclen2 = xbc * xbc + ybc * ybc;
-       searchpoint[0] = pc[0] - ( yac * bclen2 - ybc * aclen2 ) / ( 2.0 * ccwabc );
-       searchpoint[1] = topy;
-       return splayinsert( splay( splayroot, (point) searchpoint, &dummytri ), newkey,
-                                               (point) searchpoint );
+REAL ccwabc;
+REAL xac, yac, xbc, ybc;
+REAL aclen2, bclen2;
+REAL searchpoint[2];
+struct triedge dummytri;
+
+ccwabc = counterclockwise( pa, pb, pc );
+xac = pa[0] - pc[0];
+yac = pa[1] - pc[1];
+xbc = pb[0] - pc[0];
+ybc = pb[1] - pc[1];
+aclen2 = xac * xac + yac * yac;
+bclen2 = xbc * xbc + ybc * ybc;
+searchpoint[0] = pc[0] - ( yac * bclen2 - ybc * aclen2 ) / ( 2.0 * ccwabc );
+searchpoint[1] = topy;
+return splayinsert( splay( splayroot, (point) searchpoint, &dummytri ), newkey,
+(point) searchpoint );
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 struct splaynode *frontlocate( splayroot, bottommost, searchpoint, searchtri,
-                                                          farright )
+farright )
 struct splaynode *splayroot;
 struct triedge *bottommost;
 point searchpoint;
 struct triedge *searchtri;
 int *farright;
 {
-       int farrightflag;
-       triangle ptr;                     /* Temporary variable used by onext(). */
+int farrightflag;
+triangle ptr;                     /* Temporary variable used by onext(). */
 
-       triedgecopy( *bottommost, *searchtri );
-       splayroot = splay( splayroot, searchpoint, searchtri );
+triedgecopy( *bottommost, *searchtri );
+splayroot = splay( splayroot, searchpoint, searchtri );
 
-       farrightflag = 0;
-       while ( !farrightflag && rightofhyperbola( searchtri, searchpoint ) ) {
-               onextself( *searchtri );
-               farrightflag = triedgeequal( *searchtri, *bottommost );
-       }
-       *farright = farrightflag;
-       return splayroot;
+farrightflag = 0;
+while ( !farrightflag && rightofhyperbola( searchtri, searchpoint )) {
+onextself( *searchtri );
+farrightflag = triedgeequal( *searchtri, *bottommost );
+}
+*farright = farrightflag;
+return splayroot;
 }
 
 #endif /* not REDUCED */
 
-#ifndef REDUCED
+#ifndef
+REDUCED
 
 long sweeplinedelaunay(){
-       struct event **eventheap;
-       struct event *events;
-       struct event *freeevents;
-       struct event *nextevent;
-       struct event *newevent;
-       struct splaynode *splayroot;
-       struct triedge bottommost;
-       struct triedge searchtri;
-       struct triedge fliptri;
-       struct triedge lefttri, righttri, farlefttri, farrighttri;
-       struct triedge inserttri;
-       point firstpoint, secondpoint;
-       point nextpoint, lastpoint;
-       point connectpoint;
-       point leftpoint, midpoint, rightpoint;
-       REAL lefttest, righttest;
-       int heapsize;
-       int check4events, farrightflag;
-       triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */
-
-       poolinit( &splaynodes, sizeof( struct splaynode ), SPLAYNODEPERBLOCK, POINTER,
-                         0 );
-       splayroot = (struct splaynode *) NULL;
-
-       if ( verbose ) {
-               printf( "  Placing points in event heap.\n" );
-       }
-       createeventheap( &eventheap, &events, &freeevents );
-       heapsize = inpoints;
-
-       if ( verbose ) {
-               printf( "  Forming triangulation.\n" );
-       }
-       maketriangle( &lefttri );
-       maketriangle( &righttri );
-       bond( lefttri, righttri );
-       lnextself( lefttri );
-       lprevself( righttri );
-       bond( lefttri, righttri );
-       lnextself( lefttri );
-       lprevself( righttri );
-       bond( lefttri, righttri );
-       firstpoint = (point) eventheap[0]->eventptr;
-       eventheap[0]->eventptr = (VOID *) freeevents;
-       freeevents = eventheap[0];
-       eventheapdelete( eventheap, heapsize, 0 );
-       heapsize--;
-       do {
-               if ( heapsize == 0 ) {
-                       printf( "Error:  Input points are all identical.\n" );
-                       exit( 1 );
-               }
-               secondpoint = (point) eventheap[0]->eventptr;
-               eventheap[0]->eventptr = (VOID *) freeevents;
-               freeevents = eventheap[0];
-               eventheapdelete( eventheap, heapsize, 0 );
-               heapsize--;
-               if ( ( firstpoint[0] == secondpoint[0] )
-                        && ( firstpoint[1] == secondpoint[1] ) ) {
-                       printf(
-                               "Warning:  A duplicate point at (%.12g, %.12g) appeared and was ignored.\n",
-                               secondpoint[0], secondpoint[1] );
+struct event **eventheap;
+struct event *events;
+struct event *freeevents;
+struct event *nextevent;
+struct event *newevent;
+struct splaynode *splayroot;
+struct triedge bottommost;
+struct triedge searchtri;
+struct triedge fliptri;
+struct triedge lefttri, righttri, farlefttri, farrighttri;
+struct triedge inserttri;
+point firstpoint, secondpoint;
+point nextpoint, lastpoint;
+point connectpoint;
+point leftpoint, midpoint, rightpoint;
+REAL lefttest, righttest;
+int heapsize;
+int check4events, farrightflag;
+triangle ptr; /* Temporary variable used by sym(), onext(), and oprev(). */
+
+poolinit( &splaynodes, sizeof( struct splaynode ), SPLAYNODEPERBLOCK, POINTER,
+0 );
+splayroot = (struct splaynode *) NULL;
+
+if ( verbose ) {
+printf( "  Placing points in event heap.\n" );
+}
+createeventheap( &eventheap, &events, &freeevents );
+heapsize = inpoints;
+
+if ( verbose ) {
+printf( "  Forming triangulation.\n" );
+}
+maketriangle( &lefttri );
+maketriangle( &righttri );
+bond( lefttri, righttri );
+lnextself( lefttri );
+lprevself( righttri );
+bond( lefttri, righttri );
+lnextself( lefttri );
+lprevself( righttri );
+bond( lefttri, righttri );
+firstpoint = (point) eventheap[0]->eventptr;
+eventheap[0]->eventptr = (VOID *) freeevents;
+freeevents = eventheap[0];
+eventheapdelete( eventheap, heapsize, 0 );
+heapsize--;
+do {
+if ( heapsize == 0 ) {
+printf( "Error:  Input points are all identical.\n" );
+exit( 1 );
+}
+secondpoint = (point) eventheap[0]->eventptr;
+eventheap[0]->eventptr = (VOID *) freeevents;
+freeevents = eventheap[0];
+eventheapdelete( eventheap, heapsize, 0 );
+heapsize--;
+if (( firstpoint[0] == secondpoint[0] )
+&& ( firstpoint[1] == secondpoint[1] )) {
+printf(
+"Warning:  A duplicate point at (%.12g, %.12g) appeared and was ignored.\n",
+secondpoint[0], secondpoint[1] );
 /*  Commented out - would eliminate point from output .node file.
       setpointmark(secondpoint, DEADPOINT);
  */
-               }
-       } while ( ( firstpoint[0] == secondpoint[0] )
-                         && ( firstpoint[1] == secondpoint[1] ) );
-       setorg( lefttri, firstpoint );
-       setdest( lefttri, secondpoint );
-       setorg( righttri, secondpoint );
-       setdest( righttri, firstpoint );
-       lprev( lefttri, bottommost );
-       lastpoint = secondpoint;
-       while ( heapsize > 0 ) {
-               nextevent = eventheap[0];
-               eventheapdelete( eventheap, heapsize, 0 );
-               heapsize--;
-               check4events = 1;
-               if ( nextevent->xkey < xmin ) {
-                       decode( nextevent->eventptr, fliptri );
-                       oprev( fliptri, farlefttri );
-                       check4deadevent( &farlefttri, &freeevents, eventheap, &heapsize );
-                       onext( fliptri, farrighttri );
-                       check4deadevent( &farrighttri, &freeevents, eventheap, &heapsize );
-
-                       if ( triedgeequal( farlefttri, bottommost ) ) {
-                               lprev( fliptri, bottommost );
-                       }
-                       flip( &fliptri );
-                       setapex( fliptri, NULL );
-                       lprev( fliptri, lefttri );
-                       lnext( fliptri, righttri );
-                       sym( lefttri, farlefttri );
-
-                       if ( randomnation( SAMPLERATE ) == 0 ) {
-                               symself( fliptri );
-                               dest( fliptri, leftpoint );
-                               apex( fliptri, midpoint );
-                               org( fliptri, rightpoint );
-                               splayroot = circletopinsert( splayroot, &lefttri, leftpoint, midpoint,
-                                                                                        rightpoint, nextevent->ykey );
-                       }
-               }
-               else {
-                       nextpoint = (point) nextevent->eventptr;
-                       if ( ( nextpoint[0] == lastpoint[0] ) && ( nextpoint[1] == lastpoint[1] ) ) {
-                               printf(
-                                       "Warning:  A duplicate point at (%.12g, %.12g) appeared and was ignored.\n",
-                                       nextpoint[0], nextpoint[1] );
+}
+} while (( firstpoint[0] == secondpoint[0] )
+&& ( firstpoint[1] == secondpoint[1] ));
+setorg( lefttri, firstpoint );
+setdest( lefttri, secondpoint );
+setorg( righttri, secondpoint );
+setdest( righttri, firstpoint );
+lprev( lefttri, bottommost );
+lastpoint = secondpoint;
+while ( heapsize > 0 ) {
+nextevent = eventheap[0];
+eventheapdelete( eventheap, heapsize, 0 );
+heapsize--;
+check4events = 1;
+if ( nextevent->xkey < xmin ) {
+decode( nextevent->eventptr, fliptri );
+oprev( fliptri, farlefttri );
+check4deadevent( &farlefttri, &freeevents, eventheap, &heapsize );
+onext( fliptri, farrighttri );
+check4deadevent( &farrighttri, &freeevents, eventheap, &heapsize );
+
+if ( triedgeequal( farlefttri, bottommost )) {
+lprev( fliptri, bottommost );
+}
+flip( &fliptri );
+setapex( fliptri, NULL );
+lprev( fliptri, lefttri );
+lnext( fliptri, righttri );
+sym( lefttri, farlefttri );
+
+if ( randomnation( SAMPLERATE ) == 0 ) {
+symself( fliptri );
+dest( fliptri, leftpoint );
+apex( fliptri, midpoint );
+org( fliptri, rightpoint );
+splayroot = circletopinsert( splayroot, &lefttri, leftpoint, midpoint,
+rightpoint, nextevent->ykey );
+}
+}
+else {
+nextpoint = (point) nextevent->eventptr;
+if (( nextpoint[0] == lastpoint[0] ) && ( nextpoint[1] == lastpoint[1] )) {
+printf(
+"Warning:  A duplicate point at (%.12g, %.12g) appeared and was ignored.\n",
+nextpoint[0], nextpoint[1] );
 /*  Commented out - would eliminate point from output .node file.
         setpointmark(nextpoint, DEADPOINT);
  */
-                               check4events = 0;
-                       }
-                       else {
-                               lastpoint = nextpoint;
+check4events = 0;
+}
+else {
+lastpoint = nextpoint;
 
-                               splayroot = frontlocate( splayroot, &bottommost, nextpoint, &searchtri,
-                                                                                &farrightflag );
+splayroot = frontlocate( splayroot, &bottommost, nextpoint, &searchtri,
+&farrightflag );
 /*
         triedgecopy(bottommost, searchtri);
         farrightflag = 0;
@@ -8626,78 +8813,78 @@ long sweeplinedelaunay(){
         }
  */
 
-                               check4deadevent( &searchtri, &freeevents, eventheap, &heapsize );
-
-                               triedgecopy( searchtri, farrighttri );
-                               sym( searchtri, farlefttri );
-                               maketriangle( &lefttri );
-                               maketriangle( &righttri );
-                               dest( farrighttri, connectpoint );
-                               setorg( lefttri, connectpoint );
-                               setdest( lefttri, nextpoint );
-                               setorg( righttri, nextpoint );
-                               setdest( righttri, connectpoint );
-                               bond( lefttri, righttri );
-                               lnextself( lefttri );
-                               lprevself( righttri );
-                               bond( lefttri, righttri );
-                               lnextself( lefttri );
-                               lprevself( righttri );
-                               bond( lefttri, farlefttri );
-                               bond( righttri, farrighttri );
-                               if ( !farrightflag && triedgeequal( farrighttri, bottommost ) ) {
-                                       triedgecopy( lefttri, bottommost );
-                               }
-
-                               if ( randomnation( SAMPLERATE ) == 0 ) {
-                                       splayroot = splayinsert( splayroot, &lefttri, nextpoint );
-                               }
-                               else if ( randomnation( SAMPLERATE ) == 0 ) {
-                                       lnext( righttri, inserttri );
-                                       splayroot = splayinsert( splayroot, &inserttri, nextpoint );
-                               }
-                       }
-               }
-               nextevent->eventptr = (VOID *) freeevents;
-               freeevents = nextevent;
-
-               if ( check4events ) {
-                       apex( farlefttri, leftpoint );
-                       dest( lefttri, midpoint );
-                       apex( lefttri, rightpoint );
-                       lefttest = counterclockwise( leftpoint, midpoint, rightpoint );
-                       if ( lefttest > 0.0 ) {
-                               newevent = freeevents;
-                               freeevents = (struct event *) freeevents->eventptr;
-                               newevent->xkey = xminextreme;
-                               newevent->ykey = circletop( leftpoint, midpoint, rightpoint,
-                                                                                       lefttest );
-                               newevent->eventptr = (VOID *) encode( lefttri );
-                               eventheapinsert( eventheap, heapsize, newevent );
-                               heapsize++;
-                               setorg( lefttri, newevent );
-                       }
-                       apex( righttri, leftpoint );
-                       org( righttri, midpoint );
-                       apex( farrighttri, rightpoint );
-                       righttest = counterclockwise( leftpoint, midpoint, rightpoint );
-                       if ( righttest > 0.0 ) {
-                               newevent = freeevents;
-                               freeevents = (struct event *) freeevents->eventptr;
-                               newevent->xkey = xminextreme;
-                               newevent->ykey = circletop( leftpoint, midpoint, rightpoint,
-                                                                                       righttest );
-                               newevent->eventptr = (VOID *) encode( farrighttri );
-                               eventheapinsert( eventheap, heapsize, newevent );
-                               heapsize++;
-                               setorg( farrighttri, newevent );
-                       }
-               }
-       }
-
-       pooldeinit( &splaynodes );
-       lprevself( bottommost );
-       return removeghosts( &bottommost );
+check4deadevent( &searchtri, &freeevents, eventheap, &heapsize );
+
+triedgecopy( searchtri, farrighttri );
+sym( searchtri, farlefttri );
+maketriangle( &lefttri );
+maketriangle( &righttri );
+dest( farrighttri, connectpoint );
+setorg( lefttri, connectpoint );
+setdest( lefttri, nextpoint );
+setorg( righttri, nextpoint );
+setdest( righttri, connectpoint );
+bond( lefttri, righttri );
+lnextself( lefttri );
+lprevself( righttri );
+bond( lefttri, righttri );
+lnextself( lefttri );
+lprevself( righttri );
+bond( lefttri, farlefttri );
+bond( righttri, farrighttri );
+if ( !farrightflag && triedgeequal( farrighttri, bottommost )) {
+triedgecopy( lefttri, bottommost );
+}
+
+if ( randomnation( SAMPLERATE ) == 0 ) {
+splayroot = splayinsert( splayroot, &lefttri, nextpoint );
+}
+else if ( randomnation( SAMPLERATE ) == 0 ) {
+lnext( righttri, inserttri );
+splayroot = splayinsert( splayroot, &inserttri, nextpoint );
+}
+}
+}
+nextevent->eventptr = (VOID *) freeevents;
+freeevents = nextevent;
+
+if ( check4events ) {
+apex( farlefttri, leftpoint );
+dest( lefttri, midpoint );
+apex( lefttri, rightpoint );
+lefttest = counterclockwise( leftpoint, midpoint, rightpoint );
+if ( lefttest > 0.0 ) {
+newevent = freeevents;
+freeevents = (struct event *) freeevents->eventptr;
+newevent->xkey = xminextreme;
+newevent->ykey = circletop( leftpoint, midpoint, rightpoint,
+lefttest );
+newevent->eventptr = (VOID *) encode( lefttri );
+eventheapinsert( eventheap, heapsize, newevent );
+heapsize++;
+setorg( lefttri, newevent );
+}
+apex( righttri, leftpoint );
+org( righttri, midpoint );
+apex( farrighttri, rightpoint );
+righttest = counterclockwise( leftpoint, midpoint, rightpoint );
+if ( righttest > 0.0 ) {
+newevent = freeevents;
+freeevents = (struct event *) freeevents->eventptr;
+newevent->xkey = xminextreme;
+newevent->ykey = circletop( leftpoint, midpoint, rightpoint,
+righttest );
+newevent->eventptr = (VOID *) encode( farrighttri );
+eventheapinsert( eventheap, heapsize, newevent );
+heapsize++;
+setorg( farrighttri, newevent );
+}
+}
+}
+
+pooldeinit( &splaynodes );
+lprevself( bottommost );
+return removeghosts( &bottommost );
 }
 
 #endif /* not REDUCED */
@@ -8717,37 +8904,38 @@ long sweeplinedelaunay(){
 /*****************************************************************************/
 
 long delaunay(){
-       eextras = 0;
-       initializetrisegpools();
-
-#ifdef REDUCED
-       if ( !quiet ) {
-               printf(
-                       "Constructing Delaunay triangulation by divide-and-conquer method.\n" );
-       }
-       return divconqdelaunay();
+eextras = 0;
+initializetrisegpools();
+
+#ifdef
+REDUCED
+if ( !quiet ) {
+printf(
+"Constructing Delaunay triangulation by divide-and-conquer method.\n" );
+}
+return divconqdelaunay();
 #else /* not REDUCED */
-       if ( !quiet ) {
-               printf( "Constructing Delaunay triangulation " );
-               if ( incremental ) {
-                       printf( "by incremental method.\n" );
-               }
-               else if ( sweepline ) {
-                       printf( "by sweepline method.\n" );
-               }
-               else {
-                       printf( "by divide-and-conquer method.\n" );
-               }
-       }
-       if ( incremental ) {
-               return incrementaldelaunay();
-       }
-       else if ( sweepline ) {
-               return sweeplinedelaunay();
-       }
-       else {
-               return divconqdelaunay();
-       }
+if ( !quiet ) {
+printf( "Constructing Delaunay triangulation " );
+if ( incremental ) {
+printf( "by incremental method.\n" );
+}
+else if ( sweepline ) {
+printf( "by sweepline method.\n" );
+}
+else {
+printf( "by divide-and-conquer method.\n" );
+}
+}
+if ( incremental ) {
+return incrementaldelaunay();
+}
+else if ( sweepline ) {
+return sweeplinedelaunay();
+}
+else {
+return divconqdelaunay();
+}
 #endif /* not REDUCED */
 }
 
@@ -8776,13 +8964,15 @@ long delaunay(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 int reconstruct( trianglelist, triangleattriblist, trianglearealist, elements,
-                                corners, attribs, segmentlist, segmentmarkerlist,
-                                numberofsegments )
+corners, attribs, segmentlist, segmentmarkerlist,
+numberofsegments )
 int *trianglelist;
 REAL *triangleattriblist;
 REAL *trianglearealist;
@@ -8804,443 +8994,454 @@ FILE *polyfile;
 #endif /* not TRILIBRARY */
 
 {
-#ifdef TRILIBRARY
-       int pointindex;
-       int attribindex;
+#ifdef
+TRILIBRARY
+int pointindex;
+int attribindex;
 #else /* not TRILIBRARY */
-       FILE *elefile;
-       FILE *areafile;
-       char inputline[INPUTLINESIZE];
-       char *stringptr;
-       int areaelements;
+FILE *elefile;
+FILE *areafile;
+char inputline[INPUTLINESIZE];
+char *stringptr;
+int areaelements;
 #endif /* not TRILIBRARY */
-       struct triedge triangleloop;
-       struct triedge triangleleft;
-       struct triedge checktri;
-       struct triedge checkleft;
-       struct triedge checkneighbor;
-       struct edge shelleloop;
-       triangle *vertexarray;
-       triangle *prevlink;
-       triangle nexttri;
-       point tdest, tapex;
-       point checkdest, checkapex;
-       point shorg;
-       point killpoint;
-       REAL area;
-       int corner[3];
-       int end[2];
-       int killpointindex;
-       int incorners;
-       int segmentmarkers;
-       int boundmarker;
-       int aroundpoint;
-       long hullsize;
-       int notfound;
-       int elementnumber, segmentnumber;
-       int i, j;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-#ifdef TRILIBRARY
-       inelements = elements;
-       incorners = corners;
-       if ( incorners < 3 ) {
-               printf( "Error:  Triangles must have at least 3 points.\n" );
-               exit( 1 );
-       }
-       eextras = attribs;
+struct triedge triangleloop;
+struct triedge triangleleft;
+struct triedge checktri;
+struct triedge checkleft;
+struct triedge checkneighbor;
+struct edge shelleloop;
+triangle *vertexarray;
+triangle *prevlink;
+triangle nexttri;
+point tdest, tapex;
+point checkdest, checkapex;
+point shorg;
+point killpoint;
+REAL area;
+int corner[3];
+int end[2];
+int killpointindex;
+int incorners;
+int segmentmarkers;
+int boundmarker;
+int aroundpoint;
+long hullsize;
+int notfound;
+int elementnumber, segmentnumber;
+int i, j;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+#ifdef
+TRILIBRARY
+inelements = elements;
+incorners = corners;
+if ( incorners < 3 ) {
+printf( "Error:  Triangles must have at least 3 points.\n" );
+exit( 1 );
+}
+eextras = attribs;
 #else /* not TRILIBRARY */
-       /* Read the triangles from an .ele file. */
-       if ( !quiet ) {
-               printf( "Opening %s.\n", elefilename );
-       }
-       elefile = fopen( elefilename, "r" );
-       if ( elefile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot access file %s.\n", elefilename );
-               exit( 1 );
-       }
-       /* Read number of triangles, number of points per triangle, and */
-       /*   number of triangle attributes from .ele file.              */
-       stringptr = readline( inputline, elefile, elefilename );
-       inelements = (int) strtol( stringptr, &stringptr, 0 );
-       stringptr = findfield( stringptr );
-       if ( *stringptr == '\0' ) {
-               incorners = 3;
-       }
-       else {
-               incorners = (int) strtol( stringptr, &stringptr, 0 );
-               if ( incorners < 3 ) {
-                       printf( "Error:  Triangles in %s must have at least 3 points.\n",
-                                       elefilename );
-                       exit( 1 );
-               }
-       }
-       stringptr = findfield( stringptr );
-       if ( *stringptr == '\0' ) {
-               eextras = 0;
-       }
-       else {
-               eextras = (int) strtol( stringptr, &stringptr, 0 );
-       }
+/* Read the triangles from an .ele file. */
+if ( !quiet ) {
+printf( "Opening %s.\n", elefilename );
+}
+elefile = fopen( elefilename, "r" );
+if ( elefile == (FILE *) NULL ) {
+printf( "  Error:  Cannot access file %s.\n", elefilename );
+exit( 1 );
+}
+/* Read number of triangles, number of points per triangle, and */
+/*   number of triangle attributes from .ele file.              */
+stringptr = readline( inputline, elefile, elefilename );
+inelements = (int) strtol( stringptr, &stringptr, 0 );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+incorners = 3;
+}
+else {
+incorners = (int) strtol( stringptr, &stringptr, 0 );
+if ( incorners < 3 ) {
+printf( "Error:  Triangles in %s must have at least 3 points.\n",
+elefilename );
+exit( 1 );
+}
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+eextras = 0;
+}
+else {
+eextras = (int) strtol( stringptr, &stringptr, 0 );
+}
 #endif /* not TRILIBRARY */
 
-       initializetrisegpools();
+initializetrisegpools();
 
-       /* Create the triangles. */
-       for ( elementnumber = 1; elementnumber <= inelements; elementnumber++ ) {
-               maketriangle( &triangleloop );
-               /* Mark the triangle as living. */
-               triangleloop.tri[3] = (triangle) triangleloop.tri;
-       }
+/* Create the triangles. */
+for ( elementnumber = 1; elementnumber <= inelements; elementnumber++ ) {
+maketriangle( &triangleloop );
+/* Mark the triangle as living. */
+triangleloop.tri[3] = (triangle) triangleloop.tri;
+}
 
-       if ( poly ) {
-#ifdef TRILIBRARY
-               insegments = numberofsegments;
-               segmentmarkers = segmentmarkerlist != (int *) NULL;
+if ( poly ) {
+#ifdef
+TRILIBRARY
+insegments = numberofsegments;
+segmentmarkers = segmentmarkerlist != (int *) NULL;
 #else /* not TRILIBRARY */
-               /* Read number of segments and number of segment */
-               /*   boundary markers from .poly file.           */
-               stringptr = readline( inputline, polyfile, inpolyfilename );
-               insegments = (int) strtol( stringptr, &stringptr, 0 );
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       segmentmarkers = 0;
-               }
-               else {
-                       segmentmarkers = (int) strtol( stringptr, &stringptr, 0 );
-               }
+/* Read number of segments and number of segment */
+/*   boundary markers from .poly file.           */
+stringptr = readline( inputline, polyfile, inpolyfilename );
+insegments = (int) strtol( stringptr, &stringptr, 0 );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+segmentmarkers = 0;
+}
+else {
+segmentmarkers = (int) strtol( stringptr, &stringptr, 0 );
+}
 #endif /* not TRILIBRARY */
 
-               /* Create the shell edges. */
-               for ( segmentnumber = 1; segmentnumber <= insegments; segmentnumber++ ) {
-                       makeshelle( &shelleloop );
-                       /* Mark the shell edge as living. */
-                       shelleloop.sh[2] = (shelle) shelleloop.sh;
-               }
-       }
-
-#ifdef TRILIBRARY
-       pointindex = 0;
-       attribindex = 0;
+/* Create the shell edges. */
+for ( segmentnumber = 1; segmentnumber <= insegments; segmentnumber++ ) {
+makeshelle( &shelleloop );
+/* Mark the shell edge as living. */
+shelleloop.sh[2] = (shelle) shelleloop.sh;
+}
+}
+
+#ifdef
+TRILIBRARY
+pointindex = 0;
+attribindex = 0;
 #else /* not TRILIBRARY */
-       if ( vararea ) {
-               /* Open an .area file, check for consistency with the .ele file. */
-               if ( !quiet ) {
-                       printf( "Opening %s.\n", areafilename );
-               }
-               areafile = fopen( areafilename, "r" );
-               if ( areafile == (FILE *) NULL ) {
-                       printf( "  Error:  Cannot access file %s.\n", areafilename );
-                       exit( 1 );
-               }
-               stringptr = readline( inputline, areafile, areafilename );
-               areaelements = (int) strtol( stringptr, &stringptr, 0 );
-               if ( areaelements != inelements ) {
-                       printf( "Error:  %s and %s disagree on number of triangles.\n",
-                                       elefilename, areafilename );
-                       exit( 1 );
-               }
-       }
+if ( vararea ) {
+/* Open an .area file, check for consistency with the .ele file. */
+if ( !quiet ) {
+printf( "Opening %s.\n", areafilename );
+}
+areafile = fopen( areafilename, "r" );
+if ( areafile == (FILE *) NULL ) {
+printf( "  Error:  Cannot access file %s.\n", areafilename );
+exit( 1 );
+}
+stringptr = readline( inputline, areafile, areafilename );
+areaelements = (int) strtol( stringptr, &stringptr, 0 );
+if ( areaelements != inelements ) {
+printf( "Error:  %s and %s disagree on number of triangles.\n",
+elefilename, areafilename );
+exit( 1 );
+}
+}
 #endif /* not TRILIBRARY */
 
-       if ( !quiet ) {
-               printf( "Reconstructing mesh.\n" );
-       }
-       /* Allocate a temporary array that maps each point to some adjacent  */
-       /*   triangle.  I took care to allocate all the permanent memory for */
-       /*   triangles and shell edges first.                                */
-       vertexarray = (triangle *) malloc( points.items * sizeof( triangle ) );
-       if ( vertexarray == (triangle *) NULL ) {
-               printf( "Error:  Out of memory.\n" );
-               exit( 1 );
-       }
-       /* Each point is initially unrepresented. */
-       for ( i = 0; i < points.items; i++ ) {
-               vertexarray[i] = (triangle) dummytri;
-       }
-
-       if ( verbose ) {
-               printf( "  Assembling triangles.\n" );
-       }
-       /* Read the triangles from the .ele file, and link */
-       /*   together those that share an edge.            */
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       elementnumber = firstnumber;
-       while ( triangleloop.tri != (triangle *) NULL ) {
-#ifdef TRILIBRARY
-               /* Copy the triangle's three corners. */
-               for ( j = 0; j < 3; j++ ) {
-                       corner[j] = trianglelist[pointindex++];
-                       if ( ( corner[j] < firstnumber ) || ( corner[j] >= firstnumber + inpoints ) ) {
-                               printf( "Error:  Triangle %d has an invalid vertex index.\n",
-                                               elementnumber );
-                               exit( 1 );
-                       }
-               }
+if ( !quiet ) {
+printf( "Reconstructing mesh.\n" );
+}
+/* Allocate a temporary array that maps each point to some adjacent  */
+/*   triangle.  I took care to allocate all the permanent memory for */
+/*   triangles and shell edges first.                                */
+vertexarray = (triangle *) malloc( points.items * sizeof( triangle ));
+if ( vertexarray == (triangle *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+/* Each point is initially unrepresented. */
+for ( i = 0; i < points.items; i++ ) {
+vertexarray[i] = (triangle) dummytri;
+}
+
+if ( verbose ) {
+printf( "  Assembling triangles.\n" );
+}
+/* Read the triangles from the .ele file, and link */
+/*   together those that share an edge.            */
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+elementnumber = firstnumber;
+while ( triangleloop.tri != (triangle *) NULL ) {
+#ifdef
+TRILIBRARY
+/* Copy the triangle's three corners. */
+for ( j = 0; j < 3; j++ ) {
+corner[j] = trianglelist[pointindex++];
+if (( corner[j] < firstnumber ) || ( corner[j] >= firstnumber + inpoints )) {
+printf( "Error:  Triangle %d has an invalid vertex index.\n",
+elementnumber );
+exit( 1 );
+}
+}
 #else /* not TRILIBRARY */
-               /* Read triangle number and the triangle's three corners. */
-               stringptr = readline( inputline, elefile, elefilename );
-               for ( j = 0; j < 3; j++ ) {
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               printf( "Error:  Triangle %d is missing point %d in %s.\n",
-                                               elementnumber, j + 1, elefilename );
-                               exit( 1 );
-                       }
-                       else {
-                               corner[j] = (int) strtol( stringptr, &stringptr, 0 );
-                               if ( ( corner[j] < firstnumber ) ||
-                                        ( corner[j] >= firstnumber + inpoints ) ) {
-                                       printf( "Error:  Triangle %d has an invalid vertex index.\n",
-                                                       elementnumber );
-                                       exit( 1 );
-                               }
-                       }
-               }
+/* Read triangle number and the triangle's three corners. */
+stringptr = readline( inputline, elefile, elefilename );
+for ( j = 0; j < 3; j++ ) {
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Triangle %d is missing point %d in %s.\n",
+elementnumber, j + 1, elefilename );
+exit( 1 );
+}
+else {
+corner[j] = (int) strtol( stringptr, &stringptr, 0 );
+if (( corner[j] < firstnumber ) ||
+( corner[j] >= firstnumber + inpoints )) {
+printf( "Error:  Triangle %d has an invalid vertex index.\n",
+elementnumber );
+exit( 1 );
+}
+}
+}
 #endif /* not TRILIBRARY */
 
-               /* Find out about (and throw away) extra nodes. */
-               for ( j = 3; j < incorners; j++ ) {
-#ifdef TRILIBRARY
-                       killpointindex = trianglelist[pointindex++];
+/* Find out about (and throw away) extra nodes. */
+for ( j = 3; j < incorners; j++ ) {
+#ifdef
+TRILIBRARY
+killpointindex = trianglelist[pointindex++];
 #else /* not TRILIBRARY */
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr != '\0' ) {
-                               killpointindex = (int) strtol( stringptr, &stringptr, 0 );
+stringptr = findfield( stringptr );
+if ( *stringptr != '\0' ) {
+killpointindex = (int) strtol( stringptr, &stringptr, 0 );
 #endif /* not TRILIBRARY */
-                       if ( ( killpointindex >= firstnumber ) &&
-                                ( killpointindex < firstnumber + inpoints ) ) {
-                               /* Delete the non-corner point if it's not already deleted. */
-                               killpoint = getpoint( killpointindex );
-                               if ( pointmark( killpoint ) != DEADPOINT ) {
-                                       pointdealloc( killpoint );
-                               }
-                       }
-#ifndef TRILIBRARY
-               }
+if (( killpointindex >= firstnumber ) &&
+( killpointindex < firstnumber + inpoints )) {
+/* Delete the non-corner point if it's not already deleted. */
+killpoint = getpoint( killpointindex );
+if ( pointmark( killpoint ) != DEADPOINT ) {
+pointdealloc( killpoint );
+}
+}
+#ifndef
+TRILIBRARY
+}
 #endif /* not TRILIBRARY */
-               }
+}
 
-               /* Read the triangle's attributes. */
-               for ( j = 0; j < eextras; j++ ) {
-#ifdef TRILIBRARY
-                       setelemattribute( triangleloop, j, triangleattriblist[attribindex++] );
+/* Read the triangle's attributes. */
+for ( j = 0; j < eextras; j++ ) {
+#ifdef
+TRILIBRARY
+setelemattribute( triangleloop, j, triangleattriblist[attribindex++] );
 #else /* not TRILIBRARY */
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               setelemattribute( triangleloop, j, 0 );
-                       }
-                       else {
-                               setelemattribute( triangleloop, j,
-                                                                 (REAL) strtod( stringptr, &stringptr ) );
-                       }
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+setelemattribute( triangleloop, j, 0 );
+}
+else {
+setelemattribute( triangleloop, j,
+(REAL) strtod( stringptr, &stringptr ));
+}
 #endif /* not TRILIBRARY */
-               }
+}
 
-               if ( vararea ) {
-#ifdef TRILIBRARY
-                       area = trianglearealist[elementnumber - firstnumber];
+if ( vararea ) {
+#ifdef
+TRILIBRARY
+area = trianglearealist[elementnumber - firstnumber];
 #else /* not TRILIBRARY */
-                       /* Read an area constraint from the .area file. */
-                       stringptr = readline( inputline, areafile, areafilename );
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               area = -1.0;              /* No constraint on this triangle. */
-                       }
-                       else {
-                               area = (REAL) strtod( stringptr, &stringptr );
-                       }
+/* Read an area constraint from the .area file. */
+stringptr = readline( inputline, areafile, areafilename );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+area = -1.0;              /* No constraint on this triangle. */
+}
+else {
+area = (REAL) strtod( stringptr, &stringptr );
+}
 #endif /* not TRILIBRARY */
-                       setareabound( triangleloop, area );
-               }
-
-               /* Set the triangle's vertices. */
-               triangleloop.orient = 0;
-               setorg( triangleloop, getpoint( corner[0] ) );
-               setdest( triangleloop, getpoint( corner[1] ) );
-               setapex( triangleloop, getpoint( corner[2] ) );
-               /* Try linking the triangle to others that share these vertices. */
-               for ( triangleloop.orient = 0; triangleloop.orient < 3;
-                         triangleloop.orient++ ) {
-                       /* Take the number for the origin of triangleloop. */
-                       aroundpoint = corner[triangleloop.orient];
-                       /* Look for other triangles having this vertex. */
-                       nexttri = vertexarray[aroundpoint - firstnumber];
-                       /* Link the current triangle to the next one in the stack. */
-                       triangleloop.tri[6 + triangleloop.orient] = nexttri;
-                       /* Push the current triangle onto the stack. */
-                       vertexarray[aroundpoint - firstnumber] = encode( triangleloop );
-                       decode( nexttri, checktri );
-                       if ( checktri.tri != dummytri ) {
-                               dest( triangleloop, tdest );
-                               apex( triangleloop, tapex );
-                               /* Look for other triangles that share an edge. */
-                               do {
-                                       dest( checktri, checkdest );
-                                       apex( checktri, checkapex );
-                                       if ( tapex == checkdest ) {
-                                               /* The two triangles share an edge; bond them together. */
-                                               lprev( triangleloop, triangleleft );
-                                               bond( triangleleft, checktri );
-                                       }
-                                       if ( tdest == checkapex ) {
-                                               /* The two triangles share an edge; bond them together. */
-                                               lprev( checktri, checkleft );
-                                               bond( triangleloop, checkleft );
-                                       }
-                                       /* Find the next triangle in the stack. */
-                                       nexttri = checktri.tri[6 + checktri.orient];
-                                       decode( nexttri, checktri );
-                               } while ( checktri.tri != dummytri );
-                       }
-               }
-               triangleloop.tri = triangletraverse();
-               elementnumber++;
-       }
-
-#ifdef TRILIBRARY
-       pointindex = 0;
+setareabound( triangleloop, area );
+}
+
+/* Set the triangle's vertices. */
+triangleloop.orient = 0;
+setorg( triangleloop, getpoint( corner[0] ));
+setdest( triangleloop, getpoint( corner[1] ));
+setapex( triangleloop, getpoint( corner[2] ));
+/* Try linking the triangle to others that share these vertices. */
+for ( triangleloop.orient = 0; triangleloop.orient < 3;
+triangleloop.orient++ ) {
+/* Take the number for the origin of triangleloop. */
+aroundpoint = corner[triangleloop.orient];
+/* Look for other triangles having this vertex. */
+nexttri = vertexarray[aroundpoint - firstnumber];
+/* Link the current triangle to the next one in the stack. */
+triangleloop.tri[6 + triangleloop.orient] = nexttri;
+/* Push the current triangle onto the stack. */
+vertexarray[aroundpoint - firstnumber] = encode( triangleloop );
+decode( nexttri, checktri );
+if ( checktri.tri != dummytri ) {
+dest( triangleloop, tdest );
+apex( triangleloop, tapex );
+/* Look for other triangles that share an edge. */
+do {
+dest( checktri, checkdest );
+apex( checktri, checkapex );
+if ( tapex == checkdest ) {
+/* The two triangles share an edge; bond them together. */
+lprev( triangleloop, triangleleft );
+bond( triangleleft, checktri );
+}
+if ( tdest == checkapex ) {
+/* The two triangles share an edge; bond them together. */
+lprev( checktri, checkleft );
+bond( triangleloop, checkleft );
+}
+/* Find the next triangle in the stack. */
+nexttri = checktri.tri[6 + checktri.orient];
+decode( nexttri, checktri );
+} while ( checktri.tri != dummytri );
+}
+}
+triangleloop.tri = triangletraverse();
+elementnumber++;
+}
+
+#ifdef
+TRILIBRARY
+pointindex = 0;
 #else /* not TRILIBRARY */
-       fclose( elefile );
-       if ( vararea ) {
-               fclose( areafile );
-       }
+fclose( elefile );
+if ( vararea ) {
+fclose( areafile );
+}
 #endif /* not TRILIBRARY */
 
-       hullsize = 0;                    /* Prepare to count the boundary edges. */
-       if ( poly ) {
-               if ( verbose ) {
-                       printf( "  Marking segments in triangulation.\n" );
-               }
-               /* Read the segments from the .poly file, and link them */
-               /*   to their neighboring triangles.                    */
-               boundmarker = 0;
-               traversalinit( &shelles );
-               shelleloop.sh = shelletraverse();
-               segmentnumber = firstnumber;
-               while ( shelleloop.sh != (shelle *) NULL ) {
-#ifdef TRILIBRARY
-                       end[0] = segmentlist[pointindex++];
-                       end[1] = segmentlist[pointindex++];
-                       if ( segmentmarkers ) {
-                               boundmarker = segmentmarkerlist[segmentnumber - firstnumber];
-                       }
+hullsize = 0;                    /* Prepare to count the boundary edges. */
+if ( poly ) {
+if ( verbose ) {
+printf( "  Marking segments in triangulation.\n" );
+}
+/* Read the segments from the .poly file, and link them */
+/*   to their neighboring triangles.                    */
+boundmarker = 0;
+traversalinit( &shelles );
+shelleloop.sh = shelletraverse();
+segmentnumber = firstnumber;
+while ( shelleloop.sh != (shelle *) NULL ) {
+#ifdef
+TRILIBRARY
+end[0] = segmentlist[pointindex++];
+end[1] = segmentlist[pointindex++];
+if ( segmentmarkers ) {
+boundmarker = segmentmarkerlist[segmentnumber - firstnumber];
+}
 #else /* not TRILIBRARY */
-                       /* Read the endpoints of each segment, and possibly a boundary marker. */
-                       stringptr = readline( inputline, polyfile, inpolyfilename );
-                       /* Skip the first (segment number) field. */
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               printf( "Error:  Segment %d has no endpoints in %s.\n", segmentnumber,
-                                               polyfilename );
-                               exit( 1 );
-                       }
-                       else {
-                               end[0] = (int) strtol( stringptr, &stringptr, 0 );
-                       }
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               printf( "Error:  Segment %d is missing its second endpoint in %s.\n",
-                                               segmentnumber, polyfilename );
-                               exit( 1 );
-                       }
-                       else {
-                               end[1] = (int) strtol( stringptr, &stringptr, 0 );
-                       }
-                       if ( segmentmarkers ) {
-                               stringptr = findfield( stringptr );
-                               if ( *stringptr == '\0' ) {
-                                       boundmarker = 0;
-                               }
-                               else {
-                                       boundmarker = (int) strtol( stringptr, &stringptr, 0 );
-                               }
-                       }
+/* Read the endpoints of each segment, and possibly a boundary marker. */
+stringptr = readline( inputline, polyfile, inpolyfilename );
+/* Skip the first (segment number) field. */
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Segment %d has no endpoints in %s.\n", segmentnumber,
+polyfilename );
+exit( 1 );
+}
+else {
+end[0] = (int) strtol( stringptr, &stringptr, 0 );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Segment %d is missing its second endpoint in %s.\n",
+segmentnumber, polyfilename );
+exit( 1 );
+}
+else {
+end[1] = (int) strtol( stringptr, &stringptr, 0 );
+}
+if ( segmentmarkers ) {
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+boundmarker = 0;
+}
+else {
+boundmarker = (int) strtol( stringptr, &stringptr, 0 );
+}
+}
 #endif /* not TRILIBRARY */
-                       for ( j = 0; j < 2; j++ ) {
-                               if ( ( end[j] < firstnumber ) || ( end[j] >= firstnumber + inpoints ) ) {
-                                       printf( "Error:  Segment %d has an invalid vertex index.\n",
-                                                       segmentnumber );
-                                       exit( 1 );
-                               }
-                       }
-
-                       /* set the shell edge's vertices. */
-                       shelleloop.shorient = 0;
-                       setsorg( shelleloop, getpoint( end[0] ) );
-                       setsdest( shelleloop, getpoint( end[1] ) );
-                       setmark( shelleloop, boundmarker );
-                       /* Try linking the shell edge to triangles that share these vertices. */
-                       for ( shelleloop.shorient = 0; shelleloop.shorient < 2;
-                                 shelleloop.shorient++ ) {
-                               /* Take the number for the destination of shelleloop. */
-                               aroundpoint = end[1 - shelleloop.shorient];
-                               /* Look for triangles having this vertex. */
-                               prevlink = &vertexarray[aroundpoint - firstnumber];
-                               nexttri = vertexarray[aroundpoint - firstnumber];
-                               decode( nexttri, checktri );
-                               sorg( shelleloop, shorg );
-                               notfound = 1;
-                               /* Look for triangles having this edge.  Note that I'm only       */
-                               /*   comparing each triangle's destination with the shell edge;   */
-                               /*   each triangle's apex is handled through a different vertex.  */
-                               /*   Because each triangle appears on three vertices' lists, each */
-                               /*   occurrence of a triangle on a list can (and does) represent  */
-                               /*   an edge.  In this way, most edges are represented twice, and */
-                               /*   every triangle-segment bond is represented once.             */
-                               while ( notfound && ( checktri.tri != dummytri ) ) {
-                                       dest( checktri, checkdest );
-                                       if ( shorg == checkdest ) {
-                                               /* We have a match.  Remove this triangle from the list. */
-                                               *prevlink = checktri.tri[6 + checktri.orient];
-                                               /* Bond the shell edge to the triangle. */
-                                               tsbond( checktri, shelleloop );
-                                               /* Check if this is a boundary edge. */
-                                               sym( checktri, checkneighbor );
-                                               if ( checkneighbor.tri == dummytri ) {
-                                                       /* The next line doesn't insert a shell edge (because there's */
-                                                       /*   already one there), but it sets the boundary markers of  */
-                                                       /*   the existing shell edge and its vertices.                */
-                                                       insertshelle( &checktri, 1 );
-                                                       hullsize++;
-                                               }
-                                               notfound = 0;
-                                       }
-                                       /* Find the next triangle in the stack. */
-                                       prevlink = &checktri.tri[6 + checktri.orient];
-                                       nexttri = checktri.tri[6 + checktri.orient];
-                                       decode( nexttri, checktri );
-                               }
-                       }
-                       shelleloop.sh = shelletraverse();
-                       segmentnumber++;
-               }
-       }
-
-       /* Mark the remaining edges as not being attached to any shell edge. */
-       /* Also, count the (yet uncounted) boundary edges.                   */
-       for ( i = 0; i < points.items; i++ ) {
-               /* Search the stack of triangles adjacent to a point. */
-               nexttri = vertexarray[i];
-               decode( nexttri, checktri );
-               while ( checktri.tri != dummytri ) {
-                       /* Find the next triangle in the stack before this */
-                       /*   information gets overwritten.                 */
-                       nexttri = checktri.tri[6 + checktri.orient];
-                       /* No adjacent shell edge.  (This overwrites the stack info.) */
-                       tsdissolve( checktri );
-                       sym( checktri, checkneighbor );
-                       if ( checkneighbor.tri == dummytri ) {
-                               insertshelle( &checktri, 1 );
-                               hullsize++;
-                       }
-                       decode( nexttri, checktri );
-               }
-       }
-
-       free( vertexarray );
-       return hullsize;
+for ( j = 0; j < 2; j++ ) {
+if (( end[j] < firstnumber ) || ( end[j] >= firstnumber + inpoints )) {
+printf( "Error:  Segment %d has an invalid vertex index.\n",
+segmentnumber );
+exit( 1 );
+}
+}
+
+/* set the shell edge's vertices. */
+shelleloop.shorient = 0;
+setsorg( shelleloop, getpoint( end[0] ));
+setsdest( shelleloop, getpoint( end[1] ));
+setmark( shelleloop, boundmarker );
+/* Try linking the shell edge to triangles that share these vertices. */
+for ( shelleloop.shorient = 0; shelleloop.shorient < 2;
+shelleloop.shorient++ ) {
+/* Take the number for the destination of shelleloop. */
+aroundpoint = end[1 - shelleloop.shorient];
+/* Look for triangles having this vertex. */
+prevlink = &vertexarray[aroundpoint - firstnumber];
+nexttri = vertexarray[aroundpoint - firstnumber];
+decode( nexttri, checktri );
+sorg( shelleloop, shorg );
+notfound = 1;
+/* Look for triangles having this edge.  Note that I'm only       */
+/*   comparing each triangle's destination with the shell edge;   */
+/*   each triangle's apex is handled through a different vertex.  */
+/*   Because each triangle appears on three vertices' lists, each */
+/*   occurrence of a triangle on a list can (and does) represent  */
+/*   an edge.  In this way, most edges are represented twice, and */
+/*   every triangle-segment bond is represented once.             */
+while ( notfound && ( checktri.tri != dummytri )) {
+dest( checktri, checkdest );
+if ( shorg == checkdest ) {
+/* We have a match.  Remove this triangle from the list. */
+*prevlink = checktri.tri[6 + checktri.orient];
+/* Bond the shell edge to the triangle. */
+tsbond( checktri, shelleloop );
+/* Check if this is a boundary edge. */
+sym( checktri, checkneighbor );
+if ( checkneighbor.tri == dummytri ) {
+/* The next line doesn't insert a shell edge (because there's */
+/*   already one there), but it sets the boundary markers of  */
+/*   the existing shell edge and its vertices.                */
+insertshelle( &checktri, 1 );
+hullsize++;
+}
+notfound = 0;
+}
+/* Find the next triangle in the stack. */
+prevlink = &checktri.tri[6 + checktri.orient];
+nexttri = checktri.tri[6 + checktri.orient];
+decode( nexttri, checktri );
+}
+}
+shelleloop.sh = shelletraverse();
+segmentnumber++;
+}
+}
+
+/* Mark the remaining edges as not being attached to any shell edge. */
+/* Also, count the (yet uncounted) boundary edges.                   */
+for ( i = 0; i < points.items; i++ ) {
+/* Search the stack of triangles adjacent to a point. */
+nexttri = vertexarray[i];
+decode( nexttri, checktri );
+while ( checktri.tri != dummytri ) {
+/* Find the next triangle in the stack before this */
+/*   information gets overwritten.                 */
+nexttri = checktri.tri[6 + checktri.orient];
+/* No adjacent shell edge.  (This overwrites the stack info.) */
+tsdissolve( checktri );
+sym( checktri, checkneighbor );
+if ( checkneighbor.tri == dummytri ) {
+insertshelle( &checktri, 1 );
+hullsize++;
+}
+decode( nexttri, checktri );
+}
+}
+
+free( vertexarray );
+return hullsize;
 }
 
 #endif /* not CDT_ONLY */
@@ -9274,73 +9475,73 @@ enum finddirectionresult finddirection( searchtri, endpoint )
 struct triedge *searchtri;
 point endpoint;
 {
-       struct triedge checktri;
-       point startpoint;
-       point leftpoint, rightpoint;
-       REAL leftccw, rightccw;
-       int leftflag, rightflag;
-       triangle ptr;         /* Temporary variable used by onext() and oprev(). */
-
-       org( *searchtri, startpoint );
-       dest( *searchtri, rightpoint );
-       apex( *searchtri, leftpoint );
-       /* Is `endpoint' to the left? */
-       leftccw = counterclockwise( endpoint, startpoint, leftpoint );
-       leftflag = leftccw > 0.0;
-       /* Is `endpoint' to the right? */
-       rightccw = counterclockwise( startpoint, endpoint, rightpoint );
-       rightflag = rightccw > 0.0;
-       if ( leftflag && rightflag ) {
-               /* `searchtri' faces directly away from `endpoint'.  We could go */
-               /*   left or right.  Ask whether it's a triangle or a boundary   */
-               /*   on the left.                                                */
-               onext( *searchtri, checktri );
-               if ( checktri.tri == dummytri ) {
-                       leftflag = 0;
-               }
-               else {
-                       rightflag = 0;
-               }
-       }
-       while ( leftflag ) {
-               /* Turn left until satisfied. */
-               onextself( *searchtri );
-               if ( searchtri->tri == dummytri ) {
-                       printf( "Internal error in finddirection():  Unable to find a\n" );
-                       printf( "  triangle leading from (%.12g, %.12g) to", startpoint[0],
-                                       startpoint[1] );
-                       printf( "  (%.12g, %.12g).\n", endpoint[0], endpoint[1] );
-                       internalerror();
-               }
-               apex( *searchtri, leftpoint );
-               rightccw = leftccw;
-               leftccw = counterclockwise( endpoint, startpoint, leftpoint );
-               leftflag = leftccw > 0.0;
-       }
-       while ( rightflag ) {
-               /* Turn right until satisfied. */
-               oprevself( *searchtri );
-               if ( searchtri->tri == dummytri ) {
-                       printf( "Internal error in finddirection():  Unable to find a\n" );
-                       printf( "  triangle leading from (%.12g, %.12g) to", startpoint[0],
-                                       startpoint[1] );
-                       printf( "  (%.12g, %.12g).\n", endpoint[0], endpoint[1] );
-                       internalerror();
-               }
-               dest( *searchtri, rightpoint );
-               leftccw = rightccw;
-               rightccw = counterclockwise( startpoint, endpoint, rightpoint );
-               rightflag = rightccw > 0.0;
-       }
-       if ( leftccw == 0.0 ) {
-               return LEFTCOLLINEAR;
-       }
-       else if ( rightccw == 0.0 ) {
-               return RIGHTCOLLINEAR;
-       }
-       else {
-               return WITHIN;
-       }
+struct triedge checktri;
+point startpoint;
+point leftpoint, rightpoint;
+REAL leftccw, rightccw;
+int leftflag, rightflag;
+triangle ptr;         /* Temporary variable used by onext() and oprev(). */
+
+org( *searchtri, startpoint );
+dest( *searchtri, rightpoint );
+apex( *searchtri, leftpoint );
+/* Is `endpoint' to the left? */
+leftccw = counterclockwise( endpoint, startpoint, leftpoint );
+leftflag = leftccw > 0.0;
+/* Is `endpoint' to the right? */
+rightccw = counterclockwise( startpoint, endpoint, rightpoint );
+rightflag = rightccw > 0.0;
+if ( leftflag && rightflag ) {
+/* `searchtri' faces directly away from `endpoint'.  We could go */
+/*   left or right.  Ask whether it's a triangle or a boundary   */
+/*   on the left.                                                */
+onext( *searchtri, checktri );
+if ( checktri.tri == dummytri ) {
+leftflag = 0;
+}
+else {
+rightflag = 0;
+}
+}
+while ( leftflag ) {
+/* Turn left until satisfied. */
+onextself( *searchtri );
+if ( searchtri->tri == dummytri ) {
+printf( "Internal error in finddirection():  Unable to find a\n" );
+printf( "  triangle leading from (%.12g, %.12g) to", startpoint[0],
+startpoint[1] );
+printf( "  (%.12g, %.12g).\n", endpoint[0], endpoint[1] );
+internalerror();
+}
+apex( *searchtri, leftpoint );
+rightccw = leftccw;
+leftccw = counterclockwise( endpoint, startpoint, leftpoint );
+leftflag = leftccw > 0.0;
+}
+while ( rightflag ) {
+/* Turn right until satisfied. */
+oprevself( *searchtri );
+if ( searchtri->tri == dummytri ) {
+printf( "Internal error in finddirection():  Unable to find a\n" );
+printf( "  triangle leading from (%.12g, %.12g) to", startpoint[0],
+startpoint[1] );
+printf( "  (%.12g, %.12g).\n", endpoint[0], endpoint[1] );
+internalerror();
+}
+dest( *searchtri, rightpoint );
+leftccw = rightccw;
+rightccw = counterclockwise( startpoint, endpoint, rightpoint );
+rightflag = rightccw > 0.0;
+}
+if ( leftccw == 0.0 ) {
+return LEFTCOLLINEAR;
+}
+else if ( rightccw == 0.0 ) {
+return RIGHTCOLLINEAR;
+}
+else {
+return WITHIN;
+}
 }
 
 /*****************************************************************************/
@@ -9365,74 +9566,74 @@ struct triedge *splittri;
 struct edge *splitshelle;
 point endpoint2;
 {
-       point endpoint1;
-       point torg, tdest;
-       point leftpoint, rightpoint;
-       point newpoint;
-       enum insertsiteresult success;
-       enum finddirectionresult collinear;
-       REAL ex, ey;
-       REAL tx, ty;
-       REAL etx, ety;
-       REAL split, denom;
-       int i;
-       triangle ptr;                     /* Temporary variable used by onext(). */
-
-       /* Find the other three segment endpoints. */
-       apex( *splittri, endpoint1 );
-       org( *splittri, torg );
-       dest( *splittri, tdest );
-       /* Segment intersection formulae; see the Antonio reference. */
-       tx = tdest[0] - torg[0];
-       ty = tdest[1] - torg[1];
-       ex = endpoint2[0] - endpoint1[0];
-       ey = endpoint2[1] - endpoint1[1];
-       etx = torg[0] - endpoint2[0];
-       ety = torg[1] - endpoint2[1];
-       denom = ty * ex - tx * ey;
-       if ( denom == 0.0 ) {
-               printf( "Internal error in segmentintersection():" );
-               printf( "  Attempt to find intersection of parallel segments.\n" );
-               internalerror();
-       }
-       split = ( ey * etx - ex * ety ) / denom;
-       /* Create the new point. */
-       newpoint = (point) poolalloc( &points );
-       /* Interpolate its coordinate and attributes. */
-       for ( i = 0; i < 2 + nextras; i++ ) {
-               newpoint[i] = torg[i] + split * ( tdest[i] - torg[i] );
-       }
-       setpointmark( newpoint, mark( *splitshelle ) );
-       if ( verbose > 1 ) {
-               printf(
-                       "  Splitting edge (%.12g, %.12g) (%.12g, %.12g) at (%.12g, %.12g).\n",
-                       torg[0], torg[1], tdest[0], tdest[1], newpoint[0], newpoint[1] );
-       }
-       /* Insert the intersection point.  This should always succeed. */
-       success = insertsite( newpoint, splittri, splitshelle, 0, 0 );
-       if ( success != SUCCESSFULPOINT ) {
-               printf( "Internal error in segmentintersection():\n" );
-               printf( "  Failure to split a segment.\n" );
-               internalerror();
-       }
-       if ( steinerleft > 0 ) {
-               steinerleft--;
-       }
-       /* Inserting the point may have caused edge flips.  We wish to rediscover */
-       /*   the edge connecting endpoint1 to the new intersection point.         */
-       collinear = finddirection( splittri, endpoint1 );
-       dest( *splittri, rightpoint );
-       apex( *splittri, leftpoint );
-       if ( ( leftpoint[0] == endpoint1[0] ) && ( leftpoint[1] == endpoint1[1] ) ) {
-               onextself( *splittri );
-       }
-       else if ( ( rightpoint[0] != endpoint1[0] ) ||
-                         ( rightpoint[1] != endpoint1[1] ) ) {
-               printf( "Internal error in segmentintersection():\n" );
-               printf( "  Topological inconsistency after splitting a segment.\n" );
-               internalerror();
-       }
-       /* `splittri' should have destination endpoint1. */
+point endpoint1;
+point torg, tdest;
+point leftpoint, rightpoint;
+point newpoint;
+enum insertsiteresult success;
+enum finddirectionresult collinear;
+REAL ex, ey;
+REAL tx, ty;
+REAL etx, ety;
+REAL split, denom;
+int i;
+triangle ptr;                     /* Temporary variable used by onext(). */
+
+/* Find the other three segment endpoints. */
+apex( *splittri, endpoint1 );
+org( *splittri, torg );
+dest( *splittri, tdest );
+/* Segment intersection formulae; see the Antonio reference. */
+tx = tdest[0] - torg[0];
+ty = tdest[1] - torg[1];
+ex = endpoint2[0] - endpoint1[0];
+ey = endpoint2[1] - endpoint1[1];
+etx = torg[0] - endpoint2[0];
+ety = torg[1] - endpoint2[1];
+denom = ty * ex - tx * ey;
+if ( denom == 0.0 ) {
+printf( "Internal error in segmentintersection():" );
+printf( "  Attempt to find intersection of parallel segments.\n" );
+internalerror();
+}
+split = ( ey * etx - ex * ety ) / denom;
+/* Create the new point. */
+newpoint = (point) poolalloc( &points );
+/* Interpolate its coordinate and attributes. */
+for ( i = 0; i < 2 + nextras; i++ ) {
+newpoint[i] = torg[i] + split * ( tdest[i] - torg[i] );
+}
+setpointmark( newpoint, mark( *splitshelle ));
+if ( verbose > 1 ) {
+printf(
+"  Splitting edge (%.12g, %.12g) (%.12g, %.12g) at (%.12g, %.12g).\n",
+torg[0], torg[1], tdest[0], tdest[1], newpoint[0], newpoint[1] );
+}
+/* Insert the intersection point.  This should always succeed. */
+success = insertsite( newpoint, splittri, splitshelle, 0, 0 );
+if ( success != SUCCESSFULPOINT ) {
+printf( "Internal error in segmentintersection():\n" );
+printf( "  Failure to split a segment.\n" );
+internalerror();
+}
+if ( steinerleft > 0 ) {
+steinerleft--;
+}
+/* Inserting the point may have caused edge flips.  We wish to rediscover */
+/*   the edge connecting endpoint1 to the new intersection point.         */
+collinear = finddirection( splittri, endpoint1 );
+dest( *splittri, rightpoint );
+apex( *splittri, leftpoint );
+if (( leftpoint[0] == endpoint1[0] ) && ( leftpoint[1] == endpoint1[1] )) {
+onextself( *splittri );
+}
+else if (( rightpoint[0] != endpoint1[0] ) ||
+( rightpoint[1] != endpoint1[1] )) {
+printf( "Internal error in segmentintersection():\n" );
+printf( "  Topological inconsistency after splitting a segment.\n" );
+internalerror();
+}
+/* `splittri' should have destination endpoint1. */
 }
 
 /*****************************************************************************/
@@ -9466,59 +9667,59 @@ struct triedge *searchtri;
 point endpoint2;
 int newmark;
 {
-       struct triedge crosstri;
-       struct edge crossedge;
-       point leftpoint, rightpoint;
-       point endpoint1;
-       enum finddirectionresult collinear;
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       collinear = finddirection( searchtri, endpoint2 );
-       dest( *searchtri, rightpoint );
-       apex( *searchtri, leftpoint );
-       if ( ( ( leftpoint[0] == endpoint2[0] ) && ( leftpoint[1] == endpoint2[1] ) ) ||
-                ( ( rightpoint[0] == endpoint2[0] ) && ( rightpoint[1] == endpoint2[1] ) ) ) {
-               /* The segment is already an edge in the mesh. */
-               if ( ( leftpoint[0] == endpoint2[0] ) && ( leftpoint[1] == endpoint2[1] ) ) {
-                       lprevself( *searchtri );
-               }
-               /* Insert a shell edge, if there isn't already one there. */
-               insertshelle( searchtri, newmark );
-               return 1;
-       }
-       else if ( collinear == LEFTCOLLINEAR ) {
-               /* We've collided with a point between the segment's endpoints. */
-               /* Make the collinear point be the triangle's origin. */
-               lprevself( *searchtri );
-               insertshelle( searchtri, newmark );
-               /* Insert the remainder of the segment. */
-               return scoutsegment( searchtri, endpoint2, newmark );
-       }
-       else if ( collinear == RIGHTCOLLINEAR ) {
-               /* We've collided with a point between the segment's endpoints. */
-               insertshelle( searchtri, newmark );
-               /* Make the collinear point be the triangle's origin. */
-               lnextself( *searchtri );
-               /* Insert the remainder of the segment. */
-               return scoutsegment( searchtri, endpoint2, newmark );
-       }
-       else {
-               lnext( *searchtri, crosstri );
-               tspivot( crosstri, crossedge );
-               /* Check for a crossing segment. */
-               if ( crossedge.sh == dummysh ) {
-                       return 0;
-               }
-               else {
-                       org( *searchtri, endpoint1 );
-                       /* Insert a point at the intersection. */
-                       segmentintersection( &crosstri, &crossedge, endpoint2 );
-                       triedgecopy( crosstri, *searchtri );
-                       insertshelle( searchtri, newmark );
-                       /* Insert the remainder of the segment. */
-                       return scoutsegment( searchtri, endpoint2, newmark );
-               }
-       }
+struct triedge crosstri;
+struct edge crossedge;
+point leftpoint, rightpoint;
+point endpoint1;
+enum finddirectionresult collinear;
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+collinear = finddirection( searchtri, endpoint2 );
+dest( *searchtri, rightpoint );
+apex( *searchtri, leftpoint );
+if ((( leftpoint[0] == endpoint2[0] ) && ( leftpoint[1] == endpoint2[1] )) ||
+(( rightpoint[0] == endpoint2[0] ) && ( rightpoint[1] == endpoint2[1] ))) {
+/* The segment is already an edge in the mesh. */
+if (( leftpoint[0] == endpoint2[0] ) && ( leftpoint[1] == endpoint2[1] )) {
+lprevself( *searchtri );
+}
+/* Insert a shell edge, if there isn't already one there. */
+insertshelle( searchtri, newmark );
+return 1;
+}
+else if ( collinear == LEFTCOLLINEAR ) {
+/* We've collided with a point between the segment's endpoints. */
+/* Make the collinear point be the triangle's origin. */
+lprevself( *searchtri );
+insertshelle( searchtri, newmark );
+/* Insert the remainder of the segment. */
+return scoutsegment( searchtri, endpoint2, newmark );
+}
+else if ( collinear == RIGHTCOLLINEAR ) {
+/* We've collided with a point between the segment's endpoints. */
+insertshelle( searchtri, newmark );
+/* Make the collinear point be the triangle's origin. */
+lnextself( *searchtri );
+/* Insert the remainder of the segment. */
+return scoutsegment( searchtri, endpoint2, newmark );
+}
+else {
+lnext( *searchtri, crosstri );
+tspivot( crosstri, crossedge );
+/* Check for a crossing segment. */
+if ( crossedge.sh == dummysh ) {
+return 0;
+}
+else {
+org( *searchtri, endpoint1 );
+/* Insert a point at the intersection. */
+segmentintersection( &crosstri, &crossedge, endpoint2 );
+triedgecopy( crosstri, *searchtri );
+insertshelle( searchtri, newmark );
+/* Insert the remainder of the segment. */
+return scoutsegment( searchtri, endpoint2, newmark );
+}
+}
 }
 
 /*****************************************************************************/
@@ -9540,91 +9741,93 @@ int newmark;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef REDUCED
-#ifndef CDT_ONLY
+#ifndef
+REDUCED
+#ifndef
+CDT_ONLY
 
 void conformingedge( endpoint1, endpoint2, newmark )
 point endpoint1;
 point endpoint2;
 int newmark;
 {
-       struct triedge searchtri1, searchtri2;
-       struct edge brokenshelle;
-       point newpoint;
-       point midpoint1, midpoint2;
-       enum insertsiteresult success;
-       int result1, result2;
-       int i;
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       if ( verbose > 2 ) {
-               printf( "Forcing segment into triangulation by recursive splitting:\n" );
-               printf( "  (%.12g, %.12g) (%.12g, %.12g)\n", endpoint1[0], endpoint1[1],
-                               endpoint2[0], endpoint2[1] );
-       }
-       /* Create a new point to insert in the middle of the segment. */
-       newpoint = (point) poolalloc( &points );
-       /* Interpolate coordinates and attributes. */
-       for ( i = 0; i < 2 + nextras; i++ ) {
-               newpoint[i] = 0.5 * ( endpoint1[i] + endpoint2[i] );
-       }
-       setpointmark( newpoint, newmark );
-       /* Find a boundary triangle to search from. */
-       searchtri1.tri = (triangle *) NULL;
-       /* Attempt to insert the new point. */
-       success = insertsite( newpoint, &searchtri1, (struct edge *) NULL, 0, 0 );
-       if ( success == DUPLICATEPOINT ) {
-               if ( verbose > 2 ) {
-                       printf( "  Segment intersects existing point (%.12g, %.12g).\n",
-                                       newpoint[0], newpoint[1] );
-               }
-               /* Use the point that's already there. */
-               pointdealloc( newpoint );
-               org( searchtri1, newpoint );
-       }
-       else {
-               if ( success == VIOLATINGPOINT ) {
-                       if ( verbose > 2 ) {
-                               printf( "  Two segments intersect at (%.12g, %.12g).\n",
-                                               newpoint[0], newpoint[1] );
-                       }
-                       /* By fluke, we've landed right on another segment.  Split it. */
-                       tspivot( searchtri1, brokenshelle );
-                       success = insertsite( newpoint, &searchtri1, &brokenshelle, 0, 0 );
-                       if ( success != SUCCESSFULPOINT ) {
-                               printf( "Internal error in conformingedge():\n" );
-                               printf( "  Failure to split a segment.\n" );
-                               internalerror();
-                       }
-               }
-               /* The point has been inserted successfully. */
-               if ( steinerleft > 0 ) {
-                       steinerleft--;
-               }
-       }
-       triedgecopy( searchtri1, searchtri2 );
-       result1 = scoutsegment( &searchtri1, endpoint1, newmark );
-       result2 = scoutsegment( &searchtri2, endpoint2, newmark );
-       if ( !result1 ) {
-               /* The origin of searchtri1 may have changed if a collision with an */
-               /*   intervening vertex on the segment occurred.                    */
-               org( searchtri1, midpoint1 );
-               conformingedge( midpoint1, endpoint1, newmark );
-       }
-       if ( !result2 ) {
-               /* The origin of searchtri2 may have changed if a collision with an */
-               /*   intervening vertex on the segment occurred.                    */
-               org( searchtri2, midpoint2 );
-               conformingedge( midpoint2, endpoint2, newmark );
-       }
+struct triedge searchtri1, searchtri2;
+struct edge brokenshelle;
+point newpoint;
+point midpoint1, midpoint2;
+enum insertsiteresult success;
+int result1, result2;
+int i;
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+if ( verbose > 2 ) {
+printf( "Forcing segment into triangulation by recursive splitting:\n" );
+printf( "  (%.12g, %.12g) (%.12g, %.12g)\n", endpoint1[0], endpoint1[1],
+endpoint2[0], endpoint2[1] );
 }
-
-#endif /* not CDT_ONLY */
-#endif /* not REDUCED */
-
-/*****************************************************************************/
-/*                                                                           */
-/*  delaunayfixup()   Enforce the Delaunay condition at an edge, fanning out */
+/* Create a new point to insert in the middle of the segment. */
+newpoint = (point) poolalloc( &points );
+/* Interpolate coordinates and attributes. */
+for ( i = 0; i < 2 + nextras; i++ ) {
+newpoint[i] = 0.5 * ( endpoint1[i] + endpoint2[i] );
+}
+setpointmark( newpoint, newmark );
+/* Find a boundary triangle to search from. */
+searchtri1.tri = (triangle *) NULL;
+/* Attempt to insert the new point. */
+success = insertsite( newpoint, &searchtri1, (struct edge *) NULL, 0, 0 );
+if ( success == DUPLICATEPOINT ) {
+if ( verbose > 2 ) {
+printf( "  Segment intersects existing point (%.12g, %.12g).\n",
+newpoint[0], newpoint[1] );
+}
+/* Use the point that's already there. */
+pointdealloc( newpoint );
+org( searchtri1, newpoint );
+}
+else {
+if ( success == VIOLATINGPOINT ) {
+if ( verbose > 2 ) {
+printf( "  Two segments intersect at (%.12g, %.12g).\n",
+newpoint[0], newpoint[1] );
+}
+/* By fluke, we've landed right on another segment.  Split it. */
+tspivot( searchtri1, brokenshelle );
+success = insertsite( newpoint, &searchtri1, &brokenshelle, 0, 0 );
+if ( success != SUCCESSFULPOINT ) {
+printf( "Internal error in conformingedge():\n" );
+printf( "  Failure to split a segment.\n" );
+internalerror();
+}
+}
+/* The point has been inserted successfully. */
+if ( steinerleft > 0 ) {
+steinerleft--;
+}
+}
+triedgecopy( searchtri1, searchtri2 );
+result1 = scoutsegment( &searchtri1, endpoint1, newmark );
+result2 = scoutsegment( &searchtri2, endpoint2, newmark );
+if ( !result1 ) {
+/* The origin of searchtri1 may have changed if a collision with an */
+/*   intervening vertex on the segment occurred.                    */
+org( searchtri1, midpoint1 );
+conformingedge( midpoint1, endpoint1, newmark );
+}
+if ( !result2 ) {
+/* The origin of searchtri2 may have changed if a collision with an */
+/*   intervening vertex on the segment occurred.                    */
+org( searchtri2, midpoint2 );
+conformingedge( midpoint2, endpoint2, newmark );
+}
+}
+
+#endif /* not CDT_ONLY */
+#endif /* not REDUCED */
+
+/*****************************************************************************/
+/*                                                                           */
+/*  delaunayfixup()   Enforce the Delaunay condition at an edge, fanning out */
 /*                    recursively from an existing point.  Pay special       */
 /*                    attention to stacking inverted triangles.              */
 /*                                                                           */
@@ -9664,58 +9867,58 @@ void delaunayfixup( fixuptri, leftside )
 struct triedge *fixuptri;
 int leftside;
 {
-       struct triedge neartri;
-       struct triedge fartri;
-       struct edge faredge;
-       point nearpoint, leftpoint, rightpoint, farpoint;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       lnext( *fixuptri, neartri );
-       sym( neartri, fartri );
-       /* Check if the edge opposite the origin of fixuptri can be flipped. */
-       if ( fartri.tri == dummytri ) {
-               return;
-       }
-       tspivot( neartri, faredge );
-       if ( faredge.sh != dummysh ) {
-               return;
-       }
-       /* Find all the relevant vertices. */
-       apex( neartri, nearpoint );
-       org( neartri, leftpoint );
-       dest( neartri, rightpoint );
-       apex( fartri, farpoint );
-       /* Check whether the previous polygon vertex is a reflex vertex. */
-       if ( leftside ) {
-               if ( counterclockwise( nearpoint, leftpoint, farpoint ) <= 0.0 ) {
-                       /* leftpoint is a reflex vertex too.  Nothing can */
-                       /*   be done until a convex section is found.     */
-                       return;
-               }
-       }
-       else {
-               if ( counterclockwise( farpoint, rightpoint, nearpoint ) <= 0.0 ) {
-                       /* rightpoint is a reflex vertex too.  Nothing can */
-                       /*   be done until a convex section is found.      */
-                       return;
-               }
-       }
-       if ( counterclockwise( rightpoint, leftpoint, farpoint ) > 0.0 ) {
-               /* fartri is not an inverted triangle, and farpoint is not a reflex */
-               /*   vertex.  As there are no reflex vertices, fixuptri isn't an    */
-               /*   inverted triangle, either.  Hence, test the edge between the   */
-               /*   triangles to ensure it is locally Delaunay.                    */
-               if ( incircle( leftpoint, farpoint, rightpoint, nearpoint ) <= 0.0 ) {
-                       return;
-               }
-               /* Not locally Delaunay; go on to an edge flip. */
-       }      /* else fartri is inverted; remove it from the stack by flipping. */
-       flip( &neartri );
-       lprevself( *fixuptri ); /* Restore the origin of fixuptri after the flip. */
-       /* Recursively process the two triangles that result from the flip. */
-       delaunayfixup( fixuptri, leftside );
-       delaunayfixup( &fartri, leftside );
+struct triedge neartri;
+struct triedge fartri;
+struct edge faredge;
+point nearpoint, leftpoint, rightpoint, farpoint;
+triangle ptr;                       /* Temporary variable used by sym(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+lnext( *fixuptri, neartri );
+sym( neartri, fartri );
+/* Check if the edge opposite the origin of fixuptri can be flipped. */
+if ( fartri.tri == dummytri ) {
+return;
+}
+tspivot( neartri, faredge );
+if ( faredge.sh != dummysh ) {
+return;
+}
+/* Find all the relevant vertices. */
+apex( neartri, nearpoint );
+org( neartri, leftpoint );
+dest( neartri, rightpoint );
+apex( fartri, farpoint );
+/* Check whether the previous polygon vertex is a reflex vertex. */
+if ( leftside ) {
+if ( counterclockwise( nearpoint, leftpoint, farpoint ) <= 0.0 ) {
+/* leftpoint is a reflex vertex too.  Nothing can */
+/*   be done until a convex section is found.     */
+return;
+}
+}
+else {
+if ( counterclockwise( farpoint, rightpoint, nearpoint ) <= 0.0 ) {
+/* rightpoint is a reflex vertex too.  Nothing can */
+/*   be done until a convex section is found.      */
+return;
+}
+}
+if ( counterclockwise( rightpoint, leftpoint, farpoint ) > 0.0 ) {
+/* fartri is not an inverted triangle, and farpoint is not a reflex */
+/*   vertex.  As there are no reflex vertices, fixuptri isn't an    */
+/*   inverted triangle, either.  Hence, test the edge between the   */
+/*   triangles to ensure it is locally Delaunay.                    */
+if ( incircle( leftpoint, farpoint, rightpoint, nearpoint ) <= 0.0 ) {
+return;
+}
+/* Not locally Delaunay; go on to an edge flip. */
+}      /* else fartri is inverted; remove it from the stack by flipping. */
+flip( &neartri );
+lprevself( *fixuptri ); /* Restore the origin of fixuptri after the flip. */
+/* Recursively process the two triangles that result from the flip. */
+delaunayfixup( fixuptri, leftside );
+delaunayfixup( &fartri, leftside );
 }
 
 /*****************************************************************************/
@@ -9777,91 +9980,91 @@ struct triedge *starttri;
 point endpoint2;
 int newmark;
 {
-       struct triedge fixuptri, fixuptri2;
-       struct edge fixupedge;
-       point endpoint1;
-       point farpoint;
-       REAL area;
-       int collision;
-       int done;
-       triangle ptr;           /* Temporary variable used by sym() and oprev(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       org( *starttri, endpoint1 );
-       lnext( *starttri, fixuptri );
-       flip( &fixuptri );
-       /* `collision' indicates whether we have found a point directly */
-       /*   between endpoint1 and endpoint2.                           */
-       collision = 0;
-       done = 0;
-       do {
-               org( fixuptri, farpoint );
-               /* `farpoint' is the extreme point of the polygon we are "digging" */
-               /*   to get from endpoint1 to endpoint2.                           */
-               if ( ( farpoint[0] == endpoint2[0] ) && ( farpoint[1] == endpoint2[1] ) ) {
-                       oprev( fixuptri, fixuptri2 );
-                       /* Enforce the Delaunay condition around endpoint2. */
-                       delaunayfixup( &fixuptri, 0 );
-                       delaunayfixup( &fixuptri2, 1 );
-                       done = 1;
-               }
-               else {
-                       /* Check whether farpoint is to the left or right of the segment */
-                       /*   being inserted, to decide which edge of fixuptri to dig     */
-                       /*   through next.                                               */
-                       area = counterclockwise( endpoint1, endpoint2, farpoint );
-                       if ( area == 0.0 ) {
-                               /* We've collided with a point between endpoint1 and endpoint2. */
-                               collision = 1;
-                               oprev( fixuptri, fixuptri2 );
-                               /* Enforce the Delaunay condition around farpoint. */
-                               delaunayfixup( &fixuptri, 0 );
-                               delaunayfixup( &fixuptri2, 1 );
-                               done = 1;
-                       }
-                       else {
-                               if ( area > 0.0 ) { /* farpoint is to the left of the segment. */
-                                       oprev( fixuptri, fixuptri2 );
-                                       /* Enforce the Delaunay condition around farpoint, on the */
-                                       /*   left side of the segment only.                       */
-                                       delaunayfixup( &fixuptri2, 1 );
-                                       /* Flip the edge that crosses the segment.  After the edge is */
-                                       /*   flipped, one of its endpoints is the fan vertex, and the */
-                                       /*   destination of fixuptri is the fan vertex.               */
-                                       lprevself( fixuptri );
-                               }
-                               else {           /* farpoint is to the right of the segment. */
-                                       delaunayfixup( &fixuptri, 0 );
-                                       /* Flip the edge that crosses the segment.  After the edge is */
-                                       /*   flipped, one of its endpoints is the fan vertex, and the */
-                                       /*   destination of fixuptri is the fan vertex.               */
-                                       oprevself( fixuptri );
-                               }
-                               /* Check for two intersecting segments. */
-                               tspivot( fixuptri, fixupedge );
-                               if ( fixupedge.sh == dummysh ) {
-                                       flip( &fixuptri ); /* May create an inverted triangle on the left. */
-                               }
-                               else {
-                                       /* We've collided with a segment between endpoint1 and endpoint2. */
-                                       collision = 1;
-                                       /* Insert a point at the intersection. */
-                                       segmentintersection( &fixuptri, &fixupedge, endpoint2 );
-                                       done = 1;
-                               }
-                       }
-               }
-       } while ( !done );
-       /* Insert a shell edge to make the segment permanent. */
-       insertshelle( &fixuptri, newmark );
-       /* If there was a collision with an interceding vertex, install another */
-       /*   segment connecting that vertex with endpoint2.                     */
-       if ( collision ) {
-               /* Insert the remainder of the segment. */
-               if ( !scoutsegment( &fixuptri, endpoint2, newmark ) ) {
-                       constrainededge( &fixuptri, endpoint2, newmark );
-               }
-       }
+struct triedge fixuptri, fixuptri2;
+struct edge fixupedge;
+point endpoint1;
+point farpoint;
+REAL area;
+int collision;
+int done;
+triangle ptr;           /* Temporary variable used by sym() and oprev(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+org( *starttri, endpoint1 );
+lnext( *starttri, fixuptri );
+flip( &fixuptri );
+/* `collision' indicates whether we have found a point directly */
+/*   between endpoint1 and endpoint2.                           */
+collision = 0;
+done = 0;
+do {
+org( fixuptri, farpoint );
+/* `farpoint' is the extreme point of the polygon we are "digging" */
+/*   to get from endpoint1 to endpoint2.                           */
+if (( farpoint[0] == endpoint2[0] ) && ( farpoint[1] == endpoint2[1] )) {
+oprev( fixuptri, fixuptri2 );
+/* Enforce the Delaunay condition around endpoint2. */
+delaunayfixup( &fixuptri, 0 );
+delaunayfixup( &fixuptri2, 1 );
+done = 1;
+}
+else {
+/* Check whether farpoint is to the left or right of the segment */
+/*   being inserted, to decide which edge of fixuptri to dig     */
+/*   through next.                                               */
+area = counterclockwise( endpoint1, endpoint2, farpoint );
+if ( area == 0.0 ) {
+/* We've collided with a point between endpoint1 and endpoint2. */
+collision = 1;
+oprev( fixuptri, fixuptri2 );
+/* Enforce the Delaunay condition around farpoint. */
+delaunayfixup( &fixuptri, 0 );
+delaunayfixup( &fixuptri2, 1 );
+done = 1;
+}
+else {
+if ( area > 0.0 ) { /* farpoint is to the left of the segment. */
+oprev( fixuptri, fixuptri2 );
+/* Enforce the Delaunay condition around farpoint, on the */
+/*   left side of the segment only.                       */
+delaunayfixup( &fixuptri2, 1 );
+/* Flip the edge that crosses the segment.  After the edge is */
+/*   flipped, one of its endpoints is the fan vertex, and the */
+/*   destination of fixuptri is the fan vertex.               */
+lprevself( fixuptri );
+}
+else {           /* farpoint is to the right of the segment. */
+delaunayfixup( &fixuptri, 0 );
+/* Flip the edge that crosses the segment.  After the edge is */
+/*   flipped, one of its endpoints is the fan vertex, and the */
+/*   destination of fixuptri is the fan vertex.               */
+oprevself( fixuptri );
+}
+/* Check for two intersecting segments. */
+tspivot( fixuptri, fixupedge );
+if ( fixupedge.sh == dummysh ) {
+flip( &fixuptri ); /* May create an inverted triangle on the left. */
+}
+else {
+/* We've collided with a segment between endpoint1 and endpoint2. */
+collision = 1;
+/* Insert a point at the intersection. */
+segmentintersection( &fixuptri, &fixupedge, endpoint2 );
+done = 1;
+}
+}
+}
+} while ( !done );
+/* Insert a shell edge to make the segment permanent. */
+insertshelle( &fixuptri, newmark );
+/* If there was a collision with an interceding vertex, install another */
+/*   segment connecting that vertex with endpoint2.                     */
+if ( collision ) {
+/* Insert the remainder of the segment. */
+if ( !scoutsegment( &fixuptri, endpoint2, newmark )) {
+constrainededge( &fixuptri, endpoint2, newmark );
+}
+}
 }
 
 /*****************************************************************************/
@@ -9875,95 +10078,99 @@ point endpoint1;
 point endpoint2;
 int newmark;
 {
-       struct triedge searchtri1, searchtri2;
-       triangle encodedtri;
-       point checkpoint;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-       if ( verbose > 1 ) {
-               printf( "  Connecting (%.12g, %.12g) to (%.12g, %.12g).\n",
-                               endpoint1[0], endpoint1[1], endpoint2[0], endpoint2[1] );
-       }
-
-       /* Find a triangle whose origin is the segment's first endpoint. */
-       checkpoint = (point) NULL;
-       encodedtri = point2tri( endpoint1 );
-       if ( encodedtri != (triangle) NULL ) {
-               decode( encodedtri, searchtri1 );
-               org( searchtri1, checkpoint );
-       }
-       if ( checkpoint != endpoint1 ) {
-               /* Find a boundary triangle to search from. */
-               searchtri1.tri = dummytri;
-               searchtri1.orient = 0;
-               symself( searchtri1 );
-               /* Search for the segment's first endpoint by point location. */
-               if ( locate( endpoint1, &searchtri1 ) != ONVERTEX ) {
-                       printf(
-                               "Internal error in insertsegment():  Unable to locate PSLG point\n" );
-                       printf( "  (%.12g, %.12g) in triangulation.\n",
-                                       endpoint1[0], endpoint1[1] );
-                       internalerror();
-               }
-       }
-       /* Remember this triangle to improve subsequent point location. */
-       triedgecopy( searchtri1, recenttri );
-       /* Scout the beginnings of a path from the first endpoint */
-       /*   toward the second.                                   */
-       if ( scoutsegment( &searchtri1, endpoint2, newmark ) ) {
-               /* The segment was easily inserted. */
-               return;
-       }
-       /* The first endpoint may have changed if a collision with an intervening */
-       /*   vertex on the segment occurred.                                      */
-       org( searchtri1, endpoint1 );
-
-       /* Find a triangle whose origin is the segment's second endpoint. */
-       checkpoint = (point) NULL;
-       encodedtri = point2tri( endpoint2 );
-       if ( encodedtri != (triangle) NULL ) {
-               decode( encodedtri, searchtri2 );
-               org( searchtri2, checkpoint );
-       }
-       if ( checkpoint != endpoint2 ) {
-               /* Find a boundary triangle to search from. */
-               searchtri2.tri = dummytri;
-               searchtri2.orient = 0;
-               symself( searchtri2 );
-               /* Search for the segment's second endpoint by point location. */
-               if ( locate( endpoint2, &searchtri2 ) != ONVERTEX ) {
-                       printf(
-                               "Internal error in insertsegment():  Unable to locate PSLG point\n" );
-                       printf( "  (%.12g, %.12g) in triangulation.\n",
-                                       endpoint2[0], endpoint2[1] );
-                       internalerror();
-               }
-       }
-       /* Remember this triangle to improve subsequent point location. */
-       triedgecopy( searchtri2, recenttri );
-       /* Scout the beginnings of a path from the second endpoint */
-       /*   toward the first.                                     */
-       if ( scoutsegment( &searchtri2, endpoint1, newmark ) ) {
-               /* The segment was easily inserted. */
-               return;
-       }
-       /* The second endpoint may have changed if a collision with an intervening */
-       /*   vertex on the segment occurred.                                       */
-       org( searchtri2, endpoint2 );
-
-#ifndef REDUCED
-#ifndef CDT_ONLY
-       if ( splitseg ) {
-               /* Insert vertices to force the segment into the triangulation. */
-               conformingedge( endpoint1, endpoint2, newmark );
-       }
-       else {
+struct triedge searchtri1, searchtri2;
+triangle encodedtri;
+point checkpoint;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+if ( verbose > 1 ) {
+printf( "  Connecting (%.12g, %.12g) to (%.12g, %.12g).\n",
+endpoint1[0], endpoint1[1], endpoint2[0], endpoint2[1] );
+}
+
+/* Find a triangle whose origin is the segment's first endpoint. */
+checkpoint = (point) NULL;
+encodedtri = point2tri( endpoint1 );
+if ( encodedtri != (triangle) NULL ) {
+decode( encodedtri, searchtri1 );
+org( searchtri1, checkpoint );
+}
+if ( checkpoint != endpoint1 ) {
+/* Find a boundary triangle to search from. */
+searchtri1.tri = dummytri;
+searchtri1.orient = 0;
+symself( searchtri1 );
+/* Search for the segment's first endpoint by point location. */
+if ( locate( endpoint1, &searchtri1 ) != ONVERTEX ) {
+printf(
+"Internal error in insertsegment():  Unable to locate PSLG point\n" );
+printf( "  (%.12g, %.12g) in triangulation.\n",
+endpoint1[0], endpoint1[1] );
+internalerror();
+}
+}
+/* Remember this triangle to improve subsequent point location. */
+triedgecopy( searchtri1, recenttri );
+/* Scout the beginnings of a path from the first endpoint */
+/*   toward the second.                                   */
+if ( scoutsegment( &searchtri1, endpoint2, newmark )) {
+/* The segment was easily inserted. */
+return;
+}
+/* The first endpoint may have changed if a collision with an intervening */
+/*   vertex on the segment occurred.                                      */
+org( searchtri1, endpoint1 );
+
+/* Find a triangle whose origin is the segment's second endpoint. */
+checkpoint = (point) NULL;
+encodedtri = point2tri( endpoint2 );
+if ( encodedtri != (triangle) NULL ) {
+decode( encodedtri, searchtri2 );
+org( searchtri2, checkpoint );
+}
+if ( checkpoint != endpoint2 ) {
+/* Find a boundary triangle to search from. */
+searchtri2.tri = dummytri;
+searchtri2.orient = 0;
+symself( searchtri2 );
+/* Search for the segment's second endpoint by point location. */
+if ( locate( endpoint2, &searchtri2 ) != ONVERTEX ) {
+printf(
+"Internal error in insertsegment():  Unable to locate PSLG point\n" );
+printf( "  (%.12g, %.12g) in triangulation.\n",
+endpoint2[0], endpoint2[1] );
+internalerror();
+}
+}
+/* Remember this triangle to improve subsequent point location. */
+triedgecopy( searchtri2, recenttri );
+/* Scout the beginnings of a path from the second endpoint */
+/*   toward the first.                                     */
+if ( scoutsegment( &searchtri2, endpoint1, newmark )) {
+/* The segment was easily inserted. */
+return;
+}
+/* The second endpoint may have changed if a collision with an intervening */
+/*   vertex on the segment occurred.                                       */
+org( searchtri2, endpoint2 );
+
+#ifndef
+REDUCED
+#ifndef
+CDT_ONLY
+if ( splitseg ) {
+/* Insert vertices to force the segment into the triangulation. */
+conformingedge( endpoint1, endpoint2, newmark );
+}
+else {
 #endif /* not CDT_ONLY */
 #endif /* not REDUCED */
-          /* Insert the segment directly into the triangulation. */
-       constrainededge( &searchtri1, endpoint2, newmark );
-#ifndef REDUCED
-#ifndef CDT_ONLY
+/* Insert the segment directly into the triangulation. */
+constrainededge( &searchtri1, endpoint2, newmark );
+#ifndef
+REDUCED
+#ifndef
+CDT_ONLY
 }
 #endif /* not CDT_ONLY */
 #endif /* not REDUCED */
@@ -9976,29 +10183,29 @@ int newmark;
 /*****************************************************************************/
 
 void markhull(){
-       struct triedge hulltri;
-       struct triedge nexttri;
-       struct triedge starttri;
-       triangle ptr;           /* Temporary variable used by sym() and oprev(). */
-
-       /* Find a triangle handle on the hull. */
-       hulltri.tri = dummytri;
-       hulltri.orient = 0;
-       symself( hulltri );
-       /* Remember where we started so we know when to stop. */
-       triedgecopy( hulltri, starttri );
-       /* Go once counterclockwise around the convex hull. */
-       do {
-               /* Create a shell edge if there isn't already one here. */
-               insertshelle( &hulltri, 1 );
-               /* To find the next hull edge, go clockwise around the next vertex. */
-               lnextself( hulltri );
-               oprev( hulltri, nexttri );
-               while ( nexttri.tri != dummytri ) {
-                       triedgecopy( nexttri, hulltri );
-                       oprev( hulltri, nexttri );
-               }
-       } while ( !triedgeequal( hulltri, starttri ) );
+struct triedge hulltri;
+struct triedge nexttri;
+struct triedge starttri;
+triangle ptr;           /* Temporary variable used by sym() and oprev(). */
+
+/* Find a triangle handle on the hull. */
+hulltri.tri = dummytri;
+hulltri.orient = 0;
+symself( hulltri );
+/* Remember where we started so we know when to stop. */
+triedgecopy( hulltri, starttri );
+/* Go once counterclockwise around the convex hull. */
+do {
+/* Create a shell edge if there isn't already one here. */
+insertshelle( &hulltri, 1 );
+/* To find the next hull edge, go clockwise around the next vertex. */
+lnextself( hulltri );
+oprev( hulltri, nexttri );
+while ( nexttri.tri != dummytri ) {
+triedgecopy( nexttri, hulltri );
+oprev( hulltri, nexttri );
+}
+} while ( !triedgeequal( hulltri, starttri ));
 }
 
 /*****************************************************************************/
@@ -10011,7 +10218,8 @@ void markhull(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 int formskeleton( segmentlist, segmentmarkerlist, numberofsegments )
 int *segmentlist;
@@ -10027,128 +10235,131 @@ char *polyfilename;
 #endif /* not TRILIBRARY */
 
 {
-#ifdef TRILIBRARY
-       char polyfilename[6];
-       int index;
+#ifdef
+TRILIBRARY
+char polyfilename[6];
+int index;
 #else /* not TRILIBRARY */
-       char inputline[INPUTLINESIZE];
-       char *stringptr;
+char inputline[INPUTLINESIZE];
+char *stringptr;
 #endif /* not TRILIBRARY */
-       point endpoint1, endpoint2;
-       int segments;
-       int segmentmarkers;
-       int end1, end2;
-       int boundmarker;
-       int i;
-
-       if ( poly ) {
-               if ( !quiet ) {
-                       printf( "Inserting segments into Delaunay triangulation.\n" );
-               }
-#ifdef TRILIBRARY
-               strcpy( polyfilename, "input" );
-               segments = numberofsegments;
-               segmentmarkers = segmentmarkerlist != (int *) NULL;
-               index = 0;
+point endpoint1, endpoint2;
+int segments;
+int segmentmarkers;
+int end1, end2;
+int boundmarker;
+int i;
+
+if ( poly ) {
+if ( !quiet ) {
+printf( "Inserting segments into Delaunay triangulation.\n" );
+}
+#ifdef
+TRILIBRARY
+strcpy( polyfilename, "input" );
+segments = numberofsegments;
+segmentmarkers = segmentmarkerlist != (int *) NULL;
+index = 0;
 #else /* not TRILIBRARY */
-               /* Read the segments from a .poly file. */
-               /* Read number of segments and number of boundary markers. */
-               stringptr = readline( inputline, polyfile, polyfilename );
-               segments = (int) strtol( stringptr, &stringptr, 0 );
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       segmentmarkers = 0;
-               }
-               else {
-                       segmentmarkers = (int) strtol( stringptr, &stringptr, 0 );
-               }
+/* Read the segments from a .poly file. */
+/* Read number of segments and number of boundary markers. */
+stringptr = readline( inputline, polyfile, polyfilename );
+segments = (int) strtol( stringptr, &stringptr, 0 );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+segmentmarkers = 0;
+}
+else {
+segmentmarkers = (int) strtol( stringptr, &stringptr, 0 );
+}
 #endif /* not TRILIBRARY */
-               /* If segments are to be inserted, compute a mapping */
-               /*   from points to triangles.                       */
-               if ( segments > 0 ) {
-                       if ( verbose ) {
-                               printf( "  Inserting PSLG segments.\n" );
-                       }
-                       makepointmap();
-               }
-
-               boundmarker = 0;
-               /* Read and insert the segments. */
-               for ( i = 1; i <= segments; i++ ) {
-#ifdef TRILIBRARY
-                       end1 = segmentlist[index++];
-                       end2 = segmentlist[index++];
-                       if ( segmentmarkers ) {
-                               boundmarker = segmentmarkerlist[i - 1];
-                       }
+/* If segments are to be inserted, compute a mapping */
+/*   from points to triangles.                       */
+if ( segments > 0 ) {
+if ( verbose ) {
+printf( "  Inserting PSLG segments.\n" );
+}
+makepointmap();
+}
+
+boundmarker = 0;
+/* Read and insert the segments. */
+for ( i = 1; i <= segments; i++ ) {
+#ifdef
+TRILIBRARY
+end1 = segmentlist[index++];
+end2 = segmentlist[index++];
+if ( segmentmarkers ) {
+boundmarker = segmentmarkerlist[i - 1];
+}
 #else /* not TRILIBRARY */
-                       stringptr = readline( inputline, polyfile, inpolyfilename );
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               printf( "Error:  Segment %d has no endpoints in %s.\n", i,
-                                               polyfilename );
-                               exit( 1 );
-                       }
-                       else {
-                               end1 = (int) strtol( stringptr, &stringptr, 0 );
-                       }
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               printf( "Error:  Segment %d is missing its second endpoint in %s.\n", i,
-                                               polyfilename );
-                               exit( 1 );
-                       }
-                       else {
-                               end2 = (int) strtol( stringptr, &stringptr, 0 );
-                       }
-                       if ( segmentmarkers ) {
-                               stringptr = findfield( stringptr );
-                               if ( *stringptr == '\0' ) {
-                                       boundmarker = 0;
-                               }
-                               else {
-                                       boundmarker = (int) strtol( stringptr, &stringptr, 0 );
-                               }
-                       }
+stringptr = readline( inputline, polyfile, inpolyfilename );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Segment %d has no endpoints in %s.\n", i,
+polyfilename );
+exit( 1 );
+}
+else {
+end1 = (int) strtol( stringptr, &stringptr, 0 );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Segment %d is missing its second endpoint in %s.\n", i,
+polyfilename );
+exit( 1 );
+}
+else {
+end2 = (int) strtol( stringptr, &stringptr, 0 );
+}
+if ( segmentmarkers ) {
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+boundmarker = 0;
+}
+else {
+boundmarker = (int) strtol( stringptr, &stringptr, 0 );
+}
+}
 #endif /* not TRILIBRARY */
-                       if ( ( end1 < firstnumber ) || ( end1 >= firstnumber + inpoints ) ) {
-                               if ( !quiet ) {
-                                       printf( "Warning:  Invalid first endpoint of segment %d in %s.\n", i,
-                                                       polyfilename );
-                               }
-                       }
-                       else if ( ( end2 < firstnumber ) || ( end2 >= firstnumber + inpoints ) ) {
-                               if ( !quiet ) {
-                                       printf( "Warning:  Invalid second endpoint of segment %d in %s.\n", i,
-                                                       polyfilename );
-                               }
-                       }
-                       else {
-                               endpoint1 = getpoint( end1 );
-                               endpoint2 = getpoint( end2 );
-                               if ( ( endpoint1[0] == endpoint2[0] ) && ( endpoint1[1] == endpoint2[1] ) ) {
-                                       if ( !quiet ) {
-                                               printf( "Warning:  Endpoints of segment %d are coincident in %s.\n",
-                                                               i, polyfilename );
-                                       }
-                               }
-                               else {
-                                       insertsegment( endpoint1, endpoint2, boundmarker );
-                               }
-                       }
-               }
-       }
-       else {
-               segments = 0;
-       }
-       if ( convex || !poly ) {
-               /* Enclose the convex hull with shell edges. */
-               if ( verbose ) {
-                       printf( "  Enclosing convex hull with segments.\n" );
-               }
-               markhull();
-       }
-       return segments;
+if (( end1 < firstnumber ) || ( end1 >= firstnumber + inpoints )) {
+if ( !quiet ) {
+printf( "Warning:  Invalid first endpoint of segment %d in %s.\n", i,
+polyfilename );
+}
+}
+else if (( end2 < firstnumber ) || ( end2 >= firstnumber + inpoints )) {
+if ( !quiet ) {
+printf( "Warning:  Invalid second endpoint of segment %d in %s.\n", i,
+polyfilename );
+}
+}
+else {
+endpoint1 = getpoint( end1 );
+endpoint2 = getpoint( end2 );
+if (( endpoint1[0] == endpoint2[0] ) && ( endpoint1[1] == endpoint2[1] )) {
+if ( !quiet ) {
+printf( "Warning:  Endpoints of segment %d are coincident in %s.\n",
+i, polyfilename );
+}
+}
+else {
+insertsegment( endpoint1, endpoint2, boundmarker );
+}
+}
+}
+}
+else {
+segments = 0;
+}
+if ( convex || !poly ) {
+/* Enclose the convex hull with shell edges. */
+if ( verbose ) {
+printf( "  Enclosing convex hull with segments.\n" );
+}
+markhull();
+}
+return segments;
 }
 
 /**                                                                         **/
@@ -10168,59 +10379,59 @@ char *polyfilename;
 /*****************************************************************************/
 
 void infecthull(){
-       struct triedge hulltri;
-       struct triedge nexttri;
-       struct triedge starttri;
-       struct edge hulledge;
-       triangle **deadtri;
-       point horg, hdest;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       if ( verbose ) {
-               printf( "  Marking concavities (external triangles) for elimination.\n" );
-       }
-       /* Find a triangle handle on the hull. */
-       hulltri.tri = dummytri;
-       hulltri.orient = 0;
-       symself( hulltri );
-       /* Remember where we started so we know when to stop. */
-       triedgecopy( hulltri, starttri );
-       /* Go once counterclockwise around the convex hull. */
-       do {
-               /* Ignore triangles that are already infected. */
-               if ( !infected( hulltri ) ) {
-                       /* Is the triangle protected by a shell edge? */
-                       tspivot( hulltri, hulledge );
-                       if ( hulledge.sh == dummysh ) {
-                               /* The triangle is not protected; infect it. */
-                               infect( hulltri );
-                               deadtri = (triangle **) poolalloc( &viri );
-                               *deadtri = hulltri.tri;
-                       }
-                       else {
-                               /* The triangle is protected; set boundary markers if appropriate. */
-                               if ( mark( hulledge ) == 0 ) {
-                                       setmark( hulledge, 1 );
-                                       org( hulltri, horg );
-                                       dest( hulltri, hdest );
-                                       if ( pointmark( horg ) == 0 ) {
-                                               setpointmark( horg, 1 );
-                                       }
-                                       if ( pointmark( hdest ) == 0 ) {
-                                               setpointmark( hdest, 1 );
-                                       }
-                               }
-                       }
-               }
-               /* To find the next hull edge, go clockwise around the next vertex. */
-               lnextself( hulltri );
-               oprev( hulltri, nexttri );
-               while ( nexttri.tri != dummytri ) {
-                       triedgecopy( nexttri, hulltri );
-                       oprev( hulltri, nexttri );
-               }
-       } while ( !triedgeequal( hulltri, starttri ) );
+struct triedge hulltri;
+struct triedge nexttri;
+struct triedge starttri;
+struct edge hulledge;
+triangle **deadtri;
+point horg, hdest;
+triangle ptr;                       /* Temporary variable used by sym(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+if ( verbose ) {
+printf( "  Marking concavities (external triangles) for elimination.\n" );
+}
+/* Find a triangle handle on the hull. */
+hulltri.tri = dummytri;
+hulltri.orient = 0;
+symself( hulltri );
+/* Remember where we started so we know when to stop. */
+triedgecopy( hulltri, starttri );
+/* Go once counterclockwise around the convex hull. */
+do {
+/* Ignore triangles that are already infected. */
+if ( !infected( hulltri )) {
+/* Is the triangle protected by a shell edge? */
+tspivot( hulltri, hulledge );
+if ( hulledge.sh == dummysh ) {
+/* The triangle is not protected; infect it. */
+infect( hulltri );
+deadtri = (triangle **) poolalloc( &viri );
+*deadtri = hulltri.tri;
+}
+else {
+/* The triangle is protected; set boundary markers if appropriate. */
+if ( mark( hulledge ) == 0 ) {
+setmark( hulledge, 1 );
+org( hulltri, horg );
+dest( hulltri, hdest );
+if ( pointmark( horg ) == 0 ) {
+setpointmark( horg, 1 );
+}
+if ( pointmark( hdest ) == 0 ) {
+setpointmark( hdest, 1 );
+}
+}
+}
+}
+/* To find the next hull edge, go clockwise around the next vertex. */
+lnextself( hulltri );
+oprev( hulltri, nexttri );
+while ( nexttri.tri != dummytri ) {
+triedgecopy( nexttri, hulltri );
+oprev( hulltri, nexttri );
+}
+} while ( !triedgeequal( hulltri, starttri ));
 }
 
 /*****************************************************************************/
@@ -10241,193 +10452,193 @@ void infecthull(){
 /*****************************************************************************/
 
 void plague(){
-       struct triedge testtri;
-       struct triedge neighbor;
-       triangle **virusloop;
-       triangle **deadtri;
-       struct edge neighborshelle;
-       point testpoint;
-       point norg, ndest;
-       point deadorg, deaddest, deadapex;
-       int killorg;
-       triangle ptr;           /* Temporary variable used by sym() and onext(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       if ( verbose ) {
-               printf( "  Marking neighbors of marked triangles.\n" );
-       }
-       /* Loop through all the infected triangles, spreading the virus to */
-       /*   their neighbors, then to their neighbors' neighbors.          */
-       traversalinit( &viri );
-       virusloop = (triangle **) traverse( &viri );
-       while ( virusloop != (triangle **) NULL ) {
-               testtri.tri = *virusloop;
-               /* A triangle is marked as infected by messing with one of its shell */
-               /*   edges, setting it to an illegal value.  Hence, we have to       */
-               /*   temporarily uninfect this triangle so that we can examine its   */
-               /*   adjacent shell edges.                                           */
-               uninfect( testtri );
-               if ( verbose > 2 ) {
-                       /* Assign the triangle an orientation for convenience in */
-                       /*   checking its points.                                */
-                       testtri.orient = 0;
-                       org( testtri, deadorg );
-                       dest( testtri, deaddest );
-                       apex( testtri, deadapex );
-                       printf( "    Checking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
-                                       deadorg[0], deadorg[1], deaddest[0], deaddest[1],
-                                       deadapex[0], deadapex[1] );
-               }
-               /* Check each of the triangle's three neighbors. */
-               for ( testtri.orient = 0; testtri.orient < 3; testtri.orient++ ) {
-                       /* Find the neighbor. */
-                       sym( testtri, neighbor );
-                       /* Check for a shell between the triangle and its neighbor. */
-                       tspivot( testtri, neighborshelle );
-                       /* Check if the neighbor is nonexistent or already infected. */
-                       if ( ( neighbor.tri == dummytri ) || infected( neighbor ) ) {
-                               if ( neighborshelle.sh != dummysh ) {
-                                       /* There is a shell edge separating the triangle from its */
-                                       /*   neighbor, but both triangles are dying, so the shell */
-                                       /*   edge dies too.                                       */
-                                       shelledealloc( neighborshelle.sh );
-                                       if ( neighbor.tri != dummytri ) {
-                                               /* Make sure the shell edge doesn't get deallocated again */
-                                               /*   later when the infected neighbor is visited.         */
-                                               uninfect( neighbor );
-                                               tsdissolve( neighbor );
-                                               infect( neighbor );
-                                       }
-                               }
-                       }
-                       else {               /* The neighbor exists and is not infected. */
-                               if ( neighborshelle.sh == dummysh ) {
-                                       /* There is no shell edge protecting the neighbor, so */
-                                       /*   the neighbor becomes infected.                   */
-                                       if ( verbose > 2 ) {
-                                               org( neighbor, deadorg );
-                                               dest( neighbor, deaddest );
-                                               apex( neighbor, deadapex );
-                                               printf(
-                                                       "    Marking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
-                                                       deadorg[0], deadorg[1], deaddest[0], deaddest[1],
-                                                       deadapex[0], deadapex[1] );
-                                       }
-                                       infect( neighbor );
-                                       /* Ensure that the neighbor's neighbors will be infected. */
-                                       deadtri = (triangle **) poolalloc( &viri );
-                                       *deadtri = neighbor.tri;
-                               }
-                               else {         /* The neighbor is protected by a shell edge. */
-                                       /* Remove this triangle from the shell edge. */
-                                       stdissolve( neighborshelle );
-                                       /* The shell edge becomes a boundary.  Set markers accordingly. */
-                                       if ( mark( neighborshelle ) == 0 ) {
-                                               setmark( neighborshelle, 1 );
-                                       }
-                                       org( neighbor, norg );
-                                       dest( neighbor, ndest );
-                                       if ( pointmark( norg ) == 0 ) {
-                                               setpointmark( norg, 1 );
-                                       }
-                                       if ( pointmark( ndest ) == 0 ) {
-                                               setpointmark( ndest, 1 );
-                                       }
-                               }
-                       }
-               }
-               /* Remark the triangle as infected, so it doesn't get added to the */
-               /*   virus pool again.                                             */
-               infect( testtri );
-               virusloop = (triangle **) traverse( &viri );
-       }
-
-       if ( verbose ) {
-               printf( "  Deleting marked triangles.\n" );
-       }
-       traversalinit( &viri );
-       virusloop = (triangle **) traverse( &viri );
-       while ( virusloop != (triangle **) NULL ) {
-               testtri.tri = *virusloop;
-
-               /* Check each of the three corners of the triangle for elimination. */
-               /*   This is done by walking around each point, checking if it is   */
-               /*   still connected to at least one live triangle.                 */
-               for ( testtri.orient = 0; testtri.orient < 3; testtri.orient++ ) {
-                       org( testtri, testpoint );
-                       /* Check if the point has already been tested. */
-                       if ( testpoint != (point) NULL ) {
-                               killorg = 1;
-                               /* Mark the corner of the triangle as having been tested. */
-                               setorg( testtri, NULL );
-                               /* Walk counterclockwise about the point. */
-                               onext( testtri, neighbor );
-                               /* Stop upon reaching a boundary or the starting triangle. */
-                               while ( ( neighbor.tri != dummytri )
-                                               && ( !triedgeequal( neighbor, testtri ) ) ) {
-                                       if ( infected( neighbor ) ) {
-                                               /* Mark the corner of this triangle as having been tested. */
-                                               setorg( neighbor, NULL );
-                                       }
-                                       else {
-                                               /* A live triangle.  The point survives. */
-                                               killorg = 0;
-                                       }
-                                       /* Walk counterclockwise about the point. */
-                                       onextself( neighbor );
-                               }
-                               /* If we reached a boundary, we must walk clockwise as well. */
-                               if ( neighbor.tri == dummytri ) {
-                                       /* Walk clockwise about the point. */
-                                       oprev( testtri, neighbor );
-                                       /* Stop upon reaching a boundary. */
-                                       while ( neighbor.tri != dummytri ) {
-                                               if ( infected( neighbor ) ) {
-                                                       /* Mark the corner of this triangle as having been tested. */
-                                                       setorg( neighbor, NULL );
-                                               }
-                                               else {
-                                                       /* A live triangle.  The point survives. */
-                                                       killorg = 0;
-                                               }
-                                               /* Walk clockwise about the point. */
-                                               oprevself( neighbor );
-                                       }
-                               }
-                               if ( killorg ) {
-                                       if ( verbose > 1 ) {
-                                               printf( "    Deleting point (%.12g, %.12g)\n",
-                                                               testpoint[0], testpoint[1] );
-                                       }
-                                       pointdealloc( testpoint );
-                               }
-                       }
-               }
-
-               /* Record changes in the number of boundary edges, and disconnect */
-               /*   dead triangles from their neighbors.                         */
-               for ( testtri.orient = 0; testtri.orient < 3; testtri.orient++ ) {
-                       sym( testtri, neighbor );
-                       if ( neighbor.tri == dummytri ) {
-                               /* There is no neighboring triangle on this edge, so this edge    */
-                               /*   is a boundary edge.  This triangle is being deleted, so this */
-                               /*   boundary edge is deleted.                                    */
-                               hullsize--;
-                       }
-                       else {
-                               /* Disconnect the triangle from its neighbor. */
-                               dissolve( neighbor );
-                               /* There is a neighboring triangle on this edge, so this edge */
-                               /*   becomes a boundary edge when this triangle is deleted.   */
-                               hullsize++;
-                       }
-               }
-               /* Return the dead triangle to the pool of triangles. */
-               triangledealloc( testtri.tri );
-               virusloop = (triangle **) traverse( &viri );
-       }
-       /* Empty the virus pool. */
-       poolrestart( &viri );
+struct triedge testtri;
+struct triedge neighbor;
+triangle **virusloop;
+triangle **deadtri;
+struct edge neighborshelle;
+point testpoint;
+point norg, ndest;
+point deadorg, deaddest, deadapex;
+int killorg;
+triangle ptr;           /* Temporary variable used by sym() and onext(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+if ( verbose ) {
+printf( "  Marking neighbors of marked triangles.\n" );
+}
+/* Loop through all the infected triangles, spreading the virus to */
+/*   their neighbors, then to their neighbors' neighbors.          */
+traversalinit( &viri );
+virusloop = (triangle **) traverse( &viri );
+while ( virusloop != (triangle **) NULL ) {
+testtri.tri = *virusloop;
+/* A triangle is marked as infected by messing with one of its shell */
+/*   edges, setting it to an illegal value.  Hence, we have to       */
+/*   temporarily uninfect this triangle so that we can examine its   */
+/*   adjacent shell edges.                                           */
+uninfect( testtri );
+if ( verbose > 2 ) {
+/* Assign the triangle an orientation for convenience in */
+/*   checking its points.                                */
+testtri.orient = 0;
+org( testtri, deadorg );
+dest( testtri, deaddest );
+apex( testtri, deadapex );
+printf( "    Checking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
+deadorg[0], deadorg[1], deaddest[0], deaddest[1],
+deadapex[0], deadapex[1] );
+}
+/* Check each of the triangle's three neighbors. */
+for ( testtri.orient = 0; testtri.orient < 3; testtri.orient++ ) {
+/* Find the neighbor. */
+sym( testtri, neighbor );
+/* Check for a shell between the triangle and its neighbor. */
+tspivot( testtri, neighborshelle );
+/* Check if the neighbor is nonexistent or already infected. */
+if (( neighbor.tri == dummytri ) || infected( neighbor )) {
+if ( neighborshelle.sh != dummysh ) {
+/* There is a shell edge separating the triangle from its */
+/*   neighbor, but both triangles are dying, so the shell */
+/*   edge dies too.                                       */
+shelledealloc( neighborshelle.sh );
+if ( neighbor.tri != dummytri ) {
+/* Make sure the shell edge doesn't get deallocated again */
+/*   later when the infected neighbor is visited.         */
+uninfect( neighbor );
+tsdissolve( neighbor );
+infect( neighbor );
+}
+}
+}
+else {               /* The neighbor exists and is not infected. */
+if ( neighborshelle.sh == dummysh ) {
+/* There is no shell edge protecting the neighbor, so */
+/*   the neighbor becomes infected.                   */
+if ( verbose > 2 ) {
+org( neighbor, deadorg );
+dest( neighbor, deaddest );
+apex( neighbor, deadapex );
+printf(
+"    Marking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
+deadorg[0], deadorg[1], deaddest[0], deaddest[1],
+deadapex[0], deadapex[1] );
+}
+infect( neighbor );
+/* Ensure that the neighbor's neighbors will be infected. */
+deadtri = (triangle **) poolalloc( &viri );
+*deadtri = neighbor.tri;
+}
+else {         /* The neighbor is protected by a shell edge. */
+/* Remove this triangle from the shell edge. */
+stdissolve( neighborshelle );
+/* The shell edge becomes a boundary.  Set markers accordingly. */
+if ( mark( neighborshelle ) == 0 ) {
+setmark( neighborshelle, 1 );
+}
+org( neighbor, norg );
+dest( neighbor, ndest );
+if ( pointmark( norg ) == 0 ) {
+setpointmark( norg, 1 );
+}
+if ( pointmark( ndest ) == 0 ) {
+setpointmark( ndest, 1 );
+}
+}
+}
+}
+/* Remark the triangle as infected, so it doesn't get added to the */
+/*   virus pool again.                                             */
+infect( testtri );
+virusloop = (triangle **) traverse( &viri );
+}
+
+if ( verbose ) {
+printf( "  Deleting marked triangles.\n" );
+}
+traversalinit( &viri );
+virusloop = (triangle **) traverse( &viri );
+while ( virusloop != (triangle **) NULL ) {
+testtri.tri = *virusloop;
+
+/* Check each of the three corners of the triangle for elimination. */
+/*   This is done by walking around each point, checking if it is   */
+/*   still connected to at least one live triangle.                 */
+for ( testtri.orient = 0; testtri.orient < 3; testtri.orient++ ) {
+org( testtri, testpoint );
+/* Check if the point has already been tested. */
+if ( testpoint != (point) NULL ) {
+killorg = 1;
+/* Mark the corner of the triangle as having been tested. */
+setorg( testtri, NULL );
+/* Walk counterclockwise about the point. */
+onext( testtri, neighbor );
+/* Stop upon reaching a boundary or the starting triangle. */
+while (( neighbor.tri != dummytri )
+&& ( !triedgeequal( neighbor, testtri ))) {
+if ( infected( neighbor )) {
+/* Mark the corner of this triangle as having been tested. */
+setorg( neighbor, NULL );
+}
+else {
+/* A live triangle.  The point survives. */
+killorg = 0;
+}
+/* Walk counterclockwise about the point. */
+onextself( neighbor );
+}
+/* If we reached a boundary, we must walk clockwise as well. */
+if ( neighbor.tri == dummytri ) {
+/* Walk clockwise about the point. */
+oprev( testtri, neighbor );
+/* Stop upon reaching a boundary. */
+while ( neighbor.tri != dummytri ) {
+if ( infected( neighbor )) {
+/* Mark the corner of this triangle as having been tested. */
+setorg( neighbor, NULL );
+}
+else {
+/* A live triangle.  The point survives. */
+killorg = 0;
+}
+/* Walk clockwise about the point. */
+oprevself( neighbor );
+}
+}
+if ( killorg ) {
+if ( verbose > 1 ) {
+printf( "    Deleting point (%.12g, %.12g)\n",
+testpoint[0], testpoint[1] );
+}
+pointdealloc( testpoint );
+}
+}
+}
+
+/* Record changes in the number of boundary edges, and disconnect */
+/*   dead triangles from their neighbors.                         */
+for ( testtri.orient = 0; testtri.orient < 3; testtri.orient++ ) {
+sym( testtri, neighbor );
+if ( neighbor.tri == dummytri ) {
+/* There is no neighboring triangle on this edge, so this edge    */
+/*   is a boundary edge.  This triangle is being deleted, so this */
+/*   boundary edge is deleted.                                    */
+hullsize--;
+}
+else {
+/* Disconnect the triangle from its neighbor. */
+dissolve( neighbor );
+/* There is a neighboring triangle on this edge, so this edge */
+/*   becomes a boundary edge when this triangle is deleted.   */
+hullsize++;
+}
+}
+/* Return the dead triangle to the pool of triangles. */
+triangledealloc( testtri.tri );
+virusloop = (triangle **) traverse( &viri );
+}
+/* Empty the virus pool. */
+poolrestart( &viri );
 }
 
 /*****************************************************************************/
@@ -10449,93 +10660,93 @@ void regionplague( attribute, area )
 REAL attribute;
 REAL area;
 {
-       struct triedge testtri;
-       struct triedge neighbor;
-       triangle **virusloop;
-       triangle **regiontri;
-       struct edge neighborshelle;
-       point regionorg, regiondest, regionapex;
-       triangle ptr;           /* Temporary variable used by sym() and onext(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       if ( verbose > 1 ) {
-               printf( "  Marking neighbors of marked triangles.\n" );
-       }
-       /* Loop through all the infected triangles, spreading the attribute      */
-       /*   and/or area constraint to their neighbors, then to their neighbors' */
-       /*   neighbors.                                                          */
-       traversalinit( &viri );
-       virusloop = (triangle **) traverse( &viri );
-       while ( virusloop != (triangle **) NULL ) {
-               testtri.tri = *virusloop;
-               /* A triangle is marked as infected by messing with one of its shell */
-               /*   edges, setting it to an illegal value.  Hence, we have to       */
-               /*   temporarily uninfect this triangle so that we can examine its   */
-               /*   adjacent shell edges.                                           */
-               uninfect( testtri );
-               if ( regionattrib ) {
-                       /* Set an attribute. */
-                       setelemattribute( testtri, eextras, attribute );
-               }
-               if ( vararea ) {
-                       /* Set an area constraint. */
-                       setareabound( testtri, area );
-               }
-               if ( verbose > 2 ) {
-                       /* Assign the triangle an orientation for convenience in */
-                       /*   checking its points.                                */
-                       testtri.orient = 0;
-                       org( testtri, regionorg );
-                       dest( testtri, regiondest );
-                       apex( testtri, regionapex );
-                       printf( "    Checking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
-                                       regionorg[0], regionorg[1], regiondest[0], regiondest[1],
-                                       regionapex[0], regionapex[1] );
-               }
-               /* Check each of the triangle's three neighbors. */
-               for ( testtri.orient = 0; testtri.orient < 3; testtri.orient++ ) {
-                       /* Find the neighbor. */
-                       sym( testtri, neighbor );
-                       /* Check for a shell between the triangle and its neighbor. */
-                       tspivot( testtri, neighborshelle );
-                       /* Make sure the neighbor exists, is not already infected, and */
-                       /*   isn't protected by a shell edge.                          */
-                       if ( ( neighbor.tri != dummytri ) && !infected( neighbor )
-                                && ( neighborshelle.sh == dummysh ) ) {
-                               if ( verbose > 2 ) {
-                                       org( neighbor, regionorg );
-                                       dest( neighbor, regiondest );
-                                       apex( neighbor, regionapex );
-                                       printf( "    Marking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
-                                                       regionorg[0], regionorg[1], regiondest[0], regiondest[1],
-                                                       regionapex[0], regionapex[1] );
-                               }
-                               /* Infect the neighbor. */
-                               infect( neighbor );
-                               /* Ensure that the neighbor's neighbors will be infected. */
-                               regiontri = (triangle **) poolalloc( &viri );
-                               *regiontri = neighbor.tri;
-                       }
-               }
-               /* Remark the triangle as infected, so it doesn't get added to the */
-               /*   virus pool again.                                             */
-               infect( testtri );
-               virusloop = (triangle **) traverse( &viri );
-       }
-
-       /* Uninfect all triangles. */
-       if ( verbose > 1 ) {
-               printf( "  Unmarking marked triangles.\n" );
-       }
-       traversalinit( &viri );
-       virusloop = (triangle **) traverse( &viri );
-       while ( virusloop != (triangle **) NULL ) {
-               testtri.tri = *virusloop;
-               uninfect( testtri );
-               virusloop = (triangle **) traverse( &viri );
-       }
-       /* Empty the virus pool. */
-       poolrestart( &viri );
+struct triedge testtri;
+struct triedge neighbor;
+triangle **virusloop;
+triangle **regiontri;
+struct edge neighborshelle;
+point regionorg, regiondest, regionapex;
+triangle ptr;           /* Temporary variable used by sym() and onext(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+if ( verbose > 1 ) {
+printf( "  Marking neighbors of marked triangles.\n" );
+}
+/* Loop through all the infected triangles, spreading the attribute      */
+/*   and/or area constraint to their neighbors, then to their neighbors' */
+/*   neighbors.                                                          */
+traversalinit( &viri );
+virusloop = (triangle **) traverse( &viri );
+while ( virusloop != (triangle **) NULL ) {
+testtri.tri = *virusloop;
+/* A triangle is marked as infected by messing with one of its shell */
+/*   edges, setting it to an illegal value.  Hence, we have to       */
+/*   temporarily uninfect this triangle so that we can examine its   */
+/*   adjacent shell edges.                                           */
+uninfect( testtri );
+if ( regionattrib ) {
+/* Set an attribute. */
+setelemattribute( testtri, eextras, attribute );
+}
+if ( vararea ) {
+/* Set an area constraint. */
+setareabound( testtri, area );
+}
+if ( verbose > 2 ) {
+/* Assign the triangle an orientation for convenience in */
+/*   checking its points.                                */
+testtri.orient = 0;
+org( testtri, regionorg );
+dest( testtri, regiondest );
+apex( testtri, regionapex );
+printf( "    Checking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
+regionorg[0], regionorg[1], regiondest[0], regiondest[1],
+regionapex[0], regionapex[1] );
+}
+/* Check each of the triangle's three neighbors. */
+for ( testtri.orient = 0; testtri.orient < 3; testtri.orient++ ) {
+/* Find the neighbor. */
+sym( testtri, neighbor );
+/* Check for a shell between the triangle and its neighbor. */
+tspivot( testtri, neighborshelle );
+/* Make sure the neighbor exists, is not already infected, and */
+/*   isn't protected by a shell edge.                          */
+if (( neighbor.tri != dummytri ) && !infected( neighbor )
+&& ( neighborshelle.sh == dummysh )) {
+if ( verbose > 2 ) {
+org( neighbor, regionorg );
+dest( neighbor, regiondest );
+apex( neighbor, regionapex );
+printf( "    Marking (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
+regionorg[0], regionorg[1], regiondest[0], regiondest[1],
+regionapex[0], regionapex[1] );
+}
+/* Infect the neighbor. */
+infect( neighbor );
+/* Ensure that the neighbor's neighbors will be infected. */
+regiontri = (triangle **) poolalloc( &viri );
+*regiontri = neighbor.tri;
+}
+}
+/* Remark the triangle as infected, so it doesn't get added to the */
+/*   virus pool again.                                             */
+infect( testtri );
+virusloop = (triangle **) traverse( &viri );
+}
+
+/* Uninfect all triangles. */
+if ( verbose > 1 ) {
+printf( "  Unmarking marked triangles.\n" );
+}
+traversalinit( &viri );
+virusloop = (triangle **) traverse( &viri );
+while ( virusloop != (triangle **) NULL ) {
+testtri.tri = *virusloop;
+uninfect( testtri );
+virusloop = (triangle **) traverse( &viri );
+}
+/* Empty the virus pool. */
+poolrestart( &viri );
 }
 
 /*****************************************************************************/
@@ -10556,168 +10767,168 @@ int holes;
 REAL *regionlist;
 int regions;
 {
-       struct triedge searchtri;
-       struct triedge triangleloop;
-       struct triedge *regiontris;
-       triangle **holetri;
-       triangle **regiontri;
-       point searchorg, searchdest;
-       enum locateresult intersect;
-       int i;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-       if ( !( quiet || ( noholes && convex ) ) ) {
-               printf( "Removing unwanted triangles.\n" );
-               if ( verbose && ( holes > 0 ) ) {
-                       printf( "  Marking holes for elimination.\n" );
-               }
-       }
-
-       if ( regions > 0 ) {
-               /* Allocate storage for the triangles in which region points fall. */
-               regiontris = (struct triedge *) malloc( regions * sizeof( struct triedge ) );
-               if ( regiontris == (struct triedge *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-
-       if ( ( ( holes > 0 ) && !noholes ) || !convex || ( regions > 0 ) ) {
-               /* Initialize a pool of viri to be used for holes, concavities, */
-               /*   regional attributes, and/or regional area constraints.     */
-               poolinit( &viri, sizeof( triangle * ), VIRUSPERBLOCK, POINTER, 0 );
-       }
-
-       if ( !convex ) {
-               /* Mark as infected any unprotected triangles on the boundary. */
-               /*   This is one way by which concavities are created.         */
-               infecthull();
-       }
-
-       if ( ( holes > 0 ) && !noholes ) {
-               /* Infect each triangle in which a hole lies. */
-               for ( i = 0; i < 2 * holes; i += 2 ) {
-                       /* Ignore holes that aren't within the bounds of the mesh. */
-                       if ( ( holelist[i] >= xmin ) && ( holelist[i] <= xmax )
-                                && ( holelist[i + 1] >= ymin ) && ( holelist[i + 1] <= ymax ) ) {
-                               /* Start searching from some triangle on the outer boundary. */
-                               searchtri.tri = dummytri;
-                               searchtri.orient = 0;
-                               symself( searchtri );
-                               /* Ensure that the hole is to the left of this boundary edge; */
-                               /*   otherwise, locate() will falsely report that the hole    */
-                               /*   falls within the starting triangle.                      */
-                               org( searchtri, searchorg );
-                               dest( searchtri, searchdest );
-                               if ( counterclockwise( searchorg, searchdest, &holelist[i] ) > 0.0 ) {
-                                       /* Find a triangle that contains the hole. */
-                                       intersect = locate( &holelist[i], &searchtri );
-                                       if ( ( intersect != OUTSIDE ) && ( !infected( searchtri ) ) ) {
-                                               /* Infect the triangle.  This is done by marking the triangle */
-                                               /*   as infect and including the triangle in the virus pool.  */
-                                               infect( searchtri );
-                                               holetri = (triangle **) poolalloc( &viri );
-                                               *holetri = searchtri.tri;
-                                       }
-                               }
-                       }
-               }
-       }
-
-       /* Now, we have to find all the regions BEFORE we carve the holes, because */
-       /*   locate() won't work when the triangulation is no longer convex.       */
-       /*   (Incidentally, this is the reason why regional attributes and area    */
-       /*   constraints can't be used when refining a preexisting mesh, which     */
-       /*   might not be convex; they can only be used with a freshly             */
-       /*   triangulated PSLG.)                                                   */
-       if ( regions > 0 ) {
-               /* Find the starting triangle for each region. */
-               for ( i = 0; i < regions; i++ ) {
-                       regiontris[i].tri = dummytri;
-                       /* Ignore region points that aren't within the bounds of the mesh. */
-                       if ( ( regionlist[4 * i] >= xmin ) && ( regionlist[4 * i] <= xmax ) &&
-                                ( regionlist[4 * i + 1] >= ymin ) && ( regionlist[4 * i + 1] <= ymax ) ) {
-                               /* Start searching from some triangle on the outer boundary. */
-                               searchtri.tri = dummytri;
-                               searchtri.orient = 0;
-                               symself( searchtri );
-                               /* Ensure that the region point is to the left of this boundary */
-                               /*   edge; otherwise, locate() will falsely report that the     */
-                               /*   region point falls within the starting triangle.           */
-                               org( searchtri, searchorg );
-                               dest( searchtri, searchdest );
-                               if ( counterclockwise( searchorg, searchdest, &regionlist[4 * i] ) >
-                                        0.0 ) {
-                                       /* Find a triangle that contains the region point. */
-                                       intersect = locate( &regionlist[4 * i], &searchtri );
-                                       if ( ( intersect != OUTSIDE ) && ( !infected( searchtri ) ) ) {
-                                               /* Record the triangle for processing after the */
-                                               /*   holes have been carved.                    */
-                                               triedgecopy( searchtri, regiontris[i] );
-                                       }
-                               }
-                       }
-               }
-       }
-
-       if ( viri.items > 0 ) {
-               /* Carve the holes and concavities. */
-               plague();
-       }
-       /* The virus pool should be empty now. */
-
-       if ( regions > 0 ) {
-               if ( !quiet ) {
-                       if ( regionattrib ) {
-                               if ( vararea ) {
-                                       printf( "Spreading regional attributes and area constraints.\n" );
-                               }
-                               else {
-                                       printf( "Spreading regional attributes.\n" );
-                               }
-                       }
-                       else {
-                               printf( "Spreading regional area constraints.\n" );
-                       }
-               }
-               if ( regionattrib && !refine ) {
-                       /* Assign every triangle a regional attribute of zero. */
-                       traversalinit( &triangles );
-                       triangleloop.orient = 0;
-                       triangleloop.tri = triangletraverse();
-                       while ( triangleloop.tri != (triangle *) NULL ) {
-                               setelemattribute( triangleloop, eextras, 0.0 );
-                               triangleloop.tri = triangletraverse();
-                       }
-               }
-               for ( i = 0; i < regions; i++ ) {
-                       if ( regiontris[i].tri != dummytri ) {
-                               /* Make sure the triangle under consideration still exists. */
-                               /*   It may have been eaten by the virus.                   */
-                               if ( regiontris[i].tri[3] != (triangle) NULL ) {
-                                       /* Put one triangle in the virus pool. */
-                                       infect( regiontris[i] );
-                                       regiontri = (triangle **) poolalloc( &viri );
-                                       *regiontri = regiontris[i].tri;
-                                       /* Apply one region's attribute and/or area constraint. */
-                                       regionplague( regionlist[4 * i + 2], regionlist[4 * i + 3] );
-                                       /* The virus pool should be empty now. */
-                               }
-                       }
-               }
-               if ( regionattrib && !refine ) {
-                       /* Note the fact that each triangle has an additional attribute. */
-                       eextras++;
-               }
-       }
-
-       /* Free up memory. */
-       if ( ( ( holes > 0 ) && !noholes ) || !convex || ( regions > 0 ) ) {
-               pooldeinit( &viri );
-       }
-       if ( regions > 0 ) {
-               free( regiontris );
-       }
+struct triedge searchtri;
+struct triedge triangleloop;
+struct triedge *regiontris;
+triangle **holetri;
+triangle **regiontri;
+point searchorg, searchdest;
+enum locateresult intersect;
+int i;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+if ( !( quiet || ( noholes && convex ))) {
+printf( "Removing unwanted triangles.\n" );
+if ( verbose && ( holes > 0 )) {
+printf( "  Marking holes for elimination.\n" );
+}
+}
+
+if ( regions > 0 ) {
+/* Allocate storage for the triangles in which region points fall. */
+regiontris = (struct triedge *) malloc( regions * sizeof( struct triedge ));
+if ( regiontris == (struct triedge *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+
+if ((( holes > 0 ) && !noholes ) || !convex || ( regions > 0 )) {
+/* Initialize a pool of viri to be used for holes, concavities, */
+/*   regional attributes, and/or regional area constraints.     */
+poolinit( &viri, sizeof( triangle * ), VIRUSPERBLOCK, POINTER, 0 );
+}
+
+if ( !convex ) {
+/* Mark as infected any unprotected triangles on the boundary. */
+/*   This is one way by which concavities are created.         */
+infecthull();
+}
+
+if (( holes > 0 ) && !noholes ) {
+/* Infect each triangle in which a hole lies. */
+for ( i = 0; i < 2 * holes; i += 2 ) {
+/* Ignore holes that aren't within the bounds of the mesh. */
+if (( holelist[i] >= xmin ) && ( holelist[i] <= xmax )
+&& ( holelist[i + 1] >= ymin ) && ( holelist[i + 1] <= ymax )) {
+/* Start searching from some triangle on the outer boundary. */
+searchtri.tri = dummytri;
+searchtri.orient = 0;
+symself( searchtri );
+/* Ensure that the hole is to the left of this boundary edge; */
+/*   otherwise, locate() will falsely report that the hole    */
+/*   falls within the starting triangle.                      */
+org( searchtri, searchorg );
+dest( searchtri, searchdest );
+if ( counterclockwise( searchorg, searchdest, &holelist[i] ) > 0.0 ) {
+/* Find a triangle that contains the hole. */
+intersect = locate( &holelist[i], &searchtri );
+if (( intersect != OUTSIDE ) && ( !infected( searchtri ))) {
+/* Infect the triangle.  This is done by marking the triangle */
+/*   as infect and including the triangle in the virus pool.  */
+infect( searchtri );
+holetri = (triangle **) poolalloc( &viri );
+*holetri = searchtri.tri;
+}
+}
+}
+}
+}
+
+/* Now, we have to find all the regions BEFORE we carve the holes, because */
+/*   locate() won't work when the triangulation is no longer convex.       */
+/*   (Incidentally, this is the reason why regional attributes and area    */
+/*   constraints can't be used when refining a preexisting mesh, which     */
+/*   might not be convex; they can only be used with a freshly             */
+/*   triangulated PSLG.)                                                   */
+if ( regions > 0 ) {
+/* Find the starting triangle for each region. */
+for ( i = 0; i < regions; i++ ) {
+regiontris[i].tri = dummytri;
+/* Ignore region points that aren't within the bounds of the mesh. */
+if (( regionlist[4 * i] >= xmin ) && ( regionlist[4 * i] <= xmax ) &&
+( regionlist[4 * i + 1] >= ymin ) && ( regionlist[4 * i + 1] <= ymax )) {
+/* Start searching from some triangle on the outer boundary. */
+searchtri.tri = dummytri;
+searchtri.orient = 0;
+symself( searchtri );
+/* Ensure that the region point is to the left of this boundary */
+/*   edge; otherwise, locate() will falsely report that the     */
+/*   region point falls within the starting triangle.           */
+org( searchtri, searchorg );
+dest( searchtri, searchdest );
+if ( counterclockwise( searchorg, searchdest, &regionlist[4 * i] ) >
+0.0 ) {
+/* Find a triangle that contains the region point. */
+intersect = locate( &regionlist[4 * i], &searchtri );
+if (( intersect != OUTSIDE ) && ( !infected( searchtri ))) {
+/* Record the triangle for processing after the */
+/*   holes have been carved.                    */
+triedgecopy( searchtri, regiontris[i] );
+}
+}
+}
+}
+}
+
+if ( viri.items > 0 ) {
+/* Carve the holes and concavities. */
+plague();
+}
+/* The virus pool should be empty now. */
+
+if ( regions > 0 ) {
+if ( !quiet ) {
+if ( regionattrib ) {
+if ( vararea ) {
+printf( "Spreading regional attributes and area constraints.\n" );
+}
+else {
+printf( "Spreading regional attributes.\n" );
+}
+}
+else {
+printf( "Spreading regional area constraints.\n" );
+}
+}
+if ( regionattrib && !refine ) {
+/* Assign every triangle a regional attribute of zero. */
+traversalinit( &triangles );
+triangleloop.orient = 0;
+triangleloop.tri = triangletraverse();
+while ( triangleloop.tri != (triangle *) NULL ) {
+setelemattribute( triangleloop, eextras, 0.0 );
+triangleloop.tri = triangletraverse();
+}
+}
+for ( i = 0; i < regions; i++ ) {
+if ( regiontris[i].tri != dummytri ) {
+/* Make sure the triangle under consideration still exists. */
+/*   It may have been eaten by the virus.                   */
+if ( regiontris[i].tri[3] != (triangle) NULL ) {
+/* Put one triangle in the virus pool. */
+infect( regiontris[i] );
+regiontri = (triangle **) poolalloc( &viri );
+*regiontri = regiontris[i].tri;
+/* Apply one region's attribute and/or area constraint. */
+regionplague( regionlist[4 * i + 2], regionlist[4 * i + 3] );
+/* The virus pool should be empty now. */
+}
+}
+}
+if ( regionattrib && !refine ) {
+/* Note the fact that each triangle has an additional attribute. */
+eextras++;
+}
+}
+
+/* Free up memory. */
+if ((( holes > 0 ) && !noholes ) || !convex || ( regions > 0 )) {
+pooldeinit( &viri );
+}
+if ( regions > 0 ) {
+free( regiontris );
+}
 }
 
 /**                                                                         **/
@@ -10735,20 +10946,21 @@ int regions;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void tallyencs(){
-       struct edge edgeloop;
-       int dummy;
-
-       traversalinit( &shelles );
-       edgeloop.shorient = 0;
-       edgeloop.sh = shelletraverse();
-       while ( edgeloop.sh != (shelle *) NULL ) {
-               /* If the segment is encroached, add it to the list. */
-               dummy = checkedge4encroach( &edgeloop );
-               edgeloop.sh = shelletraverse();
-       }
+struct edge edgeloop;
+int dummy;
+
+traversalinit( &shelles );
+edgeloop.shorient = 0;
+edgeloop.sh = shelletraverse();
+while ( edgeloop.sh != (shelle *) NULL ) {
+/* If the segment is encroached, add it to the list. */
+dummy = checkedge4encroach( &edgeloop );
+edgeloop.sh = shelletraverse();
+}
 }
 
 #endif /* not CDT_ONLY */
@@ -10759,15 +10971,17 @@ void tallyencs(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void precisionerror(){
-       printf( "Try increasing the area criterion and/or reducing the minimum\n" );
-       printf( "  allowable angle so that tiny triangles are not created.\n" );
-#ifdef SINGLE
-       printf( "Alternatively, try recompiling me with double precision\n" );
-       printf( "  arithmetic (by removing \"#define SINGLE\" from the\n" );
-       printf( "  source file or \"-DSINGLE\" from the makefile).\n" );
+printf( "Try increasing the area criterion and/or reducing the minimum\n" );
+printf( "  allowable angle so that tiny triangles are not created.\n" );
+#ifdef
+SINGLE
+printf( "Alternatively, try recompiling me with double precision\n" );
+printf( "  arithmetic (by removing \"#define SINGLE\" from the\n" );
+printf( "  source file or \"-DSINGLE\" from the makefile).\n" );
 #endif /* SINGLE */
 }
 
@@ -10790,138 +11004,139 @@ void precisionerror(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void repairencs( flaws )
 int flaws;
 {
-       struct triedge enctri;
-       struct triedge testtri;
-       struct edge *encloop;
-       struct edge testsh;
-       point eorg, edest;
-       point newpoint;
-       enum insertsiteresult success;
-       REAL segmentlength, nearestpoweroftwo;
-       REAL split;
-       int acuteorg, acutedest;
-       int dummy;
-       int i;
-       triangle ptr;                   /* Temporary variable used by stpivot(). */
-       shelle sptr;                      /* Temporary variable used by snext(). */
-
-       while ( ( badsegments.items > 0 ) && ( steinerleft != 0 ) ) {
-               traversalinit( &badsegments );
-               encloop = badsegmenttraverse();
-               while ( ( encloop != (struct edge *) NULL ) && ( steinerleft != 0 ) ) {
-                       /* To decide where to split a segment, we need to know if the  */
-                       /*   segment shares an endpoint with an adjacent segment.      */
-                       /*   The concern is that, if we simply split every encroached  */
-                       /*   segment in its center, two adjacent segments with a small */
-                       /*   angle between them might lead to an infinite loop; each   */
-                       /*   point added to split one segment will encroach upon the   */
-                       /*   other segment, which must then be split with a point that */
-                       /*   will encroach upon the first segment, and so on forever.  */
-                       /* To avoid this, imagine a set of concentric circles, whose   */
-                       /*   radii are powers of two, about each segment endpoint.     */
-                       /*   These concentric circles determine where the segment is   */
-                       /*   split.  (If both endpoints are shared with adjacent       */
-                       /*   segments, split the segment in the middle, and apply the  */
-                       /*   concentric shells for later splittings.)                  */
-
-                       /* Is the origin shared with another segment? */
-                       stpivot( *encloop, enctri );
-                       lnext( enctri, testtri );
-                       tspivot( testtri, testsh );
-                       acuteorg = testsh.sh != dummysh;
-                       /* Is the destination shared with another segment? */
-                       lnextself( testtri );
-                       tspivot( testtri, testsh );
-                       acutedest = testsh.sh != dummysh;
-                       /* Now, check the other side of the segment, if there's a triangle */
-                       /*   there.                                                        */
-                       sym( enctri, testtri );
-                       if ( testtri.tri != dummytri ) {
-                               /* Is the destination shared with another segment? */
-                               lnextself( testtri );
-                               tspivot( testtri, testsh );
-                               acutedest = acutedest || ( testsh.sh != dummysh );
-                               /* Is the origin shared with another segment? */
-                               lnextself( testtri );
-                               tspivot( testtri, testsh );
-                               acuteorg = acuteorg || ( testsh.sh != dummysh );
-                       }
-
-                       sorg( *encloop, eorg );
-                       sdest( *encloop, edest );
-                       /* Use the concentric circles if exactly one endpoint is shared */
-                       /*   with another adjacent segment.                             */
-                       if ( acuteorg ^ acutedest ) {
-                               segmentlength = sqrt( ( edest[0] - eorg[0] ) * ( edest[0] - eorg[0] )
-                                                                         + ( edest[1] - eorg[1] ) * ( edest[1] - eorg[1] ) );
-                               /* Find the power of two nearest the segment's length. */
-                               nearestpoweroftwo = 1.0;
-                               while ( segmentlength > SQUAREROOTTWO * nearestpoweroftwo ) {
-                                       nearestpoweroftwo *= 2.0;
-                               }
-                               while ( segmentlength < ( 0.5 * SQUAREROOTTWO ) * nearestpoweroftwo ) {
-                                       nearestpoweroftwo *= 0.5;
-                               }
-                               /* Where do we split the segment? */
-                               split = 0.5 * nearestpoweroftwo / segmentlength;
-                               if ( acutedest ) {
-                                       split = 1.0 - split;
-                               }
-                       }
-                       else {
-                               /* If we're not worried about adjacent segments, split */
-                               /*   this segment in the middle.                       */
-                               split = 0.5;
-                       }
-
-                       /* Create the new point. */
-                       newpoint = (point) poolalloc( &points );
-                       /* Interpolate its coordinate and attributes. */
-                       for ( i = 0; i < 2 + nextras; i++ ) {
-                               newpoint[i] = ( 1.0 - split ) * eorg[i] + split * edest[i];
-                       }
-                       setpointmark( newpoint, mark( *encloop ) );
-                       if ( verbose > 1 ) {
-                               printf(
-                                       "  Splitting edge (%.12g, %.12g) (%.12g, %.12g) at (%.12g, %.12g).\n",
-                                       eorg[0], eorg[1], edest[0], edest[1], newpoint[0], newpoint[1] );
-                       }
-                       /* Check whether the new point lies on an endpoint. */
-                       if ( ( ( newpoint[0] == eorg[0] ) && ( newpoint[1] == eorg[1] ) )
-                                || ( ( newpoint[0] == edest[0] ) && ( newpoint[1] == edest[1] ) ) ) {
-                               printf( "Error:  Ran out of precision at (%.12g, %.12g).\n",
-                                               newpoint[0], newpoint[1] );
-                               printf( "I attempted to split a segment to a smaller size than can\n" );
-                               printf( "  be accommodated by the finite precision of floating point\n"
-                                               );
-                               printf( "  arithmetic.\n" );
-                               precisionerror();
-                               exit( 1 );
-                       }
-                       /* Insert the splitting point.  This should always succeed. */
-                       success = insertsite( newpoint, &enctri, encloop, flaws, flaws );
-                       if ( ( success != SUCCESSFULPOINT ) && ( success != ENCROACHINGPOINT ) ) {
-                               printf( "Internal error in repairencs():\n" );
-                               printf( "  Failure to split a segment.\n" );
-                               internalerror();
-                       }
-                       if ( steinerleft > 0 ) {
-                               steinerleft--;
-                       }
-                       /* Check the two new subsegments to see if they're encroached. */
-                       dummy = checkedge4encroach( encloop );
-                       snextself( *encloop );
-                       dummy = checkedge4encroach( encloop );
-
-                       badsegmentdealloc( encloop );
-                       encloop = badsegmenttraverse();
-               }
-       }
+struct triedge enctri;
+struct triedge testtri;
+struct edge *encloop;
+struct edge testsh;
+point eorg, edest;
+point newpoint;
+enum insertsiteresult success;
+REAL segmentlength, nearestpoweroftwo;
+REAL split;
+int acuteorg, acutedest;
+int dummy;
+int i;
+triangle ptr;                   /* Temporary variable used by stpivot(). */
+shelle sptr;                      /* Temporary variable used by snext(). */
+
+while (( badsegments.items > 0 ) && ( steinerleft != 0 )) {
+traversalinit( &badsegments );
+encloop = badsegmenttraverse();
+while (( encloop != (struct edge *) NULL ) && ( steinerleft != 0 )) {
+/* To decide where to split a segment, we need to know if the  */
+/*   segment shares an endpoint with an adjacent segment.      */
+/*   The concern is that, if we simply split every encroached  */
+/*   segment in its center, two adjacent segments with a small */
+/*   angle between them might lead to an infinite loop; each   */
+/*   point added to split one segment will encroach upon the   */
+/*   other segment, which must then be split with a point that */
+/*   will encroach upon the first segment, and so on forever.  */
+/* To avoid this, imagine a set of concentric circles, whose   */
+/*   radii are powers of two, about each segment endpoint.     */
+/*   These concentric circles determine where the segment is   */
+/*   split.  (If both endpoints are shared with adjacent       */
+/*   segments, split the segment in the middle, and apply the  */
+/*   concentric shells for later splittings.)                  */
+
+/* Is the origin shared with another segment? */
+stpivot( *encloop, enctri );
+lnext( enctri, testtri );
+tspivot( testtri, testsh );
+acuteorg = testsh.sh != dummysh;
+/* Is the destination shared with another segment? */
+lnextself( testtri );
+tspivot( testtri, testsh );
+acutedest = testsh.sh != dummysh;
+/* Now, check the other side of the segment, if there's a triangle */
+/*   there.                                                        */
+sym( enctri, testtri );
+if ( testtri.tri != dummytri ) {
+/* Is the destination shared with another segment? */
+lnextself( testtri );
+tspivot( testtri, testsh );
+acutedest = acutedest || ( testsh.sh != dummysh );
+/* Is the origin shared with another segment? */
+lnextself( testtri );
+tspivot( testtri, testsh );
+acuteorg = acuteorg || ( testsh.sh != dummysh );
+}
+
+sorg( *encloop, eorg );
+sdest( *encloop, edest );
+/* Use the concentric circles if exactly one endpoint is shared */
+/*   with another adjacent segment.                             */
+if ( acuteorg ^ acutedest ) {
+segmentlength = sqrt(( edest[0] - eorg[0] ) * ( edest[0] - eorg[0] )
++ ( edest[1] - eorg[1] ) * ( edest[1] - eorg[1] ));
+/* Find the power of two nearest the segment's length. */
+nearestpoweroftwo = 1.0;
+while ( segmentlength > SQUAREROOTTWO * nearestpoweroftwo ) {
+nearestpoweroftwo *= 2.0;
+}
+while ( segmentlength < ( 0.5 * SQUAREROOTTWO ) * nearestpoweroftwo ) {
+nearestpoweroftwo *= 0.5;
+}
+/* Where do we split the segment? */
+split = 0.5 * nearestpoweroftwo / segmentlength;
+if ( acutedest ) {
+split = 1.0 - split;
+}
+}
+else {
+/* If we're not worried about adjacent segments, split */
+/*   this segment in the middle.                       */
+split = 0.5;
+}
+
+/* Create the new point. */
+newpoint = (point) poolalloc( &points );
+/* Interpolate its coordinate and attributes. */
+for ( i = 0; i < 2 + nextras; i++ ) {
+newpoint[i] = ( 1.0 - split ) * eorg[i] + split * edest[i];
+}
+setpointmark( newpoint, mark( *encloop ));
+if ( verbose > 1 ) {
+printf(
+"  Splitting edge (%.12g, %.12g) (%.12g, %.12g) at (%.12g, %.12g).\n",
+eorg[0], eorg[1], edest[0], edest[1], newpoint[0], newpoint[1] );
+}
+/* Check whether the new point lies on an endpoint. */
+if ((( newpoint[0] == eorg[0] ) && ( newpoint[1] == eorg[1] ))
+|| (( newpoint[0] == edest[0] ) && ( newpoint[1] == edest[1] ))) {
+printf( "Error:  Ran out of precision at (%.12g, %.12g).\n",
+newpoint[0], newpoint[1] );
+printf( "I attempted to split a segment to a smaller size than can\n" );
+printf( "  be accommodated by the finite precision of floating point\n"
+);
+printf( "  arithmetic.\n" );
+precisionerror();
+exit( 1 );
+}
+/* Insert the splitting point.  This should always succeed. */
+success = insertsite( newpoint, &enctri, encloop, flaws, flaws );
+if (( success != SUCCESSFULPOINT ) && ( success != ENCROACHINGPOINT )) {
+printf( "Internal error in repairencs():\n" );
+printf( "  Failure to split a segment.\n" );
+internalerror();
+}
+if ( steinerleft > 0 ) {
+steinerleft--;
+}
+/* Check the two new subsegments to see if they're encroached. */
+dummy = checkedge4encroach( encloop );
+snextself( *encloop );
+dummy = checkedge4encroach( encloop );
+
+badsegmentdealloc( encloop );
+encloop = badsegmenttraverse();
+}
+}
 }
 
 #endif /* not CDT_ONLY */
@@ -10932,22 +11147,23 @@ int flaws;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void tallyfaces(){
-       struct triedge triangleloop;
+struct triedge triangleloop;
 
-       if ( verbose ) {
-               printf( "  Making a list of bad triangles.\n" );
-       }
-       traversalinit( &triangles );
-       triangleloop.orient = 0;
-       triangleloop.tri = triangletraverse();
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               /* If the triangle is bad, enqueue it. */
-               testtriangle( &triangleloop );
-               triangleloop.tri = triangletraverse();
-       }
+if ( verbose ) {
+printf( "  Making a list of bad triangles.\n" );
+}
+traversalinit( &triangles );
+triangleloop.orient = 0;
+triangleloop.tri = triangletraverse();
+while ( triangleloop.tri != (triangle *) NULL ) {
+/* If the triangle is bad, enqueue it. */
+testtriangle( &triangleloop );
+triangleloop.tri = triangletraverse();
+}
 }
 
 #endif /* not CDT_ONLY */
@@ -10967,7 +11183,7 @@ void tallyfaces(){
 /*****************************************************************************/
 
 enum circumcenterresult findcircumcenter( torg, tdest, tapex, circumcenter,
-                                                                                 xi, eta )
+xi, eta )
 point torg;
 point tdest;
 point tapex;
@@ -10975,56 +11191,56 @@ point circumcenter;
 REAL *xi;
 REAL *eta;
 {
-       REAL xdo, ydo, xao, yao, xad, yad;
-       REAL dodist, aodist, addist;
-       REAL denominator;
-       REAL dx, dy;
-
-       circumcentercount++;
-
-       /* Compute the circumcenter of the triangle. */
-       xdo = tdest[0] - torg[0];
-       ydo = tdest[1] - torg[1];
-       xao = tapex[0] - torg[0];
-       yao = tapex[1] - torg[1];
-       dodist = xdo * xdo + ydo * ydo;
-       aodist = xao * xao + yao * yao;
-       if ( noexact ) {
-               denominator = (REAL)( 0.5 / ( xdo * yao - xao * ydo ) );
-       }
-       else {
-               /* Use the counterclockwise() routine to ensure a positive (and */
-               /*   reasonably accurate) result, avoiding any possibility of   */
-               /*   division by zero.                                          */
-               denominator = (REAL)( 0.5 / counterclockwise( tdest, tapex, torg ) );
-               /* Don't count the above as an orientation test. */
-               counterclockcount--;
-       }
-       circumcenter[0] = torg[0] - ( ydo * aodist - yao * dodist ) * denominator;
-       circumcenter[1] = torg[1] + ( xdo * aodist - xao * dodist ) * denominator;
-
-       /* To interpolate point attributes for the new point inserted at  */
-       /*   the circumcenter, define a coordinate system with a xi-axis, */
-       /*   directed from the triangle's origin to its destination, and  */
-       /*   an eta-axis, directed from its origin to its apex.           */
-       /*   Calculate the xi and eta coordinates of the circumcenter.    */
-       dx = circumcenter[0] - torg[0];
-       dy = circumcenter[1] - torg[1];
-       *xi = (REAL)( ( dx * yao - xao * dy ) * ( 2.0 * denominator ) );
-       *eta = (REAL)( ( xdo * dy - dx * ydo ) * ( 2.0 * denominator ) );
-
-       xad = tapex[0] - tdest[0];
-       yad = tapex[1] - tdest[1];
-       addist = xad * xad + yad * yad;
-       if ( ( addist < dodist ) && ( addist < aodist ) ) {
-               return OPPOSITEORG;
-       }
-       else if ( dodist < aodist ) {
-               return OPPOSITEAPEX;
-       }
-       else {
-               return OPPOSITEDEST;
-       }
+REAL xdo, ydo, xao, yao, xad, yad;
+REAL dodist, aodist, addist;
+REAL denominator;
+REAL dx, dy;
+
+circumcentercount++;
+
+/* Compute the circumcenter of the triangle. */
+xdo = tdest[0] - torg[0];
+ydo = tdest[1] - torg[1];
+xao = tapex[0] - torg[0];
+yao = tapex[1] - torg[1];
+dodist = xdo * xdo + ydo * ydo;
+aodist = xao * xao + yao * yao;
+if ( noexact ) {
+denominator = (REAL)( 0.5 / ( xdo * yao - xao * ydo ));
+}
+else {
+/* Use the counterclockwise() routine to ensure a positive (and */
+/*   reasonably accurate) result, avoiding any possibility of   */
+/*   division by zero.                                          */
+denominator = (REAL)( 0.5 / counterclockwise( tdest, tapex, torg ));
+/* Don't count the above as an orientation test. */
+counterclockcount--;
+}
+circumcenter[0] = torg[0] - ( ydo * aodist - yao * dodist ) * denominator;
+circumcenter[1] = torg[1] + ( xdo * aodist - xao * dodist ) * denominator;
+
+/* To interpolate point attributes for the new point inserted at  */
+/*   the circumcenter, define a coordinate system with a xi-axis, */
+/*   directed from the triangle's origin to its destination, and  */
+/*   an eta-axis, directed from its origin to its apex.           */
+/*   Calculate the xi and eta coordinates of the circumcenter.    */
+dx = circumcenter[0] - torg[0];
+dy = circumcenter[1] - torg[1];
+*xi = (REAL)(( dx * yao - xao * dy ) * ( 2.0 * denominator ));
+*eta = (REAL)(( xdo * dy - dx * ydo ) * ( 2.0 * denominator ));
+
+xad = tapex[0] - tdest[0];
+yad = tapex[1] - tdest[1];
+addist = xad * xad + yad * yad;
+if (( addist < dodist ) && ( addist < aodist )) {
+return OPPOSITEORG;
+}
+else if ( dodist < aodist ) {
+return OPPOSITEAPEX;
+}
+else {
+return OPPOSITEDEST;
+}
 }
 
 /*****************************************************************************/
@@ -11035,108 +11251,109 @@ REAL *eta;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void splittriangle( badtri )
 struct badface *badtri;
 {
-       point borg, bdest, bapex;
-       point newpoint;
-       REAL xi, eta;
-       enum insertsiteresult success;
-       enum circumcenterresult shortedge;
-       int errorflag;
-       int i;
-
-       org( badtri->badfacetri, borg );
-       dest( badtri->badfacetri, bdest );
-       apex( badtri->badfacetri, bapex );
-       /* Make sure that this triangle is still the same triangle it was      */
-       /*   when it was tested and determined to be of bad quality.           */
-       /*   Subsequent transformations may have made it a different triangle. */
-       if ( ( borg == badtri->faceorg ) && ( bdest == badtri->facedest ) &&
-                ( bapex == badtri->faceapex ) ) {
-               if ( verbose > 1 ) {
-                       printf( "  Splitting this triangle at its circumcenter:\n" );
-                       printf( "    (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", borg[0],
-                                       borg[1], bdest[0], bdest[1], bapex[0], bapex[1] );
-               }
-               errorflag = 0;
-               /* Create a new point at the triangle's circumcenter. */
-               newpoint = (point) poolalloc( &points );
-               shortedge = findcircumcenter( borg, bdest, bapex, newpoint, &xi, &eta );
-               /* Check whether the new point lies on a triangle vertex. */
-               if ( ( ( newpoint[0] == borg[0] ) && ( newpoint[1] == borg[1] ) )
-                        || ( ( newpoint[0] == bdest[0] ) && ( newpoint[1] == bdest[1] ) )
-                        || ( ( newpoint[0] == bapex[0] ) && ( newpoint[1] == bapex[1] ) ) ) {
-                       if ( !quiet ) {
-                               printf( "Warning:  New point (%.12g, %.12g) falls on existing vertex.\n"
-                                               , newpoint[0], newpoint[1] );
-                               errorflag = 1;
-                       }
-                       pointdealloc( newpoint );
-               }
-               else {
-                       for ( i = 2; i < 2 + nextras; i++ ) {
-                               /* Interpolate the point attributes at the circumcenter. */
-                               newpoint[i] = borg[i] + xi * ( bdest[i] - borg[i] )
-                                                         + eta * ( bapex[i] - borg[i] );
-                       }
-                       /* The new point must be in the interior, and have a marker of zero. */
-                       setpointmark( newpoint, 0 );
-                       /* Ensure that the handle `badtri->badfacetri' represents the shortest */
-                       /*   edge of the triangle.  This ensures that the circumcenter must    */
-                       /*   fall to the left of this edge, so point location will work.       */
-                       if ( shortedge == OPPOSITEORG ) {
-                               lnextself( badtri->badfacetri );
-                       }
-                       else if ( shortedge == OPPOSITEDEST ) {
-                               lprevself( badtri->badfacetri );
-                       }
-                       /* Insert the circumcenter, searching from the edge of the triangle, */
-                       /*   and maintain the Delaunay property of the triangulation.        */
-                       success = insertsite( newpoint, &( badtri->badfacetri ),
-                                                                 (struct edge *) NULL, 1, 1 );
-                       if ( success == SUCCESSFULPOINT ) {
-                               if ( steinerleft > 0 ) {
-                                       steinerleft--;
-                               }
-                       }
-                       else if ( success == ENCROACHINGPOINT ) {
-                               /* If the newly inserted point encroaches upon a segment, delete it. */
-                               deletesite( &( badtri->badfacetri ) );
-                       }
-                       else if ( success == VIOLATINGPOINT ) {
-                               /* Failed to insert the new point, but some segment was */
-                               /*   marked as being encroached.                        */
-                               pointdealloc( newpoint );
-                       }
-                       else {                              /* success == DUPLICATEPOINT */
-                               /* Failed to insert the new point because a vertex is already there. */
-                               if ( !quiet ) {
-                                       printf(
-                                               "Warning:  New point (%.12g, %.12g) falls on existing vertex.\n"
-                                               , newpoint[0], newpoint[1] );
-                                       errorflag = 1;
-                               }
-                               pointdealloc( newpoint );
-                       }
-               }
-               if ( errorflag ) {
-                       if ( verbose ) {
-                               printf( "  The new point is at the circumcenter of triangle\n" );
-                               printf( "    (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
-                                               borg[0], borg[1], bdest[0], bdest[1], bapex[0], bapex[1] );
-                       }
-                       printf( "This probably means that I am trying to refine triangles\n" );
-                       printf( "  to a smaller size than can be accommodated by the finite\n" );
-                       printf( "  precision of floating point arithmetic.  (You can be\n" );
-                       printf( "  sure of this if I fail to terminate.)\n" );
-                       precisionerror();
-               }
-       }
-       /* Return the bad triangle to the pool. */
-       pooldealloc( &badtriangles, (VOID *) badtri );
+point borg, bdest, bapex;
+point newpoint;
+REAL xi, eta;
+enum insertsiteresult success;
+enum circumcenterresult shortedge;
+int errorflag;
+int i;
+
+org( badtri->badfacetri, borg );
+dest( badtri->badfacetri, bdest );
+apex( badtri->badfacetri, bapex );
+/* Make sure that this triangle is still the same triangle it was      */
+/*   when it was tested and determined to be of bad quality.           */
+/*   Subsequent transformations may have made it a different triangle. */
+if (( borg == badtri->faceorg ) && ( bdest == badtri->facedest ) &&
+( bapex == badtri->faceapex )) {
+if ( verbose > 1 ) {
+printf( "  Splitting this triangle at its circumcenter:\n" );
+printf( "    (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n", borg[0],
+borg[1], bdest[0], bdest[1], bapex[0], bapex[1] );
+}
+errorflag = 0;
+/* Create a new point at the triangle's circumcenter. */
+newpoint = (point) poolalloc( &points );
+shortedge = findcircumcenter( borg, bdest, bapex, newpoint, &xi, &eta );
+/* Check whether the new point lies on a triangle vertex. */
+if ((( newpoint[0] == borg[0] ) && ( newpoint[1] == borg[1] ))
+|| (( newpoint[0] == bdest[0] ) && ( newpoint[1] == bdest[1] ))
+|| (( newpoint[0] == bapex[0] ) && ( newpoint[1] == bapex[1] ))) {
+if ( !quiet ) {
+printf( "Warning:  New point (%.12g, %.12g) falls on existing vertex.\n"
+, newpoint[0], newpoint[1] );
+errorflag = 1;
+}
+pointdealloc( newpoint );
+}
+else {
+for ( i = 2; i < 2 + nextras; i++ ) {
+/* Interpolate the point attributes at the circumcenter. */
+newpoint[i] = borg[i] + xi * ( bdest[i] - borg[i] )
++ eta * ( bapex[i] - borg[i] );
+}
+/* The new point must be in the interior, and have a marker of zero. */
+setpointmark( newpoint, 0 );
+/* Ensure that the handle `badtri->badfacetri' represents the shortest */
+/*   edge of the triangle.  This ensures that the circumcenter must    */
+/*   fall to the left of this edge, so point location will work.       */
+if ( shortedge == OPPOSITEORG ) {
+lnextself( badtri->badfacetri );
+}
+else if ( shortedge == OPPOSITEDEST ) {
+lprevself( badtri->badfacetri );
+}
+/* Insert the circumcenter, searching from the edge of the triangle, */
+/*   and maintain the Delaunay property of the triangulation.        */
+success = insertsite( newpoint, &( badtri->badfacetri ),
+(struct edge *) NULL, 1, 1 );
+if ( success == SUCCESSFULPOINT ) {
+if ( steinerleft > 0 ) {
+steinerleft--;
+}
+}
+else if ( success == ENCROACHINGPOINT ) {
+/* If the newly inserted point encroaches upon a segment, delete it. */
+deletesite( &( badtri->badfacetri ));
+}
+else if ( success == VIOLATINGPOINT ) {
+/* Failed to insert the new point, but some segment was */
+/*   marked as being encroached.                        */
+pointdealloc( newpoint );
+}
+else {                              /* success == DUPLICATEPOINT */
+/* Failed to insert the new point because a vertex is already there. */
+if ( !quiet ) {
+printf(
+"Warning:  New point (%.12g, %.12g) falls on existing vertex.\n"
+, newpoint[0], newpoint[1] );
+errorflag = 1;
+}
+pointdealloc( newpoint );
+}
+}
+if ( errorflag ) {
+if ( verbose ) {
+printf( "  The new point is at the circumcenter of triangle\n" );
+printf( "    (%.12g, %.12g) (%.12g, %.12g) (%.12g, %.12g)\n",
+borg[0], borg[1], bdest[0], bdest[1], bapex[0], bapex[1] );
+}
+printf( "This probably means that I am trying to refine triangles\n" );
+printf( "  to a smaller size than can be accommodated by the finite\n" );
+printf( "  precision of floating point arithmetic.  (You can be\n" );
+printf( "  sure of this if I fail to terminate.)\n" );
+precisionerror();
+}
+}
+/* Return the bad triangle to the pool. */
+pooldealloc( &badtriangles, (VOID *) badtri );
 }
 
 #endif /* not CDT_ONLY */
@@ -11148,83 +11365,84 @@ struct badface *badtri;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef CDT_ONLY
+#ifndef
+CDT_ONLY
 
 void enforcequality(){
-       int i;
-
-       if ( !quiet ) {
-               printf( "Adding Steiner points to enforce quality.\n" );
-       }
-       /* Initialize the pool of encroached segments. */
-       poolinit( &badsegments, sizeof( struct edge ), BADSEGMENTPERBLOCK, POINTER, 0 );
-       if ( verbose ) {
-               printf( "  Looking for encroached segments.\n" );
-       }
-       /* Test all segments to see if they're encroached. */
-       tallyencs();
-       if ( verbose && ( badsegments.items > 0 ) ) {
-               printf( "  Splitting encroached segments.\n" );
-       }
-       /* Note that steinerleft == -1 if an unlimited number */
-       /*   of Steiner points is allowed.                    */
-       while ( ( badsegments.items > 0 ) && ( steinerleft != 0 ) ) {
-               /* Fix the segments without noting newly encroached segments or   */
-               /*   bad triangles.  The reason we don't want to note newly       */
-               /*   encroached segments is because some encroached segments are  */
-               /*   likely to be noted multiple times, and would then be blindly */
-               /*   split multiple times.  I should fix that some time.          */
-               repairencs( 0 );
-               /* Now, find all the segments that became encroached while adding */
-               /*   points to split encroached segments.                         */
-               tallyencs();
-       }
-       /* At this point, if we haven't run out of Steiner points, the */
-       /*   triangulation should be (conforming) Delaunay.            */
-
-       /* Next, we worry about enforcing triangle quality. */
-       if ( ( minangle > 0.0 ) || vararea || fixedarea ) {
-               /* Initialize the pool of bad triangles. */
-               poolinit( &badtriangles, sizeof( struct badface ), BADTRIPERBLOCK, POINTER,
-                                 0 );
-               /* Initialize the queues of bad triangles. */
-               for ( i = 0; i < 64; i++ ) {
-                       queuefront[i] = (struct badface *) NULL;
-                       queuetail[i] = &queuefront[i];
-               }
-               /* Test all triangles to see if they're bad. */
-               tallyfaces();
-               if ( verbose ) {
-                       printf( "  Splitting bad triangles.\n" );
-               }
-               while ( ( badtriangles.items > 0 ) && ( steinerleft != 0 ) ) {
-                       /* Fix one bad triangle by inserting a point at its circumcenter. */
-                       splittriangle( dequeuebadtri() );
-                       /* Fix any encroached segments that may have resulted.  Record */
-                       /*   any new bad triangles or encroached segments that result. */
-                       if ( badsegments.items > 0 ) {
-                               repairencs( 1 );
-                       }
-               }
-       }
-       /* At this point, if we haven't run out of Steiner points, the */
-       /*   triangulation should be (conforming) Delaunay and have no */
-       /*   low-quality triangles.                                    */
-
-       /* Might we have run out of Steiner points too soon? */
-       if ( !quiet && ( badsegments.items > 0 ) && ( steinerleft == 0 ) ) {
-               printf( "\nWarning:  I ran out of Steiner points, but the mesh has\n" );
-               if ( badsegments.items == 1 ) {
-                       printf( "  an encroached segment, and therefore might not be truly\n" );
-               }
-               else {
-                       printf( "  %ld encroached segments, and therefore might not be truly\n",
-                                       badsegments.items );
-               }
-               printf( "  Delaunay.  If the Delaunay property is important to you,\n" );
-               printf( "  try increasing the number of Steiner points (controlled by\n" );
-               printf( "  the -S switch) slightly and try again.\n\n" );
-       }
+int i;
+
+if ( !quiet ) {
+printf( "Adding Steiner points to enforce quality.\n" );
+}
+/* Initialize the pool of encroached segments. */
+poolinit( &badsegments, sizeof( struct edge ), BADSEGMENTPERBLOCK, POINTER, 0 );
+if ( verbose ) {
+printf( "  Looking for encroached segments.\n" );
+}
+/* Test all segments to see if they're encroached. */
+tallyencs();
+if ( verbose && ( badsegments.items > 0 )) {
+printf( "  Splitting encroached segments.\n" );
+}
+/* Note that steinerleft == -1 if an unlimited number */
+/*   of Steiner points is allowed.                    */
+while (( badsegments.items > 0 ) && ( steinerleft != 0 )) {
+/* Fix the segments without noting newly encroached segments or   */
+/*   bad triangles.  The reason we don't want to note newly       */
+/*   encroached segments is because some encroached segments are  */
+/*   likely to be noted multiple times, and would then be blindly */
+/*   split multiple times.  I should fix that some time.          */
+repairencs( 0 );
+/* Now, find all the segments that became encroached while adding */
+/*   points to split encroached segments.                         */
+tallyencs();
+}
+/* At this point, if we haven't run out of Steiner points, the */
+/*   triangulation should be (conforming) Delaunay.            */
+
+/* Next, we worry about enforcing triangle quality. */
+if (( minangle > 0.0 ) || vararea || fixedarea ) {
+/* Initialize the pool of bad triangles. */
+poolinit( &badtriangles, sizeof( struct badface ), BADTRIPERBLOCK, POINTER,
+0 );
+/* Initialize the queues of bad triangles. */
+for ( i = 0; i < 64; i++ ) {
+queuefront[i] = (struct badface *) NULL;
+queuetail[i] = &queuefront[i];
+}
+/* Test all triangles to see if they're bad. */
+tallyfaces();
+if ( verbose ) {
+printf( "  Splitting bad triangles.\n" );
+}
+while (( badtriangles.items > 0 ) && ( steinerleft != 0 )) {
+/* Fix one bad triangle by inserting a point at its circumcenter. */
+splittriangle( dequeuebadtri());
+/* Fix any encroached segments that may have resulted.  Record */
+/*   any new bad triangles or encroached segments that result. */
+if ( badsegments.items > 0 ) {
+repairencs( 1 );
+}
+}
+}
+/* At this point, if we haven't run out of Steiner points, the */
+/*   triangulation should be (conforming) Delaunay and have no */
+/*   low-quality triangles.                                    */
+
+/* Might we have run out of Steiner points too soon? */
+if ( !quiet && ( badsegments.items > 0 ) && ( steinerleft == 0 )) {
+printf( "\nWarning:  I ran out of Steiner points, but the mesh has\n" );
+if ( badsegments.items == 1 ) {
+printf( "  an encroached segment, and therefore might not be truly\n" );
+}
+else {
+printf( "  %ld encroached segments, and therefore might not be truly\n",
+badsegments.items );
+}
+printf( "  Delaunay.  If the Delaunay property is important to you,\n" );
+printf( "  try increasing the number of Steiner points (controlled by\n" );
+printf( "  the -S switch) slightly and try again.\n\n" );
+}
 }
 
 #endif /* not CDT_ONLY */
@@ -11240,68 +11458,68 @@ void enforcequality(){
 /*****************************************************************************/
 
 void highorder(){
-       struct triedge triangleloop, trisym;
-       struct edge checkmark;
-       point newpoint;
-       point torg, tdest;
-       int i;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-       if ( !quiet ) {
-               printf( "Adding vertices for second-order triangles.\n" );
-       }
-       /* The following line ensures that dead items in the pool of nodes    */
-       /*   cannot be allocated for the extra nodes associated with high     */
-       /*   order elements.  This ensures that the primary nodes (at the     */
-       /*   corners of elements) will occur earlier in the output files, and */
-       /*   have lower indices, than the extra nodes.                        */
-       points.deaditemstack = (VOID *) NULL;
-
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       /* To loop over the set of edges, loop over all triangles, and look at   */
-       /*   the three edges of each triangle.  If there isn't another triangle  */
-       /*   adjacent to the edge, operate on the edge.  If there is another     */
-       /*   adjacent triangle, operate on the edge only if the current triangle */
-       /*   has a smaller pointer than its neighbor.  This way, each edge is    */
-       /*   considered only once.                                               */
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               for ( triangleloop.orient = 0; triangleloop.orient < 3;
-                         triangleloop.orient++ ) {
-                       sym( triangleloop, trisym );
-                       if ( ( triangleloop.tri < trisym.tri ) || ( trisym.tri == dummytri ) ) {
-                               org( triangleloop, torg );
-                               dest( triangleloop, tdest );
-                               /* Create a new node in the middle of the edge.  Interpolate */
-                               /*   its attributes.                                         */
-                               newpoint = (point) poolalloc( &points );
-                               for ( i = 0; i < 2 + nextras; i++ ) {
-                                       newpoint[i] = (REAL)( 0.5 * ( torg[i] + tdest[i] ) );
-                               }
-                               /* Set the new node's marker to zero or one, depending on */
-                               /*   whether it lies on a boundary.                       */
-                               setpointmark( newpoint, trisym.tri == dummytri );
-                               if ( useshelles ) {
-                                       tspivot( triangleloop, checkmark );
-                                       /* If this edge is a segment, transfer the marker to the new node. */
-                                       if ( checkmark.sh != dummysh ) {
-                                               setpointmark( newpoint, mark( checkmark ) );
-                                       }
-                               }
-                               if ( verbose > 1 ) {
-                                       printf( "  Creating (%.12g, %.12g).\n", newpoint[0], newpoint[1] );
-                               }
-                               /* Record the new node in the (one or two) adjacent elements. */
-                               triangleloop.tri[highorderindex + triangleloop.orient] =
-                                       (triangle) newpoint;
-                               if ( trisym.tri != dummytri ) {
-                                       trisym.tri[highorderindex + trisym.orient] = (triangle) newpoint;
-                               }
-                       }
-               }
-               triangleloop.tri = triangletraverse();
-       }
+struct triedge triangleloop, trisym;
+struct edge checkmark;
+point newpoint;
+point torg, tdest;
+int i;
+triangle ptr;                       /* Temporary variable used by sym(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+if ( !quiet ) {
+printf( "Adding vertices for second-order triangles.\n" );
+}
+/* The following line ensures that dead items in the pool of nodes    */
+/*   cannot be allocated for the extra nodes associated with high     */
+/*   order elements.  This ensures that the primary nodes (at the     */
+/*   corners of elements) will occur earlier in the output files, and */
+/*   have lower indices, than the extra nodes.                        */
+points.deaditemstack = (VOID *) NULL;
+
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+/* To loop over the set of edges, loop over all triangles, and look at   */
+/*   the three edges of each triangle.  If there isn't another triangle  */
+/*   adjacent to the edge, operate on the edge.  If there is another     */
+/*   adjacent triangle, operate on the edge only if the current triangle */
+/*   has a smaller pointer than its neighbor.  This way, each edge is    */
+/*   considered only once.                                               */
+while ( triangleloop.tri != (triangle *) NULL ) {
+for ( triangleloop.orient = 0; triangleloop.orient < 3;
+triangleloop.orient++ ) {
+sym( triangleloop, trisym );
+if (( triangleloop.tri < trisym.tri ) || ( trisym.tri == dummytri )) {
+org( triangleloop, torg );
+dest( triangleloop, tdest );
+/* Create a new node in the middle of the edge.  Interpolate */
+/*   its attributes.                                         */
+newpoint = (point) poolalloc( &points );
+for ( i = 0; i < 2 + nextras; i++ ) {
+newpoint[i] = (REAL)( 0.5 * ( torg[i] + tdest[i] ));
+}
+/* Set the new node's marker to zero or one, depending on */
+/*   whether it lies on a boundary.                       */
+setpointmark( newpoint, trisym.tri == dummytri );
+if ( useshelles ) {
+tspivot( triangleloop, checkmark );
+/* If this edge is a segment, transfer the marker to the new node. */
+if ( checkmark.sh != dummysh ) {
+setpointmark( newpoint, mark( checkmark ));
+}
+}
+if ( verbose > 1 ) {
+printf( "  Creating (%.12g, %.12g).\n", newpoint[0], newpoint[1] );
+}
+/* Record the new node in the (one or two) adjacent elements. */
+triangleloop.tri[highorderindex + triangleloop.orient] =
+(triangle) newpoint;
+if ( trisym.tri != dummytri ) {
+trisym.tri[highorderindex + trisym.orient] = (triangle) newpoint;
+}
+}
+}
+triangleloop.tri = triangletraverse();
+}
 }
 
 /********* File I/O routines begin here                              *********/
@@ -11317,32 +11535,33 @@ void highorder(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 
 char *readline( string, infile, infilename )
 char *string;
 FILE *infile;
 char *infilename;
 {
-       char *result;
-
-       /* Search for something that looks like a number. */
-       do {
-               result = fgets( string, INPUTLINESIZE, infile );
-               if ( result == (char *) NULL ) {
-                       printf( "  Error:  Unexpected end of file in %s.\n", infilename );
-                       exit( 1 );
-               }
-               /* Skip anything that doesn't look like a number, a comment, */
-               /*   or the end of a line.                                   */
-               while ( ( *result != '\0' ) && ( *result != '#' )
-                               && ( *result != '.' ) && ( *result != '+' ) && ( *result != '-' )
-                               && ( ( *result < '0' ) || ( *result > '9' ) ) ) {
-                       result++;
-               }
-               /* If it's a comment or end of line, read another line and try again. */
-       } while ( ( *result == '#' ) || ( *result == '\0' ) );
-       return result;
+char *result;
+
+/* Search for something that looks like a number. */
+do {
+result = fgets( string, INPUTLINESIZE, infile );
+if ( result == (char *) NULL ) {
+printf( "  Error:  Unexpected end of file in %s.\n", infilename );
+exit( 1 );
+}
+/* Skip anything that doesn't look like a number, a comment, */
+/*   or the end of a line.                                   */
+while (( *result != '\0' ) && ( *result != '#' )
+&& ( *result != '.' ) && ( *result != '+' ) && ( *result != '-' )
+&& (( *result < '0' ) || ( *result > '9' ))) {
+result++;
+}
+/* If it's a comment or end of line, read another line and try again. */
+} while (( *result == '#' ) || ( *result == '\0' ));
+return result;
 }
 
 #endif /* not TRILIBRARY */
@@ -11356,229 +11575,231 @@ char *infilename;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 
 char *findfield( string )
 char *string;
 {
-       char *result;
-
-       result = string;
-       /* Skip the current field.  Stop upon reaching whitespace. */
-       while ( ( *result != '\0' ) && ( *result != '#' )
-                       && ( *result != ' ' ) && ( *result != '\t' ) ) {
-               result++;
-       }
-       /* Now skip the whitespace and anything else that doesn't look like a */
-       /*   number, a comment, or the end of a line.                         */
-       while ( ( *result != '\0' ) && ( *result != '#' )
-                       && ( *result != '.' ) && ( *result != '+' ) && ( *result != '-' )
-                       && ( ( *result < '0' ) || ( *result > '9' ) ) ) {
-               result++;
-       }
-       /* Check for a comment (prefixed with `#'). */
-       if ( *result == '#' ) {
-               *result = '\0';
-       }
-       return result;
+char *result;
+
+result = string;
+/* Skip the current field.  Stop upon reaching whitespace. */
+while (( *result != '\0' ) && ( *result != '#' )
+&& ( *result != ' ' ) && ( *result != '\t' )) {
+result++;
+}
+/* Now skip the whitespace and anything else that doesn't look like a */
+/*   number, a comment, or the end of a line.                         */
+while (( *result != '\0' ) && ( *result != '#' )
+&& ( *result != '.' ) && ( *result != '+' ) && ( *result != '-' )
+&& (( *result < '0' ) || ( *result > '9' ))) {
+result++;
+}
+/* Check for a comment (prefixed with `#'). */
+if ( *result == '#' ) {
+*result = '\0';
+}
+return result;
 }
 
 #endif /* not TRILIBRARY */
 
-/*****************************************************************************/
-/*                                                                           */
-/*  readnodes()   Read the points from a file, which may be a .node or .poly */
-/*                file.                                                      */
-/*                                                                           */
-/*****************************************************************************/
+/*****************************************************************************/
+/*                                                                           */
+/*  readnodes()   Read the points from a file, which may be a .node or .poly */
+/*                file.                                                      */
+/*                                                                           */
+/*****************************************************************************/
+
+#ifndef
+TRILIBRARY
+
+void readnodes( nodefilename, polyfilename, polyfile )
+char *nodefilename;
+char *polyfilename;
+FILE **polyfile;
+{
+FILE *infile;
+point pointloop;
+char inputline[INPUTLINESIZE];
+char *stringptr;
+char *infilename;
+REAL x, y;
+int firstnode;
+int nodemarkers;
+int currentmarker;
+int i, j;
+
+if ( poly ) {
+/* Read the points from a .poly file. */
+if ( !quiet ) {
+printf( "Opening %s.\n", polyfilename );
+}
+*polyfile = fopen( polyfilename, "r" );
+if ( *polyfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot access file %s.\n", polyfilename );
+exit( 1 );
+}
+/* Read number of points, number of dimensions, number of point */
+/*   attributes, and number of boundary markers.                */
+stringptr = readline( inputline, *polyfile, polyfilename );
+inpoints = (int) strtol( stringptr, &stringptr, 0 );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+mesh_dim = 2;
+}
+else {
+mesh_dim = (int) strtol( stringptr, &stringptr, 0 );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+nextras = 0;
+}
+else {
+nextras = (int) strtol( stringptr, &stringptr, 0 );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+nodemarkers = 0;
+}
+else {
+nodemarkers = (int) strtol( stringptr, &stringptr, 0 );
+}
+if ( inpoints > 0 ) {
+infile = *polyfile;
+infilename = polyfilename;
+readnodefile = 0;
+}
+else {
+/* If the .poly file claims there are zero points, that means that */
+/*   the points should be read from a separate .node file.         */
+readnodefile = 1;
+infilename = innodefilename;
+}
+}
+else {
+readnodefile = 1;
+infilename = innodefilename;
+*polyfile = (FILE *) NULL;
+}
+
+if ( readnodefile ) {
+/* Read the points from a .node file. */
+if ( !quiet ) {
+printf( "Opening %s.\n", innodefilename );
+}
+infile = fopen( innodefilename, "r" );
+if ( infile == (FILE *) NULL ) {
+printf( "  Error:  Cannot access file %s.\n", innodefilename );
+exit( 1 );
+}
+/* Read number of points, number of dimensions, number of point */
+/*   attributes, and number of boundary markers.                */
+stringptr = readline( inputline, infile, innodefilename );
+inpoints = (int) strtol( stringptr, &stringptr, 0 );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+mesh_dim = 2;
+}
+else {
+mesh_dim = (int) strtol( stringptr, &stringptr, 0 );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+nextras = 0;
+}
+else {
+nextras = (int) strtol( stringptr, &stringptr, 0 );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+nodemarkers = 0;
+}
+else {
+nodemarkers = (int) strtol( stringptr, &stringptr, 0 );
+}
+}
+
+if ( inpoints < 3 ) {
+printf( "Error:  Input must have at least three input points.\n" );
+exit( 1 );
+}
+if ( mesh_dim != 2 ) {
+printf( "Error:  Triangle only works with two-dimensional meshes.\n" );
+exit( 1 );
+}
+
+initializepointpool();
 
-#ifndef TRILIBRARY
+/* Read the points. */
+for ( i = 0; i < inpoints; i++ ) {
+pointloop = (point) poolalloc( &points );
+stringptr = readline( inputline, infile, infilename );
+if ( i == 0 ) {
+firstnode = (int) strtol( stringptr, &stringptr, 0 );
+if (( firstnode == 0 ) || ( firstnode == 1 )) {
+firstnumber = firstnode;
+}
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Point %d has no x coordinate.\n", firstnumber + i );
+exit( 1 );
+}
+x = (REAL) strtod( stringptr, &stringptr );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Point %d has no y coordinate.\n", firstnumber + i );
+exit( 1 );
+}
+y = (REAL) strtod( stringptr, &stringptr );
+pointloop[0] = x;
+pointloop[1] = y;
+/* Read the point attributes. */
+for ( j = 2; j < 2 + nextras; j++ ) {
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+pointloop[j] = 0.0;
+}
+else {
+pointloop[j] = (REAL) strtod( stringptr, &stringptr );
+}
+}
+if ( nodemarkers ) {
+/* Read a point marker. */
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+setpointmark( pointloop, 0 );
+}
+else {
+currentmarker = (int) strtol( stringptr, &stringptr, 0 );
+setpointmark( pointloop, currentmarker );
+}
+}
+else {
+/* If no markers are specified in the file, they default to zero. */
+setpointmark( pointloop, 0 );
+}
+/* Determine the smallest and largest x and y coordinates. */
+if ( i == 0 ) {
+xmin = xmax = x;
+ymin = ymax = y;
+}
+else {
+xmin = ( x < xmin ) ? x : xmin;
+xmax = ( x > xmax ) ? x : xmax;
+ymin = ( y < ymin ) ? y : ymin;
+ymax = ( y > ymax ) ? y : ymax;
+}
+}
+if ( readnodefile ) {
+fclose( infile );
+}
 
-void readnodes( nodefilename, polyfilename, polyfile )
-char *nodefilename;
-char *polyfilename;
-FILE **polyfile;
-{
-       FILE *infile;
-       point pointloop;
-       char inputline[INPUTLINESIZE];
-       char *stringptr;
-       char *infilename;
-       REAL x, y;
-       int firstnode;
-       int nodemarkers;
-       int currentmarker;
-       int i, j;
-
-       if ( poly ) {
-               /* Read the points from a .poly file. */
-               if ( !quiet ) {
-                       printf( "Opening %s.\n", polyfilename );
-               }
-               *polyfile = fopen( polyfilename, "r" );
-               if ( *polyfile == (FILE *) NULL ) {
-                       printf( "  Error:  Cannot access file %s.\n", polyfilename );
-                       exit( 1 );
-               }
-               /* Read number of points, number of dimensions, number of point */
-               /*   attributes, and number of boundary markers.                */
-               stringptr = readline( inputline, *polyfile, polyfilename );
-               inpoints = (int) strtol( stringptr, &stringptr, 0 );
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       mesh_dim = 2;
-               }
-               else {
-                       mesh_dim = (int) strtol( stringptr, &stringptr, 0 );
-               }
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       nextras = 0;
-               }
-               else {
-                       nextras = (int) strtol( stringptr, &stringptr, 0 );
-               }
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       nodemarkers = 0;
-               }
-               else {
-                       nodemarkers = (int) strtol( stringptr, &stringptr, 0 );
-               }
-               if ( inpoints > 0 ) {
-                       infile = *polyfile;
-                       infilename = polyfilename;
-                       readnodefile = 0;
-               }
-               else {
-                       /* If the .poly file claims there are zero points, that means that */
-                       /*   the points should be read from a separate .node file.         */
-                       readnodefile = 1;
-                       infilename = innodefilename;
-               }
-       }
-       else {
-               readnodefile = 1;
-               infilename = innodefilename;
-               *polyfile = (FILE *) NULL;
-       }
-
-       if ( readnodefile ) {
-               /* Read the points from a .node file. */
-               if ( !quiet ) {
-                       printf( "Opening %s.\n", innodefilename );
-               }
-               infile = fopen( innodefilename, "r" );
-               if ( infile == (FILE *) NULL ) {
-                       printf( "  Error:  Cannot access file %s.\n", innodefilename );
-                       exit( 1 );
-               }
-               /* Read number of points, number of dimensions, number of point */
-               /*   attributes, and number of boundary markers.                */
-               stringptr = readline( inputline, infile, innodefilename );
-               inpoints = (int) strtol( stringptr, &stringptr, 0 );
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       mesh_dim = 2;
-               }
-               else {
-                       mesh_dim = (int) strtol( stringptr, &stringptr, 0 );
-               }
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       nextras = 0;
-               }
-               else {
-                       nextras = (int) strtol( stringptr, &stringptr, 0 );
-               }
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       nodemarkers = 0;
-               }
-               else {
-                       nodemarkers = (int) strtol( stringptr, &stringptr, 0 );
-               }
-       }
-
-       if ( inpoints < 3 ) {
-               printf( "Error:  Input must have at least three input points.\n" );
-               exit( 1 );
-       }
-       if ( mesh_dim != 2 ) {
-               printf( "Error:  Triangle only works with two-dimensional meshes.\n" );
-               exit( 1 );
-       }
-
-       initializepointpool();
-
-       /* Read the points. */
-       for ( i = 0; i < inpoints; i++ ) {
-               pointloop = (point) poolalloc( &points );
-               stringptr = readline( inputline, infile, infilename );
-               if ( i == 0 ) {
-                       firstnode = (int) strtol( stringptr, &stringptr, 0 );
-                       if ( ( firstnode == 0 ) || ( firstnode == 1 ) ) {
-                               firstnumber = firstnode;
-                       }
-               }
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       printf( "Error:  Point %d has no x coordinate.\n", firstnumber + i );
-                       exit( 1 );
-               }
-               x = (REAL) strtod( stringptr, &stringptr );
-               stringptr = findfield( stringptr );
-               if ( *stringptr == '\0' ) {
-                       printf( "Error:  Point %d has no y coordinate.\n", firstnumber + i );
-                       exit( 1 );
-               }
-               y = (REAL) strtod( stringptr, &stringptr );
-               pointloop[0] = x;
-               pointloop[1] = y;
-               /* Read the point attributes. */
-               for ( j = 2; j < 2 + nextras; j++ ) {
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               pointloop[j] = 0.0;
-                       }
-                       else {
-                               pointloop[j] = (REAL) strtod( stringptr, &stringptr );
-                       }
-               }
-               if ( nodemarkers ) {
-                       /* Read a point marker. */
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               setpointmark( pointloop, 0 );
-                       }
-                       else {
-                               currentmarker = (int) strtol( stringptr, &stringptr, 0 );
-                               setpointmark( pointloop, currentmarker );
-                       }
-               }
-               else {
-                       /* If no markers are specified in the file, they default to zero. */
-                       setpointmark( pointloop, 0 );
-               }
-               /* Determine the smallest and largest x and y coordinates. */
-               if ( i == 0 ) {
-                       xmin = xmax = x;
-                       ymin = ymax = y;
-               }
-               else {
-                       xmin = ( x < xmin ) ? x : xmin;
-                       xmax = ( x > xmax ) ? x : xmax;
-                       ymin = ( y < ymin ) ? y : ymin;
-                       ymax = ( y > ymax ) ? y : ymax;
-               }
-       }
-       if ( readnodefile ) {
-               fclose( infile );
-       }
-
-       /* Nonexistent x value used as a flag to mark circle events in sweepline */
-       /*   Delaunay algorithm.                                                 */
-       xminextreme = 10 * xmin - 9 * xmax;
+/* Nonexistent x value used as a flag to mark circle events in sweepline */
+/*   Delaunay algorithm.                                                 */
+xminextreme = 10 * xmin - 9 * xmax;
 }
 
 #endif /* not TRILIBRARY */
@@ -11589,71 +11810,72 @@ FILE **polyfile;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 void transfernodes( pointlist, pointattriblist, pointmarkerlist, numberofpoints,
-                                       numberofpointattribs )
+numberofpointattribs )
 REAL * pointlist;
 REAL *pointattriblist;
 int *pointmarkerlist;
 int numberofpoints;
 int numberofpointattribs;
 {
-       point pointloop;
-       REAL x, y;
-       int i, j;
-       int coordindex;
-       int attribindex;
-
-       inpoints = numberofpoints;
-       mesh_dim = 2;
-       nextras = numberofpointattribs;
-       readnodefile = 0;
-       if ( inpoints < 3 ) {
-               printf( "Error:  Input must have at least three input points.\n" );
-               exit( 1 );
-       }
-
-       initializepointpool();
-
-       /* Read the points. */
-       coordindex = 0;
-       attribindex = 0;
-       for ( i = 0; i < inpoints; i++ ) {
-               pointloop = (point) poolalloc( &points );
-               /* Read the point coordinates. */
-               x = pointloop[0] = pointlist[coordindex++];
-               y = pointloop[1] = pointlist[coordindex++];
-               /* Read the point attributes. */
-               for ( j = 0; j < numberofpointattribs; j++ ) {
-                       pointloop[2 + j] = pointattriblist[attribindex++];
-               }
-               if ( pointmarkerlist != (int *) NULL ) {
-                       /* Read a point marker. */
-                       setpointmark( pointloop, pointmarkerlist[i] );
-               }
-               else {
-                       /* If no markers are specified, they default to zero. */
-                       setpointmark( pointloop, 0 );
-               }
-               x = pointloop[0];
-               y = pointloop[1];
-               /* Determine the smallest and largest x and y coordinates. */
-               if ( i == 0 ) {
-                       xmin = xmax = x;
-                       ymin = ymax = y;
-               }
-               else {
-                       xmin = ( x < xmin ) ? x : xmin;
-                       xmax = ( x > xmax ) ? x : xmax;
-                       ymin = ( y < ymin ) ? y : ymin;
-                       ymax = ( y > ymax ) ? y : ymax;
-               }
-       }
-
-       /* Nonexistent x value used as a flag to mark circle events in sweepline */
-       /*   Delaunay algorithm.                                                 */
-       xminextreme = 10 * xmin - 9 * xmax;
+point pointloop;
+REAL x, y;
+int i, j;
+int coordindex;
+int attribindex;
+
+inpoints = numberofpoints;
+mesh_dim = 2;
+nextras = numberofpointattribs;
+readnodefile = 0;
+if ( inpoints < 3 ) {
+printf( "Error:  Input must have at least three input points.\n" );
+exit( 1 );
+}
+
+initializepointpool();
+
+/* Read the points. */
+coordindex = 0;
+attribindex = 0;
+for ( i = 0; i < inpoints; i++ ) {
+pointloop = (point) poolalloc( &points );
+/* Read the point coordinates. */
+x = pointloop[0] = pointlist[coordindex++];
+y = pointloop[1] = pointlist[coordindex++];
+/* Read the point attributes. */
+for ( j = 0; j < numberofpointattribs; j++ ) {
+pointloop[2 + j] = pointattriblist[attribindex++];
+}
+if ( pointmarkerlist != (int *) NULL ) {
+/* Read a point marker. */
+setpointmark( pointloop, pointmarkerlist[i] );
+}
+else {
+/* If no markers are specified, they default to zero. */
+setpointmark( pointloop, 0 );
+}
+x = pointloop[0];
+y = pointloop[1];
+/* Determine the smallest and largest x and y coordinates. */
+if ( i == 0 ) {
+xmin = xmax = x;
+ymin = ymax = y;
+}
+else {
+xmin = ( x < xmin ) ? x : xmin;
+xmax = ( x > xmax ) ? x : xmax;
+ymin = ( y < ymin ) ? y : ymin;
+ymax = ( y > ymax ) ? y : ymax;
+}
+}
+
+/* Nonexistent x value used as a flag to mark circle events in sweepline */
+/*   Delaunay algorithm.                                                 */
+xminextreme = 10 * xmin - 9 * xmax;
 }
 
 #endif /* TRILIBRARY */
@@ -11665,7 +11887,8 @@ int numberofpointattribs;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 
 void readholes( polyfile, polyfilename, hlist, holes, rlist, regions )
 FILE * polyfile;
@@ -11675,111 +11898,112 @@ int *holes;
 REAL **rlist;
 int *regions;
 {
-       REAL *holelist;
-       REAL *regionlist;
-       char inputline[INPUTLINESIZE];
-       char *stringptr;
-       int index;
-       int i;
-
-       /* Read the holes. */
-       stringptr = readline( inputline, polyfile, polyfilename );
-       *holes = (int) strtol( stringptr, &stringptr, 0 );
-       if ( *holes > 0 ) {
-               holelist = (REAL *) malloc( 2 * *holes * sizeof( REAL ) );
-               *hlist = holelist;
-               if ( holelist == (REAL *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-               for ( i = 0; i < 2 * *holes; i += 2 ) {
-                       stringptr = readline( inputline, polyfile, polyfilename );
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               printf( "Error:  Hole %d has no x coordinate.\n",
-                                               firstnumber + ( i >> 1 ) );
-                               exit( 1 );
-                       }
-                       else {
-                               holelist[i] = (REAL) strtod( stringptr, &stringptr );
-                       }
-                       stringptr = findfield( stringptr );
-                       if ( *stringptr == '\0' ) {
-                               printf( "Error:  Hole %d has no y coordinate.\n",
-                                               firstnumber + ( i >> 1 ) );
-                               exit( 1 );
-                       }
-                       else {
-                               holelist[i + 1] = (REAL) strtod( stringptr, &stringptr );
-                       }
-               }
-       }
-       else {
-               *hlist = (REAL *) NULL;
-       }
-
-#ifndef CDT_ONLY
-       if ( ( regionattrib || vararea ) && !refine ) {
-               /* Read the area constraints. */
-               stringptr = readline( inputline, polyfile, polyfilename );
-               *regions = (int) strtol( stringptr, &stringptr, 0 );
-               if ( *regions > 0 ) {
-                       regionlist = (REAL *) malloc( 4 * *regions * sizeof( REAL ) );
-                       *rlist = regionlist;
-                       if ( regionlist == (REAL *) NULL ) {
-                               printf( "Error:  Out of memory.\n" );
-                               exit( 1 );
-                       }
-                       index = 0;
-                       for ( i = 0; i < *regions; i++ ) {
-                               stringptr = readline( inputline, polyfile, polyfilename );
-                               stringptr = findfield( stringptr );
-                               if ( *stringptr == '\0' ) {
-                                       printf( "Error:  Region %d has no x coordinate.\n",
-                                                       firstnumber + i );
-                                       exit( 1 );
-                               }
-                               else {
-                                       regionlist[index++] = (REAL) strtod( stringptr, &stringptr );
-                               }
-                               stringptr = findfield( stringptr );
-                               if ( *stringptr == '\0' ) {
-                                       printf( "Error:  Region %d has no y coordinate.\n",
-                                                       firstnumber + i );
-                                       exit( 1 );
-                               }
-                               else {
-                                       regionlist[index++] = (REAL) strtod( stringptr, &stringptr );
-                               }
-                               stringptr = findfield( stringptr );
-                               if ( *stringptr == '\0' ) {
-                                       printf(
-                                               "Error:  Region %d has no region attribute or area constraint.\n",
-                                               firstnumber + i );
-                                       exit( 1 );
-                               }
-                               else {
-                                       regionlist[index++] = (REAL) strtod( stringptr, &stringptr );
-                               }
-                               stringptr = findfield( stringptr );
-                               if ( *stringptr == '\0' ) {
-                                       regionlist[index] = regionlist[index - 1];
-                               }
-                               else {
-                                       regionlist[index] = (REAL) strtod( stringptr, &stringptr );
-                               }
-                               index++;
-                       }
-               }
-       }
-       else {
-               /* Set `*regions' to zero to avoid an accidental free() later. */
-               *regions = 0;
-               *rlist = (REAL *) NULL;
-       }
+REAL *holelist;
+REAL *regionlist;
+char inputline[INPUTLINESIZE];
+char *stringptr;
+int index;
+int i;
+
+/* Read the holes. */
+stringptr = readline( inputline, polyfile, polyfilename );
+*holes = (int) strtol( stringptr, &stringptr, 0 );
+if ( *holes > 0 ) {
+holelist = (REAL *) malloc( 2 * *holes * sizeof( REAL ));
+*hlist = holelist;
+if ( holelist == (REAL *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+for ( i = 0; i < 2 * *holes; i += 2 ) {
+stringptr = readline( inputline, polyfile, polyfilename );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Hole %d has no x coordinate.\n",
+firstnumber + ( i >> 1 ));
+exit( 1 );
+}
+else {
+holelist[i] = (REAL) strtod( stringptr, &stringptr );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Hole %d has no y coordinate.\n",
+firstnumber + ( i >> 1 ));
+exit( 1 );
+}
+else {
+holelist[i + 1] = (REAL) strtod( stringptr, &stringptr );
+}
+}
+}
+else {
+*hlist = (REAL *) NULL;
+}
+
+#ifndef
+CDT_ONLY
+if (( regionattrib || vararea ) && !refine ) {
+/* Read the area constraints. */
+stringptr = readline( inputline, polyfile, polyfilename );
+*regions = (int) strtol( stringptr, &stringptr, 0 );
+if ( *regions > 0 ) {
+regionlist = (REAL *) malloc( 4 * *regions * sizeof( REAL ));
+*rlist = regionlist;
+if ( regionlist == (REAL *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+index = 0;
+for ( i = 0; i < *regions; i++ ) {
+stringptr = readline( inputline, polyfile, polyfilename );
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Region %d has no x coordinate.\n",
+firstnumber + i );
+exit( 1 );
+}
+else {
+regionlist[index++] = (REAL) strtod( stringptr, &stringptr );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf( "Error:  Region %d has no y coordinate.\n",
+firstnumber + i );
+exit( 1 );
+}
+else {
+regionlist[index++] = (REAL) strtod( stringptr, &stringptr );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+printf(
+"Error:  Region %d has no region attribute or area constraint.\n",
+firstnumber + i );
+exit( 1 );
+}
+else {
+regionlist[index++] = (REAL) strtod( stringptr, &stringptr );
+}
+stringptr = findfield( stringptr );
+if ( *stringptr == '\0' ) {
+regionlist[index] = regionlist[index - 1];
+}
+else {
+regionlist[index] = (REAL) strtod( stringptr, &stringptr );
+}
+index++;
+}
+}
+}
+else {
+/* Set `*regions' to zero to avoid an accidental free() later. */
+*regions = 0;
+*rlist = (REAL *) NULL;
+}
 #endif /* not CDT_ONLY */
 
-       fclose( polyfile );
+fclose( polyfile );
 }
 
 #endif /* not TRILIBRARY */
@@ -11791,22 +12015,23 @@ int *regions;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 
 void finishfile( outfile, argc, argv )
 FILE * outfile;
 int argc;
 char **argv;
 {
-       int i;
+int i;
 
-       fprintf( outfile, "# Generated by" );
-       for ( i = 0; i < argc; i++ ) {
-               fprintf( outfile, " " );
-               fputs( argv[i], outfile );
-       }
-       fprintf( outfile, "\n" );
-       fclose( outfile );
+fprintf( outfile, "# Generated by" );
+for ( i = 0; i < argc; i++ ) {
+fprintf( outfile, " " );
+fputs( argv[i], outfile );
+}
+fprintf( outfile, "\n" );
+fclose( outfile );
 }
 
 #endif /* not TRILIBRARY */
@@ -11820,7 +12045,8 @@ char **argv;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 void writenodes( pointlist, pointattriblist, pointmarkerlist )
 REAL * *pointlist;
@@ -11837,107 +12063,111 @@ char **argv;
 #endif /* not TRILIBRARY */
 
 {
-#ifdef TRILIBRARY
-       REAL *plist;
-       REAL *palist;
-       int *pmlist;
-       int coordindex;
-       int attribindex;
+#ifdef
+TRILIBRARY
+REAL *plist;
+REAL *palist;
+int *pmlist;
+int coordindex;
+int attribindex;
 #else /* not TRILIBRARY */
-       FILE *outfile;
+FILE *outfile;
 #endif /* not TRILIBRARY */
-       point pointloop;
-       int pointnumber;
-       int i;
-
-#ifdef TRILIBRARY
-       if ( !quiet ) {
-               printf( "Writing points.\n" );
-       }
-       /* Allocate memory for output points if necessary. */
-       if ( *pointlist == (REAL *) NULL ) {
-               *pointlist = (REAL *) malloc( points.items * 2 * sizeof( REAL ) );
-               if ( *pointlist == (REAL *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       /* Allocate memory for output point attributes if necessary. */
-       if ( ( nextras > 0 ) && ( *pointattriblist == (REAL *) NULL ) ) {
-               *pointattriblist = (REAL *) malloc( points.items * nextras * sizeof( REAL ) );
-               if ( *pointattriblist == (REAL *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       /* Allocate memory for output point markers if necessary. */
-       if ( !nobound && ( *pointmarkerlist == (int *) NULL ) ) {
-               *pointmarkerlist = (int *) malloc( points.items * sizeof( int ) );
-               if ( *pointmarkerlist == (int *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       plist = *pointlist;
-       palist = *pointattriblist;
-       pmlist = *pointmarkerlist;
-       coordindex = 0;
-       attribindex = 0;
+point pointloop;
+int pointnumber;
+int i;
+
+#ifdef
+TRILIBRARY
+if ( !quiet ) {
+printf( "Writing points.\n" );
+}
+/* Allocate memory for output points if necessary. */
+if ( *pointlist == (REAL *) NULL ) {
+*pointlist = (REAL *) malloc( points.items * 2 * sizeof( REAL ));
+if ( *pointlist == (REAL *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+/* Allocate memory for output point attributes if necessary. */
+if (( nextras > 0 ) && ( *pointattriblist == (REAL *) NULL )) {
+*pointattriblist = (REAL *) malloc( points.items * nextras * sizeof( REAL ));
+if ( *pointattriblist == (REAL *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+/* Allocate memory for output point markers if necessary. */
+if ( !nobound && ( *pointmarkerlist == (int *) NULL )) {
+*pointmarkerlist = (int *) malloc( points.items * sizeof( int ));
+if ( *pointmarkerlist == (int *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+plist = *pointlist;
+palist = *pointattriblist;
+pmlist = *pointmarkerlist;
+coordindex = 0;
+attribindex = 0;
 #else /* not TRILIBRARY */
-       if ( !quiet ) {
-               printf( "Writing %s.\n", nodefilename );
-       }
-       outfile = fopen( nodefilename, "w" );
-       if ( outfile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot create file %s.\n", nodefilename );
-               exit( 1 );
-       }
-       /* Number of points, number of dimensions, number of point attributes, */
-       /*   and number of boundary markers (zero or one).                     */
-       fprintf( outfile, "%ld  %d  %d  %d\n", points.items, mesh_dim, nextras,
-                        1 - nobound );
+if ( !quiet ) {
+printf( "Writing %s.\n", nodefilename );
+}
+outfile = fopen( nodefilename, "w" );
+if ( outfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot create file %s.\n", nodefilename );
+exit( 1 );
+}
+/* Number of points, number of dimensions, number of point attributes, */
+/*   and number of boundary markers (zero or one).                     */
+fprintf( outfile, "%ld  %d  %d  %d\n", points.items, mesh_dim, nextras,
+1 - nobound );
 #endif /* not TRILIBRARY */
 
-       traversalinit( &points );
-       pointloop = pointtraverse();
-       pointnumber = firstnumber;
-       while ( pointloop != (point) NULL ) {
-#ifdef TRILIBRARY
-               /* X and y coordinates. */
-               plist[coordindex++] = pointloop[0];
-               plist[coordindex++] = pointloop[1];
-               /* Point attributes. */
-               for ( i = 0; i < nextras; i++ ) {
-                       palist[attribindex++] = pointloop[2 + i];
-               }
-               if ( !nobound ) {
-                       /* Copy the boundary marker. */
-                       pmlist[pointnumber - firstnumber] = pointmark( pointloop );
-               }
+traversalinit( &points );
+pointloop = pointtraverse();
+pointnumber = firstnumber;
+while ( pointloop != (point) NULL ) {
+#ifdef
+TRILIBRARY
+/* X and y coordinates. */
+plist[coordindex++] = pointloop[0];
+plist[coordindex++] = pointloop[1];
+/* Point attributes. */
+for ( i = 0; i < nextras; i++ ) {
+palist[attribindex++] = pointloop[2 + i];
+}
+if ( !nobound ) {
+/* Copy the boundary marker. */
+pmlist[pointnumber - firstnumber] = pointmark( pointloop );
+}
 #else /* not TRILIBRARY */
-               /* Point number, x and y coordinates. */
-               fprintf( outfile, "%4d    %.17g  %.17g", pointnumber, pointloop[0],
-                                pointloop[1] );
-               for ( i = 0; i < nextras; i++ ) {
-                       /* Write an attribute. */
-                       fprintf( outfile, "  %.17g", pointloop[i + 2] );
-               }
-               if ( nobound ) {
-                       fprintf( outfile, "\n" );
-               }
-               else {
-                       /* Write the boundary marker. */
-                       fprintf( outfile, "    %d\n", pointmark( pointloop ) );
-               }
+/* Point number, x and y coordinates. */
+fprintf( outfile, "%4d    %.17g  %.17g", pointnumber, pointloop[0],
+pointloop[1] );
+for ( i = 0; i < nextras; i++ ) {
+/* Write an attribute. */
+fprintf( outfile, "  %.17g", pointloop[i + 2] );
+}
+if ( nobound ) {
+fprintf( outfile, "\n" );
+}
+else {
+/* Write the boundary marker. */
+fprintf( outfile, "    %d\n", pointmark( pointloop ));
+}
 #endif /* not TRILIBRARY */
 
-               setpointmark( pointloop, pointnumber );
-               pointloop = pointtraverse();
-               pointnumber++;
-       }
+setpointmark( pointloop, pointnumber );
+pointloop = pointtraverse();
+pointnumber++;
+}
 
-#ifndef TRILIBRARY
-       finishfile( outfile, argc, argv );
+#ifndef
+TRILIBRARY
+finishfile( outfile, argc, argv );
 #endif /* not TRILIBRARY */
 }
 
@@ -11952,17 +12182,17 @@ char **argv;
 /*****************************************************************************/
 
 void numbernodes(){
-       point pointloop;
-       int pointnumber;
-
-       traversalinit( &points );
-       pointloop = pointtraverse();
-       pointnumber = firstnumber;
-       while ( pointloop != (point) NULL ) {
-               setpointmark( pointloop, pointnumber );
-               pointloop = pointtraverse();
-               pointnumber++;
-       }
+point pointloop;
+int pointnumber;
+
+traversalinit( &points );
+pointloop = pointtraverse();
+pointnumber = firstnumber;
+while ( pointloop != (point) NULL ) {
+setpointmark( pointloop, pointnumber );
+pointloop = pointtraverse();
+pointnumber++;
+}
 }
 
 /*****************************************************************************/
@@ -11971,7 +12201,8 @@ void numbernodes(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 void writeelements( trianglelist, triangleattriblist )
 int **trianglelist;
@@ -11987,115 +12218,121 @@ char **argv;
 #endif /* not TRILIBRARY */
 
 {
-#ifdef TRILIBRARY
-       int *tlist;
-       REAL *talist;
-       int pointindex;
-       int attribindex;
+#ifdef
+TRILIBRARY
+int *tlist;
+REAL *talist;
+int pointindex;
+int attribindex;
 #else /* not TRILIBRARY */
-       FILE *outfile;
+FILE *outfile;
 #endif /* not TRILIBRARY */
-       struct triedge triangleloop;
-       point p1, p2, p3;
-       point mid1, mid2, mid3;
-       int elementnumber;
-       int i;
-
-#ifdef TRILIBRARY
-       if ( !quiet ) {
-               printf( "Writing triangles.\n" );
-       }
-       /* Allocate memory for output triangles if necessary. */
-       if ( *trianglelist == (int *) NULL ) {
-               *trianglelist = (int *) malloc( triangles.items *
-                                                                               ( ( order + 1 ) * ( order + 2 ) / 2 ) * sizeof( int ) );
-               if ( *trianglelist == (int *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       /* Allocate memory for output triangle attributes if necessary. */
-       if ( ( eextras > 0 ) && ( *triangleattriblist == (REAL *) NULL ) ) {
-               *triangleattriblist = (REAL *) malloc( triangles.items * eextras *
-                                                                                          sizeof( REAL ) );
-               if ( *triangleattriblist == (REAL *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       tlist = *trianglelist;
-       talist = *triangleattriblist;
-       pointindex = 0;
-       attribindex = 0;
+struct triedge triangleloop;
+point p1, p2, p3;
+point mid1, mid2, mid3;
+int elementnumber;
+int i;
+
+#ifdef
+TRILIBRARY
+if ( !quiet ) {
+printf( "Writing triangles.\n" );
+}
+/* Allocate memory for output triangles if necessary. */
+if ( *trianglelist == (int *) NULL ) {
+*trianglelist = (int *) malloc( triangles.items *
+(( order + 1 ) * ( order + 2 ) / 2 ) * sizeof( int ));
+if ( *trianglelist == (int *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+/* Allocate memory for output triangle attributes if necessary. */
+if (( eextras > 0 ) && ( *triangleattriblist == (REAL *) NULL )) {
+*triangleattriblist = (REAL *) malloc( triangles.items * eextras *
+sizeof( REAL ));
+if ( *triangleattriblist == (REAL *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+tlist = *trianglelist;
+talist = *triangleattriblist;
+pointindex = 0;
+attribindex = 0;
 #else /* not TRILIBRARY */
-       if ( !quiet ) {
-               printf( "Writing %s.\n", elefilename );
-       }
-       outfile = fopen( elefilename, "w" );
-       if ( outfile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot create file %s.\n", elefilename );
-               exit( 1 );
-       }
-       /* Number of triangles, points per triangle, attributes per triangle. */
-       fprintf( outfile, "%ld  %d  %d\n", triangles.items,
-                        ( order + 1 ) * ( order + 2 ) / 2, eextras );
+if ( !quiet ) {
+printf( "Writing %s.\n", elefilename );
+}
+outfile = fopen( elefilename, "w" );
+if ( outfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot create file %s.\n", elefilename );
+exit( 1 );
+}
+/* Number of triangles, points per triangle, attributes per triangle. */
+fprintf( outfile, "%ld  %d  %d\n", triangles.items,
+( order + 1 ) * ( order + 2 ) / 2, eextras );
 #endif /* not TRILIBRARY */
 
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       triangleloop.orient = 0;
-       elementnumber = firstnumber;
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               org( triangleloop, p1 );
-               dest( triangleloop, p2 );
-               apex( triangleloop, p3 );
-               if ( order == 1 ) {
-#ifdef TRILIBRARY
-                       tlist[pointindex++] = pointmark( p1 );
-                       tlist[pointindex++] = pointmark( p2 );
-                       tlist[pointindex++] = pointmark( p3 );
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+triangleloop.orient = 0;
+elementnumber = firstnumber;
+while ( triangleloop.tri != (triangle *) NULL ) {
+org( triangleloop, p1 );
+dest( triangleloop, p2 );
+apex( triangleloop, p3 );
+if ( order == 1 ) {
+#ifdef
+TRILIBRARY
+tlist[pointindex++] = pointmark( p1 );
+tlist[pointindex++] = pointmark( p2 );
+tlist[pointindex++] = pointmark( p3 );
 #else /* not TRILIBRARY */
-                       /* Triangle number, indices for three points. */
-                       fprintf( outfile, "%4d    %4d  %4d  %4d", elementnumber,
-                                        pointmark( p1 ), pointmark( p2 ), pointmark( p3 ) );
+/* Triangle number, indices for three points. */
+fprintf( outfile, "%4d    %4d  %4d  %4d", elementnumber,
+pointmark( p1 ), pointmark( p2 ), pointmark( p3 ));
 #endif /* not TRILIBRARY */
-               }
-               else {
-                       mid1 = (point) triangleloop.tri[highorderindex + 1];
-                       mid2 = (point) triangleloop.tri[highorderindex + 2];
-                       mid3 = (point) triangleloop.tri[highorderindex];
-#ifdef TRILIBRARY
-                       tlist[pointindex++] = pointmark( p1 );
-                       tlist[pointindex++] = pointmark( p2 );
-                       tlist[pointindex++] = pointmark( p3 );
-                       tlist[pointindex++] = pointmark( mid1 );
-                       tlist[pointindex++] = pointmark( mid2 );
-                       tlist[pointindex++] = pointmark( mid3 );
+}
+else {
+mid1 = (point) triangleloop.tri[highorderindex + 1];
+mid2 = (point) triangleloop.tri[highorderindex + 2];
+mid3 = (point) triangleloop.tri[highorderindex];
+#ifdef
+TRILIBRARY
+tlist[pointindex++] = pointmark( p1 );
+tlist[pointindex++] = pointmark( p2 );
+tlist[pointindex++] = pointmark( p3 );
+tlist[pointindex++] = pointmark( mid1 );
+tlist[pointindex++] = pointmark( mid2 );
+tlist[pointindex++] = pointmark( mid3 );
 #else /* not TRILIBRARY */
-                       /* Triangle number, indices for six points. */
-                       fprintf( outfile, "%4d    %4d  %4d  %4d  %4d  %4d  %4d", elementnumber,
-                                        pointmark( p1 ), pointmark( p2 ), pointmark( p3 ), pointmark( mid1 ),
-                                        pointmark( mid2 ), pointmark( mid3 ) );
+/* Triangle number, indices for six points. */
+fprintf( outfile, "%4d    %4d  %4d  %4d  %4d  %4d  %4d", elementnumber,
+pointmark( p1 ), pointmark( p2 ), pointmark( p3 ), pointmark( mid1 ),
+pointmark( mid2 ), pointmark( mid3 ));
 #endif /* not TRILIBRARY */
-               }
+}
 
-#ifdef TRILIBRARY
-               for ( i = 0; i < eextras; i++ ) {
-                       talist[attribindex++] = elemattribute( triangleloop, i );
-               }
+#ifdef
+TRILIBRARY
+for ( i = 0; i < eextras; i++ ) {
+talist[attribindex++] = elemattribute( triangleloop, i );
+}
 #else /* not TRILIBRARY */
-               for ( i = 0; i < eextras; i++ ) {
-                       fprintf( outfile, "  %.17g", elemattribute( triangleloop, i ) );
-               }
-               fprintf( outfile, "\n" );
+for ( i = 0; i < eextras; i++ ) {
+fprintf( outfile, "  %.17g", elemattribute( triangleloop, i ));
+}
+fprintf( outfile, "\n" );
 #endif /* not TRILIBRARY */
 
-               triangleloop.tri = triangletraverse();
-               elementnumber++;
-       }
+triangleloop.tri = triangletraverse();
+elementnumber++;
+}
 
-#ifndef TRILIBRARY
-       finishfile( outfile, argc, argv );
+#ifndef
+TRILIBRARY
+finishfile( outfile, argc, argv );
 #endif /* not TRILIBRARY */
 }
 
@@ -12105,7 +12342,8 @@ char **argv;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 void writepoly( segmentlist, segmentmarkerlist )
 int **segmentlist;
@@ -12125,111 +12363,116 @@ char **argv;
 #endif /* not TRILIBRARY */
 
 {
-#ifdef TRILIBRARY
-       int *slist;
-       int *smlist;
-       int index;
+#ifdef
+TRILIBRARY
+int *slist;
+int *smlist;
+int index;
 #else /* not TRILIBRARY */
-       FILE *outfile;
-       int i;
+FILE *outfile;
+int i;
 #endif /* not TRILIBRARY */
-       struct edge shelleloop;
-       point endpoint1, endpoint2;
-       int shellenumber;
-
-#ifdef TRILIBRARY
-       if ( !quiet ) {
-               printf( "Writing segments.\n" );
-       }
-       /* Allocate memory for output segments if necessary. */
-       if ( *segmentlist == (int *) NULL ) {
-               *segmentlist = (int *) malloc( shelles.items * 2 * sizeof( int ) );
-               if ( *segmentlist == (int *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       /* Allocate memory for output segment markers if necessary. */
-       if ( !nobound && ( *segmentmarkerlist == (int *) NULL ) ) {
-               *segmentmarkerlist = (int *) malloc( shelles.items * sizeof( int ) );
-               if ( *segmentmarkerlist == (int *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       slist = *segmentlist;
-       smlist = *segmentmarkerlist;
-       index = 0;
+struct edge shelleloop;
+point endpoint1, endpoint2;
+int shellenumber;
+
+#ifdef
+TRILIBRARY
+if ( !quiet ) {
+printf( "Writing segments.\n" );
+}
+/* Allocate memory for output segments if necessary. */
+if ( *segmentlist == (int *) NULL ) {
+*segmentlist = (int *) malloc( shelles.items * 2 * sizeof( int ));
+if ( *segmentlist == (int *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+/* Allocate memory for output segment markers if necessary. */
+if ( !nobound && ( *segmentmarkerlist == (int *) NULL )) {
+*segmentmarkerlist = (int *) malloc( shelles.items * sizeof( int ));
+if ( *segmentmarkerlist == (int *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+slist = *segmentlist;
+smlist = *segmentmarkerlist;
+index = 0;
 #else /* not TRILIBRARY */
-       if ( !quiet ) {
-               printf( "Writing %s.\n", polyfilename );
-       }
-       outfile = fopen( polyfilename, "w" );
-       if ( outfile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot create file %s.\n", polyfilename );
-               exit( 1 );
-       }
-       /* The zero indicates that the points are in a separate .node file. */
-       /*   Followed by number of dimensions, number of point attributes,  */
-       /*   and number of boundary markers (zero or one).                  */
-       fprintf( outfile, "%d  %d  %d  %d\n", 0, mesh_dim, nextras, 1 - nobound );
-       /* Number of segments, number of boundary markers (zero or one). */
-       fprintf( outfile, "%ld  %d\n", shelles.items, 1 - nobound );
+if ( !quiet ) {
+printf( "Writing %s.\n", polyfilename );
+}
+outfile = fopen( polyfilename, "w" );
+if ( outfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot create file %s.\n", polyfilename );
+exit( 1 );
+}
+/* The zero indicates that the points are in a separate .node file. */
+/*   Followed by number of dimensions, number of point attributes,  */
+/*   and number of boundary markers (zero or one).                  */
+fprintf( outfile, "%d  %d  %d  %d\n", 0, mesh_dim, nextras, 1 - nobound );
+/* Number of segments, number of boundary markers (zero or one). */
+fprintf( outfile, "%ld  %d\n", shelles.items, 1 - nobound );
 #endif /* not TRILIBRARY */
 
-       traversalinit( &shelles );
-       shelleloop.sh = shelletraverse();
-       shelleloop.shorient = 0;
-       shellenumber = firstnumber;
-       while ( shelleloop.sh != (shelle *) NULL ) {
-               sorg( shelleloop, endpoint1 );
-               sdest( shelleloop, endpoint2 );
-#ifdef TRILIBRARY
-               /* Copy indices of the segment's two endpoints. */
-               slist[index++] = pointmark( endpoint1 );
-               slist[index++] = pointmark( endpoint2 );
-               if ( !nobound ) {
-                       /* Copy the boundary marker. */
-                       smlist[shellenumber - firstnumber] = mark( shelleloop );
-               }
+traversalinit( &shelles );
+shelleloop.sh = shelletraverse();
+shelleloop.shorient = 0;
+shellenumber = firstnumber;
+while ( shelleloop.sh != (shelle *) NULL ) {
+sorg( shelleloop, endpoint1 );
+sdest( shelleloop, endpoint2 );
+#ifdef
+TRILIBRARY
+/* Copy indices of the segment's two endpoints. */
+slist[index++] = pointmark( endpoint1 );
+slist[index++] = pointmark( endpoint2 );
+if ( !nobound ) {
+/* Copy the boundary marker. */
+smlist[shellenumber - firstnumber] = mark( shelleloop );
+}
 #else /* not TRILIBRARY */
-               /* Segment number, indices of its two endpoints, and possibly a marker. */
-               if ( nobound ) {
-                       fprintf( outfile, "%4d    %4d  %4d\n", shellenumber,
-                                        pointmark( endpoint1 ), pointmark( endpoint2 ) );
-               }
-               else {
-                       fprintf( outfile, "%4d    %4d  %4d    %4d\n", shellenumber,
-                                        pointmark( endpoint1 ), pointmark( endpoint2 ), mark( shelleloop ) );
-               }
+/* Segment number, indices of its two endpoints, and possibly a marker. */
+if ( nobound ) {
+fprintf( outfile, "%4d    %4d  %4d\n", shellenumber,
+pointmark( endpoint1 ), pointmark( endpoint2 ));
+}
+else {
+fprintf( outfile, "%4d    %4d  %4d    %4d\n", shellenumber,
+pointmark( endpoint1 ), pointmark( endpoint2 ), mark( shelleloop ));
+}
 #endif /* not TRILIBRARY */
 
-               shelleloop.sh = shelletraverse();
-               shellenumber++;
-       }
-
-#ifndef TRILIBRARY
-#ifndef CDT_ONLY
-       fprintf( outfile, "%d\n", holes );
-       if ( holes > 0 ) {
-               for ( i = 0; i < holes; i++ ) {
-                       /* Hole number, x and y coordinates. */
-                       fprintf( outfile, "%4d   %.17g  %.17g\n", firstnumber + i,
-                                        holelist[2 * i], holelist[2 * i + 1] );
-               }
-       }
-       if ( regions > 0 ) {
-               fprintf( outfile, "%d\n", regions );
-               for ( i = 0; i < regions; i++ ) {
-                       /* Region number, x and y coordinates, attribute, maximum area. */
-                       fprintf( outfile, "%4d   %.17g  %.17g  %.17g  %.17g\n", firstnumber + i,
-                                        regionlist[4 * i], regionlist[4 * i + 1],
-                                        regionlist[4 * i + 2], regionlist[4 * i + 3] );
-               }
-       }
+shelleloop.sh = shelletraverse();
+shellenumber++;
+}
+
+#ifndef
+TRILIBRARY
+#ifndef
+CDT_ONLY
+fprintf( outfile, "%d\n", holes );
+if ( holes > 0 ) {
+for ( i = 0; i < holes; i++ ) {
+/* Hole number, x and y coordinates. */
+fprintf( outfile, "%4d   %.17g  %.17g\n", firstnumber + i,
+holelist[2 * i], holelist[2 * i + 1] );
+}
+}
+if ( regions > 0 ) {
+fprintf( outfile, "%d\n", regions );
+for ( i = 0; i < regions; i++ ) {
+/* Region number, x and y coordinates, attribute, maximum area. */
+fprintf( outfile, "%4d   %.17g  %.17g  %.17g  %.17g\n", firstnumber + i,
+regionlist[4 * i], regionlist[4 * i + 1],
+regionlist[4 * i + 2], regionlist[4 * i + 3] );
+}
+}
 #endif /* not CDT_ONLY */
 
-       finishfile( outfile, argc, argv );
+finishfile( outfile, argc, argv );
 #endif /* not TRILIBRARY */
 }
 
@@ -12239,7 +12482,8 @@ char **argv;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 void writeedges( edgelist, edgemarkerlist )
 int **edgelist;
@@ -12255,122 +12499,130 @@ char **argv;
 #endif /* not TRILIBRARY */
 
 {
-#ifdef TRILIBRARY
-       int *elist;
-       int *emlist;
-       int index;
+#ifdef
+TRILIBRARY
+int *elist;
+int *emlist;
+int index;
 #else /* not TRILIBRARY */
-       FILE *outfile;
+FILE *outfile;
 #endif /* not TRILIBRARY */
-       struct triedge triangleloop, trisym;
-       struct edge checkmark;
-       point p1, p2;
-       int edgenumber;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-       shelle sptr;                    /* Temporary variable used by tspivot(). */
-
-#ifdef TRILIBRARY
-       if ( !quiet ) {
-               printf( "Writing edges.\n" );
-       }
-       /* Allocate memory for edges if necessary. */
-       if ( *edgelist == (int *) NULL ) {
-               *edgelist = (int *) malloc( edges * 2 * sizeof( int ) );
-               if ( *edgelist == (int *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       /* Allocate memory for edge markers if necessary. */
-       if ( !nobound && ( *edgemarkerlist == (int *) NULL ) ) {
-               *edgemarkerlist = (int *) malloc( edges * sizeof( int ) );
-               if ( *edgemarkerlist == (int *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       elist = *edgelist;
-       emlist = *edgemarkerlist;
-       index = 0;
+struct triedge triangleloop, trisym;
+struct edge checkmark;
+point p1, p2;
+int edgenumber;
+triangle ptr;                       /* Temporary variable used by sym(). */
+shelle sptr;                    /* Temporary variable used by tspivot(). */
+
+#ifdef
+TRILIBRARY
+if ( !quiet ) {
+printf( "Writing edges.\n" );
+}
+/* Allocate memory for edges if necessary. */
+if ( *edgelist == (int *) NULL ) {
+*edgelist = (int *) malloc( edges * 2 * sizeof( int ));
+if ( *edgelist == (int *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+/* Allocate memory for edge markers if necessary. */
+if ( !nobound && ( *edgemarkerlist == (int *) NULL )) {
+*edgemarkerlist = (int *) malloc( edges * sizeof( int ));
+if ( *edgemarkerlist == (int *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+elist = *edgelist;
+emlist = *edgemarkerlist;
+index = 0;
 #else /* not TRILIBRARY */
-       if ( !quiet ) {
-               printf( "Writing %s.\n", edgefilename );
-       }
-       outfile = fopen( edgefilename, "w" );
-       if ( outfile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot create file %s.\n", edgefilename );
-               exit( 1 );
-       }
-       /* Number of edges, number of boundary markers (zero or one). */
-       fprintf( outfile, "%ld  %d\n", edges, 1 - nobound );
+if ( !quiet ) {
+printf( "Writing %s.\n", edgefilename );
+}
+outfile = fopen( edgefilename, "w" );
+if ( outfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot create file %s.\n", edgefilename );
+exit( 1 );
+}
+/* Number of edges, number of boundary markers (zero or one). */
+fprintf( outfile, "%ld  %d\n", edges, 1 - nobound );
 #endif /* not TRILIBRARY */
 
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       edgenumber = firstnumber;
-       /* To loop over the set of edges, loop over all triangles, and look at   */
-       /*   the three edges of each triangle.  If there isn't another triangle  */
-       /*   adjacent to the edge, operate on the edge.  If there is another     */
-       /*   adjacent triangle, operate on the edge only if the current triangle */
-       /*   has a smaller pointer than its neighbor.  This way, each edge is    */
-       /*   considered only once.                                               */
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               for ( triangleloop.orient = 0; triangleloop.orient < 3;
-                         triangleloop.orient++ ) {
-                       sym( triangleloop, trisym );
-                       if ( ( triangleloop.tri < trisym.tri ) || ( trisym.tri == dummytri ) ) {
-                               org( triangleloop, p1 );
-                               dest( triangleloop, p2 );
-#ifdef TRILIBRARY
-                               elist[index++] = pointmark( p1 );
-                               elist[index++] = pointmark( p2 );
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+edgenumber = firstnumber;
+/* To loop over the set of edges, loop over all triangles, and look at   */
+/*   the three edges of each triangle.  If there isn't another triangle  */
+/*   adjacent to the edge, operate on the edge.  If there is another     */
+/*   adjacent triangle, operate on the edge only if the current triangle */
+/*   has a smaller pointer than its neighbor.  This way, each edge is    */
+/*   considered only once.                                               */
+while ( triangleloop.tri != (triangle *) NULL ) {
+for ( triangleloop.orient = 0; triangleloop.orient < 3;
+triangleloop.orient++ ) {
+sym( triangleloop, trisym );
+if (( triangleloop.tri < trisym.tri ) || ( trisym.tri == dummytri )) {
+org( triangleloop, p1 );
+dest( triangleloop, p2 );
+#ifdef
+TRILIBRARY
+elist[index++] = pointmark( p1 );
+elist[index++] = pointmark( p2 );
 #endif /* TRILIBRARY */
-                               if ( nobound ) {
-#ifndef TRILIBRARY
-                                       /* Edge number, indices of two endpoints. */
-                                       fprintf( outfile, "%4d   %d  %d\n", edgenumber,
-                                                        pointmark( p1 ), pointmark( p2 ) );
+if ( nobound ) {
+#ifndef
+TRILIBRARY
+/* Edge number, indices of two endpoints. */
+fprintf( outfile, "%4d   %d  %d\n", edgenumber,
+pointmark( p1 ), pointmark( p2 ));
 #endif /* not TRILIBRARY */
-                               }
-                               else {
-                                       /* Edge number, indices of two endpoints, and a boundary marker. */
-                                       /*   If there's no shell edge, the boundary marker is zero.      */
-                                       if ( useshelles ) {
-                                               tspivot( triangleloop, checkmark );
-                                               if ( checkmark.sh == dummysh ) {
-#ifdef TRILIBRARY
-                                                       emlist[edgenumber - firstnumber] = 0;
+}
+else {
+/* Edge number, indices of two endpoints, and a boundary marker. */
+/*   If there's no shell edge, the boundary marker is zero.      */
+if ( useshelles ) {
+tspivot( triangleloop, checkmark );
+if ( checkmark.sh == dummysh ) {
+#ifdef
+TRILIBRARY
+emlist[edgenumber - firstnumber] = 0;
 #else /* not TRILIBRARY */
-                                                       fprintf( outfile, "%4d   %d  %d  %d\n", edgenumber,
-                                                                        pointmark( p1 ), pointmark( p2 ), 0 );
+fprintf( outfile, "%4d   %d  %d  %d\n", edgenumber,
+pointmark( p1 ), pointmark( p2 ), 0 );
 #endif /* not TRILIBRARY */
-                                               }
-                                               else {
-#ifdef TRILIBRARY
-                                                       emlist[edgenumber - firstnumber] = mark( checkmark );
+}
+else {
+#ifdef
+TRILIBRARY
+emlist[edgenumber - firstnumber] = mark( checkmark );
 #else /* not TRILIBRARY */
-                                                       fprintf( outfile, "%4d   %d  %d  %d\n", edgenumber,
-                                                                        pointmark( p1 ), pointmark( p2 ), mark( checkmark ) );
+fprintf( outfile, "%4d   %d  %d  %d\n", edgenumber,
+pointmark( p1 ), pointmark( p2 ), mark( checkmark ));
 #endif /* not TRILIBRARY */
-                                               }
-                                       }
-                                       else {
-#ifdef TRILIBRARY
-                                               emlist[edgenumber - firstnumber] = trisym.tri == dummytri;
+}
+}
+else {
+#ifdef
+TRILIBRARY
+emlist[edgenumber - firstnumber] = trisym.tri == dummytri;
 #else /* not TRILIBRARY */
-                                               fprintf( outfile, "%4d   %d  %d  %d\n", edgenumber,
-                                                                pointmark( p1 ), pointmark( p2 ), trisym.tri == dummytri );
+fprintf( outfile, "%4d   %d  %d  %d\n", edgenumber,
+pointmark( p1 ), pointmark( p2 ), trisym.tri == dummytri );
 #endif /* not TRILIBRARY */
-                                       }
-                               }
-                               edgenumber++;
-                       }
-               }
-               triangleloop.tri = triangletraverse();
-       }
-
-#ifndef TRILIBRARY
-       finishfile( outfile, argc, argv );
+}
+}
+edgenumber++;
+}
+}
+triangleloop.tri = triangletraverse();
+}
+
+#ifndef
+TRILIBRARY
+finishfile( outfile, argc, argv );
 #endif /* not TRILIBRARY */
 }
 
@@ -12390,10 +12642,11 @@ char **argv;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 void writevoronoi( vpointlist, vpointattriblist, vpointmarkerlist, vedgelist,
-                                  vedgemarkerlist, vnormlist )
+vedgemarkerlist, vnormlist )
 REAL * *vpointlist;
 REAL **vpointattriblist;
 int **vpointmarkerlist;
@@ -12412,199 +12665,208 @@ char **argv;
 #endif /* not TRILIBRARY */
 
 {
-#ifdef TRILIBRARY
-       REAL *plist;
-       REAL *palist;
-       int *elist;
-       REAL *normlist;
-       int coordindex;
-       int attribindex;
+#ifdef
+TRILIBRARY
+REAL *plist;
+REAL *palist;
+int *elist;
+REAL *normlist;
+int coordindex;
+int attribindex;
 #else /* not TRILIBRARY */
-       FILE *outfile;
+FILE *outfile;
 #endif /* not TRILIBRARY */
-       struct triedge triangleloop, trisym;
-       point torg, tdest, tapex;
-       REAL circumcenter[2];
-       REAL xi, eta;
-       int vnodenumber, vedgenumber;
-       int p1, p2;
-       int i;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-#ifdef TRILIBRARY
-       if ( !quiet ) {
-               printf( "Writing Voronoi vertices.\n" );
-       }
-       /* Allocate memory for Voronoi vertices if necessary. */
-       if ( *vpointlist == (REAL *) NULL ) {
-               *vpointlist = (REAL *) malloc( triangles.items * 2 * sizeof( REAL ) );
-               if ( *vpointlist == (REAL *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       /* Allocate memory for Voronoi vertex attributes if necessary. */
-       if ( *vpointattriblist == (REAL *) NULL ) {
-               *vpointattriblist = (REAL *) malloc( triangles.items * nextras *
-                                                                                        sizeof( REAL ) );
-               if ( *vpointattriblist == (REAL *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       *vpointmarkerlist = (int *) NULL;
-       plist = *vpointlist;
-       palist = *vpointattriblist;
-       coordindex = 0;
-       attribindex = 0;
+struct triedge triangleloop, trisym;
+point torg, tdest, tapex;
+REAL circumcenter[2];
+REAL xi, eta;
+int vnodenumber, vedgenumber;
+int p1, p2;
+int i;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+#ifdef
+TRILIBRARY
+if ( !quiet ) {
+printf( "Writing Voronoi vertices.\n" );
+}
+/* Allocate memory for Voronoi vertices if necessary. */
+if ( *vpointlist == (REAL *) NULL ) {
+*vpointlist = (REAL *) malloc( triangles.items * 2 * sizeof( REAL ));
+if ( *vpointlist == (REAL *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+/* Allocate memory for Voronoi vertex attributes if necessary. */
+if ( *vpointattriblist == (REAL *) NULL ) {
+*vpointattriblist = (REAL *) malloc( triangles.items * nextras *
+sizeof( REAL ));
+if ( *vpointattriblist == (REAL *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+*vpointmarkerlist = (int *) NULL;
+plist = *vpointlist;
+palist = *vpointattriblist;
+coordindex = 0;
+attribindex = 0;
 #else /* not TRILIBRARY */
-       if ( !quiet ) {
-               printf( "Writing %s.\n", vnodefilename );
-       }
-       outfile = fopen( vnodefilename, "w" );
-       if ( outfile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot create file %s.\n", vnodefilename );
-               exit( 1 );
-       }
-       /* Number of triangles, two dimensions, number of point attributes, */
-       /*   zero markers.                                                  */
-       fprintf( outfile, "%ld  %d  %d  %d\n", triangles.items, 2, nextras, 0 );
+if ( !quiet ) {
+printf( "Writing %s.\n", vnodefilename );
+}
+outfile = fopen( vnodefilename, "w" );
+if ( outfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot create file %s.\n", vnodefilename );
+exit( 1 );
+}
+/* Number of triangles, two dimensions, number of point attributes, */
+/*   zero markers.                                                  */
+fprintf( outfile, "%ld  %d  %d  %d\n", triangles.items, 2, nextras, 0 );
 #endif /* not TRILIBRARY */
 
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       triangleloop.orient = 0;
-       vnodenumber = firstnumber;
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               org( triangleloop, torg );
-               dest( triangleloop, tdest );
-               apex( triangleloop, tapex );
-               findcircumcenter( torg, tdest, tapex, circumcenter, &xi, &eta );
-#ifdef TRILIBRARY
-               /* X and y coordinates. */
-               plist[coordindex++] = circumcenter[0];
-               plist[coordindex++] = circumcenter[1];
-               for ( i = 2; i < 2 + nextras; i++ ) {
-                       /* Interpolate the point attributes at the circumcenter. */
-                       palist[attribindex++] = torg[i] + xi * ( tdest[i] - torg[i] )
-                                                                       + eta * ( tapex[i] - torg[i] );
-               }
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+triangleloop.orient = 0;
+vnodenumber = firstnumber;
+while ( triangleloop.tri != (triangle *) NULL ) {
+org( triangleloop, torg );
+dest( triangleloop, tdest );
+apex( triangleloop, tapex );
+findcircumcenter( torg, tdest, tapex, circumcenter, &xi, &eta );
+#ifdef
+TRILIBRARY
+/* X and y coordinates. */
+plist[coordindex++] = circumcenter[0];
+plist[coordindex++] = circumcenter[1];
+for ( i = 2; i < 2 + nextras; i++ ) {
+/* Interpolate the point attributes at the circumcenter. */
+palist[attribindex++] = torg[i] + xi * ( tdest[i] - torg[i] )
++ eta * ( tapex[i] - torg[i] );
+}
 #else /* not TRILIBRARY */
-               /* Voronoi vertex number, x and y coordinates. */
-               fprintf( outfile, "%4d    %.17g  %.17g", vnodenumber, circumcenter[0],
-                                circumcenter[1] );
-               for ( i = 2; i < 2 + nextras; i++ ) {
-                       /* Interpolate the point attributes at the circumcenter. */
-                       fprintf( outfile, "  %.17g", torg[i] + xi * ( tdest[i] - torg[i] )
-                                        + eta * ( tapex[i] - torg[i] ) );
-               }
-               fprintf( outfile, "\n" );
+/* Voronoi vertex number, x and y coordinates. */
+fprintf( outfile, "%4d    %.17g  %.17g", vnodenumber, circumcenter[0],
+circumcenter[1] );
+for ( i = 2; i < 2 + nextras; i++ ) {
+/* Interpolate the point attributes at the circumcenter. */
+fprintf( outfile, "  %.17g", torg[i] + xi * ( tdest[i] - torg[i] )
++ eta * ( tapex[i] - torg[i] ));
+}
+fprintf( outfile, "\n" );
 #endif /* not TRILIBRARY */
 
-               *(int *) ( triangleloop.tri + 6 ) = vnodenumber;
-               triangleloop.tri = triangletraverse();
-               vnodenumber++;
-       }
+*(int *) ( triangleloop.tri + 6 ) = vnodenumber;
+triangleloop.tri = triangletraverse();
+vnodenumber++;
+}
 
-#ifndef TRILIBRARY
-       finishfile( outfile, argc, argv );
+#ifndef
+TRILIBRARY
+finishfile( outfile, argc, argv );
 #endif /* not TRILIBRARY */
 
-#ifdef TRILIBRARY
-       if ( !quiet ) {
-               printf( "Writing Voronoi edges.\n" );
-       }
-       /* Allocate memory for output Voronoi edges if necessary. */
-       if ( *vedgelist == (int *) NULL ) {
-               *vedgelist = (int *) malloc( edges * 2 * sizeof( int ) );
-               if ( *vedgelist == (int *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       *vedgemarkerlist = (int *) NULL;
-       /* Allocate memory for output Voronoi norms if necessary. */
-       if ( *vnormlist == (REAL *) NULL ) {
-               *vnormlist = (REAL *) malloc( edges * 2 * sizeof( REAL ) );
-               if ( *vnormlist == (REAL *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       elist = *vedgelist;
-       normlist = *vnormlist;
-       coordindex = 0;
+#ifdef
+TRILIBRARY
+if ( !quiet ) {
+printf( "Writing Voronoi edges.\n" );
+}
+/* Allocate memory for output Voronoi edges if necessary. */
+if ( *vedgelist == (int *) NULL ) {
+*vedgelist = (int *) malloc( edges * 2 * sizeof( int ));
+if ( *vedgelist == (int *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+*vedgemarkerlist = (int *) NULL;
+/* Allocate memory for output Voronoi norms if necessary. */
+if ( *vnormlist == (REAL *) NULL ) {
+*vnormlist = (REAL *) malloc( edges * 2 * sizeof( REAL ));
+if ( *vnormlist == (REAL *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+elist = *vedgelist;
+normlist = *vnormlist;
+coordindex = 0;
 #else /* not TRILIBRARY */
-       if ( !quiet ) {
-               printf( "Writing %s.\n", vedgefilename );
-       }
-       outfile = fopen( vedgefilename, "w" );
-       if ( outfile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot create file %s.\n", vedgefilename );
-               exit( 1 );
-       }
-       /* Number of edges, zero boundary markers. */
-       fprintf( outfile, "%ld  %d\n", edges, 0 );
+if ( !quiet ) {
+printf( "Writing %s.\n", vedgefilename );
+}
+outfile = fopen( vedgefilename, "w" );
+if ( outfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot create file %s.\n", vedgefilename );
+exit( 1 );
+}
+/* Number of edges, zero boundary markers. */
+fprintf( outfile, "%ld  %d\n", edges, 0 );
 #endif /* not TRILIBRARY */
 
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       vedgenumber = firstnumber;
-       /* To loop over the set of edges, loop over all triangles, and look at   */
-       /*   the three edges of each triangle.  If there isn't another triangle  */
-       /*   adjacent to the edge, operate on the edge.  If there is another     */
-       /*   adjacent triangle, operate on the edge only if the current triangle */
-       /*   has a smaller pointer than its neighbor.  This way, each edge is    */
-       /*   considered only once.                                               */
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               for ( triangleloop.orient = 0; triangleloop.orient < 3;
-                         triangleloop.orient++ ) {
-                       sym( triangleloop, trisym );
-                       if ( ( triangleloop.tri < trisym.tri ) || ( trisym.tri == dummytri ) ) {
-                               /* Find the number of this triangle (and Voronoi vertex). */
-                               p1 = *(int *) ( triangleloop.tri + 6 );
-                               if ( trisym.tri == dummytri ) {
-                                       org( triangleloop, torg );
-                                       dest( triangleloop, tdest );
-#ifdef TRILIBRARY
-                                       /* Copy an infinite ray.  Index of one endpoint, and -1. */
-                                       elist[coordindex] = p1;
-                                       normlist[coordindex++] = tdest[1] - torg[1];
-                                       elist[coordindex] = -1;
-                                       normlist[coordindex++] = torg[0] - tdest[0];
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+vedgenumber = firstnumber;
+/* To loop over the set of edges, loop over all triangles, and look at   */
+/*   the three edges of each triangle.  If there isn't another triangle  */
+/*   adjacent to the edge, operate on the edge.  If there is another     */
+/*   adjacent triangle, operate on the edge only if the current triangle */
+/*   has a smaller pointer than its neighbor.  This way, each edge is    */
+/*   considered only once.                                               */
+while ( triangleloop.tri != (triangle *) NULL ) {
+for ( triangleloop.orient = 0; triangleloop.orient < 3;
+triangleloop.orient++ ) {
+sym( triangleloop, trisym );
+if (( triangleloop.tri < trisym.tri ) || ( trisym.tri == dummytri )) {
+/* Find the number of this triangle (and Voronoi vertex). */
+p1 = *(int *) ( triangleloop.tri + 6 );
+if ( trisym.tri == dummytri ) {
+org( triangleloop, torg );
+dest( triangleloop, tdest );
+#ifdef
+TRILIBRARY
+/* Copy an infinite ray.  Index of one endpoint, and -1. */
+elist[coordindex] = p1;
+normlist[coordindex++] = tdest[1] - torg[1];
+elist[coordindex] = -1;
+normlist[coordindex++] = torg[0] - tdest[0];
 #else /* not TRILIBRARY */
-                                       /* Write an infinite ray.  Edge number, index of one endpoint, -1, */
-                                       /*   and x and y coordinates of a vector representing the          */
-                                       /*   direction of the ray.                                         */
-                                       fprintf( outfile, "%4d   %d  %d   %.17g  %.17g\n", vedgenumber,
-                                                        p1, -1, tdest[1] - torg[1], torg[0] - tdest[0] );
+/* Write an infinite ray.  Edge number, index of one endpoint, -1, */
+/*   and x and y coordinates of a vector representing the          */
+/*   direction of the ray.                                         */
+fprintf( outfile, "%4d   %d  %d   %.17g  %.17g\n", vedgenumber,
+p1, -1, tdest[1] - torg[1], torg[0] - tdest[0] );
 #endif /* not TRILIBRARY */
-                               }
-                               else {
-                                       /* Find the number of the adjacent triangle (and Voronoi vertex). */
-                                       p2 = *(int *) ( trisym.tri + 6 );
-                                       /* Finite edge.  Write indices of two endpoints. */
-#ifdef TRILIBRARY
-                                       elist[coordindex] = p1;
-                                       normlist[coordindex++] = 0.0;
-                                       elist[coordindex] = p2;
-                                       normlist[coordindex++] = 0.0;
+}
+else {
+/* Find the number of the adjacent triangle (and Voronoi vertex). */
+p2 = *(int *) ( trisym.tri + 6 );
+/* Finite edge.  Write indices of two endpoints. */
+#ifdef
+TRILIBRARY
+elist[coordindex] = p1;
+normlist[coordindex++] = 0.0;
+elist[coordindex] = p2;
+normlist[coordindex++] = 0.0;
 #else /* not TRILIBRARY */
-                                       fprintf( outfile, "%4d   %d  %d\n", vedgenumber, p1, p2 );
+fprintf( outfile, "%4d   %d  %d\n", vedgenumber, p1, p2 );
 #endif /* not TRILIBRARY */
-                               }
-                               vedgenumber++;
-                       }
-               }
-               triangleloop.tri = triangletraverse();
-       }
-
-#ifndef TRILIBRARY
-       finishfile( outfile, argc, argv );
+}
+vedgenumber++;
+}
+}
+triangleloop.tri = triangletraverse();
+}
+
+#ifndef
+TRILIBRARY
+finishfile( outfile, argc, argv );
 #endif /* not TRILIBRARY */
 }
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 void writeneighbors( neighborlist )
 int **neighborlist;
@@ -12619,84 +12881,88 @@ char **argv;
 #endif /* not TRILIBRARY */
 
 {
-#ifdef TRILIBRARY
-       int *nlist;
-       int index;
+#ifdef
+TRILIBRARY
+int *nlist;
+int index;
 #else /* not TRILIBRARY */
-       FILE *outfile;
+FILE *outfile;
 #endif /* not TRILIBRARY */
-       struct triedge triangleloop, trisym;
-       int elementnumber;
-       int neighbor1, neighbor2, neighbor3;
-       triangle ptr;                       /* Temporary variable used by sym(). */
-
-#ifdef TRILIBRARY
-       if ( !quiet ) {
-               printf( "Writing neighbors.\n" );
-       }
-       /* Allocate memory for neighbors if necessary. */
-       if ( *neighborlist == (int *) NULL ) {
-               *neighborlist = (int *) malloc( triangles.items * 3 * sizeof( int ) );
-               if ( *neighborlist == (int *) NULL ) {
-                       printf( "Error:  Out of memory.\n" );
-                       exit( 1 );
-               }
-       }
-       nlist = *neighborlist;
-       index = 0;
+struct triedge triangleloop, trisym;
+int elementnumber;
+int neighbor1, neighbor2, neighbor3;
+triangle ptr;                       /* Temporary variable used by sym(). */
+
+#ifdef
+TRILIBRARY
+if ( !quiet ) {
+printf( "Writing neighbors.\n" );
+}
+/* Allocate memory for neighbors if necessary. */
+if ( *neighborlist == (int *) NULL ) {
+*neighborlist = (int *) malloc( triangles.items * 3 * sizeof( int ));
+if ( *neighborlist == (int *) NULL ) {
+printf( "Error:  Out of memory.\n" );
+exit( 1 );
+}
+}
+nlist = *neighborlist;
+index = 0;
 #else /* not TRILIBRARY */
-       if ( !quiet ) {
-               printf( "Writing %s.\n", neighborfilename );
-       }
-       outfile = fopen( neighborfilename, "w" );
-       if ( outfile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot create file %s.\n", neighborfilename );
-               exit( 1 );
-       }
-       /* Number of triangles, three edges per triangle. */
-       fprintf( outfile, "%ld  %d\n", triangles.items, 3 );
+if ( !quiet ) {
+printf( "Writing %s.\n", neighborfilename );
+}
+outfile = fopen( neighborfilename, "w" );
+if ( outfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot create file %s.\n", neighborfilename );
+exit( 1 );
+}
+/* Number of triangles, three edges per triangle. */
+fprintf( outfile, "%ld  %d\n", triangles.items, 3 );
 #endif /* not TRILIBRARY */
 
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       triangleloop.orient = 0;
-       elementnumber = firstnumber;
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               *(int *) ( triangleloop.tri + 6 ) = elementnumber;
-               triangleloop.tri = triangletraverse();
-               elementnumber++;
-       }
-       *(int *) ( dummytri + 6 ) = -1;
-
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       elementnumber = firstnumber;
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               triangleloop.orient = 1;
-               sym( triangleloop, trisym );
-               neighbor1 = *(int *) ( trisym.tri + 6 );
-               triangleloop.orient = 2;
-               sym( triangleloop, trisym );
-               neighbor2 = *(int *) ( trisym.tri + 6 );
-               triangleloop.orient = 0;
-               sym( triangleloop, trisym );
-               neighbor3 = *(int *) ( trisym.tri + 6 );
-#ifdef TRILIBRARY
-               nlist[index++] = neighbor1;
-               nlist[index++] = neighbor2;
-               nlist[index++] = neighbor3;
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+triangleloop.orient = 0;
+elementnumber = firstnumber;
+while ( triangleloop.tri != (triangle *) NULL ) {
+*(int *) ( triangleloop.tri + 6 ) = elementnumber;
+triangleloop.tri = triangletraverse();
+elementnumber++;
+}
+*(int *) ( dummytri + 6 ) = -1;
+
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+elementnumber = firstnumber;
+while ( triangleloop.tri != (triangle *) NULL ) {
+triangleloop.orient = 1;
+sym( triangleloop, trisym );
+neighbor1 = *(int *) ( trisym.tri + 6 );
+triangleloop.orient = 2;
+sym( triangleloop, trisym );
+neighbor2 = *(int *) ( trisym.tri + 6 );
+triangleloop.orient = 0;
+sym( triangleloop, trisym );
+neighbor3 = *(int *) ( trisym.tri + 6 );
+#ifdef
+TRILIBRARY
+nlist[index++] = neighbor1;
+nlist[index++] = neighbor2;
+nlist[index++] = neighbor3;
 #else /* not TRILIBRARY */
-               /* Triangle number, neighboring triangle numbers. */
-               fprintf( outfile, "%4d    %d  %d  %d\n", elementnumber,
-                                neighbor1, neighbor2, neighbor3 );
+/* Triangle number, neighboring triangle numbers. */
+fprintf( outfile, "%4d    %d  %d  %d\n", elementnumber,
+neighbor1, neighbor2, neighbor3 );
 #endif /* not TRILIBRARY */
 
-               triangleloop.tri = triangletraverse();
-               elementnumber++;
-       }
+triangleloop.tri = triangletraverse();
+elementnumber++;
+}
 
-#ifndef TRILIBRARY
-       finishfile( outfile, argc, argv );
+#ifndef
+TRILIBRARY
+finishfile( outfile, argc, argv );
 #endif /* TRILIBRARY */
 }
 
@@ -12709,54 +12975,55 @@ char **argv;
 /*                                                                           */
 /*****************************************************************************/
 
-#ifndef TRILIBRARY
+#ifndef
+TRILIBRARY
 
 void writeoff( offfilename, argc, argv )
 char *offfilename;
 int argc;
 char **argv;
 {
-       FILE *outfile;
-       struct triedge triangleloop;
-       point pointloop;
-       point p1, p2, p3;
-
-       if ( !quiet ) {
-               printf( "Writing %s.\n", offfilename );
-       }
-       outfile = fopen( offfilename, "w" );
-       if ( outfile == (FILE *) NULL ) {
-               printf( "  Error:  Cannot create file %s.\n", offfilename );
-               exit( 1 );
-       }
-       /* Number of points, triangles, and edges. */
-       fprintf( outfile, "OFF\n%ld  %ld  %ld\n", points.items, triangles.items,
-                        edges );
-
-       /* Write the points. */
-       traversalinit( &points );
-       pointloop = pointtraverse();
-       while ( pointloop != (point) NULL ) {
-               /* The "0.0" is here because the OFF format uses 3D coordinates. */
-               fprintf( outfile, " %.17g  %.17g  %.17g\n", pointloop[0],
-                                pointloop[1], 0.0 );
-               pointloop = pointtraverse();
-       }
-
-       /* Write the triangles. */
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       triangleloop.orient = 0;
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               org( triangleloop, p1 );
-               dest( triangleloop, p2 );
-               apex( triangleloop, p3 );
-               /* The "3" means a three-vertex polygon. */
-               fprintf( outfile, " 3   %4d  %4d  %4d\n", pointmark( p1 ) - 1,
-                                pointmark( p2 ) - 1, pointmark( p3 ) - 1 );
-               triangleloop.tri = triangletraverse();
-       }
-       finishfile( outfile, argc, argv );
+FILE *outfile;
+struct triedge triangleloop;
+point pointloop;
+point p1, p2, p3;
+
+if ( !quiet ) {
+printf( "Writing %s.\n", offfilename );
+}
+outfile = fopen( offfilename, "w" );
+if ( outfile == (FILE *) NULL ) {
+printf( "  Error:  Cannot create file %s.\n", offfilename );
+exit( 1 );
+}
+/* Number of points, triangles, and edges. */
+fprintf( outfile, "OFF\n%ld  %ld  %ld\n", points.items, triangles.items,
+edges );
+
+/* Write the points. */
+traversalinit( &points );
+pointloop = pointtraverse();
+while ( pointloop != (point) NULL ) {
+/* The "0.0" is here because the OFF format uses 3D coordinates. */
+fprintf( outfile, " %.17g  %.17g  %.17g\n", pointloop[0],
+pointloop[1], 0.0 );
+pointloop = pointtraverse();
+}
+
+/* Write the triangles. */
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+triangleloop.orient = 0;
+while ( triangleloop.tri != (triangle *) NULL ) {
+org( triangleloop, p1 );
+dest( triangleloop, p2 );
+apex( triangleloop, p3 );
+/* The "3" means a three-vertex polygon. */
+fprintf( outfile, " 3   %4d  %4d  %4d\n", pointmark( p1 ) - 1,
+pointmark( p2 ) - 1, pointmark( p3 ) - 1 );
+triangleloop.tri = triangletraverse();
+}
+finishfile( outfile, argc, argv );
 }
 
 #endif /* not TRILIBRARY */
@@ -12772,198 +13039,198 @@ char **argv;
 /*****************************************************************************/
 
 void quality_statistics(){
-       struct triedge triangleloop;
-       point p[3];
-       REAL cossquaretable[8];
-       REAL ratiotable[16];
-       REAL dx[3], dy[3];
-       REAL edgelength[3];
-       REAL dotproduct;
-       REAL cossquare;
-       REAL triarea;
-       REAL shortest, longest;
-       REAL trilongest2;
-       REAL smallestarea, biggestarea;
-       REAL triminaltitude2;
-       REAL minaltitude;
-       REAL triaspect2;
-       REAL worstaspect;
-       REAL smallestangle, biggestangle;
-       REAL radconst, degconst;
-       int angletable[18];
-       int aspecttable[16];
-       int aspectindex;
-       int tendegree;
-       int acutebiggest;
-       int i, ii, j, k;
-
-       printf( "Mesh quality statistics:\n\n" );
-       radconst = (REAL)( PI / 18.0 );
-       degconst = (REAL)( 180.0 / PI );
-       for ( i = 0; i < 8; i++ ) {
-               cossquaretable[i] = (REAL)( cos( radconst * (REAL) ( i + 1 ) ) );
-               cossquaretable[i] = cossquaretable[i] * cossquaretable[i];
-       }
-       for ( i = 0; i < 18; i++ ) {
-               angletable[i] = 0;
-       }
-
-       ratiotable[0]  =      1.5;      ratiotable[1]  =     2.0;
-       ratiotable[2]  =      2.5;      ratiotable[3]  =     3.0;
-       ratiotable[4]  =      4.0;      ratiotable[5]  =     6.0;
-       ratiotable[6]  =     10.0;      ratiotable[7]  =    15.0;
-       ratiotable[8]  =     25.0;      ratiotable[9]  =    50.0;
-       ratiotable[10] =    100.0;      ratiotable[11] =   300.0;
-       ratiotable[12] =   1000.0;      ratiotable[13] = 10000.0;
-       ratiotable[14] = 100000.0;      ratiotable[15] =     0.0;
-       for ( i = 0; i < 16; i++ ) {
-               aspecttable[i] = 0;
-       }
-
-       worstaspect = 0.0;
-       minaltitude = xmax - xmin + ymax - ymin;
-       minaltitude = minaltitude * minaltitude;
-       shortest = minaltitude;
-       longest = 0.0;
-       smallestarea = minaltitude;
-       biggestarea = 0.0;
-       worstaspect = 0.0;
-       smallestangle = 0.0;
-       biggestangle = 2.0;
-       acutebiggest = 1;
-
-       traversalinit( &triangles );
-       triangleloop.tri = triangletraverse();
-       triangleloop.orient = 0;
-       while ( triangleloop.tri != (triangle *) NULL ) {
-               org( triangleloop, p[0] );
-               dest( triangleloop, p[1] );
-               apex( triangleloop, p[2] );
-               trilongest2 = 0.0;
-
-               for ( i = 0; i < 3; i++ ) {
-                       j = plus1mod3[i];
-                       k = minus1mod3[i];
-                       dx[i] = p[j][0] - p[k][0];
-                       dy[i] = p[j][1] - p[k][1];
-                       edgelength[i] = dx[i] * dx[i] + dy[i] * dy[i];
-                       if ( edgelength[i] > trilongest2 ) {
-                               trilongest2 = edgelength[i];
-                       }
-                       if ( edgelength[i] > longest ) {
-                               longest = edgelength[i];
-                       }
-                       if ( edgelength[i] < shortest ) {
-                               shortest = edgelength[i];
-                       }
-               }
-
-               triarea = counterclockwise( p[0], p[1], p[2] );
-               if ( triarea < smallestarea ) {
-                       smallestarea = triarea;
-               }
-               if ( triarea > biggestarea ) {
-                       biggestarea = triarea;
-               }
-               triminaltitude2 = triarea * triarea / trilongest2;
-               if ( triminaltitude2 < minaltitude ) {
-                       minaltitude = triminaltitude2;
-               }
-               triaspect2 = trilongest2 / triminaltitude2;
-               if ( triaspect2 > worstaspect ) {
-                       worstaspect = triaspect2;
-               }
-               aspectindex = 0;
-               while ( ( triaspect2 > ratiotable[aspectindex] * ratiotable[aspectindex] )
-                               && ( aspectindex < 15 ) ) {
-                       aspectindex++;
-               }
-               aspecttable[aspectindex]++;
-
-               for ( i = 0; i < 3; i++ ) {
-                       j = plus1mod3[i];
-                       k = minus1mod3[i];
-                       dotproduct = dx[j] * dx[k] + dy[j] * dy[k];
-                       cossquare = dotproduct * dotproduct / ( edgelength[j] * edgelength[k] );
-                       tendegree = 8;
-                       for ( ii = 7; ii >= 0; ii-- ) {
-                               if ( cossquare > cossquaretable[ii] ) {
-                                       tendegree = ii;
-                               }
-                       }
-                       if ( dotproduct <= 0.0 ) {
-                               angletable[tendegree]++;
-                               if ( cossquare > smallestangle ) {
-                                       smallestangle = cossquare;
-                               }
-                               if ( acutebiggest && ( cossquare < biggestangle ) ) {
-                                       biggestangle = cossquare;
-                               }
-                       }
-                       else {
-                               angletable[17 - tendegree]++;
-                               if ( acutebiggest || ( cossquare > biggestangle ) ) {
-                                       biggestangle = cossquare;
-                                       acutebiggest = 0;
-                               }
-                       }
-               }
-               triangleloop.tri = triangletraverse();
-       }
-
-       shortest = (REAL)sqrt( shortest );
-       longest = (REAL)sqrt( longest );
-       minaltitude = (REAL)sqrt( minaltitude );
-       worstaspect = (REAL)sqrt( worstaspect );
-       smallestarea *= 2.0;
-       biggestarea *= 2.0;
-       if ( smallestangle >= 1.0 ) {
-               smallestangle = 0.0;
-       }
-       else {
-               smallestangle = (REAL)( degconst * acos( sqrt( smallestangle ) ) );
-       }
-       if ( biggestangle >= 1.0 ) {
-               biggestangle = 180.0;
-       }
-       else {
-               if ( acutebiggest ) {
-                       biggestangle = (REAL)( degconst * acos( sqrt( biggestangle ) ) );
-               }
-               else {
-                       biggestangle = (REAL)( 180.0 - degconst * acos( sqrt( biggestangle ) ) );
-               }
-       }
-
-       printf( "  Smallest area: %16.5g   |  Largest area: %16.5g\n",
-                       smallestarea, biggestarea );
-       printf( "  Shortest edge: %16.5g   |  Longest edge: %16.5g\n",
-                       shortest, longest );
-       printf( "  Shortest altitude: %12.5g   |  Largest aspect ratio: %8.5g\n\n",
-                       minaltitude, worstaspect );
-       printf( "  Aspect ratio histogram:\n" );
-       printf( "  1.1547 - %-6.6g    :  %8d    | %6.6g - %-6.6g     :  %8d\n",
-                       ratiotable[0], aspecttable[0], ratiotable[7], ratiotable[8],
-                       aspecttable[8] );
-       for ( i = 1; i < 7; i++ ) {
-               printf( "  %6.6g - %-6.6g    :  %8d    | %6.6g - %-6.6g     :  %8d\n",
-                               ratiotable[i - 1], ratiotable[i], aspecttable[i],
-                               ratiotable[i + 7], ratiotable[i + 8], aspecttable[i + 8] );
-       }
-       printf( "  %6.6g - %-6.6g    :  %8d    | %6.6g -            :  %8d\n",
-                       ratiotable[6], ratiotable[7], aspecttable[7], ratiotable[14],
-                       aspecttable[15] );
-       printf(
-               "  (Triangle aspect ratio is longest edge divided by shortest altitude)\n\n" );
-       printf( "  Smallest angle: %15.5g   |  Largest angle: %15.5g\n\n",
-                       smallestangle, biggestangle );
-       printf( "  Angle histogram:\n" );
-       for ( i = 0; i < 9; i++ ) {
-               printf( "    %3d - %3d degrees:  %8d    |    %3d - %3d degrees:  %8d\n",
-                               i * 10, i * 10 + 10, angletable[i],
-                               i * 10 + 90, i * 10 + 100, angletable[i + 9] );
-       }
-       printf( "\n" );
+struct triedge triangleloop;
+point p[3];
+REAL cossquaretable[8];
+REAL ratiotable[16];
+REAL dx[3], dy[3];
+REAL edgelength[3];
+REAL dotproduct;
+REAL cossquare;
+REAL triarea;
+REAL shortest, longest;
+REAL trilongest2;
+REAL smallestarea, biggestarea;
+REAL triminaltitude2;
+REAL minaltitude;
+REAL triaspect2;
+REAL worstaspect;
+REAL smallestangle, biggestangle;
+REAL radconst, degconst;
+int angletable[18];
+int aspecttable[16];
+int aspectindex;
+int tendegree;
+int acutebiggest;
+int i, ii, j, k;
+
+printf( "Mesh quality statistics:\n\n" );
+radconst = (REAL)( PI / 18.0 );
+degconst = (REAL)( 180.0 / PI );
+for ( i = 0; i < 8; i++ ) {
+cossquaretable[i] = (REAL)( cos( radconst * (REAL) ( i + 1 )));
+cossquaretable[i] = cossquaretable[i] * cossquaretable[i];
+}
+for ( i = 0; i < 18; i++ ) {
+angletable[i] = 0;
+}
+
+ratiotable[0]  =      1.5;      ratiotable[1]  =     2.0;
+ratiotable[2]  =      2.5;      ratiotable[3]  =     3.0;
+ratiotable[4]  =      4.0;      ratiotable[5]  =     6.0;
+ratiotable[6]  =     10.0;      ratiotable[7]  =    15.0;
+ratiotable[8]  =     25.0;      ratiotable[9]  =    50.0;
+ratiotable[10] =    100.0;      ratiotable[11] =   300.0;
+ratiotable[12] =   1000.0;      ratiotable[13] = 10000.0;
+ratiotable[14] = 100000.0;      ratiotable[15] =     0.0;
+for ( i = 0; i < 16; i++ ) {
+aspecttable[i] = 0;
+}
+
+worstaspect = 0.0;
+minaltitude = xmax - xmin + ymax - ymin;
+minaltitude = minaltitude * minaltitude;
+shortest = minaltitude;
+longest = 0.0;
+smallestarea = minaltitude;
+biggestarea = 0.0;
+worstaspect = 0.0;
+smallestangle = 0.0;
+biggestangle = 2.0;
+acutebiggest = 1;
+
+traversalinit( &triangles );
+triangleloop.tri = triangletraverse();
+triangleloop.orient = 0;
+while ( triangleloop.tri != (triangle *) NULL ) {
+org( triangleloop, p[0] );
+dest( triangleloop, p[1] );
+apex( triangleloop, p[2] );
+trilongest2 = 0.0;
+
+for ( i = 0; i < 3; i++ ) {
+j = plus1mod3[i];
+k = minus1mod3[i];
+dx[i] = p[j][0] - p[k][0];
+dy[i] = p[j][1] - p[k][1];
+edgelength[i] = dx[i] * dx[i] + dy[i] * dy[i];
+if ( edgelength[i] > trilongest2 ) {
+trilongest2 = edgelength[i];
+}
+if ( edgelength[i] > longest ) {
+longest = edgelength[i];
+}
+if ( edgelength[i] < shortest ) {
+shortest = edgelength[i];
+}
+}
+
+triarea = counterclockwise( p[0], p[1], p[2] );
+if ( triarea < smallestarea ) {
+smallestarea = triarea;
+}
+if ( triarea > biggestarea ) {
+biggestarea = triarea;
+}
+triminaltitude2 = triarea * triarea / trilongest2;
+if ( triminaltitude2 < minaltitude ) {
+minaltitude = triminaltitude2;
+}
+triaspect2 = trilongest2 / triminaltitude2;
+if ( triaspect2 > worstaspect ) {
+worstaspect = triaspect2;
+}
+aspectindex = 0;
+while (( triaspect2 > ratiotable[aspectindex] * ratiotable[aspectindex] )
+&& ( aspectindex < 15 )) {
+aspectindex++;
+}
+aspecttable[aspectindex]++;
+
+for ( i = 0; i < 3; i++ ) {
+j = plus1mod3[i];
+k = minus1mod3[i];
+dotproduct = dx[j] * dx[k] + dy[j] * dy[k];
+cossquare = dotproduct * dotproduct / ( edgelength[j] * edgelength[k] );
+tendegree = 8;
+for ( ii = 7; ii >= 0; ii-- ) {
+if ( cossquare > cossquaretable[ii] ) {
+tendegree = ii;
+}
+}
+if ( dotproduct <= 0.0 ) {
+angletable[tendegree]++;
+if ( cossquare > smallestangle ) {
+smallestangle = cossquare;
+}
+if ( acutebiggest && ( cossquare < biggestangle )) {
+biggestangle = cossquare;
+}
+}
+else {
+angletable[17 - tendegree]++;
+if ( acutebiggest || ( cossquare > biggestangle )) {
+biggestangle = cossquare;
+acutebiggest = 0;
+}
+}
+}
+triangleloop.tri = triangletraverse();
+}
+
+shortest = (REAL)sqrt( shortest );
+longest = (REAL)sqrt( longest );
+minaltitude = (REAL)sqrt( minaltitude );
+worstaspect = (REAL)sqrt( worstaspect );
+smallestarea *= 2.0;
+biggestarea *= 2.0;
+if ( smallestangle >= 1.0 ) {
+smallestangle = 0.0;
+}
+else {
+smallestangle = (REAL)( degconst * acos( sqrt( smallestangle )));
+}
+if ( biggestangle >= 1.0 ) {
+biggestangle = 180.0;
+}
+else {
+if ( acutebiggest ) {
+biggestangle = (REAL)( degconst * acos( sqrt( biggestangle )));
+}
+else {
+biggestangle = (REAL)( 180.0 - degconst * acos( sqrt( biggestangle )));
+}
+}
+
+printf( "  Smallest area: %16.5g   |  Largest area: %16.5g\n",
+smallestarea, biggestarea );
+printf( "  Shortest edge: %16.5g   |  Longest edge: %16.5g\n",
+shortest, longest );
+printf( "  Shortest altitude: %12.5g   |  Largest aspect ratio: %8.5g\n\n",
+minaltitude, worstaspect );
+printf( "  Aspect ratio histogram:\n" );
+printf( "  1.1547 - %-6.6g    :  %8d    | %6.6g - %-6.6g     :  %8d\n",
+ratiotable[0], aspecttable[0], ratiotable[7], ratiotable[8],
+aspecttable[8] );
+for ( i = 1; i < 7; i++ ) {
+printf( "  %6.6g - %-6.6g    :  %8d    | %6.6g - %-6.6g     :  %8d\n",
+ratiotable[i - 1], ratiotable[i], aspecttable[i],
+ratiotable[i + 7], ratiotable[i + 8], aspecttable[i + 8] );
+}
+printf( "  %6.6g - %-6.6g    :  %8d    | %6.6g -            :  %8d\n",
+ratiotable[6], ratiotable[7], aspecttable[7], ratiotable[14],
+aspecttable[15] );
+printf(
+"  (Triangle aspect ratio is longest edge divided by shortest altitude)\n\n" );
+printf( "  Smallest angle: %15.5g   |  Largest angle: %15.5g\n\n",
+smallestangle, biggestangle );
+printf( "  Angle histogram:\n" );
+for ( i = 0; i < 9; i++ ) {
+printf( "    %3d - %3d degrees:  %8d    |    %3d - %3d degrees:  %8d\n",
+i * 10, i * 10 + 10, angletable[i],
+i * 10 + 90, i * 10 + 100, angletable[i + 9] );
+}
+printf( "\n" );
 }
 
 /*****************************************************************************/
@@ -12973,77 +13240,77 @@ void quality_statistics(){
 /*****************************************************************************/
 
 void statistics(){
-       printf( "\nStatistics:\n\n" );
-       printf( "  Input points: %d\n", inpoints );
-       if ( refine ) {
-               printf( "  Input triangles: %d\n", inelements );
-       }
-       if ( poly ) {
-               printf( "  Input segments: %d\n", insegments );
-               if ( !refine ) {
-                       printf( "  Input holes: %d\n", holes );
-               }
-       }
-
-       printf( "\n  Mesh points: %ld\n", points.items );
-       printf( "  Mesh triangles: %ld\n", triangles.items );
-       printf( "  Mesh edges: %ld\n", edges );
-       if ( poly || refine ) {
-               printf( "  Mesh boundary edges: %ld\n", hullsize );
-               printf( "  Mesh segments: %ld\n\n", shelles.items );
-       }
-       else {
-               printf( "  Mesh convex hull edges: %ld\n\n", hullsize );
-       }
-       if ( verbose ) {
-               quality_statistics();
-               printf( "Memory allocation statistics:\n\n" );
-               printf( "  Maximum number of points: %ld\n", points.maxitems );
-               printf( "  Maximum number of triangles: %ld\n", triangles.maxitems );
-               if ( shelles.maxitems > 0 ) {
-                       printf( "  Maximum number of segments: %ld\n", shelles.maxitems );
-               }
-               if ( viri.maxitems > 0 ) {
-                       printf( "  Maximum number of viri: %ld\n", viri.maxitems );
-               }
-               if ( badsegments.maxitems > 0 ) {
-                       printf( "  Maximum number of encroached segments: %ld\n",
-                                       badsegments.maxitems );
-               }
-               if ( badtriangles.maxitems > 0 ) {
-                       printf( "  Maximum number of bad triangles: %ld\n",
-                                       badtriangles.maxitems );
-               }
-               if ( splaynodes.maxitems > 0 ) {
-                       printf( "  Maximum number of splay tree nodes: %ld\n",
-                                       splaynodes.maxitems );
-               }
-               printf( "  Approximate heap memory use (bytes): %ld\n\n",
-                               points.maxitems * points.itembytes
-                               + triangles.maxitems * triangles.itembytes
-                               + shelles.maxitems * shelles.itembytes
-                               + viri.maxitems * viri.itembytes
-                               + badsegments.maxitems * badsegments.itembytes
-                               + badtriangles.maxitems * badtriangles.itembytes
-                               + splaynodes.maxitems * splaynodes.itembytes );
-
-               printf( "Algorithmic statistics:\n\n" );
-               printf( "  Number of incircle tests: %ld\n", incirclecount );
-               printf( "  Number of orientation tests: %ld\n", counterclockcount );
-               if ( hyperbolacount > 0 ) {
-                       printf( "  Number of right-of-hyperbola tests: %ld\n",
-                                       hyperbolacount );
-               }
-               if ( circumcentercount > 0 ) {
-                       printf( "  Number of circumcenter computations: %ld\n",
-                                       circumcentercount );
-               }
-               if ( circletopcount > 0 ) {
-                       printf( "  Number of circle top computations: %ld\n",
-                                       circletopcount );
-               }
-               printf( "\n" );
-       }
+printf( "\nStatistics:\n\n" );
+printf( "  Input points: %d\n", inpoints );
+if ( refine ) {
+printf( "  Input triangles: %d\n", inelements );
+}
+if ( poly ) {
+printf( "  Input segments: %d\n", insegments );
+if ( !refine ) {
+printf( "  Input holes: %d\n", holes );
+}
+}
+
+printf( "\n  Mesh points: %ld\n", points.items );
+printf( "  Mesh triangles: %ld\n", triangles.items );
+printf( "  Mesh edges: %ld\n", edges );
+if ( poly || refine ) {
+printf( "  Mesh boundary edges: %ld\n", hullsize );
+printf( "  Mesh segments: %ld\n\n", shelles.items );
+}
+else {
+printf( "  Mesh convex hull edges: %ld\n\n", hullsize );
+}
+if ( verbose ) {
+quality_statistics();
+printf( "Memory allocation statistics:\n\n" );
+printf( "  Maximum number of points: %ld\n", points.maxitems );
+printf( "  Maximum number of triangles: %ld\n", triangles.maxitems );
+if ( shelles.maxitems > 0 ) {
+printf( "  Maximum number of segments: %ld\n", shelles.maxitems );
+}
+if ( viri.maxitems > 0 ) {
+printf( "  Maximum number of viri: %ld\n", viri.maxitems );
+}
+if ( badsegments.maxitems > 0 ) {
+printf( "  Maximum number of encroached segments: %ld\n",
+badsegments.maxitems );
+}
+if ( badtriangles.maxitems > 0 ) {
+printf( "  Maximum number of bad triangles: %ld\n",
+badtriangles.maxitems );
+}
+if ( splaynodes.maxitems > 0 ) {
+printf( "  Maximum number of splay tree nodes: %ld\n",
+splaynodes.maxitems );
+}
+printf( "  Approximate heap memory use (bytes): %ld\n\n",
+points.maxitems * points.itembytes
++ triangles.maxitems * triangles.itembytes
++ shelles.maxitems * shelles.itembytes
++ viri.maxitems * viri.itembytes
++ badsegments.maxitems * badsegments.itembytes
++ badtriangles.maxitems * badtriangles.itembytes
++ splaynodes.maxitems * splaynodes.itembytes );
+
+printf( "Algorithmic statistics:\n\n" );
+printf( "  Number of incircle tests: %ld\n", incirclecount );
+printf( "  Number of orientation tests: %ld\n", counterclockcount );
+if ( hyperbolacount > 0 ) {
+printf( "  Number of right-of-hyperbola tests: %ld\n",
+hyperbolacount );
+}
+if ( circumcentercount > 0 ) {
+printf( "  Number of circumcenter computations: %ld\n",
+circumcentercount );
+}
+if ( circletopcount > 0 ) {
+printf( "  Number of circle top computations: %ld\n",
+circletopcount );
+}
+printf( "\n" );
+}
 }
 
 /*****************************************************************************/
@@ -13071,7 +13338,8 @@ void statistics(){
 /*                                                                           */
 /*****************************************************************************/
 
-#ifdef TRILIBRARY
+#ifdef
+TRILIBRARY
 
 void triangulate( triswitches, in, out, vorout )
 char *triswitches;
@@ -13088,316 +13356,347 @@ char **argv;
 #endif /* not TRILIBRARY */
 
 {
-       REAL *holearray;                                      /* Array of holes. */
-       REAL *regionarray; /* Array of regional attributes and area constraints. */
-#ifndef TRILIBRARY
-       FILE *polyfile;
+REAL *holearray;                                      /* Array of holes. */
+REAL *regionarray; /* Array of regional attributes and area constraints. */
+#ifndef
+TRILIBRARY
+FILE *polyfile;
 #endif /* not TRILIBRARY */
-#ifndef NO_TIMER
-       /* Variables for timing the performance of Triangle.  The types are */
-       /*   defined in sys/time.h.                                         */
-       struct timeval tv0, tv1, tv2, tv3, tv4, tv5, tv6;
-       struct timezone tz;
+#ifndef
+NO_TIMER
+/* Variables for timing the performance of Triangle.  The types are */
+/*   defined in sys/time.h.                                         */
+struct timeval tv0, tv1, tv2, tv3, tv4, tv5, tv6;
+struct timezone tz;
 #endif /* NO_TIMER */
 
-#ifndef NO_TIMER
-       gettimeofday( &tv0, &tz );
+#ifndef
+NO_TIMER
+gettimeofday( &tv0, &tz );
 #endif /* NO_TIMER */
 
-       triangleinit();
-#ifdef TRILIBRARY
-       parsecommandline( 1, &triswitches );
+triangleinit();
+#ifdef
+TRILIBRARY
+parsecommandline( 1, &triswitches );
 #else /* not TRILIBRARY */
-       parsecommandline( argc, argv );
+parsecommandline( argc, argv );
 #endif /* not TRILIBRARY */
 
-#ifdef TRILIBRARY
-       transfernodes( in->pointlist, in->pointattributelist, in->pointmarkerlist,
-                                  in->numberofpoints, in->numberofpointattributes );
+#ifdef
+TRILIBRARY
+transfernodes( in->pointlist, in->pointattributelist, in->pointmarkerlist,
+in->numberofpoints, in->numberofpointattributes );
 #else /* not TRILIBRARY */
-       readnodes( innodefilename, inpolyfilename, &polyfile );
+readnodes( innodefilename, inpolyfilename, &polyfile );
 #endif /* not TRILIBRARY */
 
-#ifndef NO_TIMER
-       if ( !quiet ) {
-               gettimeofday( &tv1, &tz );
-       }
+#ifndef
+NO_TIMER
+if ( !quiet ) {
+gettimeofday( &tv1, &tz );
+}
 #endif /* NO_TIMER */
 
-#ifdef CDT_ONLY
-       hullsize = delaunay();                        /* Triangulate the points. */
+#ifdef
+CDT_ONLY
+hullsize = delaunay();                        /* Triangulate the points. */
 #else /* not CDT_ONLY */
-       if ( refine ) {
-               /* Read and reconstruct a mesh. */
-#ifdef TRILIBRARY
-               hullsize = reconstruct( in->trianglelist, in->triangleattributelist,
-                                                               in->trianglearealist, in->numberoftriangles,
-                                                               in->numberofcorners, in->numberoftriangleattributes,
-                                                               in->segmentlist, in->segmentmarkerlist,
-                                                               in->numberofsegments );
+if ( refine ) {
+/* Read and reconstruct a mesh. */
+#ifdef
+TRILIBRARY
+hullsize = reconstruct( in->trianglelist, in->triangleattributelist,
+in->trianglearealist, in->numberoftriangles,
+in->numberofcorners, in->numberoftriangleattributes,
+in->segmentlist, in->segmentmarkerlist,
+in->numberofsegments );
 #else /* not TRILIBRARY */
-               hullsize = reconstruct( inelefilename, areafilename, inpolyfilename,
-                                                               polyfile );
+hullsize = reconstruct( inelefilename, areafilename, inpolyfilename,
+polyfile );
 #endif /* not TRILIBRARY */
-       }
-       else {
-               hullsize = delaunay();                    /* Triangulate the points. */
-       }
+}
+else {
+hullsize = delaunay();                    /* Triangulate the points. */
+}
 #endif /* not CDT_ONLY */
 
-#ifndef NO_TIMER
-       if ( !quiet ) {
-               gettimeofday( &tv2, &tz );
-               if ( refine ) {
-                       printf( "Mesh reconstruction" );
-               }
-               else {
-                       printf( "Delaunay" );
-               }
-               printf( " milliseconds:  %ld\n", 1000l * ( tv2.tv_sec - tv1.tv_sec )
-                               + ( tv2.tv_usec - tv1.tv_usec ) / 1000l );
-       }
+#ifndef
+NO_TIMER
+if ( !quiet ) {
+gettimeofday( &tv2, &tz );
+if ( refine ) {
+printf( "Mesh reconstruction" );
+}
+else {
+printf( "Delaunay" );
+}
+printf( " milliseconds:  %ld\n", 1000l * ( tv2.tv_sec - tv1.tv_sec )
++ ( tv2.tv_usec - tv1.tv_usec ) / 1000l );
+}
 #endif /* NO_TIMER */
 
-       /* Ensure that no point can be mistaken for a triangular bounding */
-       /*   box point in insertsite().                                   */
-       infpoint1 = (point) NULL;
-       infpoint2 = (point) NULL;
-       infpoint3 = (point) NULL;
-
-       if ( useshelles ) {
-               checksegments = 1;              /* Segments will be introduced next. */
-               if ( !refine ) {
-                       /* Insert PSLG segments and/or convex hull segments. */
-#ifdef TRILIBRARY
-                       insegments = formskeleton( in->segmentlist, in->segmentmarkerlist,
-                                                                          in->numberofsegments );
+/* Ensure that no point can be mistaken for a triangular bounding */
+/*   box point in insertsite().                                   */
+infpoint1 = (point) NULL;
+infpoint2 = (point) NULL;
+infpoint3 = (point) NULL;
+
+if ( useshelles ) {
+checksegments = 1;              /* Segments will be introduced next. */
+if ( !refine ) {
+/* Insert PSLG segments and/or convex hull segments. */
+#ifdef
+TRILIBRARY
+insegments = formskeleton( in->segmentlist, in->segmentmarkerlist,
+in->numberofsegments );
 #else /* not TRILIBRARY */
-                       insegments = formskeleton( polyfile, inpolyfilename );
+insegments = formskeleton( polyfile, inpolyfilename );
 #endif /* not TRILIBRARY */
-               }
-       }
-
-#ifndef NO_TIMER
-       if ( !quiet ) {
-               gettimeofday( &tv3, &tz );
-               if ( useshelles && !refine ) {
-                       printf( "Segment milliseconds:  %ld\n",
-                                       1000l * ( tv3.tv_sec - tv2.tv_sec )
-                                       + ( tv3.tv_usec - tv2.tv_usec ) / 1000l );
-               }
-       }
+}
+}
+
+#ifndef
+NO_TIMER
+if ( !quiet ) {
+gettimeofday( &tv3, &tz );
+if ( useshelles && !refine ) {
+printf( "Segment milliseconds:  %ld\n",
+1000l * ( tv3.tv_sec - tv2.tv_sec )
++ ( tv3.tv_usec - tv2.tv_usec ) / 1000l );
+}
+}
 #endif /* NO_TIMER */
 
-       if ( poly ) {
-#ifdef TRILIBRARY
-               holearray = in->holelist;
-               holes = in->numberofholes;
-               regionarray = in->regionlist;
-               regions = in->numberofregions;
+if ( poly ) {
+#ifdef
+TRILIBRARY
+holearray = in->holelist;
+holes = in->numberofholes;
+regionarray = in->regionlist;
+regions = in->numberofregions;
 #else /* not TRILIBRARY */
-               readholes( polyfile, inpolyfilename, &holearray, &holes,
-                                  &regionarray, &regions );
+readholes( polyfile, inpolyfilename, &holearray, &holes,
+&regionarray, &regions );
 #endif /* not TRILIBRARY */
-               if ( !refine ) {
-                       /* Carve out holes and concavities. */
-                       carveholes( holearray, holes, regionarray, regions );
-               }
-       }
-       else {
-               /* Without a PSLG, there can be no holes or regional attributes   */
-               /*   or area constraints.  The following are set to zero to avoid */
-               /*   an accidental free() later.                                  */
-               holes = 0;
-               regions = 0;
-       }
-
-#ifndef NO_TIMER
-       if ( !quiet ) {
-               gettimeofday( &tv4, &tz );
-               if ( poly && !refine ) {
-                       printf( "Hole milliseconds:  %ld\n", 1000l * ( tv4.tv_sec - tv3.tv_sec )
-                                       + ( tv4.tv_usec - tv3.tv_usec ) / 1000l );
-               }
-       }
+if ( !refine ) {
+/* Carve out holes and concavities. */
+carveholes( holearray, holes, regionarray, regions );
+}
+}
+else {
+/* Without a PSLG, there can be no holes or regional attributes   */
+/*   or area constraints.  The following are set to zero to avoid */
+/*   an accidental free() later.                                  */
+holes = 0;
+regions = 0;
+}
+
+#ifndef
+NO_TIMER
+if ( !quiet ) {
+gettimeofday( &tv4, &tz );
+if ( poly && !refine ) {
+printf( "Hole milliseconds:  %ld\n", 1000l * ( tv4.tv_sec - tv3.tv_sec )
++ ( tv4.tv_usec - tv3.tv_usec ) / 1000l );
+}
+}
 #endif /* NO_TIMER */
 
-#ifndef CDT_ONLY
-       if ( quality ) {
-               enforcequality();             /* Enforce angle and area constraints. */
-       }
+#ifndef
+CDT_ONLY
+if ( quality ) {
+enforcequality();             /* Enforce angle and area constraints. */
+}
 #endif /* not CDT_ONLY */
 
-#ifndef NO_TIMER
-       if ( !quiet ) {
-               gettimeofday( &tv5, &tz );
-#ifndef CDT_ONLY
-               if ( quality ) {
-                       printf( "Quality milliseconds:  %ld\n",
-                                       1000l * ( tv5.tv_sec - tv4.tv_sec )
-                                       + ( tv5.tv_usec - tv4.tv_usec ) / 1000l );
-               }
+#ifndef
+NO_TIMER
+if ( !quiet ) {
+gettimeofday( &tv5, &tz );
+#ifndef
+CDT_ONLY
+if ( quality ) {
+printf( "Quality milliseconds:  %ld\n",
+1000l * ( tv5.tv_sec - tv4.tv_sec )
++ ( tv5.tv_usec - tv4.tv_usec ) / 1000l );
+}
 #endif /* not CDT_ONLY */
-       }
+}
 #endif /* NO_TIMER */
 
-       /* Compute the number of edges. */
-       edges = ( 3l * triangles.items + hullsize ) / 2l;
-
-       if ( order > 1 ) {
-               highorder();         /* Promote elements to higher polynomial order. */
-       }
-       if ( !quiet ) {
-               printf( "\n" );
-       }
-
-#ifdef TRILIBRARY
-       out->numberofpoints = points.items;
-       out->numberofpointattributes = nextras;
-       out->numberoftriangles = triangles.items;
-       out->numberofcorners = ( order + 1 ) * ( order + 2 ) / 2;
-       out->numberoftriangleattributes = eextras;
-       out->numberofedges = edges;
-       if ( useshelles ) {
-               out->numberofsegments = shelles.items;
-       }
-       else {
-               out->numberofsegments = hullsize;
-       }
-       if ( vorout != (struct triangulateio *) NULL ) {
-               vorout->numberofpoints = triangles.items;
-               vorout->numberofpointattributes = nextras;
-               vorout->numberofedges = edges;
-       }
+/* Compute the number of edges. */
+edges = ( 3l * triangles.items + hullsize ) / 2l;
+
+if ( order > 1 ) {
+highorder();         /* Promote elements to higher polynomial order. */
+}
+if ( !quiet ) {
+printf( "\n" );
+}
+
+#ifdef
+TRILIBRARY
+out->numberofpoints = points.items;
+out->numberofpointattributes = nextras;
+out->numberoftriangles = triangles.items;
+out->numberofcorners = ( order + 1 ) * ( order + 2 ) / 2;
+out->numberoftriangleattributes = eextras;
+out->numberofedges = edges;
+if ( useshelles ) {
+out->numberofsegments = shelles.items;
+}
+else {
+out->numberofsegments = hullsize;
+}
+if ( vorout != (struct triangulateio *) NULL ) {
+vorout->numberofpoints = triangles.items;
+vorout->numberofpointattributes = nextras;
+vorout->numberofedges = edges;
+}
 #endif /* TRILIBRARY */
-       /* If not using iteration numbers, don't write a .node file if one was */
-       /*   read, because the original one would be overwritten!              */
-       if ( nonodewritten || ( noiterationnum && readnodefile ) ) {
-               if ( !quiet ) {
-#ifdef TRILIBRARY
-                       printf( "NOT writing points.\n" );
+/* If not using iteration numbers, don't write a .node file if one was */
+/*   read, because the original one would be overwritten!              */
+if ( nonodewritten || ( noiterationnum && readnodefile )) {
+if ( !quiet ) {
+#ifdef
+TRILIBRARY
+printf( "NOT writing points.\n" );
 #else /* not TRILIBRARY */
-                       printf( "NOT writing a .node file.\n" );
+printf( "NOT writing a .node file.\n" );
 #endif /* not TRILIBRARY */
-               }
-               numbernodes();             /* We must remember to number the points. */
-       }
-       else {
-#ifdef TRILIBRARY
-               writenodes( &out->pointlist, &out->pointattributelist,
-                                       &out->pointmarkerlist );
+}
+numbernodes();             /* We must remember to number the points. */
+}
+else {
+#ifdef
+TRILIBRARY
+writenodes( &out->pointlist, &out->pointattributelist,
+&out->pointmarkerlist );
 #else /* not TRILIBRARY */
-               writenodes( outnodefilename, argc, argv ); /* Numbers the points too. */
+writenodes( outnodefilename, argc, argv ); /* Numbers the points too. */
 #endif /* TRILIBRARY */
-       }
-       if ( noelewritten ) {
-               if ( !quiet ) {
-#ifdef TRILIBRARY
-                       printf( "NOT writing triangles.\n" );
+}
+if ( noelewritten ) {
+if ( !quiet ) {
+#ifdef
+TRILIBRARY
+printf( "NOT writing triangles.\n" );
 #else /* not TRILIBRARY */
-                       printf( "NOT writing an .ele file.\n" );
+printf( "NOT writing an .ele file.\n" );
 #endif /* not TRILIBRARY */
-               }
-       }
-       else {
-#ifdef TRILIBRARY
-               writeelements( &out->trianglelist, &out->triangleattributelist );
+}
+}
+else {
+#ifdef
+TRILIBRARY
+writeelements( &out->trianglelist, &out->triangleattributelist );
 #else /* not TRILIBRARY */
-               writeelements( outelefilename, argc, argv );
+writeelements( outelefilename, argc, argv );
 #endif /* not TRILIBRARY */
-       }
-       /* The -c switch (convex switch) causes a PSLG to be written */
-       /*   even if none was read.                                  */
-       if ( poly || convex ) {
-               /* If not using iteration numbers, don't overwrite the .poly file. */
-               if ( nopolywritten || noiterationnum ) {
-                       if ( !quiet ) {
-#ifdef TRILIBRARY
-                               printf( "NOT writing segments.\n" );
+}
+/* The -c switch (convex switch) causes a PSLG to be written */
+/*   even if none was read.                                  */
+if ( poly || convex ) {
+/* If not using iteration numbers, don't overwrite the .poly file. */
+if ( nopolywritten || noiterationnum ) {
+if ( !quiet ) {
+#ifdef
+TRILIBRARY
+printf( "NOT writing segments.\n" );
 #else /* not TRILIBRARY */
-                               printf( "NOT writing a .poly file.\n" );
+printf( "NOT writing a .poly file.\n" );
 #endif /* not TRILIBRARY */
-                       }
-               }
-               else {
-#ifdef TRILIBRARY
-                       writepoly( &out->segmentlist, &out->segmentmarkerlist );
-                       out->numberofholes = holes;
-                       out->numberofregions = regions;
-                       if ( poly ) {
-                               out->holelist = in->holelist;
-                               out->regionlist = in->regionlist;
-                       }
-                       else {
-                               out->holelist = (REAL *) NULL;
-                               out->regionlist = (REAL *) NULL;
-                       }
+}
+}
+else {
+#ifdef
+TRILIBRARY
+writepoly( &out->segmentlist, &out->segmentmarkerlist );
+out->numberofholes = holes;
+out->numberofregions = regions;
+if ( poly ) {
+out->holelist = in->holelist;
+out->regionlist = in->regionlist;
+}
+else {
+out->holelist = (REAL *) NULL;
+out->regionlist = (REAL *) NULL;
+}
 #else /* not TRILIBRARY */
-                       writepoly( outpolyfilename, holearray, holes, regionarray, regions,
-                                          argc, argv );
+writepoly( outpolyfilename, holearray, holes, regionarray, regions,
+argc, argv );
 #endif /* not TRILIBRARY */
-               }
-       }
-#ifndef TRILIBRARY
-#ifndef CDT_ONLY
-       if ( regions > 0 ) {
-               free( regionarray );
-       }
+}
+}
+#ifndef
+TRILIBRARY
+#ifndef
+CDT_ONLY
+if ( regions > 0 ) {
+free( regionarray );
+}
 #endif /* not CDT_ONLY */
-       if ( holes > 0 ) {
-               free( holearray );
-       }
-       if ( geomview ) {
-               writeoff( offfilename, argc, argv );
-       }
+if ( holes > 0 ) {
+free( holearray );
+}
+if ( geomview ) {
+writeoff( offfilename, argc, argv );
+}
 #endif /* not TRILIBRARY */
-       if ( edgesout ) {
-#ifdef TRILIBRARY
-               writeedges( &out->edgelist, &out->edgemarkerlist );
+if ( edgesout ) {
+#ifdef
+TRILIBRARY
+writeedges( &out->edgelist, &out->edgemarkerlist );
 #else /* not TRILIBRARY */
-               writeedges( edgefilename, argc, argv );
+writeedges( edgefilename, argc, argv );
 #endif /* not TRILIBRARY */
-       }
-       if ( voronoi ) {
-#ifdef TRILIBRARY
-               writevoronoi( &vorout->pointlist, &vorout->pointattributelist,
-                                         &vorout->pointmarkerlist, &vorout->edgelist,
-                                         &vorout->edgemarkerlist, &vorout->normlist );
+}
+if ( voronoi ) {
+#ifdef
+TRILIBRARY
+writevoronoi( &vorout->pointlist, &vorout->pointattributelist,
+&vorout->pointmarkerlist, &vorout->edgelist,
+&vorout->edgemarkerlist, &vorout->normlist );
 #else /* not TRILIBRARY */
-               writevoronoi( vnodefilename, vedgefilename, argc, argv );
+writevoronoi( vnodefilename, vedgefilename, argc, argv );
 #endif /* not TRILIBRARY */
-       }
-       if ( neighbors ) {
-#ifdef TRILIBRARY
-               writeneighbors( &out->neighborlist );
+}
+if ( neighbors ) {
+#ifdef
+TRILIBRARY
+writeneighbors( &out->neighborlist );
 #else /* not TRILIBRARY */
-               writeneighbors( neighborfilename, argc, argv );
+writeneighbors( neighborfilename, argc, argv );
 #endif /* not TRILIBRARY */
-       }
-
-       if ( !quiet ) {
-#ifndef NO_TIMER
-               gettimeofday( &tv6, &tz );
-               printf( "\nOutput milliseconds:  %ld\n",
-                               1000l * ( tv6.tv_sec - tv5.tv_sec )
-                               + ( tv6.tv_usec - tv5.tv_usec ) / 1000l );
-               printf( "Total running milliseconds:  %ld\n",
-                               1000l * ( tv6.tv_sec - tv0.tv_sec )
-                               + ( tv6.tv_usec - tv0.tv_usec ) / 1000l );
+}
+
+if ( !quiet ) {
+#ifndef
+NO_TIMER
+gettimeofday( &tv6, &tz );
+printf( "\nOutput milliseconds:  %ld\n",
+1000l * ( tv6.tv_sec - tv5.tv_sec )
++ ( tv6.tv_usec - tv5.tv_usec ) / 1000l );
+printf( "Total running milliseconds:  %ld\n",
+1000l * ( tv6.tv_sec - tv0.tv_sec )
++ ( tv6.tv_usec - tv0.tv_usec ) / 1000l );
 #endif /* NO_TIMER */
 
-               statistics();
-       }
+statistics();
+}
 
-#ifndef REDUCED
-       if ( docheck ) {
-               checkmesh();
-               checkdelaunay();
-       }
+#ifndef
+REDUCED
+if ( docheck ) {
+checkmesh();
+checkdelaunay();
+}
 #endif /* not REDUCED */
 
-       triangledeinit();
-#ifndef TRILIBRARY
-       return 0;
+triangledeinit();
+#ifndef
+TRILIBRARY
+return 0;
 #endif /* not TRILIBRARY */
 }