/** @file @brief Returns an unused libref @details Use as follows: libname mclib0 (work); libname mclib1 (work); libname mclib2 (work); %let libref=%mf_getuniquelibref(); %put &=libref; which returns: > mclib3 A blank value is returned if no usable libname is determined. @param [in] prefix= (mclib) first part of the returned libref. As librefs can be as long as 8 characters, a maximum length of 7 characters is premitted for this prefix. @param [in] maxtries= (1000) Deprecated parameter. Remains here to ensure a non-breaking change. Will be removed in v5. @version 9.2 @author Allan Bowe **/ %macro mf_getuniquelibref(prefix=mclib,maxtries=1000); %local x; %if ( %length(&prefix) gt 7 ) %then %do; %put %str(ERR)OR: The prefix parameter cannot exceed 7 characters.; 0 %return; %end; %else %if (%sysfunc(NVALID(&prefix,v7))=0) %then %do; %put %str(ERR)OR: Invalid prefix (&prefix); 0 %return; %end; /* Set maxtries equal to '10 to the power of [# unused characters] - 1' */ %let maxtries=%eval(10**(8-%length(&prefix))-1); %do x = 0 %to &maxtries; %if %sysfunc(libref(&prefix&x)) ne 0 %then %do; &prefix&x %return; %end; %let x = %eval(&x + 1); %end; %put %str(ERR)OR: No usable libref in range &prefix.0-&maxtries; %put %str(ERR)OR- Try reducing the prefix or deleting some libraries!; 0 %mend mf_getuniquelibref;