Browse Source Download (without any required ccan dependencies)
cast
routines for safer casting.
Rusty Russell <rusty@rustcorp.com.au>
Jan Engelhardt
Often you want to cast in a limited way, such as removing a const or switching between integer types. However, normal casts will work on almost any type, making them dangerous when the code changes.
These C++-inspired macros serve two purposes: they make it clear the exact reason for the cast, and they also (with some compilers) cause errors when misused.
Based on Jan Engelhardt's libHX macros: http://libhx.sourceforge.net/
// Given "test" contains "3 t's in 'test string'
#include <ccan/cast/cast.h>
#include <stdint.h>
#include <stdio.h>
// Find char @orig in @str, if @repl, replace them. Return number.
static size_t find_chars(char *str, char orig, char repl)
{
size_t i, count = 0;
for (i = 0; str[i]; i++) {
if (str[i] == orig) {
count++;
if (repl)
str[i] = repl;
}
}
return count;
}
// Terrible hash function.
static uint64_t hash_string(const unsigned char *str)
{
size_t i;
uint64_t hash = 0;
for (i = 0; str[i]; i++)
hash += str[i];
return hash;
}
int main(int argc, char *argv[])
{
uint64_t hash;
// find_chars wants a non-const string, but doesn't
// need it if repl == 0.
printf("%zu %c's in 'test string'\n",
find_chars(cast_const(char *, "test string"),
argv[1][0], 0),
argv[1][0]);
// hash_string wants an unsigned char.
hash = hash_string(cast_signed(unsigned char *, argv[1]));
// Need a long long to hand to printf.
printf("Hash of '%s' = %llu\n", argv[1],
cast_static(unsigned long long, hash));
return 0;
}
LGPL (v2.1 or any later version)