mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
6e72370fd7
This imports licensing clarifications and updates as discussed on samba-technical ("Subject: Re: ccan code breaks older build farm systems"). In particular, the recent version have per-file license markers, and some modules are relicenced more liberally: in particular Simo pointed out that htable was GPL, and indirectly included by libtdb2, which would have made that GPL as well. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Autobuild-User: Rusty Russell <rusty@rustcorp.com.au> Autobuild-Date: Mon Jul 25 12:03:40 CEST 2011 on sn-devel-104
85 lines
2.1 KiB
Plaintext
85 lines
2.1 KiB
Plaintext
#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 (v2.1 or any later version)
|
|
*
|
|
* 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;
|
|
}
|