diff --git a/README.md b/README.md
index fdb7d11..e6113c5 100644
--- a/README.md
+++ b/README.md
@@ -172,101 +172,47 @@ If you find the SPF useful **share info** about it or **give it a [star](https:/
## Available packages:
-**(!)** For "backward compatibility"/historical point of view the following packages are available under the `./packages` directory.
+This section presents some example of available SAS packages.
**(!)** Since *September 2022* the default location for packages is **SASPAC - the SAS Packages Archive** located under: [`https://github.com/SASPAC`](https://github.com/SASPAC) where each package is stored as a separate repository with historical versions too.
+**(!)** For "backward compatibility"/historical point of view the following packages are also available under the `./packages` directory in this repository.
+
Packages:
-- **SQLinDS**\[2.2.6\], based on Mike Rhoads' article *Use the Full Power of SAS in Your Function-Style Macros*. The package allows to write SQL queries in the data step, e.g.
-```sas
- data class;
- set %SQL(select * from sashelp.class order by age);
- run;
-```
-SHA256 digest for SQLinDS: F*3BB422E8C94515DEE9E13E674A0D119794F464D9597C28D5D536E71F64EB5298
+- **SQLinDS**
-[Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS")
+ [Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS")
-[SQLinDS in SASPAC](https://github.com/SASPAC/sqlinds "SQLinDS in SASPAC")
+ [SQLinDS in SASPAC](https://github.com/SASPAC/sqlinds "SQLinDS in SASPAC")
-- **DFA** (Dynamic Function Arrays)\[0.5.5\], contains set of macros and FCMP functions which implement: a dynamically allocated array, a stack, a fifo queue, an ordered stack, and a priority queue, run `%helpPackage(DFA,createDFArray)` to find examples.
+- **DFA** (Dynamic Function Arrays)
-SHA256 digest for DFA: F*924711C77E413B8CFC18336DDA2293A9F5294D02E267C1BB7BC876B4AF0AABE4
+ [Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA")
-[Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA")
+ [DFA in SASPAC](https://github.com/SASPAC/dfa "DFA in SASPAC")
-[DFA in SASPAC](https://github.com/SASPAC/dfa "DFA in SASPAC")
+- **macroArray**
-- **macroArray**\[1.0.5\], implementation of an array concept in a macrolanguage, e.g.
-```sas
- %array(ABC[17] (111:127), macarray=Y);
-
- %macro test();
- %do i = 1 %to 17;
- %put &i.) %ABC(&i.);
- %end;
- %mend;
- %test()
-
- %let %ABC(13,i) = 99999; /* i = insert */
+ [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray")
- %do_over(ABC, phrase=%nrstr(
- %put &_i_.%) %ABC(&_i_.);
- ),
- which = 1:H:2
- );
-```
-SHA256 digest for macroArray: F*85E3BE4D163AC5223B6EC9D3C25C46564A656E3830998B4555A963180D767160
+ [MacroArray in SASPAC](https://github.com/SASPAC/macroarray "MacroArray in SASPAC")
-[Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray")
+- **BasePlus**
-[MacroArray in SASPAC](https://github.com/SASPAC/macroarray "MacroArray in SASPAC")
+ [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus")
-- **BasePlus**\[1.26.1\] adds a bunch of functionalities I am missing in BASE SAS, such as:
-```sas
-call arrMissToRight(myArray);
-call arrFillMiss(17, myArray);
-call arrFill(42, myArray);
+ [BasePlus in SASPAC](https://github.com/SASPAC/baseplus "BasePlus in SASPAC")
-rc = delDataset("DataSetToDrop");
+- **GSM** (Generate Secure Macros)
-string = catXFn("date9.", "#", myArray);
+ [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM")
-format x bool.;
+ [GSM in SASPAC](https://github.com/SASPAC/gsm "GSM in SASPAC")
-%put %getVars(sashelp.class, pattern = ght$, sep = +, varRange = _numeric_);
+- **dynMacroArray**
-%rainCloudPlot(sashelp.cars,DriveTrain,Invoice)
-
-%zipLibrary(sashelp,libOut=work)
-
-%bpPIPE(ls -la ~/)
-
-%dirsAndFiles(C:\SAS_WORK\,ODS=work.result)
-
-%put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$);
-```
-SHA256 digest for BasePlus: F*D6DC5AD1B60A92AD300B639B3C361C1F7846EB01E5AB35BF4FDDA6E783408172
-
-[Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus")
-
-[BasePlus in SASPAC](https://github.com/SASPAC/baseplus "BasePlus in SASPAC")
-
-- **GSM** (Generate Secure Macros)\[0.21.0\], package allows
- to create secured macros stored in SAS Proc FCMP functions.
- The dataset with functions can be shared between different operating systems
- and allows to generate macros on site without showing their code.
-
-SHA256 digest for GSM: F*56DC0DCCE06B4281BF3FA6FA3875CBA87772BDA7FAB601B06740A7980FFB0E07
-
-[Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM")
-
-[GSM in SASPAC](https://github.com/SASPAC/gsm "GSM in SASPAC")
-
-- **dynMacroArray**\[0.2.5\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA). Development of this package is currently on hold.
-
-SHA256 digest for dynMacroArray: F*6E087F38BB39B93CBF983124272812E14693C4EF5EE0A3A218BD2BAA069A74BF
+ Development of this package is currently on hold.
### ======
diff --git a/packages/README.md b/packages/README.md
index aaff155..154fa2f 100644
--- a/packages/README.md
+++ b/packages/README.md
@@ -86,7 +86,7 @@ SHA256 digest for macroArray: F*85E3BE4D163AC5223B6EC9D3C25C46564A656E3830998B45
---
-- **BasePlus**\[1.26.1\] adds a bunch of functionalities I am missing in BASE SAS, such as:
+- **BasePlus**\[1.29.0\] adds a bunch of functionalities I am missing in BASE SAS, such as:
```sas
call arrMissToRight(myArray);
call arrFillMiss(17, myArray);
@@ -110,7 +110,7 @@ format x bool.;
%put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$);
```
-SHA256 digest for BasePlus: F*D6DC5AD1B60A92AD300B639B3C361C1F7846EB01E5AB35BF4FDDA6E783408172
+SHA256 digest for BasePlus: F*9EEE4F4B99EA725B60141645AB6A50BFEBA32CE54848593F8D832D907D63CAD7
[Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus")
diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt
index 8628267..b2ecdfe 100644
--- a/packages/SHA256_for_packages.txt
+++ b/packages/SHA256_for_packages.txt
@@ -1,3 +1,6 @@
+/* 20230824 */
+BasePlus: F*9EEE4F4B99EA725B60141645AB6A50BFEBA32CE54848593F8D832D907D63CAD7
+
/* 20230727 */
GSM: F*56DC0DCCE06B4281BF3FA6FA3875CBA87772BDA7FAB601B06740A7980FFB0E07
diff --git a/packages/baseplus.md b/packages/baseplus.md
index 0d2ed2b..3a4fcf1 100644
--- a/packages/baseplus.md
+++ b/packages/baseplus.md
@@ -62,15 +62,17 @@
* [`%translate()` macro](#translate-macro)
* [`%tranwrd()` macro](#tranwrd-macro)
* [`%findDSwithVarVal()` macro](#finddswithvarval-macro)
- * [`%getTitle()` macro](#gettitle-macro)
-
+ * [`%getTitle()` macro](#gettitle-macro)
+ * [`%mInclude()` macro](#minclude-macro)
+ * [`%fmt()` macro](#fmt-macro)
+ * [`%infmt()` macro](#infmt-macro)
* [License](#license)
---
-# The BasePlus package [ver. 1.26.1] ###############################################
+# The BasePlus package [ver. 1.29.0] ###############################################
The **BasePlus** package implements useful
functions and functionalities I miss in the BASE SAS.
@@ -90,7 +92,8 @@ Kudos to all who inspired me to generate this package:
*Anamaria Calai*,
*Michal Ludwicki*,
*Quentin McMullen*,
-*Kurt Bremser*.
+*Kurt Bremser*,
+*Leonid Batkhan*.
Recording from the SAS Explore 2022 conference: [A BasePlus Package for SAS](https://communities.sas.com/t5/SAS-Explore-Presentations/A-BasePlus-Package-for-SAS/ta-p/838246 "A BasePlus Package for SAS") (September 27th-29th, 2022).
@@ -281,72 +284,101 @@ run;
%put %GetTitle(1 2 3 5, dlm=s, qt='') ;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**EXAMPLE 20** Format and informat macro variables values:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+ %put %fmt(12345, date9.) %fmt(12345, yymmdd10.);
+
+ %put %infmt($111234, dollar10.2);
+ %put %infmt($111.234, dollar10.2);
+
+ %let text = ##%fmt(ABC, $char9., -C)##;
+ %put &text.;
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**EXAMPLE 21** "Macro including" a text file:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+ filename f "%workpath()/testFile1.txt";
+ data _null_;
+ file f;
+ put "13 14 15";
+ run;
+
+ data testDataset;
+ set sashelp.class;
+ where age in ( %mInclude(f) );
+ run;
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
---
Package contains:
-1. macro bppipe
-2. macro deduplistc
-3. macro deduplistp
-4. macro deduplists
-5. macro deduplistx
-6. macro dirsandfiles
-7. macro functionexists
-8. macro getvars
-9. macro intslist
-10. macro ldsn
-11. macro ldsnm
-12. macro lvarnm
-13. macro lvarnmlab
-14. macro qdeduplistx
-15. macro qgetvars
-16. macro qzipevalf
-17. macro raincloudplot
-18. macro repeattxt
-19. macro splitdsintoblocks
-20. macro splitdsintoparts
-21. macro symdelglobal
-22. macro unziplibrary
-23. macro zipevalf
-24. macro ziplibrary
-25. format bool
-26. format boolz
-27. format ceil
-28. format floor
-29. format int
-30. functions arrfill
-31. functions arrfillc
-32. functions arrmissfill
-33. functions arrmissfillc
-34. functions arrmisstoleft
-35. functions arrmisstoleftc
-36. functions arrmisstoright
-37. functions arrmisstorightc
-38. functions bracketsc
-39. functions bracketsn
-40. functions catxfc
-41. functions catxfi
-42. functions catxfj
-43. functions catxfn
-44. functions deldataset
-45. functions semicolonc
-46. functions semicolonn
-47. format brackets
-48. format semicolon
-49. proto qsortincbyprocproto
-50. functions frommissingtonumberbs
-51. functions fromnumbertomissing
-52. functions quicksort4notmiss
-53. functions quicksorthash
-54. functions quicksorthashsddv
-55. functions quicksortlight
-56. macro filepath
-57. macro finddswithvarval
-58. macro gettitle
-59. macro letters
-60. macro libpath
-61. macro translate
-62. macro tranwrd
-63. macro workpath
+1. macro bppipe
+2. macro deduplistc
+3. macro deduplistp
+4. macro deduplists
+5. macro deduplistx
+6. macro dirsandfiles
+7. macro functionexists
+8. macro getvars
+9. macro intslist
+10. macro ldsn
+11. macro ldsnm
+12. macro lvarnm
+13. macro lvarnmlab
+14. macro qdeduplistx
+15. macro qgetvars
+16. macro qzipevalf
+17. macro raincloudplot
+18. macro repeattxt
+19. macro splitdsintoblocks
+20. macro splitdsintoparts
+21. macro symdelglobal
+22. macro unziplibrary
+23. macro zipevalf
+24. macro ziplibrary
+25. format bool
+26. format boolz
+27. format ceil
+28. format floor
+29. format int
+30. functions arrfill
+31. functions arrfillc
+32. functions arrmissfill
+33. functions arrmissfillc
+34. functions arrmisstoleft
+35. functions arrmisstoleftc
+36. functions arrmisstoright
+37. functions arrmisstorightc
+38. functions bracketsc
+39. functions bracketsn
+40. functions catxfc
+41. functions catxfi
+42. functions catxfj
+43. functions catxfn
+44. functions deldataset
+45. functions semicolonc
+46. functions semicolonn
+47. format brackets
+48. format semicolon
+49. proto qsortincbyprocproto
+50. functions frommissingtonumberbs
+51. functions fromnumbertomissing
+52. functions quicksort4notmiss
+53. functions quicksorthash
+54. functions quicksorthashsddv
+55. functions quicksortlight
+56. macro filepath
+57. macro finddswithvarval
+58. macro fmt
+59. macro gettitle
+60. macro infmt
+61. macro letters
+62. macro libpath
+63. macro minclude
+64. macro translate
+65. macro tranwrd
+66. macro workpath
+
Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load it
@@ -356,7 +388,7 @@ localization (only if additional content was deployed during the installation pr
* SAS package generated by generatePackage, version 20230520 *
The SHA256 hash digest for package BasePlus:
-`F*D6DC5AD1B60A92AD300B639B3C361C1F7846EB01E5AB35BF4FDDA6E783408172`
+`F*9EEE4F4B99EA725B60141645AB6A50BFEBA32CE54848593F8D832D907D63CAD7`
---
# Content description ############################################################################################
@@ -5115,6 +5147,324 @@ The basic syntax is the following, the `<...>` means optional parameters:
---
+## >>> `%mInclude()` macro: <<< #######################
+
+The mInclude() macro is a macrolanguage version of the SAS `%include` statement.
+But it allows for "embedding any code anywhere into SAS programs".
+
+Macro was inspired by *Leonid Batkhan* and his blog post:
+
+"Embedding any code anywhere into SAS programs" from May 30, 2023.
+
+Link: `https://blogs.sas.com/content/sgf/2023/05/30/embedding-any-code-anywhere-into-sas-programs/`
+
+The implementation presented, in contrary to inspiration source, is
+based on the `doSubL()` function and a list of global
+macrovariables of the form `______` (six underscores and a number).
+
+See examples below for the details.
+
+The `%mInclude()` macro executes like a pure macro code.
+
+### SYNTAX: ###################################################################
+
+The basic syntax is the following, the `<...>` means optional parameters:
+~~~~~~~~~~~~~~~~~~~~~~~sas
+%mInclude(
+ < f>
+ <,source=>
+ <,lrecl=>
+ <,symdel=>
+)
+~~~~~~~~~~~~~~~~~~~~~~~
+
+**Arguments description**:
+
+1. `f` - *Required*, a SAS `fileref` or a **quoted** path
+ to the included file.
+
+*. `source=0` - *Optional*, default value is `0`.
+ Set to `1` if the source should be printed in the log.
+
+*. `lrecl=32767` - *Optional*, default value is `32767`.
+ Sets the `lrecl` value for the file width.
+
+*. `symdel=1` - *Optional*, default value is `1`.
+ Indicates if the global macrovariables
+ `______1` to `______N` should be deleted
+ when the macro ends.
+
+---
+
+### EXAMPLES AND USECASES: ####################################################
+
+**EXAMPLE 1.** Embedding text in statements (the `%include` won't work here):
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+ resetline;
+ filename f "%workpath()/testFile1.txt";
+ filename f list;
+
+ data _null_;
+ file f;
+ put "13 14 15";
+ run;
+
+ resetline;
+ data testDataset;
+ set sashelp.class;
+ where age in ( %mInclude(f) );
+ run;
+
+ data testDataset2;
+ set sashelp.class;
+ where age in ( %mInclude(f,source=1) );
+ run;
+
+ filename f clear;
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 2.** Embedding with direct path (mind those quotes!):
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+ resetline;
+ filename f "%workpath()/testFile2.txt";
+ filename f list;
+
+ %let someGlobalMacroVariable=17;
+
+ data _null_;
+ file f;
+ put "options mprint;";
+ do i=1 to 3;
+ put "data y; x = " i "; run;";
+ put '%macro A' i +(-1) '(); %put ' i ' ** &someGlobalMacroVariable.; %mend; %A' i +(-1) '()';
+ end;
+ put "options nomprint;";
+ run;
+
+ resetline;
+ %mInclude("%workpath()/testFile2.txt")
+
+ %mInclude("%workpath()/testFile2.txt",source=1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 3.** Embedding SQL code inside the pass through execution:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+ resetline;
+ filename f2 "%workpath()/testSql.txt";
+
+ data _null_;
+ file f2;
+ input;
+ put _infile_;
+ cards4;
+ select
+ c2.make
+ , c2.model
+ , c2.type
+ , c2.invoice
+ , c2.date
+
+ from
+ public.CARS_EU c2
+
+ where
+ c2.cylinders > 4
+ and
+ c2.date > '2023-04-02'
+ ;;;;
+ run;
+
+
+ title 'the %include fails';
+ proc sql;
+ connect to POSTGRES as PSGDB (
+ server="127.0.0.1"
+ port=5432
+ user="user"
+ password="password"
+ database="DB"
+ );
+
+ select * from connection to PSGDB
+ (
+ %Include f2 / source2;
+ )
+ ;
+
+ disconnect from PSGDB;
+ quit;
+
+ title 'the %mInclude works';
+ proc sql;
+ connect to POSTGRES as PSGDB (
+ server="127.0.0.1"
+ port=5432
+ user="user"
+ password="password"
+ database="DB"
+ );
+
+
+ select * from connection to PSGDB
+ (
+ %mInclude(f2, source=1)
+ )
+ ;
+
+ disconnect from PSGDB;
+ quit;
+
+ title;
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 4.** In a limited way and with help of the `resolve()` function,
+ it even works with IML's interface to R:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+
+resetline;
+filename f3 TEMP;
+
+data _null_;
+ file f3;
+ infile cards4;
+ input;
+ put _infile_ ';'; %* a "semicolon" trick for R statements separation *;
+cards4;
+rModel <- lm(Weight ~ Height, data=Class, na.action="na.exclude")
+print (rModel$call)
+print (rModel)
+;;;;
+run;
+
+
+proc iml;
+ codeText = resolve(' %mInclude(f3, source=1) ');
+ print codeText;
+
+ call ExportDataSetToR("Sashelp.Class", "Class" );
+ submit codeText / R;
+ &codeText
+ endsubmit;
+quit;
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+---
+
+## >>> `%fmt()` macro: <<< #######################
+
+The fmt() macro function returns a `value` formatted by a `format`,
+it is a wrapper to `putN()` and `putC()` functions.
+
+See examples below for the details.
+
+The `%fmt()` macro executes like a pure macro code.
+
+### SYNTAX: ###################################################################
+
+The basic syntax is the following, the `<...>` means optional parameters:
+~~~~~~~~~~~~~~~~~~~~~~~sas
+%fmt(
+ value
+ ,format
+ ,align
+ <,type=>
+)
+~~~~~~~~~~~~~~~~~~~~~~~
+
+**Arguments description**:
+
+1. `value` - *Required*, a value to be formatted.
+
+2. `format` - *Required*, a name of a format to be used,
+ character format should be preceded by the `$`.
+
+3. `align` - *Optional*, allows to use the `-L`, `-R` and `-C` modifiers.
+
+* `type=n` - *Optional*, defines type of the format. If the format
+ name is preceded by the `$` then C is set automatically.
+ If the character format name is without `$` then set
+ value to `C` yourself.
+
+---
+
+### EXAMPLES AND USECASES: ####################################################
+
+**EXAMPLE 1.** Formatting values:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+ %put %fmt(111, 7.2);
+
+ %put %fmt(111, dollar10.2);
+
+ %put %fmt(abc, $upcase.);
+
+ %put %fmt(12345, date9.);
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**EXAMPLE 2.** Align values (compare different results!):
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+ %put *%fmt(ABC, $char9., -L)*;
+ %put *%fmt(ABC, $char9., -R)*;
+ %put *%fmt(ABC, $char9., -C)*;
+
+ %put %fmt(ABC, $char9., -L);
+ %put %fmt(ABC, $char9., -R);
+ %put %fmt(ABC, $char9., -C);
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+---
+
+## >>> `%infmt()` macro: <<< #######################
+
+The infmt() macro function returns a `value` read in by an `informat`,
+it is a wrapper to `inputN()` and `inputC()` functions.
+
+See examples below for the details.
+
+The `%infmt()` macro executes like a pure macro code.
+
+### SYNTAX: ###################################################################
+
+The basic syntax is the following, the `<...>` means optional parameters:
+~~~~~~~~~~~~~~~~~~~~~~~sas
+%infmt(
+ value
+ ,informat
+ <,type=>
+)
+~~~~~~~~~~~~~~~~~~~~~~~
+
+**Arguments description**:
+
+1. `value` - *Required*, a value to be formatted.
+
+2. `informat` - *Required*, a name of a format to be used,
+ character format should be preceded by the `$`.
+
+* `type=n` - *Optional*, defines type of the informat. If the informat
+ name is preceded by the `$` then C is set automatically.
+ If the character format name is without `$` then set
+ value to `C` yourself.
+
+---
+
+### EXAMPLES AND USECASES: ####################################################
+
+**EXAMPLE 1.** Informatting values:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+ %put %infmt(111, 7.2);
+ %put %infmt(111.234, 7.2);
+
+ %put %infmt($111, dollar10.2);
+ %put %infmt($111.234, dollar10.2);
+
+ %put %infmt(abc, $upcase.);
+
+ %put %infmt(12mar45, date9.);
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
diff --git a/packages/baseplus.zip b/packages/baseplus.zip
index 47bd791..f404976 100644
Binary files a/packages/baseplus.zip and b/packages/baseplus.zip differ