297 lines
6.2 KiB
C
297 lines
6.2 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these librararies and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: Location.C /main/1 1996/07/29 16:56:17 cde-hp $ */
|
|
// Copyright (c) 1994 James Clark
|
|
// See the file COPYING for copying permission.
|
|
|
|
#ifdef __GNUG__
|
|
#pragma implementation
|
|
#endif
|
|
#include "splib.h"
|
|
#include "Location.h"
|
|
|
|
#ifdef SP_NAMESPACE
|
|
namespace SP_NAMESPACE {
|
|
#endif
|
|
|
|
Location::Location()
|
|
{
|
|
}
|
|
|
|
Location::Location(Origin *origin, Index i)
|
|
: origin_(origin), index_(i)
|
|
{
|
|
}
|
|
|
|
Location::Location(ConstPtr<Origin> origin, Index i)
|
|
: origin_(origin), index_(i)
|
|
{
|
|
}
|
|
|
|
Origin::~Origin()
|
|
{
|
|
}
|
|
|
|
const EntityOrigin *Origin::asEntityOrigin() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
const InputSourceOrigin *Origin::asInputSourceOrigin() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
Index Origin::refLength() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
Boolean Origin::origChars(const Char *&) const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
Boolean Origin::inBracketedTextOpenDelim() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
Boolean Origin::inBracketedTextCloseDelim() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
Boolean Origin::isNumericCharRef(const Markup *&) const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
Boolean Origin::isNamedCharRef(Index, NamedCharRef &) const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
const EntityDecl *Origin::entityDecl() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
BracketOrigin::BracketOrigin(const Location &loc, Position pos)
|
|
: loc_(loc), pos_(pos)
|
|
{
|
|
}
|
|
|
|
const Location &BracketOrigin::parent() const
|
|
{
|
|
return loc_;
|
|
}
|
|
|
|
Boolean BracketOrigin::inBracketedTextOpenDelim() const
|
|
{
|
|
return pos_ == open;
|
|
}
|
|
|
|
Boolean BracketOrigin::inBracketedTextCloseDelim() const
|
|
{
|
|
return pos_ == close;
|
|
}
|
|
|
|
InputSourceOrigin::InputSourceOrigin()
|
|
{
|
|
}
|
|
|
|
InputSourceOrigin::InputSourceOrigin(const Location &refLocation)
|
|
: refLocation_(refLocation)
|
|
{
|
|
}
|
|
|
|
const InputSourceOrigin *InputSourceOrigin::asInputSourceOrigin() const
|
|
{
|
|
return this;
|
|
}
|
|
|
|
Boolean InputSourceOrigin::defLocation(Offset, Location &) const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
const StringC *InputSourceOrigin::entityName() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
InputSourceOrigin *InputSourceOrigin::copy() const
|
|
{
|
|
return new InputSourceOrigin(refLocation_);
|
|
}
|
|
|
|
const Location &InputSourceOrigin::parent() const
|
|
{
|
|
return refLocation_;
|
|
}
|
|
|
|
void InputSourceOrigin::setExternalInfo(ExternalInfo *info)
|
|
{
|
|
externalInfo_ = info;
|
|
}
|
|
|
|
void InputSourceOrigin::noteCharRef(Index replacementIndex,
|
|
const NamedCharRef &ref)
|
|
{
|
|
charRefs_.resize(charRefs_.size() + 1);
|
|
charRefs_.back().replacementIndex = replacementIndex;
|
|
charRefs_.back().refStartIndex = ref.refStartIndex();
|
|
charRefs_.back().refEndType = ref.refEndType();
|
|
charRefs_.back().origNameOffset = charRefOrigNames_.size();
|
|
charRefOrigNames_ += ref.origName();
|
|
}
|
|
|
|
// Number of character references whose replacement index < ind.
|
|
|
|
size_t InputSourceOrigin::nPrecedingCharRefs(Index ind) const
|
|
{
|
|
size_t i;
|
|
// Find i such that
|
|
// charRefs_[I].replacementIndex >= ind
|
|
// charRefs_[i - 1].replacementIndex < ind
|
|
if (charRefs_.size() == 0
|
|
|| ind > charRefs_.back().replacementIndex)
|
|
// This will be a common case, so optimize it.
|
|
i = charRefs_.size();
|
|
else {
|
|
// Binary search
|
|
// Invariant:
|
|
// charRefs_ < i have replacementIndex < ind
|
|
// charRefs_ >= lim have replacementIndex >= ind
|
|
i = 0;
|
|
size_t lim = charRefs_.size();
|
|
while (i < lim) {
|
|
size_t mid = i + (lim - i)/2;
|
|
if (charRefs_[mid].replacementIndex >= ind)
|
|
lim = mid;
|
|
else
|
|
i = mid + 1;
|
|
}
|
|
}
|
|
return i;
|
|
}
|
|
|
|
Offset InputSourceOrigin::startOffset(Index ind) const
|
|
{
|
|
size_t n = nPrecedingCharRefs(ind);
|
|
if (n < charRefs_.size()
|
|
&& ind == charRefs_[n].replacementIndex) {
|
|
for (;;) {
|
|
ind = charRefs_[n].refStartIndex;
|
|
if (n == 0 || charRefs_[n - 1].replacementIndex != ind)
|
|
break;
|
|
--n;
|
|
}
|
|
}
|
|
// charRefs[n - 1].replacementIndex < ind
|
|
return Offset(ind - n);
|
|
}
|
|
|
|
Boolean InputSourceOrigin::isNamedCharRef(Index ind, NamedCharRef &ref) const
|
|
{
|
|
size_t n = nPrecedingCharRefs(ind);
|
|
if (n < charRefs_.size() && ind == charRefs_[n].replacementIndex) {
|
|
ref.set(charRefs_[n].refStartIndex,
|
|
charRefs_[n].refEndType,
|
|
charRefOrigNames_.data() + charRefs_[n].origNameOffset,
|
|
(n + 1 < charRefs_.size()
|
|
? charRefs_[n + 1].origNameOffset
|
|
: charRefOrigNames_.size())
|
|
- charRefs_[n].origNameOffset);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
ReplacementOrigin::ReplacementOrigin(const Location &loc, Char origChar)
|
|
: loc_(loc), origChar_(origChar)
|
|
{
|
|
}
|
|
|
|
const Location &ReplacementOrigin::parent() const
|
|
{
|
|
return loc_;
|
|
}
|
|
|
|
Boolean ReplacementOrigin::origChars(const Char *&s) const
|
|
{
|
|
if (loc_.origin().isNull() || !loc_.origin()->origChars(s))
|
|
s = &origChar_;
|
|
return 1;
|
|
}
|
|
|
|
MultiReplacementOrigin::MultiReplacementOrigin(const Location &loc,
|
|
StringC &origChars)
|
|
: loc_(loc)
|
|
{
|
|
origChars.swap(origChars_);
|
|
}
|
|
|
|
const Location &MultiReplacementOrigin::parent() const
|
|
{
|
|
return loc_;
|
|
}
|
|
|
|
Boolean MultiReplacementOrigin::origChars(const Char *&s) const
|
|
{
|
|
if (loc_.origin().isNull() || !loc_.origin()->origChars(s))
|
|
s = origChars_.data();
|
|
return 1;
|
|
}
|
|
|
|
ExternalInfo::~ExternalInfo()
|
|
{
|
|
}
|
|
|
|
RTTI_DEF0(ExternalInfo)
|
|
|
|
NamedCharRef::NamedCharRef()
|
|
{
|
|
}
|
|
|
|
NamedCharRef::NamedCharRef(Index refStartIndex, RefEndType refEndType,
|
|
const StringC &origName)
|
|
: refStartIndex_(refStartIndex),
|
|
refEndType_(refEndType),
|
|
origName_(origName)
|
|
{
|
|
}
|
|
|
|
void NamedCharRef::set(Index refStartIndex, RefEndType refEndType,
|
|
const Char *s, size_t n)
|
|
{
|
|
refStartIndex_ = refStartIndex;
|
|
refEndType_ = refEndType;
|
|
origName_.assign(s, n);
|
|
}
|
|
|
|
#ifdef SP_NAMESPACE
|
|
}
|
|
#endif
|