Index: trunk/Ohana/src/addstar/src/find_matches_refstars.c
===================================================================
--- trunk/Ohana/src/addstar/src/find_matches_refstars.c	(revision 26278)
+++ trunk/Ohana/src/addstar/src/find_matches_refstars.c	(revision 26279)
@@ -3,13 +3,11 @@
 int find_matches_refstars (SkyRegion *region, Stars **stars, int Nstars, Catalog *catalog, AddstarClientOptions options) {
 
-  int i, j, k, n, m, N, J;
+  int i, j, n, N, J;
   double RADIUS, RADIUS2;
   double *X1, *Y1, *X2, *Y2;
   double dX, dY, dR;
-  int *N1, *N2,  *next, *next_miss, last, last_miss;
-  int Nave, NAVE, Nmeas, NMEAS, Nmiss, NMISS, Nmatch;
+  int *N1, *N2,  *next_meas;
+  int Nave, NAVE, Nmeas, NMEAS, Nmatch;
   unsigned int objID, catID;
-  Measure *tmpmeasure;
-  Missing *tmpmissing;
   Coords tcoords;
   int Nsecfilt;
@@ -42,14 +40,6 @@
   Nmeas = catalog[0].Nmeasure;
   NMEAS = Nmeas + 1000;
-  ALLOCATE (next, int, NMEAS);
+  ALLOCATE (next_meas, int, NMEAS);
   REALLOCATE (catalog[0].measure, Measure, NMEAS);
-  
-  Nmiss = catalog[0].Nmissing;
-  NMISS = Nmiss + 1000;
-  if ((NMISS < 1) || (NMISS > 1e10)) {
-      fprintf (stderr, "weird value for NMISS: %d\n", NMISS);
-  }
-  ALLOCATE (next_miss, int, NMISS);
-  REALLOCATE (catalog[0].missing, Missing, NMISS);
   
   // current max obj ID for this catalog
@@ -82,15 +72,11 @@
 
   /* set up pointers for linked list of measurements */
-  for (i = 0; i < Nmeas - 1; i++) {
-    next[i] = i+1;
-  }
-  next[i] = -1;
-  last = i;
-
-  for (i = 0; i < Nmiss - 1; i++) {
-    next_miss[i] = i+1;
-  }
-  next_miss[i] = -1;
-  last_miss = i;
+  if (catalog[0].sorted && (catalog[0].Nmeasure == catalog[0].Nmeas_disk)) {
+    // this version is only valid if we have done a full catalog load, and if the catalog
+    // is sorted while processed
+    next_meas = init_measure_links (catalog[0].average, Nave, catalog[0].measure, Nmeas);
+  } else {
+    next_meas = build_measure_links (catalog[0].average, Nave, catalog[0].measure, Nmeas);
+  }    
 
   /* choose a radius for matches */
@@ -126,19 +112,10 @@
       n = N2[J];
       N = N1[i];
-      m = catalog[0].average[n].measureOffset;  
 
       /** in replace mode, search for entry and replace values M, dM, R, D */
-      if (options.replace && replace_match (&catalog[0].average[n], &catalog[0].measure[m], stars[N])) continue;
-
-      /** insert star in measurement list */
-      /* find last measurement of this star */
-      for (k = 0; k < catalog[0].average[n].Nmeasure - 1; k++) m = next[m];
-
-      /* set up references */
-      next[Nmeas] = next[m];
-      next[m] = Nmeas;
-
-      /* last just was moved */
-      if (next[Nmeas] == -1) last = Nmeas;
+      if (options.replace && replace_match (&catalog[0].average[n], catalog[0].measure, stars[N])) continue;
+
+      /* add to end of measurement list */
+      add_meas_link (&catalog[0].average[n], next_meas, Nmeas, NMEAS);
 	
       /** add measurements for this star **/
@@ -206,9 +183,9 @@
       if (Nmeas == NMEAS) {
 	NMEAS = Nmeas + 1000;
-	REALLOCATE (next, int, NMEAS);
+	REALLOCATE (next_meas, int, NMEAS);
 	REALLOCATE (catalog[0].measure, Measure, NMEAS);
       }
 
-      update_coords (&catalog[0].average[n], &catalog[0].measure[0], next);
+      update_coords (&catalog[0].average[n], &catalog[0].measure[0], next_meas);
     }
     i++;
