From: Yohanes Santoso Date: 2002-12-14T23:14:27+09:00 Subject: [ANN] RBit 0.1 -- Ruby's Bit Construction, Matching, and Extraction Module --=-=-= Hi all, This is in response to a post a few days ago regarding the equivalent functionalities in Ruby to Erlang's bit syntax. Here's my attempt in emulating the functionality. This release is for gathering initial feedback and interest in the module. Please send your feedback to ysantoso-raa@jenny-gnome.dyndns.org (or simply press reply button if the mailing list manager does not overwrite the Reply-To field) Thank you, YS. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=bit.rb Content-Transfer-Encoding: base64 PWJlZ2luClJ1YnkncyBCaXQgQ29uc3RydWN0aW9uLCBNYXRjaGluZywgYW5kIEV4dHJhY3Rpb24g TW9kdWxlClZlcnNpb246IDAuMQpTdGF0dXM6IGZlZWRiYWNrIGdhdGhlcmluZyAocHJvdG8tYWxw aGEpCkF1dGhvcjogWW9oYW5lcyBTYW50b3NvCkRhdGU6IDIwMDIgRGVjIDE0Cj1lbmQKCgo9YmVn aW4KSW1wbGVtZW50aW5nIGludGVyZXN0aW5nIGJpdHMgZnJvbSBFcmxhbmcncyBCaXQgU3ludGF4 IGluIFJ1YnkKaHR0cDovL3d3dy5lcmxhbmcuc2UvZXVjLzAwL2JpdF9zeW50YXguaHRtbAoKKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQklUClN5bm9w c2lzOgogICBCaXQubmV3KHNlZ21lbnQxLCBzZWdtZW50MiwgLi4uKQogICBCaXQubmV3KCJoZWxs byB3b3JsZCIpCiAgIEJpdCN0b19pCiAgIEJpdCN0b19zdHIKICAgQml0I3RvX2EKICAgQml0I21h dGNoKGFyZykKCkEgQml0IGlzIGEgY29sbGVjdGlvbiBvZiBiaXRzLiBUaGUgY29sbGVjdGlvbiBp cyBsb2dpY2FsbHkgZGl2aWRlZAppbnRvIHNlZ21lbnRzIG9mIHVzZXItZGVmaW5lZCBsZW5ndGgu IEV4YW1wbGUgdXNhZ2VzIGluY2x1ZGUgbmV0d29yawpwYWNrZXQgY29uc3RydWN0aW9ucywgYW5k IHNvbWUgb3RoZXIgdGhpbmdzIEkgaGF2ZSBmb3Jnb3R0ZW4uIChORUVECkZJWElORykuCgpPcGVy YXRpb25zIHN1cHBvcnRlZDogYml0IGNvbnN0cnVjdGlvbiwgbWF0Y2hpbmcsIGFuZCBleHRyYWN0 aW9uLiBCaXQKY29uc3RydWN0aW9uIGlzIHRoZSBwcm9jZXNzIG9mIHByb2R1Y2luZyBhIHZhbHVl IGJ5IGV4cGxpY2l0bHkKbWFuaXB1bGF0aW5nIHRoZSBiaXRzLiBCaXQgbWF0Y2hpbmcgaXMgdXNl ZCB0byB0ZXN0IHRoZSBzaW1pbGFyaXR5IG9mCnR3byBiaXQgY29sbGVjdGlvbnMuIEJpdCBleHRy YWN0aW9uIGlzIHVzZWQgdG8gZXh0cmFjdCBhIGNlcnRhaW4gcGFydApvZiB0aGUgY29sbGVjdGlv bi4gCgpCaXQgbWF0Y2hpbmcgYW5kIGJpdCBleHRyYWN0aW9uIGFyZSBvZnRlbiB1c2VkIHRvZ2V0 aGVyLCBmb3IgZXhhbXBsZQppbiBtYXRjaGluZyB0aGUgaGVhZGVyIG9mIGFuIGltYWdlIGZpbGUs IHdoZXJlIG9uZSBuZWVkcyB0byB0ZXN0IGZvcgpzb21lIG1hZ2ljIHNpZ25hdHVyZSBpbiB0aGUg aGVhZGVyLCBhbmQgZXh0cmFjdCB0aGUgaGVhZGVyIGZpZWxkIG9ubHkKaWYgdGhlIG1hZ2ljIHNp Z25hdHVyZSBpcyBmb3VuZC4gVGhpcyBvcGVyYXRpb24gY2FuIGJlIGRvbmUgaW4gb25lCnN0ZXAg dXNpbmcgdGhlIEJpdCNtYXRjaCBtZXRob2QuCgpUaGUgZmlyc3QgZm9ybSBvZiBpbnN0YW50aWF0 aW9uIGlzIHVzZWQgdG8gbWFudWFsbHkgc3BlY2lmeSBlYWNoCnNlZ21lbnQuIFRoZSBzZWNvbmQg Zm9ybSBpcyBmb3IgY29udmVuaWVuY2UuIEVhY2ggY2hhcmFjdGVyIGluIHRoZQpzdHJpbmcgaXMg dHJhbnNmb3JtZWQgaW50byBhIHNlZ21lbnQgb2YgOC1iaXQgY29udGFpbmluZyB0aGUgQVNDSUkK dmFsdWUgb2YgdGhlIGNoYXJhY3Rlci4KCkJpdCN0b19pIGlzIHVzZWQgdG8gcGVyZm9ybSBiaXQg Y29uc3RydWN0aW9uLiBJdCBvdXRwdXRzIHRoZSB1bnNpZ25lZApJbnRlZ2VyIHJlcHJlc2VudGF0 aW9uIG9mIHRoZSBiaXQgY29sbGVjdGlvbi4KCkJpdCN0b19zdHIgaXMgdXNlZCB0byBwZXJmb3Jt IGJpdCBjb25zdHJ1Y3Rpb24uIEl0IHRyYW5zZm9ybSB0aGUKYml0IHZhbHVlIHdpdGhpbiBhIEJp dCBpbnN0YW5jZSBpbnRvIGEgc3RyaW5nLgoKQml0I3RvX2EgaXMgdXNlZCB0byBwZXJmb3JtIGJp dCBjb25zdHJ1Y3Rpb24uIEl0IHNlcGFyYXRlcyBlYWNoIG9jdGV0CihhIHVuaXQgb2YgOCBiaXRz KSBpbiB0aGUgYml0IGNvbGxlY3Rpb24gaW50byBpbmRpdmlkdWFsIGVsZW1lbnRzIGluCnRoZSBh cnJheS4KCkJpdCNtYXRjaCBpcyB1c2VkIHRvIHBlcmZvcm0gYml0IG1hdGNoaW5nIGFuZC9vciBl eHRyYWN0aW9uIGFnYWluc3QKdGhlIGFyZ3VtZW50LCBhcmcuIEl0IHVzZXMgdGhlIHN0cmluZyBy ZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJndW1lbnQKKGJ5IGNhbGxpbmcgYXJnI3RvX3N0cikuIElm IGFyZyBpcyBub3QgYml0LXdpc2UgaWRlbnRpY2FsLCB0aGVuIHRoaXMKbWV0aG9kIHJldHVybnMg bmlsLiBPdGhlcndpc2UgaXQgcmV0dXJucyBhIEhhc2guIFdoZW4gcGVyZm9ybWluZyBiaXQKZXh0 cmFjdGlvbiBieSBzcGVjaWZ5aW5nIHNlZ21lbnRzIHdob3NlIHZhbHVlIGlzIGEgc3ltYm9sLCB0 aGUgSGFzaAp3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGVudHJpZXMuIEVhY2ggZW50cnkgaXMga2V5 ZWQgb24gdGhlIHN5bWJvbApzcGVjaWZpZWQgaW4gdGhlIHNlZ21lbnQuCgoKKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKU0VHTUVOVApTeW5vcHNpczoK ICAgU2VnbWVudC5uZXcodmFsdWUsIHNpemU9bmlsLCB0eXBlPTppbnRlZ2VyLCAKICAgICAgICAg ICAgICAgc2lnbmVkbmVzcz06dW5zaWduZWQsIGVuZGlhbm5lc3M9OmJpZywgdW5pdD1uaWwpCgp2 YWx1ZSAtLSBjYW4gZWl0aGVyIGJlIGEgbGl0ZXJhbCBvciBhIHN5bWJvbC4gSWYgdXNlZCBmb3Ig YmluYXJ5CmNvbnN0cnVjdGlvbiwgdmlhIEJpdCN0b19zdHIgb3IgQml0I3RvX2EsIHRoZW4gbm8g c2VnbWVudCBzaGFsbApjb250YWlucyBhIHN5bWJvbCBmb3IgaXRzIHZhbHVlLiBGb3IgcGF0dGVy biBtYXRjaGluZywgYSBsaXRlcmFsIHZhbHVlCmlzIHVzZWQgdG8gbWF0Y2ggc3BlY2lmaWMgcmVn aW9uIG9mIHRoZSBiaXRzOyBhIHN5bWJvbCB2YWx1ZSBpcyB1c2VkCmluIGJpdCBleHRyYWN0aW9u IHRvIGNvcHkgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgdGhlIGJpdHMgaW50byBhIGhhc2gKdGFi bGUgZW50cnkgd2hpY2ggaXMga2V5ZWQgb24gdGhlIHN5bWJvbC4KCnNpemUgLS0gdGhlIHNpemUg b2YgYSB1bml0IChpbiBiaXQpLiBCeSBkZWZhdWx0LCBpZiB0aGUgdHlwZSBpcwo6aW50ZWdlciwg dGhlbiBzaXplIGlzIDg7IGlmIHR5cGUgaXMgOmJpbmFyeSwgdGhlIHNpemUgaXMgMS4gU2l6ZSBt YXkKYmUgbmlsIGlmIHRoZSBzZWdtZW50IGlzIGEgZ2xvYmJpbmcgc2VnbWVudCAoc2VlIHRoZSBH TE9CQklORyBTRUdNRU5UCnNlY3Rpb24pCgp0eXBlIC0tIDppbnRlZ2VyIChkZWZhdWx0KSBvciA6 YmluYXJ5LiBUaGUgdHlwZSA6YmluYXJ5IGlzIG5vdCByZWFsbHkKdXNlZnVsIGZvciBiaXQgY29u c3RydWN0aW9uLiBJdCBpcyBwcmltYXJpbHkgdXNlZCB0byBzcGVjaWZ5IGEKZ2xvYmJpbmcgc2Vn bWVudCBmb3IgdGhlIHB1cnBvc2Ugb2YgYml0IG1hdGNoaW5nLgoKc2lnbmVkbmVzcyAtLSA6dW5z aWduZWQgKGRlZmF1bHQpIG9yIDpzaWduZWQuIElnbm9yZWQgaW4gYmluYXJ5CmNvbnN0cnVjdGlv bi4gSW4gYml0IG1hdGNoaW5nLCB0aGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRldGVybWluZSB0 aGUKaW50ZWdlciB2YWx1ZSBvZiB0aGUgbWF0Y2hlZCBiaXRzLgoKZW5kaWFubmVzcyAtLSA6Ymln IChkZWZhdWx0KSBvciA6bGl0dGxlLiBCaWcgZW5kaWFuIGlzIGFsc28gY2FsbGVkCm5ldHdvcmsg Ynl0ZSBvcmRlci4gQWZmZWN0IG9ubHkgc2VnbWVudCBvZiBzaXplIGdyZWF0ZXIgdGhhbiA4CmJp dC4gRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAweEFCQ0QsIHdoZW4gc3RvcmVkIGFzIGJpZyBlbmRp YW4gcHJvZHVjZXMKdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBvY3RldHM6IDB4QSAweEIgMHhD IDB4RC4gTWVhbndoaWxlLCBpbgpsaXR0bGUgZW5kaWFuLCB0aGUgc2FtZSB2YWx1ZSBpcyBzdG9y ZWQgYXM6IDB4RCAweEMgMHhCIDB4QS4KCnVuaXQgLS0gdGhlIG51bWJlciBvZiB1bml0cyBpbiB0 aGUgc2VnbWVudC4gVGhlIHZhbHVlIG11c3QgYmUgYmV0d2VlbgoxIGFuZCAyNTYsIGluY2x1c2l2 ZS4gRm9yIHNlZ21lbnRzIG9mIHR5cGUgOmludGVnZXIsIHRoZSBkZWZhdWx0IHVuaXQKc2l6ZSBp cyAxLCBhbmQgZm9yIDpiaW5hcnksIDguCgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKR0xPQkJJTkcgU0VHTUVOVAoKQSBnbG9iYmluZyBzZWdtZW50 IGlzIHVzZWQgdG8gbWF0Y2ggdGhlIHJlbWFpbmluZyBiaXRzLiBJdCBtdXN0IGJlIG9mCnR5cGUg OmJpbmFyeSwgb2Ygc2l6ZSBuaWwsIGFuZCBtdXN0IGJlIHRoZSBsYXN0IHNlZ21lbnQgaW4gdGhl IEJpdApzcGVjaWZpY2F0aW9uLgoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqCkVYQU1QTEVTCihwbGVhc2UgY29uc3VsdCBiaXRfdGVzdC5yYiBmb3Ig YSBtb3JlIGV4YW1wbGVzKQoKcmVxdWlyZSAnYml0LnJiJwppbmNsdWRlIFJCaXQKCiMgQ3JlYXRl IGEgc2VnbWVudCB3aG9zZSB2YWx1ZSBpcyBhIHN5bWJvbCwgc2l6ZSBpcyAyLCBvZiB0eXBlIGJp bmFyeQojIHNpZ25lZCwgbGl0dGxlLWVuZGlhbiwgYW5kIGhhcyA5IHVuaXRzLgpTZWdtZW50Lm5l dyg6RiwgMiwgOmJpbmFyeSwgOnNpZ25lZCwgOmxpdHRsZSwgOSkKCiMgQmluYXJ5IGNvbnN0cnVj dGlvbgpCaXQubmV3KCJISSIpLnRvX2EgPT4gWzcyLCA3M10KYml0MSA9IEJpdC5uZXcoU2VnbWVu dC5uZXcoMSksIAoJICAgICAgIFNlZ21lbnQubmV3KDE3KSwgCgkgICAgICAgU2VnbWVudC5uZXco NjU1MzAsIDE2LCA6aW50ZWdlciwgOnVuc2lnbmVkLCA6YmlnKQoJICAgICkKYml0MS50b19zdHIg ID0+ICJcMDAxXDAyMf/6IgpiaXQxLnRvX2EgICAgPT4gWzEsMTcsMjU1LDI1MF0KYml0MS50b19p ICAgID0+IDE3OTU2ODU4CgojIEZhaWxlZCBtYXRjaGluZwpCaXQubmV3KFNlZ21lbnQubmV3KDB4 QUJDRCwxNikpLm1hdGNoXAooQml0Lm5ldyhTZWdtZW50Lm5ldygweEFCQ0UsMTYpKSkpICAgICAg ID0+IG5pbAoKIyBTdWNjZXNzZnVsIG1hdGNoaW5nCkJpdC5uZXcoU2VnbWVudC5uZXcoMHhBQSwx NikpLm1hdGNoXAooQml0Lm5ldyhTZWdtZW50Lm5ldygweEFBMDAsMTYsOmludGVnZXIsOnVuc2ln bmVkLDpsaXR0bGUpKSkpID0+IHt9CgojIEJpdCBleHRyYWN0aW9uCmJpdDEgPUJpdC5uZXcoU2Vn bWVudC5uZXcoOmEsMTIpLAogICAgICAgICAgICAgIFNlZ21lbnQubmV3KDpiLDEyKSwgCiAgICAg ICAgICAgICAgU2VnbWVudC5uZXcoOmMsMTIpLCAKICAgICAgICAgICAgICBTZWdtZW50Lm5ldyg6 ZCw0KSwgCiAgICAgICAgICAgICAgU2VnbWVudC5uZXcoOmUsbmlsLDpiaW5hcnkpKQptYXRjaGVz ID0gYml0MS5tYXRjaChCaXQubmV3KFNlZ21lbnQubmV3KDB4QUFCQkNDRERFRUZGLDQ4KSkpKQpw IG1hdGNoZXMgICAgID0+ICAgezphPT4yNzMxLDpiPT4zMDIwLDpjPT4zNTUwLDpkPT4xNCw6ZT0+ MjU1fQo9ZW5kCgoKPWJlZ2luCk5PVEVTCgpGb3IgdGhlIG1vc3QgcGFydCB0aGlzIG1vZHVsZSBj b25mb3JtcyB0byB0aGUgc3BlY2lmaWNhdGlvbiBvZgpFcmxhbmcncyBCaXQgU3ludGF4IGZvdW5k IGF0IHRoZSBhYm92ZSBVUkwuIFRoZSBleGNlcHRpb25zIGFyZQpvdXRsaW5lZCBiZWxvdzoKCjEu IE5vIEZsb2F0IHR5cGUuIFByb2JhYmx5IG5lZWQgYSBDIGV4dGVuc2lvbiwgYW5kIHRoYXQgbWFr ZXMgdGhlCm1vZHVsZSBjb21wbGljYXRlZCB0byBpbnN0YWxsLgoKMi4gQmluYXJ5IG1hdGNoaW5n IGlzIG5vdCByZXN0cmljdGVkIHRvIHNpemUgb2YgOC4gVGhlIEVybGFuZydzIGJpdApzeW50YXgg c3BlYyBpcyBhbWJpZ3VvdXMgaW4gdGhhdCBpdCBkb2Vzbid0IHNwZWNpZnkgd2hpY2ggYml0cyBh cmUKdGFrZW4gd2hlbiB5b3Ugc3BlY2lmeSwgc2F5IDw8MHhGQTo0LDB4Qjo0Pj4uIFdpbGwgdGhl IHJlc3VsdCBiZSAweEYwCm9yIDB4QUIuICBUaHVzIEknbSBhc3N1bWluZyB0aGF0IHRoZSByZXN1 bHQgd2lsbCBiZSAweEYwIGJ5IHByZWZlcnJpbmcKdG8gcmVtb3ZlIHRoZSBMU0IgKGxlYXN0IHNp Z25pZmljYW50IGJpdCkgZmlyc3QuCgozLiBUaGUgdmFsdWUgb2YgbmlsIG11c3QgYmUgc3BlY2lm aWVkIGZvciBnbG9iYmluZyBzZWdtZW50LiBHbG9iYmluZyBzZWdtZW50IGlzIHZhbGlkIG9ubHkg YXMgdGhlIGxhc3Qgc2VnbWVudCBhbmQgbXVzdCBiZSBvZiB0eXBlIDpiaW5hcnkuCj1lbmQKCgoK bW9kdWxlIFJCaXQKICBkZWYgaGV4aWZ5KGFyZykKICAgICIweCN7IiVYIiAlIGFyZ30iCiAgZW5k CgogIGNsYXNzIFNlZ21lbnQKICAgIGF0dHJfcmVhZGVyIDp2YWx1ZSwgOnNpemUsIDp0eXBlLCA6 c2lnbmVkbmVzcywgOmVuZGlhbm5lc3MsIDp1bml0CiAgICAKICAgIGRlZiBpbml0aWFsaXplKHZh bHVlLCBzaXplPW5pbCwgCgkJICAgdHlwZT06aW50ZWdlciwgc2lnbmVkbmVzcz06dW5zaWduZWQs IGVuZGlhbm5lc3M9OmJpZywgCgkJICAgdW5pdD1uaWwpCiAgICAgIGlmIFs6aW50ZWdlciwgOmJp bmFyeV0uaW5jbHVkZT8gdHlwZSBhbmQKCSAgWzp1bnNpZ25lZCwgOnNpZ25lZF0uaW5jbHVkZT8g c2lnbmVkbmVzcyBhbmQKCSAgWzpiaWcsIDpsaXR0bGVdLmluY2x1ZGU/IGVuZGlhbm5lc3MgCglA dHlwZSA9IHR5cGUKICAgICAgZWxzZQoJcmFpc2UgQXJndW1lbnRFcnJvcgogICAgICBlbmQKICAg ICAgQHZhbHVlID0gaWYgbm90IHZhbHVlLmlzX2E/IFN5bWJvbCB0aGVuIHZhbHVlLnRvX2kgZWxz ZSB2YWx1ZSBlbmQKICAgICAgQHNpZ25lZG5lc3MgPSBzaWduZWRuZXNzCiAgICAgIEBlbmRpYW5u ZXNzID0gZW5kaWFubmVzcwogICAgICAjc2l6ZSBhbmQgdW5pdCBtdXN0IGJlIGludGVycG9sYXRl ZAogICAgICBkZWZhdWx0X3NpemUgPSB7OmludGVnZXIgPT4gOCwgOmJpbmFyeSA9PiBzaXplfQog ICAgICBAc2l6ZSA9IHNpemUgfHwgZGVmYXVsdF9zaXplW0B0eXBlXQogICAgICBAc2l6ZSA9IEBz aXplLnRvX2kgdW5sZXNzIEBzaXplID09IG5pbAogICAgICB1bml0X3NpemUgPSB7IDppbnRlZ2Vy ID0+IDEsIDpiaW5hcnkgPT4gOCB9CiAgICAgIEB1bml0ID0gdW5pdCB8fCB1bml0X3NpemVbQHR5 cGVdCiAgICAgIEB1bml0ID0gQHVuaXQudG9faQogICAgICBpZiBAdW5pdCA8IDEgb3IgQHVuaXQg PiAyNTYgdGhlbiByYWlzZSBBcmd1bWVudCBFcnJvciBlbmQKICAgIGVuZAoKICAgIAogICAgCiAg ICBkZWYgY29va2VkX3ZhbHVlCiAgICAgIGlmIEB2YWx1ZS5pc19hPyBTeW1ib2wKCXJhaXNlICJJ bnZhbGlkIHZhbHVlIHNwZWNpZmljYXRpb24uIFN5bWJvbHMgc2hvdWxkIGJlIHVzZWQgb25seSBh cyBhIHBsYWNlaG9sZGVyIGZvciBtYXRjaGluZy4iCiAgICAgIGVuZAogICAgICBpZiAoQGVuZGlh bm5lc3MgPT0gOmxpdHRsZSkgCgljb252ZXJ0X2VuZGlhbm5lc3MKICAgICAgZWxzZQoJQHZhbHVl CiAgICAgIGVuZAogICAgZW5kCiAgICAKICAgIHByaXZhdGUKICAgIAogICAgZGVmIGNvbnZlcnRf ZW5kaWFubmVzcwogICAgICBiaXRfc2l6ZSA9IEBzaXplKkB1bml0CiAgICAgIG9jdGV0X3NpemUg PSAoYml0X3NpemUvOC4wKS5jZWlsIAogICAgICByZXN1bHQgPSAwCiAgICAgIHZhbHVlID0gQHZh bHVlCiAgICAgIG9jdGV0X3NpemUudGltZXMge3xpfAoJcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8 ICh2YWx1ZSAmIDB4RkYpCgl2YWx1ZSA9IHZhbHVlID4+IDgKICAgICAgfQogICAgICAjcHV0cyAi Q29udmVydGVkOiAje2hleGlmeSBAdmFsdWV9IHRvICN7aGV4aWZ5IHJlc3VsdH0iCiAgICAgIHJl c3VsdAogICAgZW5kCiAgZW5kCgoKCiAgY2xhc3MgQml0CiAgICBhdHRyX3JlYWRlciA6c2VnbWVu dHMKICAgIAogICAgIwogICAgIyBCaXQubmV3KFNlZ21lbnQubmV3KDEpLCAuLi4pCiAgICAjIEJp dC5uZXcoImFzc2FhIikKICAgICMgQml0Lm5ldyhTZWdtZW50Lm5ldyg6QSksIC4uLi4pCiAgICAj IEJpdC5uZXcoKQogICAgIwogICAgZGVmIGluaXRpYWxpemUoKnNlZ21lbnRzKQogICAgICBpZiBz ZWdtZW50cy5sZW5ndGggPT0gMSBhbmQgc2VnbWVudHNbMF0uaXNfYT8gU3RyaW5nCglzZWdtZW50 cyA9IEJpdC5jb252ZXJ0X3N0cmluZ19hcmcoc2VnbWVudHNbMF0pCiAgICAgIGVuZAogICAgICAj Y2hlY2sgaWYgdGhlIGJpdHMgYXMgYSB3aG9sZSBsaWUgb24gb2N0ZXQtYm91bmRhcmllcwogICAg ICBiaXRzID0gMAogICAgICBzZWdtZW50cy5lYWNoIHt8c2VnbWVudHwKCWJpdHMgKz0gaWYgc2Vn bWVudC5zaXplIHRoZW4gc2VnbWVudC5zaXplIGVsc2Ugc2VnbWVudC51bml0IGVuZAogICAgICB9 CiAgICAgIGlmIGJpdHMlOCAhPSAwCglyYWlzZSBBcmd1bWVudEVycm9yLCAiVG90YWwgbnVtYmVy cyBvZiBiaXRzIGluIGFsbCBzZWdtZW50cyBtdXN0IGJlIGV2ZW5seSBkaXZpc2libGUgYnkgOCIK ICAgICAgZW5kCiAgICAgIEBzZWdtZW50cyA9IHNlZ21lbnRzCiAgICBlbmQKICAgIAoKICAgICMK ICAgICMgTWF0Y2hlcyB0aGUgc2VnbWVudHMgd2l0aCB0aGUgc3RyCiAgICAjIElmIHRoZXkgYXJl IG5vdCBlcXVhbCwgYSBuaWwgaXMgcmV0dXJuZWQKICAgICMgT3RoZXJ3aXNlLCBhIEhhc2ggY29u dGFpbmluZyB0aGUgc3ltYm9sPC0+bWF0Y2ggdmFsdWUKICAgICMgZW50cmllcy4gSW4gdGhlIGNh c2UgdGhlcmUgaXMgbm8gc3ltYm9sIHRvIG1hdGNoLCAKICAgICMgYW4gZW1wdHkgSGFzaCBpcyBy ZXR1cm5lZC4KICAgICMKICAgIGRlZiBtYXRjaChzdHIpCiAgICAgIGlmIG5vdCByZWFkeV90b19t YXRjaD8gCglyYWlzZSAiU2VnbWVudCBzcGVjaWZpY2F0aW9uIGlzIG5vdCBzdWl0YWJsZSBmb3Ig bWF0Y2hpbmciCiAgICAgIGVuZAogICAgICBzdHIgPSBzdHIudG9fc3RyIHVubGVzcyBzdHIuaXNf YT8gU3RyaW5nCiAgICAgIGlmIEBzZWdtZW50cy5sZW5ndGggPT0gMCBhbmQgb2JqLmxlbmd0aCA9 PSAwCglyZXR1cm4gdHJ1ZQogICAgICBlbmQKICAgICAgYml0cyA9IEJpdC5zdHJpbmdfYml0X3Zh bHVlKHN0cikKICAgICAgbWF0Y2hlcyA9IHt9CiAgICAgIHBvcyA9IDAKICAgICAgbWF4X3BvcyA9 IHN0ci5sZW5ndGggKiA4CiAgICAgIEBzZWdtZW50cy5lYWNoIHt8c2VnbWVudHwKCW1hdGNoX2xl bmd0aCA9IGlmIHNlZ21lbnQuc2l6ZSA9PSBuaWwgCgkJCSBtYXhfcG9zLXBvcwoJCSAgICAgICBl bHNlCgkJCSBzZWdtZW50LnVuaXQqc2VnbWVudC5zaXplCgkJICAgICAgIGVuZAoJaWYgbWF0Y2hf bGVuZ3RoIDw9IG1heF9wb3MgLSBwb3MKCSAgb3JpZ19iaXRzID0gYml0cwoJICBiaXRzID4+PSBt YXhfcG9zLShwb3MrbWF0Y2hfbGVuZ3RoKQoJICBtYXRjaCA9IGJpdHMgJiAoKDIqKm1hdGNoX2xl bmd0aCktMSkKCSAgYml0cyA9IG9yaWdfYml0cwoJICBpZiBzZWdtZW50LnZhbHVlLmlzX2E/IFN5 bWJvbAoJICAgIG1hdGNoZXNbc2VnbWVudC52YWx1ZV0gPSAKCSAgICAgIGlmIHNlZ21lbnQuc2ln bmVkbmVzcyA9PSA6dW5zaWduZWQKCQltYXRjaAoJICAgICAgZWxzZQoJCW5vbl9zaWduZWRfbWF0 Y2ggPSBtYXRjaCAmICgoMioqKG1hdGNoX2xlbmd0aC0xKSktMSkKCQlzaWduID0gbWF0Y2ggPj4g KG1hdGNoX2xlbmd0aC0xKQoJCWlmIHNpZ24gPT0gMAoJCSAgbm9uX3NpZ25lZF9tYXRjaAoJCWVs c2UKCQkgIC1ub25fc2lnbmVkX21hdGNoCgkJZW5kCgkgICAgICBlbmQKCSAgZWxzZQoJICAgICMg bWF0Y2hlcyBzZWdtZW50CgkgICAgaWYgbWF0Y2ggIT0gc2VnbWVudC5jb29rZWRfdmFsdWUKCSAg ICAgIHJldHVybiBuaWwKCSAgICBlbmQKCSAgZW5kCgllbmQKCXBvcyArPSBtYXRjaF9sZW5ndGgK ICAgICAgfQogICAgICBpZiBwb3MgIT0gbWF4X3BvcwoJbmlsICAjIGluY29tcGxldGUgbWF0Y2hp bmcKICAgICAgZWxzZQoJbWF0Y2hlcwogICAgICBlbmQKICAgIGVuZAogICAgCiAgICAjIHRoZSBF cmxhbmcncyBiaXQgc3ludGF4IHNwZWMgaXMga2luZCBvZiBhbWJpZ2lvdXMKICAgICMgaXQgZG9l c24ndCBzYXkgd2hpY2ggYml0cyBhcmUgdGFrZW4gd2hlbiB5b3UKICAgICMgc3BlY2lmeSwgc2F5 IDw8MHhGQTo0LDB4Qjo0Pj4uIFdpbGwgdGhlIHJlc3VsdCBiZQogICAgIyAweEYwIG9yIDB4QUIu IAogICAgIyBUaHVzIEknbSBhc3N1bWluZyB0aGF0IHRoZSByZXN1bHQgd2lsbCBiZSAweEYwCiAg ICAjIGJ5IHByZWZlcnJpbmcgdG8gcmVtb3ZlIHRoZSBMU0IgKGxlYXN0IHNpZ25pZmljYW50CiAg ICAjIGJpdCkgZmlyc3QuCiAgICBkZWYgdG9faQogICAgICByZXN1bHQgPSAwCiAgICAgIG9mZnNl dCA9IDAKICAgICAgI3B1dHMgIkNvbnN0cnVjdGluZyByZXN1bHQ9I3toZXhpZnkocmVzdWx0KX0i CiAgICAgIHNlZ21lbnRzLmVhY2h7fHNlZ21lbnR8Cgl2YWx1ZSA9IHNlZ21lbnQuY29va2VkX3Zh bHVlCglsZW5ndGggPSBzZWdtZW50LnNpemUgKiBzZWdtZW50LnVuaXQKCSNwdXRzICJMZW5ndGg9 I3tsZW5ndGh9IgoJI3B1dHMgIlNlZ21lbnRWYWx1ZT0je2hleGlmeSB2YWx1ZX0iCgkjcHV0cyAi Q29uc3RydWN0aW5nIGJlZm9yZSByZXN1bHQ9I3toZXhpZnkgcmVzdWx0fSIKCXJlc3VsdCA8PD0g bGVuZ3RoCgl2YWx1ZSA+Pj0gKDgtKGxlbmd0aCU4KSklOAoJcmVzdWx0IHw9IHZhbHVlICYgKCgo MHhGKzEpKipsZW5ndGgpLTEpCgkjcHV0cyAiQ29uc3RydWN0aW5nIGFmdGVyIHJlc3VsdD0je2hl eGlmeSByZXN1bHR9IgogICAgICB9CiAgICAgICNwdXRzICIjYml0X3ZhbHVlPSN7aGV4aWZ5IHJl c3VsdH0iCiAgICAgIHJlc3VsdAogICAgZW5kCgogICAgZGVmIHRvX3N0cgogICAgICB0b3RhbF9i aXRzID0gMAogICAgICBAc2VnbWVudHMuZWFjaHt8c2VnbWVudHwKCXRvdGFsX2JpdHMgKz0gc2Vn bWVudC5zaXplICogc2VnbWVudC51bml0CiAgICAgIH0gCiAgICAgIHRvdGFsX29jdGV0cyA9IHRv dGFsX2JpdHMvOAogICAgICByZXN1bHQgPSAiIgogICAgICBiaXRzID0gc2VsZi50b19pCiAgICAg IHRvdGFsX29jdGV0cy50aW1lc3sKCXJlc3VsdCA8PCAoYml0cyAmIDB4RkYpLmNocgoJYml0cyA9 IGJpdHMgPj4gOAoJI3B1dHMgIkRlY29uc3RydWN0aW5nOiAje2JpdHN9IgogICAgICB9CiAgICAg IHJlc3VsdC5yZXZlcnNlCiAgICBlbmQKCiAgICBkZWYgdG9fYQogICAgICByZXN1bHQgPSBbXQog ICAgICB0b19zdHIuZWFjaF9ieXRlIHt8aXwgcmVzdWx0IDw8IGl9CiAgICAgIHJlc3VsdAogICAg ZW5kCiAgICAKCgoKICAgIHByaXZhdGUKICAgIAogICAgZGVmIHJlYWR5X3RvX21hdGNoPwogICAg ICAjIkVhY2ggc2VnbWVudCBvZiB0eXBlIGJpbmFyeSBtdXN0IGhhdmUgYSBzaXplIGV2ZW5seSBk aXZpc2libGUgYnkgOCIKICAgICAgI0kgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjIGluIHRoaXMgcmVn YXJkIGJlY2F1c2UgaWYgdGhlIHNwZWMgaXMgY29ycmVjdAogICAgICAjdGhlbiB0aGUgbWluaW11 bSBsZW5ndGggdGhhdCBjYW4gYmUgbWF0Y2hlZCB3aXRoIGJpbmFyeQogICAgICAjaXMgOCo4PTY0 IGJpdHMuCiAgICAgICMKICAgICAgI0kgZG9uJ3QgbGlrZSB0aGF0LiBNeSBjaGFuZ2VzIHdvdWxk IGFsbG93CiAgICAgICNzZWdtZW50cyB0byBiZSBvZiBhbnkgbGVuZ3RoIGRpdmlzaWJsZSBieSA4 LgogICAgICBAc2VnbWVudHMuZWFjaHt8c2VnbWVudHwKCWlmIHNlZ21lbnQudHlwZSA9PSA6Ymlu YXJ5CgkgIHNpemUgPSAxIGlmIHNlZ21lbnQuc2l6ZSA9PSBuaWwKCSAgaWYgKHNpemUqc2VnbWVu dC51bml0KSAlIDggIT0gMAoJICAgIHJldHVybiBmYWxzZQoJICBlbmQKCWVuZAogICAgICB9CiAg ICBlbmQKICAgIAoKCiAgICBkZWYgQml0LnN0cmluZ19iaXRfdmFsdWUoc3RyKQogICAgICByZXN1 bHQgPSAwCiAgICAgIHN0ci5lYWNoX2J5dGV7fGl8CglyZXN1bHQgPDw9IDgKCXJlc3VsdCB8PSBp CiAgICAgIH0KICAgICAgcmVzdWx0CiAgICBlbmQKICAgIAogICAgCiAgICBkZWYgQml0LmNvbnZl cnRfc3RyaW5nX2FyZyhhcmcpCiAgICAgIHJlc3VsdCA9IFtdCiAgICAgIGFyZy5lYWNoX2J5dGUg e3xhfAoJcmVzdWx0IDw8IFNlZ21lbnQubmV3KGEpCiAgICAgIH0KICAgICAgcmVzdWx0CiAgICBl bmQKCiAgZW5kCmVuZAo= --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=bit_test.rb #!/usr/bin/env ruby require 'test/unit' require 'bit.rb' class BitTest < Test::Unit::TestCase include RBit def set_up end ###################################### # Segment ###################################### def compare(target, value, size, type, sign, endian, unit) caller_st = caller.reverse![0..2].join("\n") assert_equal(value, target.value, caller_st) assert_equal(size, target.size, caller_st) assert_equal(type, target.type, caller_st) assert_equal(sign, target.signedness, caller_st) assert_equal(endian, target.endianness, caller_st) assert_equal(unit, target.unit, caller_st) end def compare_cooked(target, value, size, type, sign, endian, unit) caller_st = caller.reverse![0..2].join("\n") assert_equal(value, target.cooked_value, caller_st) assert_equal(size, target.size, caller_st) assert_equal(type, target.type, caller_st) assert_equal(sign, target.signedness, caller_st) assert_equal(endian, target.endianness, caller_st) assert_equal(unit, target.unit, caller_st) end def test_segment compare(Segment.new(1), 1, 8, :integer, :unsigned, :big, 1) compare(Segment.new(17), 17, 8, :integer, :unsigned, :big, 1) compare(Segment.new("42"), 42, 8, :integer, :unsigned, :big, 1) compare(Segment.new(:A), :A, 8, :integer, :unsigned, :big, 1) compare(Segment.new(:C, 16), :C, 16, :integer, :unsigned, :big, 1) compare(Segment.new(:F, nil, :binary), :F, nil, :binary, :unsigned, :big, 8) compare(Segment.new(:F, 2, :binary), :F, 2, :binary, :unsigned, :big, 8) compare(Segment.new(:F, 2, :binary, :signed, :little, 9), :F, 2, :binary, :signed, :little, 9) end def test_cooked_value compare_cooked(Segment.new(0xFAFF,16,:integer,:unsigned,:little), 0xFFFA, 16, :integer, :unsigned, :little, 1) end ################################### # Bit ################################### def test_construction assert_equal([1,17,255,250], Bit.new(Segment.new(1), Segment.new(17), Segment.new(65530, 16, :integer, :unsigned, :big) ).to_a) assert_equal([1,17,250,255], Bit.new(Segment.new(1), Segment.new(17), Segment.new(65530, 16, :integer, :unsigned, :little) ).to_a) assert_equal([17,255,251,128], Bit.new(Segment.new(17), Segment.new(65530, 15, :integer, :unsigned, :big), Segment.new(128,1), Segment.new(128)).to_a) assert_equal([17,255,251,128], Bit.new(Segment.new(17), Segment.new(65530, 15, :binary, :unsigned, :big, 1), Segment.new(128,1), Segment.new(128)).to_a) assert_equal([17,255,251,128], Bit.new(Segment.new(17), Segment.new(65530, 15, :binary, :unsigned, :big, 1), Segment.new(128,1), Segment.new(128), Segment.new(3434,0)).to_a) end def test_matching assert_equal({}, Bit.new(Segment.new(0xAA,16)).match\ (Bit.new(Segment.new(0xAA00,16,:integer,:unsigned,:little)))) assert_equal(nil, Bit.new(Segment.new(0xABCD,16)).match\ (Bit.new(Segment.new(0xABCE,16)))) assert_equal({}, Bit.new(Segment.new(0xAABBCCDDEEFF,48)).match\ (Bit.new(Segment.new(0xAABBCCDDEEFF,48)))) assert_equal({}, Bit.new(Segment.new(0xAABBCCDDEEFF,48)).match\ (Bit.new(Segment.new(0xFFEEDDCCBBAA,48, :integer,:unsigned,:little)))) assert_equal({:a=>2731,:b=>3020,:c=>3550,:d=>14,:e=>255}, Bit.new(Segment.new(:a,12), Segment.new(:b,12), Segment.new(:c,12), Segment.new(:d,4), Segment.new(:e,nil,:binary)).match\ (Bit.new(Segment.new(0xAABBCCDDEEFF,48)))) assert_equal({:a=>-683,:b=>3020,:c=>3550,:d=>14,:e=>255}, Bit.new(Segment.new(:a,12,:integer,:signed), Segment.new(:b,12), Segment.new(:c,12), Segment.new(:d,4), Segment.new(:e,nil,:binary)).match\ (Bit.new(Segment.new(0xAABBCCDDEEFF,48)))) end end --=-=-=--