Browse Source Download (without any required ccan dependencies)

Module:

cast

Summary:

routines for safer casting.

Maintainer:

Rusty Russell <rusty@rustcorp.com.au>

Author:

Jan Engelhardt

Dependencies:

Description:

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/

Example:

// Given "test" output contains "3 t's in 'test string'"
#include <ccan/cast/cast.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.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;

        if (argc != 2) {
                fprintf(stderr, "Needs argument\n"); exit(1);
        }
        // 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;
}

License:

LGPL (v2.1 or any later version)