X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ffilexml.C;h=e4e281466dff68b862f85224eb0e6596023ca51e;hp=58a83e9eafe7024f5b4c843c132b020e9d407706;hb=54b918a8b84f666bf32548ebd12b93908061d2a6;hpb=fcffc409fe3f6909f4e5d9e105a1cbb5bc68eb5d diff --git a/cinelerra-5.1/cinelerra/filexml.C b/cinelerra-5.1/cinelerra/filexml.C index 58a83e9e..e4e28146 100644 --- a/cinelerra-5.1/cinelerra/filexml.C +++ b/cinelerra-5.1/cinelerra/filexml.C @@ -264,7 +264,7 @@ int XMLTag::write_tag(FileXML *xml) const char *prop = properties[i]->prop; const char *value = properties[i]->value; int plen = strlen(prop), vlen = strlen(value); - bool need_quotes = !vlen || strchr(value,' '); + bool need_quotes = !vlen || strchr(value,' ') || strchr(value,'\n'); buf->next(' '); xml->append_text(prop, plen); buf->next('='); @@ -452,8 +452,9 @@ int FileXML::append_text(const char *text, long len) char* FileXML::get_data() { + char *data = (char *)buffer->cstr(); long ofs = buffer->itell(); - return (char *)buffer->pos(ofs); + return data + ofs; } char* FileXML::string() { @@ -465,23 +466,40 @@ long FileXML::length() return buffer->otell(); } -char* FileXML::read_text() +char* FileXML::read_text(const char *tag_title) { + if( !tag_title ) tag_title = tag.title; int ch = buffer->next(); // filter out first char is new line if( ch == '\n' ) ch = buffer->next(); - long ipos = buffer->itell()-1; + long ipos = buffer->itell(); + if( ch >= 0 ) --ipos; + long pos = ipos; // scan for delimiter - while( ch >= 0 && ch != left_delm ) ch = buffer->next(); - long pos = buffer->itell()-1; - if( ch >= 0 ) buffer->iseek(pos); + while( ch >= 0 ) { + while( ch >= 0 && ch != left_delm ) ch = buffer->next(); + if( ch < 0 ) break; + pos = buffer->itell()-1; + if( (ch = buffer->next()) != '/' ) continue; + const char *cp = tag_title; + while( (ch=buffer->next()) >= 0 && ch == *cp ) ++cp; + if( ch < 0 ) break; + if( *cp ) continue; + while( ch == ' ' ) ch = buffer->next(); + if( ch == right_delm ) break; + } + if( ch < 0 ) + pos = buffer->itell(); + buffer->iseek(pos); long len = pos - ipos; if( len >= output_length ) { delete [] output; output_length = len+1; output = new char[output_length]; } - decode(output,(const char *)buffer->pos(ipos), len); + if( len > 0 ) + decode(output,(const char *)buffer->pos(ipos), len); + output[len] = 0; return output; }