diff options
author | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
---|---|---|
committer | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
commit | 094ca96844842928810f14844413109fc6cdd890 (patch) | |
tree | e60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /pith/pattern.h | |
download | alpine-094ca96844842928810f14844413109fc6cdd890.tar.xz |
Initial Alpine Version
Diffstat (limited to 'pith/pattern.h')
-rw-r--r-- | pith/pattern.h | 417 |
1 files changed, 417 insertions, 0 deletions
diff --git a/pith/pattern.h b/pith/pattern.h new file mode 100644 index 00000000..4b222d3e --- /dev/null +++ b/pith/pattern.h @@ -0,0 +1,417 @@ +/* + * $Id: pattern.h 942 2008-03-04 18:21:33Z hubert@u.washington.edu $ + * + * ======================================================================== + * Copyright 2006-2008 University of Washington + * Copyright 2013 Eduardo Chappa + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * ======================================================================== + */ + +#ifndef PITH_PATTERN_INCLUDED +#define PITH_PATTERN_INCLUDED + + +#include "../pith/msgno.h" +#include "../pith/sorttype.h" +#include "../pith/string.h" +#include "../pith/indxtype.h" + + +/* + * This structure is used to contain strings which are matched against + * header fields. The match is a simple substring match. The match is + * an OR of all the patterns in the PATTERN_S list. That is, + * substring1_matches OR substring2_matches OR substring3_matches. + * If not is set in the _head_ of the PATTERN_S, it is a NOT of the + * whole pattern, that is, + * NOT (substring1_matches OR substring2_matches OR substring3_matches). + * The not variable is not meaningful except in the head member of the + * PATTERN_S list. + */ +typedef struct pattern_s { + int not; /* NOT of whole pattern */ + char *substring; + struct pattern_s *next; +} PATTERN_S; + +/* + * List of these is a list of arbitrary freetext headers and patterns. + * This may be part of a pattern group. + * The isemptyval bit is to keep track of the difference between an arb + * header with no value set and one with the empty value "" set. For the + * other builtin headers this difference is kept track of by whether or + * not the header is in the config file at all or not. Here we want to + * be able to add a header to the config file without necessarily giving + * it a value. + */ +typedef struct arbhdr_s { + char *field; + PATTERN_S *p; + int isemptyval; + struct arbhdr_s *next; +} ARBHDR_S; + +/* + * A list of intervals of integers. + */ +typedef struct intvl_s { + long imin, imax; + struct intvl_s *next; +} INTVL_S; + +/* + * A Pattern group gives characteristics of an envelope to match against. Any of + * the characteristics (to, from, ...) which is non-null must match for the + * whole thing to be considered a match. That is, it is an AND of all the + * non-null members. + */ +typedef struct patgrp_s { + char *nick; + char *comment; /* for user, not used for anything */ + PATTERN_S *to, + *from, + *sender, + *cc, + *recip, + *partic, + *news, + *subj, + *alltext, + *bodytext, + *keyword, + *charsets; + STRLIST_S *charsets_list; /* used for efficiency, computed from charset */ + ARBHDR_S *arbhdr; /* list of arbitrary hdrnames and patterns */ + int fldr_type; /* see FLDR_* below */ + PATTERN_S *folder; /* folder if type FLDR_SPECIFIC */ + int inabook; /* see IAB_* below */ + PATTERN_S *abooks; + int do_score; + INTVL_S *score; + int do_age; + INTVL_S *age; /* ages are in days */ + int do_size; + INTVL_S *size; + int age_uses_sentdate; /* on or off */ + int do_cat; + char **category_cmd; + INTVL_S *cat; + long cat_lim; /* -1 no limit 0 only headers */ + int bogus; /* patgrp contains unknown stuff */ + int stat_new, /* msg status is New (Unseen) */ + stat_rec, /* msg status is Recent */ + stat_del, /* msg status is Deleted */ + stat_imp, /* msg is flagged Important */ + stat_ans, /* msg is flagged Answered */ + stat_8bitsubj, /* subject contains 8bit chars */ + stat_bom, /* this is first pine run of the month */ + stat_boy; /* this is first pine run of the year */ +} PATGRP_S; + +#define FLDR_ANY 0 +#define FLDR_NEWS 1 +#define FLDR_EMAIL 2 +#define FLDR_SPECIFIC 3 + +#define FLDR_DEFL FLDR_EMAIL + + +#define IAB_EITHER 0x0 /* don't care if in or not */ + +#define IAB_TYPE_MASK 0xf +#define IAB_YES 0x1 /* addresses in any abook */ +#define IAB_NO 0x2 /* " not " */ +#define IAB_SPEC_YES 0x3 /* addresses in specific abooks */ +#define IAB_SPEC_NO 0x4 + +/* + * Warning about reply-to. We're using the c-client envelope reply-to which + * means if there isn't a real reply-to it uses the From! + */ +#define IAB_ADDR_MASK 0xff0 +#define IAB_FROM 0x10 /* from address included in list */ +#define IAB_REPLYTO 0x20 /* reply-to address included in list */ +#define IAB_SENDER 0x40 /* sender address included in list */ +#define IAB_TO 0x80 /* to address included in list */ +#define IAB_CC 0x100 /* cc address included in list */ + +#define IAB_DEFL IAB_EITHER + + +#define FILTER_STATE 0 +#define FILTER_KILL 1 +#define FILTER_FOLDER 2 + +/* + * For the Status parts of a PATGRP_S. For example, stat_del is Deleted + * status. User sets EITHER means they don't care, it always matches. + * YES means it must be deleted to match. NO means it must not be deleted. + */ +#define PAT_STAT_EITHER 0 /* we don't care which, yes or no */ +#define PAT_STAT_YES 1 /* yes, this status is true */ +#define PAT_STAT_NO 2 /* no, this status is not true */ + +/* + * For the State setting part of a filter action + */ +#define ACT_STAT_LEAVE 0 /* leave msg state alone */ +#define ACT_STAT_SET 1 /* set this part of msg state */ +#define ACT_STAT_CLEAR 2 /* clear this part of msg state */ + +typedef struct action_s { + unsigned is_a_role:1; /* this is a role action */ + unsigned is_a_incol:1; /* this is an index color action */ + unsigned is_a_score:1; /* this is a score setting action */ + unsigned is_a_filter:1; /* this is a filter action */ + unsigned is_a_other:1; /* this is a miscellaneous action */ + unsigned is_a_srch:1; /* this is for Select cmd, no action */ + unsigned bogus:1; /* action contains unknown stuff */ + unsigned been_here_before:1; /* inheritance loop prevention */ + /* --- These are for roles --- */ + ADDRESS *from; /* value to set for From */ + ADDRESS *replyto; /* value to set for Reply-To */ + char **cstm; /* custom headers */ + char **smtp; /* custom SMTP server for this role */ + char **nntp; /* custom NNTP server for this role */ + char *fcc; /* value to set for Fcc */ + char *litsig; /* value to set Literal Signature */ + char *sig; /* value to set for Sig File */ + char *template; /* value to set for Template */ + char *nick; /* value to set for Nickname */ + int repl_type; /* see ROLE_REPL_* below */ + int forw_type; /* see ROLE_FORW_* below */ + int comp_type; /* see ROLE_COMP_* below */ + char *inherit_nick; /* pattern we inherit actions from */ + /* --- This is for indexcoloring --- */ + COLOR_PAIR *incol; /* colors for index line */ + /* --- This is for scoring --- */ + long scoreval; + HEADER_TOK_S *scorevalhdrtok; + /* --- These are for filtering --- */ + int kill; + long state_setting_bits; + PATTERN_S *keyword_set; /* set these keywords */ + PATTERN_S *keyword_clr; /* clear these keywords */ + PATTERN_S *folder; /* folders to recv. filtered mail */ + int move_only_if_not_deleted; /* on or off */ + int non_terminating; /* on or off */ + /* --- These are for other --- */ + /* sort order of folder */ + unsigned sort_is_set:1; + SortOrder sortorder; /* sorting order */ + int revsort; /* whether or not to reverse sort */ + /* Index format of folder */ + char *index_format; + unsigned startup_rule; +} ACTION_S; + +/* flags for first_pattern..., set_role_from_msg, and confirm_role() */ +#define PAT_CLOSED 0x00000000 /* closed */ +#define PAT_OPENED 0x00000001 /* opened successfully */ +#define PAT_OPEN_FAILED 0x00000002 +#define PAT_USE_CURRENT 0x00000010 /* use current_val to set up pattern */ +#define PAT_USE_CHANGED 0x00000020 /* use changed_val to set up pattern */ +#define PAT_USE_MAIN 0x00000040 /* use main_user_val */ +#define PAT_USE_POST 0x00000080 /* use post_user_val */ +#define ROLE_COMPOSE 0x00000100 /* roles with compose value != NO */ +#define ROLE_REPLY 0x00000200 /* roles with reply value != NO */ +#define ROLE_FORWARD 0x00000400 /* roles with forward value != NO */ +#define ROLE_INCOL 0x00000800 /* patterns with non-Normal colors */ +#define ROLE_SCORE 0x00001000 /* patterns with non-zero scorevals */ +#define ROLE_DO_ROLES 0x00010000 /* role patterns */ +#define ROLE_DO_INCOLS 0x00020000 /* index line color patterns */ +#define ROLE_DO_SCORES 0x00040000 /* set score patterns */ +#define ROLE_DO_FILTER 0x00080000 /* filter patterns */ +#define ROLE_DO_OTHER 0x00100000 /* miscellaneous patterns */ +#define ROLE_DO_SRCH 0x00200000 /* index line color patterns */ +#define ROLE_OLD_PAT 0x00400000 /* old patterns variable */ +#define ROLE_OLD_FILT 0x00800000 /* old patterns-filters variable */ +#define ROLE_OLD_SCORE 0x01000000 /* old patterns-scores variable */ +#define ROLE_CHANGES 0x02000000 /* start editing with changes + already registered */ + +#define PAT_OPEN_MASK 0x0000000f +#define PAT_USE_MASK 0x000000f0 +#define ROLE_MASK 0x00ffff00 + +#define ROLE_REPL_NO 0 /* never use for reply */ +#define ROLE_REPL_YES 1 /* use for reply with confirmation */ +#define ROLE_REPL_NOCONF 2 /* use for reply without confirmation */ +#define ROLE_FORW_NO 0 /* ... forward ... */ +#define ROLE_FORW_YES 1 +#define ROLE_FORW_NOCONF 2 +#define ROLE_COMP_NO 0 /* ... compose ... */ +#define ROLE_COMP_YES 1 +#define ROLE_COMP_NOCONF 2 + +#define ROLE_REPL_DEFL ROLE_REPL_YES /* default reply value */ +#define ROLE_FORW_DEFL ROLE_FORW_YES /* default forward value */ +#define ROLE_COMP_DEFL ROLE_COMP_NO /* default compose value */ +#define ROLE_NOTAROLE_DEFL ROLE_COMP_NO + +#define INTVL_INF (2147483646L) +#define INTVL_UNDEF (INTVL_INF + 1L) +#define SCORE_UNDEF INTVL_UNDEF +#define SCORE_MIN (-100) +#define SCORE_MAX (100) +#define SCOREUSE_GET 0x000 +#define SCOREUSE_INVALID 0x001 /* will recalculate scores_in_use next time */ +#define SCOREUSE_ROLES 0x010 /* scores are used for roles */ +#define SCOREUSE_INCOLS 0x020 /* scores are used for index line colors */ +#define SCOREUSE_FILTERS 0x040 /* scores are used for filters */ +#define SCOREUSE_OTHER 0x080 /* scores are used for miscellaneous stuff */ +#define SCOREUSE_INDEX 0x100 /* scores are used in index-format */ +#define SCOREUSE_STATEDEP 0x200 /* scores depend on message state */ + +/* + * A message is compared with a pattern group to see if it matches. + * If it does match, then there are actions which are taken. + */ +typedef struct pat_s { + PATGRP_S *patgrp; + ACTION_S *action; + struct pat_line_s *patline; /* pat_line that goes with this pat */ + char *raw; + unsigned inherit:1; + struct pat_s *next; + struct pat_s *prev; +} PAT_S; + +typedef enum {TypeNotSet = 0, Literal, File, Inherit} PAT_TYPE; + +/* + * There's one of these for each line in the pinerc variable. + * Normal type=Literal patterns have a patline with both first and last + * pointing to the pattern. Type File has one patline for the file and first + * and last point to the first and last patterns in the file. + * The patterns aren't linked into one giant list, the patlines are. + * To traverse all the patterns you have to go through the patline list + * and then for each patline go from first to last through the patterns. + * That's what next_pattern and friends do. + */ +typedef struct pat_line_s { + PAT_TYPE type; + PAT_S *first; /* 1st pattern in list belonging to this line */ + PAT_S *last; + char *filename; /* If type File, the filename */ + char *filepath; + unsigned readonly:1; + unsigned dirty:1; /* needs to be written back to storage */ + struct pat_line_s *next; + struct pat_line_s *prev; +} PAT_LINE_S; + +typedef struct pat_handle { + PAT_LINE_S *patlinehead; /* list of in-core, parsed pat lines */ + unsigned dirtypinerc:1; /* needs to be written */ +} PAT_HANDLE; + +typedef struct pat_state { + long rflags; + int cur_rflag_num; + PAT_LINE_S *patlinecurrent; + PAT_S *patcurrent; /* current pat within patline */ +} PAT_STATE; + +#define PATTERN_MAGIC "P#Pats" +#define PATTERN_FILE_VERS "01" + + +/* + * This is a little dangerous. We're passing flags to match_pattern and + * peeling some of them off for our own use while passing the rest on + * to mail_search_full. So we need to define ours so they don't overlap + * with the c-client flags that can be passed to mail_search_full. + * We could formalize it with mrc. + */ +#define MP_IN_CCLIENT_CB 0x10000 /* we're in a c-client callback! */ +#define MP_NOT 0x20000 /* use ! of patgrp for search */ + + +/* match_pattern_folder_specific flags */ +#define FOR_PATTERN 0x01 +#define FOR_FILTER 0x02 +#define FOR_OPTIONSCREEN 0x04 + + +extern PAT_HANDLE **cur_pat_h; + + +/* exported protoypes */ +void role_process_filters(void); +int add_to_pattern(PAT_S *, long); +char *add_pat_escapes(char *); +char *remove_pat_escapes(char *); +char *add_roletake_escapes(char *); +char *add_comma_escapes(char *); +void set_pathandle(long); +void close_every_pattern(void); +void close_patterns(long); +int nonempty_patterns(long, PAT_STATE *); +int any_patterns(long, PAT_STATE *); +int edit_pattern(PAT_S *, int, long); +int add_pattern(PAT_S *, long); +int delete_pattern(int, long); +int shuffle_pattern(int, int, long); +PAT_LINE_S *parse_pat_file(char *); +INTVL_S *parse_intvl(char *); +char *stringform_of_intvl(INTVL_S *); +char *hdrtok_to_stringform(HEADER_TOK_S *); +HEADER_TOK_S *stringform_to_hdrtok(char *); +char *hdrtok_to_config(HEADER_TOK_S *); +HEADER_TOK_S *config_to_hdrtok(char *); +int scores_are_used(int); +int patgrp_depends_on_state(PATGRP_S *); +int patgrp_depends_on_active_state(PATGRP_S *); +PATTERN_S *parse_pattern(char *, char *, int); +PATTERN_S *string_to_pattern(char *); +char *pattern_to_string(PATTERN_S *); +char *pattern_to_config(PATTERN_S *); +PATTERN_S *config_to_pattern(char *); +PATTERN_S *editlist_to_pattern(char **); +char **pattern_to_editlist(PATTERN_S *); +PATGRP_S *nick_to_patgrp(char *, int); +PAT_S *first_pattern(PAT_STATE *); +PAT_S *last_pattern(PAT_STATE *); +PAT_S *prev_pattern(PAT_STATE *); +PAT_S *next_pattern(PAT_STATE *); +int write_patterns(long); +void convert_statebits_to_vals(long, int *, int *, int *, int *); +int match_pattern(PATGRP_S *, MAILSTREAM *, SEARCHSET *,char *, + long (*)(MAILSTREAM *, long), long); +void find_8bitsubj_in_messages(MAILSTREAM *, SEARCHSET *, int, int); +void find_charsets_in_messages(MAILSTREAM *, SEARCHSET *, PATGRP_S *, int); +int compare_strlists_for_match(STRLIST_S *, STRLIST_S *); +int match_pattern_folder(PATGRP_S *, MAILSTREAM *); +int match_pattern_folder_specific(PATTERN_S *, MAILSTREAM *, int); +SEARCHPGM *match_pattern_srchpgm(PATGRP_S *, MAILSTREAM *, SEARCHSET *); +void calc_extra_hdrs(void); +char *get_extra_hdrs(void); +void free_extra_hdrs(void); +void free_pat(PAT_S **); +void free_pattern(PATTERN_S **); +void free_action(ACTION_S **); +PAT_S *copy_pat(PAT_S *); +PATGRP_S *copy_patgrp(PATGRP_S *); +ACTION_S *copy_action(ACTION_S *); +ACTION_S *combine_inherited_role(ACTION_S *); +void mail_expunge_prefilter(MAILSTREAM *, int); +void process_filter_patterns(MAILSTREAM *, MSGNO_S *, long); +void reprocess_filter_patterns(MAILSTREAM *, MSGNO_S *, int); +int trivial_patgrp(PATGRP_S *); +void free_patgrp(PATGRP_S **); +void free_patline(PAT_LINE_S **patline); +int some_filter_depends_on_active_state(void); +void delete_filtered_msgs(MAILSTREAM *); +void free_intvl(INTVL_S **); +void free_arbhdr(ARBHDR_S **); + + +#endif /* PITH_PATTERN_INCLUDED */ |