mirror of
https://github.com/yabwon/SAS_PACKAGES.git
synced 2026-03-10 01:38:19 +00:00
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:
@@ -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")
|
||||
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
/* 20260126 */
|
||||
BasePlus: F*91A5AD4709A418704315EF37DDCF954522D4FB42808D406B3ED4DA560F6864C6
|
||||
DFA: F*643FBE2B7AE1425FC0240139813B93AE2C6BCFFDF6A0CFAEBEC11F83D3548E57
|
||||
GSM: F*7A4FEC410DEB921613A33F154FBBE332D7EC4C4DAC1351A4E611D986489EE848
|
||||
macroArray: F*9DA64CA9A745E1DB7176F7AF4459BB014F61F71626473ABF6471A32689E14FF1
|
||||
SQLinDS: F*CEAA4C90515F6E8AACBFFD55ABA6544E399EDBE0A7081107B62DCEE6F5430A1D
|
||||
|
||||
/* 20260113 */
|
||||
macroArray: F*C6C2B5507B6590365222FC764076E294CCE3AAE99971D9CAA942F8BAEBEFAE24
|
||||
|
||||
|
||||
@@ -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.
352
packages/dfa.md
352
packages/dfa.md
@@ -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.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
BIN
packages/dfa.zip
BIN
packages/dfa.zip
Binary file not shown.
178
packages/gsm.md
178
packages/gsm.md
@@ -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.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
BIN
packages/gsm.zip
BIN
packages/gsm.zip
Binary file not shown.
@@ -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.
@@ -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.
Reference in New Issue
Block a user