Fossil SCM
Identical lines in diff output should never use the "|" comparison mark.
Commit
99f93d9231c604434446f7b617c70b45ebb357cd2d26fdc2c6f79a4364c8fdde
Parent
6decc47add6d6f7…
1 file changed
+20
-16
+20
-16
| --- src/diff.c | ||
| +++ src/diff.c | ||
| @@ -253,11 +253,11 @@ | ||
| 253 | 253 | } |
| 254 | 254 | |
| 255 | 255 | /* |
| 256 | 256 | ** Return zero if two DLine elements are identical. |
| 257 | 257 | */ |
| 258 | -static int same_dline(const DLine *pA, const DLine *pB){ | |
| 258 | +static int compare_dline(const DLine *pA, const DLine *pB){ | |
| 259 | 259 | if( pA->h!=pB->h ) return 1; |
| 260 | 260 | return memcmp(pA->z,pB->z, pA->h&LENGTH_MASK); |
| 261 | 261 | } |
| 262 | 262 | |
| 263 | 263 | /* |
| @@ -264,11 +264,11 @@ | ||
| 264 | 264 | ** Return zero if two DLine elements are identical, ignoring |
| 265 | 265 | ** all whitespace. The indent field of pA/pB already points |
| 266 | 266 | ** to the first non-space character in the string. |
| 267 | 267 | */ |
| 268 | 268 | |
| 269 | -static int same_dline_ignore_allws(const DLine *pA, const DLine *pB){ | |
| 269 | +static int compare_dline_ignore_allws(const DLine *pA, const DLine *pB){ | |
| 270 | 270 | int a = pA->indent, b = pB->indent; |
| 271 | 271 | if( pA->h==pB->h ){ |
| 272 | 272 | while( a<pA->n || b<pB->n ){ |
| 273 | 273 | if( a<pA->n && b<pB->n && pA->z[a++] != pB->z[b++] ) return 1; |
| 274 | 274 | while( a<pA->n && fossil_isspace(pA->z[a])) ++a; |
| @@ -890,11 +890,11 @@ | ||
| 890 | 890 | blob_appendf(p->pOut, "INSERT %8d %.*s\n", |
| 891 | 891 | p->lnRight, (int)pLine->n, pLine->z); |
| 892 | 892 | } |
| 893 | 893 | static void dfdebugDelete(DiffBuilder *p, const DLine *pLine){ |
| 894 | 894 | p->lnLeft++; |
| 895 | - blob_appendf(p->pOut, "DELETE %8u %.*s\n", | |
| 895 | + blob_appendf(p->pOut, "DELETE %8u %.*s\n", | |
| 896 | 896 | p->lnLeft, (int)pLine->n, pLine->z); |
| 897 | 897 | } |
| 898 | 898 | static void dfdebugReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){ |
| 899 | 899 | p->lnLeft++; |
| 900 | 900 | p->lnRight++; |
| @@ -907,41 +907,43 @@ | ||
| 907 | 907 | int i, j; |
| 908 | 908 | int x; |
| 909 | 909 | LineChange chng; |
| 910 | 910 | p->lnLeft++; |
| 911 | 911 | p->lnRight++; |
| 912 | - blob_appendf(p->pOut, "EDIT %8u %.*s\n", | |
| 912 | + blob_appendf(p->pOut, "EDIT %8u %.*s\n", | |
| 913 | 913 | p->lnLeft, (int)pX->n, pX->z); |
| 914 | 914 | oneLineChange(pX, pY, &chng); |
| 915 | 915 | for(i=x=0; i<chng.n; i++){ |
| 916 | 916 | int ofst = chng.a[i].iStart1; |
| 917 | 917 | int len = chng.a[i].iLen1; |
| 918 | 918 | if( len ){ |
| 919 | - if( x==0 ){ blob_appendf(p->pOut, "%*s", 25, ""); } | |
| 919 | + char c = '0' + i; | |
| 920 | + if( x==0 ){ blob_appendf(p->pOut, "%*s", 26, ""); } | |
| 920 | 921 | while( ofst > x ){ |
| 921 | 922 | if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, ' '); |
| 922 | 923 | x++; |
| 923 | 924 | } |
| 924 | 925 | for(j=0; j<len; j++, x++){ |
| 925 | - if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, '^'); | |
| 926 | + if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, c); | |
| 926 | 927 | } |
| 927 | 928 | } |
| 928 | 929 | } |
| 929 | 930 | if( x ) blob_append_char(p->pOut, '\n'); |
| 930 | - blob_appendf(p->pOut, " %8u %.*s\n", | |
| 931 | + blob_appendf(p->pOut, " %8u %.*s\n", | |
| 931 | 932 | p->lnRight, (int)pY->n, pY->z); |
| 932 | 933 | for(i=x=0; i<chng.n; i++){ |
| 933 | 934 | int ofst = chng.a[i].iStart2; |
| 934 | 935 | int len = chng.a[i].iLen2; |
| 935 | 936 | if( len ){ |
| 936 | - if( x==0 ){ blob_appendf(p->pOut, "%*s", 25, ""); } | |
| 937 | + char c = '0' + i; | |
| 938 | + if( x==0 ){ blob_appendf(p->pOut, "%*s", 26, ""); } | |
| 937 | 939 | while( ofst > x ){ |
| 938 | 940 | if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, ' '); |
| 939 | 941 | x++; |
| 940 | 942 | } |
| 941 | 943 | for(j=0; j<len; j++, x++){ |
| 942 | - if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, '^'); | |
| 944 | + if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, c); | |
| 943 | 945 | } |
| 944 | 946 | } |
| 945 | 947 | } |
| 946 | 948 | if( x ) blob_append_char(p->pOut, '\n'); |
| 947 | 949 | } |
| @@ -1210,12 +1212,10 @@ | ||
| 1210 | 1212 | } |
| 1211 | 1213 | static void dfunifiedStartRow(DiffBuilder *p){ |
| 1212 | 1214 | if( blob_size(&p->aCol[0])>0 ) return; |
| 1213 | 1215 | blob_appendf(p->pOut,"<tr id=\"chunk%d\">" |
| 1214 | 1216 | "<td class=\"diffln difflnl\"><pre>\n", ++nChunk); |
| 1215 | - p->eState = 0; | |
| 1216 | - p->nPending = 0; | |
| 1217 | 1217 | } |
| 1218 | 1218 | static void dfunifiedSkip(DiffBuilder *p, unsigned int n, int isFinal){ |
| 1219 | 1219 | dfunifiedFinishRow(p); |
| 1220 | 1220 | blob_append(p->pOut, "<tr><td class=\"diffln difflne\">" |
| 1221 | 1221 | "︙</td><td></td><td></td></tr>\n", -1); |
| @@ -2072,11 +2072,15 @@ | ||
| 2072 | 2072 | b++; |
| 2073 | 2073 | break; |
| 2074 | 2074 | } |
| 2075 | 2075 | case 3: { |
| 2076 | 2076 | /* The left line is changed into the right line */ |
| 2077 | - pBuilder->xEdit(pBuilder, &A[a], &B[b]); | |
| 2077 | + if( compare_dline(&A[a], &B[b])==0 ){ | |
| 2078 | + pBuilder->xCommon(pBuilder, &A[a]); | |
| 2079 | + }else{ | |
| 2080 | + pBuilder->xEdit(pBuilder, &A[a], &B[b]); | |
| 2081 | + } | |
| 2078 | 2082 | assert( ma>0 && mb>0 ); |
| 2079 | 2083 | ma--; |
| 2080 | 2084 | mb--; |
| 2081 | 2085 | a++; |
| 2082 | 2086 | b++; |
| @@ -2603,13 +2607,13 @@ | ||
| 2603 | 2607 | blob_to_utf8_no_bom(pB_Blob, 0); |
| 2604 | 2608 | |
| 2605 | 2609 | /* Prepare the input files */ |
| 2606 | 2610 | memset(&c, 0, sizeof(c)); |
| 2607 | 2611 | if( (diffFlags & DIFF_IGNORE_ALLWS)==DIFF_IGNORE_ALLWS ){ |
| 2608 | - c.xDiffer = same_dline_ignore_allws; | |
| 2612 | + c.xDiffer = compare_dline_ignore_allws; | |
| 2609 | 2613 | }else{ |
| 2610 | - c.xDiffer = same_dline; | |
| 2614 | + c.xDiffer = compare_dline; | |
| 2611 | 2615 | } |
| 2612 | 2616 | c.aFrom = break_into_lines(blob_str(pA_Blob), blob_size(pA_Blob), |
| 2613 | 2617 | &c.nFrom, diffFlags); |
| 2614 | 2618 | c.aTo = break_into_lines(blob_str(pB_Blob), blob_size(pB_Blob), |
| 2615 | 2619 | &c.nTo, diffFlags); |
| @@ -2870,13 +2874,13 @@ | ||
| 2870 | 2874 | static int annotation_start(Annotator *p, Blob *pInput, u64 diffFlags){ |
| 2871 | 2875 | int i; |
| 2872 | 2876 | |
| 2873 | 2877 | memset(p, 0, sizeof(*p)); |
| 2874 | 2878 | if( (diffFlags & DIFF_IGNORE_ALLWS)==DIFF_IGNORE_ALLWS ){ |
| 2875 | - p->c.xDiffer = same_dline_ignore_allws; | |
| 2879 | + p->c.xDiffer = compare_dline_ignore_allws; | |
| 2876 | 2880 | }else{ |
| 2877 | - p->c.xDiffer = same_dline; | |
| 2881 | + p->c.xDiffer = compare_dline; | |
| 2878 | 2882 | } |
| 2879 | 2883 | p->c.aTo = break_into_lines(blob_str(pInput), blob_size(pInput),&p->c.nTo, |
| 2880 | 2884 | diffFlags); |
| 2881 | 2885 | if( p->c.aTo==0 ){ |
| 2882 | 2886 | return 1; |
| 2883 | 2887 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -253,11 +253,11 @@ | |
| 253 | } |
| 254 | |
| 255 | /* |
| 256 | ** Return zero if two DLine elements are identical. |
| 257 | */ |
| 258 | static int same_dline(const DLine *pA, const DLine *pB){ |
| 259 | if( pA->h!=pB->h ) return 1; |
| 260 | return memcmp(pA->z,pB->z, pA->h&LENGTH_MASK); |
| 261 | } |
| 262 | |
| 263 | /* |
| @@ -264,11 +264,11 @@ | |
| 264 | ** Return zero if two DLine elements are identical, ignoring |
| 265 | ** all whitespace. The indent field of pA/pB already points |
| 266 | ** to the first non-space character in the string. |
| 267 | */ |
| 268 | |
| 269 | static int same_dline_ignore_allws(const DLine *pA, const DLine *pB){ |
| 270 | int a = pA->indent, b = pB->indent; |
| 271 | if( pA->h==pB->h ){ |
| 272 | while( a<pA->n || b<pB->n ){ |
| 273 | if( a<pA->n && b<pB->n && pA->z[a++] != pB->z[b++] ) return 1; |
| 274 | while( a<pA->n && fossil_isspace(pA->z[a])) ++a; |
| @@ -890,11 +890,11 @@ | |
| 890 | blob_appendf(p->pOut, "INSERT %8d %.*s\n", |
| 891 | p->lnRight, (int)pLine->n, pLine->z); |
| 892 | } |
| 893 | static void dfdebugDelete(DiffBuilder *p, const DLine *pLine){ |
| 894 | p->lnLeft++; |
| 895 | blob_appendf(p->pOut, "DELETE %8u %.*s\n", |
| 896 | p->lnLeft, (int)pLine->n, pLine->z); |
| 897 | } |
| 898 | static void dfdebugReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){ |
| 899 | p->lnLeft++; |
| 900 | p->lnRight++; |
| @@ -907,41 +907,43 @@ | |
| 907 | int i, j; |
| 908 | int x; |
| 909 | LineChange chng; |
| 910 | p->lnLeft++; |
| 911 | p->lnRight++; |
| 912 | blob_appendf(p->pOut, "EDIT %8u %.*s\n", |
| 913 | p->lnLeft, (int)pX->n, pX->z); |
| 914 | oneLineChange(pX, pY, &chng); |
| 915 | for(i=x=0; i<chng.n; i++){ |
| 916 | int ofst = chng.a[i].iStart1; |
| 917 | int len = chng.a[i].iLen1; |
| 918 | if( len ){ |
| 919 | if( x==0 ){ blob_appendf(p->pOut, "%*s", 25, ""); } |
| 920 | while( ofst > x ){ |
| 921 | if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, ' '); |
| 922 | x++; |
| 923 | } |
| 924 | for(j=0; j<len; j++, x++){ |
| 925 | if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, '^'); |
| 926 | } |
| 927 | } |
| 928 | } |
| 929 | if( x ) blob_append_char(p->pOut, '\n'); |
| 930 | blob_appendf(p->pOut, " %8u %.*s\n", |
| 931 | p->lnRight, (int)pY->n, pY->z); |
| 932 | for(i=x=0; i<chng.n; i++){ |
| 933 | int ofst = chng.a[i].iStart2; |
| 934 | int len = chng.a[i].iLen2; |
| 935 | if( len ){ |
| 936 | if( x==0 ){ blob_appendf(p->pOut, "%*s", 25, ""); } |
| 937 | while( ofst > x ){ |
| 938 | if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, ' '); |
| 939 | x++; |
| 940 | } |
| 941 | for(j=0; j<len; j++, x++){ |
| 942 | if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, '^'); |
| 943 | } |
| 944 | } |
| 945 | } |
| 946 | if( x ) blob_append_char(p->pOut, '\n'); |
| 947 | } |
| @@ -1210,12 +1212,10 @@ | |
| 1210 | } |
| 1211 | static void dfunifiedStartRow(DiffBuilder *p){ |
| 1212 | if( blob_size(&p->aCol[0])>0 ) return; |
| 1213 | blob_appendf(p->pOut,"<tr id=\"chunk%d\">" |
| 1214 | "<td class=\"diffln difflnl\"><pre>\n", ++nChunk); |
| 1215 | p->eState = 0; |
| 1216 | p->nPending = 0; |
| 1217 | } |
| 1218 | static void dfunifiedSkip(DiffBuilder *p, unsigned int n, int isFinal){ |
| 1219 | dfunifiedFinishRow(p); |
| 1220 | blob_append(p->pOut, "<tr><td class=\"diffln difflne\">" |
| 1221 | "︙</td><td></td><td></td></tr>\n", -1); |
| @@ -2072,11 +2072,15 @@ | |
| 2072 | b++; |
| 2073 | break; |
| 2074 | } |
| 2075 | case 3: { |
| 2076 | /* The left line is changed into the right line */ |
| 2077 | pBuilder->xEdit(pBuilder, &A[a], &B[b]); |
| 2078 | assert( ma>0 && mb>0 ); |
| 2079 | ma--; |
| 2080 | mb--; |
| 2081 | a++; |
| 2082 | b++; |
| @@ -2603,13 +2607,13 @@ | |
| 2603 | blob_to_utf8_no_bom(pB_Blob, 0); |
| 2604 | |
| 2605 | /* Prepare the input files */ |
| 2606 | memset(&c, 0, sizeof(c)); |
| 2607 | if( (diffFlags & DIFF_IGNORE_ALLWS)==DIFF_IGNORE_ALLWS ){ |
| 2608 | c.xDiffer = same_dline_ignore_allws; |
| 2609 | }else{ |
| 2610 | c.xDiffer = same_dline; |
| 2611 | } |
| 2612 | c.aFrom = break_into_lines(blob_str(pA_Blob), blob_size(pA_Blob), |
| 2613 | &c.nFrom, diffFlags); |
| 2614 | c.aTo = break_into_lines(blob_str(pB_Blob), blob_size(pB_Blob), |
| 2615 | &c.nTo, diffFlags); |
| @@ -2870,13 +2874,13 @@ | |
| 2870 | static int annotation_start(Annotator *p, Blob *pInput, u64 diffFlags){ |
| 2871 | int i; |
| 2872 | |
| 2873 | memset(p, 0, sizeof(*p)); |
| 2874 | if( (diffFlags & DIFF_IGNORE_ALLWS)==DIFF_IGNORE_ALLWS ){ |
| 2875 | p->c.xDiffer = same_dline_ignore_allws; |
| 2876 | }else{ |
| 2877 | p->c.xDiffer = same_dline; |
| 2878 | } |
| 2879 | p->c.aTo = break_into_lines(blob_str(pInput), blob_size(pInput),&p->c.nTo, |
| 2880 | diffFlags); |
| 2881 | if( p->c.aTo==0 ){ |
| 2882 | return 1; |
| 2883 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -253,11 +253,11 @@ | |
| 253 | } |
| 254 | |
| 255 | /* |
| 256 | ** Return zero if two DLine elements are identical. |
| 257 | */ |
| 258 | static int compare_dline(const DLine *pA, const DLine *pB){ |
| 259 | if( pA->h!=pB->h ) return 1; |
| 260 | return memcmp(pA->z,pB->z, pA->h&LENGTH_MASK); |
| 261 | } |
| 262 | |
| 263 | /* |
| @@ -264,11 +264,11 @@ | |
| 264 | ** Return zero if two DLine elements are identical, ignoring |
| 265 | ** all whitespace. The indent field of pA/pB already points |
| 266 | ** to the first non-space character in the string. |
| 267 | */ |
| 268 | |
| 269 | static int compare_dline_ignore_allws(const DLine *pA, const DLine *pB){ |
| 270 | int a = pA->indent, b = pB->indent; |
| 271 | if( pA->h==pB->h ){ |
| 272 | while( a<pA->n || b<pB->n ){ |
| 273 | if( a<pA->n && b<pB->n && pA->z[a++] != pB->z[b++] ) return 1; |
| 274 | while( a<pA->n && fossil_isspace(pA->z[a])) ++a; |
| @@ -890,11 +890,11 @@ | |
| 890 | blob_appendf(p->pOut, "INSERT %8d %.*s\n", |
| 891 | p->lnRight, (int)pLine->n, pLine->z); |
| 892 | } |
| 893 | static void dfdebugDelete(DiffBuilder *p, const DLine *pLine){ |
| 894 | p->lnLeft++; |
| 895 | blob_appendf(p->pOut, "DELETE %8u %.*s\n", |
| 896 | p->lnLeft, (int)pLine->n, pLine->z); |
| 897 | } |
| 898 | static void dfdebugReplace(DiffBuilder *p, const DLine *pX, const DLine *pY){ |
| 899 | p->lnLeft++; |
| 900 | p->lnRight++; |
| @@ -907,41 +907,43 @@ | |
| 907 | int i, j; |
| 908 | int x; |
| 909 | LineChange chng; |
| 910 | p->lnLeft++; |
| 911 | p->lnRight++; |
| 912 | blob_appendf(p->pOut, "EDIT %8u %.*s\n", |
| 913 | p->lnLeft, (int)pX->n, pX->z); |
| 914 | oneLineChange(pX, pY, &chng); |
| 915 | for(i=x=0; i<chng.n; i++){ |
| 916 | int ofst = chng.a[i].iStart1; |
| 917 | int len = chng.a[i].iLen1; |
| 918 | if( len ){ |
| 919 | char c = '0' + i; |
| 920 | if( x==0 ){ blob_appendf(p->pOut, "%*s", 26, ""); } |
| 921 | while( ofst > x ){ |
| 922 | if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, ' '); |
| 923 | x++; |
| 924 | } |
| 925 | for(j=0; j<len; j++, x++){ |
| 926 | if( (pX->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, c); |
| 927 | } |
| 928 | } |
| 929 | } |
| 930 | if( x ) blob_append_char(p->pOut, '\n'); |
| 931 | blob_appendf(p->pOut, " %8u %.*s\n", |
| 932 | p->lnRight, (int)pY->n, pY->z); |
| 933 | for(i=x=0; i<chng.n; i++){ |
| 934 | int ofst = chng.a[i].iStart2; |
| 935 | int len = chng.a[i].iLen2; |
| 936 | if( len ){ |
| 937 | char c = '0' + i; |
| 938 | if( x==0 ){ blob_appendf(p->pOut, "%*s", 26, ""); } |
| 939 | while( ofst > x ){ |
| 940 | if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, ' '); |
| 941 | x++; |
| 942 | } |
| 943 | for(j=0; j<len; j++, x++){ |
| 944 | if( (pY->z[x]&0xc0)!=0x80 ) blob_append_char(p->pOut, c); |
| 945 | } |
| 946 | } |
| 947 | } |
| 948 | if( x ) blob_append_char(p->pOut, '\n'); |
| 949 | } |
| @@ -1210,12 +1212,10 @@ | |
| 1212 | } |
| 1213 | static void dfunifiedStartRow(DiffBuilder *p){ |
| 1214 | if( blob_size(&p->aCol[0])>0 ) return; |
| 1215 | blob_appendf(p->pOut,"<tr id=\"chunk%d\">" |
| 1216 | "<td class=\"diffln difflnl\"><pre>\n", ++nChunk); |
| 1217 | } |
| 1218 | static void dfunifiedSkip(DiffBuilder *p, unsigned int n, int isFinal){ |
| 1219 | dfunifiedFinishRow(p); |
| 1220 | blob_append(p->pOut, "<tr><td class=\"diffln difflne\">" |
| 1221 | "︙</td><td></td><td></td></tr>\n", -1); |
| @@ -2072,11 +2072,15 @@ | |
| 2072 | b++; |
| 2073 | break; |
| 2074 | } |
| 2075 | case 3: { |
| 2076 | /* The left line is changed into the right line */ |
| 2077 | if( compare_dline(&A[a], &B[b])==0 ){ |
| 2078 | pBuilder->xCommon(pBuilder, &A[a]); |
| 2079 | }else{ |
| 2080 | pBuilder->xEdit(pBuilder, &A[a], &B[b]); |
| 2081 | } |
| 2082 | assert( ma>0 && mb>0 ); |
| 2083 | ma--; |
| 2084 | mb--; |
| 2085 | a++; |
| 2086 | b++; |
| @@ -2603,13 +2607,13 @@ | |
| 2607 | blob_to_utf8_no_bom(pB_Blob, 0); |
| 2608 | |
| 2609 | /* Prepare the input files */ |
| 2610 | memset(&c, 0, sizeof(c)); |
| 2611 | if( (diffFlags & DIFF_IGNORE_ALLWS)==DIFF_IGNORE_ALLWS ){ |
| 2612 | c.xDiffer = compare_dline_ignore_allws; |
| 2613 | }else{ |
| 2614 | c.xDiffer = compare_dline; |
| 2615 | } |
| 2616 | c.aFrom = break_into_lines(blob_str(pA_Blob), blob_size(pA_Blob), |
| 2617 | &c.nFrom, diffFlags); |
| 2618 | c.aTo = break_into_lines(blob_str(pB_Blob), blob_size(pB_Blob), |
| 2619 | &c.nTo, diffFlags); |
| @@ -2870,13 +2874,13 @@ | |
| 2874 | static int annotation_start(Annotator *p, Blob *pInput, u64 diffFlags){ |
| 2875 | int i; |
| 2876 | |
| 2877 | memset(p, 0, sizeof(*p)); |
| 2878 | if( (diffFlags & DIFF_IGNORE_ALLWS)==DIFF_IGNORE_ALLWS ){ |
| 2879 | p->c.xDiffer = compare_dline_ignore_allws; |
| 2880 | }else{ |
| 2881 | p->c.xDiffer = compare_dline; |
| 2882 | } |
| 2883 | p->c.aTo = break_into_lines(blob_str(pInput), blob_size(pInput),&p->c.nTo, |
| 2884 | diffFlags); |
| 2885 | if( p->c.aTo==0 ){ |
| 2886 | return 1; |
| 2887 |