From c8a420ad480773e21f791d1a024c48184937cd42 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 16 Sep 2017 17:05:26 -0700 Subject: [PATCH] SCP: Change command argument processing of %% and \% to be consistent. %% now inserts a bare % and \\ only means something when parsing a quoted string argument (used by EXPECT and SEND commands). Additionally, EXPECT and BREAK commands have action steps which will now expand arguments as each of the actions are executed rather than when the EXPECT or BREAK command is defined. --- README.md | 4 ++-- doc/simh_doc.doc | Bin 270848 -> 275968 bytes scp.c | 60 +++++++++++++++++++++++++++++++++++------------ 3 files changed, 47 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 69894f5b..98dafabc 100644 --- a/README.md +++ b/README.md @@ -319,8 +319,8 @@ Built In variables %DATE%, %TIME%, %DATETIME%, %LDATE%, %LTIME%, %CTIME%, %DATE_ Token %n (n being a single digit) expands to the n'th argument Token %* expands to the whole set of arguments (%1 ... %9) - The input sequence "\%" represents a literal "%", and "\\" represents a - literal "\". All other character combinations are rendered literally. + The input sequence "%%" represents a literal "%". All other + character combinations are rendered literally. Omitted parameters result in null-string substitutions. diff --git a/doc/simh_doc.doc b/doc/simh_doc.doc index 7a9fea6a6d5908f4e138897f848dbfa2418649b2..6783e2dbaf024aacc180cc2e8c5b0703917f4fd4 100644 GIT binary patch delta 23985 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 SJLVNRJ9g-xPiPoZV)=jc{l`22 delta 20858 zcmc(n33wF6w#Tb_CLse!$b=+7NJ2IsAPJf2Y{Mp-iU>-sh=}ZhA|fJ-C~z6zA)vB| z4RjD$uTMbqDxkFcMN#BaM8vota#;k|$i55l{m*oFrn{#n#Ctz@7cNwNT~ZzJGweQzTOCV^fgdiwY8@QlVb$a;=MdL}ZgPsb%`;-+M$guYd0?lP)>Z{CdY#rFubokvWcf z3-H~sMAcZoshSzMAiY(+9&4U1)cDcs(PZ+@HN1JA-luTJR4CR7?=6J)1UX}h(9Qpt zR)FW(M0}Gj^pp! zlvevdL@iH&=<}9{Qbb%vRXR5=Jw}xmWTx{3k4yTqX@)c@&aGJ#NU+e-h06&E?M`>A2E_q`JZ~PVzqNB?X}w#ozL>1E5+%~F?!u~c zQ0|j@#OG^rpVYRVX79_F*6VVlgL04Ls@GDr_jyR38|a14OT7?XogaGe!NH@3j&;>b z@7eLD8~%2~jp+k>J#WT|hWb~U~N zL)k)UY(fjIY@t*)QLnQ|`ZS@PCNDC`i>0E(!dSKb;`DyQX)vS{S;?AdiS%ru<^*4f z^hKgJf(ll;+p>X?2PQd4Y7Uep5|eV2~F|-5aO_A?6oKUo_C`FOt?Y$kObK4Dw>> zLW4X_UM%G`)a^^8-iCBg?vq}qlKX=8o_y(SL)BLz(y)&sw~8L^+C7NEm1`PG6Oz?& zgF>30tTpEGN=mZkIHZGeQA%&rJ}^F_N30s3dg}Oyo&srZqvmSgk$$(4UR|Mdq*0Dm ztWYiHtr}L*QzW%bX{Hq`l18NH#fqh8QaqZxSb92DmzPKWBQ;l*BVD1_ARUy8(ylaZh`pjgULZATT%y%e zV2~F|a~fxB@)Z?1d^EG{mO?jVm zEM4=D*C$<{sa=o?$(^P7O)Qk!XX*VZlI}I6gYsf&bCxzzA26X4vR4!^RF9HEwMB z;PjFAj~g~-@JMJjy?rQaY!uc^4MDQ(?#*v$UO$$xlSfW|yL0Q#cXz(L>g9P;CrlkY zuk^-Zmg*Qm4?TC(w4~vk96!n(`}4#UB-n#pnR65vAH`YY#NoNz!BmU5fjl{$%0xzS zqkKz$o{;7a*cb~pGTKDn$s4+YRZ$VS)1CY&2Q|IxPTqILH1*66Jt*-pyUs3)(S|M>h-YRF)7m%`xKdYDY}|j>>b(T{pZ%>@nPs@>ivIi?LpCs|2L{w=V2ssJ zxvMrFRo71m<LqRt&QViF<1h68D*^xppBTpSq9lsZm6{SKHS0*DfON*CXP7 zV?=C>w(ZsxBVxo=i--qILs{{FO+<{WK}0-gs^(fo#Dg`Ah?RA1U4QK&;vqdE9x_J6 zLbq+Vt{4%cuUbSrY#PdnhixKaObsGptf`u784+V^7!lKP(DDEJ)EKWv#CT&wJd$MF ztt&>vBUddVCYXk@Vgf&BSx78?jK>Ebd!y^yUcl9uX)>+i0xi?3DUdkz82`l5JsInq zNcq4-%{1_A9@_Alb<%#xFi9W$Nqk?89%+3VU9%pm4tweE2H!eq^&4FA9Q(U5WV@%@ zcI}EGJLRf{tlu26ew&-v)EeBxrkSd_b~iEQ)U=weeOss7`u=LnHv2$+To2^OjUkbj zY1^$UhQ!RP780{eV_7lFCM0IpAS9kJRdek^LO%6G4WDZ%O>A9%?IPkSJtCemMnqgQ z+iqPkBIaDRh?r{{%8I!*5izd@5i#FX&9#h(`8AA)%I3DNzjhI^K#zz8{1ttnkY;&G zUojB+@gzA;(w<3w?YN||p{>Od&oE@SNT%VdkoXryEuDR-%ZG(L+U7Z(X*@Wqy@)rn z6uxFYKDLPO(_Nbwe<06x#INLIyOTe<`nvb1_339H@?Ud*ip^6Wk#vfam#Ys>1Z9u9oGII{k5;JnKIPa7 zek*rbPNs*f`i}y_df2N}tm3@}JL?|8J0GPAPf+?egzw|qH9Cl2=|L}W2Z)89Z1RBz zOalwSBJdtK0_y+3SSeVbJe(xV=YHLuY{~BMFO2zrWo!eeRl(R|AcHcn5jcNmtQlAd zUIrV%W>5)!K8boyF*f})V^4uOVDcH%2fhY-K&!KidBLyX_p{8;+MmOF7hofJ9YmkU zMS!8;F|ZYE1DC+y3%DRK62ByD2ZzASKNy<@mVxD9HFz0p0Gq*^;0TDk#MqNy3FuM@ zhk+q~`WYLKHz`(g&VB=zBRH!Y$=Q40Q}AL8XInvJEN30-an=cZ5B7oR1kRr9$k}s% zUcI^a8~!^CzBBxH*pLp$4{KUYkz&;w^LVwTk$m7&JfhY%6k_EM8VYIt+DXH2>?*RJ z-5jiR0mgAJa35x@GZ+unfgeGGBaGbxHi1ge{zr@n_y#ojiLr;lKfqU@7GBaR1&hIN zpaWuH4xm^#0{#G(z~En*GB#P5%S(}BL%o>+~gR>wKQA3e*Gw1>C z2Qz>vvXs&k;T7JEB5V_IAe!_@%RyR?wtpgh8BnyPA4Q#DG}r`=1J5zW#)5IjnSf*_)so&}6Fs?+Bc|3nn@^n*?j60AX;Nol`SX&#D4w$aJDX!g5(t~wS3vglTt^@is{t)R1Ol6wR9#8_h zf%j-09Q+Q1x|}rttw0BGJGc)F2TOpd7dg}mlCA`=f-T@n@FTbc>cw%^ z0<;BpfDvFSkilB;HuxOu0v7>ybLIvazyrE~zTjan8$1g(f$c!+iL#`e_u=yKEj*dR zzqX&(Wh|8p{teE6$au~gf?SXXx`9&AAKVYdgBf5kSO?w#pMd?~I1q3LOaz(01N6J& z1f=JK*TF|%FSyKe$x`Q5yyA#SM_CR_dSOj(fo{SNYSN+TzDtTRm-8_Z_%|H(@MULqz zJgiK)5j~2T0>Nsq51dt?IK^YnBAwcZv(8{xBf9?4%9L)fjvWTcH1HnyMb~sE%`cE7 zq##g1pA@akt)%G#$tNa2icrrt4;$CXvNk}$;-Qc3G84gX%MM&ypA|yZ? z**#Kdp+#L^inuxQrx2;kL`u@MDQB;C5t?X zxip$)#xIa0Wpj257@w_a#*k(_Bzr-fCRi~w(KO>o(+QHvU=i4=YaW3nW-BCzK}1u| zn#k_S=28*&ZW@52M&WH;GBXwk8#&Iq~n_52CBHG2j}W^6QZP1XL)l>6EWPIwps+Y}q{%ebNT0mh!I|LPze-hUP9X2}}m_6j;G) z^N@ZSd;uzRG!M)s4^%>u)10&Rpnr2s^CW5dLoxxp1or8gIpmvtkVLoOtPl*4-A`8y zYv5)u4<_ybP(2P_0p;K;1!fr5uaN!`IIhEBfv$@C8R}qHqz8hPVB2+CHx^Piwn6d@ zaJA%2Y^iA$lSYK(0q{Ryjjkyp%^FB{fRtQ3NOH9@&yuDaB-6oG@Vl;g4jT9Gkht>j zOa*s=zKVM}^|&w6Bf&DT3tW~tut)+Yqq^EZ3CVeIO9>u@V1VM@g%U9XkbVR_4|d3qnI6S~*|Qtv zV|GA)8pQdqn33II+t`&;J09qJgBjp)uvmdD+F6YB3t%Jo#=iWwC?ER`^v>3Jbb!9C zwJZ3JG<_kN3>E`L*L+WXQy}>koCYzn`+#}!|C_oM(*{+7+rStwR)HBDITq>1!3yv- zxTv@fQFkvQ-Lx%S1%}A(A1#+l_u9jB4;=#iWbhQ21C}eWJ;sxlBmFVh4!#4C?KrCi z>bFype-?h^G4+wT9^3}j%dINashg?1@~cqFV@Uc4SZdW)kd~w$f|FM5QD|Kx&1#QP zkliQM+wl|1E61U6_l9&9*bfeX;|eTr!#|F6*7cl?Q(UKM`i(<+H8`rc&Qks;(${yO z2cGLZ<$EDL3%sGYE>ivtq<;qWWOt?7B0Z(?0JuaCfO;LVBLKa?9blLOt7E*!Fr=RV z`T@Z*q{nr_gAyzP8^G7#9LVp?*{#42R)YgT=z@B|F!0ptJsg|3|0yIt1*bvb4Y+53 z4d5$~bR%x4W_b_2&vc+!Bu;BoK*_z6UJ<*X&R2mCKM2QqKQ{SQnBJHP>O3FLRX z!j^&z27qN?3pfCTTQEN0d9Vu{2btZmPy!103^eP(+0EclPzF8#he5+zarXx^!Rw$L zxNqak3x)y-d;mhX6zUd-bUy({PtJ<7jTr~NdqQ=7s1DX{f)EhKp!v%%mwqn zd2j*5-wr2$?qDEz6wCo@0Ui1TcYexq<$NHgM^vWrhs!ZWsN=!EDH55Fd0C0PD%mk6 zL=a=JUU@BA;T8}C+)#LVB>LG!to|4ddRFSEkjx8+pSOh-# zSd7WSM(}W^#exKezQBXlzUU%DUwl>{s{&I!AwKqLZa39q@v%>~_}Irne5{L1^;mrD zlPx~>AucRqu8U0dgt(LhEQ$-lb5P~c!)Q+djo%9~=B%9EhV zuMk*cHz+c+@_D?e70R0Gu=tefu*5AjZStuuFtpMk(bNiMP1j=bC6%}MazlMndCD5f zd#t`x1%~VJSYuUWy2#MW70ISnC~K<25~oy$Dl+xO6sNEW#Hpc`xKvXslr@#N_!0{r z+ye~dr!_W}r>v>G#h0FdFAWx6^V}EV8oC)6T6iea)BQ$afMqtiV)xua7$I*6k)H#%dZ(=<9aqZ2YZ3!_snI^V)cmLEr0IH&@27DY!- zbjU=pEmZig+~Q>>c*V*)wGwU{WI;EX`f7cW7-eX9+>vM zwAZEmE$wA#*Gl_S+H}(Pk~WgGX{7BTZ3SuDM_WAF%+bb;Hf6NoT0Dq$Re<(Lv>T%B z4sC5{8$(+Z+K$kUgZ34)d!Ri6?FMM&Ppf@e;nS*~R`Rr7r?ojPrfKa;>&11-<)IEm zkS{fHMk`zHbIgw5>y(=xbZmC`^$5ZgMhwNUfvgvMh~0yQosaIx`tlB`@VdfkbVb$Z zidl?5Y=b4$6!eAF`S4H;*HOA4tIn@qAuVF9%AhX1XRyAird)W>U_C|U{I>4)F}Nm- zXRv^(Mimt;RFnYCPko`(C)Q_g3Q>3aN1A z$fx0TCeQdyS5GU5@CCzrMyw`gumGv1PG9)xgjGj%1?83#97}FHi-kiOUdC977cj=- zMGFy&h}~d177|18cENVMK`;x8i6h`iye-fLFU1VOJ201VtneNd7cWNOnOp}?D?I(y z+(b#!JzVN7{tak)z-2h%f%@S&EgIa$APom~WQS(96{2XeHK&@q<7iu1dnqyJx zC*T9rTqhdOOSR^}>jPgT$v-^iI2qGh#IXogM`)2bdK4o>R6 zQhCN92q^E|eBN;v=LK@#3yx-v*sKZij0=v8lrBvw=&!txzj6S5Q;+Dox$^!6$8~iD zc8hW}%6Xr|QOM%tKG9BJs=hv%(Sxx9ZXf}xp zH3@oGt)+ITNzl8hi8El5792*pi<=v&Wb(jhr`Kc?bgx>?c^jLce^r~4Ha0;At2Pxj zHbD=oHuxt*A^i!uShYD|V-xgoe89)wh1k$zSig4FrrgFR=w;Prr;Sa}&8p3I8=Ih? zRhtiNY=VAPZQil53Hn*J*=%DI^s{R7s*O$1&#KLfHa0;&t2WQu*aZDtFW~3pAvUxU z)cvg5l-bw>{jAzNV`CHavuZQP#wO@z)n=xRP0-J(%~Ttkpr2Kni8eMtKdUz5Y;1yl zR&7Sv*aZEo+6=d`(fwS&k^_DoVzHrHhVEzGrk{zot$33+@=r(d|h<+ClFqi#C>^@r*ova|d_JKT)e4)#8_3^!pJvya`tzC`K6|uG1H5u1ql_-9U0mF`$WzqGn=6W4Jh=rPPf2d4PKBLv XZ|stPgV$4BAa*M9DHBEKOyU0k%2V;v diff --git a/scp.c b/scp.c index f99fd856..3ee3fa70 100644 --- a/scp.c +++ b/scp.c @@ -557,6 +557,10 @@ int32 sim_brk_lnt = 0; int32 sim_brk_ins = 0; int32 sim_quiet = 0; int32 sim_step = 0; +char *sim_sub_instr = NULL; +char *sim_sub_instr_buf = NULL; +size_t sim_sub_instr_size = 0; +size_t *sim_sub_instr_off = NULL; static double sim_time; static uint32 sim_rtime; static int32 noqueue_time; @@ -1371,8 +1375,8 @@ static const char simh_help[] = "+Token %%0 expands to the command file name.\n" "+Token %%n (n being a single digit) expands to the n'th argument\n" "+Token %%* expands to the whole set of arguments (%%1 ... %%9)\n\n" - "+The input sequence \"%%%%\" represents a literal \"%%\", and \"\\\\\" represents a\n" - "+literal \"\\\". All other character combinations are rendered literally.\n\n" + "+The input sequence \"%%%%\" represents a literal \"%%\". All other\n" + "+character combinations are rendered literally.\n\n" "+Omitted parameters result in null-string substitutions.\n\n" "+Tokens preceeded and followed by %% characters are expanded as environment\n" "+variables, and if an environment variable isn't found then it can be one of\n" @@ -3193,8 +3197,8 @@ return stat | SCPE_NOMESSAGE; /* suppress message sinc Token %n (n being a single digit) expands to the n'th argument Tonen %* expands to the whole set of arguments (%1 ... %9) - The input sequence "\%" represents a literal "%", and "\\" represents a - literal "\". All other character combinations are rendered literally. + The input sequence "%%" represents a literal "%". All other + character combinations are rendered literally. Omitted parameters result in null-string substitutions. @@ -3231,6 +3235,8 @@ char *ip = instr, *op, *oend, *istart, *tmpbuf; const char *ap; char rbuf[CBUFSIZE]; int i; +size_t instr_off = 0; +size_t outstr_off = 0; time_t now; struct tm *tmnow; @@ -3239,14 +3245,23 @@ tmnow = localtime(&now); tmpbuf = (char *)malloc(instr_size); op = tmpbuf; oend = tmpbuf + instr_size - 2; -while (sim_isspace (*ip)) /* skip leading spaces */ +if (instr_size > sim_sub_instr_size) { + sim_sub_instr = (char *)realloc (sim_sub_instr, instr_size*sizeof(*sim_sub_instr)); + sim_sub_instr_off = (size_t *)realloc (sim_sub_instr_off, instr_size*sizeof(*sim_sub_instr_off)); + sim_sub_instr_size = instr_size; + } +sim_sub_instr_buf = instr; +strlcpy (sim_sub_instr, instr, instr_size*sizeof(*sim_sub_instr)); +while (sim_isspace (*ip)) { /* skip leading spaces */ + sim_sub_instr_off[outstr_off++] = ip - instr; *op++ = *ip++; + } istart = ip; for (; *ip && (op < oend); ) { - if ((ip [0] == '\\') && /* literal escape? */ - ((ip [1] == '%') || (ip [1] == '\\'))) { /* and followed by '%' or '\'? */ - ip++; /* skip '\' */ - *op++ = *ip++; /* copy escaped char */ + if ((ip [0] == '%') && (ip [1] == '%')) { /* literal % insert? */ + sim_sub_instr_off[outstr_off++] = ip - instr; + ip++; /* skip one */ + *op++ = *ip++; /* copy insert % */ } else if ((*ip == '%') && @@ -3449,8 +3464,10 @@ for (; *ip && (op < oend); ) { } } if (ap) { /* non-null arg? */ - while (*ap && (op < oend)) /* copy the argument */ + while (*ap && (op < oend)) { /* copy the argument */ + sim_sub_instr_off[outstr_off++] = ip - instr; *op++ = *ap++; + } } } else @@ -3458,17 +3475,23 @@ for (; *ip && (op < oend); ) { get_glyph (istart, gbuf, 0); /* substitute initial token */ ap = getenv(gbuf); /* if it is an environment variable name */ if (!ap) { /* nope? */ + sim_sub_instr_off[outstr_off++] = ip - instr; *op++ = *ip++; /* press on with literal character */ continue; } - while (*ap && (op < oend)) /* copy the translation */ + while (*ap && (op < oend)) { /* copy the translation */ + sim_sub_instr_off[outstr_off++] = ip - instr; *op++ = *ap++; + } ip += strlen(gbuf); } - else + else { + sim_sub_instr_off[outstr_off++] = ip - instr; *op++ = *ip++; /* literal character */ + } } *op = 0; /* term buffer */ +sim_sub_instr_off[outstr_off] = 0; strcpy (instr, tmpbuf); free (tmpbuf); return; @@ -5582,12 +5605,15 @@ if (uptr == NULL) max = uptr->capac - 1; abuf[sizeof(abuf)-1] = '\0'; strncpy (abuf, cptr, sizeof(abuf)-1); -cptr = abuf; if ((aptr = strchr (abuf, ';'))) { /* ;action? */ + cptr += aptr - abuf + 1; if (flg != SSH_ST) /* only on SET */ - return sim_messagef (SCPE_ARG, "Invalid argument: %s\n", aptr); + return sim_messagef (SCPE_ARG, "Invalid argument: %s\n", cptr); *aptr++ = 0; /* separate strings */ + if ((cptr > sim_sub_instr_buf) && ((size_t)(cptr - sim_sub_instr_buf) < sim_sub_instr_size)) + aptr = &sim_sub_instr[sim_sub_instr_off[cptr - sim_sub_instr_buf]]; /* get un-substituted string */ } +cptr = abuf; if (*cptr == 0) { /* no argument? */ lo = (t_addr) get_rval (sim_PC, 0); /* use PC */ return ssh_break_one (st, flg, lo, 0, aptr); @@ -10608,7 +10634,11 @@ if (ep->act) { /* replace old action? * if (act) while (sim_isspace(*act)) ++act; /* skip leading spaces in action string */ if ((act != NULL) && (*act != 0)) { /* new action? */ - char *newp = (char *) calloc (strlen (act)+1, sizeof (*act)); /* alloc buf */ + char *newp; + + if ((act > sim_sub_instr_buf) && ((size_t)(act - sim_sub_instr_buf) < sim_sub_instr_size)) + act = &sim_sub_instr[sim_sub_instr_off[act - sim_sub_instr_buf]]; /* get un-substituted string */ + newp = (char *) calloc (strlen (act)+1, sizeof (*act)); /* alloc buf */ if (newp == NULL) /* mem err? */ return SCPE_MEM; strcpy (newp, act); /* copy action */