######################################################################### # # mairix - message index builder and finder for maildir folders. # # Copyright (C) Richard P. Curnow 2002-2004,2006 # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA # # ======================================================================= %{ #include "from.h" %} # Define tokens # CR : \n # DIGIT : [0-9] # AT : @ # COLON : : # WHITE : ' ', \t # LOWER : [a-z] # UPPER : [A-Z] # PLUSMINUS : [+-] # OTHER_EMAIL : other stuff valid in an address, at least [_.] Abbrev LF = [\n] Abbrev CR = [\r] Abbrev DIGIT = [0-9] Abbrev AT = [@] Abbrev LOWER = [a-z] Abbrev UPPER = [A-Z] Abbrev COLON = [:] Abbrev WHITE = [ \t] Abbrev PLUSMINUS = [+\-] Abbrev OTHER_EMAIL = [_.=] Abbrev EMAIL = LOWER | UPPER | DIGIT | PLUSMINUS | OTHER_EMAIL BLOCK email { STATE in EMAIL -> in, before_at STATE before_at EMAIL -> before_at # Local part only : >=1 characters will suffice, which we've already # matched. -> out AT -> after_at STATE after_at EMAIL -> after_at, out } BLOCK zone { # Make this pretty lenient STATE in UPPER -> zone2 UPPER -> out PLUSMINUS -> zone2 STATE zone2 UPPER | LOWER -> zone2, out DIGIT -> zone2, out } BLOCK date { STATE in WHITE -> in, before_weekday STATE before_weekday UPPER ; LOWER ; LOWER ; WHITE -> after_weekday STATE after_weekday WHITE -> after_weekday UPPER ; LOWER ; LOWER ; WHITE -> after_month STATE after_month WHITE -> after_month DIGIT ; WHITE -> after_day DIGIT ; DIGIT ; WHITE -> after_day STATE after_day WHITE -> after_day # Accept HH:MM:SS DIGIT ; DIGIT ; COLON ; DIGIT ; DIGIT ; COLON ; DIGIT ; DIGIT ; WHITE -> after_time # Accept HH:MM DIGIT ; DIGIT ; COLON ; DIGIT ; DIGIT ; WHITE -> after_time # Allow either 1 or 2 words of timezone STATE after_time WHITE -> after_time -> after_timezone out> ; WHITE -> after_timezone out> ; WHITE -> after_timezone_1 # It appears that Pine puts the timezone after the year DIGIT ; DIGIT ; DIGIT ; DIGIT -> after_year_before_zone STATE after_year_before_zone WHITE -> after_year_before_zone out> -> after_timezone_after_year out> ; WHITE -> after_timezone_after_year_1 STATE after_timezone_after_year_1 WHITE -> after_timezone_after_year_1 out> -> after_timezone_after_year STATE after_timezone_after_year WHITE -> after_timezone_after_year -> out STATE after_timezone_1 WHITE -> after_timezone_1 out> ; WHITE -> after_timezone STATE after_timezone WHITE -> after_timezone DIGIT ; DIGIT ; DIGIT ; DIGIT -> after_year STATE after_year WHITE -> after_year -> out } # Assume the earlier code has identified the '\nFrom ' sequence, # and the validator starts scanning from the character beyond the space BLOCK main { STATE in # Real return address. WHITE -> in out> -> before_date # Cope with Mozilla mbox folder format which just uses a '-' as # the return address field. PLUSMINUS -> before_date # Empty return address -> before_date STATE before_date out> ; LF = FROMCHECK_PASS # Cope with mozilla mbox format out> ; CR ; LF = FROMCHECK_PASS # Mention this state last : the last mentioned state in the last defined # block becomes the entry state of the scanner. STATE in } ATTR FROMCHECK_PASS ATTR FROMCHECK_FAIL DEFATTR FROMCHECK_FAIL PREFIX fromcheck TYPE "enum fromcheck_result" # vim:ft=txt:et:sw=4:sts=4:ht=4