/*

/ Program   : readfile.sas
/ Version   : 1.0
/ Author    : Roland Rashleigh-Berry
/ Date      : 31-Jul-2007
/ Purpose   : Function-style macro to read in a flat file and assign the
/             contents to a macro variable.
/ SubMacros : none
/ Notes     : You could use this to generate information and write it to a file
/             and then read it in to a macro variable for further processing.
/             Lines in the file must not be longer than 200 characters. Line
/             breaks will be lost when the data is read in.
/ Usage     : %let mvar=%readfile(filename);
/ 
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ file              (pos) Path name of flat file
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb  29Mar07         Put out "macro called" message plus header tidy
/ rrb  31Jul07         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: readfile v1.0;

%macro readfile(file);
%local fname fid str rc;
%let file="%sysfunc(compress(&file,%str(%'%")))";
%if not %sysfunc(fileexist(&file)) %then 
%put ERROR: (readfile) File &file does not exist;
%else %do;
  %let rc=%sysfunc(filename(fname,&file));  
  %if &rc NE 0 %then %do;
%put ERROR: (readfile) File &file could not be assigned due to the following:;
%put %sysfunc(sysmsg());
  %end;
  %else %do;
    %let fid=%sysfunc(fopen(&fname));
    %if &fid EQ 0 %then %do;
%put ERROR: (readfile) File &file could not be opened due to the following:;
%put %sysfunc(sysmsg());
    %end;
    %else %do;
      %do %while(%sysfunc(fread(&fid)) EQ 0);
        %let rc=%sysfunc(fget(&fid,str,200));
&str
      %end;
      %let rc=%sysfunc(fclose(&fid));
      %if &rc NE 0 %then %do;
%put ERROR: (readfile) File &file could not be closed due to the following:;
%put %sysfunc(sysmsg());
      %end;
      %let rc=%sysfunc(filename(fname));
      %if &rc NE 0 %then %do;
%put ERROR: (readfile) File &file could not be deassigned due to the following:;
%put %sysfunc(sysmsg());
      %end;
    %end;
  %end;
%end;
%mend;