SAS Packages Framework version 20260126

SAS Packages Framework version 20260126

Changes:
- A utility function and a utility macro is now added to every package generated with %generatePackage() macro.
- Documentation updated.

Packages regenerated:
- BasePlus: F*91A5AD4709A418704315EF37DDCF954522D4FB42808D406B3ED4DA560F6864C6
- DFA: F*643FBE2B7AE1425FC0240139813B93AE2C6BCFFDF6A0CFAEBEC11F83D3548E57
- GSM: F*7A4FEC410DEB921613A33F154FBBE332D7EC4C4DAC1351A4E611D986489EE848
- macroArray: F*9DA64CA9A745E1DB7176F7AF4459BB014F61F71626473ABF6471A32689E14FF1
- SQLinDS: F*CEAA4C90515F6E8AACBFFD55ABA6544E399EDBE0A7081107B62DCEE6F5430A1D
- bpUTiL: F*D03FD84D518F0CF4E0042BFEA864D9118D7FF97265DC49019425878BDBA31FE8
- evExpress: F*A8A4B0389A765D4D22FDD7AF42C542C2AC537F0D81FFB2B65605C60B1E9CB1B4
This commit is contained in:
Bart Jablonski
2026-01-26 17:21:32 +01:00
parent 3520e4b948
commit dcb012883f
36 changed files with 748 additions and 383 deletions

View File

