#include #include "config.h" /** * cast - routines for safer casting. * * 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/ * * Author: Jan Engelhardt * Maintainer: Rusty Russell * License: LGPL * * Example: * // Given "test" contains "3 t's in 'test string' * #include * #include * #include * * // 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; * } * */ int main(int argc, char *argv[]) { /* Expect exactly one argument */ if (argc != 2) return 1; if (strcmp(argv[1], "depends") == 0) { printf("ccan/build_assert\n"); return 0; } return 1; }