Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/guisupport/dc.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/guisupport/dc.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,241 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * dc.cpp - display contexts + */ + +#include "assert.h" +#include "dc.h" +#include "myalloc.h" +#include "stacks.h" +#include "wdata.h" +#include "wm1.h" + +//#define INCLUDE_LOGGING +#include "log.h" + + +static int dcsCreated = 0; +static int dcsDestroyed = 0; + + +//////////////////////////////////////////////////////////// +// +// dc methods + +void dc::init_dc(void) { + LOGSECTION("dc::init"); + LOGV((int) this) LCV(head_title) LCV(foot_title); + id = this; + clear_data(); + des = ZALLOCATE(1, wd); + + tab_stops = NULL; + syntax_dependent = 1; + dcsCreated++; +} + +void dc::clear_data(void) { + LOGSECTION("dc::clear_data"); + usage_count = 0; + tab_stops = NULL; + syntax_dependent = 1; +} + +dc::dc(void) + : head_title() + , foot_title() + , windowConnector(0) +{ + init_dc(); +} + +dc::dc(const AgString head) + : head_title(head) + , foot_title() + , windowConnector(0) +{ + init_dc(); +} + +dc::dc(const AgString head, const AgString foot) + : head_title(head) + , foot_title(foot) + , windowConnector(0) +{ + init_dc(); +} + +dc::dc(dc &x) + : head_title(x.head_title) + , foot_title(x.foot_title) + , windowConnector(0) +{ + id = this; + des = ZALLOCATE(1,wd); + *des = *x.des; + syntax_dependent = x.syntax_dependent; + tab_stops = x.tab_stops; + columnHeadTitle = x.columnHeadTitle; + usage_count = 0; + dcsCreated++; +} + +dc::~dc(void) { + LOGSECTION("dc::~dc"); + LOGV(head_title) LCV(foot_title); + assert(this == id && usage_count == 0); + ok_ptr(this); + ok_ptr(des); + //if (windowConnector) delete windowConnector; + DEALLOCATE(des); + dcsDestroyed++; +} + +AgString dc::findHelpTopic() { return AgString(); } + +#define CURSOR windowConnector->getCursorLine() + +void dc::anomaly_trace() { pop_up_window(anomaly_trace (CURSOR)); } +void dc::aux_trace() { pop_up_window(aux_trace (CURSOR)); } +void dc::derive_rule() { pop_up_window(derive_rule (CURSOR)); } +void dc::derive_token() { pop_up_window(derive_token (CURSOR)); } +void dc::expansion_chain() { pop_up_window(expansion_chain (CURSOR)); } +void dc::expansion_rules() { pop_up_window(expansion_rules (CURSOR)); } +void dc::keywords() { pop_up_window(keywords (CURSOR)); } +void dc::partition_sets() { pop_up_window(partition_sets (CURSOR)); } +void dc::previous_states() { pop_up_window(previous_states (CURSOR)); } +void dc::problem_states() { pop_up_window(problem_states (CURSOR)); } +void dc::productions() { pop_up_window(productions (CURSOR)); } + +void dc::reduction_states() { pop_up_window(reduction_states(CURSOR)); } +void dc::reduction_trace() { pop_up_window(reduction_trace (CURSOR)); } +void dc::rule_context() { pop_up_window(rule_context (CURSOR)); } +//void dc::rule_stack() { pop_up_window(rule_stack (CURSOR)); } +void dc::select_conflict() { pop_up_window(select_conflict (CURSOR)); } +void dc::set_elements() { pop_up_window(set_elements (CURSOR)); } +void dc::state_definition() { pop_up_window(state_definition(CURSOR)); } +void dc::state_expansion() { pop_up_window(state_expansion (CURSOR)); } +void dc::usage() { pop_up_window(usage (CURSOR)); } + +int dc::derive_rule_ok() { return derive_rule_ok (CURSOR); } +int dc::expansion_chain_ok() { return expansion_chain_ok (CURSOR); } + +int dc::expansion_rules_ok() { return expansion_rules_ok (CURSOR); } + +int dc::keywords_ok() { return keywords_ok (CURSOR); } +int dc::previous_states_ok() { return previous_states_ok (CURSOR); } +int dc::productions_ok() { return productions_ok (CURSOR); } +int dc::reduction_states_ok() { return reduction_states_ok (CURSOR); } +int dc::rule_context_ok() { return rule_context_ok (CURSOR); } +int dc::set_elements_ok() { return set_elements_ok (CURSOR); } +int dc::state_expansion_ok() { return state_expansion_ok (CURSOR); } +int dc::usage_ok() { return usage_ok (CURSOR); } + +#undef CURSOR + +void dc::getLine(unsigned ln) const { + LOGSECTION("dc::getLine"); + LOGV(ln); + assert(ln < (unsigned) des->d_size.y); + ics(); +} + +//////////////////////////////////////////////////////////// +// +// dc_ref methods + +dc::ref::ref() : window(0) {} + +dc::ref::ref(dc *x) { + LOGSECTION("dc::ref::ref"); + window = x; + if (window) { + ok_ptr(window); + window->usage_count++; + LOGV((int) window) LCV(window->usage_count); + } +} + +dc::ref::ref(const ref &x) { + window = x.window; + if (window) { + ok_ptr(window); + window->usage_count++; + } +} + +dc::ref &dc::ref::operator =(const ref &x) { + if (window == x.window) { + return *this; + } + if (window) { + ok_ptr(window); + if (window->usage_count && --window->usage_count == 0) { + delete window; + } + } + window = x.window; + if (window) { + ok_ptr(window); + window->usage_count++; + } + return *this; +} + +dc::ref &dc::ref::operator =(dc *x) { + if (window == x) { + return *this; + } + if (window) { + ok_ptr(window); + LOGV((int) window) LCV(window->usage_count); + if (window->usage_count && --window->usage_count == 0) { + delete window; + } + } + window = x; + if (window) { + ok_ptr(window); + LOGV(window->usage_count); + window->usage_count++; + } + return *this; +} + +dc::ref::~ref(void) { + LOGSECTION("dc::ref::~ref"); + if (window) { + ok_ptr(window); + LOGV((int) window) LCV(window->usage_count); + if (window->usage_count && --window->usage_count == 0) { + delete window; + } + } +} + +void dc::ref::discardData(void) { + dc *alias = window; + window = 0; + if (alias) { + ok_ptr(alias); + LOGV((int) alias) LCV(alias->usage_count); + if (alias->usage_count && --alias->usage_count == 0) { + delete alias; + } + } +} + +dc::ref::operator dc *(void) const { + if (window) { + ok_ptr(window); + } + return window; +} + +dc *dc::ref::operator ->(void) const { + ok_ptr(window); + return window; +}