]> git.ozlabs.org Git - ccan/blobdiff - ccan/cast/_info
cast: new limited cast package inspired by Jan Engelhardt's libhx.
[ccan] / ccan / cast / _info
diff --git a/ccan/cast/_info b/ccan/cast/_info
new file mode 100644 (file)
index 0000000..2dd9b20
--- /dev/null
@@ -0,0 +1,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;
+}