1151497Sru// -*- C++ -*- 2151497Sru/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. 3151497Sru * 4151497Sru * mtsm.h 5151497Sru * 6151497Sru * written by Gaius Mulley (gaius@glam.ac.uk) 7151497Sru * 8151497Sru * provides a minimal troff state machine which is necessary to 9151497Sru * emit meta tags for the post-grohtml device driver. 10151497Sru */ 11151497Sru 12151497Sru/* 13151497SruThis file is part of groff. 14151497Sru 15151497Srugroff is free software; you can redistribute it and/or modify it under 16151497Sruthe terms of the GNU General Public License as published by the Free 17151497SruSoftware Foundation; either version 2, or (at your option) any later 18151497Sruversion. 19151497Sru 20151497Srugroff is distributed in the hope that it will be useful, but WITHOUT ANY 21151497SruWARRANTY; without even the implied warranty of MERCHANTABILITY or 22151497SruFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 23151497Srufor more details. 24151497Sru 25151497SruYou should have received a copy of the GNU General Public License along 26151497Sruwith groff; see the file COPYING. If not, write to the Free Software 27151497SruFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 28151497Sru 29151497Srustruct int_value { 30151497Sru int value; 31151497Sru int is_known; 32151497Sru int_value(); 33151497Sru ~int_value(); 34151497Sru void diff(FILE *, const char *, int_value); 35151497Sru int differs(int_value); 36151497Sru void set(int); 37151497Sru void unset(); 38151497Sru void set_if_unknown(int); 39151497Sru}; 40151497Sru 41151497Srustruct bool_value : public int_value { 42151497Sru bool_value(); 43151497Sru ~bool_value(); 44151497Sru void diff(FILE *, const char *, bool_value); 45151497Sru}; 46151497Sru 47151497Srustruct units_value : public int_value { 48151497Sru units_value(); 49151497Sru ~units_value(); 50151497Sru void diff(FILE *, const char *, units_value); 51151497Sru int differs(units_value); 52151497Sru void set(hunits); 53151497Sru}; 54151497Sru 55151497Srustruct string_value { 56151497Sru string value; 57151497Sru int is_known; 58151497Sru string_value(); 59151497Sru ~string_value(); 60151497Sru void diff(FILE *, const char *, string_value); 61151497Sru int differs(string_value); 62151497Sru void set(string); 63151497Sru void unset(); 64151497Sru}; 65151497Sru 66151497Sruenum bool_value_state { 67151497Sru MTSM_EOL, 68151497Sru MTSM_BR, 69151497Sru LAST_BOOL 70151497Sru}; 71151497Sruenum int_value_state { 72151497Sru MTSM_FI, 73151497Sru MTSM_RJ, 74151497Sru MTSM_CE, 75151497Sru MTSM_SP, 76151497Sru LAST_INT 77151497Sru}; 78151497Sruenum units_value_state { 79151497Sru MTSM_IN, 80151497Sru MTSM_LL, 81151497Sru MTSM_PO, 82151497Sru MTSM_TI, 83151497Sru LAST_UNITS 84151497Sru}; 85151497Sruenum string_value_state { 86151497Sru MTSM_TA, 87151497Sru LAST_STRING 88151497Sru}; 89151497Sru 90151497Srustruct statem { 91151497Sru int issue_no; 92151497Sru bool_value bool_values[LAST_BOOL]; 93151497Sru int_value int_values[LAST_INT]; 94151497Sru units_value units_values[LAST_UNITS]; 95151497Sru string_value string_values[LAST_STRING]; 96151497Sru statem(); 97151497Sru statem(statem *); 98151497Sru ~statem(); 99151497Sru void flush(FILE *, statem *); 100151497Sru int changed(statem *); 101151497Sru void merge(statem *, statem *); 102151497Sru void add_tag(int_value_state, int); 103151497Sru void add_tag(bool_value_state); 104151497Sru void add_tag(units_value_state, hunits); 105151497Sru void add_tag(string_value_state, string); 106151497Sru void sub_tag_ce(); 107151497Sru void add_tag_if_unknown(int_value_state, int); 108151497Sru void add_tag_ta(); 109151497Sru void display_state(); 110151497Sru void update(statem *, statem *, int_value_state); 111151497Sru void update(statem *, statem *, bool_value_state); 112151497Sru void update(statem *, statem *, units_value_state); 113151497Sru void update(statem *, statem *, string_value_state); 114151497Sru}; 115151497Sru 116151497Srustruct stack { 117151497Sru stack *next; 118151497Sru statem *state; 119151497Sru stack(); 120151497Sru stack(statem *, stack *); 121151497Sru ~stack(); 122151497Sru}; 123151497Sru 124151497Sruclass mtsm { 125151497Sru statem *driver; 126151497Sru stack *sp; 127151497Sru int has_changed(int_value_state, statem *); 128151497Sru int has_changed(bool_value_state, statem *); 129151497Sru int has_changed(units_value_state, statem *); 130151497Sru int has_changed(string_value_state, statem *); 131151497Sru void inherit(statem *, int); 132151497Srupublic: 133151497Sru mtsm(); 134151497Sru ~mtsm(); 135151497Sru void push_state(statem *); 136151497Sru void pop_state(); 137151497Sru void flush(FILE *, statem *, string); 138151497Sru int changed(statem *); 139151497Sru void add_tag(FILE *, string); 140151497Sru}; 141151497Sru 142151497Sruclass state_set { 143151497Sru int boolset; 144151497Sru int intset; 145151497Sru int unitsset; 146151497Sru int stringset; 147151497Srupublic: 148151497Sru state_set(); 149151497Sru ~state_set(); 150151497Sru void incl(bool_value_state); 151151497Sru void incl(int_value_state); 152151497Sru void incl(units_value_state); 153151497Sru void incl(string_value_state); 154151497Sru void excl(bool_value_state); 155151497Sru void excl(int_value_state); 156151497Sru void excl(units_value_state); 157151497Sru void excl(string_value_state); 158151497Sru int is_in(bool_value_state); 159151497Sru int is_in(int_value_state); 160151497Sru int is_in(units_value_state); 161151497Sru int is_in(string_value_state); 162151497Sru void add(units_value_state, int); 163151497Sru units val(units_value_state); 164151497Sru}; 165