Discussion:
limits.h for XS data types
(too old to reply)
Marvin Humphrey
2005-12-14 18:50:39 UTC
Permalink
Greets,

Some of the algorithms I'm working on need to use sentinel values,
which I'd typically get from limits.h. Can I get away with this?

U32 aU32 = ULONG_MAX;
while (aU32 == ULONG_MAX) {
/* try to change aU32...
* ...
*/
}

Is there a "limits.h" analog for XS data types like U32, UV, STRLEN,
etc?

Marvin Humphrey
Rectangular Research
http://www.rectangular.com/
Nick Ing-Simmons
2005-12-15 20:47:19 UTC
Permalink
Post by Marvin Humphrey
Greets,
Some of the algorithms I'm working on need to use sentinel values,
which I'd typically get from limits.h. Can I get away with this?
U32 aU32 = ULONG_MAX;
while (aU32 == ULONG_MAX) {
/* try to change aU32...
* ...
*/
}
No.

You might be on a platform where 'unsigned long' was 64 bits,
and so ULONG_MAX was 0xffffffffffffffffL but perl's U32 (for unsigned 32)
was Configure-d as unsigned int so could never equal ULONG_MAX.

Or if you used UV you might be on a platfrom configured for a 64-bit
perl even though "unsigned long" was only 32-bits.
Post by Marvin Humphrey
Is there a "limits.h" analog for XS data types like U32, UV, STRLEN,
etc?
No. Instead perl has had Configure find system types which are suitable
for each types needs.

So if you want sentinels either use system types

unsigned long aul = ULONG_MAX;

Limit your self to a possible subset of the type

const U32 U32_MAX = 0xffffffff;

but note that on a 64-bit machine it may be possible

that au32 > U32_MAX !

or

bool value_set = 0
U32 value = ~0;
while (!value_set)
{
...
value = something;
value_set = true;
}
Post by Marvin Humphrey
Marvin Humphrey
Rectangular Research
http://www.rectangular.com/
Loading...