/*

/ Program      : substrw.sas
/ Version      : 1.0
/ Author       : Roland Rashleigh-Berry
/ Date         : 30-Jul-2007
/ Purpose      : Function-style macro to substring words assigned to a macro
/                variable.
/ SubMacros    : none
/ Notes        : This works like %substr() but acts on words instead. If number
/                parameter is not set then all following words are returned.
/ Usage        : %let whatsleft=%substrw(&mvar,4);
/                %let twothree=%substrw(&str,2,2);
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ str               (pos) String to work on
/ start             (pos) Start word number
/ number            (pos) Number of words (optional)
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb  13Feb07         "macro called2 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: substrw v1.0;

%macro substrw(str,start,number);

%local error i pos bit;
%let error=0;

%if not %length(&start) %then %do;
  %let error=1;
  %put ERROR: No start word number provided as second positional parameter;
%end;

%if &error %then %goto error;

%if %length(&str) %then %do;
  %if not %length(&number) %then %do;
    %let pos=&start;
    %let bit=%scan(&str,&pos,%str( ));
    %do %while(%length(&bit));
&bit
      %let pos=%eval(&pos+1);
      %let bit=%scan(&str,&pos,%str( ));
    %end;
  %end;
  %else %do;
    %do i=1 %to &number;
%scan(&str,%eval(&start-1+&i),%str( ))
    %end;
  %end;
%end;

%goto skip;
%error:
%put ERROR: Leaving substrw macro due to error(s) listed;
%skip:
%mend;