Revision: 53399
          http://brlcad.svn.sourceforge.net/brlcad/?rev=53399&view=rev
Author:   brlcad
Date:     2012-10-30 01:50:21 +0000 (Tue, 30 Oct 2012)
Log Message:
-----------
implement support for differentiating between fastf_t and double structparse 
entries.  this fixes the assumption that they are the same and allows all of 
the existing callers to remain unaffected (they're fastf_t getting passed to 
%f.  they should now serialize correctly even if they are single-precision.

Modified Paths:
--------------
    brlcad/trunk/src/libbu/parse.c

Modified: brlcad/trunk/src/libbu/parse.c
===================================================================
--- brlcad/trunk/src/libbu/parse.c      2012-10-30 01:48:52 UTC (rev 53398)
+++ brlcad/trunk/src/libbu/parse.c      2012-10-30 01:50:21 UTC (rev 53399)
@@ -155,19 +155,34 @@
        /* [0] == '%', use printf-like format char */
        switch (ip->sp_fmt[1]) {
            case 'f':
+               /* Variable-precision "fastf_t" floating point */
+               len = ip->sp_count * sizeof(fastf_t);
+               CKMEM(len);
+               switch(sizeof(fastf_t)) {
+                   case sizeof(float):
+                       htonf((unsigned char *)cp, (unsigned char *)loc, 
ip->sp_count);
+                       break;
+                   case sizeof(double):
+                   default:
+                       htond((unsigned char *)cp, (unsigned char *)loc, 
ip->sp_count);
+                       break;
+               }
+               cp += len;
+               continue;
+           case 'g':
                /* Double-precision floating point */
-               len = ip->sp_count * 8;
+               len = ip->sp_count * sizeof(double);
                CKMEM(len);
                htond((unsigned char *)cp, (unsigned char *)loc, ip->sp_count);
                cp += len;
                continue;
            case 'd':
                /* 32-bit network integer, from "int" */
-               CKMEM(ip->sp_count * 4);
+               CKMEM(ip->sp_count * sizeof(int));
                {
                    register unsigned long l;
                    for (i = ip->sp_count; i > 0; i--) {
-                       l = *((int *)loc);
+                       l = *((long int *)loc);
                        cp[3] = l;
                        cp[2] = l >> 8;
                        cp[1] = l >> 16;
@@ -178,15 +193,15 @@
                }
                continue;
            case 'i':
-               /* 16-bit integer, from "int" */
+               /* 16-bit integer, from "short int" */
                CKMEM(ip->sp_count * 2);
                {
                    register unsigned short s;
                    for (i = ip->sp_count; i > 0; i--) {
-                       s = *((int *)loc);
+                       s = *((short int *)loc);
                        cp[1] = s;
                        cp[0] = s >> 8;
-                       loc += sizeof(int); /* XXX */
+                       loc += sizeof(short int);
                        cp += 2;
                    }
                }
@@ -307,8 +322,23 @@
        /* [0] == '%', use printf-like format char */
        switch (ip->sp_fmt[1]) {
            case 'f':
+               /* Variable-precision fastf_t floating point */
+               len = ip->sp_count * sizeof(fastf_t);
+               switch(sizeof(fastf_t)) {
+                   case sizeof(float):
+                       ntohf((unsigned char *)loc, cp, ip->sp_count);
+                       break;
+                   case sizeof(double):
+                   default:
+                       ntohd((unsigned char *)loc, cp, ip->sp_count);
+                       break;
+               }
+               cp += len;
+               bytes_used += len;
+               break;
+           case 'g':
                /* Double-precision floating point */
-               len = ip->sp_count * 8;
+               len = ip->sp_count * sizeof(double);
                ntohd((unsigned char *)loc, cp, ip->sp_count);
                cp += len;
                bytes_used += len;
@@ -324,18 +354,18 @@
                            ((long)cp[2] << 8) |
                            (long)cp[3];
                        *(int *)loc = l;
-                       loc += sizeof(int); /* XXX */
+                       loc += sizeof(int);
                        cp += 4;
                    }
                    bytes_used += ip->sp_count * 4;
                }
                break;
            case 'i':
-               /* 16-bit integer, from "int" */
+               /* 16-bit integer, from "short int" */
                for (i = ip->sp_count; i > 0; i--) {
-                   *(int *)loc =       (cp[0] << 8) |
+                   *(short int *)loc = (cp[0] << 8) |
                        cp[1];
-                   loc += sizeof(int); /* XXX */
+                   loc += sizeof(short int);
                    cp += 2;
                }
                bytes_used += ip->sp_count * 2;
@@ -524,13 +554,13 @@
 
 
 /**
- * Parse an array of one or more doubles.
+ * Parse an array of one or more floating point values.
  *
  * Returns: 0 when successful
  *         <0 upon failure
  */
 HIDDEN int
-parse_double(const char *str, size_t count, double *loc)
+parse_floating(const char *str, size_t count, fastf_t *floc, double *dloc)
 {
     size_t i;
     int dot_seen;
@@ -578,7 +608,10 @@
            return -1;
        }
 
-       *loc++ = tmp_double;
+       if (floc)
+           *floc++ = (fastf_t)tmp_double;
+       if (dloc)
+           *dloc++ = tmp_double;
 
        /* skip any whitespace before separator */
        while (*str && isspace((int)(*str)))
@@ -785,8 +818,11 @@
                }
                break;
            case 'f':
-               retval = parse_double(value, sdp->sp_count, (double *)loc);
+               retval = parse_floating(value, sdp->sp_count, (fastf_t *)loc, 
NULL);
                break;
+           case 'g':
+               retval = parse_floating(value, sdp->sp_count, NULL, (double 
*)loc);
+               break;
            case 'p': {
                struct bu_structparse *tbl = (struct bu_structparse 
*)sdp->sp_offset;
 
@@ -901,13 +937,11 @@
 }
 
 
-/**
- *
- * XXX Should this be here, or could it be with the matrix support?
+/* XXX Should this be here, or could it be with the matrix support?
  * pretty-print a matrix
  */
 HIDDEN void
-parse_matprint(const char *name, register const double *mat)
+parse_matprint(const char *name, register const fastf_t *mat)
 {
     int delta = (int)strlen(name)+2;
 
@@ -931,8 +965,61 @@
 
 
 HIDDEN void
+parse_dmatprint(const char *name, register const double *mat)
+{
+    int delta = (int)strlen(name)+2;
+
+    /* indent the body of the matrix */
+    bu_log_indent_delta(delta);
+
+    bu_log(" %s=%12E %12E %12E %12E\n",
+          name, mat[0], mat[1], mat[2], mat[3]);
+
+    bu_log("%12E %12E %12E %12E\n",
+          mat[4], mat[5], mat[6], mat[7]);
+
+    bu_log("%12E %12E %12E %12E\n",
+          mat[8], mat[9], mat[10], mat[11]);
+
+    bu_log_indent_delta(-delta);
+
+    bu_log("%12E %12E %12E %12E\n",
+          mat[12], mat[13], mat[14], mat[15]);
+}
+
+
+HIDDEN void
 parse_vls_matprint(struct bu_vls *vls,
                 const char *name,
+                register const fastf_t *mat)
+{
+    int delta = (int)strlen(name)+2;
+
+    /* indent the body of the matrix */
+    bu_log_indent_delta(delta);
+
+    bu_vls_printf(vls, " %s=%12E %12E %12E %12E\n",
+                 name, mat[0], mat[1], mat[2], mat[3]);
+    bu_log_indent_vls(vls);
+
+    bu_vls_printf(vls, "%12E %12E %12E %12E\n",
+                 mat[4], mat[5], mat[6], mat[7]);
+    bu_log_indent_vls(vls);
+
+    bu_vls_printf(vls, "%12E %12E %12E %12E\n",
+                 mat[8], mat[9], mat[10], mat[11]);
+    bu_log_indent_vls(vls);
+
+    bu_log_indent_delta(-delta);
+
+    bu_vls_printf(vls, "%12E %12E %12E %12E\n",
+                 mat[12], mat[13], mat[14], mat[15]);
+}
+
+
+HIDDEN void
+parse_vls_dmatprint(struct bu_vls *vls,
+                const char *name,
                 register const double *mat)
 {
     int delta = (int)strlen(name)+2;
@@ -1023,6 +1110,15 @@
        case 'f':
            {
                register size_t i = sdp->sp_count;
+               register fastf_t *fp = (fastf_t *)loc;
+
+               bu_vls_printf(vp, "%.25G", *fp++);
+               while (--i > 0) bu_vls_printf(vp, "%c%.25G", sep_char, *fp++);
+           }
+           break;
+       case 'g':
+           {
+               register size_t i = sdp->sp_count;
                register double *dp = (double *)loc;
 
                bu_vls_printf(vp, "%.25G", *dp++);
@@ -1162,7 +1258,7 @@
                break;
            case 'f':
                {
-                   register double *dp = (double *)loc;
+                   register fastf_t *dp = (fastf_t *)loc;
 
                    if (sdp->sp_count == 16) {
                        parse_matprint(sdp->sp_name, dp);
@@ -1193,6 +1289,39 @@
                    }
                }
                break;
+           case 'g':
+               {
+                   register double *dp = (double *)loc;
+
+                   if (sdp->sp_count == 16) {
+                       parse_dmatprint(sdp->sp_name, dp);
+                   } else if (sdp->sp_count <= 3) {
+                       bu_log("\t%s=%.25G", sdp->sp_name, *dp++);
+
+                       for (i=1; i < sdp->sp_count; i++) {
+                           bu_log("%c%.25G", COMMA, *dp++);
+                       }
+
+                       bu_log("\n");
+                   } else {
+                       int delta = (int)strlen(sdp->sp_name)+2;
+
+                       bu_log_indent_delta(delta);
+
+                       bu_log("\t%s=%.25G\n", sdp->sp_name, *dp++);
+
+                       /* print first and last value individually, so
+                        * don't iterate over them.
+                        */
+                       for (i=1; i < sdp->sp_count-1; i++) {
+                           bu_log("%.25G\n", *dp++);
+                       }
+
+                       bu_log_indent_delta(-delta);
+                       bu_log("%.25G\n", *dp);
+                   }
+               }
+               break;
            case 'x':
                {
                    register int *dp = (int *)loc;
@@ -1224,7 +1353,7 @@
 
 
 HIDDEN void
-parse_vls_print_double(struct bu_vls *vls, const char *name, register size_t 
count, register const double *dp)
+parse_vls_print_floating(struct bu_vls *vls, const char *name, size_t count, 
const fastf_t *fp, const double *dp)
 {
     register int tmpi;
     register char *cp;
@@ -1232,14 +1361,26 @@
     size_t increase = strlen(name) + 3 + 32 * count;
     bu_vls_extend(vls, (unsigned int)increase);
 
+
+    /* FIXME: should not directly access the bu_vls members */
     cp = vls->vls_str + vls->vls_offset + vls->vls_len;
-    snprintf(cp, increase, "%s%s=%.27G", (vls->vls_len?" ":""), name, *dp++);
+    if (fp) {
+       snprintf(cp, increase, "%s%s=%.27G", (vls->vls_len?" ":""), name, 
*fp++);
+    }
+    if (dp) {
+       snprintf(cp, increase, "%s%s=%.27G", (vls->vls_len?" ":""), name, 
*dp++);
+    }
     tmpi = (int)strlen(cp);
     vls->vls_len += tmpi;
 
     while (--count > 0) {
        cp += tmpi;
-       sprintf(cp, "%c%.27G", COMMA, *dp++);
+       if (fp) {
+           sprintf(cp, "%c%.27G", COMMA, *fp++);
+       }
+       if (dp) {
+           sprintf(cp, "%c%.27G", COMMA, *dp++);
+       }
        tmpi = (int)strlen(cp);
        vls->vls_len += tmpi;
     }
@@ -1373,9 +1514,11 @@
                }
                break;
            case 'f':
-               parse_vls_print_double(vls, sdp->sp_name, sdp->sp_count,
-                                    (double *)loc);
+               parse_vls_print_floating(vls, sdp->sp_name, sdp->sp_count, 
(fastf_t *)loc, NULL);
                break;
+           case 'g':
+               parse_vls_print_floating(vls, sdp->sp_name, sdp->sp_count, 
NULL, (double *)loc);
+               break;
            case 'p':
                {
                    struct bu_vls sub_str = BU_VLS_INIT_ZERO;
@@ -1488,7 +1631,7 @@
            case 'f':
                {
                    register size_t i = sdp->sp_count;
-                   register double *dp = (double *)loc;
+                   register fastf_t *dp = (fastf_t *)loc;
 
                    if (sdp->sp_count == 16) {
                        parse_vls_matprint(vls_out, sdp->sp_name, dp);
@@ -1519,6 +1662,40 @@
                    }
                }
                break;
+           case 'g':
+               {
+                   register size_t i = sdp->sp_count;
+                   register double *dp = (double *)loc;
+
+                   if (sdp->sp_count == 16) {
+                       parse_vls_dmatprint(vls_out, sdp->sp_name, dp);
+                   } else if (sdp->sp_count <= 3) {
+                       bu_vls_printf(vls_out, "\t%s=%.25G", sdp->sp_name, 
*dp++);
+
+                       while (--i > 0)
+                           bu_vls_printf(vls_out, "%c%.25G", COMMA, *dp++);
+
+                       bu_vls_printf(vls_out, "\n");
+                   } else {
+                       int delta = (int)strlen(sdp->sp_name)+2;
+
+                       bu_log_indent_delta(delta);
+                       bu_vls_printf(vls_out, "\t%s=%.25G\n", sdp->sp_name, 
*dp++);
+                       bu_log_indent_vls(vls_out);
+
+                       /* print first and last value individually, so
+                        * don't iterate over them.
+                        */
+                       while (--i > 1) {
+                           bu_vls_printf(vls_out, "%.25G\n", *dp++);
+                           bu_log_indent_vls(vls_out);
+                       }
+
+                       bu_log_indent_delta(-delta);
+                       bu_vls_printf(vls_out, "%.25G\n", *dp);
+                   }
+               }
+               break;
            case 'x':
                {
                    register size_t i = sdp->sp_count;
@@ -2436,13 +2613,15 @@
                        bu_vls_printf(logstr, "%s ", argv[0]);
                    break;
                }
+               case 'g':
                case 'f': {
+                   int ret;
                    int dot_seen;
+                   const char *numstart;
                    double tmp_double;
-                   register double *dp;
-                   const char *numstart;
 
-                   dp = (double *)loc;
+                   double *dp = (double *)loc;
+                   fastf_t *fp = (fastf_t *)loc;
 
                    if (argc < 1) {
                        bu_vls_printf(&str,
@@ -2507,7 +2686,9 @@
                        bu_vls_trunc(&str, 0);
                        bu_vls_strcpy(&str, numstart);
                        bu_vls_trunc(&str, cp-numstart);
-                       if (sscanf(bu_vls_addr(&str), "%lf", &tmp_double) != 1) 
{
+
+                       ret = sscanf(bu_vls_addr(&str), "%lf", &tmp_double);
+                       if (ret != 1) {
                            bu_vls_printf(logstr,
                                          "value \"%s\" to argument %s isn't a 
float",
                                          numstart,
@@ -2517,7 +2698,11 @@
                        }
                        bu_vls_free(&str);
 
-                       *dp++ = tmp_double;
+                       if (sdp->sp_fmt[1] == 'f') {
+                           *fp++ = (fastf_t)tmp_double;
+                       } else {
+                           *dp++ = tmp_double;
+                       }
 
                        BU_SP_SKIP_SEP(cp);
                    }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to