1
0
mirror of https://github.com/irssi/irssi.git synced 2024-07-07 02:54:19 -04:00

"complete word" signal works now with perl and it's possible to manipulate

the completion list.


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1542 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2001-06-08 22:27:06 +00:00 committed by cras
parent c9ccfcd408
commit fdb57e148c
3 changed files with 73 additions and 10 deletions

View File

@ -227,6 +227,9 @@ FE common
* Provides signals:
completion.c:
"complete word", GList * of char*, WINDOW_REC, char *word, char *linestart, int *want_space
fe-common-core.c:
"irssi init read settings"

View File

@ -12,10 +12,13 @@ while (<STDIN>) {
$signal = $1;
$_ = $3;
s/GList \* of ([^,]*)/glistptr_\1/g;
s/GSList of (\w+)s/gslist_\1/g;
s/char \*[^,]*/string/g;
s/ulong \*[^,]*/ulongptr/g;
s/int[^,]*/int/g;
s/GSList of (\w+)s/gslist_\1/g;
s/int \*[^,]*/intptr/g;
s/int [^,]*/int/g;
# core
s/CHATNET_REC[^,]*/iobject/g;
@ -48,7 +51,7 @@ while (<STDIN>) {
s/WINDOW_REC[^,]*/Irssi::Window/g;
s/WI_ITEM_REC[^,]*/iobject/g;
s/([\w:]+)(,|$)/"\1"\2/g;
s/([\w\*:]+)(,|$)/"\1"\2/g;
print " { \"$signal\", { $_, NULL } },\n";
}

View File

@ -55,7 +55,8 @@ static void perl_call_signal(const char *func, int signal_id,
int retcount;
PERL_SIGNAL_ARGS_REC *rec;
SV *perlarg;
SV *sv, *perlarg, *saved_args[SIGNAL_MAX_ARGUMENTS];
AV *av;
void *arg;
int n;
@ -68,6 +69,7 @@ static void perl_call_signal(const char *func, int signal_id,
/* push signal argument to perl stack */
rec = perl_signal_args_find(signal_id);
memset(saved_args, 0, sizeof(saved_args));
for (n = 0; n < SIGNAL_MAX_ARGUMENTS &&
rec != NULL && rec->args[n] != NULL; n++) {
arg = (void *) args[n];
@ -78,17 +80,35 @@ static void perl_call_signal(const char *func, int signal_id,
perlarg = newSViv(GPOINTER_TO_INT(arg));
else if (strcmp(rec->args[n], "ulongptr") == 0)
perlarg = newSViv(*(unsigned long *) arg);
else if (strncmp(rec->args[n], "gslist_", 7) == 0) {
else if (strcmp(rec->args[n], "intptr") == 0)
saved_args[n] = perlarg = newRV_noinc(newSViv(*(int *) arg));
else if (strncmp(rec->args[n], "glistptr_", 9) == 0) {
/* pointer to linked list - push as AV */
GList *tmp, **ptr;
int is_iobject, is_str;
is_iobject = strcmp(rec->args[n]+9, "iobject") == 0;
is_str = strcmp(rec->args[n]+9, "char*") == 0;
av = newAV();
ptr = arg;
for (tmp = *ptr; tmp != NULL; tmp = tmp->next) {
sv = is_iobject ? irssi_bless((SERVER_REC *) tmp->data) :
is_str ? new_pv(tmp->data) :
irssi_bless_plain(rec->args[n]+9, tmp->data);
av_push(av, sv);
}
saved_args[n] = perlarg = newRV_noinc((SV *) av);
} else if (strncmp(rec->args[n], "gslist_", 7) == 0) {
/* linked list - push as AV */
GSList *tmp;
SV *sv;
AV *av;
int iobject;
int is_iobject;
iobject = strcmp(rec->args[n]+7, "iobject") == 0;
is_iobject = strcmp(rec->args[n]+7, "iobject") == 0;
av = newAV();
for (tmp = arg; tmp != NULL; tmp = tmp->next) {
sv = iobject ? irssi_bless((SERVER_REC *) tmp->data) :
sv = is_iobject ? irssi_bless((SERVER_REC *) tmp->data) :
irssi_bless_plain(rec->args[n]+7, tmp->data);
av_push(av, sv);
}
@ -119,6 +139,43 @@ static void perl_call_signal(const char *func, int signal_id,
signal_emit("gui dialog", 2, "error", SvPV(ERRSV, n_a));
}
/* restore arguments the perl script modified */
for (n = 0; n < SIGNAL_MAX_ARGUMENTS &&
rec != NULL && rec->args[n] != NULL; n++) {
arg = (void *) args[n];
if (saved_args[n] == NULL)
continue;
if (strcmp(rec->args[n], "intptr") == 0) {
int *val = arg;
*val = SvIV(SvRV(saved_args[n]));
} else if (strncmp(rec->args[n], "glistptr_", 9) == 0) {
GList **ret = arg;
GList *out = NULL;
void *val;
STRLEN len;
int count;
av = (AV *) SvRV(saved_args[n]);
count = av_len(av);
while (count-- >= 0) {
sv = av_shift(av);
if (SvPOKp(sv))
val = g_strdup(SvPV(sv, len));
else
val = GINT_TO_POINTER(SvIV(sv));
out = g_list_append(out, val);
}
if (strcmp(rec->args[n]+9, "char*") == 0)
g_list_foreach(*ret, (GFunc) g_free, NULL);
g_list_free(*ret);
*ret = out;
}
}
PUTBACK;
FREETMPS;
LEAVE;