diff --git a/all.sas b/all.sas index 4b9e42a..f3bb790 100644 --- a/all.sas +++ b/all.sas @@ -3470,8 +3470,8 @@ run; @details Reads in a file byte by byte and writes it back out. Is an os-independent method to copy files. In case of naming collision, the default filerefs can be modified. - Based on: - https://stackoverflow.com/questions/13046116/using-sas-to-copy-a-text-file + Note that if you have a new enough version of SAS, and you don't need features + such as APPEND, you may be better of using the fcopy() function instead. %mp_binarycopy(inloc="/home/me/blah.txt", outref=_webout) @@ -3511,14 +3511,9 @@ run; ,outref=____out /* override default to use own filerefs */ ,mode=CREATE )/*/STORE SOURCE*/; - %local mod outmode; - %if &mode=APPEND %then %do; - %let mod=mod; - %let outmode='a'; - %end; - %else %do; - %let outmode='o'; - %end; + %local mod; + %if &mode=APPEND %then %let mod=mod; + /* these IN and OUT filerefs can point to anything */ %if &inref = ____in %then %do; filename &inref &inloc lrecl=1048576 ; @@ -3529,8 +3524,8 @@ run; /* copy the file byte-for-byte */ data _null_; - infile &inref; - file &outref; + infile &inref lrecl=1 recfm=n; + file &outref &mod recfm=n; input sourcechar $char1. @@; format sourcechar hex2.; put sourcechar char1. @@; @@ -3542,7 +3537,8 @@ run; %if &outref=____out %then %do; filename &outref clear; %end; -%mend mp_binarycopy;/** +%mend mp_binarycopy; +/** @file @brief Splits a file of ANY SIZE by reference to a search string. @details Provide a fileref and a search string to chop off part of a file. @@ -8812,10 +8808,10 @@ options "&&name&i"n /* name literal for reserved variable names */ %end; %if &action=ARR %then "]" ; %else "}" ; ; - /* now write the long strings to _webout 1 byte at a time */ + /* now write the long strings to _webout 1 char at a time */ data _null_; - infile _sjs; - file &jref mod; + infile _sjs lrecl=1 recfm=n; + file &jref mod lrecl=1 recfm=n; input sourcechar $char1. @@; format sourcechar hex2.; put sourcechar char1. @@; @@ -15189,10 +15185,10 @@ data _null_; put ' "&&name&i"n /* name literal for reserved variable names */ '; put ' %end; '; put ' %if &action=ARR %then "]" ; %else "}" ; ; '; - put ' /* now write the long strings to _webout 1 byte at a time */ '; + put ' /* now write the long strings to _webout 1 char at a time */ '; put ' data _null_; '; - put ' infile _sjs; '; - put ' file &jref mod; '; + put ' infile _sjs lrecl=1 recfm=n; '; + put ' file &jref mod lrecl=1 recfm=n; '; put ' input sourcechar $char1. @@; '; put ' format sourcechar hex2.; '; put ' put sourcechar char1. @@; '; @@ -19922,10 +19918,10 @@ data _null_; put ' "&&name&i"n /* name literal for reserved variable names */ '; put ' %end; '; put ' %if &action=ARR %then "]" ; %else "}" ; ; '; - put ' /* now write the long strings to _webout 1 byte at a time */ '; + put ' /* now write the long strings to _webout 1 char at a time */ '; put ' data _null_; '; - put ' infile _sjs; '; - put ' file &jref mod; '; + put ' infile _sjs lrecl=1 recfm=n; '; + put ' file &jref mod lrecl=1 recfm=n; '; put ' input sourcechar $char1. @@; '; put ' format sourcechar hex2.; '; put ' put sourcechar char1. @@; '; @@ -22263,10 +22259,10 @@ data _null_; put ' "&&name&i"n /* name literal for reserved variable names */ '; put ' %end; '; put ' %if &action=ARR %then "]" ; %else "}" ; ; '; - put ' /* now write the long strings to _webout 1 byte at a time */ '; + put ' /* now write the long strings to _webout 1 char at a time */ '; put ' data _null_; '; - put ' infile _sjs; '; - put ' file &jref mod; '; + put ' infile _sjs lrecl=1 recfm=n; '; + put ' file &jref mod lrecl=1 recfm=n; '; put ' input sourcechar $char1. @@; '; put ' format sourcechar hex2.; '; put ' put sourcechar char1. @@; '; diff --git a/base/mp_binarycopy.sas b/base/mp_binarycopy.sas index 57377d8..b6b3d04 100755 --- a/base/mp_binarycopy.sas +++ b/base/mp_binarycopy.sas @@ -4,8 +4,8 @@ @details Reads in a file byte by byte and writes it back out. Is an os-independent method to copy files. In case of naming collision, the default filerefs can be modified. - Based on: - https://stackoverflow.com/questions/13046116/using-sas-to-copy-a-text-file + Note that if you have a new enough version of SAS, and you don't need features + such as APPEND, you may be better of using the fcopy() function instead. %mp_binarycopy(inloc="/home/me/blah.txt", outref=_webout) @@ -45,14 +45,9 @@ ,outref=____out /* override default to use own filerefs */ ,mode=CREATE )/*/STORE SOURCE*/; - %local mod outmode; - %if &mode=APPEND %then %do; - %let mod=mod; - %let outmode='a'; - %end; - %else %do; - %let outmode='o'; - %end; + %local mod; + %if &mode=APPEND %then %let mod=mod; + /* these IN and OUT filerefs can point to anything */ %if &inref = ____in %then %do; filename &inref &inloc lrecl=1048576 ; @@ -63,8 +58,8 @@ /* copy the file byte-for-byte */ data _null_; - infile &inref; - file &outref; + infile &inref lrecl=1 recfm=n; + file &outref &mod recfm=n; input sourcechar $char1. @@; format sourcechar hex2.; put sourcechar char1. @@; @@ -76,4 +71,4 @@ %if &outref=____out %then %do; filename &outref clear; %end; -%mend mp_binarycopy; \ No newline at end of file +%mend mp_binarycopy; diff --git a/base/mp_jsonout.sas b/base/mp_jsonout.sas index 4caee28..924f333 100644 --- a/base/mp_jsonout.sas +++ b/base/mp_jsonout.sas @@ -234,10 +234,10 @@ "&&name&i"n /* name literal for reserved variable names */ %end; %if &action=ARR %then "]" ; %else "}" ; ; - /* now write the long strings to _webout 1 byte at a time */ + /* now write the long strings to _webout 1 char at a time */ data _null_; - infile _sjs; - file &jref mod; + infile _sjs lrecl=1 recfm=n; + file &jref mod lrecl=1 recfm=n; input sourcechar $char1. @@; format sourcechar hex2.; put sourcechar char1. @@; diff --git a/meta/mm_createwebservice.sas b/meta/mm_createwebservice.sas index d4f6220..9285e5c 100644 --- a/meta/mm_createwebservice.sas +++ b/meta/mm_createwebservice.sas @@ -268,10 +268,10 @@ data _null_; put ' "&&name&i"n /* name literal for reserved variable names */ '; put ' %end; '; put ' %if &action=ARR %then "]" ; %else "}" ; ; '; - put ' /* now write the long strings to _webout 1 byte at a time */ '; + put ' /* now write the long strings to _webout 1 char at a time */ '; put ' data _null_; '; - put ' infile _sjs; '; - put ' file &jref mod; '; + put ' infile _sjs lrecl=1 recfm=n; '; + put ' file &jref mod lrecl=1 recfm=n; '; put ' input sourcechar $char1. @@; '; put ' format sourcechar hex2.; '; put ' put sourcechar char1. @@; '; diff --git a/sasjs/sasjsconfig.json b/sasjs/sasjsconfig.json index d1218ca..e900f79 100644 --- a/sasjs/sasjsconfig.json +++ b/sasjs/sasjsconfig.json @@ -67,6 +67,7 @@ }, { "name": "server", + "serverUrl": "", "serverType": "SASJS", "httpsAgentOptions": { "allowInsecureRequests": false @@ -106,4 +107,4 @@ "contextName": "SAS Job Execution compute context" } ] -} \ No newline at end of file +} diff --git a/server/ms_createwebservice.sas b/server/ms_createwebservice.sas index cd7ca4d..e3d392e 100644 --- a/server/ms_createwebservice.sas +++ b/server/ms_createwebservice.sas @@ -269,10 +269,10 @@ data _null_; put ' "&&name&i"n /* name literal for reserved variable names */ '; put ' %end; '; put ' %if &action=ARR %then "]" ; %else "}" ; ; '; - put ' /* now write the long strings to _webout 1 byte at a time */ '; + put ' /* now write the long strings to _webout 1 char at a time */ '; put ' data _null_; '; - put ' infile _sjs; '; - put ' file &jref mod; '; + put ' infile _sjs lrecl=1 recfm=n; '; + put ' file &jref mod lrecl=1 recfm=n; '; put ' input sourcechar $char1. @@; '; put ' format sourcechar hex2.; '; put ' put sourcechar char1. @@; '; diff --git a/tests/base/mp_binarycopy.test.sas b/tests/base/mp_binarycopy.test.sas index b456c21..7ce3f37 100644 --- a/tests/base/mp_binarycopy.test.sas +++ b/tests/base/mp_binarycopy.test.sas @@ -5,6 +5,7 @@