transdict.cc #1

  • //
  • guest/
  • perforce_software/
  • p4/
  • 2014_2/
  • i18n/
  • transdict.cc
  • View
  • Commits
  • Open Download .zip Download (4 KB)
/*
 * Copyright 1995, 1996 Perforce Software.  All rights reserved.
 *
 * This file is part of Perforce - the FAST SCM System.
 */

# include <stdhdrs.h>

# include <debug.h>
# include <strbuf.h>
# include <strdict.h>
# include <strtable.h>
# include <strops.h>
# include <error.h>
# include <errornum.h>
# include <msgsupp.h>

# include "i18napi.h"
# include "charcvt.h"
# include "transdict.h"

TransDict::TransDict(StrDict *o, CharSetCvt *f)
    : other(o), fromOther(f)
{
	toOther = f->ReverseCvt();
}

TransDict::~TransDict()
{
	delete fromOther;
	delete toOther;
}

void
TransDict::VSetVar( const StrPtr &var, const StrPtr &val )
{
	int translen;
	const char *transbuf;

	toOther->ResetErr();
	transbuf = toOther->FastCvt(val.Text(),	val.Length(), &translen);
	if (transbuf)
	{
	    other->SetVar(var.Text(), StrRef(transbuf, translen));
	    // careful about the order here...
	    StrBufDict::VSetVar(var, val);
	}
	else
	{
	    // what do we do if the translation fails????
	    notransbuf = val;
	}
	transerr = toOther->LastErr();
}

StrPtr *
TransDict::VGetVar( const StrPtr &var )
{
	fromOther->ResetErr();
	StrPtr *ret = StrBufDict::VGetVar( var );
	if (!ret)
	{
	    toOther->ResetErr();
	    const char *cp = toOther->FastCvt( var.Text(), var.Length() );

	    if( !cp )
	    {
		transerr = toOther->LastErr();
		notransbuf = var;
		return NULL;
	    }

	    ret = other->GetVar( cp );

	    if (ret)
	    {
		int translen;
		const char *transbuf = fromOther->FastCvt( ret->Text(),
							   ret->Length(),
							   &translen );
		// XXX if the translation failed we should probably
		// have an error indication of translation failure
		if( transbuf )
		{
		    // XXX Set the translated value
		    StrBufDict::VSetVar( var,
					StrRef( transbuf, translen ) );
		    ret = StrBufDict::VGetVar( var );
		}
		else
		{
		    notransbuf = *ret;
		    ret = NULL;
		}
	    }
	}
	transerr = fromOther->LastErr();
	return ret;
}

int
TransDict::VGetVarX( int x, StrRef &var, StrRef &val )
{
	int ret;

	ret = other->GetVar( x, var, val );
	if( ret )
	{
	    int translen;
	    fromOther->ResetErr();
	    const char *cp = fromOther->FastCvt( var.Text(),
					       var.Length(),
					       &translen );

	    StrBuf holdvar;

	    if( cp )
		holdvar = StrRef( cp, translen );
	    else {
		notransbuf = var;
		holdvar = StrVarName( StrRef( "variable" ), x );
		transerr = fromOther->LastErr();
	    }
		
	    const char *transbuf = fromOther->FastCvt( val.Text(),
						       val.Length(),
						       &translen );
	    // XXX if the translation failed we should probably
	    // have an error indication of translation failure
	    if( transbuf )
	    {
		// XXX Set the translated value
		StrBufDict::VSetVar( holdvar, StrRef( transbuf, translen ) );
	    }
	    else
	    {
		StrBufDict::VSetVar( holdvar, StrRef( "untranslatable" ) );
		notransbuf = val;
		transerr = fromOther->LastErr();
	    }

	    // XXX this is needed to get var and val pointing at
	    // stable memory
	    ret = StrBufDict::VGetVarX( GetCount() - 1, var, val );
	}
	return ret;
}

void
TransDict::VSetError( const StrPtr &var, Error *e )
{
	if( transerr )
	{
	    StrBuf hexBuf;

	    StrOps::OtoX( notransbuf, hexBuf );
	    e->Set( MsgSupp::NoTransVar ) << var << hexBuf;
	}
	else
	    StrBufDict::VSetError( var, e );
}

StrPtr *
TransDictQues::VGetVar( const StrPtr &var )
{
	StrPtr *ret;
	StrPtr *val = other->GetVar( var );
	if ( !val )
	    return NULL;
	fromOther->ResetErr();
	int translen;
	const char *transbuf = fromOther->FastCvtQues( val->Text(),
						       val->Length(),
						       &translen );
	if( transbuf )
	{
	    // XXX Set the translated value
	    StrBufDict::VSetVar( var, StrRef( transbuf, translen ) );
	    ret = StrBufDict::VGetVar( var );
	    return ret;
	}
	return NULL;
}

TransDictQues::~TransDictQues()
{
}
# Change User Description Committed
#2 15903 Matt Attaway Everything should be happy now between the Workshop and the depot paths
#1 15901 Matt Attaway Clean up code to fit modern Workshop naming standards
//guest/perforce_software/p4/2014.2/i18n/transdict.cc
#1 12189 Matt Attaway Initial (and much belated) drop of 2014.2 p4 source code