X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2F_info;h=890cb2e767a638b346f90e8f5b6be76bd6db3b2c;hp=2417de1c20af90df8bdff9ad114ccaefa789d6f4;hb=291237b4fed863be74051274ac5ad9920cb33cc3;hpb=0e34459a02e2615f50bac2767c7dce6632470946 diff --git a/ccan/tal/_info b/ccan/tal/_info index 2417de1c..890cb2e7 100644 --- a/ccan/tal/_info +++ b/ccan/tal/_info @@ -1,6 +1,6 @@ +#include "config.h" #include #include -#include "config.h" /** * tal - compact tree allocator routines (inspired by talloc) @@ -12,27 +12,29 @@ * This allows you to build complex objects based on their lifetimes, eg: * * struct foo *X = tal(NULL, struct foo); - * X->name = tal_strdup(X, "foo"); + * X->val = tal(X, int); + * + * and the pointer X->val would be a "child" of the tal context "X"; + * tal_free(X->val) would free X->val as expected, by tal_free(X) would + * free X and X->val. * - * and the pointer X->name would be a "child" of the tal context "X"; - * tal_free(X->name) would free X->name as expected, by tal_free(X) would - * free X and X->name. + * With an overhead of approximately 4 pointers per object + * (vs. talloc's 12 pointers), it uses dynamic allocation for + * destructors and child lists, so those operations can fail. It does + * not support talloc's references or failing destructors. * - * With an overhead of approximately 2.1 pointers per object (vs. talloc's - * 12 pointers), it's a little slower in freeing single objects, though - * comparable for allocation and freeing whole object trees). It does not - * support talloc's references or failing destructors. + * See Also: + * ccan/tal/str (useful string helpers) * * Example: * #include - * #include * #include * #include * * // A structure containing a popened command. * struct command { * FILE *f; - * const char *command; + * char *command; * }; * * // When struct command is freed, we also want to pclose pipe. @@ -43,21 +45,22 @@ * * // This function opens a writable pipe to the given command. * static struct command *open_output_cmd(const tal_t *ctx, - * const char *fmt, ...) + * const char *a0, const char *a1) * { - * va_list ap; * struct command *cmd = tal(ctx, struct command); * * if (!cmd) * return NULL; * - * va_start(ap, fmt); - * cmd->command = tal_vasprintf(cmd, fmt, ap); - * va_end(ap); + * // Note that tal/str has helpers to make this much easier! + * cmd->command = tal_arrz(cmd, char, strlen(a0) + strlen(a1) + 2); * if (!cmd->command) { * tal_free(cmd); * return NULL; * } + * strcat(cmd->command, a0); + * strcat(cmd->command, " "); + * strcat(cmd->command, a1); * * cmd->f = popen(cmd->command, "w"); * if (!cmd->f) { @@ -75,7 +78,7 @@ * if (argc != 2) * errx(1, "Usage: %s \n", argv[0]); * - * cmd = open_output_cmd(NULL, "%s hello", argv[1]); + * cmd = open_output_cmd(NULL, argv[1], "hello"); * if (!cmd) * err(1, "Running '%s hello'", argv[1]); * fprintf(cmd->f, "This is a test\n"); @@ -91,10 +94,12 @@ int main(int argc, char *argv[]) return 1; if (strcmp(argv[1], "depends") == 0) { + printf("ccan/alignof\n"); printf("ccan/compiler\n"); - printf("ccan/hash\n"); printf("ccan/likely\n"); printf("ccan/list\n"); + printf("ccan/str\n"); + printf("ccan/take\n"); printf("ccan/typesafe_cb\n"); return 0; }