void DeleteFirstElementOfList(Node _head)
{
	Node _firstElement = GetNextElement(_head);

	_head->Next = GetNextElement(_firstElement);

	free(_firstElement);
}
void PrintAllListElements(Node _head)
{
	if (IsListEmpty(_head))
	{
		printf("Lista je prazna.\n");
		return;
	}

	Node _currentElement = GetNextElement(_head);
	while (!IsOutOfRange(_currentElement))
	{
		PrintListElement(_currentElement);
		_currentElement = GetNextElement(_currentElement);
	}
}
EXPORT_C TInt CTestConfig::GetElement(const TDesC8& aInput, TChar aDelimiter, TInt aIndex, TPtrC8& aOutput, TBool aTrimOutput)
	{
	TLex8 input(aInput);
	TInt err = KErrNone;
	TPtrC8 ptr;

	for (TInt i = 0; i <= aIndex && err == KErrNone; i++)
		{
		err = GetNextElement(input, aDelimiter, ptr);
		}

	if (err == KErrNone)
		{
		if (aTrimOutput)
			aOutput.Set(Trim(ptr));
		else
			aOutput.Set(ptr);
		}
	else 
		{
		const TInt count = CountElements(aInput, aDelimiter);
		const TInt len = aInput.Length();

		if (len != 0 && count - 1 == aIndex && TChar(aInput[len-1]) == aDelimiter)
			{
			aOutput.Set(KNullDesC8);
			err = KErrNone;
			}
		}

	return err;
	}
Exemple #4
0
CXMLElement* CXMLElement::Clone(CXMLElement* pParent) const
{
	CXMLElement* pClone = new CXMLElement( pParent, m_sName );
	if ( ! pClone ) return NULL;			// Out of memory

	for ( POSITION pos = GetAttributeIterator() ; pos ; )
	{
		CXMLAttribute* pAttribute = GetNextAttribute( pos )->Clone( pClone );
		if ( ! pAttribute ) return NULL;	// Out of memory

		CString strNameLower( pAttribute->m_sName );
		strNameLower.MakeLower();

		// Delete the old attribute if one exists
		CXMLAttribute* pExisting;
		if ( pClone->m_pAttributes.Lookup( strNameLower, pExisting ) )
			delete pExisting;

		pClone->m_pAttributes.SetAt( strNameLower, pAttribute );

		if ( ! pClone->m_pAttributesInsertion.Find( strNameLower ) )
			pClone->m_pAttributesInsertion.AddTail( strNameLower );		// Track output order workaround
	}

	for ( POSITION pos = GetElementIterator() ; pos ; )
	{
		CXMLElement* pElement = GetNextElement( pos );
		pClone->m_pElements.AddTail( pElement->Clone( pClone ) );
	}

	ASSERT( ! pClone->m_sName.IsEmpty() );
	pClone->m_sValue = m_sValue;

	return pClone;
}
Exemple #5
0
BOOL CXMLElement::Equals(CXMLElement* pXML) const
{
	if ( this == NULL || pXML == NULL ) return FALSE;
	if ( pXML == this ) return TRUE;

	if ( m_sName != pXML->m_sName ) return FALSE;
	if ( m_sValue != pXML->m_sValue ) return FALSE;

	if ( GetAttributeCount() != pXML->GetAttributeCount() ) return FALSE;
	if ( GetElementCount() != pXML->GetElementCount() ) return FALSE;

	for ( POSITION pos = GetAttributeIterator() ; pos ; )
	{
		CXMLAttribute* pAttribute1 = GetNextAttribute( pos );
		CXMLAttribute* pAttribute2 = pXML->GetAttribute( pAttribute1->m_sName );
		if ( pAttribute2 == NULL ) return FALSE;
		if ( ! pAttribute1->Equals( pAttribute2 ) ) return FALSE;
	}

	POSITION pos1 = GetElementIterator();
	POSITION pos2 = pXML->GetElementIterator();

	for ( ; pos1 && pos2 ; )
	{
		CXMLElement* pElement1 = GetNextElement( pos1 );
		CXMLElement* pElement2 = pXML->GetNextElement( pos2 );
		if ( pElement1 == NULL || pElement2 == NULL ) return FALSE;
		if ( ! pElement1->Equals( pElement2 ) ) return FALSE;
	}

	if ( pos1 != NULL || pos2 != NULL ) return FALSE;

	return TRUE;
}
Exemple #6
0
void CXMLElement::AddRecursiveWords(CString& strWords) const
{
	for ( POSITION pos = GetAttributeIterator() ; pos ; )
	{
		CXMLAttribute* pAttribute = GetNextAttribute( pos );
		CString strText = pAttribute->GetName();

		if ( strText.Find( ':' ) >= 0 ) continue;
		if ( strText.CompareNoCase( _T("SHA1") ) == 0 ) continue;	// NOTE: PeerProject/Shareaza Specific

		if ( ! strWords.IsEmpty() ) strWords += ' ';
		strWords += pAttribute->GetValue();
	}

	for ( POSITION pos = GetElementIterator() ; pos ; )
	{
		GetNextElement( pos )->AddRecursiveWords( strWords );
	}

	if ( ! m_sValue.IsEmpty() )
	{
		if ( ! strWords.IsEmpty() )
			strWords += ' ';
		strWords += m_sValue;
	}
}
Node GetLastElement(Node _head)
{
	Node _lastElement = _head;

	while (!IsLastElement(_lastElement))
		_lastElement = GetNextElement(_lastElement);

	return _lastElement;
}
Exemple #8
0
void CXMLElement::Serialize(CArchive& ar)
{
	CXMLNode::Serialize( ar );

	if ( ar.IsStoring() )
	{
		ar.WriteCount( GetAttributeCount() );

		for ( POSITION pos = GetAttributeIterator() ; pos ; )
		{
			GetNextAttribute( pos )->Serialize( ar );
		}

		ar.WriteCount( GetElementCount() );

		for ( POSITION pos = GetElementIterator() ; pos ; )
		{
			GetNextElement( pos )->Serialize( ar );
		}
	}
	else // Loading
	{
		for ( int nCount = (int)ar.ReadCount() ; nCount > 0 ; nCount-- )
		{
			CXMLAttribute* pAttribute = new CXMLAttribute( this );
			pAttribute->Serialize( ar );

			// Skip attribute if name is missing
			if ( pAttribute->m_sName.IsEmpty() )
			{
				delete pAttribute;
				continue;
			}

			CString strNameLower( pAttribute->m_sName );
			strNameLower.MakeLower();

			// Delete the old attribute if one exists
			CXMLAttribute* pExisting;
			if ( m_pAttributes.Lookup( strNameLower, pExisting ) )
				delete pExisting;

			m_pAttributes.SetAt( strNameLower, pAttribute );

			if ( ! m_pAttributesInsertion.Find( strNameLower ) )
				m_pAttributesInsertion.AddTail( strNameLower );		// Track output order workaround
		}

		for ( int nCount = (int)ar.ReadCount() ; nCount > 0 ; nCount-- )
		{
			CXMLElement* pElement = new CXMLElement( this );
			pElement->Serialize( ar );
			m_pElements.AddTail( pElement );
		}
	}
}
void
XDMFParser::SkipToEndTag()
{
    ElementType elementType;

    //
    // Read the rest of the start tag and get the next element.
    //
    while (GetNextAttribute()) /* do nothing */;

    elementType = GetNextElement();

    //
    // Keep reading tags until we get a zero nesting level.
    //
    int nestingLevel = 1;
    while (elementType != TYPE_EOF)
    {
        switch (elementType)
        {
          case TYPE_START_TAG:
            nestingLevel++;
            //
            // Read the rest of the start tag.
            //
            while (GetNextAttribute()) /* do nothing */;

            break;

          case TYPE_END_TAG:
            nestingLevel--;
            break;

          default:
            break;
        }
        if (nestingLevel == 0)
            break;

        elementType = GetNextElement();
    }
}
int* GetValuesAndDeleteFirstNElements(Node _head, int numberOfElements)
{
	int i;
	int* firstNElements = (int*)malloc(sizeof(int) * numberOfElements);

	for (i = 0; i < numberOfElements; i++)
	{
		firstNElements[i] = GetNextElement(_head)->Value;
		Pop(_head);
	}

	return firstNElements;
}
LPCFGELEMENTINFO CCfgFile::FindElement( HGROUP hGroup, LPCTSTR pName )
{_STTEX();
	// Find the NULL group
	if ( hGroup == NULL )
	{	hGroup = VerifyGroup( NULL );
		if ( hGroup == NULL ) return FALSE;
	} // end if

	LPCFGELEMENTINFO	pcei = NULL;
	while ( ( pcei = GetNextElement( hGroup, pcei ) ) != NULL )
		if ( !strcmpi( pName, pcei->name ) )
			return pcei;

	return NULL;
}
BOOL CCfgFile::CopyGroup( LPCTSTR pGroup, LPCTSTR pNewGroup )
{_STTEX();
	HGROUP hGroup = FindGroup( pGroup );
	if ( hGroup == NULL ) return FALSE;

	RemoveGroup( pNewGroup );
	HGROUP hNewGroup = AddGroup( pNewGroup );
	if ( hNewGroup == NULL ) return FALSE;

	// Copy each element
	LPCFGELEMENTINFO pei = NULL;
	while( ( pei = GetNextElement( hGroup, pei ) ) != NULL )
		AddElement( hNewGroup, pei->name, pei->type, pei->size, pei->value );

	return TRUE;
}
Exemple #13
0
bool Xml::FindElement(FILE * file, const char *element, char *content, size_t maxContentLength) const
{
	if (file == NULL || element == NULL || maxContentLength <= 1)
		return false;

	bool result;
	char element2[MAX_ELEMENT + 1];

	do
	{
		result = GetNextElement(file, element2, MAX_ELEMENT, content, maxContentLength);
		if (*element2 == 0) // see if not even an element maybe because EOF
		{
			return false;
		}
	} while (result && strcmp(element, element2) != 0);

	return result;
}
Exemple #14
0
void CXMLElement::ToString(CString& strXML, BOOL bNewline) const
{
	// strXML += '<' + m_sName; Optimzed:
	strXML.AppendChar( _T('<') );
	strXML.Append( m_sName );

	POSITION pos = GetAttributeIterator();
	for ( ; pos ; )
	{
		strXML.AppendChar( _T(' ') );
		const CXMLAttribute* pAttribute = GetNextAttribute( pos );
		pAttribute->ToString( strXML );
	}

	pos = GetElementIterator();

	if ( pos == NULL && m_sValue.IsEmpty() )
	{
		strXML.Append( _PT("/>") );
		if ( bNewline )
			strXML.Append( _PT("\r\n") );
		return;
	}

	strXML.AppendChar( _T('>') );
	if ( bNewline && pos )
		strXML.Append( _PT("\r\n") );

	while ( pos )
	{
		const CXMLElement* pElement = GetNextElement( pos );
		pElement->ToString( strXML, bNewline );
	}

	strXML += Escape( m_sValue );

	strXML.Append( _PT("</") );
	strXML.Append( m_sName );
	strXML.AppendChar( _T('>') );
	if ( bNewline )
		strXML.Append( _PT("\r\n") );
}
BSLXMLERRCODE CBSLXMLDocumentEx::SkipContainer(CBSLXMLElementEx& oElement)
{
    BSLXMLERRCODE rc = BSLXMLERR_FAILURE;
    CBSLXMLElementEx oWorkingElement;
    wxUint32 uiNestedContainerLevel = 0;

    if (CBSLXMLElementEx::ElementTypeContainer != oElement.GetType()) 
    {
        return BSLXMLERR_INVALID_PARAMETER;
    }

    do
    {
        rc = GetNextElement(oWorkingElement);
        if (BSLXMLERR_SUCCESS == rc)
        {
            if (CBSLXMLElementEx::ElementTypeContainer == oWorkingElement.GetType())
            {
                ++uiNestedContainerLevel;
            }
            else if (CBSLXMLElementEx::ElementTypeContainerEnd == oWorkingElement.GetType())
            {
                if (0 < uiNestedContainerLevel)
                {
                    --uiNestedContainerLevel;
                }
                else
                {
                    if (oWorkingElement.GetNameHash() == oElement.GetNameHash())
                    {
                        break;
                    }
                }
            }
        }
    }
    while (BSLXMLERR_SUCCESS == rc);

    return rc;
}
DWORD CCfgFile::SaveToMem(LPBYTE ptr, DWORD len)
{_STTEX();
	DWORD		i = 0;
	CWinFile	file;

	// Set crypto key
	if ( *m_szKey ) file.CryptoSetKey( m_szKey );

	// Write out header
	WRITESZ( "; Configuration File\r\n;\r\n" );

	LPCFGGROUPINFO	pcgi = NULL;
	while ( ( pcgi = GetNext( pcgi ) ) != NULL )
	{
		// Write out the name
		if ( *pcgi->name != NULL )
		{	WRITESZ( "\r\n;-----------------------------------------------------------------" );
			WRITESZ( "\r\n[" );
			WRITESZ( pcgi->name );
			WRITESZ( "]" );
			WRITESZ( "\r\n;-----------------------------------------------------------------" );
			WRITESZ( "\r\n;\r\n" );
		} // end if

		// Write out file data
		TMem< char >		buf;
		DWORD				size;
		char				msg[ CFG_STRSIZE ];
		LPCFGELEMENTINFO	pcei = NULL;
		while ( ( pcei = GetNextElement( pcgi, pcei ) ) != NULL )
		{
			// Write out type
			if ( pcei->type != 0 )
			{
				wsprintf( msg, "%lu:", pcei->type );
				WRITESZ( msg );
			} // end if

			// Write out the name
			size = GetMinCanonicalizeBufferSize( strlen( pcei->name ) );
			if ( buf.allocate( size + 1 ) )
			{
				// Write string
				if ( CanonicalizeBuffer( buf, (LPBYTE)pcei->name, strlen( pcei->name ) ) )
					WRITE( buf, strlen( buf ) );

				buf.destroy();

			} // end if

			if ( pcei->size != 0 || pcei->value != NULL || pcei->type != 0 )
			{
				// Write out the equator
				if ( pcei->type == CFG_DWORD ) 
					WRITESZ( "=#" );
				else WRITESZ( "=>" );

				// Write out DWORD value
				if ( pcei->type == CFG_DWORD )
				{
					wsprintf( msg, "%lu:", pcei->value );
					WRITESZ( msg );
				} // end if

				else if ( size > 0 )
				{
					// Write out the data
					size = GetMinCanonicalizeBufferSize( pcei->size );
					if ( buf.allocate( size + 1 ) )
					{
							// Write string
						if ( CanonicalizeBuffer( buf, (LPBYTE)pcei->value, pcei->size ) )
							WRITE( buf, strlen( buf ) );

						buf.destroy();
					} // end if

				} // end else

			} // end if

			WRITESZ( "\r\n" );
					
		} // end while

	} // end while

	return i;
}
void InsertElement(Node _previous, Node _next)
{
	_next->Next = GetNextElement(_previous);
	_previous->Next = _next;
}
Exemple #18
0
bool ContentElementObject::CreateContext(TextLineObject*pLine,int nID)
{
	ContentElementObject*pNext=GetNextElement();
	if(!pNext) return false;
	return pNext->CreateContext(pLine,nID);
}
Exemple #19
0
bool KGUIWin32Wnd::MessageHandler(const KDS_EVENT& event)
{
	bool bHandled = false;

	if (!bHandled)
	{
		switch(event.EventType)
		{
		case KET_GUI:
			break;
		case KET_MOUSE:
			{
				if (event.MouseEvent.Event == KME_MOUSE_MOVED &&
					m_bCapturing &&	m_CapturedElement != NULL)
				{
					return m_CapturedElement->OnEvent(event);
				}

				if (event.MouseEvent.Event == KME_MOUSE_MOVED)
				{
					// Mouse enter/leave....
					UpdateHoveredElement(event);
				}

				/*if (event.MouseEvent.Event == KME_LMOUSE_DOWN)
				{
					if ( (m_pGUIHover && m_pGUIHover != m_pGUIFocus) || !m_pGUIFocus )
						SetFocus(m_pGUIHover);
				}*/

				// sending input to focus
				//if (m_pGUIFocus && m_pGUIFocus->OnEvent(event))
				//	return true;

				// focus could have died in last call
				if (NULL != m_pGUIHover)
				{
					return m_pGUIHover->OnEvent(event);
				}
				break;
			}
		case KET_KEY:
			{
				// send focus changing event
				if (event.KeyEvent.PressedDown &&
					event.KeyEvent.Key == KEY_TAB)
				{
					IGUIElement * pGUINext = GetNextElement(event.KeyEvent.Shift, event.KeyEvent.Control);
					if (pGUINext && pGUINext != m_pGUIFocus)
					{
						if (SetFocus(pGUINext))
							return true;
					}
				}

				if (m_pGUIFocus)
				{
					return m_pGUIFocus->OnEvent(event);
				}
			}
			break;
		default:
			break;
		} // end switch
		return false;
	}
	return false;
}
AXMLElement* AXMLElement::GetNextElement(AXMLElement* pAfterElem,sWORD pStrId, sWORD pElementRef) {
	AXMLElement	*elem = NULL;
	VString		elemname;
	//gResFile->GetString(elemname,pStrId,pElementRef);
	return GetNextElement(pAfterElem,elemname);
}
Exemple #21
0
HRESULT CXmlHelper::Initialize(IXMLDOMElement *lpRootElem)
{
  TNktComPtr<IXMLDOMElement> cCurrElem, cNextElem;
  CNktComBStr cElemAttrIdBStr, cNameBstr;
  HRESULT hRes;
  SIZE_T i;
  LONG k;

  nktMemSet(aFundTypesIndexes, 0, sizeof(aFundTypesIndexes));
  hRes = GetFirstChildElement(lpRootElem, &cCurrElem);
  if (FAILED(hRes))
    return hRes;
  while (cCurrElem != NULL)
  {
    cElemAttrIdBStr.Reset();
    hRes = GetAttributeValue(cCurrElem, L"id", &cElemAttrIdBStr);
    if (FAILED(hRes))
    {
init_on_error:
      Reset();
      return hRes;
    }
    if (cElemAttrIdBStr[0] != 0)
    {
      //add this element
      if (nIdElemMapEntriesCount >= nIdElemMapEntriesSize)
      {
        ID_ELEM_MAP_ENTRY *lpNew;

        lpNew = (ID_ELEM_MAP_ENTRY*)nktMemMalloc((nIdElemMapEntriesSize+10240)*sizeof(ID_ELEM_MAP_ENTRY));
        if (lpNew == NULL) {
          hRes = E_OUTOFMEMORY;
          goto init_on_error;
        }
        nIdElemMapEntriesSize += 10240;
        if (lpIdElemMapEntries != NULL)
        {
          nktMemCopy(lpNew, lpIdElemMapEntries, nIdElemMapEntriesCount*sizeof(ID_ELEM_MAP_ENTRY));
          nktMemFree(lpIdElemMapEntries);
        }
        lpIdElemMapEntries = lpNew;
      }
      wcsncpy_s(lpIdElemMapEntries[nIdElemMapEntriesCount].szIdW, cElemAttrIdBStr, 16);
      lpIdElemMapEntries[nIdElemMapEntriesCount].szIdW[15] = 0;
      k = GetDbObjectClass(cCurrElem, 1);
      if (k == -1)
      {
        hRes = E_OUTOFMEMORY;
        goto init_on_error;
      }
      if (k == NKT_DBOBJCLASS_Fundamental)
      {
        cNameBstr.Reset();
        hRes = GetAttributeValue(cCurrElem, L"name", &cNameBstr);
        if (FAILED(hRes))
          goto init_on_error;
        if (_wcsicmp((LPWSTR)cNameBstr, L"signed char") == 0)
          k = NKT_DBFUNDTYPE_SignedByte;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"char") == 0)
          k = NKT_DBFUNDTYPE_AnsiChar;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"unsigned char") == 0)
          k = NKT_DBFUNDTYPE_UnsignedByte;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"short int") == 0)
          k = NKT_DBFUNDTYPE_SignedWord;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"short unsigned int") == 0)
          k = NKT_DBFUNDTYPE_UnsignedWord;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"int") == 0 ||
                 _wcsicmp((LPWSTR)cNameBstr, L"long int") == 0 ||
                 _wcsicmp((LPWSTR)cNameBstr, L"bool") == 0)
          k = NKT_DBFUNDTYPE_SignedDoubleWord;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"unsigned int") == 0 ||
                 _wcsicmp((LPWSTR)cNameBstr, L"long unsigned int") == 0)
          k = NKT_DBFUNDTYPE_UnsignedDoubleWord;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"long long int") == 0)
          k = NKT_DBFUNDTYPE_SignedQuadWord;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"long long unsigned int") == 0)
          k = NKT_DBFUNDTYPE_UnsignedQuadWord;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"float") == 0)
          k = NKT_DBFUNDTYPE_Float;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"double") == 0)
          k = NKT_DBFUNDTYPE_Double;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"long double") == 0)
          k = NKT_DBFUNDTYPE_LongDouble;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"wchar_t") == 0)
          k = NKT_DBFUNDTYPE_WideChar;
        else if (_wcsicmp((LPWSTR)cNameBstr, L"void") == 0)
          k = NKT_DBFUNDTYPE_Void;
        else {
          hRes = E_FAIL;
          goto init_on_error;
        }
        aFundTypesIndexes[k-NKT_DBFUNDTYPE_MIN] = 1;
      }
      else
        k = 0;
      lpIdElemMapEntries[nIdElemMapEntriesCount].nFundamentalType = (ULONG)k;
      lpIdElemMapEntries[nIdElemMapEntriesCount].lpElem = cCurrElem;
      lpIdElemMapEntries[nIdElemMapEntriesCount].lpElem->AddRef();
      nIdElemMapEntriesCount++;
    }
    //get next element
    hRes = GetNextElement(cCurrElem, &cNextElem);
    if (FAILED(hRes))
      goto init_on_error;
    cCurrElem.Attach(cNextElem.Detach());
  }
  //fast fundamental quick check
  for (k=0; k<X_ARRAYLEN(aFundTypesIndexes); k++) {
    if (aFundTypesIndexes[k] == 0) {
      hRes = E_FAIL;
      goto init_on_error;
    }
  }
  //sort elements by id
  qsort_s(lpIdElemMapEntries, nIdElemMapEntriesCount, sizeof(ID_ELEM_MAP_ENTRY), IdElemMapEntry_Compare,
          NULL);
  //find each fundamental
  nktMemSet(aFundTypesIndexes, 0, sizeof(aFundTypesIndexes));
  for (i=0; i<nIdElemMapEntriesCount; i++)
  {
    if (lpIdElemMapEntries[i].nFundamentalType != 0)
      aFundTypesIndexes[lpIdElemMapEntries[i].nFundamentalType - NKT_DBFUNDTYPE_MIN] = i;
  }
  //fast fundamental quick check (should not happen)
  for (k=0; k<X_ARRAYLEN(aFundTypesIndexes); k++) {
    if (aFundTypesIndexes[k] == 0) {
      hRes = E_FAIL;
      goto init_on_error;
    }
  }
  return S_OK;
}
void
XDMFParser::PrintFile()
{
    int j;
    int indent = 0;

    //
    // Process the next 100000 elements. This is a precaution against
    // getting into an infinite loop. It could just as well be a while
    // true loop.
    //
    for (int i = 0; i < 100000; i++)
    {
        //
        // We are getting the element type at the beginning of the
        // loop so that we can handle the END_TAG now to get the
        // indentation correct.
        //
        ElementType elementType = GetNextElement();
        if (elementType == TYPE_END_TAG) indent--;

        for (int k = 0; k < indent ; k++)
            cerr << " ";

        switch (elementType)
        {
          case TYPE_PI:
            cerr << "Processing Information." << endl;
            break;
          case TYPE_COMMENT:
            cerr << "Comment." << endl;
            break;
          case TYPE_SPECIAL:
            cerr << "Special." << endl;
            break;
          case TYPE_START_TAG:
            indent++;
            cerr << "<" << GetElementName();
            j = 0;
            while (j < 100 && GetNextAttribute())
            {
                cerr << " " << GetAttributeName() << "=\""
                     << GetAttributeValue() << "\"";
                j++;
            }
            cerr << ">" << endl;
            break;
          case TYPE_END_TAG:
            cerr << "</" << GetElementName() << ">" << endl;
            break;
          case TYPE_CDATA:
            if (GetCDataLength() <= 1023)
                cerr << GetCDataValue() << endl;
            else
            {
                FILE *file = fopen(fname, "r");
                fseek(file, GetCDataOffset(), SEEK_SET);
                char *buf = new char[GetCDataLength()+1];
                fread(buf, 1, GetCDataLength(), file);
                buf[GetCDataLength()] = '\0';
                fclose(file);
                cerr << buf << endl;
                delete [] buf;
            }
            break;
          case TYPE_EOF:
            return;
            break;
          case TYPE_ERROR:
            cerr << "Error." << endl;
            break;
        }
    }
}
BOOL CCfgFile::Save(LPCTSTR pFile)
{_STTEX();
	CWinFile	file;

	// Set crypto key
	if ( *m_szKey ) file.CryptoSetKey( m_szKey );

	// Verify file name
	if ( pFile == NULL ) pFile = m_szFileName;

	// Open the file
	if ( !file.OpenNew( pFile, GENERIC_WRITE ) ) return FALSE;

	// Write out header
	file.Write( "; Configuration File\r\n;\r\n" );

	LPCFGGROUPINFO	pcgi = NULL;
	while ( ( pcgi = GetNext( pcgi ) ) != NULL )
	{
		// Write out the name
		if ( *pcgi->name != NULL )
		{	file.Write( "\r\n;-----------------------------------------------------------------" );
			file.Write( "\r\n[" );
			file.Write( pcgi->name );
			file.Write( "]" );
			file.Write( "\r\n;-----------------------------------------------------------------" );
			file.Write( "\r\n;\r\n" );
		} // end if

		// Write out file data
		TMem< char >		buf;
		DWORD				size;
		char				msg[ CFG_STRSIZE ];
		LPCFGELEMENTINFO	pcei = NULL;
		while ( ( pcei = GetNextElement( pcgi, pcei ) ) != NULL )
		{
			if ( !strcmpi( pcei->name, "font" ) )
			{	int x = 0; }

			// Write out type
			if ( pcei->type != 0 )
			{
				wsprintf( msg, "%lu:", pcei->type );
				if ( !file.Write( msg ) ) return FALSE;
			} // end if

			// Write out the name
			size = GetMinCanonicalizeBufferSize( strlen( pcei->name ) );
			if ( buf.allocate( size + 1 ) )
			{
				// Write string
				if ( CanonicalizeBuffer( buf, (LPBYTE)pcei->name, strlen( pcei->name ) ) )
					file.Write( buf, strlen( buf ) );

				buf.destroy();
			} // end if

			if ( pcei->size != 0 || pcei->value != NULL || pcei->type != 0 )
			{
				// Write out the equator
				if ( pcei->type == CFG_DWORD ) 
					file.Write( "=#" );
				else file.Write( "=>" );

				// Write out DWORD value
				if ( pcei->type == CFG_DWORD )
				{
					wsprintf( msg, "%lu:", pcei->value );
					if ( !file.Write( msg ) ) return FALSE;
				} // end if

				else if ( size > 0 )
				{
					// Write out the data
					size = GetMinCanonicalizeBufferSize( pcei->size );
					if ( buf.allocate( size + 1 ) )
					{
							// Write string
						if ( CanonicalizeBuffer( buf, (LPBYTE)pcei->value, pcei->size ) )
							file.Write( buf, strlen( buf ) );

						buf.destroy();
					} // end if

				} // end else

			} // end if

			file.Write( "\r\n" );
					
		} // end while

	} // end while

	return TRUE;
}