Im fairly confident in the behaviour on both signed and unsigned char architectures since the base 10 code is pretty much the same as it was before (assign to native char type, then print). As Andrew mentions, I have no (char)==(unsigned char) hardware on which to confirm this though.Hi Ralph,
Any comments or objections? I haven't tried this myself yet. We do need to confirm that any change doesn't modify the original behavior on both kinds of architectures where char is signed or unsigned; I suspect Eric has only tried one type of CPU (x86).
- Andrew -- It is difficult to get a man to understand something, when his salary depends upon his not understanding it. -- Upton Sinclair
Subject: tool_lib.c -- next attempt
Date: May 8, 2013 11:53:06 AM PDT
Seems to to what it should. I think that this maintains backward compatibility.
diff -b -U7 tool_lib.c.orig tool_lib.c --- tool_lib.c.orig 2013-05-08 11:15:28.000000000 -0700 +++ tool_lib.c 2013-05-08 11:51:47.000000000 -0700 @@ -102,15 +102,14 @@ * **************************************************************************-*/
char *val2str (const void *v, unsigned type, int index) { #define STR 500 static char str[STR]; - char ch; void *val_ptr; unsigned base_type; dbr_long_t val_long;
if (!dbr_type_is_valid(type)) { strcpy (str, "*** invalid type"); return str; @@ -146,16 +145,21 @@ val_long = ((dbr_double_t*) val_ptr)[index] + 0.5; else val_long = ((dbr_double_t*) val_ptr)[index] - 0.5; sprint_long(str, val_long, outTypeF); } break; case DBR_CHAR: - ch = ((dbr_char_t*) val_ptr)[index]; - sprintf(str, "%d", ch); + if (outTypeI == dec) { + char ch = ((dbr_char_t*) val_ptr)[index]; + sprint_long(str, ch, outTypeI); + } + else { + sprint_long(str, ((dbr_char_t*) val_ptr)[index], outTypeI); + } break; case DBR_INT: sprint_long(str, ((dbr_int_t*) val_ptr)[index], outTypeI); break; case DBR_LONG: sprint_long(str, ((dbr_long_t*) val_ptr)[index], outTypeI); break;
-- Eric Norum [email protected]
|