summaryrefslogtreecommitdiff
path: root/rpmio/rpmhook.c
diff options
context:
space:
mode:
authorniemeyer <devnull@localhost>2004-04-18 20:47:29 +0000
committerniemeyer <devnull@localhost>2004-04-18 20:47:29 +0000
commita018c6e59c4abccce831ddb3a292198721b9a82a (patch)
treef552050b01afd2254b374b534b0ff44edba61031 /rpmio/rpmhook.c
parenta19d5569cdbeb72780e7ea694bbf7d31538aaa1c (diff)
downloadrpm-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.c46
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
*/