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--