static char rcsid[] = "@(#)$Id: alias_limit.c,v 1.8 2006/04/09 07:37:42 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.8 $ $State: Exp $ * * Author: Kari Hurtta ****************************************************************************** * Inludes code from limit.c which have following copyright: * * The Elm Mail System * * Copyright (c) 1988-1992 USENET Community Trust * Copyright (c) 1986,1987 Dave Taylor *****************************************************************************/ #include "def_mcommon.h" #include "s_aliases.h" #include "s_elm.h" DEBUG_VAR(Debug,__FILE__,"menu"); static unsigned char *s2us P_((char *str)); static unsigned char *s2us(str) char *str; { return (unsigned char *)str; } static int limit_alias_selection P_((int based_on, struct string *pattern, int *vector, struct AliasView *aview)); static int limit_alias_selection(based_on, pattern, vector, aview) int based_on; struct string *pattern; int * vector; struct AliasView *aview; { /** Given the type of criteria, and the pattern, mark all non-matching aliases as ! VISIBLE. If additional_criteria, don't mark as visible something that isn't currently! **/ int iindex; int count = 0; DPRINT(Debug,2,(&Debug, "\n\n\n**limit on %d - '%S'**\n\n", based_on, pattern)); if (based_on == BY_NAME) { int ac = get_alias_count(aview); for (iindex = 0; iindex < ac; iindex++) { struct alias_rec *a = give_alias(aview,iindex); if (a) { struct string * X = new_string2(system_charset,s2us(a->name)); if (find_pattern_from_string(X,pattern,1 /* ignore case */)) vector[count++] = iindex; free_string(&X); } } } else if (based_on == BY_ALIAS) { int ac = get_alias_count(aview); for (iindex = 0; iindex < ac; iindex++) { struct alias_rec *a = give_alias(aview,iindex); if (a) { struct string * X = new_string2(system_charset,s2us(a->alias)); if (find_pattern_from_string(X,pattern,1 /* ignore case */)) vector[count++] = iindex; free_string(&X); } } } else { int ac = get_alias_count(aview); for (iindex = 0; iindex < ac; iindex++) { struct alias_rec *a = give_alias(aview,iindex); if ((based_on & a->type)) vector[count++] = iindex; } } DPRINT(Debug,9,(&Debug, "limit_alias_selection=%d\n",count)); return count; } int mc_limit_helper_alias(u,str,retarr, page) union mcommon_union *u; struct string *str; int **retarr; struct menu_context *page; { int ret = -1; struct string *first = NULL; struct string *rest = NULL; int L = string_len(str); uint16 delim; int pos = 0; int *vector = NULL; struct AliasView *aview = u->alias.aw; int n = get_alias_count(aview); if (!get_word_from_string(str,&first,&pos,GWF_lowercase, /* ASCII assumed */ s2us(" \t"),&delim)) goto fail; if (pos < L) pos++; if (pos < L && 0x0020 /* space */ == give_unicode_from_string(str,pos)) pos++; if (n < 1) goto fail; vector = safe_malloc(n * sizeof(vector[0])); rest = clip_from_string(str,&pos,L); if (string_matches_ascii(first, s2us("name"))) ret = limit_alias_selection(BY_NAME, rest, vector, aview); else if (string_matches_ascii(first, s2us("alias"))) ret = limit_alias_selection(BY_ALIAS, rest,vector, aview); else if (string_matches_ascii(first, s2us("person"))) ret = limit_alias_selection(PERSON, rest, vector, aview); else if (string_matches_ascii(first, s2us("group"))) ret = limit_alias_selection(GROUP, rest, vector, aview); else if (string_matches_ascii(first, s2us("user"))) ret = limit_alias_selection(USER, rest, vector, aview); else if (string_matches_ascii(first, s2us("system"))) ret = limit_alias_selection(SYSTEM, rest, vector, aview); else { lib_error(CATGETS(elm_msg_cat, ElmSet, ElmLimitNotValidCriterion, "\"%S\" not a valid criterion."), first); } fail: if (first) free_string(&first); if (rest) free_string(&rest); if (ret <= 0) { if (vector) free(vector); *retarr = NULL; } else *retarr = vector; return ret; } void mc_limit_print_help_alias(last_selected) int last_selected; { if (last_selected) lib_transient(CATGETS(elm_msg_cat, AliasesSet, AliasesEnterLastSelected, "Enter:{\"name\",\"alias\"} [pattern] OR {\"person\",\"group\",\"user\",\"system\", \"tagged\"} OR \"all\"")); else lib_transient(CATGETS(elm_msg_cat, AliasesSet, AliasesEnterSelected, "Enter: {\"name\",\"alias\"} [pattern] OR {\"person\",\"group\",\"user\",\"system\",\"tagged\"}")); } void mc_limit_print_result_alias(u) union mcommon_union *u; { struct AliasView *aview = u->alias.aw; if (get_alias_selected(aview) > 1) lib_error(CATGETS(elm_msg_cat, AliasesSet, AliasesLimitMessagesSelected, "%d aliases selected."), get_alias_selected(aview)); else if (get_alias_selected(aview) == 1) lib_error(CATGETS(elm_msg_cat, AliasesSet, AliasesLimitMessageSelected, "1 alias selected.")); else lib_error(CATGETS(elm_msg_cat, AliasesSet, AliasesLimitNoMessagesSelected, "No aliases selected.")); } /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */