Index: trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvo.h	(revision 15487)
+++ trunk/Ohana/src/libdvo/include/dvo.h	(revision 15509)
@@ -5,12 +5,4 @@
 # ifndef DVO_H
 # define DVO_H
-
-/*
-  # define ELIXIR 1
-  # define PANSTARRS 0
-  # define LONEOS 0
-*/
-
-/*** named data values (convert all to enums?) ***/
 
 /* DVO table modes */
@@ -55,4 +47,25 @@
 } OhanaProjectionMode;
 
+// these are used as NAN for types of int values
+typedef enum {
+    NAN_S_CHAR  = 0x7f,
+    NAN_U_CHAR  = 0xff,   // was NO_ERR
+    NAN_S_SHORT = 0x7fff, // was NO_MAG
+    NAN_U_SHORT = 0xffff, 
+    NAN_S_INT   = 0x7fffffff,
+    NAN_U_INT   = 0xffffffff,
+} DVO_INT_NAN;
+
+# ifndef (NAN)
+# ifndef (BYTE_SWAP)
+#  define __nan_bytes           { 0x7f, 0xc0, 0, 0 }
+# else
+#  define __nan_bytes           { 0, 0, 0xc0, 0x7f }
+# endif
+static union { unsigned char __c[4]; float __d; } __nan_union
+    __attribute_used__ = { __nan_bytes };
+# define NAN    (__nan_union.__d)
+# endif
+
 /* RegImage.flag values */
 # define IMREG_DIST  0x01 /* image distributed, only imregister-3.0 */
@@ -64,8 +77,4 @@
 # define LOAD_SECF 	0x08 
 # define LOAD_MEAS_META 0x10
-
-/* invalid mag value */
-# define NO_MAG    0x7fff
-# define NO_ERR    0xff
 
 /* photometry code types */
Index: trunk/Ohana/src/libdvo/src/dvo_catalog.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog.c	(revision 15487)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog.c	(revision 15509)
@@ -352,7 +352,7 @@
       }
       for (j = 0; j < Nextra; j++, out++) {
-	outsec[out].M  = NO_MAG;
-	outsec[out].dM = NO_MAG;
-	outsec[out].Xm    = NO_MAG;
+	outsec[out].M  = NAN;
+	outsec[out].dM = NAN;
+	outsec[out].Xm = NAN_S_SHORT;
       }
     }
Index: trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 15487)
+++ trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 15509)
@@ -221,5 +221,5 @@
 
   Np = photcodes[0].hashcode[measure[0].photcode];
