Thread: [brlcad-commits] SF.net SVN: brlcad:[33050] brlcad/trunk/src/libbu/units.c
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <sta...@us...> - 2008-10-24 17:11:22
|
Revision: 33050 http://brlcad.svn.sourceforge.net/brlcad/?rev=33050&view=rev Author: starseeker Date: 2008-10-24 17:11:19 +0000 (Fri, 24 Oct 2008) Log Message: ----------- Change the internal name of the unit table to reflect that it is length only - other tables will be added so the 'unspoken assumption' that everything is length will no longer hold. Can't do this (yet) for externally visible functions but at least internally it should help avoid confusion. Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2008-10-23 17:10:52 UTC (rev 33049) +++ brlcad/trunk/src/libbu/units.c 2008-10-24 17:11:19 UTC (rev 33050) @@ -41,7 +41,7 @@ static const struct cvt_tab { double val; char name[32]; -} bu_units_tab[] = { +} bu_units_length_tab[] = { {0.0, "none"}, {1.0e-21, "ym"}, {1.0e-21, "yoctometer"}, @@ -125,7 +125,7 @@ {3.08568025e+19, "parsec"}, {0.0, ""} /* LAST ENTRY */ }; -#define BU_UNITS_TABLE_SIZE (sizeof(bu_units_tab) / sizeof(struct cvt_tab) - 1) +#define BU_UNITS_LENGTH_TABLE_SIZE (sizeof(bu_units_length_tab) / sizeof(struct cvt_tab) - 1) /** * B U _ U N I T S _ C O N V E R S I O N @@ -164,7 +164,7 @@ if (ubuf[len-1] == 's') ubuf[len-1] = '\0'; /* Search for this string in the table */ - for (tp=bu_units_tab; tp->name[0]; tp++) { + for (tp=bu_units_length_tab; tp->name[0]; tp++) { if (ubuf[0] != tp->name[0]) continue; if (strcmp(ubuf, tp->name) != 0) continue; return (tp->val); @@ -193,7 +193,7 @@ return (char *)NULL; /* Search for this string in the table */ - for (tp=bu_units_tab; tp->name[0]; tp++) { + for (tp=bu_units_length_tab; tp->name[0]; tp++) { fastf_t diff, bigger; if (mm == tp->val) @@ -242,7 +242,7 @@ return (char *)NULL; /* Search for this unit in the table */ - for (tp=bu_units_tab; tp->name[0]; tp++) { + for (tp=bu_units_length_tab; tp->name[0]; tp++) { double nearness; /* skip zero so we don't return 'none' */ @@ -299,7 +299,7 @@ return v; } - for (tp=bu_units_tab; tp->name[0]; tp++) { + for (tp=bu_units_length_tab; tp->name[0]; tp++) { if (*ptr != tp->name[0]) continue; if (strcmp(ptr, tp->name) == 0) { v *= tp->val; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-10-24 22:16:20
|
Revision: 33054 http://brlcad.svn.sourceforge.net/brlcad/?rev=33054&view=rev Author: starseeker Date: 2008-10-24 22:16:17 +0000 (Fri, 24 Oct 2008) Log Message: ----------- Add in two of g_qa's unit tables. Need to add a 3rd for weights, which are not the same as mass Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2008-10-24 21:08:45 UTC (rev 33053) +++ brlcad/trunk/src/libbu/units.c 2008-10-24 22:16:17 UTC (rev 33054) @@ -38,10 +38,12 @@ #include "bu.h" -static const struct cvt_tab { +struct cvt_tab { double val; char name[32]; -} bu_units_length_tab[] = { +}; + +static const struct cvt_tab bu_units_length_tab[] = { {0.0, "none"}, {1.0e-21, "ym"}, {1.0e-21, "yoctometer"}, @@ -125,8 +127,45 @@ {3.08568025e+19, "parsec"}, {0.0, ""} /* LAST ENTRY */ }; -#define BU_UNITS_LENGTH_TABLE_SIZE (sizeof(bu_units_length_tab) / sizeof(struct cvt_tab) - 1) +#define BU_UNITS_TABLE_SIZE (sizeof(bu_units_length_tab) / sizeof(struct cvt_tab) - 1) +static const struct cvt_tab bu_units_volume_tab[] = { + {0.0, "none"}, + {1.0, "mm^3"}, /* default */ + {1.0, "cu mm"}, + {1.0e3, "cm^3"}, + {1.0e3, "cu cm"}, + {1.0e3, "cc"}, + {1.0e6, "l"}, + {1.0e6, "liter"}, + {1.0e6, "litre"}, + {1.0e9, "m^3"}, + {1.0e9, "cu m"}, + {16387.064, "in^3"}, + {16387.064, "cu in"}, + {28316846.592, "ft^3"}, + {28316846.592, "cu ft"}, + {764554857.984, "yds^3"}, + {764554857.984, "yards^3"}, + {764554857.984, "cu yards"}, + {0.0, ""} /* LAST ENTRY */ +}; + +static const struct cvt_tab bu_units_mass_tab[] = { + {0.0, "none"}, + {1.0, "grams"}, /* default */ + {1.0, "g"}, + {1.0e3, "kilograms"}, + {1.0e3, "kg"}, + {0.0648, "gr"}, + {0.0648, "grains"}, + {0.0, ""} /* LAST ENTRY */ +}; + + + + + /** * B U _ U N I T S _ C O N V E R S I O N * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2008-10-27 23:57:37
|
Revision: 33084 http://brlcad.svn.sourceforge.net/brlcad/?rev=33084&view=rev Author: starseeker Date: 2008-10-27 23:57:22 +0000 (Mon, 27 Oct 2008) Log Message: ----------- Expand bu_units_conversion to support volume and mass. The order of searching for matches is length, volume and finally mass. Since unit names are unique across dimensions, this works for the string->conversion factor direction and no new function call is needed. Unfortunately, it is NOT the case that conversion factors are unique to dimensions and as a consequence a general conversion factor -> string function must know if it is looking for a length, volume or mass. Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2008-10-27 20:27:19 UTC (rev 33083) +++ brlcad/trunk/src/libbu/units.c 2008-10-27 23:57:22 UTC (rev 33084) @@ -43,7 +43,11 @@ char name[32]; }; -static const struct cvt_tab bu_units_length_tab[] = { +struct conv_table { + struct cvt_tab *cvttab; +}; + +struct cvt_tab bu_units_length_tab[] = { {0.0, "none"}, {1.0e-21, "ym"}, {1.0e-21, "yoctometer"}, @@ -129,7 +133,7 @@ }; #define BU_UNITS_TABLE_SIZE (sizeof(bu_units_length_tab) / sizeof(struct cvt_tab) - 1) -static const struct cvt_tab bu_units_volume_tab[] = { +struct cvt_tab bu_units_volume_tab[] = { {0.0, "none"}, {1.0, "mm^3"}, /* default */ {1.0, "cu mm"}, @@ -151,26 +155,31 @@ {0.0, ""} /* LAST ENTRY */ }; -static const struct cvt_tab bu_units_mass_tab[] = { +struct cvt_tab bu_units_mass_tab[] = { {0.0, "none"}, {1.0, "grams"}, /* default */ {1.0, "g"}, - {1.0e3, "kilograms"}, + {1.0e3, "kilogram"}, {1.0e3, "kg"}, {0.0648, "gr"}, - {0.0648, "grains"}, + {0.0648, "grain"}, + {453.6, "lb"}, + {28.35, "oz"}, + {28.35, "ounce"}, {0.0, ""} /* LAST ENTRY */ }; +static const struct conv_table unit_lists[3] = { + bu_units_length_tab, bu_units_volume_tab, bu_units_mass_tab +}; - - - /** * B U _ U N I T S _ C O N V E R S I O N * * Given a string representation of a unit of distance (eg, "feet"), - * return the multiplier which will convert that unit into millimeters. + * return the multiplier which will convert that unit into the default + * unit for the dimension (millimeters for length, mm^3 for volume, + * and grams for mass.) * * Returns - * 0.0 error @@ -182,6 +191,7 @@ register char *ip; register int c; register const struct cvt_tab *tp; + register const struct conv_table *cvtab; char ubuf[256]; int len; @@ -203,10 +213,12 @@ if (ubuf[len-1] == 's') ubuf[len-1] = '\0'; /* Search for this string in the table */ - for (tp=bu_units_length_tab; tp->name[0]; tp++) { - if (ubuf[0] != tp->name[0]) continue; - if (strcmp(ubuf, tp->name) != 0) continue; - return (tp->val); + for (cvtab=unit_lists; cvtab->cvttab; cvtab++) { + for (tp=cvtab->cvttab; tp->name[0]; tp++) { + if (ubuf[0] != tp->name[0]) continue; + if (strcmp(ubuf, tp->name) != 0) continue; + return (tp->val); + } } return (0.0); /* Unable to find it */ } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2009-11-04 04:40:32
|
Revision: 36402 http://brlcad.svn.sourceforge.net/brlcad/?rev=36402&view=rev Author: brlcad Date: 2009-11-04 04:40:25 +0000 (Wed, 04 Nov 2009) Log Message: ----------- convert to near-zero testing instead of relying on == testing of potentially non-ieee floating point types. quell verbose compilation warnings. Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2009-11-04 04:32:29 UTC (rev 36401) +++ brlcad/trunk/src/libbu/units.c 2009-11-04 04:40:25 UTC (rev 36402) @@ -24,10 +24,15 @@ #include <stdio.h> #include <ctype.h> #include <string.h> +#include <float.h> #include "bu.h" +/* done specifically to avoid a libbn dependency */ +#define NEAR_ZERO(val, epsilon) (((val) > -epsilon) && ((val) < epsilon)) + + struct cvt_tab { double val; char name[32]; @@ -160,7 +165,7 @@ }; static const struct conv_table unit_lists[3] = { - bu_units_length_tab, bu_units_volume_tab, bu_units_mass_tab + {bu_units_length_tab}, {bu_units_volume_tab}, {bu_units_mass_tab} }; @@ -215,7 +220,7 @@ for (tp=bu_units_length_tab; tp->name[0]; tp++) { fastf_t diff, bigger; - if (mm == tp->val) + if (NEAR_ZERO(mm - tp->val, SMALL_FASTF)) return tp->name; /* Check for near-miss */ @@ -245,7 +250,7 @@ register const struct cvt_tab *tp; const char *nearest = NULL; - double nearer = 99.0e+99; + double nearer = DBL_MAX; if (mm <= 0) return (char *)NULL; @@ -255,11 +260,11 @@ double nearness; /* skip zero so we don't return 'none' */ - if (tp->val == 0.0) + if (NEAR_ZERO(tp->val, SMALL_FASTF)) continue; /* break early on perfect match */ - if (mm == tp->val) + if (NEAR_ZERO(mm - tp->val, SMALL_FASTF)) return tp->name; /* Check for nearness */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-03-25 01:46:25
|
Revision: 38162 http://brlcad.svn.sourceforge.net/brlcad/?rev=38162&view=rev Author: brlcad Date: 2010-03-25 01:46:18 +0000 (Thu, 25 Mar 2010) Log Message: ----------- unbreak compilation, no exactly floating point comparisons Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2010-03-25 01:30:20 UTC (rev 38161) +++ brlcad/trunk/src/libbu/units.c 2010-03-25 01:46:18 UTC (rev 38162) @@ -251,7 +251,7 @@ BU_GETSTRUCT(vlsp, bu_vls); bu_vls_init(vlsp); for (tp=bu_units_length_tab; tp->name[0]; tp++) { - if (prev_val == tp->val) + if (NEAR_ZERO(prev_val - tp->val, SMALL_FASTF)) continue; bu_vls_printf(vlsp, "%s, ", tp->name); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ind...@us...> - 2010-04-20 15:01:38
|
Revision: 38628 http://brlcad.svn.sourceforge.net/brlcad/?rev=38628&view=rev Author: indianlarry Date: 2010-04-20 15:01:32 +0000 (Tue, 20 Apr 2010) Log Message: ----------- Added NULL conv_table element to end of unit_lists[]. Looping constructs were setup to expect this as final value and would cause a segmentation fault when unit not found. Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2010-04-20 14:49:50 UTC (rev 38627) +++ brlcad/trunk/src/libbu/units.c 2010-04-20 15:01:32 UTC (rev 38628) @@ -164,8 +164,8 @@ {0.0, ""} /* LAST ENTRY */ }; -static const struct conv_table unit_lists[3] = { - {bu_units_length_tab}, {bu_units_volume_tab}, {bu_units_mass_tab} +static const struct conv_table unit_lists[4] = { + {bu_units_length_tab}, {bu_units_volume_tab}, {bu_units_mass_tab}, {NULL} }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2011-02-11 05:25:42
|
Revision: 43211 http://brlcad.svn.sourceforge.net/brlcad/?rev=43211&view=rev Author: brlcad Date: 2011-02-11 05:25:36 +0000 (Fri, 11 Feb 2011) Log Message: ----------- convert from NEAR_ZERO() to ZERO() Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2011-02-11 05:08:26 UTC (rev 43210) +++ brlcad/trunk/src/libbu/units.c 2011-02-11 05:25:36 UTC (rev 43211) @@ -31,6 +31,7 @@ /* done specifically to avoid a libbn dependency */ #define NEAR_ZERO(val, epsilon) (((val) > -epsilon) && ((val) < epsilon)) +#define ZERO(val) NEAR_ZERO((val), SMALL_FASTF) struct cvt_tab { @@ -221,7 +222,7 @@ for (tp=bu_units_length_tab; tp->name[0]; tp++) { fastf_t diff, bigger; - if (NEAR_ZERO(mm - tp->val, SMALL_FASTF)) + if (ZERO(mm - tp->val)) return tp->name; /* Check for near-miss */ @@ -254,7 +255,7 @@ BU_GETSTRUCT(vlsp, bu_vls); bu_vls_init(vlsp); for (tp=bu_units_length_tab; tp->name[0]; tp++) { - if (NEAR_ZERO(prev_val - tp->val, SMALL_FASTF)) + if (ZERO(prev_val - tp->val)) continue; bu_vls_printf(vlsp, "%s, ", tp->name); @@ -284,11 +285,11 @@ double nearness; /* skip zero so we don't return 'none' */ - if (NEAR_ZERO(tp->val, SMALL_FASTF)) + if (ZERO(tp->val)) continue; /* break early on perfect match */ - if (NEAR_ZERO(mm - tp->val, SMALL_FASTF)) + if (ZERO(mm - tp->val)) return tp->name; /* Check for nearness */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2012-10-17 15:51:29
|
Revision: 53156 http://brlcad.svn.sourceforge.net/brlcad/?rev=53156&view=rev Author: carlmoore Date: 2012-10-17 15:51:20 +0000 (Wed, 17 Oct 2012) Log Message: ----------- fix spellings Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 15:49:39 UTC (rev 53155) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 15:51:20 UTC (rev 53156) @@ -92,7 +92,7 @@ {1.0e+27, "yottameter"}, {25.4, "in"}, {25.4, "inch"}, - {25.4, "inche"}, /* plural */ + {25.4, "inches"}, /* plural */ {101.6, "hand"}, {304.8, "ft"}, {304.8, "foot"}, @@ -320,11 +320,11 @@ if (ptr == s) { /* No number could be found, unity is implied */ - /* e.g. interprept "ft" as "1ft" */ + /* e.g. interpret "ft" as "1ft" */ v = 1.0; } if (! *ptr) { - /* There are no characters following the scaned number */ + /* There are no characters following the scanned number */ return v; } @@ -345,7 +345,7 @@ bu_mm_cvt(register const struct bu_structparse *sdp, register const char *name, char *base, const char *value) /* structure description */ /* struct member name */ -/* begining of structure */ +/* beginning of structure */ /* string containing value */ { register double *p = (double *)(base+sdp->sp_offset); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-10-17 19:32:16
|
Revision: 53180 http://brlcad.svn.sourceforge.net/brlcad/?rev=53180&view=rev Author: brlcad Date: 2012-10-17 19:32:06 +0000 (Wed, 17 Oct 2012) Log Message: ----------- create a units_name_matches() function so we can get a little better at name matching and do so in one place Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 19:06:41 UTC (rev 53179) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 19:32:06 UTC (rev 53180) @@ -170,6 +170,15 @@ }; +static int +units_name_matches(const char *input, const char *name) +{ + int match; + match = BU_STR_EQUAL(input, name); + return match; +} + + double bu_units_conversion(const char *str) { @@ -202,7 +211,8 @@ for (cvtab=unit_lists; cvtab->cvttab; cvtab++) { for (tp=cvtab->cvttab; tp->name[0]; tp++) { if (ubuf[0] != tp->name[0]) continue; - if (!BU_STR_EQUAL(ubuf, tp->name)) continue; + if (!units_name_matches(ubuf, tp->name)) + continue; return tp->val; } } @@ -216,7 +226,7 @@ register const struct cvt_tab *tp; if (UNLIKELY(mm <= 0)) - return (char *)NULL; + return (const char *)NULL; /* Search for this string in the table */ for (tp=bu_units_length_tab; tp->name[0]; tp++) { @@ -242,7 +252,7 @@ if (diff < 0.000000001 * bigger) return tp->name; } - return (char *)NULL; + return (const char *)NULL; } struct bu_vls * @@ -278,7 +288,7 @@ double nearer = DBL_MAX; if (UNLIKELY(mm <= 0)) - return (char *)NULL; + return (const char *)NULL; /* Search for this unit in the table */ for (tp=bu_units_length_tab; tp->name[0]; tp++) { @@ -330,7 +340,7 @@ for (tp=bu_units_length_tab; tp->name[0]; tp++) { if (*ptr != tp->name[0]) continue; - if (BU_STR_EQUAL(ptr, tp->name)) { + if (units_name_matches(ptr, tp->name)) { v *= tp->val; return v; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-10-17 20:07:48
|
Revision: 53181 http://brlcad.svn.sourceforge.net/brlcad/?rev=53181&view=rev Author: brlcad Date: 2012-10-17 20:07:42 +0000 (Wed, 17 Oct 2012) Log Message: ----------- convert the inputs to lowercase with no spaces for comparison Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 19:32:06 UTC (rev 53180) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 20:07:42 UTC (rev 53181) @@ -173,8 +173,39 @@ static int units_name_matches(const char *input, const char *name) { + const char *cp; int match; - match = BU_STR_EQUAL(input, name); + struct bu_vls normalized_input = BU_VLS_INIT_ZERO; + struct bu_vls normalized_name = BU_VLS_INIT_ZERO; + + /* convert NULL */ + if (!input) + input = ""; + if (!name) + name = ""; + + cp = input; + /* skip spaces, convert to lowercase */ + while (*cp != '\0') { + if (!isspace(*cp)) + bu_vls_putc(&normalized_input, tolower(*cp)); + cp++; + } + + cp = name; + /* skip spaces, convert to lowercase */ + while (*cp != '\0') { + if (!isspace(*cp)) + bu_vls_putc(&normalized_name, tolower(*cp)); + cp++; + } + + /* compare */ + match = BU_STR_EQUAL(bu_vls_addr(&normalized_input), bu_vls_addr(&normalized_name)); + + bu_vls_free(&normalized_input); + bu_vls_free(&normalized_name); + return match; } @@ -347,7 +378,7 @@ } /* A string was seen, but not found in the table. Signal error */ - return -1; + return -1.0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-10-17 20:10:35
|
Revision: 53182 http://brlcad.svn.sourceforge.net/brlcad/?rev=53182&view=rev Author: brlcad Date: 2012-10-17 20:10:29 +0000 (Wed, 17 Oct 2012) Log Message: ----------- no longer need to convert to lowercase here since units_name_matches() does it for us. Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 20:07:42 UTC (rev 53181) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 20:10:29 UTC (rev 53182) @@ -213,27 +213,14 @@ double bu_units_conversion(const char *str) { - register char *ip; - register int c; register const struct cvt_tab *tp; register const struct conv_table *cvtab; char ubuf[256]; size_t len; + /* Copy the given string */ bu_strlcpy(ubuf, str, sizeof(ubuf)); - /* Copy the given string, making it lower case */ - ip = ubuf; - c = *ip; - while (c) { - if (isupper(c)) - *ip++ = tolower(c); - else - ip++; - - c = *ip; - } - /* Remove any trailing "s" (plural) */ len = strlen(ubuf); if (ubuf[len-1] == 's') ubuf[len-1] = '\0'; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-10-17 20:17:39
|
Revision: 53183 http://brlcad.svn.sourceforge.net/brlcad/?rev=53183&view=rev Author: brlcad Date: 2012-10-17 20:17:33 +0000 (Wed, 17 Oct 2012) Log Message: ----------- no lnoger need to compare entries that merely differ by interior whitespace Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 20:10:29 UTC (rev 53182) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 20:17:33 UTC (rev 53183) @@ -107,21 +107,14 @@ {1609344.0, "mi"}, {1609344.0, "mile"}, {1852000.0, "nmile"}, - {1852000.0, "nauticalmile"}, {1852000.0, "nautical mile"}, {5556000.0, "league"}, - {2.99792458e+11, "lightsecond"}, {2.99792458e+11, "light second"}, - {1.79875475e+13, "lightminute"}, {1.79875475e+13, "light minute"}, {1.495979e+14, "AU"}, - {1.495979e+14, "astronomicalunit"}, {1.495979e+14, "astronomical unit"}, - {1.07925285e+15, "lighthour"}, {1.07925285e+15, "light hour"}, - {2.59020684e+16, "lightday"}, {2.59020684e+16, "light day"}, - {9.4605284+18, "lightyear"}, {9.4605284+18, "light year"}, {3.08568025e+19, "pc"}, {3.08568025e+19, "parsec"}, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-10-17 20:43:06
|
Revision: 53184 http://brlcad.svn.sourceforge.net/brlcad/?rev=53184&view=rev Author: brlcad Date: 2012-10-17 20:42:59 +0000 (Wed, 17 Oct 2012) Log Message: ----------- trim any trailing 's' so we can match regardless of input plurality Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 20:17:33 UTC (rev 53183) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 20:42:59 UTC (rev 53184) @@ -193,6 +193,14 @@ cp++; } + /* trim any trailing 's' for plurality */ + if (bu_vls_addr(&normalized_input)[bu_vls_strlen(&normalized_input)-1] == 's') { + bu_vls_trunc(&normalized_input, -1); + } + if (bu_vls_addr(&normalized_name)[bu_vls_strlen(&normalized_name)-1] == 's') { + bu_vls_trunc(&normalized_name, -1); + } + /* compare */ match = BU_STR_EQUAL(bu_vls_addr(&normalized_input), bu_vls_addr(&normalized_name)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-10-17 20:44:20
|
Revision: 53185 http://brlcad.svn.sourceforge.net/brlcad/?rev=53185&view=rev Author: brlcad Date: 2012-10-17 20:44:14 +0000 (Wed, 17 Oct 2012) Log Message: ----------- no longer need to trim the 's' here since units_name_matches() does it for us Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 20:42:59 UTC (rev 53184) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 20:44:14 UTC (rev 53185) @@ -217,15 +217,10 @@ register const struct cvt_tab *tp; register const struct conv_table *cvtab; char ubuf[256]; - size_t len; /* Copy the given string */ bu_strlcpy(ubuf, str, sizeof(ubuf)); - /* Remove any trailing "s" (plural) */ - len = strlen(ubuf); - if (ubuf[len-1] == 's') ubuf[len-1] = '\0'; - /* Search for this string in the table */ for (cvtab=unit_lists; cvtab->cvttab; cvtab++) { for (tp=cvtab->cvttab; tp->name[0]; tp++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-10-17 20:48:28
|
Revision: 53186 http://brlcad.svn.sourceforge.net/brlcad/?rev=53186&view=rev Author: brlcad Date: 2012-10-17 20:48:22 +0000 (Wed, 17 Oct 2012) Log Message: ----------- move the 'optimization' up into units_name_matches() but make it still be consistent by comparing lowercase and skipping (leading) spaces Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 20:44:14 UTC (rev 53185) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 20:48:22 UTC (rev 53186) @@ -177,6 +177,16 @@ if (!name) name = ""; + /* skip spaces */ + while (isspace(*input)) + input++; + while (isspace(*name)) + name++; + + /* quick exit */ + if (tolower(input[0]) != tolower(name[0])) + return 0; + cp = input; /* skip spaces, convert to lowercase */ while (*cp != '\0') { @@ -224,7 +234,6 @@ /* Search for this string in the table */ for (cvtab=unit_lists; cvtab->cvttab; cvtab++) { for (tp=cvtab->cvttab; tp->name[0]; tp++) { - if (ubuf[0] != tp->name[0]) continue; if (!units_name_matches(ubuf, tp->name)) continue; return tp->val; @@ -353,7 +362,6 @@ } for (tp=bu_units_length_tab; tp->name[0]; tp++) { - if (*ptr != tp->name[0]) continue; if (units_name_matches(ptr, tp->name)) { v *= tp->val; return v; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-10-17 20:57:06
|
Revision: 53187 http://brlcad.svn.sourceforge.net/brlcad/?rev=53187&view=rev Author: brlcad Date: 2012-10-17 20:57:00 +0000 (Wed, 17 Oct 2012) Log Message: ----------- document the units_name_matches() function and make the unit tables static Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2012-10-17 20:48:22 UTC (rev 53186) +++ brlcad/trunk/src/libbu/units.c 2012-10-17 20:57:00 UTC (rev 53187) @@ -43,7 +43,7 @@ struct cvt_tab *cvttab; }; -struct cvt_tab bu_units_length_tab[] = { +static struct cvt_tab bu_units_length_tab[] = { {0.0, "none"}, {1.0e-21, "ym"}, {1.0e-21, "yoctometer"}, @@ -122,7 +122,7 @@ }; #define BU_UNITS_TABLE_SIZE (sizeof(bu_units_length_tab) / sizeof(struct cvt_tab) - 1) -struct cvt_tab bu_units_volume_tab[] = { +static struct cvt_tab bu_units_volume_tab[] = { {0.0, "none"}, {1.0, "mm^3"}, /* default */ {1.0, "cu mm"}, @@ -144,7 +144,7 @@ {0.0, ""} /* LAST ENTRY */ }; -struct cvt_tab bu_units_mass_tab[] = { +static struct cvt_tab bu_units_mass_tab[] = { {0.0, "none"}, {1.0, "grams"}, /* default */ {1.0, "g"}, @@ -163,6 +163,11 @@ }; +/** + * compares an input units string to a reference units name and + * returns truthfully if they match. the comparison ignores any + * embedded whitespace and is case insensitive. + */ static int units_name_matches(const char *input, const char *name) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-03-12 16:49:37
|
Revision: 54635 http://brlcad.svn.sourceforge.net/brlcad/?rev=54635&view=rev Author: brlcad Date: 2013-03-12 16:49:28 +0000 (Tue, 12 Mar 2013) Log Message: ----------- caller release, so need BU_ALLOC Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2013-03-12 16:49:05 UTC (rev 54634) +++ brlcad/trunk/src/libbu/units.c 2013-03-12 16:49:28 UTC (rev 54635) @@ -290,7 +290,7 @@ struct bu_vls *vlsp; double prev_val = 0.0; - BU_GET(vlsp, struct bu_vls); + BU_ALLOC(vlsp, struct bu_vls); bu_vls_init(vlsp); for (tp=bu_units_length_tab; tp->name[0]; tp++) { if (ZERO(prev_val - tp->val)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-06-04 03:38:55
|
Revision: 55648 http://sourceforge.net/p/brlcad/code/55648 Author: brlcad Date: 2013-06-04 03:38:52 +0000 (Tue, 04 Jun 2013) Log Message: ----------- the ctype functions technically take an 'int' derived from an unsigned char, so netbsd is appropriately warning about the danger passing a signed char. we know these are strings, so casting to unsigned char is sufficient to quell. Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2013-06-04 03:24:27 UTC (rev 55647) +++ brlcad/trunk/src/libbu/units.c 2013-06-04 03:38:52 UTC (rev 55648) @@ -183,28 +183,28 @@ name = ""; /* skip spaces */ - while (isspace(*input)) + while (isspace((unsigned char)*input)) input++; - while (isspace(*name)) + while (isspace((unsigned char)*name)) name++; /* quick exit */ - if (tolower(input[0]) != tolower(name[0])) + if (tolower((unsigned char)input[0]) != tolower((unsigned char)name[0])) return 0; cp = input; /* skip spaces, convert to lowercase */ while (*cp != '\0') { - if (!isspace(*cp)) - bu_vls_putc(&normalized_input, tolower(*cp)); + if (!isspace((unsigned char)*cp)) + bu_vls_putc(&normalized_input, tolower((unsigned char)*cp)); cp++; } cp = name; /* skip spaces, convert to lowercase */ while (*cp != '\0') { - if (!isspace(*cp)) - bu_vls_putc(&normalized_name, tolower(*cp)); + if (!isspace((unsigned char)*cp)) + bu_vls_putc(&normalized_name, tolower((unsigned char)*cp)); cp++; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2016-10-30 18:00:48
|
Revision: 69179 http://sourceforge.net/p/brlcad/code/69179 Author: starseeker Date: 2016-10-30 18:00:45 +0000 (Sun, 30 Oct 2016) Log Message: ----------- tweak Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2016-10-30 17:55:31 UTC (rev 69178) +++ brlcad/trunk/src/libbu/units.c 2016-10-30 18:00:45 UTC (rev 69179) @@ -567,8 +567,8 @@ bu_vls_sprintf(&tmpbuf, "%d%s%d%s%s%s", sign * s1, ".", s2, sep, SCALE2PREFIX(i), suffix); bu_vls_trimspace(&tmpbuf); r = bu_vls_strlen(&tmpbuf); - rcpy = r > (int)len ? (int)len : r; - bu_strlcpy(buf, bu_vls_addr(&tmpbuf), rcpy + 1); + rcpy = r + 1 > (int)len ? (int)len : r + 1; + bu_strlcpy(buf, bu_vls_addr(&tmpbuf), rcpy); bu_vls_free(&tmpbuf); buf[len-1] = '\0'; } else { @@ -576,8 +576,8 @@ bu_vls_sprintf(&tmpbuf, "%" PRId64 "%s%s%s", sign * (quotient + (remainder + divisor / 2) / divisor), sep, SCALE2PREFIX(i), suffix); bu_vls_trimspace(&tmpbuf); r = bu_vls_strlen(&tmpbuf); - rcpy = r > (int)len ? (int)len : r; - bu_strlcpy(buf, bu_vls_addr(&tmpbuf), rcpy + 1); + rcpy = r + 1 > (int)len ? (int)len : r + 1; + bu_strlcpy(buf, bu_vls_addr(&tmpbuf), rcpy); bu_vls_free(&tmpbuf); buf[len-1] = '\0'; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2020-08-15 02:33:04
|
Revision: 76772 http://sourceforge.net/p/brlcad/code/76772 Author: brlcad Date: 2020-08-15 02:33:03 +0000 (Sat, 15 Aug 2020) Log Message: ----------- input is const, no reason for copying it Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2020-08-15 02:29:08 UTC (rev 76771) +++ brlcad/trunk/src/libbu/units.c 2020-08-15 02:33:03 UTC (rev 76772) @@ -243,15 +243,11 @@ { register const struct cvt_tab *tp; register const struct conv_table *cvtab; - char ubuf[256]; - /* Copy the given string */ - bu_strlcpy(ubuf, str, sizeof(ubuf)); - /* Search for this string in the table */ for (cvtab=unit_lists; cvtab->cvttab; cvtab++) { for (tp=cvtab->cvttab; tp->name[0]; tp++) { - if (!units_name_matches(ubuf, tp->name)) + if (!units_name_matches(str, tp->name)) continue; return tp->val; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2020-08-15 04:15:03
|
Revision: 76773 http://sourceforge.net/p/brlcad/code/76773 Author: brlcad Date: 2020-08-15 04:15:00 +0000 (Sat, 15 Aug 2020) Log Message: ----------- expand bu_units_conversion() to also match conversion value so that callers may specify '4ft' for example, and it will evaluate to the corresponding conversion factor. Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2020-08-15 02:33:03 UTC (rev 76772) +++ brlcad/trunk/src/libbu/units.c 2020-08-15 04:15:00 UTC (rev 76773) @@ -241,17 +241,29 @@ double bu_units_conversion(const char *str) { - register const struct cvt_tab *tp; - register const struct conv_table *cvtab; + const struct cvt_tab *tp; + const struct conv_table *cvtab; + double factor = 1.0; - /* Search for this string in the table */ + /* Search for the units string in the table matching by name. */ for (cvtab=unit_lists; cvtab->cvttab; cvtab++) { for (tp=cvtab->cvttab; tp->name[0]; tp++) { - if (!units_name_matches(str, tp->name)) - continue; - return tp->val; + if (units_name_matches(str, tp->name)) { + return tp->val; + } } } + /* couldn't find it by name, check by value */ + factor = bu_mm_value(str); + if (!EQUAL(factor, 1.0)) { + for (cvtab=unit_lists; cvtab->cvttab; cvtab++) { + for (tp=cvtab->cvttab; tp->name[0]; tp++) { + if (EQUAL(factor, tp->val)) { + return tp->val; + } + } + } + } return 0.0; /* Unable to find it */ } @@ -357,6 +369,8 @@ double bu_mm_value(const char *s) + + { double v; char *ptr; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2020-08-15 04:35:09
|
Revision: 76774 http://sourceforge.net/p/brlcad/code/76774 Author: brlcad Date: 2020-08-15 04:35:07 +0000 (Sat, 15 Aug 2020) Log Message: ----------- note these tables should be kept sorted Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2020-08-15 04:15:00 UTC (rev 76773) +++ brlcad/trunk/src/libbu/units.c 2020-08-15 04:35:07 UTC (rev 76774) @@ -43,6 +43,7 @@ #include "bu/units.h" #include "bu/vls.h" + struct cvt_tab { double val; char name[32]; @@ -52,6 +53,10 @@ struct cvt_tab *cvttab; }; + +/* Keep table sorted sorted small-to-large. Algorithms below may rely + * on the ordering. + */ static struct cvt_tab bu_units_length_tab[] = { {0.0, "none"}, {1.0e-21, "ym"}, @@ -134,6 +139,9 @@ }; #define BU_UNITS_TABLE_SIZE (sizeof(bu_units_length_tab) / sizeof(struct cvt_tab) - 1) +/* Keep table sorted sorted small-to-large. Algorithms below may rely + * on the ordering. + */ static struct cvt_tab bu_units_volume_tab[] = { {0.0, "none"}, {1.0, "mm^3"}, /* default */ @@ -156,6 +164,9 @@ {0.0, ""} /* LAST ENTRY */ }; +/* Keep table sorted sorted small-to-large. Algorithms below may rely + * on the ordering. + */ static struct cvt_tab bu_units_mass_tab[] = { {0.0, "none"}, {1.0, "grams"}, /* default */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2020-08-15 12:28:41
|
Revision: 76777 http://sourceforge.net/p/brlcad/code/76777 Author: brlcad Date: 2020-08-15 12:28:39 +0000 (Sat, 15 Aug 2020) Log Message: ----------- ws Modified Paths: -------------- brlcad/trunk/src/libbu/units.c Modified: brlcad/trunk/src/libbu/units.c =================================================================== --- brlcad/trunk/src/libbu/units.c 2020-08-15 12:27:33 UTC (rev 76776) +++ brlcad/trunk/src/libbu/units.c 2020-08-15 12:28:39 UTC (rev 76777) @@ -49,6 +49,7 @@ char name[32]; }; + struct conv_table { struct cvt_tab *cvttab; }; @@ -164,6 +165,7 @@ {0.0, ""} /* LAST ENTRY */ }; + /* Keep table sorted sorted small-to-large. Algorithms below may rely * on the ordering. */ @@ -181,6 +183,7 @@ {0.0, ""} /* LAST ENTRY */ }; + static const struct conv_table unit_lists[4] = { {bu_units_length_tab}, {bu_units_volume_tab}, {bu_units_mass_tab}, {NULL} }; @@ -314,6 +317,7 @@ return (const char *)NULL; } + struct bu_vls * bu_units_strings_vls() { @@ -432,6 +436,7 @@ *p = bu_mm_value(value); } + /* * Local Variables: * mode: C This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |