/*

/ Program   : chompw.sas
/ Version   : 1.0
/ Author    : Roland Rashleigh-Berry
/ Date      : 30-Jul-2007
/ Purpose   : Function-style macro to cut out a word from a macro string and
/             optionally cut out words before and/or after it.
/ SubMacros : %words %windex
/ Notes     : The search for the target in the string is only done once, even if
/             there are repeated instances of the target string. Note that this
/             is used as a function-style macro.
/ Usage     : %let str2=%chompw(&str1,&target,2,0,casesens=yes);
/ 
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ str               (pos) String to chomp a piece out of (unquoted)
/ target            (pos) Target string to chomp out
/ after             (pos) Number of words following target string found to chomp
/                    out. Must be an integer.
/ before            (pos) Number of words preceding target string found to chomp
/                    out. Must be an integer.
/ casesens=no       By default the matching on the target is not case sensitive.
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb  13Feb07         "macro called" message added
/ rrb  30Jul07         Header tidy
/===============================================================================
/ This is public domain software. No guarantee as to suitability or accuracy is
/ given or implied. User uses this code entirely at their own risk.
/=============================================================================*/

%put MACRO CALLED: chompw v1.0;

%macro chompw(str,target,after,before,casesens=no);

%local i w pos start stop;

%if not %length(&str) %then %goto exit;
%if not %length(&target) %then %goto exit;

%if not %length(&after) %then %let after=0;
%if not %length(&before) %then %let before=0;
%if not %length(&casesens) %then %let casesens=no;
%let casesens=%upcase(%substr(&casesens,1,1));

%if "&casesens" EQ "Y" %then %let pos=%windex(&str,&target);
%else %let pos=%windex(%upcase(&str),%upcase(&target));

%if not &pos %then %do;
&str
%goto exit;
%end;

%let w=%words(&str);

%let start=%sysevalf(&pos-&before);
%if %sysevalf(&start LT 0) %then %let start=1;

%let stop=%sysevalf(&pos+&after);
%if %sysevalf(&stop GT &w) %then %let stop=&w;

%do i=1 %to &w;
  %if (&i LT &start) or (&i GT &stop) %then %do;
%scan(&str,&i,%str( ))
  %end;
%end;

%exit:
%mend;