@@ -275,25 +275,30 @@
275 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBlob->blobFlags = 0;
276 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBlob->xRealloc = blobReallocStatic;
277 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
278 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
279 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append text or data to the end of a blob.
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Append text or data to the end of a blob. Or, if pBlob==NULL, send
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the text to standard output.
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If nData<0 then output all of aData up to the first 0x00 byte.
281 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The blob_append_full() routine is a complete implementation.
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The blob_append() routine only works for cases where nData>0 and
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** no resizing is required, and falls back to blob_append_full() if
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** either condition is not met, but runs faster in the common case
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** where all conditions are met. The use of blob_append() is
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** recommended, unless it is known in advance that nData<0.
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the blob_append() routine in all application code. The blob_append()
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** routine is faster, but blob_append_full() handles all the corner cases.
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The blob_append() routine automatically calls blob_append_full() if
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** necessary.
288 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void blob_append_full(Blob *pBlob, const char *aData, int nData){
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void blob_append_full(Blob *pBlob, const char *aData, int nData){
290 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 nNew;
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( aData!=0 || nData==0 );
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_is_init(pBlob);
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* assert( aData!=0 || nData==0 ); // omitted for speed */
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* blob_is_init(pBlob); // omitted for speed */
293 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nData<0 ) nData = strlen(aData);
294 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nData==0 ) return;
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pBlob==0 ){
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_puts(aData, 0, nData);
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
295 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nNew = pBlob->nUsed;
296 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nNew += nData;
297 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nNew >= pBlob->nAlloc ){
298 303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nNew += pBlob->nAlloc;
299 304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nNew += 100;
@@ -309,13 +314,12 @@
309 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBlob->nUsed += nData;
310 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBlob->aData[pBlob->nUsed] = 0; /* Blobs are always nul-terminated */
311 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
312 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void blob_append(Blob *pBlob, const char *aData, int nData){
313 318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 nUsed;
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( aData!=0 || nData==0 );
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* blob_is_init(pBlob); // omitted for speed */
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nData<=0 || pBlob->nUsed + nData >= pBlob->nAlloc ){
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* assert( aData!=0 || nData==0 ); // omitted for speed */
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nData<=0 || pBlob==0 || pBlob->nUsed + nData >= pBlob->nAlloc ){
317 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_full(pBlob, aData, nData);
318 322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
319 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
320 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nUsed = pBlob->nUsed;
321 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBlob->nUsed += nData;
@@ -329,32 +333,34 @@
329 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if INTERFACE
330 334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define blob_append_string(BLOB,STR) blob_append(BLOB,STR,sizeof(STR)-1)
331 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
332 336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
333 337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append a single character to the blob
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Append a single character to the blob. If pBlob is zero then the
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** character is written directly to stdout.
335 340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
336 341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void blob_append_char(Blob *pBlob, char c){
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pBlob->nUsed+1 >= pBlob->nAlloc ){
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pBlob==0 || pBlob->nUsed+1 >= pBlob->nAlloc ){
338 343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_full(pBlob, &c, 1);
339 344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
340 345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pBlob->aData[pBlob->nUsed++] = c;
341 346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
342 347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
343 348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
344 349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Copy a blob
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Copy a blob. pTo is reinitialized to be a copy of pFrom.
346 351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
347 352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void blob_copy(Blob *pTo, Blob *pFrom){
348 353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_is_init(pFrom);
349 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(pTo);
350 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(pTo, blob_buffer(pFrom), blob_size(pFrom));
351 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
352 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
353 358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
354 359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Append the second blob onto the end of the first blob and reset the
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** second blob.
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** second blob. If the first blob (pTo) is NULL, then the content
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the second blob is written to stdout.
356 362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
357 363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void blob_append_xfer(Blob *pTo, Blob *pFrom){
358 364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(pTo, blob_buffer(pFrom), blob_size(pFrom));
359 365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(pFrom);
360 366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -886,34 +892,31 @@
886 892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nToken && blob_token(pIn, &aToken[i]); i++){}
887 893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return i;
888 894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
889 895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
890 896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Do printf-style string rendering and append the results to a blob.
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Do printf-style string rendering and append the results to a blob. Or
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if pBlob==0, do printf-style string rendering directly to stdout.
892 899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
893 900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The blob_appendf() version sets the BLOBFLAG_NotSQL bit in Blob.blobFlags
894 901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** whereas blob_append_sql() does not.
895 902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
896 903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void blob_appendf(Blob *pBlob, const char *zFormat, ...){
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pBlob ){
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- va_list ap;
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- va_start(ap, zFormat);
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- vxprintf(pBlob, zFormat, ap);
901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- va_end(ap);
902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pBlob->blobFlags |= BLOBFLAG_NotSQL;
903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ va_list ap;
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ va_start(ap, zFormat);
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ vxprintf(pBlob, zFormat, ap);
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ va_end(ap);
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pBlob ) pBlob->blobFlags |= BLOBFLAG_NotSQL;
904 909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
905 910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void blob_append_sql(Blob *pBlob, const char *zFormat, ...){
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pBlob ){
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- va_list ap;
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- va_start(ap, zFormat);
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- vxprintf(pBlob, zFormat, ap);
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- va_end(ap);
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ va_list ap;
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ va_start(ap, zFormat);
913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ vxprintf(pBlob, zFormat, ap);
914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ va_end(ap);
912 915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
913 916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void blob_vappendf(Blob *pBlob, const char *zFormat, va_list ap){
914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pBlob ) vxprintf(pBlob, zFormat, ap);
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ vxprintf(pBlob, zFormat, ap);
915 918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
916 919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
917 920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
918 921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Initialize a blob to the data on an input channel. Return
919 922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the number of bytes read into the blob. Any prior content
920 923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!