mirror of
https://github.com/sasjs/core.git
synced 2026-01-18 05:50:06 +00:00
feat: adding first fcmp macro, mcf_string2file.sas
This commit is contained in:
@@ -41,6 +41,13 @@ Documentation: https://core.sasjs.io
|
|||||||
- No X command
|
- No X command
|
||||||
- Prefixes: _mf_, _mp_
|
- Prefixes: _mf_, _mp_
|
||||||
|
|
||||||
|
**fcmp** library (SAS9/Viya)
|
||||||
|
- Function and macro names are identical, except for special cases
|
||||||
|
- Prefixes: _mcf_
|
||||||
|
|
||||||
|
The fcmp macros are used to generate fcmp functions, and can be used with or
|
||||||
|
without the `proc fcmp` wrapper.
|
||||||
|
|
||||||
**meta** library (SAS9 only)
|
**meta** library (SAS9 only)
|
||||||
|
|
||||||
- OS independent
|
- OS independent
|
||||||
|
|||||||
79
all.sas
79
all.sas
@@ -18804,3 +18804,82 @@ run;
|
|||||||
%inc "%sysfunc(pathname(work))/ml_json.lua";
|
%inc "%sysfunc(pathname(work))/ml_json.lua";
|
||||||
|
|
||||||
%mend ml_json;
|
%mend ml_json;
|
||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Adds a string to a file
|
||||||
|
@details Creates an fcmp function for appending a string to an external file.
|
||||||
|
If the file does not exist, it is created.
|
||||||
|
|
||||||
|
The function itself takes the following paramters:
|
||||||
|
|
||||||
|
| PARAMETER | DESCRIPTION |
|
||||||
|
|------------|-------------|
|
||||||
|
| filepath $ | full path to the file|
|
||||||
|
| string $ | string to add to the file |
|
||||||
|
| mode $ | mode of the output - either APPEND (default) or CREATE |
|
||||||
|
|
||||||
|
It returns 0 if successful, or -1 if an error occured.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mcf_string2file(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
rc=mcf_string2file(
|
||||||
|
"%sysfunc(pathname(work))/newfile.txt"
|
||||||
|
, "This is a test"
|
||||||
|
, "CREATE");
|
||||||
|
run;
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
infile "%sysfunc(pathname(work))/newfile.txt";
|
||||||
|
input;
|
||||||
|
putlog _infile_;
|
||||||
|
run;
|
||||||
|
|
||||||
|
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
|
||||||
|
@param [out] insert_cmplib= (NO) Choose YES to insert the package into the
|
||||||
|
CMPLIB reference.
|
||||||
|
@param [out] lib= (work) The output library in which to create the catalog.
|
||||||
|
@param [out] cat= (sasjs) The output catalog in which to create the package.
|
||||||
|
@param [out] pkg= (utils) The output package in which to create the function.
|
||||||
|
Uses a 3 part format: libref.catalog.package
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mcf_string2file(wrap=NO
|
||||||
|
,insert_cmplib=NO
|
||||||
|
,lib=WORK
|
||||||
|
,cat=SASJS
|
||||||
|
,pkg=UTILS
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
proc fcmp outcat=&lib..&cat..&pkg;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
function mcf_string2file(filepath $, string $, mode $);
|
||||||
|
if mode='APPEND' then fmode='a';
|
||||||
|
else fmode='o';
|
||||||
|
length fref $8;
|
||||||
|
rc=filename(fref,filepath);
|
||||||
|
if (rc ne 0) then return( -1 );
|
||||||
|
fid = fopen(fref,fmode);
|
||||||
|
if (fid = 0) then return( -1 );
|
||||||
|
rc=fput(fid, string);
|
||||||
|
rc=fwrite(fid);
|
||||||
|
rc=fclose(fid);
|
||||||
|
rc=filename(fref);
|
||||||
|
return(0);
|
||||||
|
endsub;
|
||||||
|
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
quit;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if &insert_cmplib=YES %then %do;
|
||||||
|
options insert=(CMPLIB=(&lib..&cat));
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mcf_string2file;
|
||||||
2
build.py
2
build.py
@@ -84,7 +84,7 @@ options noquotelenmax;
|
|||||||
"""
|
"""
|
||||||
f = open('all.sas', "w") # r / r+ / rb / rb+ / w / wb
|
f = open('all.sas', "w") # r / r+ / rb / rb+ / w / wb
|
||||||
f.write(header)
|
f.write(header)
|
||||||
folders=['base','meta','metax','viya','lua']
|
folders=['base','meta','metax','viya','lua','fcmp']
|
||||||
for folder in folders:
|
for folder in folders:
|
||||||
filenames = [fn for fn in Path('./' + folder).iterdir() if fn.match("*.sas")]
|
filenames = [fn for fn in Path('./' + folder).iterdir() if fn.match("*.sas")]
|
||||||
filenames.sort()
|
filenames.sort()
|
||||||
|
|||||||
79
fcmp/mcf_string2file.sas
Normal file
79
fcmp/mcf_string2file.sas
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Adds a string to a file
|
||||||
|
@details Creates an fcmp function for appending a string to an external file.
|
||||||
|
If the file does not exist, it is created.
|
||||||
|
|
||||||
|
The function itself takes the following (positional) parameters:
|
||||||
|
|
||||||
|
| PARAMETER | DESCRIPTION |
|
||||||
|
|------------|-------------|
|
||||||
|
| filepath $ | full path to the file|
|
||||||
|
| string $ | string to add to the file |
|
||||||
|
| mode $ | mode of the output - either APPEND (default) or CREATE |
|
||||||
|
|
||||||
|
It returns 0 if successful, or -1 if an error occured.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mcf_string2file(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
rc=mcf_string2file(
|
||||||
|
"%sysfunc(pathname(work))/newfile.txt"
|
||||||
|
, "This is a test"
|
||||||
|
, "CREATE");
|
||||||
|
run;
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
infile "%sysfunc(pathname(work))/newfile.txt";
|
||||||
|
input;
|
||||||
|
putlog _infile_;
|
||||||
|
run;
|
||||||
|
|
||||||
|
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
|
||||||
|
@param [out] insert_cmplib= (NO) Choose YES to insert the package into the
|
||||||
|
CMPLIB reference.
|
||||||
|
@param [out] lib= (work) The output library in which to create the catalog.
|
||||||
|
@param [out] cat= (sasjs) The output catalog in which to create the package.
|
||||||
|
@param [out] pkg= (utils) The output package in which to create the function.
|
||||||
|
Uses a 3 part format: libref.catalog.package
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mcf_string2file(wrap=NO
|
||||||
|
,insert_cmplib=NO
|
||||||
|
,lib=WORK
|
||||||
|
,cat=SASJS
|
||||||
|
,pkg=UTILS
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
proc fcmp outcat=&lib..&cat..&pkg;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
function mcf_string2file(filepath $, string $, mode $);
|
||||||
|
if mode='APPEND' then fmode='a';
|
||||||
|
else fmode='o';
|
||||||
|
length fref $8;
|
||||||
|
rc=filename(fref,filepath);
|
||||||
|
if (rc ne 0) then return( -1 );
|
||||||
|
fid = fopen(fref,fmode);
|
||||||
|
if (fid = 0) then return( -1 );
|
||||||
|
rc=fput(fid, string);
|
||||||
|
rc=fwrite(fid);
|
||||||
|
rc=fclose(fid);
|
||||||
|
rc=filename(fref);
|
||||||
|
return(0);
|
||||||
|
endsub;
|
||||||
|
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
quit;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if &insert_cmplib=YES %then %do;
|
||||||
|
options insert=(CMPLIB=(&lib..&cat));
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mcf_string2file;
|
||||||
13
main.dox
13
main.dox
@@ -20,6 +20,19 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*! \dir fcmp
|
||||||
|
* \brief Macros for generating FCMP functions
|
||||||
|
* \details These macros have the following attributes:
|
||||||
|
|
||||||
|
* Macro name matches compiled function / subroutine name
|
||||||
|
* Prefixes: _mcf_, _mcs_
|
||||||
|
|
||||||
|
The macro part is just a wrapper for the underlying function / subroutine,
|
||||||
|
and has switches for including the proc fcmp / quit statements and whether
|
||||||
|
to insert the package into the CMPLIB option.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
/*! \dir meta
|
/*! \dir meta
|
||||||
* \brief Metadata Aware Macros
|
* \brief Metadata Aware Macros
|
||||||
* \details These macros have the following attributes:
|
* \details These macros have the following attributes:
|
||||||
|
|||||||
@@ -2,11 +2,13 @@
|
|||||||
"$schema": "https://cli.sasjs.io/sasjsconfig-schema.json",
|
"$schema": "https://cli.sasjs.io/sasjsconfig-schema.json",
|
||||||
"macroFolders": [
|
"macroFolders": [
|
||||||
"base",
|
"base",
|
||||||
|
"fcmp",
|
||||||
"meta",
|
"meta",
|
||||||
"metax",
|
"metax",
|
||||||
"viya",
|
"viya",
|
||||||
"lua",
|
"lua",
|
||||||
"tests/base"
|
"tests/base",
|
||||||
|
"tests/fcmp"
|
||||||
],
|
],
|
||||||
"docConfig": {
|
"docConfig": {
|
||||||
"displayMacroCore": false,
|
"displayMacroCore": false,
|
||||||
|
|||||||
52
tests/fcmp/mcf_string2file.test.sas
Normal file
52
tests/fcmp/mcf_string2file.test.sas
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mm_webout macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mcf_string2file.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
%mcf_string2file(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
rc=mcf_string2file(
|
||||||
|
"%sysfunc(pathname(work))/newfile.txt"
|
||||||
|
, "line1"
|
||||||
|
, "APPEND");
|
||||||
|
rc=mcf_string2file(
|
||||||
|
"%sysfunc(pathname(work))/newfile.txt"
|
||||||
|
, "line2"
|
||||||
|
, "APPEND");
|
||||||
|
run;
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
infile "%sysfunc(pathname(work))/newfile.txt";
|
||||||
|
input;
|
||||||
|
if _n_=2 then call symputx('val',_infile_);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&val)=%str(line2)),
|
||||||
|
desc=Check if APPEND works
|
||||||
|
)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
rc=mcf_string2file(
|
||||||
|
"%sysfunc(pathname(work))/newfile.txt"
|
||||||
|
, "creating"
|
||||||
|
, "CREATE");
|
||||||
|
run;
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
infile "%sysfunc(pathname(work))/newfile.txt";
|
||||||
|
input;
|
||||||
|
if _n_=1 then call symputx('val2',_infile_);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&val2)=%str(creating)),
|
||||||
|
desc=Check if CREATE works
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user