diff --git a/all.sas b/all.sas index 0600468..2c58470 100644 --- a/all.sas +++ b/all.sas @@ -2413,10 +2413,29 @@ run; %mp_binarycopy(inloc="/home/me/blah.txt", outref=_webout) - @param inloc full, quoted "path/and/filename.ext" of the object to be copied - @param outloc full, quoted "path/and/filename.ext" of object to be created - @param inref can override default input fileref to avoid naming clash - @param outref an override default output fileref to avoid naming clash + To append to a file, use the mode option, eg: + + filename tmp1 temp; + filename tmp2 temp; + data _null_; + file tmp1; + put 'stacking'; + run; + + %mp_binarycopy(inref=tmp1, outref=tmp2, mode=APPEND) + %mp_binarycopy(inref=tmp1, outref=tmp2, mode=APPEND) + + + @param [in] inloc quoted "path/and/filename.ext" of the file to be copied + @param [out] outloc quoted "path/and/filename.ext" of the file to be created + @param [in] inref (____in) If provided, this fileref will take precedence over + the `inloc` parameter + @param [out] outref (____in) If provided, this fileref will take precedence + over the `outloc` parameter. It must already exist! + @param [in] mode (CREATE) Valid values: + @li CREATE - Create the file (even if it already exists) + @li APPEND - Append to the file (don't overwrite) + @returns nothing @version 9.2 @@ -2428,20 +2447,29 @@ run; ,outloc= /* full path and filename of object to be created */ ,inref=____in /* override default to use own filerefs */ ,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; /* these IN and OUT filerefs can point to anything */ %if &inref = ____in %then %do; filename &inref &inloc lrecl=1048576 ; %end; %if &outref=____out %then %do; - filename &outref &outloc lrecl=1048576 ; + filename &outref &outloc lrecl=1048576 &mod; %end; /* copy the file byte-for-byte */ data _null_; length filein 8 fileid 8; filein = fopen("&inref",'I',1,'B'); - fileid = fopen("&outref",'O',1,'B'); + fileid = fopen("&outref",&outmode,1,'B'); rec = '20'x; do while(fread(filein)=0); rc = fget(filein,rec,1); diff --git a/base/mp_binarycopy.sas b/base/mp_binarycopy.sas index d964a73..abc7e91 100755 --- a/base/mp_binarycopy.sas +++ b/base/mp_binarycopy.sas @@ -9,10 +9,29 @@ %mp_binarycopy(inloc="/home/me/blah.txt", outref=_webout) - @param inloc full, quoted "path/and/filename.ext" of the object to be copied - @param outloc full, quoted "path/and/filename.ext" of object to be created - @param inref can override default input fileref to avoid naming clash - @param outref an override default output fileref to avoid naming clash + To append to a file, use the mode option, eg: + + filename tmp1 temp; + filename tmp2 temp; + data _null_; + file tmp1; + put 'stacking'; + run; + + %mp_binarycopy(inref=tmp1, outref=tmp2, mode=APPEND) + %mp_binarycopy(inref=tmp1, outref=tmp2, mode=APPEND) + + + @param [in] inloc quoted "path/and/filename.ext" of the file to be copied + @param [out] outloc quoted "path/and/filename.ext" of the file to be created + @param [in] inref (____in) If provided, this fileref will take precedence over + the `inloc` parameter + @param [out] outref (____in) If provided, this fileref will take precedence + over the `outloc` parameter. It must already exist! + @param [in] mode (CREATE) Valid values: + @li CREATE - Create the file (even if it already exists) + @li APPEND - Append to the file (don't overwrite) + @returns nothing @version 9.2 @@ -24,20 +43,29 @@ ,outloc= /* full path and filename of object to be created */ ,inref=____in /* override default to use own filerefs */ ,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; /* these IN and OUT filerefs can point to anything */ %if &inref = ____in %then %do; filename &inref &inloc lrecl=1048576 ; %end; %if &outref=____out %then %do; - filename &outref &outloc lrecl=1048576 ; + filename &outref &outloc lrecl=1048576 &mod; %end; /* copy the file byte-for-byte */ data _null_; length filein 8 fileid 8; filein = fopen("&inref",'I',1,'B'); - fileid = fopen("&outref",'O',1,'B'); + fileid = fopen("&outref",&outmode,1,'B'); rec = '20'x; do while(fread(filein)=0); rc = fget(filein,rec,1); diff --git a/tests/crossplatform/mp_binarycopy.test.sas b/tests/crossplatform/mp_binarycopy.test.sas new file mode 100644 index 0000000..b456c21 --- /dev/null +++ b/tests/crossplatform/mp_binarycopy.test.sas @@ -0,0 +1,99 @@ +/** + @file + @brief Testing mp_binarycopy.sas macro + +