@@ -10,7 +10,7 @@ Packages:
---
- **SQLinDS**\[2.3.1\], 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.
- **SQLinDS**\[2.3.2\], 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(
@@ -22,13 +22,13 @@ data class;
WH = weight + height;
run;
```
SHA256 digest for SQLinDS: F*606A24A2A6B06DAAD2D443FA9A9819D9564235A5CD8599FD15586F1EFFCB41BC
SHA256 digest for SQLinDS: F*CEAA4C90515F6E8AACBFFD55ABA6544E399EDBE0A7081107B62DCEE6F5430A1D
[Documentation for SQLinDS](https://github.com/SASPAC/blob/main/sqlinds.md "Documentation for SQLinDS")
---
- **DFA** (Dynamic Function Arrays)\[0.5.7\], 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)\[0.5.8\], 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.
```sas
%createDFArray(ArrDynamic, resizefactor=17);
@@ -55,13 +55,13 @@ data _null_;
end;
run;
```
SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045BEB958168
SHA256 digest for DFA: F*643FBE2B7AE1425FC0240139813B93AE2C6BCFFDF6A0CFAEBEC11F83D3548E57
[Documentation for DFA](https://github.com/SASPAC/blob/main/dfa.md "Documentation for DFA")
---
- **macroArray**\[1.3.0\], implementation of an array concept in a macro language, e.g.
- **macroArray**\[1.3.1\], implementation of an array concept in a macro language, e.g.
```sas
%array(ABC[17] (111:127), macarray=Y);
@@ -80,13 +80,13 @@ SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045
which = 1:H:2
);
```
SHA256 digest for macroArray: F*C6C2B5507B6590365222FC764076E294CCE3AAE99971D9CAA942F8BAEBEFAE24
SHA256 digest for macroArray: F*9DA64CA9A745E1DB7176F7AF4459BB014F61F71626473ABF6471A32689E14FF1
[Documentation for macroArray](https://github.com/SASPAC/blob/main/macroarray.md "Documentation for macroArray")
---
- **BasePlus**\[3.1.1\] adds a bunch of functionalities I am missing in BASE SAS, such as:
- **BasePlus**\[3.1.2\] adds a bunch of functionalities I am missing in BASE SAS, such as:
```sas
call arrMissToRight(myArray);
call arrFillMiss(17, myArray);
@@ -120,13 +120,13 @@ format x bool.;
%workLib(ABC)
```
SHA256 digest for BasePlus: F*6394CE27FBCF48D475F682CBCF8CA8B4FDD6D40D2672EF571F4A561BDDF274A6
SHA256 digest for BasePlus: F*91A5AD4709A418704315EF37DDCF954522D4FB42808D406B3ED4DA560F6864C6
[Documentation for BasePlus](https://github.com/SASPAC/blob/main/baseplus.md "Documentation for BasePlus")
---
- **GSM** (Generate Secure Macros)\[0.22.1\], package allows
- **GSM** (Generate Secure Macros)\[0.22.2\], 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.
@@ -135,7 +135,7 @@ SHA256 digest for BasePlus: F*6394CE27FBCF48D475F682CBCF8CA8B4FDD6D40D2672EF571F
[The WUSS 2023 Conference article describing the idea](https://www.wuss.org/proceedings/2023/WUSS-2023-Paper-189.pdf "Article about the idea GSM")
SHA256 digest for GSM: F*80197391195C3EC41BD436DF0C8802D3920E4D22B64009A7DE872FBDF8D4B86E
SHA256 digest for GSM: F*7A4FEC410DEB921613A33F154FBBE332D7EC4C4DAC1351A4E611D986489EE848
[Documentation for GSM](https://github.com/SASPAC/blob/main/gsm.md "Documentation for GSM")

View File

@@ -1,3 +1,10 @@
/* 20260126 */
BasePlus: F*91A5AD4709A418704315EF37DDCF954522D4FB42808D406B3ED4DA560F6864C6
DFA: F*643FBE2B7AE1425FC0240139813B93AE2C6BCFFDF6A0CFAEBEC11F83D3548E57
GSM: F*7A4FEC410DEB921613A33F154FBBE332D7EC4C4DAC1351A4E611D986489EE848
macroArray: F*9DA64CA9A745E1DB7176F7AF4459BB014F61F71626473ABF6471A32689E14FF1
SQLinDS: F*CEAA4C90515F6E8AACBFFD55ABA6544E399EDBE0A7081107B62DCEE6F5430A1D
/* 20260113 */
macroArray: F*C6C2B5507B6590365222FC764076E294CCE3AAE99971D9CAA942F8BAEBEFAE24

View File

@@ -9,22 +9,22 @@
### Version information:
- Package: BasePlus
- Version: 3.1.1
- Generated: 2025-11-05T15:10:31
- Version: 3.1.2
- Generated: 2026-01-26T15:57:25
- Author(s): Bartosz Jablonski (yabwon@gmail.com), contributors are Quentin McMullen (qmcmullen@gmail.com) and Ryo Nakaya (nakaya.ryou@gmail.com)
- Maintainer(s): Bartosz Jablonski (yabwon@gmail.com)
- License: MIT
- File SHA256: `F*6394CE27FBCF48D475F682CBCF8CA8B4FDD6D40D2672EF571F4A561BDDF274A6` for this version
- Content SHA256: `C*3CA28DF8F3E6D6670D7FD44788D347452F24F4BCF18115873E7EBC742FE30CA4` for this version
- File SHA256: `F*91A5AD4709A418704315EF37DDCF954522D4FB42808D406B3ED4DA560F6864C6` for this version
- Content SHA256: `C*BB61DE3ECA8293AD1CFCE9A6BF5E175B7CFDB75DF063D6070783B75F7B97CE61` for this version
---
# The `BasePlus` package, version: `3.1.1`;
# The `BasePlus` package, version: `3.1.2`;
---
# The BasePlus package [ver. 3.1.1] <a name="baseplus-package"></a> ###############################################
# The BasePlus package [ver. 3.1.2] <a name="baseplus-package"></a> ###############################################
The **BasePlus** package implements useful
functions and functionalities I miss in the BASE SAS.
@@ -407,11 +407,13 @@ Package contains additional content, run: `%loadPackageAddCnt(BasePlus)` to lo
or look for the `baseplus_AdditionalContent` directory in the `packages` fileref
localization (only if additional content was deployed during the installation process).
--------------------------------------------------------------------
---------------------------------------------------------------------
*SAS package generated by SAS Package Framework, version `20251017`*
*SAS package generated by SAS Package Framework, version `20260125`,*
*under `WIN`(`X64_10PRO`) operating system,*
*using SAS release: `9.04.01M9P06042025`.*
--------------------------------------------------------------------
---------------------------------------------------------------------
# The `BasePlus` package content
The `BasePlus` package consists of the following content:
@@ -7738,7 +7740,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
# License <a name="license"></a> ######
Copyright (c) 2020 - 2025 Bartosz Jablonski
Copyright (c) 2020 - 2026 Bartosz Jablonski
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

Binary file not shown.

View File

@@ -1,24 +1,30 @@
- [The DFA package](#dfa-package)
- [Content description](#content-description)
* [`%createDFArray()` macro](#createdfarray-macro)
* [`%createDHArray()` macro](#createdharray-macro)
* [`%createDHFifo()` macro](#createdhfifo-macro)
* [`%createDHOrdStack()` macro](#createdhordstack-macro)
* [`%createDHPrtQueue()` macro](#createdhprtqueue-macro)
* [`%createDHStack()` macro](#createdhstack-macro)
* [`bit64orPROTOdfa()` proto function](#bit64orprotodfa-proto-function)
* [`bit64andPROTOdfa()` proto function](#bit64andprotodfa-proto-function)
* [`bit64orDFA()` subroutine](#bit64ordfa-function)
* [`bit64andDFA()` subroutine](#bit64anddfa-function)
* [`%createDFBitmap()` macro](#createdfbitmap-macro)
* [`generateArrays` exec](#createdhprtqueue-exec)
* [`generateArrays` clean](#createdhprtqueue-clean)
# Documentation for the `DFA` package.
----------------------------------------------------------------
*Dynamic function arrays and other useful data structures*
----------------------------------------------------------------
### Version information:
- Package: DFA
- Version: 0.5.8
- Generated: 2026-01-26T15:19:02
- Author(s): Bartosz Jablonski (yabwon@gmail.com)
- Maintainer(s): Bartosz Jablonski (yabwon@gmail.com)
- License: MIT
- File SHA256: `F*643FBE2B7AE1425FC0240139813B93AE2C6BCFFDF6A0CFAEBEC11F83D3548E57` for this version
- Content SHA256: `C*E2E883D8F8A7F7FCB97C2B7240FD5E70A8A6F2A6B3F0F75119F47886338C6B0C` for this version
* [License](#license)
---
# The `DFA` package, version: `0.5.8`;
---
# The DFA package [ver. 0.5.7] <a name="dfa-package"></a> ###############################################
# The DFA package [ver. 0.5.8] <a name="dfa-package"></a> ###############################################
The **DFA** (a.k.a. *Dynamic Function Array*) package implements:
- dynamic numeric and character arrays,
@@ -36,30 +42,50 @@ Few exemplary functions are also generated.
See particular macro help for further details.
---
Package contains:
1. macro createdfarray
2. macro createdharray
3. macro createdhfifo
4. macro createdhordstack
5. macro createdhprtqueue
6. macro createdhstack
7. proto bit64andprotodfa
8. proto bit64orprotodfa
9. functions bit64anddfa
10. functions bit64ordfa
11. macro createdfbitmap
12. exec generatearrays
13. clean generatearrays
*SAS package generated by generatePackage, version 20231111*
The SHA256 hash digest for package DFA:
`F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045BEB958168`
---
# Content description ############################################################################################
---
Required SAS Components:
- Base SAS Software
---
---------------------------------------------------------------------
*SAS package generated by SAS Package Framework, version `20260125`,*
*under `WIN`(`X64_10PRO`) operating system,*
*using SAS release: `9.04.01M9P06042025`.*
---------------------------------------------------------------------
# The `DFA` package content
The `DFA` package consists of the following content:
1. [`%createdfarray()` macro ](#createdfarray-macro-1 )
2. [`%createdharray()` macro ](#createdharray-macro-2 )
3. [`%createdhfifo()` macro ](#createdhfifo-macro-3 )
4. [`%createdhordstack()` macro ](#createdhordstack-macro-4 )
5. [`%createdhprtqueue()` macro ](#createdhprtqueue-macro-5 )
6. [`%createdhstack()` macro ](#createdhstack-macro-6 )
7. [`bit64andprotodfa()` proto ](#bit64andprotodfa-proto-7 )
8. [`bit64orprotodfa()` proto ](#bit64orprotodfa-proto-8 )
9. [`bit64anddfa()` function ](#bit64anddfa-functions-9 )
10. [`bit64ordfa()` function ](#bit64ordfa-functions-10 )
11. [`%createdfbitmap()` macro ](#createdfbitmap-macro-11 )
12. [`generatearrays` exec ](#generatearrays-exec-12 )
13. [`generatearrays` clean ](#generatearrays-clean-13 )
14. [License note](#license)
---
## `%createdfarray()` macro <a name="createdfarray-macro-1"></a> ######
## >>> `%createDFArray()` macro: <<< <a name="createdfarray-macro"></a> #######################
The `%createDFArray()` macro allows to generate
@@ -122,7 +148,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `header=` - *Optional*, the default value is `1`. Indicates if
the `proc fcmp outlib = &outlib.;` header is added to
the executed code. If not 1 then no header is added.
**Created function arguments description**:
A function generated by the macro is:
@@ -172,6 +198,7 @@ and accepts the following list of arguments and values:
The `position` and the `value` arguments are **outargs**, i.e. can be changed by the function.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Dynamic, Searchable, and Immutable array:
@@ -309,6 +336,12 @@ The `position` and the `value` arguments are **outargs**, i.e. can be changed by
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
---
## `%createdharray()` macro <a name="createdharray-macro-2"></a> ######
## >>> `%createDHArray()` macro: <<< <a name="createdharray-macro"></a> #######################
The `%createDHArray()` macro allows to generate
@@ -360,7 +393,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `header=` - *Optional*, the default value is `1`. Indicates if
the `proc fcmp outlib = &outlib.;` header is added to
the executed code. If not 1 then no header is added.
**Created function arguments description**:
A function generated by the macro is:
@@ -397,6 +430,7 @@ and accepts the following list of arguments and values:
The `position` and the `value` arguments are **outargs**, i.e. can be changed by the function.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Dynamic, Hash-based, and Character array:
@@ -464,6 +498,12 @@ The `position` and the `value` arguments are **outargs**, i.e. can be changed by
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
---
## `%createdhfifo()` macro <a name="createdhfifo-macro-3"></a> ######
## >>> `%createDHFifo()` macro: <<< <a name="createdhfifo-macro"></a> #######################
The `%createDHFifo()` macro allows to generate
@@ -519,7 +559,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `header=` - *Optional*, the default value is `1`. Indicates if
the `proc fcmp outlib = &outlib.;` header is added to
the executed code. If not 1 then no header is added.
**Created function arguments description**:
A function generated by the macro is:
@@ -550,7 +590,7 @@ and accepts the following list of arguments and values:
The `value` argument is **outarg**, i.e. can be changed by the function.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Dynamic, Hash-based, and Character fifo:
@@ -639,6 +679,12 @@ The `value` argument is **outarg**, i.e. can be changed by the function.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
---
## `%createdhordstack()` macro <a name="createdhordstack-macro-4"></a> ######
## >>> `%createDHOrdStack()` macro: <<< <a name="createdhordstack-macro"></a> #######################
The `%createDHOrdStack()` macro allows to generate
@@ -699,7 +745,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `header=` - *Optional*, the default value is `1`. Indicates if
the `proc fcmp outlib = &outlib.;` header is added to
the executed code. If not 1 then no header is added.
**Created function arguments description**:
A function generated by the macro is:
@@ -732,7 +778,7 @@ and accepts the following list of arguments and values:
The `value` argument is **outarg**, i.e. can be changed by the function.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Dynamic, Hash-based, and Character Descending Ordered stack:
@@ -804,6 +850,12 @@ The `value` argument is **outarg**, i.e. can be changed by the function.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
---
## `%createdhprtqueue()` macro <a name="createdhprtqueue-macro-5"></a> ######
## >>> `%createDHPrtQueue()` macro: <<< <a name="createdhprtqueue-macro"></a> #######################
@@ -860,7 +912,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `header=` - *Optional*, the default value is `1`. Indicates if
the `proc fcmp outlib = &outlib.;` header is added to
the executed code. If not 1 then no header is added.
**Created function arguments description**:
A function generated by the macro is:
@@ -901,7 +953,7 @@ and accepts the following list of arguments and values:
The `position` and the `value` arguments are **outargs**, i.e. can be changed by the function.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Dynamic, Hash-based, and Character Priority queue:
@@ -965,6 +1017,12 @@ The `position` and the `value` arguments are **outargs**, i.e. can be changed by
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
---
## `%createdhstack()` macro <a name="createdhstack-macro-6"></a> ######
## >>> `%createDHStack()` macro: <<< <a name="createdhstack-macro"></a> #######################
The `%createDHStack()` macro allows to generate
@@ -1020,7 +1078,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `header=` - *Optional*, the default value is `1`. Indicates if
the `proc fcmp outlib = &outlib.;` header is added to
the executed code. If not 1 then no header is added.
**Created function arguments description**:
A function generated by the macro is:
@@ -1050,7 +1108,7 @@ and accepts the following list of arguments and values:
The `value` argument is **outarg**, i.e. can be changed by the function.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Dynamic, Hash-based, and Character stack:
@@ -1128,31 +1186,11 @@ The `value` argument is **outarg**, i.e. can be changed by the function.
---
## >>> `bit64orPROTOdfa()` proto function: <<< <a name="bit64orprotodfa-proto-function"></a> #######################
The **bit64orPROTOdfa()** is external *C* function,
this is the implementation of the *bitwise OR* operation
on doubles. A double is returned.
**Caution!** For SAS numeric values *only* operations on first 53 bits are valid!
The function is used **internally** by functions in the *DFA* package.
### SYNTAX: ###################################################################
The basic syntax is the following:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
bit64orPROTOdfa(i, j)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Arguments description**:
1. `i` - A double numeric argument.
2. `j` - A double numeric argument.
---
## `bit64andprotodfa()` proto <a name="bit64andprotodfa-proto-7"></a> ######
## >>> `bit64andPROTOdfa()` proto function: <<< <a name="bit64andprotodfa-proto-function"></a> #######################
The **bit64andPROTOdfa()** is external *C* function,
@@ -1178,62 +1216,41 @@ bit64andPROTOdfa(i, j)
---
## >>> `bit64orDFA()` subroutine: <<< <a name="bit64ordfa-function"></a> #######################
---
## `bit64orprotodfa()` proto <a name="bit64orprotodfa-proto-8"></a> ######
## >>> `bit64orPROTOdfa()` proto function: <<< <a name="bit64orprotodfa-proto-function"></a> #######################
The **bit64orDFA()** function is an alternative to
the 32 bit bitwise `BOR()` function working on SAS numerics.
Allows to work on *up to* 53 bits of SAS numeric value.
The **bit64orPROTOdfa()** is external *C* function,
this is the implementation of the *bitwise OR* operation
on doubles. A double is returned.
The `bit64orDFA()` is an *internal* function of the `DFA` package.
**Caution!** For SAS numeric values *only* operations on first 53 bits are valid!
The function is used **internally** by functions in the *DFA* package.
### SYNTAX: ###################################################################
The basic syntax is the following, the `<...>` means optional parameters:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
bit64orDFA(a, b)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The basic syntax is the following:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
bit64orPROTOdfa(i, j)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Arguments description**:
1. `a` - Argument is a SAS numeric values.
1. `i` - A double numeric argument.
2. `B` - Argument is a SAS numeric values.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Basic test of `bit64orDFA()` and `bit64andDFA()`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
options ls = max ps = max;
%let M = 53 ; %* 53 is maximum valid value;
data _null_;
array bitmask [ 0: &M] _temporary_ ;
do P = 1 to &M ;
bitmask[P] = 2**(P-1) ;
put bitmask[P] = binary54. @;
put bitmask[P] = best32.;
end ;
bitmask[0] = bitmask[&M.] ;
put bitmask[0] = best32. /;
a=0;
put a = binary54.;
do P = 1 to &M ;
a = BIT64ORDFA (a, bitmask[P]) ;
put a = binary54.;
end;
put;
b = 0;
put b = binary54./;
do P = 1 to &M ;
b + (BIT64ANDDFA (a, bitmask[P]) ne .) ;
put b = best32.;
end;
run;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2. `j` - A double numeric argument.
---
---
## `bit64anddfa()` function <a name="bit64anddfa-functions-9"></a> ######
## >>> `bit64andDFA()` subroutine: <<< <a name="bit64anddfa-function"></a> #######################
The **bit64andDFA()** function is an alternative to
@@ -1255,6 +1272,7 @@ bit64andDFA(a, b)
2. `B` - Argument is a SAS numeric values.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Basic test of `bit64orDFA()` and `bit64andDFA()`
@@ -1290,6 +1308,73 @@ bit64andDFA(a, b)
---
---
## `bit64ordfa()` function <a name="bit64ordfa-functions-10"></a> ######
## >>> `bit64orDFA()` subroutine: <<< <a name="bit64ordfa-function"></a> #######################
The **bit64orDFA()** function is an alternative to
the 32 bit bitwise `BOR()` function working on SAS numerics.
Allows to work on *up to* 53 bits of SAS numeric value.
The `bit64orDFA()` is an *internal* function of the `DFA` package.
### SYNTAX: ###################################################################
The basic syntax is the following, the `<...>` means optional parameters:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
bit64orDFA(a, b)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Arguments description**:
1. `a` - Argument is a SAS numeric values.
2. `B` - Argument is a SAS numeric values.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Basic test of `bit64orDFA()` and `bit64andDFA()`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
options ls = max ps = max;
%let M = 53 ; %* 53 is maximum valid value;
data _null_;
array bitmask [ 0: &M] _temporary_ ;
do P = 1 to &M ;
bitmask[P] = 2**(P-1) ;
put bitmask[P] = binary54. @;
put bitmask[P] = best32.;
end ;
bitmask[0] = bitmask[&M.] ;
put bitmask[0] = best32. /;
a=0;
put a = binary54.;
do P = 1 to &M ;
a = BIT64ORDFA (a, bitmask[P]) ;
put a = binary54.;
end;
put;
b = 0;
put b = binary54./;
do P = 1 to &M ;
b + (BIT64ANDDFA (a, bitmask[P]) ne .) ;
put b = best32.;
end;
run;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
---
## `%createdfbitmap()` macro <a name="createdfbitmap-macro-11"></a> ######
## >>> `%createDFBitmap()` macro: <<< <a name="createdfbitmap-macro"></a> #######################
The `%createDFBitmap()` macro allows to generate
@@ -1346,7 +1431,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `header=` - *Optional*, the default value is `1`. Indicates if
the `proc fcmp outlib = &outlib.;` header is added to
the executed code. If not 1 then no header is added.
**Created function arguments description**:
A function generated by the macro is:
@@ -1382,6 +1467,7 @@ and accepts the following list of arguments and values:
The `position` and the `value` arguments are **outargs**, i.e. can be changed by the function.
### EXAMPLES AND USECASES: ####################################################
**EXAMPLE 1.** Bitmap of type 32:
@@ -1534,6 +1620,11 @@ NOTE: DATA statement used (Total process time):
---
---
## `generatearrays` exec <a name="generatearrays-exec-12"></a> ######
## >>> `generateArrays` exec: <<< <a name="createdhprtqueue-exec"></a> #######################
The generateArrays exec file provides a **list of automatically generated examples** of functions
@@ -1563,6 +1654,12 @@ The list of provided examples is the following:
The `outlib=` option is set to `work.DFAfcmp.package`. The `cmplib=` option is updated automatically.
---
---
## `generatearrays` clean <a name="generatearrays-clean-13"></a> ######
## >>> `generateArrays` clean: <<< <a name="createdhprtqueue-clean"></a> #######################
The generateArrays clean file clears the list of automatically generated examples of functions
@@ -1572,9 +1669,15 @@ The `cmplib=` option is updated automatically.
---
## License ####################################################################
Copyright (c) 2019 Bartosz Jablonski
---
---
# License <a name="license"></a> ######
Copyright (c) 2019 - 2026 Bartosz Jablonski
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -1593,5 +1696,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---

Binary file not shown.

View File

@@ -1,20 +1,40 @@
- [The GSM package](#gsm-package)
- [Content description](#content-description)
* [`%GSM()` macro](#gsm-macro)
* [`%GSMpck_makeFCMPcode()` macro](#gsmpck-makefcmpcode-macro)
* [License](#license)
# Documentation for the `GSM` package.
----------------------------------------------------------------
*Generate Secure Macros - to keep your code secret*
----------------------------------------------------------------
### Version information:
- Package: GSM
- Version: 0.22.2
- Generated: 2026-01-26T16:44:38
- Author(s): Bartosz Jablonski (yabwon@gmail.com)
- Maintainer(s): Bartosz Jablonski (yabwon@gmail.com)
- License: MIT
- File SHA256: `F*7A4FEC410DEB921613A33F154FBBE332D7EC4C4DAC1351A4E611D986489EE848` for this version
- Content SHA256: `C*99444DE5A473D3F92374ACE917E29E77C1F94BF77E06436695B06B85705606C7` for this version
---
# The `GSM` package, version: `0.22.2`;
---
# The GSM package [ver. 0.22.1] <a name="gsm-package"></a> ###############################################
# The GSM package [ver. 0.22.2] <a name="gsm-package"></a> ###############################################
The **GSM** (a.k.a. *Generate Secure Macros*) package allows
to create secured macros stored in SAS Proc FCMP functions.
The dataset with functions can be shared and allows to generate
macros without showing their code.
[Recording of presentation with "how it works" description (in Polish)](https://www.youtube.com/watch?v=LtaWPe2sgRY&t=1s "YouTube").
[The WUSS 2023 Conference article describing the idea](https://www.wuss.org/wuss-2023-conference-proceedings/ "Article about the idea GSM")
The GSM package is basically an automated version of the following:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
proc fcmp outlib = work.gsm.secure ENCRYPT;
@@ -42,10 +62,6 @@ run;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
See examples for more details.
[Recording of presentation with "how it works" description (in Polish)](https://www.youtube.com/watch?v=LtaWPe2sgRY&t=1s "YouTube").
[The WUSS 2023 Conference article describing the idea](https://www.lexjansen.com/wuss/2023/WUSS-2023-Paper-189.pdf "Article about the idea GSM")
*How to use it:*
- Copy all files with your secured macros code into a directory.
@@ -56,53 +72,74 @@ See examples for more details.
%GSM(<the path to directory>, cmplib=<name of the dataset>)
```
- Share generated `ZIP` file (unzip and run the code).
**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:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%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.
`a = "abc~#@~#@def"`.
If you want to use the `GSM` package avoid
such "style" of coding in your macros.
---
Package contains:
1. macro gsm
2. macro gsmpck_makefcmpcode
---
---
Required SAS Components:
`Base SAS Software`
Package contains additional content, run: %loadPackageAddCnt(GSM) to load it
or look for the gsm_AdditionalContent directory in the Packages fileref
- Base SAS Software
---
---
Package contains additional content, run: `%loadPackageAddCnt(GSM)` to load it
or look for the `gsm_AdditionalContent` directory in the `packages` fileref
localization (only if additional content was deployed during the installation process).
*SAS package generated by generatePackage, version 20231111*
The SHA256 hash digest for package GSM:
`F*80197391195C3EC41BD436DF0C8802D3920E4D22B64009A7DE872FBDF8D4B86E`
---------------------------------------------------------------------
*SAS package generated by SAS Package Framework, version `20260126`,*
*under `WIN`(`X64_10PRO`) operating system,*
*using SAS release: `9.04.01M9P06042025`.*
---------------------------------------------------------------------
# The `GSM` package content
The `GSM` package consists of the following content:
1. [`%gsm()` macro ](#gsm-macro-1 )
2. [`%gsmpck_makefcmpcode()` macro ](#gsmpckmakefcmpcode-macro-2 )
3. [License note](#license)
---
## `%gsm()` macro <a name="gsm-macro-1"></a> ######
## >>> `%GSM()` macro: <<< <a name="gsm-macro"></a> #######################
@@ -111,20 +148,22 @@ the **GSM** (a.k.a. *Generate Secure Macros*) package.
It converts a list of macros provided by the user into
a data set of the Proc FCMP functions. The macros are stored
in functions are encrypted which allow to share them without
showing their code. *Important* thing is that macros provided
by the user *has* to be "secure", i.e. the `secure` option has to
be added to the macro definition. See the example:
as encrypted code which allow to share the macros
without showing their code.
*Important* thing is that macros provided by the user *has* to
be "secure", i.e. the `secure` option has to be added to the
macro definition and th emacro code has to be written properly.
See the example:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
%macro secretMacro(x) / SECURE; /* <- the secure option */
<... some code ...>
%macro secretMacro(x) / SECURE; %* <- the secure option *;
<... secure code ...>
%mend secretMacro;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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).
@@ -199,9 +238,11 @@ The basic syntax is the following, the `<...>` means optional parameters:
* `trim=` - *Deprecated*, the default value is `0`.
*Kept for backward compatibility.*
---
### Example: ###################################################################
Example 1. Prepare 2 files: `f1.sas` and `f2.sas` and use the `%GSM()` macro.
@@ -245,6 +286,11 @@ run;
%GSM(&path., cmplib=work.myMacros)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
## `%gsmpck_makefcmpcode()` macro <a name="gsmpckmakefcmpcode-macro-2"></a> ######
## >>> `%GSMpck_makeFCMPcode()` macro: <<< <a name="GSMpck-makeFCMPcode-macro"></a> #######################
The `%GSMpck_makeFCMPcode()` macro is an internal macro of
@@ -310,10 +356,15 @@ The basic syntax is the following, the `<...>` means optional parameters:
---
## License ####################################################################
Copyright (c) Bartosz Jablonski, since 2021
---
---
# License <a name="license"></a> ######
Copyright (c) Bartosz Jablonski, since 2021 onward
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -332,5 +383,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---

Binary file not shown.

View File

@@ -9,17 +9,17 @@
### Version information:
- Package: macroArray
- Version: 1.3.0
- Generated: 2026-01-13T15:30:15
- Version: 1.3.1
- Generated: 2026-01-26T15:33:03
- Author(s): Bartosz Jablonski (yabwon@gmail.com)
- Maintainer(s): Bartosz Jablonski (yabwon@gmail.com)
- License: MIT
- File SHA256: `F*C6C2B5507B6590365222FC764076E294CCE3AAE99971D9CAA942F8BAEBEFAE24` for this version
- Content SHA256: `C*9119F3A4C7C4D859C7FB03373AB4FE6551CD7BDFA42BA9B4303D36C367BC8855` for this version
- File SHA256: `F*9DA64CA9A745E1DB7176F7AF4459BB014F61F71626473ABF6471A32689E14FF1` for this version
- Content SHA256: `C*15A52658C8CBF9AB36AB1CA847FA628CCC6E9C67F625FFD3A959EB191445F780` for this version
---
# The `macroArray` package, version: `1.3.0`;
# The `macroArray` package, version: `1.3.1`;
---
@@ -75,7 +75,7 @@ Required SAS Components:
---------------------------------------------------------------------
*SAS package generated by SAS Package Framework, version `20251231`,*
*SAS package generated by SAS Package Framework, version `20260126`,*
*under `WIN`(`X64_10PRO`) operating system,*
*using SAS release: `9.04.01M9P06042025`.*

Binary file not shown.

View File

@@ -9,22 +9,22 @@
### Version information:
- Package: SQLinDS
- Version: 2.3.1
- Generated: 2025-11-22T12:47:32
- Version: 2.3.2
- Generated: 2026-01-26T15:36:16
- Author(s): Mike Rhoads (RhoadsM1@Westat.com), contributor Bartosz Jablonski
- Maintainer(s): Bartosz Jablonski (yabwon@gmail.com)
- License: MIT
- File SHA256: `F*606A24A2A6B06DAAD2D443FA9A9819D9564235A5CD8599FD15586F1EFFCB41BC` for this version
- Content SHA256: `C*4CCCF31DA9D94E0EE2DA612724D395056B7BA07CB593C93947835BB8319B33EB` for this version
- File SHA256: `F*CEAA4C90515F6E8AACBFFD55ABA6544E399EDBE0A7081107B62DCEE6F5430A1D` for this version
- Content SHA256: `C*BD9C8A88831541082BEFC07954D5CDB4A6827D1A7902B911221AC6FE712A087E` for this version
---
# The `SQLinDS` package, version: `2.3.1`;
# The `SQLinDS` package, version: `2.3.2`;
---
### The SQLinDS package [ver. 2.3.1]
### The SQLinDS package [ver. 2.3.2]
The **SQLinDS** package is an implementation of
the *macro-function-sandwich* concept introduced in the
@@ -77,7 +77,7 @@ localization (only if additional content was deployed during the installation pr
---------------------------------------------------------------------
*SAS package generated by SAS Package Framework, version `20251122`,*
*SAS package generated by SAS Package Framework, version `20260126`,*
*under `WIN`(`X64_10PRO`) operating system,*
*using SAS release: `9.04.01M9P06042025`.*

Binary file not shown.