753 |
{ |
{ |
754 |
size_t match_size; |
size_t match_size; |
755 |
size_t match_offset; |
size_t match_offset; |
756 |
|
const char *mid = NULL; |
757 |
char *buf; /* XXX */ |
char *buf; /* XXX */ |
758 |
const char *ibeg; /* XXX */ |
const char *ibeg; /* XXX */ |
759 |
|
|
785 |
|
|
786 |
/* Avoid hanging on grep --color "" foo */ |
/* Avoid hanging on grep --color "" foo */ |
787 |
if (match_size == 0) |
if (match_size == 0) |
788 |
break; |
{ |
789 |
|
/* Make minimal progress; there may be further non-empty matches. */ |
790 |
if (only_matching) |
/* XXX - Could really advance by one whole multi-octet character. */ |
791 |
print_line_head(b, lim, SEP_CHAR_MATCH); |
match_size = 1; |
792 |
|
if (!mid) |
793 |
|
mid = beg; |
794 |
|
} |
795 |
else |
else |
796 |
{ |
{ |
797 |
PR_SGR_START(mlines_color); |
if (only_matching) |
798 |
fwrite (beg, sizeof (char), match_offset, stdout); |
print_line_head(b, lim, SEP_CHAR_MATCH); |
799 |
|
else |
800 |
|
{ |
801 |
|
PR_SGR_START(mlines_color); |
802 |
|
if (mid) |
803 |
|
{ |
804 |
|
fwrite (mid, sizeof (char), (beg - mid) + match_offset, stdout); |
805 |
|
mid = NULL; |
806 |
|
} |
807 |
|
else |
808 |
|
fwrite (beg, sizeof (char), match_offset, stdout); |
809 |
|
} |
810 |
|
|
811 |
|
PR_SGR_START_IF(grep_color); |
812 |
|
fwrite (b, sizeof (char), match_size, stdout); |
813 |
|
PR_SGR_END_IF(grep_color); |
814 |
|
if (only_matching) |
815 |
|
fputs("\n", stdout); |
816 |
} |
} |
|
|
|
|
PR_SGR_START_IF(grep_color); |
|
|
fwrite (b, sizeof (char), match_size, stdout); |
|
|
PR_SGR_END_IF(grep_color); |
|
|
if (only_matching) |
|
|
fputs("\n", stdout); |
|
817 |
beg = b + match_size; |
beg = b + match_size; |
818 |
ibeg += match_offset + match_size; /* XXX */ |
ibeg += match_offset + match_size; /* XXX */ |
819 |
} |
} |
823 |
|
|
824 |
if (only_matching) |
if (only_matching) |
825 |
beg = lim; |
beg = lim; |
826 |
|
else if (mid) |
827 |
|
beg = mid; |
828 |
|
|
829 |
return beg; |
return beg; |
830 |
} |
} |