@@ -300,52 +300,33 @@ static uint32_t hash_line(const char *cp, size_t len)
300
300
static int fuzzy_matchlines (const char * s1 , size_t n1 ,
301
301
const char * s2 , size_t n2 )
302
302
{
303
- const char * last1 = s1 + n1 - 1 ;
304
- const char * last2 = s2 + n2 - 1 ;
305
- int result = 0 ;
303
+ const char * end1 = s1 + n1 ;
304
+ const char * end2 = s2 + n2 ;
306
305
307
306
/* ignore line endings */
308
- while ((* last1 == '\r' ) || (* last1 == '\n' ))
309
- last1 -- ;
310
- while ((* last2 == '\r' ) || (* last2 == '\n' ))
311
- last2 -- ;
312
-
313
- /* skip leading whitespaces, if both begin with whitespace */
314
- if (s1 <= last1 && s2 <= last2 && isspace (* s1 ) && isspace (* s2 )) {
315
- while (isspace (* s1 ) && (s1 <= last1 ))
316
- s1 ++ ;
317
- while (isspace (* s2 ) && (s2 <= last2 ))
318
- s2 ++ ;
319
- }
320
- /* early return if both lines are empty */
321
- if ((s1 > last1 ) && (s2 > last2 ))
322
- return 1 ;
323
- while (!result ) {
324
- result = * s1 ++ - * s2 ++ ;
325
- /*
326
- * Skip whitespace inside. We check for whitespace on
327
- * both buffers because we don't want "a b" to match
328
- * "ab"
329
- */
330
- if (isspace (* s1 ) && isspace (* s2 )) {
331
- while (isspace (* s1 ) && s1 <= last1 )
307
+ while (s1 < end1 && (end1 [-1 ] == '\r' || end1 [-1 ] == '\n' ))
308
+ end1 -- ;
309
+ while (s2 < end2 && (end2 [-1 ] == '\r' || end2 [-1 ] == '\n' ))
310
+ end2 -- ;
311
+
312
+ while (s1 < end1 && s2 < end2 ) {
313
+ if (isspace (* s1 )) {
314
+ /*
315
+ * Skip whitespace. We check on both buffers
316
+ * because we don't want "a b" to match "ab".
317
+ */
318
+ if (!isspace (* s2 ))
319
+ return 0 ;
320
+ while (s1 < end1 && isspace (* s1 ))
332
321
s1 ++ ;
333
- while (isspace ( * s2 ) && s2 <= last2 )
322
+ while (s2 < end2 && isspace ( * s2 ) )
334
323
s2 ++ ;
335
- }
336
- /*
337
- * If we reached the end on one side only,
338
- * lines don't match
339
- */
340
- if (
341
- ((s2 > last2 ) && (s1 <= last1 )) ||
342
- ((s1 > last1 ) && (s2 <= last2 )))
324
+ } else if (* s1 ++ != * s2 ++ )
343
325
return 0 ;
344
- if ((s1 > last1 ) && (s2 > last2 ))
345
- break ;
346
326
}
347
327
348
- return !result ;
328
+ /* If we reached the end on one side only, lines don't match. */
329
+ return s1 == end1 && s2 == end2 ;
349
330
}
350
331
351
332
static void add_line_info (struct image * img , const char * bol , size_t len , unsigned flag )
0 commit comments