# pm-jadate5.rc -- 'Fri Jun 19 18:51:56 1998' date parser from var INPUT # $Id: pm-jadate5.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 # # "WeekDay Month dayNbr Year" # # Example input # # "Fri Jun 19 18:51:56 1998" -- without comma # "Fri, Jun 19 18:51:56 1998" -- with comma # # Returned values # # YYYY = 4 digits # YY = 2 digits # MON = 3 characters # MM = 2 digits # DAY = 3 characters # DD = 2 digits # hh = 2 digits If available # mm = 2 digits If available # ss = 2 digits If available # TZ = 5 characters If available # # Variable ERROR is set to "yes" if it couldn't recognize the INPUT # and couldn't parse the basic YYYY,YY,MM,DD variables. # # 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 # # The INPUT can have anything after "Week, dayNbr Month Year", or # before it: you can pass a string like # "Fri Jun 19 18:51:56 1998 11:43:23 +0200". # # Usage example # # The first *Received* header will tell when the message was received # by your mailserver. We parse the date and avoid calling expensive # `date' command. # # PMSRC = $HOME/pm # RC_DATE_WDMY = $PMSRC/pm-jadate5.rc #Week-Day-Month-Year parser # # # Get time from first header, it ends like this: # # :0 # *$ ()\/From .* # { # INPUT = $MATCH # # Turn off the logging while executing this part # # VERBOSE=off INCLUDERC = $RC_DATE_WDMY VERBOSE=on # # :0 # * ERROR ?? yes # { # # Use some other way to get the time or shout loudly # } # } # # Change Log (none) # .................................................... &initialising ... id = "pm-jadate5.rc" dummy = " ======================================================================== $id: init: " :0 * ! WSPC ?? ( ) { INCLUDERC = $PMSRC/pm-javar.rc } # ..................................................... &output-vars ... # output variables # Kill following variables YYYY MM MON DD DAY hh mm ss TZ # Set to default ERROR = "yes" # set defualt value # ........................................................... &do-it ... # Check that input is something like: Thu, 13 Nov 1997 dummy = "$id: Parse: Fri Jun 19 18:51:56 1998" dummy = "$id: INPUT = $INPUT" # show what we try to match :0 D *$ INPUT ?? ()\/[SMTWF]$a$a[,$WSPC]+$a$a$a$s$d+$s+.* { INPUT = $MATCH :0 * INPUT ?? ^\/... { DAY = $MATCH } :0 *$ INPUT ?? ^...[,$WSPC]+\/... { MON = $MATCH } # Move to the DD MON section :0 *$ INPUT ?? ^...[,$WSPC]+...$s+\/.* { INPUT = $MATCH } # ........................................................ &date ... :0 *$ INPUT ?? ^\/$d$d { DD = $MATCH } :0 E # else *$ INPUT ?? ^\/$d { DD = "0$MATCH" } # ........................................................ &time ... # Change INPUT in = $INPUT # just for logging purposes :0 *$ INPUT ?? ^$d+$s+\/.* { INPUT = $MATCH } :0 *$ INPUT ?? ^\/$d$d { hh = $MATCH } :0 *$ INPUT ?? ^$d$d:\/$d$d { mm = $MATCH } :0 *$ INPUT ?? ^$d$d:$d$d:\/$d$d { ss = $MATCH } :0 *$ INPUT ?? ^$d$d:$d$d:$d$d$s+\/[-+].... { TZ = $MATCH } # ........................................................ &year ... :0 *$ INPUT ?? ^$d+:$d+:$d+$s+\/.... { 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