diff -r adc06e9e8470 -r c13989a152ab bookloupe/pending.c --- a/bookloupe/pending.c Mon Sep 23 21:18:27 2013 +0100 +++ b/bookloupe/pending.c Thu Sep 26 07:06:15 2013 +0100 @@ -1,6 +1,7 @@ #include #include #include +#include #include "bookloupe.h" #include "pending.h" @@ -15,20 +16,9 @@ void print_pending(const char *aline,const char *parastart, struct pending *pending) { - const char *s; - gunichar c; if (aline) - { - s=aline; - while (*s==' ') - s++; - c=g_utf8_get_char(s); - } - else - { - s=NULL; - c='\0'; - } + while (g_unichar_isspace(g_utf8_get_char(aline))) + aline=g_utf8_next_char(aline); if (pending->illustration.warning_text) { if (aline) @@ -54,7 +44,8 @@ } if (pending->dquote) { - if (c!=CHAR_DQUOTE || pswit[QPARA_SWITCH]) + if (!pending->continuing_quote || !aline || + !g_str_has_prefix(aline,pending->continuing_quote)) { if (!pswit[OVERVIEW_SWITCH]) { @@ -70,7 +61,8 @@ } if (pending->squote) { - if (!CHAR_IS_SQUOTE(c) || pswit[QPARA_SWITCH] || pending->squot) + if (!pending->continuing_quote || + !g_str_has_prefix(aline,pending->continuing_quote)) { if (!pswit[OVERVIEW_SWITCH]) { @@ -84,6 +76,8 @@ g_free(pending->squote); pending->squote=NULL; } + g_free(pending->continuing_quote); + pending->continuing_quote=NULL; if (pending->rbrack) { if (!pswit[OVERVIEW_SWITCH]) @@ -159,34 +153,58 @@ * quotes on _every_ paragraph, whether the next begins with a * quote or not. */ -void check_for_mismatched_quotes(const struct counters *counters, +void check_for_mismatched_quotes(struct counters *counters, struct pending *pending) { - int squote_straight,squote_curved,difference; - if (counters->quot%2) + int quote_straight,quote_curved,difference; + quote_straight=matching_difference(counters,CHAR_DQUOTE); + quote_curved=matching_difference(counters,CHAR_LD_QUOTE); + if (quote_straight || quote_curved) + { pending->dquote= g_strdup_printf(" Line %ld - Mismatched quotes",linecnt); + if (pswit[QPARA_SWITCH] || quote_curved && quote_curved!=1 || + quote_straight && quote_curved) + /* + * Flag it to be noted regardless of the + * first line of the next para. + */ + pending->continuing_quote=NULL; + else if (quote_straight) + pending->continuing_quote=utf8_strnfill(quote_straight,CHAR_DQUOTE); + else + pending->continuing_quote=utf8_strnfill(quote_curved,CHAR_LD_QUOTE); + } if (pswit[SQUOTE_SWITCH]) { if (matching_count(counters,CHAR_SQUOTE,TRUE)) - squote_straight=matching_difference(counters,CHAR_SQUOTE); + quote_straight=matching_difference(counters,CHAR_SQUOTE); else - squote_straight=0; + quote_straight=0; if (matching_count(counters,CHAR_LS_QUOTE,TRUE)) - squote_curved=matching_difference(counters,CHAR_LS_QUOTE); + quote_curved=matching_difference(counters,CHAR_LS_QUOTE); else - squote_curved=0; - if (squote_straight || squote_curved) + quote_curved=0; + if (quote_straight || quote_curved) pending->squote= g_strdup_printf(" Line %ld - Mismatched singlequotes?", linecnt); - if (squote_straight && squote_straight!=1 || - squote_curved && squote_curved!=1) + if (pending->continuing_quote) + { /* * Flag it to be noted regardless of the - * first char of the next para. + * first line of the next para. */ - pending->squot=1; + g_free(pending->continuing_quote); + pending->continuing_quote=NULL; + } + if (pswit[QPARA_SWITCH] || quote_straight && quote_straight!=1 || + quote_curved && quote_curved!=1 || quote_straight && quote_curved) + pending->continuing_quote=NULL; + else if (quote_straight) + pending->continuing_quote=utf8_strnfill(quote_straight,CHAR_SQUOTE); + else + pending->continuing_quote=utf8_strnfill(quote_curved,CHAR_LS_QUOTE); } difference=matching_difference(counters,COUNTER_ILLUSTRATION); if (difference)