Re: [jasspa] Bug in meAtoi -- leading zeros
- Yeah I guess it *is* documented -- on the help page macroOverview(4),
"MACRO LANGUAGE OVERVIEW":
All variables are treated as strings within MicroEmacs so the integer
value of 102 is the string "102". Where functions require an integer
argument (i.e. &add) the strings are converted to integers, operated on
and converted back to a string result. Floating point notation is not
Integers may be expressed in different bases:
0xXXX - Hexadecimal notation i.e. 0x12af.
0oooo - Octal notation requires a leading 012673.
ddddd - Decimal notation 12345.
It just took me by surprise, I guess because other things (e.g., the Esc
arg or universal-argument) are locked in as decimal.
Phillips, Steven wrote:
> Changing meAtoi to not handle C style base numeric notation would
> most definitely break a lot of things - see me.emf or grep for '0x'
> in the macros directory.
> The hex notation is used a lot as any numbers used for a bit based
> flag are far more readable in hex. The octal form is certainly used
> very rarely (the only place I can think of where it is used is with
> routines than manipulate the $buffer-fmod variable on unix) so
> removing support for octal would have less impact, but by using
> strtol ME is using a standard numerical form understood by any C/C++
> programmer. For this reason I am reluctant to change it.
>> -----Original Message----- From: firstname.lastname@example.org
>> [mailto:email@example.com] On Behalf
>> Thomas Hundt Sent: Monday, December 19, 2005 7:18 PM To: JASSPA
>> MicroEmacs Mailing List (W) Subject: [jasspa] Bug in meAtoi --
>> leading zeros
>> From what I can see there is a bug in the atoi routine used.
>> I first noticed this when I was trying to remove leading zeroes
>> from part of the ascii-time variable:
>> define-macro test set-variable #l1 "09" insert-string #l1
>> insert-string " -> " set-variable #l1 &add #l1 0 ; "09" -> "9"
>> insert-string #l1 newline !emacro
>> The output of this is 09 -> 0 when it should really be 9 -> 9
>> If I change the set-variable to "9", it comes out 9 -> 9
>> I tracked down the function, it ends up being in eval.c case UFADD:
>> return meItoa(meAtoi(arg1) + meAtoi(arg2));
>> in eextrn.h it is defined #define meAtoi(s) strtol((char
>> *)(s),(char **)NULL,0) and the 0 here is the base, and is a special
>> value meaning, interpret strings beginning with 0x as hex, and
>> strings beginning with 0 as
>> Which is why my "09" comes out as zero: 9 is undefined in octal.
>> Sure enough, if I change my input string to "07", I get 07 -> 7
>> So, my workaround is going to be to prepend a "1" to make it a
>> decimal 1xx number and then subtract off the 100:
>> set-variable #l1 &sub &cat "1" #l1 100 ; "09" -> "9"
>> What I really want to do is fix the base to be, e.g., 10, but would
>> break other things? I don't know.