From df04e486562661ef85854b5c715dc710c4000dd4 Mon Sep 17 00:00:00 2001 From: "Bart Jablonski (yabwon)" Date: Sun, 13 Mar 2022 20:43:14 +0100 Subject: [PATCH] The GSM package [ver. 0.19] The `GSM` package [ver. 0.19] - The code file parsing modified. - A `lineEnd=` parameter added. - The `trim=` parameter deprecated. - A warning about the `/*%` text changed into a note. - Documentation updated. hash: F63B8C602C1DB02F4107D9AF78182D87CD64AEA6521163067B7EB6D5C1B368AF --- README.md | 4 +- packages/README.md | 4 +- packages/SHA256_for_packages.txt | 3 ++ packages/gsm.md | 73 ++++++++++++++++++++++++------- packages/gsm.zip | Bin 16004 -> 16637 bytes 5 files changed, 64 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 90c42fd..730aa1f 100644 --- a/README.md +++ b/README.md @@ -168,12 +168,12 @@ SHA256 digest for BasePlus: A60A300E083628C65DD6899E7EF95588916F8F66B6A25B32B322 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") -- **GSM** (Generate Secure Macros)\[0.18\], package allows +- **GSM** (Generate Secure Macros)\[0.19\], 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: 8D730316043A6523A3AF2AA15D2820BB75A46E06307F2B8916D30AC102AEE31D +SHA256 digest for GSM: F63B8C602C1DB02F4107D9AF78182D87CD64AEA6521163067B7EB6D5C1B368AF [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") diff --git a/packages/README.md b/packages/README.md index 5fba128..8c2c0f0 100644 --- a/packages/README.md +++ b/packages/README.md @@ -114,12 +114,12 @@ SHA256 digest for BasePlus: A60A300E083628C65DD6899E7EF95588916F8F66B6A25B32B322 --- -- **GSM** (Generate Secure Macros)\[0.18\], package allows +- **GSM** (Generate Secure Macros)\[0.19\], 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: 8D730316043A6523A3AF2AA15D2820BB75A46E06307F2B8916D30AC102AEE31D +SHA256 digest for GSM: F63B8C602C1DB02F4107D9AF78182D87CD64AEA6521163067B7EB6D5C1B368AF [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index cce3f9a..2eb747c 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20220307 */ +GSM: F63B8C602C1DB02F4107D9AF78182D87CD64AEA6521163067B7EB6D5C1B368AF + /* 20220307 */ GSM: 8D730316043A6523A3AF2AA15D2820BB75A46E06307F2B8916D30AC102AEE31D diff --git a/packages/gsm.md b/packages/gsm.md index b10ced9..69b060f 100644 --- a/packages/gsm.md +++ b/packages/gsm.md @@ -8,7 +8,7 @@ --- -# The GSM package [ver. 0.18] ############################################### +# The GSM package [ver. 0.19] ############################################### The **GSM** (a.k.a. *Generate Secure Macros*) package allows to create secured macros stored in SAS Proc FCMP functions. @@ -54,8 +54,33 @@ Recording of presentation with "how it works" description, in Polish, is avaliab ``` - Share generated `ZIP` file (unzip and run the code). -*Limitations:* - Single macro file cannot be longer than 32760 bytes. +**Limitations:** + - Single macro file cannot be longer than 32760 bytes. + + - Multiline text variable. Consider the following code text file: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +%macro~test()/SECURE;~#@ +data~test;~#@ +a~=~"abc~#@ +~#@ +def";~#@ +put~a~hex20.;~#@ +run;~#@ +%mend~test;~#@ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +where `~` symbols the space character, +`#` symbols the carriage return (`0D`), +and `@` symbols the line feed (`0A`). +The code file is scanned and inserted into +the `resolve()` function argument in a "byte by byte" +fashion hence also the "end of line" characters are included. +As the result value of variable `a` will be: + +`a = "abc~#@~#@def"`. + +If you want to use the `GSM` package avoid +such "style" of coding in your macros. + --- @@ -69,7 +94,7 @@ Required SAS Components: * SAS package generated by generatePackage, version 20220113 * The SHA256 hash digest for package GSM: -`8D730316043A6523A3AF2AA15D2820BB75A46E06307F2B8916D30AC102AEE31D` +`F63B8C602C1DB02F4107D9AF78182D87CD64AEA6521163067B7EB6D5C1B368AF` ## >>> `%GSM()` macro: <<< ####################### @@ -92,7 +117,7 @@ be added to the macro definition. See the example: As a result a zip file, containing dataset with functions and -code to be executed on site, is generated. +code to be executed on site, is generated. Since encrypted code is stored in a SAS dataset it has no limitation in sharing between operating systems (like catalogs have). @@ -117,6 +142,7 @@ The basic syntax is the following, the `<...>` means optional parameters: <,outpath=> <,encodingRestricted=> <,secret=> + <,lineEnd=> ) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -125,10 +151,6 @@ The basic syntax is the following, the `<...>` means optional parameters: 1. `path` - *Required*, indicates a directory which contains files with macros. Only files with `sas` extension are used. -* `trim=` - *Optional*, the default value is `0`. - If set to `1` then lines of macro code are trimmed. - If set to `2` then lines of macro code are stripped. - * `cmplib=` - *Optional*, the default value is `work.generateMacros`. Names the dataset which will contain generated functions. @@ -151,8 +173,20 @@ The basic syntax is the following, the `<...>` means optional parameters: Required to execute the `resolve()` function. User who do not know the value will not be able to run the `_maxro_XX_()` function. ---- +* `lineEnd=` - *Optional*, the default value is `0D0A`, indicates which of: + line feed, carriage return, or both, or a space be inserted + at the end of line in the intermediate code file that is generated. + Value has to be hexadecimal code (_NOT_ null), + since the value is resolved as `"&lineEnd."x`, so use e.g. + `0A` for line feed, `0D` for carriage return, + `0D0A` for both, and `20` for space. + +* `trim=` - *Deprecated*, the default value is `0`. + *Kept for backward compatibility.* + + +--- ### Example: ################################################################### @@ -197,8 +231,7 @@ run; %GSM(&path., cmplib=work.myMacros) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -## >>> `%GSMpck_makeFCMPcode()` macro: <<< ####################### +## >>> `%GSMpck_makeFCMPcode()` macro: <<< ####################### The `%GSMpck_makeFCMPcode()` macro is an internal macro of the **GSM** (a.k.a. *Generate Secure Macros*) package. @@ -219,11 +252,11 @@ The basic syntax is the following, the `<...>` means optional parameters: %GSMpck_makeFCMPcode( path ,number - <,trim=0> <,outlib=work.generateMacros.secure> <,source2=> <,fileNameCode=FNC> <,secret=123456789> + <,lineEnd=0A> ) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -234,9 +267,6 @@ The basic syntax is the following, the `<...>` means optional parameters: 2. `number` - *Required*, a sequential number. -* `trim=` - *Optional*, the default value is `0`. - If set to `1` then lines of macro code are trimmed. - If set to `2` then lines of macro code are stripped. * `cmplib=` - *Optional*, the default value is `work.generateMacros`. Names the dataset which will contain generated functions. @@ -253,6 +283,17 @@ The basic syntax is the following, the `<...>` means optional parameters: function. User who do not know the value will not be able to run the `_maxro_XX_()` function. +* `lineEnd=` - *Optional*, the default value is `0D0A`, indicates which of: + line feed, carriage return, or both, or a space be inserted + at the end of line in the intermediate code file that is generated. + Value has to be hexadecimal code (_NOT_ null), + since the value is resolved as `"&lineEnd."x`, so use e.g. + `0A` for line feed, `0D` for carriage return, + `0D0A` for both, and `20` for space. + +* `trim=` - *Deprecated*, the default value is `0`. + *Kept for backward compatibility.* + --- diff --git a/packages/gsm.zip b/packages/gsm.zip index 18ab59c2fe3ad404ecfe867271214e47bb6a1f92..65a31b94baab7e52858b0776f8326ed2a5ce7196 100644 GIT binary patch delta 13591 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 delta 12832 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