# pm-jadate3.rc -- 'Tue Nov 25 19:32:57' date parser from variable INPUT # $Id: pm-jadate3.rc,v 2.5 2004/09/28 20:08:46 jaalto Exp $ # # File id # # .Copyright (C) 1997-2004 Jari Aalto # .$Keywords: procmail, subroutine, date parsing $ # # This code is free software in terms of GNU Gen. pub. Lic. v2 or later # Refer to http://www.gnu.org/copyleft/gpl.html # # Description # # This includerc parses date from variable INPUT which has string # # "Week, Month dayNbr hh:mm:ss yyyy", # # Example # # Tue Nov 25 19:32:57 1997 # # Returned values # # YYYY = 4 digits # YY = 2 digits # MON = 3 characters # MM = 2 digits # DAY = 3 characters # DD = 2 digits # hh = 2 digits # mm = 2 digits # ss = 2 sigits # # Variable ERROR is set to "yes" if it couldn't recognize the INPUT. # # Required settings # # PMSRC must point to source directory of procmail code. This subroutine # will include pm-javar.rc from there. # # Call arguments (variables to set before calling) # # INPUT = string-to-parse # # Usage example # # The first *Received* header will tell when the message was received # by the mailserver. Parse the date and avoid calling expensive `date' # command. # # PMSRC = $HOME/pm # RC_DATE_WMDT = $PMSRC/pm-jadate4.rc #Week-Month-Day-Time parser # # # Get time from X-From-Line: Which was added by my MDA # # X-From-Line: procmail-request@informatik.rwth-aachen.de \ # # Tue Nov 25 19:32:57 1997 # # :0 c # *$ ^X-From-Line:\/.* # { # INPUT = $MATCH # # # Turn off the logging while executing subroutine # # VERBOSE=off INCLUDERC = $RC_DATE_WMDT VERBOSE=on # # :0 # * ERROR ?? yes # { # # Use some other way to get the time or shout loudly # } # } # # Change Log (none) # .................................................... &initialising ... id = "pm-jadate3.rc" dummy = " ======================================================================== $id: init: " :0 * ! WSPC ?? ( ) { INCLUDERC = $PMSRC/pm-javar.rc } # ..................................................... &output-vars ... # output variables # Kill following variables, listed one by one here: YYYY MM MON DD DAY hh mm ss ERROR = "yes" # set defualt value # ........................................................... &do-it ... # Check that input is something like: Thu, 13 Nov 1997 dummy = "$id: Parse date like [Tue Nov 25 19:32:57 19:00:00 1997]" dummy = "$id: INPUT = $INPUT" # show what we try to match :0 D * INPUT ?? $ $s*\/[SMTWF]$a$a[,$WSPC]+$a$a$a$s+$d+$s+$d$d:.* { INPUT = $MATCH :0 D * INPUT ?? ^\/[A-Z].. { DAY = $MATCH } :0 D *$ INPUT ?? ^...[,$WSPC]\/[A-Z].. { MON = $MATCH } :0 *$ INPUT ?? ^...[,$WSPC]...$s+\/$d$d { DD = $MATCH } :0 E # else *$ INPUT ?? ^...[,$WSPC]...$s+\/$d { DD = "0$MATCH" } # ........................................................ &time ... # Move to hh:mm:ss section :0 *$ INPUT ?? ^...[,$WSPC]...+$s$d+$s+\/.* { INPUT = $MATCH } :0 *$ INPUT ?? ^\/$d$d { hh = $MATCH } :0 *$ INPUT ?? ^..:\/$d$d { mm = $MATCH } :0 *$ INPUT ?? ^..:..:\/$d$d { ss = $MATCH } # ........................................................ &year ... :0 *$ INPUT ?? ^..:..:..$s+\/$d$d$d$d { YYYY = $MATCH } # If this last recipe succeeds, then the whole string has been parsed. :0 * YYYY ?? ^..\/.. { YY = $MATCH ERROR = "no" } # Now reverse engineer to the numer, David Tamkin # technically one should use $\monthnym but here it doesn't matter # If user gave invalid input, will not match :0 *$ mm2nbr ?? $MON\/.. { MM = $MATCH } } dummy = "$id: end:" # end of file pm-jadate.rc