home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 Mobile
/
Chip_Mobile_2001.iso
/
palm
/
business
/
printcar
/
printcar.exe
/
src
/
Util
/
TemplateTranslator.cc
< prev
next >
Wrap
C/C++ Source or Header
|
2000-06-07
|
3KB
|
112 lines
//
// $Id: TemplateTranslator.cc,v 1.2 2000/06/07 06:53:30 sergey Exp $
//
#include <Pilot.h>
#include "TemplateTranslator.h"
#include "InputStream.h"
#include "OutputStream.h"
#include "Assert.h"
namespace Util
{
// constants
// Placeholder' brackets
static const char* BEGIN_MARK = "${";
static const char* END_MARK = "}$";
// construction
TemplateTranslator::TemplateTranslator(const TranslationTable& table):
_translationTable(table)
{}
TemplateTranslator::~TemplateTranslator()
{}
// operations
void TemplateTranslator::translate(const char* in, OutputStream& out) const
{
processLine(in, out);
}
// implementation
void TemplateTranslator::processLine(const char* line, OutputStream& out) const
{
assert(line != 0);
const char* ptr = line;
for (;;)
{
int off = findPlaceholder(ptr);
if (off == -1)
break;
out.writeData(ptr, off);
ptr += off;
ptr += translatePlaceholder(ptr, out);
}
out.writeData(ptr, StrLen(ptr));
}
int TemplateTranslator::findPlaceholder(const char* line) const
{
assert(line != 0);
char* beginMark = StrStr(line, BEGIN_MARK);
if (beginMark != 0)
{
char* endMark = StrStr(beginMark, END_MARK);
if (endMark != 0)
return beginMark-line;
}
return -1;
}
int TemplateTranslator::translatePlaceholder(const char* placeholder, OutputStream& out) const
{
assert(placeholder != 0);
char keyword[256];
int placeholderLen = getKeyword(placeholder, keyword, sizeof(keyword));
const char* value = _translationTable.get(keyword);
if (value != 0)
out.writeData(value, StrLen(value));
else
out.writeData(placeholder, placeholderLen);
return placeholderLen;
}
int TemplateTranslator::getKeyword(const char* placeholder, char* result, int maxResultLen) const
{
assert(placeholder != 0);
assert(result != 0);
const char* keyword = placeholder+StrLen(BEGIN_MARK);
const char* endMark = StrStr(keyword, END_MARK);
copyKeyword(keyword, endMark-keyword, result, maxResultLen);
return endMark-placeholder+StrLen(END_MARK);
}
void TemplateTranslator::copyKeyword(const char* keyword, int keywordLen, char* result, int maxResultLen) const
{
if (keywordLen > maxResultLen-1)
keywordLen = maxResultLen-1;
MemMove(result, keyword, keywordLen);
result[keywordLen] = 0;
}
}
// namespace Util