-// FIXME THREAD
-// There could easily be a conflict here, with the export process
-// setting this one way, and a View>Source process (possbily for
-// another Buffer) resetting it.
-static int open_encoding_ = none;
-static int cjk_inherited_ = 0;
-Language const * prev_env_language_ = 0;
+
+struct OutputState
+{
+ OutputState() : open_encoding_(none), cjk_inherited_(0),
+ prev_env_language_(nullptr), nest_level_(0)
+ {
+ }
+ OpenEncoding open_encoding_;
+ int cjk_inherited_;
+ Language const * prev_env_language_;
+ int nest_level_;
+ stack<int> lang_switch_depth_; // Both are always empty when
+ stack<string> open_polyglossia_lang_; // not using polyglossia
+};
+
+
+OutputState * getOutputState()
+{
+ // FIXME An instance of OutputState should be kept around for each export
+ // instead of using local thread storage
+ static QThreadStorage<OutputState *> outputstate;
+ if (!outputstate.hasLocalData())
+ outputstate.setLocalData(new OutputState);
+ return outputstate.localData();
+}
+
+
+string const & openLanguageName(OutputState const * state)
+{
+ // Return a reference to the last active language opened with
+ // polyglossia or when using begin/end commands. If none or when
+ // using babel with only a begin command, return a reference to
+ // an empty string.
+
+ static string const empty;
+
+ return state->open_polyglossia_lang_.empty()
+ ? empty
+ : state->open_polyglossia_lang_.top();
+}
+
+
+bool atSameLastLangSwitchDepth(OutputState const * state)
+{
+ // Return true if the actual nest level is the same at which the
+ // language was switched when using polyglossia or begin/end
+ // commands. Instead, return always true when using babel with
+ // only a begin command.
+
+ return state->lang_switch_depth_.size() == 0
+ ? true
+ : abs(state->lang_switch_depth_.top()) == state->nest_level_;
+}
+
+
+bool isLocalSwitch(OutputState const * state)
+{
+ // Return true if the language was opened by a local command switch.
+
+ return state->lang_switch_depth_.size()
+ && state->lang_switch_depth_.top() < 0;
+}
+
+
+bool langOpenedAtThisLevel(OutputState const * state)
+{
+ // Return true if the language was opened at the current nesting level.
+
+ return state->lang_switch_depth_.size()
+ && abs(state->lang_switch_depth_.top()) == state->nest_level_;
+}