@@ -295,11 +272,8 @@
 
       stars[N][0].found = Nmeas;
-      next[last] = Nmeas;
-      next[Nmeas] = -1;
-      last = Nmeas;
       Nmeas ++;
       if (Nmeas == NMEAS) {
 	NMEAS = Nmeas + 1000;
-	REALLOCATE (next, int, NMEAS);
+	REALLOCATE (next_meas, int, NMEAS);
 	REALLOCATE (catalog[0].measure, Measure, NMEAS);
       }
@@ -314,37 +288,8 @@
   }
       
-  free (catalog[0].found);
   REALLOCATE (catalog[0].average, Average, Nave);
 
-  /* fix order of Measure (memory intensive, but fast) */
-  N = 0; 
-  ALLOCATE (tmpmeasure, Measure, Nmeas);
-  for (i = 0; i < Nave; i++) {
-    n = catalog[0].average[i].measureOffset;
-    catalog[0].average[i].measureOffset = N;
-    for (k = 0; k < catalog[0].average[i].Nmeasure; k++, N++) {
-      tmpmeasure[N] = catalog[0].measure[n]; 
-      tmpmeasure[N].averef = i;
-      n = next[n];
-    }
-  }
-  free (catalog[0].measure);
-  catalog[0].measure = tmpmeasure;
-    
-  /* fix order of Missing (memory intensive, but fast) */
-  N = 0; 
-  ALLOCATE (tmpmissing, Missing, Nmiss);
-  for (i = 0; i < Nave; i++) {
-    if (catalog[0].average[i].Nmissing > 0) {
-      n = catalog[0].average[i].missingOffset;
-      catalog[0].average[i].missingOffset = N;
-      for (k = 0; k < catalog[0].average[i].Nmissing; k++, N++) {
-	tmpmissing[N] = catalog[0].missing[n]; 
-	n = next_miss[n];
-      }
-    }
-  }
-  free (catalog[0].missing);
-  catalog[0].missing = tmpmissing;
+  // XXX allow for unsorted output?
+  catalog[0].measure = sort_measure (catalog[0].average, Nave, catalog[0].measure, Nmeas, next_meas);
 
   /* note stars which have been found in this catalog */
@@ -357,4 +302,11 @@
   }
 
+  catalog[0].objID    = objID; // new max value, save on catalog close
+  catalog[0].Naverage = Nave;
+  catalog[0].Nmeasure = Nmeas;
+  catalog[0].Nsecf_mem = Nave*Nsecfilt;
+  if (VERBOSE) fprintf (stderr, "Nstars, Nave, Nmeas: %d %d %d, (%d matches)\n", Nstars, Nave, Nmeas, Nmatch);
+
+  free (catalog[0].found);
   free (X1);
   free (Y1);
@@ -363,13 +315,6 @@
   free (Y2);
   free (N2);
-  free (next);
-  free (next_miss);
-
-  catalog[0].objID    = objID; // new max value, save on catalog close
-  catalog[0].Naverage = Nave;
-  catalog[0].Nmeasure = Nmeas;
-  catalog[0].Nmissing = Nmiss;
-  catalog[0].Nsecf_mem = Nave*Nsecfilt;
-  if (VERBOSE) fprintf (stderr, "Nstars, Nave, Nmeas, Nmiss: %d %d %d %d, (%d matches)\n", Nstars, Nave, Nmeas, Nmiss, Nmatch);
+  free (next_meas);
+
   return (Nmatch);
 }
