diff options
author | niemeyer <devnull@localhost> | 2004-04-18 20:47:29 +0000 |
---|---|---|
committer | niemeyer <devnull@localhost> | 2004-04-18 20:47:29 +0000 |
commit | a018c6e59c4abccce831ddb3a292198721b9a82a (patch) | |
tree | f552050b01afd2254b374b534b0ff44edba61031 /rpmio/rpmhook.c | |
parent | a19d5569cdbeb72780e7ea694bbf7d31538aaa1c (diff) | |
download | rpm-a018c6e59c4abccce831ddb3a292198721b9a82a.tar.gz rpm-a018c6e59c4abccce831ddb3a292198721b9a82a.tar.bz2 rpm-a018c6e59c4abccce831ddb3a292198721b9a82a.zip |
Implemented Lua support for the hooking system.
CVS patchset: 7239
CVS date: 2004/04/18 20:47:29
Diffstat (limited to 'rpmio/rpmhook.c')
-rw-r--r-- | rpmio/rpmhook.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/rpmio/rpmhook.c b/rpmio/rpmhook.c index 74938801d..647e30386 100644 --- a/rpmio/rpmhook.c +++ b/rpmio/rpmhook.c @@ -28,6 +28,21 @@ typedef struct rpmhookTable_s { struct rpmhookBucket_s bucket[1]; } * rpmhookTable; + +rpmhookArgs rpmhookArgsNew(int argc) +{ + rpmhookArgs args = (rpmhookArgs)xcalloc(1, sizeof(struct rpmhookArgs_s)+ + (argc-1)*sizeof(rpmhookArgv)); + args->argc = argc; + return args; +} + +rpmhookArgs rpmhookArgsFree(rpmhookArgs args) +{ + free(args); + return NULL; +} + static rpmhookTable rpmhookTableNew(int size) { rpmhookTable table = @@ -154,13 +169,10 @@ static void rpmhookTableDelItem(rpmhookTable *table, const char *name, static rpmhookArgs rpmhookArgsParse(const char *argt, va_list ap) { - int argc = strlen(argt); + rpmhookArgs args = rpmhookArgsNew(strlen(argt)); int i; - rpmhookArgs args = (rpmhookArgs)malloc(sizeof(struct rpmhookArgs_s)+ - (argc-1)*sizeof(rpmhookArgv)); - args->argc = argc; args->argt = argt; - for (i = 0; i != argc; i++) { + for (i = 0; i != args->argc; i++) { switch (argt[i]) { case 's': args->argv[i].s = va_arg(ap, char *); @@ -183,21 +195,16 @@ static rpmhookArgs rpmhookArgsParse(const char *argt, va_list ap) return args; } -static void rpmhookTableCallV(rpmhookTable *table, const char *name, - const char *argt, va_list ap) +static void rpmhookTableCallArgs(rpmhookTable *table, const char *name, + rpmhookArgs args) { - rpmhookItem item; - rpmhookArgs args; - int n; - args = rpmhookArgsParse(argt, ap); - n = rpmhookTableFindBucket(table, name); - item = (*table)->bucket[n].item; + int n = rpmhookTableFindBucket(table, name); + rpmhookItem item = (*table)->bucket[n].item; while (item) { if (item->func(args, item->data) != 0) break; item = item->next; } - free(args); } static rpmhookTable globalTable = NULL; @@ -230,12 +237,21 @@ void rpmhookUnregisterAll(const char *name) void rpmhookCall(const char *name, const char *argt, ...) { if (globalTable) { + rpmhookArgs args; va_list ap; va_start(ap, argt); - rpmhookTableCallV(&globalTable, name, argt, ap); + args = rpmhookArgsParse(argt, ap); + rpmhookTableCallArgs(&globalTable, name, args); + rpmhookArgsFree(args); va_end(ap); } } +void rpmhookCallArgs(const char *name, rpmhookArgs args) +{ + if (globalTable) + rpmhookTableCallArgs(&globalTable, name, args); +} + /* vim:ts=4:sw=4:et */ |