diff --git a/all.sas b/all.sas index 34989a3..258235d 100644 --- a/all.sas +++ b/all.sas @@ -8441,10 +8441,16 @@ options format _numeric_ bart.; %do i=1 %to &numcols; %if &&typelong&i=char or &fmt=Y %then %do; - &&name&i='"'!!trim(prxchange('s/"/\"/',-1, - prxchange('s/'!!'0A'x!!'/\n/',-1, - prxchange('s/'!!'0D'x!!'/\r/',-1, - prxchange('s/'!!'09'x!!'/\t/',-1, + if prxmatch( + 'm/\"|\x0A|\x0D|\x09|\x00|\x0E|\x0F|\x01|\x02|\x10|\x11|\\/o', + &&name&i + )>0 + then do; + &&name&i='"'!!trim( + prxchange('s/"/\\"/',-1, /* double quote */ + prxchange('s/\x0A/\n/',-1, /* new line */ + prxchange('s/\x0D/\r/',-1, /* carriage return */ + prxchange('s/\x09/\\t/',-1, /* tab */ prxchange('s/\x00/\\u0000/',-1, /* NUL */ prxchange('s/\x0E/\\u000E/',-1, /* SS */ prxchange('s/\x0F/\\u000F/',-1, /* SF */ @@ -8453,7 +8459,9 @@ options prxchange('s/\x10/\\u0010/',-1, /* DLE */ prxchange('s/\x11/\\u0011/',-1, /* DC1 */ prxchange('s/\\/\\\\/',-1,&&name&i) - ))))))))))))!!'"'; + ))))))))))))!!'"'; + end; + else &&name&i=quote(cats(&&name&i)); %end; %end; run; @@ -14966,10 +14974,16 @@ data _null_; put ' format _numeric_ bart.; '; put ' %do i=1 %to &numcols; '; put ' %if &&typelong&i=char or &fmt=Y %then %do; '; - put ' &&name&i=''"''!!trim(prxchange(''s/"/\"/'',-1, '; - put ' prxchange(''s/''!!''0A''x!!''/\n/'',-1, '; - put ' prxchange(''s/''!!''0D''x!!''/\r/'',-1, '; - put ' prxchange(''s/''!!''09''x!!''/\t/'',-1, '; + put ' if prxmatch( '; + put ' ''m/\"|\x0A|\x0D|\x09|\x00|\x0E|\x0F|\x01|\x02|\x10|\x11|\\/o'', '; + put ' &&name&i '; + put ' )>0 '; + put ' then do; '; + put ' &&name&i=''"''!!trim( '; + put ' prxchange(''s/"/\\"/'',-1, /* double quote */ '; + put ' prxchange(''s/\x0A/\n/'',-1, /* new line */ '; + put ' prxchange(''s/\x0D/\r/'',-1, /* carriage return */ '; + put ' prxchange(''s/\x09/\\t/'',-1, /* tab */ '; put ' prxchange(''s/\x00/\\u0000/'',-1, /* NUL */ '; put ' prxchange(''s/\x0E/\\u000E/'',-1, /* SS */ '; put ' prxchange(''s/\x0F/\\u000F/'',-1, /* SF */ '; @@ -14978,7 +14992,9 @@ data _null_; put ' prxchange(''s/\x10/\\u0010/'',-1, /* DLE */ '; put ' prxchange(''s/\x11/\\u0011/'',-1, /* DC1 */ '; put ' prxchange(''s/\\/\\\\/'',-1,&&name&i) '; - put ' ))))))))))))!!''"''; '; + put ' ))))))))))))!!''"''; '; + put ' end; '; + put ' else &&name&i=quote(cats(&&name&i)); '; put ' %end; '; put ' %end; '; put ' run; '; @@ -20457,10 +20473,16 @@ data _null_; put ' format _numeric_ bart.; '; put ' %do i=1 %to &numcols; '; put ' %if &&typelong&i=char or &fmt=Y %then %do; '; - put ' &&name&i=''"''!!trim(prxchange(''s/"/\"/'',-1, '; - put ' prxchange(''s/''!!''0A''x!!''/\n/'',-1, '; - put ' prxchange(''s/''!!''0D''x!!''/\r/'',-1, '; - put ' prxchange(''s/''!!''09''x!!''/\t/'',-1, '; + put ' if prxmatch( '; + put ' ''m/\"|\x0A|\x0D|\x09|\x00|\x0E|\x0F|\x01|\x02|\x10|\x11|\\/o'', '; + put ' &&name&i '; + put ' )>0 '; + put ' then do; '; + put ' &&name&i=''"''!!trim( '; + put ' prxchange(''s/"/\\"/'',-1, /* double quote */ '; + put ' prxchange(''s/\x0A/\n/'',-1, /* new line */ '; + put ' prxchange(''s/\x0D/\r/'',-1, /* carriage return */ '; + put ' prxchange(''s/\x09/\\t/'',-1, /* tab */ '; put ' prxchange(''s/\x00/\\u0000/'',-1, /* NUL */ '; put ' prxchange(''s/\x0E/\\u000E/'',-1, /* SS */ '; put ' prxchange(''s/\x0F/\\u000F/'',-1, /* SF */ '; @@ -20469,7 +20491,9 @@ data _null_; put ' prxchange(''s/\x10/\\u0010/'',-1, /* DLE */ '; put ' prxchange(''s/\x11/\\u0011/'',-1, /* DC1 */ '; put ' prxchange(''s/\\/\\\\/'',-1,&&name&i) '; - put ' ))))))))))))!!''"''; '; + put ' ))))))))))))!!''"''; '; + put ' end; '; + put ' else &&name&i=quote(cats(&&name&i)); '; put ' %end; '; put ' %end; '; put ' run; '; diff --git a/base/mp_jsonout.sas b/base/mp_jsonout.sas index df61d1f..859ea07 100644 --- a/base/mp_jsonout.sas +++ b/base/mp_jsonout.sas @@ -199,10 +199,16 @@ format _numeric_ bart.; %do i=1 %to &numcols; %if &&typelong&i=char or &fmt=Y %then %do; - &&name&i='"'!!trim(prxchange('s/"/\"/',-1, - prxchange('s/'!!'0A'x!!'/\n/',-1, - prxchange('s/'!!'0D'x!!'/\r/',-1, - prxchange('s/'!!'09'x!!'/\t/',-1, + if prxmatch( + 'm/\"|\x0A|\x0D|\x09|\x00|\x0E|\x0F|\x01|\x02|\x10|\x11|\\/o', + &&name&i + )>0 + then do; + &&name&i='"'!!trim( + prxchange('s/"/\\"/',-1, /* double quote */ + prxchange('s/\x0A/\n/',-1, /* new line */ + prxchange('s/\x0D/\r/',-1, /* carriage return */ + prxchange('s/\x09/\\t/',-1, /* tab */ prxchange('s/\x00/\\u0000/',-1, /* NUL */ prxchange('s/\x0E/\\u000E/',-1, /* SS */ prxchange('s/\x0F/\\u000F/',-1, /* SF */ @@ -211,7 +217,9 @@ prxchange('s/\x10/\\u0010/',-1, /* DLE */ prxchange('s/\x11/\\u0011/',-1, /* DC1 */ prxchange('s/\\/\\\\/',-1,&&name&i) - ))))))))))))!!'"'; + ))))))))))))!!'"'; + end; + else &&name&i=quote(cats(&&name&i)); %end; %end; run; diff --git a/meta/mm_createwebservice.sas b/meta/mm_createwebservice.sas index 2687578..f61c40f 100644 --- a/meta/mm_createwebservice.sas +++ b/meta/mm_createwebservice.sas @@ -232,10 +232,16 @@ data _null_; put ' format _numeric_ bart.; '; put ' %do i=1 %to &numcols; '; put ' %if &&typelong&i=char or &fmt=Y %then %do; '; - put ' &&name&i=''"''!!trim(prxchange(''s/"/\"/'',-1, '; - put ' prxchange(''s/''!!''0A''x!!''/\n/'',-1, '; - put ' prxchange(''s/''!!''0D''x!!''/\r/'',-1, '; - put ' prxchange(''s/''!!''09''x!!''/\t/'',-1, '; + put ' if prxmatch( '; + put ' ''m/\"|\x0A|\x0D|\x09|\x00|\x0E|\x0F|\x01|\x02|\x10|\x11|\\/o'', '; + put ' &&name&i '; + put ' )>0 '; + put ' then do; '; + put ' &&name&i=''"''!!trim( '; + put ' prxchange(''s/"/\\"/'',-1, /* double quote */ '; + put ' prxchange(''s/\x0A/\n/'',-1, /* new line */ '; + put ' prxchange(''s/\x0D/\r/'',-1, /* carriage return */ '; + put ' prxchange(''s/\x09/\\t/'',-1, /* tab */ '; put ' prxchange(''s/\x00/\\u0000/'',-1, /* NUL */ '; put ' prxchange(''s/\x0E/\\u000E/'',-1, /* SS */ '; put ' prxchange(''s/\x0F/\\u000F/'',-1, /* SF */ '; @@ -244,7 +250,9 @@ data _null_; put ' prxchange(''s/\x10/\\u0010/'',-1, /* DLE */ '; put ' prxchange(''s/\x11/\\u0011/'',-1, /* DC1 */ '; put ' prxchange(''s/\\/\\\\/'',-1,&&name&i) '; - put ' ))))))))))))!!''"''; '; + put ' ))))))))))))!!''"''; '; + put ' end; '; + put ' else &&name&i=quote(cats(&&name&i)); '; put ' %end; '; put ' %end; '; put ' run; '; diff --git a/tests/crossplatform/mp_jsonout.test.3.sas b/tests/crossplatform/mp_jsonout.test.3.sas new file mode 100644 index 0000000..ea98eb6 --- /dev/null +++ b/tests/crossplatform/mp_jsonout.test.3.sas @@ -0,0 +1,53 @@ +/** + @file + @brief Testing mp_jsonout.sas macro with non-standard chars + +

SAS Macros

+ @li mp_jsonout.sas + @li mp_assert.sas + +**/ + +filename webref temp; + +data demo; + do x='"','0A'x,'0D'x,'09'x,'00'x,'0E'x,'0F'x,'01'x,'02'x,'10'x,'11'x,'\'; + output; + end; +run; +%mp_jsonout(OPEN,jref=webref) +%mp_jsonout(OBJ,demo,jref=webref) +%mp_jsonout(CLOSE,jref=webref) + +data _null_; + infile webref; + input; + putlog _infile_; +run; + +libname web JSON fileref=webref; + +%mp_assert( + iftrue=(&syscc=0), + desc=Checking for error condition with special chars export, + outds=work.test_results +) + +/* +data _null_; + set work.demo (in=start) web.demo (in=end); + put (_all_)(=); +run; +proc sql; +describe table work.demo; +describe table web.demo; +*/ + +proc compare base=work.demo compare=web.demo(keep=x); +quit; + +%mp_assert( + iftrue=(&sysinfo=0), + desc=Returned json is identical to input table for all special chars, + outds=work.test_results +) diff --git a/viya/mv_createwebservice.sas b/viya/mv_createwebservice.sas index f7ab88f..3c2053b 100644 --- a/viya/mv_createwebservice.sas +++ b/viya/mv_createwebservice.sas @@ -376,10 +376,16 @@ data _null_; put ' format _numeric_ bart.; '; put ' %do i=1 %to &numcols; '; put ' %if &&typelong&i=char or &fmt=Y %then %do; '; - put ' &&name&i=''"''!!trim(prxchange(''s/"/\"/'',-1, '; - put ' prxchange(''s/''!!''0A''x!!''/\n/'',-1, '; - put ' prxchange(''s/''!!''0D''x!!''/\r/'',-1, '; - put ' prxchange(''s/''!!''09''x!!''/\t/'',-1, '; + put ' if prxmatch( '; + put ' ''m/\"|\x0A|\x0D|\x09|\x00|\x0E|\x0F|\x01|\x02|\x10|\x11|\\/o'', '; + put ' &&name&i '; + put ' )>0 '; + put ' then do; '; + put ' &&name&i=''"''!!trim( '; + put ' prxchange(''s/"/\\"/'',-1, /* double quote */ '; + put ' prxchange(''s/\x0A/\n/'',-1, /* new line */ '; + put ' prxchange(''s/\x0D/\r/'',-1, /* carriage return */ '; + put ' prxchange(''s/\x09/\\t/'',-1, /* tab */ '; put ' prxchange(''s/\x00/\\u0000/'',-1, /* NUL */ '; put ' prxchange(''s/\x0E/\\u000E/'',-1, /* SS */ '; put ' prxchange(''s/\x0F/\\u000F/'',-1, /* SF */ '; @@ -388,7 +394,9 @@ data _null_; put ' prxchange(''s/\x10/\\u0010/'',-1, /* DLE */ '; put ' prxchange(''s/\x11/\\u0011/'',-1, /* DC1 */ '; put ' prxchange(''s/\\/\\\\/'',-1,&&name&i) '; - put ' ))))))))))))!!''"''; '; + put ' ))))))))))))!!''"''; '; + put ' end; '; + put ' else &&name&i=quote(cats(&&name&i)); '; put ' %end; '; put ' %end; '; put ' run; ';