-  if (Np == -1) return (NO_MAG);
+  if (Np == -1) return (NAN);
 
   if (photcodes[0].code[Np].type == PHOT_REF) {
@@ -241,5 +241,5 @@
 
   Np = photcodes[0].hashcode[measure[0].photcode];
-  if (Np == -1) return (NO_MAG);
+  if (Np == -1) return (NAN);
 
   if (photcodes[0].code[Np].type == PHOT_REF) {
@@ -260,5 +260,5 @@
 
   Np = photcodes[0].hashcode[measure[0].photcode];
-  if (Np == -1) return (NO_MAG);
+  if (Np == -1) return (NAN);
 
   if (photcodes[0].code[Np].type == PHOT_REF) {
@@ -271,5 +271,5 @@
   /* for DEP, color must be made of PRI/SEC */
   mc = PhotColorForCode (average, secfilt, NULL, code);
-  if (mc == NO_MAG) return (Mcat);
+  if (isnan(mc)) return (Mcat);
   mc = mc - SCALE*code[0].dX;
 
@@ -291,5 +291,5 @@
 
   Np = photcodes[0].hashcode[measure[0].photcode];
-  if (Np == -1) return (NO_MAG);
+  if (Np == -1) return (NAN);
 
   if (photcodes[0].code[Np].type == PHOT_REF) {
@@ -302,5 +302,5 @@
   /* for DEP, color must be made of PRI/SEC */
   mc = PhotColorForCode (average, secfilt, NULL, code);
-  if (mc == NO_MAG) return (Mrel);
+  if (isnan(mc)) return (Mrel);
   mc = mc - SCALE*code[0].dX;
 
@@ -323,7 +323,5 @@
   /* code must be the matching PRI/SEC code for this measurement or an equivalent ALT */
   Np = photcodes[0].hashcode[thisone[0].photcode];
-  if (Np == -1) {
-    return (NO_MAG);
-  }
+  if (Np == -1) return (NAN);
 
   if (photcodes[0].code[Np].type == PHOT_REF) {
@@ -331,12 +329,10 @@
     return (Mrel);
   }
-  if (code[0].code != photcodes[0].code[Np].equiv) {
-    return (NO_MAG);
-  }
+  if (code[0].code != photcodes[0].code[Np].equiv) return (NAN);
 
   Mcal = PhotRel (thisone, average, secfilt) + SCALE*code[0].C;
 
   mc = PhotColorForCode (average, secfilt, measure, code);
-  if (mc == NO_MAG) return (Mcal);
+  if (isnan(mc)) return (Mcal);
   mc = mc - SCALE*code[0].dX;
 
@@ -358,5 +354,5 @@
   PhotCode *color;
 
-  m1 = m2 = NO_MAG;
+  m1 = m2 = NAN;
 
   if (measure == NULL) {
@@ -364,7 +360,7 @@
     Ns2 = photcodes[0].hashNsec[code[0].c2];
   
-    m1 = (Ns1 == -1) ? NO_MAG : secfilt[Ns1].M;
-    m2 = (Ns2 == -1) ? NO_MAG : secfilt[Ns2].M;
-    mc = ((m1 == NO_MAG) || (m2 == NO_MAG)) ? NO_MAG : (m1 - m2);
+    m1 = (Ns1 == -1) ? NAN : secfilt[Ns1].M;
+    m2 = (Ns2 == -1) ? NAN : secfilt[Ns2].M;
+    mc = (isnan(m1) || isnan(m2)) ? NAN : (m1 - m2);
     return (mc);
   }
@@ -372,7 +368,7 @@
   /* find magnitude matching first color term */
   color = GetPhotcodebyCode (code[0].c1);
-  if (color == NULL) return (NO_MAG);
+  if (color == NULL) return (NAN);
   if (color[0].type == PHOT_REF) {
-    for (i = 0; (i < average[0].Nm) && (m1 == NO_MAG); i++) {
+    for (i = 0; (i < average[0].Nm) && (isnan(m1)); i++) {
       if (measure[i].photcode == color[0].code) {
 	m1 = measure[i].M;
@@ -381,12 +377,12 @@
   } else {
     Ns = photcodes[0].hashNsec[color[0].code];
-    m1 = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
+    m1 = (Ns == -1) ? NAN : secfilt[Ns].M;
   }	
 
   /* find magnitude matching second color term */
   color = GetPhotcodebyCode (code[0].c2);
-  if (color == NULL) return (NO_MAG);
+  if (color == NULL) return (NAN);
   if (color[0].type == PHOT_REF) {
-    for (i = 0; (i < average[0].Nm) && (m2 == NO_MAG); i++) {
+    for (i = 0; (i < average[0].Nm) && (isnan(m2)); i++) {
       if (measure[i].photcode == color[0].code) {
 	m2 = measure[i].M;
@@ -395,7 +391,7 @@
   } else {
     Ns = photcodes[0].hashNsec[color[0].code];
-    m2 = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
+    m2 = (Ns == -1) ? NAN : secfilt[Ns].M;
   }	
-  mc = ((m1 == NO_MAG) || (m2 == NO_MAG)) ? NO_MAG : (m1 - m2);
+  mc = (isnan(m1)) || isnan(m2))) ? NAN : (m1 - m2);
   return (mc);
 }
@@ -409,9 +405,9 @@
 
   Ns = photcodes[0].hashNsec[code[0].code];
-  Mave = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
+  Mave = (Ns == -1) ? NAN : secfilt[Ns].M;
   Mref = Mave + SCALE*code[0].C;
 
   mc = PhotColorForCode (average, secfilt, measure, code);
-  if (mc == NO_MAG) return (Mref);
+  if (isnan(mc)) return (Mref);
   mc = mc - SCALE*code[0].dX;
 
@@ -433,5 +429,5 @@
 
   Ns = photcodes[0].hashNsec[code[0].code];
-  Mave = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
+  Mave = (Ns == -1) ? NAN : secfilt[Ns].M;
   return (Mave);
 }
@@ -443,8 +439,9 @@
 
   Ns = photcodes[0].hashNsec[code[0].code];
-  dM  = (Ns == -1) ? NO_MAG : secfilt[Ns].dM;
+  dM  = (Ns == -1) ? NAN : secfilt[Ns].dM;
   return (dM);
 }
 
+// XXX return NAN or NAN_S_SHORT? (secfilt->Xm is short)
 float PhotXm (PhotCode *code, Average *average, SecFilt *secfilt) {
 
@@ -454,6 +451,6 @@
 
   Ns = photcodes[0].hashNsec[code[0].code];
-  Mi = (Ns == -1) ? NO_MAG : secfilt[Ns].Xm;
-  Xm = (Mi == NO_MAG) ? -1.0 : pow (10.0, 0.01*Mi);
+  Mi = (Ns == -1) ? NAN : secfilt[Ns].Xm;
+  Xm = (isnan(Mi)) ? -1.0 : pow (10.0, 0.01*Mi);
   return (Xm);
 }
@@ -478,5 +475,5 @@
   } else {
     Ns = photcodes[0].hashNsec[code[0].code];
-    M1 = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
+    M1 = (Ns == -1) ? NAN : secfilt[Ns].M;
   }	
 
@@ -494,5 +491,5 @@
   } else {
     Ns = photcodes[0].hashNsec[code[0].code];
-    M2 = (Ns == -1) ? NO_MAG : secfilt[Ns].M;
+    M2 = (Ns == -1) ? NAN : secfilt[Ns].M;
   }	
   
Index: trunk/Ohana/src/libdvo/src/photfits.c
===================================================================
--- trunk/Ohana/src/libdvo/src/photfits.c	(revision 15487)
+++ trunk/Ohana/src/libdvo/src/photfits.c	(revision 15509)
@@ -31,5 +31,5 @@
     return (0);
   }
-  return (NO_MAG);
+  return (NAN_S_SHORT);
 }
 
