copying strings from gdome2 to external code
Isidor Zeuner <[email protected]> Thu, 25 Aug 2011 01:51:21 +0200 (CEST)
| Newsgroups | gmane.comp.gnome.gdome |
|---|---|
| Message-ID | <[email protected]> |
--X Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hi! What is the intended way to copy a complete string from gdome2 into an external format (e.g. std::string in C++)? The only way I could figure out from the documentation was to iterate over the string length, copying out the characters using gdome_xml_str_charAt. But this approach has an algorithmic complexity of O(n^2) on most systems because of the bounds check using strlen. If this is in fact the intended way to do this, I would suggest to incorporate the attached patch, which caches the string length from gdome_xml_str_length, and uses gdome_xml_str_length instead of strlen in all other GdomeDOMString functions. This way, string copying is O(n) as it is supposed to be. Also, it may be just my personal preference but I think a properly written application could should do the bounds check by itself anyway. So you might consider enabling the bounds check only for debug builds, so during development programmers will still get the warning, but in production it will run without slowdown. In this case, the caching would not even be needed (having the advantage of keeping binary compatibility with previous versions). Best regards Isidor Zeuner --X Content-Type: text/x-patch; name="cached-string-length.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="cached-string-length.diff" ZGlmZiAtLWdpdCBhL2xpYmdkb21lL2dkb21lLmggYi9saWJnZG9tZS9nZG9tZS5oCmluZGV4IDI1 NjZkYjkuLmE5ZGI0N2QgMTAwNjQ0Ci0tLSBhL2xpYmdkb21lL2dkb21lLmgKKysrIGIvbGliZ2Rv bWUvZ2RvbWUuaApAQCAtOTQsNiArOTQsNyBAQCBzdHJ1Y3QgX0dkb21lRE9NU3RyaW5nIHsKIAln Y2hhciAqc3RyOwogCWdpbnQgcmVmY250OwogCXZvaWQgKCp1bnJlZikgKEdkb21lRE9NU3RyaW5n ICpzZWxmKTsKKwlpbnQgY2FjaGVkX2xlbmd0aDsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9HZG9t ZU5vZGUgR2RvbWVOb2RlOwpkaWZmIC0tZ2l0IGEvbGliZ2RvbWUvZ2RvbWVjb3JlL2dkb21lLXht bC1zdHIuYyBiL2xpYmdkb21lL2dkb21lY29yZS9nZG9tZS14bWwtc3RyLmMKaW5kZXggYmYzNmNi OC4uNGJiMTY2MCAxMDA2NDQKLS0tIGEvbGliZ2RvbWUvZ2RvbWVjb3JlL2dkb21lLXhtbC1zdHIu YworKysgYi9saWJnZG9tZS9nZG9tZWNvcmUvZ2RvbWUteG1sLXN0ci5jCkBAIC03OSw2ICs3OSw3 IEBAIGdkb21lX3htbF9zdHJfbWtyZWYgKGNvbnN0IGdjaGFyICpzdHIpIHsKICAgZHMtPnJlZmNu dCA9IDE7CiAJZHMtPnVucmVmID0gZ2RvbWVfeG1sX3N0cl9jb25zdF91bnJlZjsKIAlkcy0+c3Ry ID0gKGdjaGFyICopc3RyOworCWRzLT5jYWNoZWRfbGVuZ3RoID0gLTE7CiAJcmV0dXJuIGRzOwog fQogCkBAIC0xMDMsNiArMTA0LDcgQEAgZ2RvbWVfeG1sX3N0cl9ta3JlZl9vd24gKGdjaGFyICpz dHIpIHsKIAlkcy0+cmVmY250ID0gMTsKIAlkcy0+dW5yZWYgPSBnZG9tZV94bWxfc3RyX3VucmVm X293bjsKICAgZHMtPnN0ciA9IHN0cjsKKwlkcy0+Y2FjaGVkX2xlbmd0aCA9IC0xOwogCXJldHVy biBkczsKIH0KIApAQCAtMTI4LDYgKzEzMCw3IEBAIGdkb21lX3htbF9zdHJfbWtyZWZfeG1sICh4 bWxDaGFyICpzdHIpIHsKICAgZHMtPnJlZmNudCA9IDE7CiAJZHMtPnVucmVmID0gZ2RvbWVfeG1s X3N0cl91bnJlZl94bWw7CiAJZHMtPnN0ciA9IHN0cjsKKwlkcy0+Y2FjaGVkX2xlbmd0aCA9IC0x OwogCXJldHVybiBkczsKIH0KIApAQCAtMTUzLDYgKzE1Niw3IEBAIGdkb21lX3htbF9zdHJfbWty ZWZfZHVwIChjb25zdCBnY2hhciAqc3RyKSB7CiAJZHMtPnJlZmNudCA9IDE7CiAJZHMtPnVucmVm ID0gZ2RvbWVfeG1sX3N0cl91bnJlZl9vd247CiAgIGRzLT5zdHIgPSBnX3N0cmR1cChzdHIpOwor CWRzLT5jYWNoZWRfbGVuZ3RoID0gLTE7CiAJcmV0dXJuIGRzOwogfQogCkBAIC0yMzMsNyArMjM3 LDcgQEAgZ2NoYXIKIGdkb21lX3htbF9zdHJfY2hhckF0IChHZG9tZURPTVN0cmluZyAqc2VsZiwg aW50IGluZGV4KQogewogCWdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWxmICE9IE5VTEwsICdcMCcp OwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc3RybGVuIChzZWxmLT5zdHIpKSB7CisJaWYg KGluZGV4IDwgMCB8fCBpbmRleCA+PSBnZG9tZV94bWxfc3RyX2xlbmd0aCAoc2VsZikpIHsKIAkJ Z193YXJuaW5nICgiZ2RvbWVfc3RyX2NoYXJBdDogb3V0IGJvdW5kIGVycm9yXG4iKTsKIAkJcmV0 dXJuICdcMCc7CiAJfQpAQCAtMjgxLDggKzI4NSw4IEBAIGdkb21lX3htbF9zdHJfZW5kc1dpdGgg KEdkb21lRE9NU3RyaW5nICpzZWxmLCBHZG9tZURPTVN0cmluZyAqc3VmZml4KQogCWlmIChzdWZm aXggPT0gTlVMTCkgewogCQlyZXR1cm4gVFJVRTsKICAgfQotICBsZW5fc2VsZiA9IHN0cmxlbiAo c2VsZi0+c3RyKTsKLSAgbGVuX3N0ciA9IHN0cmxlbiAoc3VmZml4LT5zdHIpOworICBsZW5fc2Vs ZiA9IGdkb21lX3htbF9zdHJfbGVuZ3RoIChzZWxmKTsKKyAgbGVuX3N0ciA9IGdkb21lX3htbF9z dHJfbGVuZ3RoIChzdWZmaXgpOwogCiAgIGlmIChsZW5fc3RyID4gbGVuX3NlbGYpCiAgICAgcmV0 dXJuIEZBTFNFOwpAQCAtMzAyLDcgKzMwNiw3IEBAIGdkb21lX3htbF9zdHJfZW5kc1dpdGggKEdk b21lRE9NU3RyaW5nICpzZWxmLCBHZG9tZURPTVN0cmluZyAqc3VmZml4KQogR2RvbWVCb29sZWFu CiBnZG9tZV94bWxfc3RyX2lzRW1wdHkgKEdkb21lRE9NU3RyaW5nICpzZWxmKQogewotCWlmIChz ZWxmICE9IE5VTEwgJiYgc3RybGVuIChzZWxmLT5zdHIpID4gMCkKKwlpZiAoc2VsZiAhPSBOVUxM ICYmIGdkb21lX3htbF9zdHJfbGVuZ3RoIChzZWxmKSA+IDApCiAJCXJldHVybiBGQUxTRTsKIAly ZXR1cm4gVFJVRTsKIH0KQEAgLTMxOCw3ICszMjIsMTUgQEAgZ2RvbWVfeG1sX3N0cl9sZW5ndGgg KEdkb21lRE9NU3RyaW5nICpzZWxmKQogewogICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2VsZiAh PSBOVUxMLCAwKTsKIAotICByZXR1cm4gc3RybGVuIChzZWxmLT5zdHIpOworICBpZiAoCisgICAg ICAtMSA9PSBzZWxmLT5jYWNoZWRfbGVuZ3RoCisgICkgeworICAgICAgc2VsZi0+Y2FjaGVkX2xl bmd0aCA9IHN0cmxlbigKKyAgICAgICAgICBzZWxmLT5zdHIKKyAgICAgICk7CisgIH0KKworICBy ZXR1cm4gc2VsZi0+Y2FjaGVkX2xlbmd0aDsKIH0KIAogLyoqCkBAIC0zMzcsOCArMzQ5LDggQEAg Z2RvbWVfeG1sX3N0cl9zdGFydHNXaXRoIChHZG9tZURPTVN0cmluZyAqc2VsZiwgR2RvbWVET01T dHJpbmcgKnByZWZpeCkKIAlpZiAocHJlZml4ID09IE5VTEwpIHsKIAkJcmV0dXJuIFRSVUU7CiAg IH0KLSAgbGVuX3NlbGYgPSBzdHJsZW4gKHNlbGYtPnN0cik7Ci0gIGxlbl9zdHIgPSBzdHJsZW4g KHByZWZpeC0+c3RyKTsKKyAgbGVuX3NlbGYgPSBnZG9tZV94bWxfc3RyX2xlbmd0aCAoc2VsZik7 CisgIGxlbl9zdHIgPSBnZG9tZV94bWxfc3RyX2xlbmd0aCAocHJlZml4KTsKIAogICBpZiAobGVu X3N0ciA+IGxlbl9zZWxmKQogICAgIHJldHVybiBGQUxTRTsK --X Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ gdome mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gdome --X--