view anagram/guisupport/dc.h @ 15:f5acaf0c8a29

Don't cast through "volatile int". Causes a gcc warning nowadays. XXX: should put something else back here to frighten the optimizer
author David A. Holland
date Tue, 31 May 2022 01:00:55 -0400
parents 13d2b8934445
children
line wrap: on
line source

/*
 * 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.h - display contexts
 */

#ifndef DC_H
#define DC_H

class WindowConnector; // from wdata.h
#include "agstring.h"
#include "cint.h"

struct wd {
  const char *head_title_display;
  const char *foot_title_display;
  int refresh;                         /* increment to refresh */
  cint c_loc_doc;                      /* location of cursor on document */
  cint d_size;                         /* size of document */
};

struct dc {
  // Reference control

  int usage_count;

  class ref {
  protected:
    dc *window;

  public:
    ref(void);
    ref(dc *x);
    ref(const ref &x);

    ref &operator =(const ref &x);
    ref &operator =(dc *x);
    ~ref(void);

    void discardData(void);
    int exists(void) const { return window != NULL; }

    operator dc *(void) const;
    dc *operator ->(void) const;
    int operator ==(const ref &x) const { return window == x.window; }
    int operator !=(const ref &x) const { return window != x.window; }
  };

  AgString head_title, foot_title;
  AgString columnHeadTitle;

  dc *id;

  wd *des;                             /* describes desired window */
  WindowConnector *windowConnector;

  int *tab_stops;


  unsigned syntax_dependent : 1;

  void init_dc(void);
  void clear_data(void);

  dc(void);

  dc(const AgString head);
  dc(const AgString head, const AgString foot);
  dc(dc &x);

  virtual ~dc();

  struct MenuOption {
    const char *option_name;
    void (dc:: * action)();
    int (dc::  * ok_action)();
    MenuOption() : option_name(0) {}
    MenuOption(const char *name) : option_name(name) {}
    virtual ~MenuOption() {}
    virtual ref getAuxWindow(ref, unsigned) { return ref(); }
  };

  virtual AgString findHelpTopic();
  virtual MenuOption **getAuxWinMenu(void) { return NULL; }
  virtual ref anomaly_trace(unsigned)    { return ref(); }
  virtual ref aux_trace(unsigned)        { return ref(); }
  virtual ref derive_rule(unsigned)      { return ref(); }
  virtual ref derive_token(unsigned)     { return ref(); }
  virtual ref expansion_chain(unsigned)  { return ref(); }
  virtual ref expansion_rules(unsigned)  { return ref(); }
  virtual ref keywords(unsigned)         { return ref(); }
  virtual ref partition_sets(unsigned)   { return ref(); }
  virtual ref previous_states(unsigned)  { return ref(); }
  virtual ref problem_states(unsigned)   { return ref(); }
  virtual ref productions(unsigned)      { return ref(); }

  virtual ref reduction_states(unsigned) { return ref(); }
  virtual ref reduction_trace(unsigned)  { return ref(); }
  virtual ref rule_context(unsigned)     { return ref(); }
  //virtual ref rule_stack(unsigned)       { return ref(); }
  virtual ref select_conflict(unsigned)  { return ref(); }
  virtual ref set_elements(unsigned)     { return ref(); }
  virtual ref state_definition(unsigned) { return ref(); }
  virtual ref state_expansion(unsigned)  { return ref(); }
  virtual ref usage(unsigned)            { return ref(); }

  virtual int derive_rule_ok(unsigned)      { return 1; }
  virtual int expansion_chain_ok(unsigned)  { return 1; }
  virtual int expansion_rules_ok(unsigned)  { return 1; }
  virtual int keywords_ok(unsigned)         { return 1; }
  virtual int previous_states_ok(unsigned)  { return 1; }
  virtual int productions_ok(unsigned)      { return 1; }

  virtual int reduction_states_ok(unsigned) { return 1; }
  virtual int rule_context_ok(unsigned)     { return 1; }
  virtual int set_elements_ok(unsigned)     { return 1; }
  virtual int state_expansion_ok(unsigned)  { return 1; }
  virtual int usage_ok(unsigned)            { return 1; }

  void anomaly_trace()    ;
  void aux_trace()        ;
  void derive_rule()      ;
  void derive_token()     ;
  void expansion_chain()  ;
  void expansion_rules()  ;
  void keywords()         ;
  void partition_sets()   ;
  void previous_states()  ;
  void problem_states()   ;
  void productions()      ;

  void reduction_states() ;
  void reduction_trace()  ;
  void rule_context()     ;
  //void rule_stack()     ;
  void select_conflict()  ;
  void set_elements()     ;
  void state_definition() ;
  void state_expansion()  ;
  void usage()            ;

