Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/agcore/configparam.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/agcore/configparam.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,202 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * configparam.cpp + */ + +#include "agstring.h" +#include "configparam.h" +#include "rpk.h" +#include "rule.h" +#include "stacks.h" + +//#define INCLUDE_LOGGING +#include "log.h" + + +ConfigParam::ConfigParam(const char *n) + : name(n) +{} + +void ConfigParam::setIntegerValue(const int, ErrorHandler &e) { + LOGSECTION("ConfigParam::setValue(int)"); + char buf[200]; + sprintf(buf, "Parameter takes string value: %s", name); + e.badParam(buf); +} + +void ConfigParam::setStringValue(const AgString, ErrorHandler &e) { + LOGSECTION("ConfigParam::setValue(AgString)"); + char buf[200]; + sprintf(buf, "Parameter takes integer value: %s", name); + e.badParam(buf); +} + +void ConfigParam::set(int k, ErrorHandler &e) { + LOGSECTION("ConfigParam::set(int)"); + LOGV(string_base); + AgString name = buildAgString(); + LOGV(name); + strlwr(name.pointer()); + LOGV(name); + int i; + for (i = 0; i < paramCount; i++) { + if (name != table[i]->name) { + continue; + } + table[i]->setIntegerValue(k, e); + return; + } + char buf[500]; + sprintf(buf, "Parameter not defined: %s", name.pointer()); + e.badParam(buf); +} + +void ConfigParam::set(ErrorHandler &e) { + LOGSECTION("ConfigParam::set()"); + AgString param = buildAgString(); + + AgString name = buildAgString(); + strlwr(name.pointer()); + LOGV(name) LCV(param); + int i; + for (i = 0; i < paramCount; i++) { + if (name != table[i]->name) continue; + table[i]->setStringValue(param, e); + return; + } + char buf[500]; + sprintf(buf, "Parameter not defined: %s", name.pointer()); + e.badParam(buf); +} + +void ConfigParam::resetAll() { + LOGSECTION("ConfigParam::resetAll"); + int i; + LOGV(paramCount); + for (i = 0; i < paramCount; i++) { + //LOGV(table[i]->asString()); + table[i]->reset(); + LOGV(table[i]->asString()); + } +} + +void ConfigParam::initAll() { + LOGSECTION("ConfigParam::initAll"); + int i; + LOGV(paramCount); + for (i = 0; i < paramCount; i++) { + LOGV(i) LCV(table[i]->asString()); + table[i]->init(); + LOGV(table[i]->asString()); + } +} + +void IntegerParam::setIntegerValue(const int x, ConfigParam::ErrorHandler &) { + parameter = x; +} + +void ConfigSwitch::setIntegerValue(const int x, ConfigParam::ErrorHandler &) { + parameter = x; +} + +void ConfigSwitch::setStringValue(const AgString s, ConfigParam::ErrorHandler &e) { + char *pointer = s.pointer(); + strlwr(pointer); + if (s == "off") { + parameter = 0; + } + else if (s == "on") { + parameter = 1; + } + else { + char buf[100]; + sprintf(buf, "Switch takes on/off values only: %s", name); + e.badParam(buf); + } +} + +void StringParam::setStringValue(const AgString s, ConfigParam::ErrorHandler &) { + parameter = s; +} + +void TextParam::setStringValue(const AgString s, ConfigParam::ErrorHandler &) { + parameter = s; +} + +CastParam::CastParam(const char *name, int &p) + : Param<int>(name, p) +{} + +void CastParam::setStringValue(const AgString s, ConfigParam::ErrorHandler &e) { + LOGSECTION("CastParam::setValue(AgString)"); + Cast type(s); + if (strcmp(name, "default token type") == 0 && type.wrapperRequired()) { + e.badParam("Token with wrapper cannot be default token type"); + return; + } + parameter = type; +} + +AgString CastParam::asString() { + LOGSECTION("CastParam::asString()"); + LOGV(parameter); + LOGV((int) Cast(parameter)) LCV((AgString) Cast(parameter)); + + if (parameter) { + return Cast(parameter).name(); + } + else { + return AgString("UNDEFINED"); + } +} + +TokenParam::TokenParam(const char *name, int &p) + : Param<int>(name, p) +{ + LOGSECTION("TokenParam::TokenParam"); + LOGV(name) LCV(p); +} + +void TokenParam::setStringValue(const AgString s, ConfigParam::ErrorHandler &) { + LOGSECTION("TokenParam::setValue(AgString)"); + parameter = id_token(Symbol(s.pointer())); +} + +AgString TokenParam::asString() { + LOGSECTION("TokenParam::asString"); + LOGV(parameter) LCV(Token::count()); + Token token(parameter); + //AgString name = Token(parameter)->token_name->string; + AgString name = token.isNotNull() ? token->token_name->string : + AgString("UNDEFINED"); + LOGV(name); + //if (name.size() == 0) name = "UNDEFINED"; + return name; +} + +AgString ConfigSwitch::asString() { + return AgString(parameter ? "ON" : "OFF"); +} + +AgString StringParam::asString() { + char buf[200]; + if (parameter.exists()) { + sprintf(buf, "\"%s\"", parameter.pointer()); + return AgString(buf); + } + return AgString("UNDEFINED"); +} + +AgString TextParam::asString() { + if (parameter.exists()) return parameter; + return AgString("UNDEFINED"); +} + +AgString IntegerParam::asString() { + char buf[20]; + sprintf(buf, "%d", parameter); + return AgString(buf); +}