📄 xmlwrite.cpp
字号:
}/* * ~XMLWriterTag * ------------- * Destructor. * * input: * void * * output: * N/A * */XMLWriterTag::~XMLWriterTag(void){ // Go through the list of children and delete each of them. This will then be // repeated by the children's children and we will recursively delete the tree. LISTPOSITION tagPosition = m_tags.GetHeadPosition(); while (tagPosition != NULL) { delete (XMLWriterTag *)(m_tags.GetNext(tagPosition)); } // Delete the attributes... LISTPOSITION attrPosition = m_attributes.GetHeadPosition(); while (attrPosition != NULL) { delete (XMLWriterAttribute *)(m_attributes.GetNext(attrPosition)); } // Delete the strings... if (m_name != NULL) delete [] m_name; if (m_comment != NULL) delete [] m_comment; m_name = NULL; m_comment = NULL;}/* * GetLength * --------- * Returns the length required to print this and all it's attributes. * * input: * void * * output: * INT32 - The length required. * */INT32XMLWriterTag::GetLength(void) const{ INT32 length = 0; // Get the combined attributes lengths... LISTPOSITION position = m_attributes.GetHeadPosition(); while (position != NULL) { length += ((XMLWriterAttribute *)(m_attributes.GetNext(position)))->GetLength(); } // Get the combined lengths of the child tags... position = m_tags.GetHeadPosition(); while (position != NULL) { length += ((XMLWriterTag *)(m_tags.GetNext(position)))->GetLength(); } // Tack on the length required in the different cases... length += 2*m_depth + ((m_name != NULL)? 2*(strlen(m_name)) : 0) + 20 + ((m_comment != NULL)? strlen(m_comment) : 0); // 20 is arbitrary, based on all the stuff needed for brackets and slashes. return length;}/* * Write * ----- * Write out this tag to the given file object. * * input: * IHXBuffer *buffer - Pointer to buffer to use. * INT32& loc - Pointer to a location in the buffer where to print to. * * output: * void * */voidXMLWriterTag::Write(IHXBuffer *buffer, INT32& loc){ char temp[MAX_WRITER_BUFFER]; /* Flawfinder: ignore */ char tabs[MAX_WRITER_BUFFER]; /* Flawfinder: ignore */ temp[0] = tabs[0] = '\0'; // See the depth of this tag and create a string composed of depth number of tabs... for (INT32 i = 0; i < m_depth; i++) SafeStrCat(tabs, "\t", MAX_WRITER_BUFFER); // Switch on the type of tag... switch (m_type) { case XMLPlainTag: { // If the name field is empty, return... if (m_name == NULL) return; // If there are attributes.... if (m_attributes.GetCount() > 0) { // Open the open tag... SafeSprintf(temp, MAX_WRITER_BUFFER, "%s<%s%s", tabs, m_name, WRITER_EOL); SafeStrCpy((char *)(buffer->GetBuffer()) + loc, temp, buffer->GetSize()-loc); loc += strlen(temp); // Write the attributes... WriteAttributes(buffer, loc); // Close the open tag... SafeSprintf(temp, MAX_WRITER_BUFFER, ">%s", WRITER_EOL); SafeStrCpy((char *)(buffer->GetBuffer()) + loc, temp, buffer->GetSize()-loc); loc += strlen(temp); // Write any other tags... WriteTags(buffer, loc); // Write the closing tag... SafeSprintf(temp, MAX_WRITER_BUFFER, "%s</%s>%s", tabs, m_name, WRITER_EOL); SafeStrCpy((char *)(buffer->GetBuffer()) + loc, temp, buffer->GetSize()-loc); loc += strlen(temp); } // When there are no attributes, just open and close the tag... else { // Open the tag... SafeSprintf(temp, MAX_WRITER_BUFFER, "%s<%s>%s", tabs, m_name, WRITER_EOL); SafeStrCpy((char *)(buffer->GetBuffer()) + loc, temp, buffer->GetSize()-loc); loc += strlen(temp); // Write the other tags... WriteTags(buffer, loc); // Close the tag... SafeSprintf(temp, MAX_WRITER_BUFFER, "%s</%s>%s", tabs, m_name, WRITER_EOL); SafeStrCpy((char *)(buffer->GetBuffer()) + loc, temp, buffer->GetSize()-loc); loc += strlen(temp); } } break; case XMLCommentTag: { // If the comment field is empty, return... if (m_comment == NULL) return; // Otherwise, format it and write it out... SafeSprintf(temp, MAX_WRITER_BUFFER, "%s<-- %s -->%s", tabs, m_comment, WRITER_EOL); SafeStrCpy((char *)(buffer->GetBuffer()) + loc, temp, buffer->GetSize()-loc); loc += strlen(temp); } break; case XMLDirectiveTag: { } break; case XMLProcInstTag: { // If there are no attributes, then don't print out... if (m_attributes.IsEmpty()) return; if (m_name == NULL) return; // Otherwise, format the beginning... SafeSprintf(temp, MAX_WRITER_BUFFER, "%s<?%s ", tabs, m_name); SafeStrCpy((char *)(buffer->GetBuffer()) + loc, temp, buffer->GetSize()-loc); loc += strlen(temp); // Write out the attributes... WriteAttributes(buffer, loc); // Format the ending... SafeSprintf(temp, buffer->GetSize()-loc, "?>%s", WRITER_EOL); SafeStrCpy((char *)(buffer->GetBuffer()) + loc, temp, buffer->GetSize()-loc); loc += strlen(temp); } break; }}/* * SetProcessingInstruction * ------------------------ * Make this tag a processing instruction. * * input: * const char *instruction - Name of the instruction to use. * * output: * void * */void XMLWriterTag::SetProcessingInstruction(const char *instruction){ m_type = XMLProcInstTag; if (m_name != NULL) delete [] m_name; m_name = NULL; if (instruction != NULL) { m_name = new char[strlen(instruction) + 1]; strcpy(m_name, instruction); /* Flawfinder: ignore */ }}/* * WriteAttributes * --------------- * Write out the attributes for this tag. * * input: * IHXBuffer *buffer - Buffer to write to. * INT32& loc - Location to where we start writing. * * output: * void * */void XMLWriterTag::WriteAttributes(IHXBuffer *buffer, INT32& loc){ // If there are no attributes, return... if (m_attributes.IsEmpty()) return; // Write out the attributes to the buffer... LISTPOSITION position = m_attributes.GetHeadPosition(); while (position != NULL) { ((XMLWriterAttribute *)(m_attributes.GetNext(position)))->Write(buffer, loc); if (position != NULL) *(((char *)(buffer->GetBuffer())) + loc++) = '\n'; }}/* * WriteTags * --------- * Write out the tags for this tag. * * input: * IHXBuffer *buffer - Buffer to write to. * INT32& loc - Location to where we start writing. * * output: * void * */void XMLWriterTag::WriteTags(IHXBuffer *buffer, INT32& loc){ // If there are no attributes, return... if (m_tags.IsEmpty()) return; // Get the size and call write on each... LISTPOSITION position = m_tags.GetHeadPosition(); while (position != NULL) { ((XMLWriterTag *)(m_tags.GetNext(position)))->Write(buffer, loc); }}/* * CreateTag * --------- * Create a tag with the given name, adding it to the child list and return it. * * input: * const char *name - Name of the tag. * * output: * XMLWriterTag * - Pointer to the newly created tag. * */XMLWriterTag *XMLWriterTag::CreateTag(const char *name){ XMLWriterTag *newTag = new XMLWriterTag; HX_ASSERT(newTag != NULL); newTag->SetName(name); newTag->m_depth = m_depth + 1; m_tags.AddTail(newTag); return newTag;}/* * AddAttribute * ------------ * Add an attribute to the tag and then return a pointer to that attribute. * * input: * const char *name - Name of the attribute. * const char *value - Value of the attribute. * * output: * XMLWriterAttribute * - Attribute that was added. * */XMLWriterAttribute *XMLWriterTag::AddAttribute(const char *name, const char *value){ // Create an attribute... XMLWriterAttribute *newAttribute = new XMLWriterAttribute; HX_ASSERT(newAttribute != NULL); // Set the name and value... newAttribute->SetName(name); newAttribute->SetValue(value); newAttribute->m_depth = m_depth; // Add the attribute... m_attributes.AddTail(newAttribute); return newAttribute;}/* * CreateAttribute * --------------- * Creates an attribute, adding it to the list of attributes, then returning the pointer to it. * * input: * void * * output: * XMLWriterAttribute * - The pointer to the newly created attribute. * */XMLWriterAttribute *XMLWriterTag::CreateAttribute(void){ // Create the attribute... XMLWriterAttribute *newAttribute = new XMLWriterAttribute; HX_ASSERT(newAttribute != NULL); // Add the attribute to the list of attributes... m_attributes.AddTail(newAttribute); newAttribute->m_depth = m_depth; return newAttribute;}/* * SetComment * ---------- * Set the comment and set the type as a comment. * * input: * const char *comment - Comment to set. * * output: * void * */voidXMLWriterTag::SetComment(const char *comment){ if (m_comment != NULL) delete [] m_comment; m_comment = NULL; if (comment != NULL) { m_comment = new char[strlen(comment) + 1]; strcpy(m_comment, comment); /* Flawfinder: ignore */ } m_type = XMLCommentTag;}/* * SetName * ------- * Set the name of this tag. * * input: * const char *name - Name to set for this tag. * * output: * void * */voidXMLWriterTag::SetName(const char *name){ if (m_name != NULL) delete [] m_name; m_name = NULL; if (name != NULL) { m_name = new char[strlen(name) + 1]; strcpy(m_name, name); /* Flawfinder: ignore */ }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -