[670] in BarnOwl Developers
[D-O-H] r753 - trunk/owl
daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:08:30 2009
Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
To: dirty-owl-hackers@mit.edu
From: nelhage@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Sat, 11 Aug 2007 01:04:07 -0400 (EDT)
Author: nelhage
Date: 2007-08-11 01:04:07 -0400 (Sat, 11 Aug 2007)
New Revision: 753
Modified:
trunk/owl/commands.c
trunk/owl/functions.c
Log:
Implement :punt and :unpunt to punt arbitrary filters, rather than
just z-triplets. closes #6
Modified: trunk/owl/commands.c
===================================================================
--- trunk/owl/commands.c 2007-08-08 22:01:51 UTC (rev 752)
+++ trunk/owl/commands.c 2007-08-11 05:04:07 UTC (rev 753)
@@ -280,6 +280,25 @@
"suppressed to be received again.\n\n"
"SEE ALSO: zpunt, show zpunts\n"),
+ OWLCMD_ARGS("punt", owl_command_punt, OWL_CTX_ANY,
+ "suppress an arbitrary filter",
+ "punt <filter-name>",
+ "punt <filter-text (multiple words)>\n"
+ "The punt command will supress message to the specified\n"
+ "filter\n\n"
+ "SEE ALSO: unpunt, zpunt, show zpunts\n"),
+
+ OWLCMD_ARGS("unpunt", owl_command_unpunt, OWL_CTX_ANY,
+ "remove an entry from the punt list",
+ "zpunt <filter-name>\n"
+ "zpunt <filter-text>\n"
+ "zpunt <number>\n",
+ "The unpunt command will remove an entry from the puntlist.\n"
+ "The first two forms correspond to the first two forms of the :punt\n"
+ "command. The latter allows you to remove a specific entry from the\n"
+ "the list (see :show zpunts)\n\n"
+ "SEE ALSO: punt, zpunt, zunpunt, show zpunts\n"),
+
OWLCMD_VOID("info", owl_command_info, OWL_CTX_INTERACTIVE,
"display detailed information about the current message",
"", ""),
@@ -2293,7 +2312,6 @@
return NULL;
}
-
void owl_command_zpunt_and_zunpunt(int argc, char **argv, int type)
{
/* if type==0 then zpunt
@@ -2343,6 +2361,52 @@
return NULL;
}
+char *owl_command_punt(int argc, char **argv, char *buff)
+{
+ owl_command_punt_unpunt(argc, argv, buff, 0);
+ return NULL;
+}
+
+char *owl_command_unpunt(int argc, char **argv, char *buff)
+{
+ owl_command_punt_unpunt(argc, argv, buff, 1);
+ return NULL;
+}
+
+void owl_command_punt_unpunt(int argc, char ** argv, char *buff, int unpunt)
+{
+ owl_list * fl;
+ owl_filter * f;
+ char * text;
+ int i;
+
+ fl = owl_global_get_puntlist(&g);
+ if(argc == 1) {
+ owl_function_show_zpunts();
+ }
+
+ if(argc == 2) {
+ /* Handle :unpunt <number> */
+ if(unpunt && (i=atoi(argv[1])) !=0) {
+ i--; /* Accept 1-based indexing */
+ if(i < owl_list_get_size(fl)) {
+ f = (owl_filter*)owl_list_get_element(fl, i);
+ owl_list_remove_element(fl, i);
+ owl_filter_free(f);
+ return;
+ } else {
+ owl_function_error("No such filter number: %d", i+1);
+ }
+ }
+ text = owl_sprintf("filter %s", argv[1]);
+ } else {
+ text = skiptokens(buff, 1);
+ }
+
+ owl_function_punt(text, unpunt);
+}
+
+
char *owl_command_getview(int argc, char **argv, char *buff)
{
char *filtname;
Modified: trunk/owl/functions.c
===================================================================
--- trunk/owl/functions.c 2007-08-08 22:01:51 UTC (rev 752)
+++ trunk/owl/functions.c 2007-08-11 05:04:07 UTC (rev 753)
@@ -2557,6 +2557,8 @@
for (i=0; i<j; i++) {
f=owl_list_get_element(fl, i);
+ snprintf(buff, sizeof(buff), "[% 2d] ", i+1);
+ owl_fmtext_append_normal(&fm, buff);
owl_filter_print(f, buff);
owl_fmtext_append_normal(&fm, buff);
}
@@ -3016,16 +3018,9 @@
*/
void owl_function_zpunt(char *class, char *inst, char *recip, int direction)
{
- owl_filter *f;
- owl_list *fl;
char *buff;
char *quoted;
- int ret, i, j;
- fl=owl_global_get_puntlist(&g);
-
- /* first, create the filter */
- f=malloc(sizeof(owl_filter));
buff=malloc(strlen(class)+strlen(inst)+strlen(recip)+100);
strcpy(buff, "class");
if (!strcmp(class, "*")) {
@@ -3056,10 +3051,23 @@
sprintf(buff, "%s and recipient ^%s$", buff, quoted);
owl_free(quoted);
}
-
- owl_function_debugmsg("About to filter %s", buff);
- ret=owl_filter_init_fromstring(f, "punt-filter", buff);
+
+ owl_function_punt(buff, direction);
owl_free(buff);
+}
+
+void owl_function_punt(char *filter, int direction)
+{
+ owl_filter *f;
+ owl_list *fl;
+ int ret, i, j;
+ fl=owl_global_get_puntlist(&g);
+
+ /* first, create the filter */
+ f=malloc(sizeof(owl_filter));
+
+ owl_function_debugmsg("About to filter %s", filter);
+ ret=owl_filter_init_fromstring(f, "punt-filter", filter);
if (ret) {
owl_function_error("Error creating filter for zpunt");
owl_filter_free(f);
@@ -3070,6 +3078,7 @@
j=owl_list_get_size(fl);
for (i=0; i<j; i++) {
if (owl_filter_equiv(f, owl_list_get_element(fl, i))) {
+ owl_function_debugmsg("found an equivalent punt filter");
/* if we're punting, then just silently bow out on this duplicate */
if (direction==0) {
owl_filter_free(f);
@@ -3080,11 +3089,13 @@
if (direction==1) {
owl_filter_free(owl_list_get_element(fl, i));
owl_list_remove_element(fl, i);
+ owl_filter_free(f);
return;
}
}
}
+ owl_function_debugmsg("punting");
/* If we're punting, add the filter to the global punt list */
if (direction==0) {
owl_list_append_element(fl, f);