1 // -*- C++ -*- 2 /* Copyright (C) 2003, 2004 Free Software Foundation, Inc. 3 * 4 * mtsm.h 5 * 6 * written by Gaius Mulley (gaius@glam.ac.uk) 7 * 8 * provides a minimal troff state machine which is necessary to 9 * emit meta tags for the post-grohtml device driver. 10 */ 11 12 /* 13 This file is part of groff. 14 15 groff is free software; you can redistribute it and/or modify it under 16 the terms of the GNU General Public License as published by the Free 17 Software Foundation; either version 2, or (at your option) any later 18 version. 19 20 groff is distributed in the hope that it will be useful, but WITHOUT ANY 21 WARRANTY; without even the implied warranty of MERCHANTABILITY or 22 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 23 for more details. 24 25 You should have received a copy of the GNU General Public License along 26 with groff; see the file COPYING. If not, write to the Free Software 27 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 28 29 struct int_value { 30 int value; 31 int is_known; 32 int_value(); 33 ~int_value(); 34 void diff(FILE *, const char *, int_value); 35 int differs(int_value); 36 void set(int); 37 void unset(); 38 void set_if_unknown(int); 39 }; 40 41 struct bool_value : public int_value { 42 bool_value(); 43 ~bool_value(); 44 void diff(FILE *, const char *, bool_value); 45 }; 46 47 struct units_value : public int_value { 48 units_value(); 49 ~units_value(); 50 void diff(FILE *, const char *, units_value); 51 int differs(units_value); 52 void set(hunits); 53 }; 54 55 struct string_value { 56 string value; 57 int is_known; 58 string_value(); 59 ~string_value(); 60 void diff(FILE *, const char *, string_value); 61 int differs(string_value); 62 void set(string); 63 void unset(); 64 }; 65 66 enum bool_value_state { 67 MTSM_EOL, 68 MTSM_BR, 69 LAST_BOOL 70 }; 71 enum int_value_state { 72 MTSM_FI, 73 MTSM_RJ, 74 MTSM_CE, 75 MTSM_SP, 76 LAST_INT 77 }; 78 enum units_value_state { 79 MTSM_IN, 80 MTSM_LL, 81 MTSM_PO, 82 MTSM_TI, 83 LAST_UNITS 84 }; 85 enum string_value_state { 86 MTSM_TA, 87 LAST_STRING 88 }; 89 90 struct statem { 91 int issue_no; 92 bool_value bool_values[LAST_BOOL]; 93 int_value int_values[LAST_INT]; 94 units_value units_values[LAST_UNITS]; 95 string_value string_values[LAST_STRING]; 96 statem(); 97 statem(statem *); 98 ~statem(); 99 void flush(FILE *, statem *); 100 int changed(statem *); 101 void merge(statem *, statem *); 102 void add_tag(int_value_state, int); 103 void add_tag(bool_value_state); 104 void add_tag(units_value_state, hunits); 105 void add_tag(string_value_state, string); 106 void sub_tag_ce(); 107 void add_tag_if_unknown(int_value_state, int); 108 void add_tag_ta(); 109 void display_state(); 110 void update(statem *, statem *, int_value_state); 111 void update(statem *, statem *, bool_value_state); 112 void update(statem *, statem *, units_value_state); 113 void update(statem *, statem *, string_value_state); 114 }; 115 116 struct stack { 117 stack *next; 118 statem *state; 119 stack(); 120 stack(statem *, stack *); 121 ~stack(); 122 }; 123 124 class mtsm { 125 statem *driver; 126 stack *sp; 127 int has_changed(int_value_state, statem *); 128 int has_changed(bool_value_state, statem *); 129 int has_changed(units_value_state, statem *); 130 int has_changed(string_value_state, statem *); 131 void inherit(statem *, int); 132 public: 133 mtsm(); 134 ~mtsm(); 135 void push_state(statem *); 136 void pop_state(); 137 void flush(FILE *, statem *, string); 138 int changed(statem *); 139 void add_tag(FILE *, string); 140 }; 141 142 class state_set { 143 int boolset; 144 int intset; 145 int unitsset; 146 int stringset; 147 public: 148 state_set(); 149 ~state_set(); 150 void incl(bool_value_state); 151 void incl(int_value_state); 152 void incl(units_value_state); 153 void incl(string_value_state); 154 void excl(bool_value_state); 155 void excl(int_value_state); 156 void excl(units_value_state); 157 void excl(string_value_state); 158 int is_in(bool_value_state); 159 int is_in(int_value_state); 160 int is_in(units_value_state); 161 int is_in(string_value_state); 162 void add(units_value_state, int); 163 units val(units_value_state); 164 }; 165