summaryrefslogtreecommitdiff
path: root/lib/ccan/cast/_info
blob: 5f82a05b8fa7b5134ad3473dd35cedf69db1b9bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <string.h>
#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 <rusty@rustcorp.com.au>
 * License: LGPL
 *
 * Example:
 *	// 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;
 *	}
 *
 */
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;
}