Error processing request

Parameters

CONTENT_LENGTH0
REQUEST_METHODGET
REQUEST_URI/revision/CRC?V=46
QUERY_STRINGV=46
CONTENT_TYPE
DOCUMENT_URI/revision/CRC
DOCUMENT_ROOT/var/www/nikit/nikit/nginx/../docroot
SCGI1
SERVER_PROTOCOLHTTP/1.1
HTTPSon
REMOTE_ADDR172.70.100.98
REMOTE_PORT29798
SERVER_PORT4443
SERVER_NAMEwiki.tcl-lang.org
HTTP_HOSTwiki.tcl-lang.org
HTTP_CONNECTIONKeep-Alive
HTTP_ACCEPT_ENCODINGgzip, br
HTTP_X_FORWARDED_FOR3.134.118.95
HTTP_CF_RAY87f25201dc81e1ff-ORD
HTTP_X_FORWARDED_PROTOhttps
HTTP_CF_VISITOR{"scheme":"https"}
HTTP_ACCEPT*/*
HTTP_USER_AGENTMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
HTTP_CF_CONNECTING_IP3.134.118.95
HTTP_CDN_LOOPcloudflare
HTTP_CF_IPCOUNTRYUS

Body


Error

Unknow state transition: LINE -> END

-code

1

-level

0

-errorstack

INNER {returnImm {Unknow state transition: LINE -> END} {}} CALL {my render_wikit CRC See\ the\ documentation\ for\ the\ \[Tcllib\]\ package\ implementing\ this\ at\n\n\ \ \ *\ http://tcllib.sourceforge.net/doc/crc16.html\n\ \ \ *\ http://tcllib.sourceforge.net/doc/crc32.html\n\ \ \ *\ http://tcllib.sourceforge.net/doc/cksum.html\n\ \ \ *\ http://tcllib.sourceforge.net/doc/sum.html\n\n\[\[Explain\ essence.\]\]\n\nCRC\ is\ an\ acronym\ for\ ''Cyclic\ Redundancy\ Check''\ \[http://whatis.techtarget.com/definition/0,,sid9_gci213868,00.html\]\n\[http://www.rad.com/networks/1994/err_con/crc.htm\].\n\nIt\ is\ basically\ a\ (binary)\ polynomial\ function\ used\ to\ detect\ ''random''\ errors\ in\ data.\ \ \nMalicious\ alterations\ require\ a\ different\ technique\ (\[digital\ signature\]s\ and/or\ \[encryption\].)\n\n----\n\nThe\ \[Tcllib\]\ implementation\ of\ this\ algorithm\ is\ at\ http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tcllib/tcllib/modules/crc/crc32.tcl?rev=HEAD&content-type=text/vnd.viewcvs-markup\ which\ provides\ a\ crc32\ package.\ \[PT\]\n\n----\n\nCRCs\ are\ available\ to\ Tcl\ programmers\ in\ several\ forms,\ \nincluding\ \[Andreas\ Kupries\]'\ \[Trf\]\ package.\ \ \n\[Pat\ Thoyts\]\ illustrates\ example\ manipulations\ which\ rely\ on\ this\ C-coded\ extension:\n======\n\ \ \ \ \ \ 32\ %\ package\ require\ Trf\n\ \ \ \ \ \ 2.1\n\ \ \ \ \ \ 33\ %\ set\ chk\ \[crc-zlib\ \{Hello,\ World!\}\]\n\ \ \ \ \ \ <funny\ chars>\n\ \ \ \ \ \ 34\ %\ binary\ scan\ \$chk\ i\ chksum\n\ \ \ \ \ \ 1\n\ \ \ \ \ \ 35\ %\ format\ 0x%x\ \$chksum\n\ \ \ \ \ \ 0xec4ac3d0\n======\nNote\ that\ the\ \[\[hex\]\]\ command\ in\ Trf\ can\ be\ used\ to\ perform\ the\ same\ conversions.\ \nHere\ is\ the\ example\ from\ above\ recast\ to\ use\ \[\[hex\]\]:\n======\n\ \ \ \ \ \ 32\ %\ package\ require\ Trf\n\ \ \ \ \ \ 2.1\n\ \ \ \ \ \ 33\ %\ set\ chk\ \[crc-zlib\ \{Hello,\ World!\}\]\n\ \ \ \ \ \ <funny\ chars>\n\ \ \ \ \ \ 34\ %\ set\ chkx\ \[hex\ -mode\ encode\ --\ \$chk\]\n\ \ \ \ \ \ D0C34AEC\n======\n\[PT\]\ If\ you\ look\ carefully\ you\ can't\ really\ use\ \[\[hex\]\].\ \nThe\ crc\ and\ crc-zlib\ commands\ return\ the\ bytes\ of\ a\ long\ integer.\ \n\[\[hex\]\]\ encodes\ each\ byte\ in\ turn.\ What\ we\ really\ need\ is\ \[\[binary\ scan\ \$result\ i\ val\]\].\ \nHowever\ the\ Tcllib\ crc32\ command\ will\ wrap\ this\ up\ transparently\ now.\n\n----\n\n\[Arjen\ Markus\]\ The\ following\ is\ an\ implementation\ by\ Wayland\ Augur:\n\n======\n\ \ \ #\n\ \ \ #\ CRCTABLE\ is\ the\ pre-calculated\ lookup\ table\ provided\ for\ this\n\ \ \ #\ implementation:\n\ \ \ #\n\ \ \ set\ CRCTABLE\ \[list\ \ 0x00000000\ 0x77073096\ 0xEE0E612C\ 0x990951BA\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x076DC419\ 0x706AF48F\ 0xE963A535\ 0x9E6495A3\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x0EDB8832\ 0x79DCB8A4\ 0xE0D5E91E\ 0x97D2D988\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x09B64C2B\ 0x7EB17CBD\ 0xE7B82D07\ 0x90BF1D91\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x1DB71064\ 0x6AB020F2\ 0xF3B97148\ 0x84BE41DE\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x1ADAD47D\ 0x6DDDE4EB\ 0xF4D4B551\ 0x83D385C7\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x136C9856\ 0x646BA8C0\ 0xFD62F97A\ 0x8A65C9EC\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x14015C4F\ 0x63066CD9\ 0xFA0F3D63\ 0x8D080DF5\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x3B6E20C8\ 0x4C69105E\ 0xD56041E4\ 0xA2677172\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x3C03E4D1\ 0x4B04D447\ 0xD20D85FD\ 0xA50AB56B\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x35B5A8FA\ 0x42B2986C\ 0xDBBBC9D6\ 0xACBCF940\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x32D86CE3\ 0x45DF5C75\ 0xDCD60DCF\ 0xABD13D59\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x26D930AC\ 0x51DE003A\ 0xC8D75180\ 0xBFD06116\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x21B4F4B5\ 0x56B3C423\ 0xCFBA9599\ 0xB8BDA50F\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x2802B89E\ 0x5F058808\ 0xC60CD9B2\ 0xB10BE924\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x2F6F7C87\ 0x58684C11\ 0xC1611DAB\ 0xB6662D3D\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x76DC4190\ 0x01DB7106\ 0x98D220BC\ 0xEFD5102A\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x71B18589\ 0x06B6B51F\ 0x9FBFE4A5\ 0xE8B8D433\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x7807C9A2\ 0x0F00F934\ 0x9609A88E\ 0xE10E9818\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x7F6A0DBB\ 0x086D3D2D\ 0x91646C97\ 0xE6635C01\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x6B6B51F4\ 0x1C6C6162\ 0x856530D8\ 0xF262004E\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x6C0695ED\ 0x1B01A57B\ 0x8208F4C1\ 0xF50FC457\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x65B0D9C6\ 0x12B7E950\ 0x8BBEB8EA\ 0xFCB9887C\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x62DD1DDF\ 0x15DA2D49\ 0x8CD37CF3\ 0xFBD44C65\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x4DB26158\ 0x3AB551CE\ 0xA3BC0074\ 0xD4BB30E2\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x4ADFA541\ 0x3DD895D7\ 0xA4D1C46D\ 0xD3D6F4FB\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x4369E96A\ 0x346ED9FC\ 0xAD678846\ 0xDA60B8D0\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x44042D73\ 0x33031DE5\ 0xAA0A4C5F\ 0xDD0D7CC9\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x5005713C\ 0x270241AA\ 0xBE0B1010\ 0xC90C2086\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x5768B525\ 0x206F85B3\ 0xB966D409\ 0xCE61E49F\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x5EDEF90E\ 0x29D9C998\ 0xB0D09822\ 0xC7D7A8B4\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x59B33D17\ 0x2EB40D81\ 0xB7BD5C3B\ 0xC0BA6CAD\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xEDB88320\ 0x9ABFB3B6\ 0x03B6E20C\ 0x74B1D29A\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xEAD54739\ 0x9DD277AF\ 0x04DB2615\ 0x73DC1683\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xE3630B12\ 0x94643B84\ 0x0D6D6A3E\ 0x7A6A5AA8\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xE40ECF0B\ 0x9309FF9D\ 0x0A00AE27\ 0x7D079EB1\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xF00F9344\ 0x8708A3D2\ 0x1E01F268\ 0x6906C2FE\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xF762575D\ 0x806567CB\ 0x196C3671\ 0x6E6B06E7\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xFED41B76\ 0x89D32BE0\ 0x10DA7A5A\ 0x67DD4ACC\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xF9B9DF6F\ 0x8EBEEFF9\ 0x17B7BE43\ 0x60B08ED5\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xD6D6A3E8\ 0xA1D1937E\ 0x38D8C2C4\ 0x4FDFF252\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xD1BB67F1\ 0xA6BC5767\ 0x3FB506DD\ 0x48B2364B\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xD80D2BDA\ 0xAF0A1B4C\ 0x36034AF6\ 0x41047A60\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xDF60EFC3\ 0xA867DF55\ 0x316E8EEF\ 0x4669BE79\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xCB61B38C\ 0xBC66831A\ 0x256FD2A0\ 0x5268E236\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xCC0C7795\ 0xBB0B4703\ 0x220216B9\ 0x5505262F\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xC5BA3BBE\ 0xB2BD0B28\ 0x2BB45A92\ 0x5CB36A04\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xC2D7FFA7\ 0xB5D0CF31\ 0x2CD99E8B\ 0x5BDEAE1D\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x9B64C2B0\ 0xEC63F226\ 0x756AA39C\ 0x026D930A\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x9C0906A9\ 0xEB0E363F\ 0x72076785\ 0x05005713\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x95BF4A82\ 0xE2B87A14\ 0x7BB12BAE\ 0x0CB61B38\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x92D28E9B\ 0xE5D5BE0D\ 0x7CDCEFB7\ 0x0BDBDF21\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x86D3D2D4\ 0xF1D4E242\ 0x68DDB3F8\ 0x1FDA836E\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x81BE16CD\ 0xF6B9265B\ 0x6FB077E1\ 0x18B74777\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x88085AE6\ 0xFF0F6A70\ 0x66063BCA\ 0x11010B5C\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x8F659EFF\ 0xF862AE69\ 0x616BFFD3\ 0x166CCF45\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xA00AE278\ 0xD70DD2EE\ 0x4E048354\ 0x3903B3C2\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xA7672661\ 0xD06016F7\ 0x4969474D\ 0x3E6E77DB\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xAED16A4A\ 0xD9D65ADC\ 0x40DF0B66\ 0x37D83BF0\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xA9BCAE53\ 0xDEBB9EC5\ 0x47B2CF7F\ 0x30B5FFE9\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xBDBDF21C\ 0xCABAC28A\ 0x53B39330\ 0x24B4A3A6\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xBAD03605\ 0xCDD70693\ 0x54DE5729\ 0x23D967BF\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xB3667A2E\ 0xC4614AB8\ 0x5D681B02\ 0x2A6F2B94\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xB40BBE37\ 0xC30C8EA1\ 0x5A05DF1B\ 0x2D02EF8D\]\n\n\ \ \ #\n\ \ \ #\ rightshift\ without\ carrying\ sign\ bit...\n\ \ \ #\n\ \ \ proc\ >>>\ \{x1\ x2\}\ \{\n\ \ \ \ \ \ \ for\ \{set\ v\ 1\}\ \{\$v!=0\}\ \{set\ w\ \$v\;\ set\ v\ \[expr\ \{\$v<<1\}\]\}\ \{\}\n\ \ \ \ \ \ \ expr\ \{(\$x1>>\$x2)\ &\ ~(\$w>>(\$x2-1))\}\n\ \ \ \}\n\n\ \ \ proc\ crc32\ \{instr\}\ \{\n\ \ \ global\ CRCTABLE\n\n\ \ \ \ \ \ \ set\ crc_value\ 0xFFFFFFFF\n\n\ \ \ \ \ \ \ for\ \{set\ idx\ 0\}\ \{\$idx\ <\ \[string\ length\ \$instr\]\}\ \{incr\ idx\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ set\ result\ \[binary\ scan\ \[string\ index\ \$instr\ \$idx\]\ c\ num_value\]\n\ \ \ \ \ \ \ \ \ \ \ set\ crc_value\ \[expr\ \[lindex\ \$CRCTABLE\ \[expr\ (\$crc_value\ ^\ \$num_value)\ &\ 0xFF\]\]\ ^\ \[>>>\ \$crc_value\ 8\]\]\n\ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ return\ \[format\ %u\ \[expr\ \$crc_value\ ^\ 0xFFFFFFFF\]\]\n\ \ \ \}\n======\n\n----\n\nIt's\ worth\ avoiding\ recalculating\ the\ signbit\ each\ time\ you\ call\ >>>.\ \nI\ would\ suggest\ the\ following\ ammended\ proc\ which\ gives\ 853\ microseconds\ per\ iteration\ \nagainst\ 1215\ ms\ per\ iteration\ using\ the\ original\ proc\ (on\ my\ machine).\ \nOf\ course,\ we\ ''should''\ be\ using\ a\ namespace\ here...\[PT\]\n======\n\ proc\ >>>\ \{x1\ x2\}\ \{\n\ \ \ \ #\ set\ __signbit\ to\ highest\ available\ bit.\n\ \ \ \ global\ __signbit\n\ \ \ \ if\ \{!\[info\ exists\ __signbit\]\}\ \{\n\ \ \ \ \ \ \ \ for\ \{set\ v\ 1\}\ \{\$v\ !=\ 0\}\ \{set\ __signbit\ \$v\;\ set\ v\ \[expr\ \{\$v<<1\}\]\}\ \{\}\n\ \ \ \ \}\n\ \ \ \ expr\ \{(\$x1>>\$x2)\ &\ ~(\$__signbit>>(\$x2-1))\}\n\ \}\n======\n----\nIn\ fact,\ here\ is\ a\ tcllib-style\ version\ of\ the\ above\ and\ I'll\ submit\ this\ (if\ it\ isn't\ already\ submitted)\ to\ the\ tcllib\ project\ for\ possible\ inclusion.\ It's\ always\ good\ to\ have\ a\ tcl\ only\ implementation\ of\ these\ sorts\ of\ things.\ \[PT\]\n\n\[Arjen\ Markus\]\ I\ left\ my\ name\ in\ out\ of\ vanity,\ but\ I\ merely\ asked\ the\ question\ and\ Wayland\ has\ done\ the\ work.\ As\ for\ the\ submission\ to\ tcllib:\ yes,\ I\ fully\ agree!\n\n----\n\nI\ have\ uploaded\ the\ code,\ manual\ page\ and\ test\ file\ to\ the\ tcllib\ patches\ tracker\ and\ it's\ got\ id\ #501339.\ \nI\ also\ contacted\ the\ original\ author\ concerning\ adding\ this\ to\ tcllib\ and\ he\ was\ agreeable.\ \[PT\]\n\n----\n\nIn\ fact\ I\ played\ with\ the\ performance\ a\ bit\ last\ night.\ Simply\ putting\ the\ various\ expr's\ into\ braces\ can\ reduce\ the\ runtime\ by\ 60%.\ So\ here\ is\ my\ optimised\ version\ for\ use\ with\ tcllib.\ \nIf\ anyone\ can\ think\ of\ further\ speedups\ -\ please\ add\ them\ in.\ Wayland\ suggested\ passing\ the\ ''name''\ of\ the\ string\ variable\ and\ using\ upvar\ rather\ than\ passing\ a\ copy\ of\ the\ string\ but\ I\ prefer\ the\ (IMO)\ simpler\ usage.\ Doing\ \n======\n\ \ set\ s\ \{Hello,\ World!\}\ \;\ set\ crc\ \[crc32::crc32\ s\]\n======\nseems\ a\ bit\ wierd.\ \n\nHere\ are\ some\ figures\ where\ N\ is\ string\ length,\ t\ is\ the\ iteration\ time\ in\ milliseconds\ done\ using\n======\n\ \ set\ s\ \[string\ repeat\ x\ N\]\n\ \ time\ \{crc32::crc32\ \$s\}\ 10000\n======\n\ \ \ \ \ \ N\ \ \ \ \ t\ \ \ \ \ \ \ \ t/N\ (added\ by\ Arjen)\n\ \ -----\ -----\ \ \ \ \ ------\n\ \ \ \ \ 10\ \ \ \ 70\ \ \ \ \ \ \ \ 7.0\n\ \ \ \ 100\ \ \ 410\ \ \ \ \ \ \ \ 4.1\n\ \ \ \ 500\ \ 1907\ \ \ \ \ \ \ \ 3.8\n\ \ \ 1000\ \ 3792\ \ \ \ \ \ \ \ 3.8\n\ \ 10000\ 41100\ \ \ \ \ \ \ \ 4.1\n\n\[Arjen\ Markus\]\ Well,\ for\ what\ the\ estimates\ are\ worth,\ O(N)!\ Quite\ useful.\n\n----\n\nSee\ Tcllib\ code\ at:\ \nhttp://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tcllib/tcllib/modules/crc/crc32.tcl?rev=HEAD&content-type=text/vnd.viewcvs-markup\n\n-------\n\n\[Gerald\ Lester\]\nMight\ I\ suggest\ passing\ crcval\ as\ a\ optional\ parameter\ that\ defaults\ to\ 0xFFFFFFFF.\ \ \nIt\ is\ sometimes\ useful\ to\ seed\ in\ other\ values.\n\nThus:\n======\n\ proc\ crc32::crc32\ \{instr\ \{format\ %u\}\ \{crcval\ 0xFFFFFFFF\}\}\ \{\n\ \ \ \ \ variable\ CRCTABLE\n\ \ \ \ \ variable\ signbit\n\ \n\ \ \ \ \ ...\n\ \}\n======\n\[PT\]\ -\ I'm\ happy\ to\ do\ this\ but\ why\ might\ it\ be\ useful?\ I\ would\ have\ thought\ it\ most\ useful\ if\ the\ tcl\ generated\ checksum\ corresponds\ with\ that\ calculated\ by\ some\ other\ implementation.\n\n\[Joe\ English\]\ \nThis\ is\ useful\ for\ computing\ checksums\ of\ compound\ data\ structures\;\nyou\ can\ use\ the\ CRC\ of\ the\ first\ part\ as\ the\ seed\ for\ the\ second\ part,\nuse\ the\ result\ of\ that\ as\ the\ seed\ for\ the\ next\ part,\ etc.\ \n\nThis\ will\ usually\ be\ more\ efficient\ than\ serializing\ the\ whole\ \nstructure\ as\ a\ single\ string\ and\ computing\ the\ CRC\ of\ that.\n\n(I've\ filed\ a\ feature\ request\ at\ SourceForge,\ #504138).\n\n\[PT\]\ OK\ That\ makes\ sense.\ I'll\ handle\ the\ FR\ then.\ :)\n\n----\n\n\[DKF\]:\ On\ 8.5,\ the\ following\ implementation\ is\ about\ 6\ times\ faster\ (even\ for\ a\ version\ with\ a\ corrected\ `>>>`\ implementation).\ It\ still\ relies\ on\ the\ table\ of\ values\ from\ Arjen's\ code\ though.\n====\nproc\ crc32\ \{instr\}\ \{\n\ \ \ \ global\ CRCTABLE\n\n\ \ \ \ set\ crc_value\ 0xFFFFFFFF\n\ \ \ \ foreach\ c\ \[split\ \$instr\ \"\"\]\ \{\n\ \ \ \ \ \ \ \ set\ crc_value\ \[expr\ \{\[lindex\ \$CRCTABLE\ \[expr\ \{(\$crc_value\ ^\ \[scan\ \$c\ %c\])&0xff\}\]\]^((\$crc_value>>8)&0xffffff)\}\]\n\ \ \ \ \}\n\ \ \ \ return\ \[expr\ \{\$crc_value\ ^\ 0xFFFFFFFF\}\]\n\}\n======\n----\n**\[CRC16\]**\n\nSee\ the\ \[tcllib\]\ crc\ module\ or\nhttp://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tcllib/tcllib/modules/crc/crc16.tcl?rev=1.1&content-type=text/vnd.viewcvs-markup\n\[PT\]\n\n----\n'''References'''\n\ \ \ \ *\ http://www.ross.net/crc/\n----\n**See\ also**\n\ \ \ \ *\ \[cksum\]\n\ \ \ \ *\ \[sum\]\n\ \ \ \ *\ \[zlib\ crc32\]\n\ \ \ \ *\ \[Tcllib\]\n\n<<categories>>\ Category\ Acronym\ |\ Category\ Mathematics\ |\ Category\ Package regexp2} CALL {my render CRC See\ the\ documentation\ for\ the\ \[Tcllib\]\ package\ implementing\ this\ at\n\n\ \ \ *\ http://tcllib.sourceforge.net/doc/crc16.html\n\ \ \ *\ http://tcllib.sourceforge.net/doc/crc32.html\n\ \ \ *\ http://tcllib.sourceforge.net/doc/cksum.html\n\ \ \ *\ http://tcllib.sourceforge.net/doc/sum.html\n\n\[\[Explain\ essence.\]\]\n\nCRC\ is\ an\ acronym\ for\ ''Cyclic\ Redundancy\ Check''\ \[http://whatis.techtarget.com/definition/0,,sid9_gci213868,00.html\]\n\[http://www.rad.com/networks/1994/err_con/crc.htm\].\n\nIt\ is\ basically\ a\ (binary)\ polynomial\ function\ used\ to\ detect\ ''random''\ errors\ in\ data.\ \ \nMalicious\ alterations\ require\ a\ different\ technique\ (\[digital\ signature\]s\ and/or\ \[encryption\].)\n\n----\n\nThe\ \[Tcllib\]\ implementation\ of\ this\ algorithm\ is\ at\ http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tcllib/tcllib/modules/crc/crc32.tcl?rev=HEAD&content-type=text/vnd.viewcvs-markup\ which\ provides\ a\ crc32\ package.\ \[PT\]\n\n----\n\nCRCs\ are\ available\ to\ Tcl\ programmers\ in\ several\ forms,\ \nincluding\ \[Andreas\ Kupries\]'\ \[Trf\]\ package.\ \ \n\[Pat\ Thoyts\]\ illustrates\ example\ manipulations\ which\ rely\ on\ this\ C-coded\ extension:\n======\n\ \ \ \ \ \ 32\ %\ package\ require\ Trf\n\ \ \ \ \ \ 2.1\n\ \ \ \ \ \ 33\ %\ set\ chk\ \[crc-zlib\ \{Hello,\ World!\}\]\n\ \ \ \ \ \ <funny\ chars>\n\ \ \ \ \ \ 34\ %\ binary\ scan\ \$chk\ i\ chksum\n\ \ \ \ \ \ 1\n\ \ \ \ \ \ 35\ %\ format\ 0x%x\ \$chksum\n\ \ \ \ \ \ 0xec4ac3d0\n======\nNote\ that\ the\ \[\[hex\]\]\ command\ in\ Trf\ can\ be\ used\ to\ perform\ the\ same\ conversions.\ \nHere\ is\ the\ example\ from\ above\ recast\ to\ use\ \[\[hex\]\]:\n======\n\ \ \ \ \ \ 32\ %\ package\ require\ Trf\n\ \ \ \ \ \ 2.1\n\ \ \ \ \ \ 33\ %\ set\ chk\ \[crc-zlib\ \{Hello,\ World!\}\]\n\ \ \ \ \ \ <funny\ chars>\n\ \ \ \ \ \ 34\ %\ set\ chkx\ \[hex\ -mode\ encode\ --\ \$chk\]\n\ \ \ \ \ \ D0C34AEC\n======\n\[PT\]\ If\ you\ look\ carefully\ you\ can't\ really\ use\ \[\[hex\]\].\ \nThe\ crc\ and\ crc-zlib\ commands\ return\ the\ bytes\ of\ a\ long\ integer.\ \n\[\[hex\]\]\ encodes\ each\ byte\ in\ turn.\ What\ we\ really\ need\ is\ \[\[binary\ scan\ \$result\ i\ val\]\].\ \nHowever\ the\ Tcllib\ crc32\ command\ will\ wrap\ this\ up\ transparently\ now.\n\n----\n\n\[Arjen\ Markus\]\ The\ following\ is\ an\ implementation\ by\ Wayland\ Augur:\n\n======\n\ \ \ #\n\ \ \ #\ CRCTABLE\ is\ the\ pre-calculated\ lookup\ table\ provided\ for\ this\n\ \ \ #\ implementation:\n\ \ \ #\n\ \ \ set\ CRCTABLE\ \[list\ \ 0x00000000\ 0x77073096\ 0xEE0E612C\ 0x990951BA\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x076DC419\ 0x706AF48F\ 0xE963A535\ 0x9E6495A3\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x0EDB8832\ 0x79DCB8A4\ 0xE0D5E91E\ 0x97D2D988\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x09B64C2B\ 0x7EB17CBD\ 0xE7B82D07\ 0x90BF1D91\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x1DB71064\ 0x6AB020F2\ 0xF3B97148\ 0x84BE41DE\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x1ADAD47D\ 0x6DDDE4EB\ 0xF4D4B551\ 0x83D385C7\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x136C9856\ 0x646BA8C0\ 0xFD62F97A\ 0x8A65C9EC\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x14015C4F\ 0x63066CD9\ 0xFA0F3D63\ 0x8D080DF5\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x3B6E20C8\ 0x4C69105E\ 0xD56041E4\ 0xA2677172\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x3C03E4D1\ 0x4B04D447\ 0xD20D85FD\ 0xA50AB56B\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x35B5A8FA\ 0x42B2986C\ 0xDBBBC9D6\ 0xACBCF940\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x32D86CE3\ 0x45DF5C75\ 0xDCD60DCF\ 0xABD13D59\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x26D930AC\ 0x51DE003A\ 0xC8D75180\ 0xBFD06116\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x21B4F4B5\ 0x56B3C423\ 0xCFBA9599\ 0xB8BDA50F\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x2802B89E\ 0x5F058808\ 0xC60CD9B2\ 0xB10BE924\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x2F6F7C87\ 0x58684C11\ 0xC1611DAB\ 0xB6662D3D\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x76DC4190\ 0x01DB7106\ 0x98D220BC\ 0xEFD5102A\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x71B18589\ 0x06B6B51F\ 0x9FBFE4A5\ 0xE8B8D433\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x7807C9A2\ 0x0F00F934\ 0x9609A88E\ 0xE10E9818\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x7F6A0DBB\ 0x086D3D2D\ 0x91646C97\ 0xE6635C01\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x6B6B51F4\ 0x1C6C6162\ 0x856530D8\ 0xF262004E\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x6C0695ED\ 0x1B01A57B\ 0x8208F4C1\ 0xF50FC457\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x65B0D9C6\ 0x12B7E950\ 0x8BBEB8EA\ 0xFCB9887C\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x62DD1DDF\ 0x15DA2D49\ 0x8CD37CF3\ 0xFBD44C65\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x4DB26158\ 0x3AB551CE\ 0xA3BC0074\ 0xD4BB30E2\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x4ADFA541\ 0x3DD895D7\ 0xA4D1C46D\ 0xD3D6F4FB\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x4369E96A\ 0x346ED9FC\ 0xAD678846\ 0xDA60B8D0\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x44042D73\ 0x33031DE5\ 0xAA0A4C5F\ 0xDD0D7CC9\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x5005713C\ 0x270241AA\ 0xBE0B1010\ 0xC90C2086\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x5768B525\ 0x206F85B3\ 0xB966D409\ 0xCE61E49F\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x5EDEF90E\ 0x29D9C998\ 0xB0D09822\ 0xC7D7A8B4\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x59B33D17\ 0x2EB40D81\ 0xB7BD5C3B\ 0xC0BA6CAD\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xEDB88320\ 0x9ABFB3B6\ 0x03B6E20C\ 0x74B1D29A\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xEAD54739\ 0x9DD277AF\ 0x04DB2615\ 0x73DC1683\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xE3630B12\ 0x94643B84\ 0x0D6D6A3E\ 0x7A6A5AA8\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xE40ECF0B\ 0x9309FF9D\ 0x0A00AE27\ 0x7D079EB1\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xF00F9344\ 0x8708A3D2\ 0x1E01F268\ 0x6906C2FE\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xF762575D\ 0x806567CB\ 0x196C3671\ 0x6E6B06E7\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xFED41B76\ 0x89D32BE0\ 0x10DA7A5A\ 0x67DD4ACC\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xF9B9DF6F\ 0x8EBEEFF9\ 0x17B7BE43\ 0x60B08ED5\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xD6D6A3E8\ 0xA1D1937E\ 0x38D8C2C4\ 0x4FDFF252\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xD1BB67F1\ 0xA6BC5767\ 0x3FB506DD\ 0x48B2364B\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xD80D2BDA\ 0xAF0A1B4C\ 0x36034AF6\ 0x41047A60\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xDF60EFC3\ 0xA867DF55\ 0x316E8EEF\ 0x4669BE79\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xCB61B38C\ 0xBC66831A\ 0x256FD2A0\ 0x5268E236\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xCC0C7795\ 0xBB0B4703\ 0x220216B9\ 0x5505262F\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xC5BA3BBE\ 0xB2BD0B28\ 0x2BB45A92\ 0x5CB36A04\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xC2D7FFA7\ 0xB5D0CF31\ 0x2CD99E8B\ 0x5BDEAE1D\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x9B64C2B0\ 0xEC63F226\ 0x756AA39C\ 0x026D930A\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x9C0906A9\ 0xEB0E363F\ 0x72076785\ 0x05005713\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x95BF4A82\ 0xE2B87A14\ 0x7BB12BAE\ 0x0CB61B38\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x92D28E9B\ 0xE5D5BE0D\ 0x7CDCEFB7\ 0x0BDBDF21\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x86D3D2D4\ 0xF1D4E242\ 0x68DDB3F8\ 0x1FDA836E\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x81BE16CD\ 0xF6B9265B\ 0x6FB077E1\ 0x18B74777\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x88085AE6\ 0xFF0F6A70\ 0x66063BCA\ 0x11010B5C\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x8F659EFF\ 0xF862AE69\ 0x616BFFD3\ 0x166CCF45\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xA00AE278\ 0xD70DD2EE\ 0x4E048354\ 0x3903B3C2\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xA7672661\ 0xD06016F7\ 0x4969474D\ 0x3E6E77DB\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xAED16A4A\ 0xD9D65ADC\ 0x40DF0B66\ 0x37D83BF0\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xA9BCAE53\ 0xDEBB9EC5\ 0x47B2CF7F\ 0x30B5FFE9\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xBDBDF21C\ 0xCABAC28A\ 0x53B39330\ 0x24B4A3A6\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xBAD03605\ 0xCDD70693\ 0x54DE5729\ 0x23D967BF\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xB3667A2E\ 0xC4614AB8\ 0x5D681B02\ 0x2A6F2B94\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0xB40BBE37\ 0xC30C8EA1\ 0x5A05DF1B\ 0x2D02EF8D\]\n\n\ \ \ #\n\ \ \ #\ rightshift\ without\ carrying\ sign\ bit...\n\ \ \ #\n\ \ \ proc\ >>>\ \{x1\ x2\}\ \{\n\ \ \ \ \ \ \ for\ \{set\ v\ 1\}\ \{\$v!=0\}\ \{set\ w\ \$v\;\ set\ v\ \[expr\ \{\$v<<1\}\]\}\ \{\}\n\ \ \ \ \ \ \ expr\ \{(\$x1>>\$x2)\ &\ ~(\$w>>(\$x2-1))\}\n\ \ \ \}\n\n\ \ \ proc\ crc32\ \{instr\}\ \{\n\ \ \ global\ CRCTABLE\n\n\ \ \ \ \ \ \ set\ crc_value\ 0xFFFFFFFF\n\n\ \ \ \ \ \ \ for\ \{set\ idx\ 0\}\ \{\$idx\ <\ \[string\ length\ \$instr\]\}\ \{incr\ idx\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ set\ result\ \[binary\ scan\ \[string\ index\ \$instr\ \$idx\]\ c\ num_value\]\n\ \ \ \ \ \ \ \ \ \ \ set\ crc_value\ \[expr\ \[lindex\ \$CRCTABLE\ \[expr\ (\$crc_value\ ^\ \$num_value)\ &\ 0xFF\]\]\ ^\ \[>>>\ \$crc_value\ 8\]\]\n\ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ return\ \[format\ %u\ \[expr\ \$crc_value\ ^\ 0xFFFFFFFF\]\]\n\ \ \ \}\n======\n\n----\n\nIt's\ worth\ avoiding\ recalculating\ the\ signbit\ each\ time\ you\ call\ >>>.\ \nI\ would\ suggest\ the\ following\ ammended\ proc\ which\ gives\ 853\ microseconds\ per\ iteration\ \nagainst\ 1215\ ms\ per\ iteration\ using\ the\ original\ proc\ (on\ my\ machine).\ \nOf\ course,\ we\ ''should''\ be\ using\ a\ namespace\ here...\[PT\]\n======\n\ proc\ >>>\ \{x1\ x2\}\ \{\n\ \ \ \ #\ set\ __signbit\ to\ highest\ available\ bit.\n\ \ \ \ global\ __signbit\n\ \ \ \ if\ \{!\[info\ exists\ __signbit\]\}\ \{\n\ \ \ \ \ \ \ \ for\ \{set\ v\ 1\}\ \{\$v\ !=\ 0\}\ \{set\ __signbit\ \$v\;\ set\ v\ \[expr\ \{\$v<<1\}\]\}\ \{\}\n\ \ \ \ \}\n\ \ \ \ expr\ \{(\$x1>>\$x2)\ &\ ~(\$__signbit>>(\$x2-1))\}\n\ \}\n======\n----\nIn\ fact,\ here\ is\ a\ tcllib-style\ version\ of\ the\ above\ and\ I'll\ submit\ this\ (if\ it\ isn't\ already\ submitted)\ to\ the\ tcllib\ project\ for\ possible\ inclusion.\ It's\ always\ good\ to\ have\ a\ tcl\ only\ implementation\ of\ these\ sorts\ of\ things.\ \[PT\]\n\n\[Arjen\ Markus\]\ I\ left\ my\ name\ in\ out\ of\ vanity,\ but\ I\ merely\ asked\ the\ question\ and\ Wayland\ has\ done\ the\ work.\ As\ for\ the\ submission\ to\ tcllib:\ yes,\ I\ fully\ agree!\n\n----\n\nI\ have\ uploaded\ the\ code,\ manual\ page\ and\ test\ file\ to\ the\ tcllib\ patches\ tracker\ and\ it's\ got\ id\ #501339.\ \nI\ also\ contacted\ the\ original\ author\ concerning\ adding\ this\ to\ tcllib\ and\ he\ was\ agreeable.\ \[PT\]\n\n----\n\nIn\ fact\ I\ played\ with\ the\ performance\ a\ bit\ last\ night.\ Simply\ putting\ the\ various\ expr's\ into\ braces\ can\ reduce\ the\ runtime\ by\ 60%.\ So\ here\ is\ my\ optimised\ version\ for\ use\ with\ tcllib.\ \nIf\ anyone\ can\ think\ of\ further\ speedups\ -\ please\ add\ them\ in.\ Wayland\ suggested\ passing\ the\ ''name''\ of\ the\ string\ variable\ and\ using\ upvar\ rather\ than\ passing\ a\ copy\ of\ the\ string\ but\ I\ prefer\ the\ (IMO)\ simpler\ usage.\ Doing\ \n======\n\ \ set\ s\ \{Hello,\ World!\}\ \;\ set\ crc\ \[crc32::crc32\ s\]\n======\nseems\ a\ bit\ wierd.\ \n\nHere\ are\ some\ figures\ where\ N\ is\ string\ length,\ t\ is\ the\ iteration\ time\ in\ milliseconds\ done\ using\n======\n\ \ set\ s\ \[string\ repeat\ x\ N\]\n\ \ time\ \{crc32::crc32\ \$s\}\ 10000\n======\n\ \ \ \ \ \ N\ \ \ \ \ t\ \ \ \ \ \ \ \ t/N\ (added\ by\ Arjen)\n\ \ -----\ -----\ \ \ \ \ ------\n\ \ \ \ \ 10\ \ \ \ 70\ \ \ \ \ \ \ \ 7.0\n\ \ \ \ 100\ \ \ 410\ \ \ \ \ \ \ \ 4.1\n\ \ \ \ 500\ \ 1907\ \ \ \ \ \ \ \ 3.8\n\ \ \ 1000\ \ 3792\ \ \ \ \ \ \ \ 3.8\n\ \ 10000\ 41100\ \ \ \ \ \ \ \ 4.1\n\n\[Arjen\ Markus\]\ Well,\ for\ what\ the\ estimates\ are\ worth,\ O(N)!\ Quite\ useful.\n\n----\n\nSee\ Tcllib\ code\ at:\ \nhttp://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tcllib/tcllib/modules/crc/crc32.tcl?rev=HEAD&content-type=text/vnd.viewcvs-markup\n\n-------\n\n\[Gerald\ Lester\]\nMight\ I\ suggest\ passing\ crcval\ as\ a\ optional\ parameter\ that\ defaults\ to\ 0xFFFFFFFF.\ \ \nIt\ is\ sometimes\ useful\ to\ seed\ in\ other\ values.\n\nThus:\n======\n\ proc\ crc32::crc32\ \{instr\ \{format\ %u\}\ \{crcval\ 0xFFFFFFFF\}\}\ \{\n\ \ \ \ \ variable\ CRCTABLE\n\ \ \ \ \ variable\ signbit\n\ \n\ \ \ \ \ ...\n\ \}\n======\n\[PT\]\ -\ I'm\ happy\ to\ do\ this\ but\ why\ might\ it\ be\ useful?\ I\ would\ have\ thought\ it\ most\ useful\ if\ the\ tcl\ generated\ checksum\ corresponds\ with\ that\ calculated\ by\ some\ other\ implementation.\n\n\[Joe\ English\]\ \nThis\ is\ useful\ for\ computing\ checksums\ of\ compound\ data\ structures\;\nyou\ can\ use\ the\ CRC\ of\ the\ first\ part\ as\ the\ seed\ for\ the\ second\ part,\nuse\ the\ result\ of\ that\ as\ the\ seed\ for\ the\ next\ part,\ etc.\ \n\nThis\ will\ usually\ be\ more\ efficient\ than\ serializing\ the\ whole\ \nstructure\ as\ a\ single\ string\ and\ computing\ the\ CRC\ of\ that.\n\n(I've\ filed\ a\ feature\ request\ at\ SourceForge,\ #504138).\n\n\[PT\]\ OK\ That\ makes\ sense.\ I'll\ handle\ the\ FR\ then.\ :)\n\n----\n\n\[DKF\]:\ On\ 8.5,\ the\ following\ implementation\ is\ about\ 6\ times\ faster\ (even\ for\ a\ version\ with\ a\ corrected\ `>>>`\ implementation).\ It\ still\ relies\ on\ the\ table\ of\ values\ from\ Arjen's\ code\ though.\n====\nproc\ crc32\ \{instr\}\ \{\n\ \ \ \ global\ CRCTABLE\n\n\ \ \ \ set\ crc_value\ 0xFFFFFFFF\n\ \ \ \ foreach\ c\ \[split\ \$instr\ \"\"\]\ \{\n\ \ \ \ \ \ \ \ set\ crc_value\ \[expr\ \{\[lindex\ \$CRCTABLE\ \[expr\ \{(\$crc_value\ ^\ \[scan\ \$c\ %c\])&0xff\}\]\]^((\$crc_value>>8)&0xffffff)\}\]\n\ \ \ \ \}\n\ \ \ \ return\ \[expr\ \{\$crc_value\ ^\ 0xFFFFFFFF\}\]\n\}\n======\n----\n**\[CRC16\]**\n\nSee\ the\ \[tcllib\]\ crc\ module\ or\nhttp://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tcllib/tcllib/modules/crc/crc16.tcl?rev=1.1&content-type=text/vnd.viewcvs-markup\n\[PT\]\n\n----\n'''References'''\n\ \ \ \ *\ http://www.ross.net/crc/\n----\n**See\ also**\n\ \ \ \ *\ \[cksum\]\n\ \ \ \ *\ \[sum\]\n\ \ \ \ *\ \[zlib\ crc32\]\n\ \ \ \ *\ \[Tcllib\]\n\n<<categories>>\ Category\ Acronym\ |\ Category\ Mathematics\ |\ Category\ Package} CALL {my revision CRC} CALL {::oo::Obj6348189 process revision/CRC} CALL {::oo::Obj6348187 process}

-errorcode

NONE

-errorinfo

Unknow state transition: LINE -> END
    while executing
"error $msg"
    (class "::Wiki" method "render_wikit" line 6)
    invoked from within
"my render_$default_markup $N $C $mkup_rendering_engine"
    (class "::Wiki" method "render" line 8)
    invoked from within
"my render $name $C"
    (class "::Wiki" method "revision" line 31)
    invoked from within
"my revision $page"
    (class "::Wiki" method "process" line 56)
    invoked from within
"$server process [string trim $uri /]"

-errorline

4