  int derive_rule_ok()    ;

  int anomaly_trace_ok()    { return 1; }
  int aux_trace_ok()        { return 1; }
  int derive_token_ok()     { return derive_rule_ok(); }
  int expansion_chain_ok();
  int expansion_rules_ok();
  int keywords_ok()       ;
  int partition_sets_ok()   { return 1; }
  int previous_states_ok();
  int problem_states_ok()   { return derive_rule_ok(); }
  int productions_ok()    ;

  int reduction_states_ok();
  int reduction_trace_ok()  { return derive_rule_ok(); }
  int rule_context_ok()   ;
  //int rule_stack_ok()     { return 1; }
  int select_conflict_ok()  { return derive_rule_ok(); }
  int set_elements_ok()   ;
  int state_definition_ok() { return 1; }
  int state_expansion_ok();
  int usage_ok()          ;

  struct AnomalyTraceOption : public MenuOption {
    AnomalyTraceOption(void) : MenuOption("Keyword Anomaly Trace") {
      ok_action = &dc::anomaly_trace_ok;
      action = &dc::anomaly_trace;
    }
    virtual ~AnomalyTraceOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->anomaly_trace(ln);
    }
  };

  struct AuxiliaryTraceOption : public MenuOption {
    AuxiliaryTraceOption(void) : MenuOption("Auxiliary Trace") {
      ok_action = &dc::aux_trace_ok;
      action = &dc::aux_trace;
    }
    virtual ~AuxiliaryTraceOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->aux_trace(ln);
    }
  };

  struct ConflictTraceOption : public MenuOption {
    ConflictTraceOption(void) : MenuOption("Conflict Trace") {
      ok_action = &dc::select_conflict_ok;
      action = &dc::select_conflict;
    }
    virtual ~ConflictTraceOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->select_conflict(ln);
    }
  };


  struct ExpansionChainOption : public MenuOption {
    ExpansionChainOption(void) : MenuOption("Expansion Chain") {
      ok_action = &dc::expansion_chain_ok;
      action = &dc::expansion_chain;
    }
    virtual ~ExpansionChainOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->expansion_chain(ln);
    }
  };

  struct ExpansionRulesOption : public MenuOption {
    ExpansionRulesOption(void) : MenuOption("Expansion Rules") {
      ok_action = &dc::expansion_rules_ok;
      action = &dc::expansion_rules;
    }
    virtual ~ExpansionRulesOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->expansion_rules(ln);
    }
  };

  struct KeywordsOption : public MenuOption {
    KeywordsOption(void) : MenuOption("Keywords") {
      ok_action = &dc::keywords_ok;
      action = &dc::keywords;
    }
    virtual ~KeywordsOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->keywords(ln);
    }
  };

  struct PartitionSetsOption : public MenuOption {
    PartitionSetsOption(void) : MenuOption("Partition Sets") {
      ok_action = &dc::partition_sets_ok;
      action = &dc::partition_sets;
    }
    virtual ~PartitionSetsOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->partition_sets(ln);
    }
  };

  struct PreviousStatesOption : public MenuOption {
    PreviousStatesOption(void) : MenuOption("Previous States") {
      ok_action = &dc::previous_states_ok;
      action = &dc::previous_states;
    }
    virtual ~PreviousStatesOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->previous_states(ln);
    }
  };

  struct ProblemStatesOption : public MenuOption {
    ProblemStatesOption(void) : MenuOption("Problem States") {
      ok_action = &dc::problem_states_ok;
      action = &dc::problem_states;
    }
    virtual ~ProblemStatesOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->problem_states(ln);
    }
  };

  struct ProductionsOption : public MenuOption {
    ProductionsOption(void) : MenuOption("Productions") {
      ok_action = &dc::productions_ok;
      action = &dc::productions;
    }
    virtual ~ProductionsOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->productions(ln);
    }
  };

  struct ReductionStatesOption : public MenuOption {
    ReductionStatesOption(void) : MenuOption("Reduction States") {
      ok_action = &dc::reduction_states_ok;
      action = &dc::reduction_states;
    }
    virtual ~ReductionStatesOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->reduction_states(ln);
    }
  };

  struct ReductionTraceOption : public MenuOption {
    ReductionTraceOption(void) : MenuOption("Reduction Trace") {
      ok_action = &dc::reduction_trace_ok;
      action = &dc::reduction_trace;
    }
    virtual ~ReductionTraceOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->reduction_trace(ln);
    }
  };

  struct RuleContextOption : public MenuOption {
    RuleContextOption(void) : MenuOption("Rule Context") {
      ok_action = &dc::rule_context_ok;
      action = &dc::rule_context;
    }
    virtual ~RuleContextOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->rule_context(ln);
    }
  };

  struct RuleDerivationOption : public MenuOption {
    RuleDerivationOption(void) : MenuOption("Rule Derivation") {
      ok_action = &dc::derive_rule_ok;
      action = &dc::derive_rule;
    }
    virtual ~RuleDerivationOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->derive_rule(ln);
    }
  };
