sicking%bigfoot.com b44d102f77 Make the XPath engine handle CDATA sections as text-nodes.
b=92786 r=peterv, pike sr=jst

Mixed small fixes and comments.
b=99792 r=peterv sr=jst


git-svn-id: svn://10.0.0.236/trunk@103025 18797224-902f-48f8-a5cc-f745e15eee43
2001-09-17 23:02:57 +00:00

322 lines
8.2 KiB
C++

/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is TransforMiiX XSLT processor.
*
* The Initial Developer of the Original Code is The MITRE Corporation.
* Portions created by MITRE are Copyright (C) 1999 The MITRE Corporation.
*
* Portions created by Keith Visco as a Non MITRE employee,
* (C) 1999 Keith Visco. All Rights Reserved.
*
* Contributor(s):
* Keith Visco, kvisco@ziplink.net
* -- original author.
* Bob Miller, kbob@oblix.com
* -- plugged core leak.
*
*/
/**
* StringList
**/
#ifdef TX_EXE
#include <iostream.h>
#endif
#include "StringList.h"
/**
* Creates an empty list
**/
StringList::StringList() {
firstItem = 0;
lastItem = 0;
itemCount = 0;
} //-- StringList;
/**
* StringList Destructor, Cleans up pointers and will delete the String
* references, make sure you make copies of any needed Strings
*/
StringList::~StringList() {
StringListItem* item = firstItem;
while (item) {
StringListItem* tItem = item;
item = item->nextItem;
delete tItem->strptr;
delete tItem;
}
} //-- ~StringList
void StringList::add(String* strptr) {
StringListItem* sItem = new StringListItem;
if (sItem) {
sItem->strptr = strptr;
sItem->nextItem = 0;
sItem->prevItem = lastItem;
}
if (lastItem) lastItem->nextItem = sItem;
lastItem = sItem;
if (!firstItem) firstItem = sItem;
// increase the item count
++itemCount;
} //-- add
MBool StringList::contains(String& search) {
StringListItem* sItem = firstItem;
while ( sItem ) {
if ( search.isEqual(*sItem->strptr)) return MB_TRUE;
sItem = sItem->nextItem;
}
return MB_FALSE;
} //-- contains
/**
* Returns the number of Strings in this List
**/
PRInt32 StringList::getLength() {
return itemCount;
} //-- getLength
/**
* Inserts the given String pointer as the item just after refItem.
* If refItem is a null pointer the String will inserted at the
* beginning of the List (ie, insert after nothing).
* This method assumes refItem is a member of this list, and since this
* is a private method, I feel that's a valid assumption
**/
void StringList::insertAfter(String* strptr, StringListItem* refItem) {
//-- if refItem == null insert at end
if (!refItem) {
if (firstItem) insertBefore(strptr, firstItem);
else add(strptr);
return;
}
//-- if inserting at end of list
if (refItem == lastItem) {
add(strptr);
return;
}
//-- insert into middle of list
StringListItem* sItem = new StringListItem;
if (sItem) {
sItem->strptr = strptr;
sItem->prevItem = refItem;
sItem->nextItem = refItem->nextItem;
refItem->nextItem = sItem;
// increase the item count
++itemCount;
}
} //-- insertAfter
/**
* Inserts the given String pointer as the item just before refItem.
* If refItem is a null pointer the String will inserted at the
* end of the List (ie, insert before nothing).
* This method assumes refItem is a member of this list, and since this
* is a private method, I feel that's a valid assumption
**/
void StringList::insertBefore(String* strptr, StringListItem* refItem) {
//-- if refItem == null insert at end
if (!refItem) {
add(strptr);
return;
}
StringListItem* sItem = new StringListItem;
if (sItem) {
sItem->strptr = strptr;
sItem->nextItem = refItem;
sItem->prevItem = refItem->prevItem;
refItem->prevItem = sItem;
}
if (refItem == firstItem) firstItem = sItem;
if (itemCount == 0) lastItem = sItem;
// increase the item count
++itemCount;
} //-- insertBefore
/**
* Returns a StringListIterator for this StringList, this iterator
* will need to be deleted by the caller.
**/
StringListIterator* StringList::iterator() {
return new StringListIterator(this);
} //-- iterator
String* StringList::remove(String* strptr) {
StringListItem* sItem = firstItem;
while (sItem) {
if (sItem->strptr == strptr) {
remove(sItem);
delete sItem;
return strptr;
}
sItem = sItem->nextItem;
}
// not in list
return 0;
} //-- remove
StringList::StringListItem* StringList::remove(StringList::StringListItem* sItem) {
if (sItem->prevItem) {
sItem->prevItem->nextItem = sItem->nextItem;
}
if (sItem == firstItem) firstItem = sItem->nextItem;
if (sItem == lastItem) lastItem = sItem->prevItem;
//-- decrease Item count
--itemCount;
return sItem;
} //-- remove
/**
* Removes all Strings equal to the given String from the list
* All removed strings will be destroyed
**/
void StringList::remove(String& search) {
StringListItem* sItem = firstItem;
while (sItem) {
if (sItem->strptr->isEqual(search)) {
delete sItem->strptr;
StringListItem* temp = remove(sItem);
sItem = sItem->nextItem;
delete temp;
}
else sItem = sItem->nextItem;
}
} //-- remove
//----------------------------------------/
//- Implementation of StringListIterator -/
//----------------------------------------/
/**
* Creates a new StringListIterator for the given StringList
**/
StringListIterator::StringListIterator(StringList* list) {
stringList = list;
currentItem = 0;
allowRemove = MB_FALSE;
} //-- StringListIterator
StringListIterator::~StringListIterator() {
//-- overrides default destructor to do nothing
} //-- ~StringListIterator
/**
* Adds the String pointer to the StringList of this StringListIterator.
* The String pointer is inserted as the next item in the StringList
* based on the current position within the StringList
**/
void StringListIterator::add(String* strptr) {
stringList->insertAfter(strptr,currentItem);
allowRemove = MB_FALSE;
} //-- add
/**
* Returns true if a sucessful call to the next() method can be made
**/
MBool StringListIterator::hasNext() {
if (currentItem) {
return (currentItem->nextItem != 0);
}
return (stringList->firstItem != 0);
} //-- hasNext
/**
* Returns true if a successful call to the previous() method can be made
**/
MBool StringListIterator::hasPrevious() {
if (currentItem) {
return (currentItem->prevItem != 0);
}
return MB_FALSE;
} //-- hasPrevious
/**
* Returns the next String in the list
**/
String* StringListIterator::next() {
if (currentItem) {
if (currentItem->nextItem) {
currentItem = currentItem->nextItem;
allowRemove = MB_TRUE;
return currentItem->strptr;
}
}
else {
currentItem = stringList->firstItem;
allowRemove = MB_TRUE;
if (currentItem)
return currentItem->strptr;
}
return 0;
} //-- next
/**
* Returns the previous String in the list
**/
String* StringListIterator::previous() {
if (currentItem) {
if (currentItem->prevItem) {
currentItem = currentItem->prevItem;
allowRemove = MB_TRUE;
return currentItem->strptr;
}
}
return 0;
}
//-- prev
/**
* Removes the String last return by the next() or previous();
* The removed String* is returned
**/
String* StringListIterator::remove() {
if (allowRemove == MB_FALSE) return 0;
allowRemove = MB_FALSE;
StringList::StringListItem* sItem = 0;
if (currentItem) {
// Make previous Item the current Item or null
sItem = currentItem;
if (stringList->firstItem == sItem) currentItem = 0;
stringList->remove(sItem);
return sItem->strptr;
}
return 0;
} //-- remove
/**
* Resets the current location within the StringList to the beginning
**/
void StringListIterator::reset() {
currentItem = 0;
} //-- reset