
// Copyright {Jagger Software Limited} 2003

#include "grammar/unnamed_symbol_definition.hpp"

#include "contract/not_null_ptr.hpp"
#include "contract/pre_condition.hpp"
#include <algorithm>
#include <cctype>
#include <cstring>
#include <iostream>
#include <string>

using namespace ::std;

namespace grammar // unnamed_symbol_definition - 'tors
{ 
    using ::contract::not_null_ptr;
    
    unnamed_symbol_definition::unnamed_symbol_definition
    (
        const key_type & key, 
        const char * name,
        const char * value
    )
        : symbol_definition(key, name)
        , value(value)
        , size(strlen(not_null_ptr(value)))
    {
        PRE_CONDITION(size > 0);
    }

    unnamed_symbol_definition::unnamed_symbol_definition(const unnamed_symbol_definition & other)
        : symbol_definition(other)
        , value(other.value)
        , size(other.size)
    {
    }
    
    unnamed_symbol_definition::~unnamed_symbol_definition()
    {
    }
}

namespace grammar // unnamed_symbol_definition - iteration
{
    const char * unnamed_symbol_definition::begin() const
    {
        return value;
    }

    const char * unnamed_symbol_definition::end() const
    {
        return value + size;
    }
}

namespace grammar // unnamed_symbol_definition - interface only
{   
    void unnamed_symbol_definition::write(ostream & out) const
    {
        // eg "one-of"
        string id = name;
        
        // eg --> "ONE-OF"
        transform(id.begin(), id.end(), id.begin(), toupper);
        
        // eg --> "ONE_OF"
        replace(id.begin(), id.end(), '-', '_');
        
        out << id << '(' << value << ')';
    }
}