/*
  struct RuleStackOption : public MenuOption {
    RuleStackOption(void) : MenuOption("Rule Stack") {
      ok_action = &dc::rule_stack_ok;
      action = &dc::rule_stack;
    }
    virtual ~RuleStackOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->rule_stack(ln);
    }
  };
*/
  struct SetElementsOption : public MenuOption {
    SetElementsOption(void) : MenuOption("Set Elements") {
      ok_action = &dc::set_elements_ok;
      action = &dc::set_elements;
    }
    virtual ~SetElementsOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->set_elements(ln);
    }
  };

  struct StateDefinitionOption : public MenuOption {
    StateDefinitionOption(void) : MenuOption("State Definition") {
      ok_action = &dc::state_definition_ok;
      action = &dc::state_definition;
    }
    virtual ~StateDefinitionOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->state_definition(ln);
    }
  };

  struct StateExpansionOption : public MenuOption {
    StateExpansionOption(void) : MenuOption("State Expansion") {
      ok_action = &dc::state_expansion_ok;
      action = &dc::state_expansion;
    }
    virtual ~StateExpansionOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->state_expansion(ln);
    }
  };

  struct TokenDerivationOption : public MenuOption {
    TokenDerivationOption(void) : MenuOption("Token Derivation") {
      ok_action = &dc::derive_token_ok;
      action = &dc::derive_token;
    }
    virtual ~TokenDerivationOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->derive_token(ln);
    }
  };

  struct TokenUsageOption : public MenuOption {
    TokenUsageOption(void): MenuOption("Token Usage") {
      ok_action = &dc::usage_ok;
      action = &dc::usage;
    }
    virtual ~TokenUsageOption() {}
    virtual ref getAuxWindow(ref d, unsigned ln) {
      return d->usage(ln);
    }
  };
/*
  static const char *help_gs_msg;
  static const char *help_index_msg;
  static const char *kbd_ref_msg;
  static const char *mouse_ref_msg;
  static const char *using_help_msg;
  static const char *help_wn_msg;
*/

  static AnomalyTraceOption    anomalyTraceOptionInstance;
  static AuxiliaryTraceOption  auxiliaryTraceOptionInstance;
  static ConflictTraceOption   conflictTraceOptionInstance;
  static ExpansionChainOption  expansionChainOptionInstance;
  static ExpansionRulesOption  expansionRulesOptionInstance;
  static KeywordsOption        keywordsOptionInstance;
  static PartitionSetsOption   partitionSetsOptionInstance;
  static PreviousStatesOption  previousStatesOptionInstance;
  static ProblemStatesOption   problemStatesOptionInstance;
  static ProductionsOption     productionsOptionInstance;
  static ReductionStatesOption reductionStatesOptionInstance;
  static ReductionTraceOption  reductionTraceOptionInstance;
  static RuleContextOption     ruleContextOptionInstance;
  static RuleDerivationOption  ruleDerivationOptionInstance;
  //static RuleStackOption       ruleStackOptionInstance;
  static SetElementsOption     setElementsOptionInstance;
  static StateDefinitionOption stateDefinitionOptionInstance;
  static StateExpansionOption  stateExpansionOptionInstance;
  static TokenDerivationOption tokenDerivationOptionInstance;
  static TokenUsageOption      tokenUsageOptionInstance;

  virtual void getLine(unsigned) const;
  virtual void synchCursor(unsigned) const {}
};

typedef dc::ref dc_ref;

template <class T>
class DcRef : public dc::ref {
public:
  DcRef(void);// {}
  DcRef(T *x);// : dc::ref((dc *) x) {}
  DcRef(const DcRef<T> &x);// : dc::ref(x) {}
  DcRef(dc::ref x);// : dc::ref(x) {}

  operator T *() { return (T *) window; }
  T *operator ->(void)
    { return (T *) window; }
};

template <class T>
DcRef<T>::DcRef(void) {}
template <class T>
DcRef<T>::DcRef(T *x) : dc::ref((dc *) x) {}
template <class T>
DcRef<T>::DcRef(const DcRef<T> &x) : dc::ref(x) {}
template <class T>
DcRef<T>::DcRef(dc::ref x) : dc::ref(x) {}


#endif /* DC_H */