/*
 * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation,
 * YDC Corporation, IPA (Information-technology Promotion Agency, Japan).
 * All rights reserved.
 * 
 * Redistribution and use of this software in source and binary forms, with 
 * or without modification, are permitted provided that the following 
 * conditions and disclaimer are agreed and accepted by the user:
 * 
 * 1. Redistributions of source code must retain the above copyright 
 * notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the following disclaimer in the 
 * documentation and/or other materials provided with the distribution.
 * 
 * 3. Neither the names of the copyrighters, the name of the project which 
 * is related to this software (hereinafter referred to as "project") nor 
 * the names of the contributors may be used to endorse or promote products 
 * derived from this software without specific prior written permission.
 * 
 * 4. No merchantable use may be permitted without prior written 
 * notification to the copyrighters. However, using this software for the 
 * purpose of testing or evaluating any products including merchantable 
 * products may be permitted without any notification to the copyrighters.
 * 
 * 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND 
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING 
 * BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 * FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE 
 * COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $TAHI: v6eval/lib/Pz/PvName.cc,v 1.19 2005/05/09 09:35:24 akisada Exp $
 */
#include "PvName.h"
#include "PcObject.h"
#include <stdio.h>

NameDefine::NameDefine(CSTR s):CmCString(s),declaration_(0) {}
NameDefine::~NameDefine() {declaration_=0;}

PvName::PvName(NameDefine* o,CSTR f,int l):PvObject(f,l),definition_(o) {}
PvName::PvName(const PvName& x):PvObject(x),definition_(x.definition_){}
PvName::~PvName() {definition_=0;}
PvObject* PvName::shallowCopy() const{return new PvName(*this);}

void PvName::declaration(PcObject* o) {
	if(declaration()!=0) {
		error("E %s duplicated declaration",nameString());
		return;}
	NameDefine* nd=definition();
	nd->declaration(o);}

bool PvName::isName() const {return true;}

// COMPOSE
WObject* PvName::selfCompose(WControl& c,WObject* w_parent) const {
	const PObject* decl = declaration();
	if(decl==0){
		error("E %s not defined",nameString()); return 0;}
	if(!decl->check_nameCompose(c,w_parent,*this)){	//ErrorHandling
		return 0;}
	return decl->selfCompose(c,w_parent);}//forward to declaration

PvName* PvName::tokenObject(CSTR s,int l,CSTR f) {
	NameSet& set=NameDefine::nameSet();
	NameDefine tmp(s);
	NameDefine* o=set.find(&tmp);
	if(o==0) {set.add(o=new NameDefine(s));}
	return new PvName(o,f,l);}

void PvName::print() const {
	printf("%s",nameString());}
void PvName::printArgument() const {printf("%s",nameString());}

void NameDefine::print() const {
	PcObject* pc=declaration();
	if(pc!=0) {pc->print();}}
void NameDefine::printUndefine() {
	PcObject* o=declaration();
	if(o==0) {
		fprintf(stderr,"err: %s not declared\n",string());}}

void NameDefine::printUndefines() {
	NameSet& set=nameSet();
	set.elementsPerform((NameDefineFunc)&NameDefine::printUndefine);}

const uint32_t defaultNameSetSize=512;
NameSet NameDefine::nameSet_(defaultNameSetSize);
implementCmSet(NameSet,NameDefine);


syntax highlighted by Code2HTML, v. 0.9.1