Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Enhance the blob_append(), blob_appendf(), blob_append_char(), and similar interfaces such that if the Blob pointer in the first argument is NULL, the result is written directly to stdout. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
3a561322cafbc337742d50078fa49072 |
| User & Date: | drh 2021-09-07 12:51:22.003 |
References
|
2021-09-08
| ||
| 01:01 | Fix the /vpatch webpage output, apparently broken by check-in [3a561322cafbc337]. [forum:/forumpost/2a0e4c729e|Forum post 2a0e4c729e]. ... (check-in: ebcad739e8 user: drh tags: trunk) | |
Context
|
2021-09-07
| ||
| 13:29 | Take advantage of the new pBlob==NULL capabilities in blob_appendf() to simplify some of the diff logic. ... (check-in: 590e01dbdd user: drh tags: trunk) | |
| 12:51 | Enhance the blob_append(), blob_appendf(), blob_append_char(), and similar interfaces such that if the Blob pointer in the first argument is NULL, the result is written directly to stdout. ... (check-in: 3a561322ca user: drh tags: trunk) | |
| 12:18 | Simplify the interface to the internal diff_file() routine. ... (check-in: db034a5a6c user: drh tags: trunk) | |
Changes
Changes to src/blob.c.
| ︙ | ︙ | |||
273 274 275 276 277 278 279 | pBlob->aData = (char*)zEmpty; pBlob->iCursor = 0; pBlob->blobFlags = 0; pBlob->xRealloc = blobReallocStatic; } /* | | > < > > | | < | < > | | | > > > > | < | | > | | | > | 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 |
pBlob->aData = (char*)zEmpty;
pBlob->iCursor = 0;
pBlob->blobFlags = 0;
pBlob->xRealloc = blobReallocStatic;
}
/*
** Append text or data to the end of a blob. Or, if pBlob==NULL, send
** the text to standard output.
**
** If nData<0 then output all of aData up to the first 0x00 byte.
**
** Use the blob_append() routine in all application code. The blob_append()
** routine is faster, but blob_append_full() handles all the corner cases.
** The blob_append() routine automatically calls blob_append_full() if
** necessary.
*/
static void blob_append_full(Blob *pBlob, const char *aData, int nData){
sqlite3_int64 nNew;
/* assert( aData!=0 || nData==0 ); // omitted for speed */
/* blob_is_init(pBlob); // omitted for speed */
if( nData<0 ) nData = strlen(aData);
if( nData==0 ) return;
if( pBlob==0 ){
fossil_puts(aData, 0, nData);
return;
}
nNew = pBlob->nUsed;
nNew += nData;
if( nNew >= pBlob->nAlloc ){
nNew += pBlob->nAlloc;
nNew += 100;
if( nNew>=0x7fff0000 ){
blob_panic();
}
pBlob->xRealloc(pBlob, (int)nNew);
if( pBlob->nUsed + nData >= pBlob->nAlloc ){
blob_panic();
}
}
memcpy(&pBlob->aData[pBlob->nUsed], aData, nData);
pBlob->nUsed += nData;
pBlob->aData[pBlob->nUsed] = 0; /* Blobs are always nul-terminated */
}
void blob_append(Blob *pBlob, const char *aData, int nData){
sqlite3_int64 nUsed;
/* assert( aData!=0 || nData==0 ); // omitted for speed */
if( nData<=0 || pBlob==0 || pBlob->nUsed + nData >= pBlob->nAlloc ){
blob_append_full(pBlob, aData, nData);
return;
}
nUsed = pBlob->nUsed;
pBlob->nUsed += nData;
pBlob->aData[pBlob->nUsed] = 0;
memcpy(&pBlob->aData[nUsed], aData, nData);
}
/*
** Append a string literal to a blob.
*/
#if INTERFACE
#define blob_append_string(BLOB,STR) blob_append(BLOB,STR,sizeof(STR)-1)
#endif
/*
** Append a single character to the blob. If pBlob is zero then the
** character is written directly to stdout.
*/
void blob_append_char(Blob *pBlob, char c){
if( pBlob==0 || pBlob->nUsed+1 >= pBlob->nAlloc ){
blob_append_full(pBlob, &c, 1);
}else{
pBlob->aData[pBlob->nUsed++] = c;
}
}
/*
** Copy a blob. pTo is reinitialized to be a copy of pFrom.
*/
void blob_copy(Blob *pTo, Blob *pFrom){
blob_is_init(pFrom);
blob_zero(pTo);
blob_append(pTo, blob_buffer(pFrom), blob_size(pFrom));
}
/*
** Append the second blob onto the end of the first blob and reset the
** second blob. If the first blob (pTo) is NULL, then the content
** of the second blob is written to stdout.
*/
void blob_append_xfer(Blob *pTo, Blob *pFrom){
blob_append(pTo, blob_buffer(pFrom), blob_size(pFrom));
blob_reset(pFrom);
}
/*
|
| ︙ | ︙ | |||
884 885 886 887 888 889 890 |
int blob_tokenize(Blob *pIn, Blob *aToken, int nToken){
int i;
for(i=0; i<nToken && blob_token(pIn, &aToken[i]); i++){}
return i;
}
/*
| | > < | | | | | | < < | | | | | < | | 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 |
int blob_tokenize(Blob *pIn, Blob *aToken, int nToken){
int i;
for(i=0; i<nToken && blob_token(pIn, &aToken[i]); i++){}
return i;
}
/*
** Do printf-style string rendering and append the results to a blob. Or
** if pBlob==0, do printf-style string rendering directly to stdout.
**
** The blob_appendf() version sets the BLOBFLAG_NotSQL bit in Blob.blobFlags
** whereas blob_append_sql() does not.
*/
void blob_appendf(Blob *pBlob, const char *zFormat, ...){
va_list ap;
va_start(ap, zFormat);
vxprintf(pBlob, zFormat, ap);
va_end(ap);
if( pBlob ) pBlob->blobFlags |= BLOBFLAG_NotSQL;
}
void blob_append_sql(Blob *pBlob, const char *zFormat, ...){
va_list ap;
va_start(ap, zFormat);
vxprintf(pBlob, zFormat, ap);
va_end(ap);
}
void blob_vappendf(Blob *pBlob, const char *zFormat, va_list ap){
vxprintf(pBlob, zFormat, ap);
}
/*
** Initialize a blob to the data on an input channel. Return
** the number of bytes read into the blob. Any prior content
** of the blob is discarded, not freed.
*/
|
| ︙ | ︙ |
Changes to src/printf.c.
| ︙ | ︙ | |||
956 957 958 959 960 961 962 | ** On windows, transform the output into the current terminal encoding ** if the output is going to the screen. If output is redirected into ** a file, no translation occurs. Switch output mode to binary to ** properly process line-endings, make sure to switch the mode back to ** text when done. ** No translation ever occurs on unix. */ | | < | 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 |
** On windows, transform the output into the current terminal encoding
** if the output is going to the screen. If output is redirected into
** a file, no translation occurs. Switch output mode to binary to
** properly process line-endings, make sure to switch the mode back to
** text when done.
** No translation ever occurs on unix.
*/
void fossil_puts(const char *z, int toStdErr, int n){
FILE* out = (toStdErr ? stderr : stdout);
if( n==0 ) return;
assert( toStdErr==0 || toStdErr==1 );
if( toStdErr==0 ) stdoutAtBOL = (z[n-1]=='\n');
#if defined(_WIN32)
if( fossil_utf8_to_console(z, n, toStdErr) >= 0 ){
return;
}
|
| ︙ | ︙ | |||
982 983 984 985 986 987 988 |
/*
** Force the standard output cursor to move to the beginning
** of a line, if it is not there already.
*/
int fossil_force_newline(void){
if( g.cgiOutput==0 && stdoutAtBOL==0 ){
| | | 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 |
/*
** Force the standard output cursor to move to the beginning
** of a line, if it is not there already.
*/
int fossil_force_newline(void){
if( g.cgiOutput==0 && stdoutAtBOL==0 ){
fossil_puts("\n", 0, 1);
return 1;
}
return 0;
}
/*
** Indicate that the cursor has moved to the start of a line by means
|
| ︙ | ︙ | |||
1007 1008 1009 1010 1011 1012 1013 |
*/
void fossil_print(const char *zFormat, ...){
va_list ap;
va_start(ap, zFormat);
if( g.cgiOutput ){
cgi_vprintf(zFormat, ap);
}else{
| < | < < < | < < | | 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 |
*/
void fossil_print(const char *zFormat, ...){
va_list ap;
va_start(ap, zFormat);
if( g.cgiOutput ){
cgi_vprintf(zFormat, ap);
}else{
vxprintf(0, zFormat, ap);
}
va_end(ap);
}
void fossil_vprint(const char *zFormat, va_list ap){
if( g.cgiOutput ){
cgi_vprintf(zFormat, ap);
}else{
vxprintf(0, zFormat, ap);
}
}
/*
** Print a trace message on standard error.
*/
void fossil_trace(const char *zFormat, ...){
va_list ap;
Blob b;
va_start(ap, zFormat);
b = empty_blob;
vxprintf(&b, zFormat, ap);
fossil_puts(blob_buffer(&b), 1, blob_size(&b));
blob_reset(&b);
va_end(ap);
}
/*
** Write a message to the error log, if the error log filename is
** defined.
|
| ︙ | ︙ |
Changes to src/wikiformat.c.
| ︙ | ︙ | |||
2358 2359 2360 2361 2362 2363 2364 |
int i;
for(i=2; i<g.argc; i++){
blob_read_from_file(&in, g.argv[i], ExtFILE);
blob_zero(&out);
htmlTidy(blob_str(&in), &out);
blob_reset(&in);
| | | 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 |
int i;
for(i=2; i<g.argc; i++){
blob_read_from_file(&in, g.argv[i], ExtFILE);
blob_zero(&out);
htmlTidy(blob_str(&in), &out);
blob_reset(&in);
fossil_puts(blob_buffer(&out), 0, blob_size(&out));
blob_reset(&out);
}
}
/*
** Remove all HTML markup from the input text. The output written into
** pOut is pure text.
|
| ︙ | ︙ | |||
2485 2486 2487 2488 2489 2490 2491 |
int i;
for(i=2; i<g.argc; i++){
blob_read_from_file(&in, g.argv[i], ExtFILE);
blob_zero(&out);
html_to_plaintext(blob_str(&in), &out);
blob_reset(&in);
| | | 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 |
int i;
for(i=2; i<g.argc; i++){
blob_read_from_file(&in, g.argv[i], ExtFILE);
blob_zero(&out);
html_to_plaintext(blob_str(&in), &out);
blob_reset(&in);
fossil_puts(blob_buffer(&out), 0, blob_size(&out));
blob_reset(&out);
}
}
/****************************************************************************
** safe-html:
**
|
| ︙ | ︙ |