ali@94: #ifndef COUNTERS_H ali@94: #define COUNTERS_H ali@94: ali@94: #include ali@94: ali@123: #define COUNTERS_ERROR counters_error_quark() ali@123: ali@123: typedef enum ali@123: { ali@123: COUNTERS_ERROR_FAILED, /* Generic failure */ ali@123: } CountersError; ali@123: ali@103: /* Special counters live in the private use area */ ali@103: enum { ali@103: COUNTER_ILLUSTRATION=0xE000, ali@103: NO_SPECIAL_COUNTERS ali@103: }; ali@103: ali@123: typedef enum { ali@123: OPENING_QUOTE, ali@123: CLOSING_QUOTE, ali@123: NEUTRAL_QUOTE, ali@123: INVALID_QUOTE ali@123: } QuoteClass; ali@123: ali@123: #define QUOTE_CLASS(c) \ ali@123: (((c)==CHAR_RD_QUOTE || (c)==CHAR_RS_QUOTE)?CLOSING_QUOTE: \ ali@123: ((c)==CHAR_LD_QUOTE || (c)==CHAR_LS_QUOTE || (c)==CHAR_OPEN_SQUOTE)?\ ali@123: OPENING_QUOTE:((c)==CHAR_DQUOTE || (c)==CHAR_SQUOTE)?NEUTRAL_QUOTE:\ ali@123: INVALID_QUOTE) ali@123: ali@94: struct counters { ali@94: GTree *matching; ali@94: int c_unders; ali@123: GSList *open_quotes; ali@94: }; ali@94: ali@123: GQuark counters_error_quark(void); ali@123: gboolean innermost_quote_matches(struct counters *counters,gunichar ch); ali@123: gboolean count_quote(struct counters *counters,gunichar ch,QuoteClass klass, ali@123: GError **err); ali@94: void increment_matching(struct counters *counters,gunichar ch,gboolean open); ali@94: int matching_count(const struct counters *counters,gunichar ch,gboolean open); ali@94: int matching_difference(const struct counters *counters,gunichar ch); ali@103: void counters_reset(struct counters *counters); ali@94: void counters_destroy(struct counters *counters); ali@94: ali@94: #endif /* COUNTERS_H */