Fossil SCM

Escape [, \, and ] characters when quoting TCL strings.

drh 2021-09-03 17:51 diff-color-enhancements
Commit fd2d27f01b6c80eee591be8d0b447c080136c06f8d2f593f9ea690d2ddcb5d5f
3 files changed +18 -2 +18 -18 +2 -2
+18 -2
--- src/blob.c
+++ src/blob.c
@@ -363,19 +363,35 @@
363363
** Write into pOut, a string literal representation for the first n bytes
364364
** of z[]. The string literal representation is compatible with C, TCL,
365365
** and JSON. Double-quotes are added to both ends. Double-quote and
366366
** backslash characters are escaped.
367367
*/
368
-void blob_append_string_literal(Blob *pOut, const char *z, int n){
368
+void blob_append_tcl_literal(Blob *pOut, const char *z, int n){
369
+ int i;
370
+ blob_append_char(pOut, '"');
371
+ for(i=0; i<n; i++){
372
+ switch( z[i] ){
373
+ case '[':
374
+ case ']':
375
+ case '$':
376
+ case '"':
377
+ case '\\':
378
+ blob_append_char(pOut, '\\');
379
+ default:
380
+ blob_append_char(pOut, z[i]);
381
+ }
382
+ }
383
+ blob_append_char(pOut, '"');
384
+}
385
+void blob_append_json_literal(Blob *pOut, const char *z, int n){
369386
int i;
370387
blob_append_char(pOut, '"');
371388
for(i=0; i<n; i++){
372389
switch( z[i] ){
373390
case '"':
374391
case '\\':
375392
blob_append_char(pOut, '\\');
376
- /* Fall thru */
377393
default:
378394
blob_append_char(pOut, z[i]);
379395
}
380396
}
381397
blob_append_char(pOut, '"');
382398
--- src/blob.c
+++ src/blob.c
@@ -363,19 +363,35 @@
363 ** Write into pOut, a string literal representation for the first n bytes
364 ** of z[]. The string literal representation is compatible with C, TCL,
365 ** and JSON. Double-quotes are added to both ends. Double-quote and
366 ** backslash characters are escaped.
367 */
368 void blob_append_string_literal(Blob *pOut, const char *z, int n){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
369 int i;
370 blob_append_char(pOut, '"');
371 for(i=0; i<n; i++){
372 switch( z[i] ){
373 case '"':
374 case '\\':
375 blob_append_char(pOut, '\\');
376 /* Fall thru */
377 default:
378 blob_append_char(pOut, z[i]);
379 }
380 }
381 blob_append_char(pOut, '"');
382
--- src/blob.c
+++ src/blob.c
@@ -363,19 +363,35 @@
363 ** Write into pOut, a string literal representation for the first n bytes
364 ** of z[]. The string literal representation is compatible with C, TCL,
365 ** and JSON. Double-quotes are added to both ends. Double-quote and
366 ** backslash characters are escaped.
367 */
368 void blob_append_tcl_literal(Blob *pOut, const char *z, int n){
369 int i;
370 blob_append_char(pOut, '"');
371 for(i=0; i<n; i++){
372 switch( z[i] ){
373 case '[':
374 case ']':
375 case '$':
376 case '"':
377 case '\\':
378 blob_append_char(pOut, '\\');
379 default:
380 blob_append_char(pOut, z[i]);
381 }
382 }
383 blob_append_char(pOut, '"');
384 }
385 void blob_append_json_literal(Blob *pOut, const char *z, int n){
386 int i;
387 blob_append_char(pOut, '"');
388 for(i=0; i<n; i++){
389 switch( z[i] ){
390 case '"':
391 case '\\':
392 blob_append_char(pOut, '\\');
 
393 default:
394 blob_append_char(pOut, z[i]);
395 }
396 }
397 blob_append_char(pOut, '"');
398
+18 -18
--- src/diff.c
+++ src/diff.c
@@ -1131,49 +1131,49 @@
11311131
static void dftclSkip(DiffBuilder *p, unsigned int n, int isFinal){
11321132
blob_appendf(p->pOut, "SKIP %u\n", n);
11331133
}
11341134
static void dftclCommon(DiffBuilder *p, const DLine *pLine){
11351135
blob_appendf(p->pOut, "COM ");
1136
- blob_append_string_literal(p->pOut, pLine->z, pLine->n);
1136
+ blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
11371137
blob_append_char(p->pOut, '\n');
11381138
}
11391139
static void dftclInsert(DiffBuilder *p, const DLine *pLine){
11401140
blob_append(p->pOut, "INS ", -1);
1141
- blob_append_string_literal(p->pOut, pLine->z, pLine->n);
1141
+ blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
11421142
blob_append_char(p->pOut, '\n');
11431143
}
11441144
static void dftclDelete(DiffBuilder *p, const DLine *pLine){
11451145
blob_append(p->pOut, "DEL ", -1);
1146
- blob_append_string_literal(p->pOut, pLine->z, pLine->n);
1146
+ blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
11471147
blob_append_char(p->pOut, '\n');
11481148
}
11491149
static void dftclReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
11501150
blob_append(p->pOut, "EDIT ", -1);
1151
- blob_append_string_literal(p->pOut, pX->z, pX->n);
1151
+ blob_append_tcl_literal(p->pOut, pX->z, pX->n);
11521152
blob_append_char(p->pOut, ' ');
1153
- blob_append_string_literal(p->pOut, pY->z, pY->n);
1153
+ blob_append_tcl_literal(p->pOut, pY->z, pY->n);
11541154
blob_append_char(p->pOut, '\n');
11551155
}
11561156
static void dftclEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
11571157
int i, x;
11581158
ChangeSpan span;
11591159
blob_append(p->pOut, "EDIT", 4);
11601160
oneLineChange(pX, pY, &span);
11611161
for(i=x=0; i<span.n; i++){
11621162
blob_append_char(p->pOut, ' ');
1163
- blob_append_string_literal(p->pOut, pX->z + x, span.a[i].iStart1 - x);
1163
+ blob_append_tcl_literal(p->pOut, pX->z + x, span.a[i].iStart1 - x);
11641164
x = span.a[i].iStart1;
11651165
blob_append_char(p->pOut, ' ');
1166
- blob_append_string_literal(p->pOut, pX->z + x, span.a[i].iLen1);
1166
+ blob_append_tcl_literal(p->pOut, pX->z + x, span.a[i].iLen1);
11671167
x += span.a[i].iLen1;
11681168
blob_append_char(p->pOut, ' ');
1169
- blob_append_string_literal(p->pOut,
1169
+ blob_append_tcl_literal(p->pOut,
11701170
pY->z + span.a[i].iStart2, span.a[i].iLen2);
11711171
}
11721172
if( x<pX->n ){
11731173
blob_append_char(p->pOut, ' ');
1174
- blob_append_string_literal(p->pOut, pX->z + x, pX->n - x);
1174
+ blob_append_tcl_literal(p->pOut, pX->z + x, pX->n - x);
11751175
}
11761176
blob_append_char(p->pOut, '\n');
11771177
}
11781178
static void dftclEnd(DiffBuilder *p){
11791179
fossil_free(p);
@@ -1215,47 +1215,47 @@
12151215
static void dfjsonSkip(DiffBuilder *p, unsigned int n, int isFinal){
12161216
blob_appendf(p->pOut, "1,%u,\n", n);
12171217
}
12181218
static void dfjsonCommon(DiffBuilder *p, const DLine *pLine){
12191219
blob_append(p->pOut, "2,",2);
1220
- blob_append_string_literal(p->pOut, pLine->z, (int)pLine->n);
1220
+ blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
12211221
blob_append(p->pOut, ",\n",2);
12221222
}
12231223
static void dfjsonInsert(DiffBuilder *p, const DLine *pLine){
12241224
blob_append(p->pOut, "3,",2);
1225
- blob_append_string_literal(p->pOut, pLine->z, (int)pLine->n);
1225
+ blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
12261226
blob_append(p->pOut, ",\n",2);
12271227
}
12281228
static void dfjsonDelete(DiffBuilder *p, const DLine *pLine){
12291229
blob_append(p->pOut, "4,",2);
1230
- blob_append_string_literal(p->pOut, pLine->z, (int)pLine->n);
1230
+ blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
12311231
blob_append(p->pOut, ",\n",2);
12321232
}
12331233
static void dfjsonReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
12341234
blob_append(p->pOut, "5,[\"\",",-1);
1235
- blob_append_string_literal(p->pOut, pX->z, (int)pX->n);
1235
+ blob_append_json_literal(p->pOut, pX->z, (int)pX->n);
12361236
blob_append(p->pOut, ",",1);
1237
- blob_append_string_literal(p->pOut, pY->z, (int)pY->n);
1237
+ blob_append_json_literal(p->pOut, pY->z, (int)pY->n);
12381238
blob_append(p->pOut, ",\"\"],\n",-1);
12391239
}
12401240
static void dfjsonEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
12411241
int i, x;
12421242
ChangeSpan span;
12431243
blob_append(p->pOut, "5,[", 3);
12441244
oneLineChange(pX, pY, &span);
12451245
for(i=x=0; i<span.n; i++){
1246
- blob_append_string_literal(p->pOut, pX->z + x, span.a[i].iStart1 - x);
1246
+ blob_append_json_literal(p->pOut, pX->z + x, span.a[i].iStart1 - x);
12471247
x = span.a[i].iStart1;
12481248
blob_append_char(p->pOut, ',');
1249
- blob_append_string_literal(p->pOut, pX->z + x, span.a[i].iLen1);
1249
+ blob_append_json_literal(p->pOut, pX->z + x, span.a[i].iLen1);
12501250
x += span.a[i].iLen1;
12511251
blob_append_char(p->pOut, ',');
1252
- blob_append_string_literal(p->pOut,
1252
+ blob_append_json_literal(p->pOut,
12531253
pY->z + span.a[i].iStart2, span.a[i].iLen2);
12541254
}
12551255
blob_append_char(p->pOut, ',');
1256
- blob_append_string_literal(p->pOut, pX->z + x, pX->n - x);
1256
+ blob_append_json_literal(p->pOut, pX->z + x, pX->n - x);
12571257
blob_append(p->pOut, "],\n",3);
12581258
}
12591259
static void dfjsonEnd(DiffBuilder *p){
12601260
blob_append(p->pOut, "0]", 2);
12611261
fossil_free(p);
12621262
--- src/diff.c
+++ src/diff.c
@@ -1131,49 +1131,49 @@
1131 static void dftclSkip(DiffBuilder *p, unsigned int n, int isFinal){
1132 blob_appendf(p->pOut, "SKIP %u\n", n);
1133 }
1134 static void dftclCommon(DiffBuilder *p, const DLine *pLine){
1135 blob_appendf(p->pOut, "COM ");
1136 blob_append_string_literal(p->pOut, pLine->z, pLine->n);
1137 blob_append_char(p->pOut, '\n');
1138 }
1139 static void dftclInsert(DiffBuilder *p, const DLine *pLine){
1140 blob_append(p->pOut, "INS ", -1);
1141 blob_append_string_literal(p->pOut, pLine->z, pLine->n);
1142 blob_append_char(p->pOut, '\n');
1143 }
1144 static void dftclDelete(DiffBuilder *p, const DLine *pLine){
1145 blob_append(p->pOut, "DEL ", -1);
1146 blob_append_string_literal(p->pOut, pLine->z, pLine->n);
1147 blob_append_char(p->pOut, '\n');
1148 }
1149 static void dftclReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
1150 blob_append(p->pOut, "EDIT ", -1);
1151 blob_append_string_literal(p->pOut, pX->z, pX->n);
1152 blob_append_char(p->pOut, ' ');
1153 blob_append_string_literal(p->pOut, pY->z, pY->n);
1154 blob_append_char(p->pOut, '\n');
1155 }
1156 static void dftclEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1157 int i, x;
1158 ChangeSpan span;
1159 blob_append(p->pOut, "EDIT", 4);
1160 oneLineChange(pX, pY, &span);
1161 for(i=x=0; i<span.n; i++){
1162 blob_append_char(p->pOut, ' ');
1163 blob_append_string_literal(p->pOut, pX->z + x, span.a[i].iStart1 - x);
1164 x = span.a[i].iStart1;
1165 blob_append_char(p->pOut, ' ');
1166 blob_append_string_literal(p->pOut, pX->z + x, span.a[i].iLen1);
1167 x += span.a[i].iLen1;
1168 blob_append_char(p->pOut, ' ');
1169 blob_append_string_literal(p->pOut,
1170 pY->z + span.a[i].iStart2, span.a[i].iLen2);
1171 }
1172 if( x<pX->n ){
1173 blob_append_char(p->pOut, ' ');
1174 blob_append_string_literal(p->pOut, pX->z + x, pX->n - x);
1175 }
1176 blob_append_char(p->pOut, '\n');
1177 }
1178 static void dftclEnd(DiffBuilder *p){
1179 fossil_free(p);
@@ -1215,47 +1215,47 @@
1215 static void dfjsonSkip(DiffBuilder *p, unsigned int n, int isFinal){
1216 blob_appendf(p->pOut, "1,%u,\n", n);
1217 }
1218 static void dfjsonCommon(DiffBuilder *p, const DLine *pLine){
1219 blob_append(p->pOut, "2,",2);
1220 blob_append_string_literal(p->pOut, pLine->z, (int)pLine->n);
1221 blob_append(p->pOut, ",\n",2);
1222 }
1223 static void dfjsonInsert(DiffBuilder *p, const DLine *pLine){
1224 blob_append(p->pOut, "3,",2);
1225 blob_append_string_literal(p->pOut, pLine->z, (int)pLine->n);
1226 blob_append(p->pOut, ",\n",2);
1227 }
1228 static void dfjsonDelete(DiffBuilder *p, const DLine *pLine){
1229 blob_append(p->pOut, "4,",2);
1230 blob_append_string_literal(p->pOut, pLine->z, (int)pLine->n);
1231 blob_append(p->pOut, ",\n",2);
1232 }
1233 static void dfjsonReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
1234 blob_append(p->pOut, "5,[\"\",",-1);
1235 blob_append_string_literal(p->pOut, pX->z, (int)pX->n);
1236 blob_append(p->pOut, ",",1);
1237 blob_append_string_literal(p->pOut, pY->z, (int)pY->n);
1238 blob_append(p->pOut, ",\"\"],\n",-1);
1239 }
1240 static void dfjsonEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1241 int i, x;
1242 ChangeSpan span;
1243 blob_append(p->pOut, "5,[", 3);
1244 oneLineChange(pX, pY, &span);
1245 for(i=x=0; i<span.n; i++){
1246 blob_append_string_literal(p->pOut, pX->z + x, span.a[i].iStart1 - x);
1247 x = span.a[i].iStart1;
1248 blob_append_char(p->pOut, ',');
1249 blob_append_string_literal(p->pOut, pX->z + x, span.a[i].iLen1);
1250 x += span.a[i].iLen1;
1251 blob_append_char(p->pOut, ',');
1252 blob_append_string_literal(p->pOut,
1253 pY->z + span.a[i].iStart2, span.a[i].iLen2);
1254 }
1255 blob_append_char(p->pOut, ',');
1256 blob_append_string_literal(p->pOut, pX->z + x, pX->n - x);
1257 blob_append(p->pOut, "],\n",3);
1258 }
1259 static void dfjsonEnd(DiffBuilder *p){
1260 blob_append(p->pOut, "0]", 2);
1261 fossil_free(p);
1262
--- src/diff.c
+++ src/diff.c
@@ -1131,49 +1131,49 @@
1131 static void dftclSkip(DiffBuilder *p, unsigned int n, int isFinal){
1132 blob_appendf(p->pOut, "SKIP %u\n", n);
1133 }
1134 static void dftclCommon(DiffBuilder *p, const DLine *pLine){
1135 blob_appendf(p->pOut, "COM ");
1136 blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
1137 blob_append_char(p->pOut, '\n');
1138 }
1139 static void dftclInsert(DiffBuilder *p, const DLine *pLine){
1140 blob_append(p->pOut, "INS ", -1);
1141 blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
1142 blob_append_char(p->pOut, '\n');
1143 }
1144 static void dftclDelete(DiffBuilder *p, const DLine *pLine){
1145 blob_append(p->pOut, "DEL ", -1);
1146 blob_append_tcl_literal(p->pOut, pLine->z, pLine->n);
1147 blob_append_char(p->pOut, '\n');
1148 }
1149 static void dftclReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
1150 blob_append(p->pOut, "EDIT ", -1);
1151 blob_append_tcl_literal(p->pOut, pX->z, pX->n);
1152 blob_append_char(p->pOut, ' ');
1153 blob_append_tcl_literal(p->pOut, pY->z, pY->n);
1154 blob_append_char(p->pOut, '\n');
1155 }
1156 static void dftclEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1157 int i, x;
1158 ChangeSpan span;
1159 blob_append(p->pOut, "EDIT", 4);
1160 oneLineChange(pX, pY, &span);
1161 for(i=x=0; i<span.n; i++){
1162 blob_append_char(p->pOut, ' ');
1163 blob_append_tcl_literal(p->pOut, pX->z + x, span.a[i].iStart1 - x);
1164 x = span.a[i].iStart1;
1165 blob_append_char(p->pOut, ' ');
1166 blob_append_tcl_literal(p->pOut, pX->z + x, span.a[i].iLen1);
1167 x += span.a[i].iLen1;
1168 blob_append_char(p->pOut, ' ');
1169 blob_append_tcl_literal(p->pOut,
1170 pY->z + span.a[i].iStart2, span.a[i].iLen2);
1171 }
1172 if( x<pX->n ){
1173 blob_append_char(p->pOut, ' ');
1174 blob_append_tcl_literal(p->pOut, pX->z + x, pX->n - x);
1175 }
1176 blob_append_char(p->pOut, '\n');
1177 }
1178 static void dftclEnd(DiffBuilder *p){
1179 fossil_free(p);
@@ -1215,47 +1215,47 @@
1215 static void dfjsonSkip(DiffBuilder *p, unsigned int n, int isFinal){
1216 blob_appendf(p->pOut, "1,%u,\n", n);
1217 }
1218 static void dfjsonCommon(DiffBuilder *p, const DLine *pLine){
1219 blob_append(p->pOut, "2,",2);
1220 blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
1221 blob_append(p->pOut, ",\n",2);
1222 }
1223 static void dfjsonInsert(DiffBuilder *p, const DLine *pLine){
1224 blob_append(p->pOut, "3,",2);
1225 blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
1226 blob_append(p->pOut, ",\n",2);
1227 }
1228 static void dfjsonDelete(DiffBuilder *p, const DLine *pLine){
1229 blob_append(p->pOut, "4,",2);
1230 blob_append_json_literal(p->pOut, pLine->z, (int)pLine->n);
1231 blob_append(p->pOut, ",\n",2);
1232 }
1233 static void dfjsonReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){
1234 blob_append(p->pOut, "5,[\"\",",-1);
1235 blob_append_json_literal(p->pOut, pX->z, (int)pX->n);
1236 blob_append(p->pOut, ",",1);
1237 blob_append_json_literal(p->pOut, pY->z, (int)pY->n);
1238 blob_append(p->pOut, ",\"\"],\n",-1);
1239 }
1240 static void dfjsonEdit(DiffBuilder *p, const DLine *pX, const DLine *pY){
1241 int i, x;
1242 ChangeSpan span;
1243 blob_append(p->pOut, "5,[", 3);
1244 oneLineChange(pX, pY, &span);
1245 for(i=x=0; i<span.n; i++){
1246 blob_append_json_literal(p->pOut, pX->z + x, span.a[i].iStart1 - x);
1247 x = span.a[i].iStart1;
1248 blob_append_char(p->pOut, ',');
1249 blob_append_json_literal(p->pOut, pX->z + x, span.a[i].iLen1);
1250 x += span.a[i].iLen1;
1251 blob_append_char(p->pOut, ',');
1252 blob_append_json_literal(p->pOut,
1253 pY->z + span.a[i].iStart2, span.a[i].iLen2);
1254 }
1255 blob_append_char(p->pOut, ',');
1256 blob_append_json_literal(p->pOut, pX->z + x, pX->n - x);
1257 blob_append(p->pOut, "],\n",3);
1258 }
1259 static void dfjsonEnd(DiffBuilder *p){
1260 blob_append(p->pOut, "0]", 2);
1261 fossil_free(p);
1262
+2 -2
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -157,13 +157,13 @@
157157
}else{
158158
blob_init(&x, 0, 0);
159159
pOut = &x;
160160
}
161161
blob_append(pOut, "FILE ", 5);
162
- blob_append_string_literal(pOut, zLeft, (int)strlen(zLeft));
162
+ blob_append_tcl_literal(pOut, zLeft, (int)strlen(zLeft));
163163
blob_append_char(pOut, ' ');
164
- blob_append_string_literal(pOut, zRight, (int)strlen(zRight));
164
+ blob_append_tcl_literal(pOut, zRight, (int)strlen(zRight));
165165
blob_append_char(pOut, '\n');
166166
if( !diffBlob ){
167167
fossil_print("%s", blob_str(pOut));
168168
blob_reset(&x);
169169
}
170170
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -157,13 +157,13 @@
157 }else{
158 blob_init(&x, 0, 0);
159 pOut = &x;
160 }
161 blob_append(pOut, "FILE ", 5);
162 blob_append_string_literal(pOut, zLeft, (int)strlen(zLeft));
163 blob_append_char(pOut, ' ');
164 blob_append_string_literal(pOut, zRight, (int)strlen(zRight));
165 blob_append_char(pOut, '\n');
166 if( !diffBlob ){
167 fossil_print("%s", blob_str(pOut));
168 blob_reset(&x);
169 }
170
--- src/diffcmd.c
+++ src/diffcmd.c
@@ -157,13 +157,13 @@
157 }else{
158 blob_init(&x, 0, 0);
159 pOut = &x;
160 }
161 blob_append(pOut, "FILE ", 5);
162 blob_append_tcl_literal(pOut, zLeft, (int)strlen(zLeft));
163 blob_append_char(pOut, ' ');
164 blob_append_tcl_literal(pOut, zRight, (int)strlen(zRight));
165 blob_append_char(pOut, '\n');
166 if( !diffBlob ){
167 fossil_print("%s", blob_str(pOut));
168 blob_reset(&x);
169 }
170

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button