/*! * Assuming a string of standard abiword properties eg. "fred:nerk; table-width:1.0in; table-height:10.in" * Return the value of the property sProp or NULL if it is not present. * This UT_UTF8String * should be deleted by the calling programming after it is finished with it. */ UT_UTF8String UT_UTF8String_getPropVal(const UT_UTF8String & sPropertyString, const UT_UTF8String & sProp) { UT_UTF8String sWork(sProp); sWork += ":"; const char * szWork = sWork.utf8_str(); const char * szProps = sPropertyString.utf8_str(); const char * szLoc = strstr(szProps,szWork); if(szLoc == NULL) { return UT_UTF8String(); } // // Look if this is the last property in the string. // const char * szDelim = strchr(szLoc,';'); if(szDelim == NULL) { // // Remove trailing spaces // UT_sint32 iSLen = strlen(szProps); while(iSLen > 0 && szProps[iSLen-1] == ' ') { iSLen--; } // // Calculate the location of the substring // UT_sint32 offset = static_cast<UT_sint32>(reinterpret_cast<size_t>(szLoc) - reinterpret_cast<size_t>(szProps)); offset += strlen(szWork); return UT_UTF8String(sPropertyString.substr(offset,(iSLen - offset))); } else { szDelim = strchr(szLoc,';'); if(szDelim == NULL) { // // bad property string // UT_ASSERT(UT_SHOULD_NOT_HAPPEN); return UT_UTF8String(); } // // Remove trailing spaces. // while(*szDelim == ';' || *szDelim == ' ') { szDelim--; } // // Calculate the location of the substring // UT_sint32 offset = static_cast<UT_sint32>(reinterpret_cast<size_t>(szLoc) - reinterpret_cast<size_t>(szProps)); offset += strlen(szWork); UT_sint32 iLen = static_cast<UT_sint32>(reinterpret_cast<size_t>(szDelim) - reinterpret_cast<size_t>(szProps)) + 1; return UT_UTF8String(sPropertyString.substr(offset,(iLen - offset))); } }
/*! * Assuming a string of standard abiword properties eg. "fred:nerk; table-width:1.0in; table-height:10.in" * Remove the property sProp and it's value from the string of properties. */ void UT_std_string_removeProperty(std::string & sPropertyString, const std::string & sProp) { std::string sWork ( sProp ); sWork += ":"; const char * szWork = sWork.c_str(); const char * szProps = sPropertyString.c_str(); const char * szLoc = strstr(szProps,szWork); if(szLoc == NULL) { //Not here, do nothing return ; } // Check if this is a real match if (szLoc != szProps) { // This is not the first property. It could be a false match // for example, 'frame-col-xpos' and 'xpos' std::string sWorkCheck("; "); sWorkCheck += sWork; const char * szLocCheck = strstr(szProps,sWorkCheck.c_str()); if (!szLocCheck) { // False match return; } szLoc = szLocCheck; } UT_sint32 locLeft = static_cast<UT_sint32>(reinterpret_cast<size_t>(szLoc) - reinterpret_cast<size_t>(szProps)); std::string sLeft; if(locLeft == 0) { sLeft.clear(); } else { sLeft = sPropertyString.substr(0,locLeft); } locLeft = static_cast<UT_sint32>(sLeft.size()); std::string sNew; if(locLeft > 0) { sNew = sLeft.substr(0,locLeft+1); } else { sNew.clear(); } // Look for ";" to get right part const char * szDelim = strchr(szLoc,';'); if(szDelim == NULL) { // No properties after this, just assign and return sPropertyString = sNew; } else { // Just slice off the properties and tack them onto the pre-existing sNew while(*szDelim == ';' || *szDelim == ' ') { szDelim++; } UT_sint32 offset = static_cast<UT_sint32>(reinterpret_cast<size_t>(szDelim) - reinterpret_cast<size_t>(szProps)); UT_sint32 iLen = sPropertyString.size() - offset; if(sNew.size() > 0) { sNew += "; "; } sNew += sPropertyString.substr(offset,iLen); sPropertyString = sNew; } }