/*
/ Program : fmtord.sas
/ Version : 1.0
/ Author : Roland Rashleigh-Berry
/ Date : 13-Feb-2007
/ Purpose : To create a numeric informat that maps a format label to its
/ order position.
/ SubMacros : %words %fmtpath %verifyb
/ Notes : The informat will be called fmtord. by default.
/ Usage : %fmtord(agernge);
/
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ format (pos) format name to create informat from
/ infmtname=fmtord Name of the informat created. Do not end with a period.
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb 13Feb07 "macro called" message added
/===============================================================================
/ 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: fmtord v1.0;
%macro fmtord(format,infmtname=fmtord);
%local ext i cat catlist gotit;
%*- drop the "." ending and any numbers immediately preceding it -;
%let fmtname=%upcase(%substr(&format,1,%verifyb(&format,0123456789.)));
%let format=&fmtname;
%let ext=FORMAT;
%if "%substr(&fmtname,1,1)" EQ "$" %then %do;
%let ext=FORMATC;
%let fmtname=%substr(&fmtname,2);
%end;
%let catlist=%fmtpath;
%let gotit=0;
%do i=1 %to %words(&catlist);
%let cat=%scan(&catlist,&i,%str( ));
%if %sysfunc(cexist(&cat..&fmtname..&ext)) %then %do;
%let gotit=1;
proc format lib=&cat cntlout=_fmtord;
select &format;
run;
quit;
data _fmtord;
length label $ 6;
retain fmtname "&infmtname" type 'I';
set _fmtord(keep=label rename=(label=start));
label=left(put(_n_,6.));
run;
proc format cntlin=_fmtord;
run;
proc datasets nolist;
delete _fmtord;
run;
quit;
%let i=99;
%end;
%end;
%if not &gotit %then %put ERROR: (fmtord) Format "&format" not found;
%mend;