@@ -29,11 +29,11 @@
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This macro is designed to return non-zero if the specified blob contains
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** data that MAY be binary in nature; otherwise, zero will be returned.
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define looks_like_binary(blob) \
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ((looks_like_utf8((blob), LOOK_BINARY) & LOOK_BINARY) != LOOK_NONE)
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ((looks_like_utf8((blob), LOOK_BINARY, 0) & LOOK_BINARY) != LOOK_NONE)
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
37 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Output flags for the looks_like_utf8() and looks_like_utf16() routines used
38 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to convey status information about the blob content.
39 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -114,46 +114,66 @@
114 114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function examines the contents of the blob until one of the flags
115 115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** specified in "stopFlags" is set.
116 116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
117 117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
************************************ WARNING **********************************
118 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int looks_like_utf8(const Blob *pContent, int stopFlags){
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int looks_like_utf8(const Blob *pContent, int stopFlags, int fVerbose){
120 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z = blob_buffer(pContent);
121 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int n = blob_size(pContent);
122 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int j, c, flags = LOOK_NONE; /* Assume UTF-8 text, prove otherwise */
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLine = 1;
123 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124 125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( n==0 ) return flags; /* Empty file -> text */
125 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c = *z;
126 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( c==0 ){
127 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_NUL; /* NUL character in a file -> binary */
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fVerbose ) fossil_print("NUL at start\n");
128 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( c=='\r' ){
129 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_CR;
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fVerbose ) fossil_print("CR at start\n");
130 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( n<=1 || z[1]!='\n' ){
131 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_LONE_CR; /* Not enough chars or next char not LF */
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fVerbose ) fossil_print("Lone CR at start\n");
132 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
133 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
134 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
j = (c!='\n');
135 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !j ) flags |= (LOOK_LF | LOOK_LONE_LF); /* Found LF as first char */
136 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( !(flags&stopFlags) && --n>0 ){
137 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int c2 = c;
138 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c = *++z; ++j;
139 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( c==0 ){
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fVerbose && !(flags&LOOK_NUL) ){
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("NUL on line %d\n", nLine);
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
140 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_NUL; /* NUL character in a file -> binary */
141 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( c=='\n' ){
142 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_LF;
143 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( c2=='\r' ){
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fVerbose && !(flags&LOOK_CRLF) ){
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("CRLF on line %d\n", nLine);
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
144 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= (LOOK_CR | LOOK_CRLF); /* Found LF preceded by CR */
145 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fVerbose && !(flags&LOOK_LONE_LF) ){
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("Lone LF on line %d\n", nLine);
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_LONE_LF;
147 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
148 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( j>LENGTH_MASK ){
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fVerbose && !(flags&LOOK_LONG) ){
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("Line %d is longer than %d bytes\n", nLine, j);
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
149 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_LONG; /* Very long line -> binary */
150 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ++nLine;
151 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
j = 0;
152 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( c=='\r' ){
153 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_CR;
154 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( n<=1 || z[1]!='\n' ){
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fVerbose && !(flags&LOOK_LONE_CR) ){
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("Lone CR on line %d\n", nLine);
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
155 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
flags |= LOOK_LONE_CR; /* Not enough chars or next char not LF */
156 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
157 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
158 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
159 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( n ){
@@ -404,10 +424,11 @@
404 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Options:
405 425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** -n|--limit N Repeat looks-like function N times, for
406 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** performance measurement. Default = 1
407 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** --utf8 Ignoring BOM and file size, force UTF-8 checking
408 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** --utf16 Ignoring BOM and file size, force UTF-16 checking
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** -v|--verbose Report the line numbers where each flag is first set
409 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
410 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** FILENAME is the name of a file to check for textual content in the UTF-8
411 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and/or UTF-16 encodings.
412 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
413 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void looks_like_utf_test_cmd(void){
@@ -418,10 +439,11 @@
418 439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int lookFlags = 0; /* output flags from looks_like_utf8/utf16() */
419 440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int bRevUtf16 = 0; /* non-zero -> UTF-16 byte order reversed */
420 441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fForceUtf8 = find_option("utf8",0,0)!=0;
421 442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fForceUtf16 = find_option("utf16",0,0)!=0;
422 443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCount = find_option("limit","n",1);
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fVerbose = find_option("verbose","v",0)!=0;
423 445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRepeat = 1;
424 446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
425 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc!=3 ) usage("FILENAME");
426 448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zCount ){
427 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nRepeat = atoi(zCount);
@@ -436,11 +458,11 @@
436 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fUnicode = could_be_utf16(&blob, 0) || fForceUtf16;
437 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
438 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fUnicode ){
439 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lookFlags = looks_like_utf16(&blob, bRevUtf16, 0);
440 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lookFlags = looks_like_utf8(&blob, 0) | invalid_utf8(&blob);
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lookFlags = looks_like_utf8(&blob, 0, fVerbose) | invalid_utf8(&blob);
442 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
443 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
444 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("File \"%s\" has %d bytes.\n",g.argv[2],blob_size(&blob));
445 467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("Starts with UTF-8 BOM: %s\n",fUtf8?"yes":"no");
446 468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("Starts with UTF-16 BOM: %s\n",
447 469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!