'From Croquet1.0beta of 24 March 2006 [latest update: #6665] on 26 March 2006 at 8:26:17 pm'! InterpreterPlugin subclass: #CroquetPlugin instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'VMMaker-Plugins'! !CroquetPlugin commentStamp: '' prior: 0! An assorted list of useful primitives for Croquet.! !CroquetPlugin methodsFor: 'primitives' stamp: 'ar 3/26/2006 19:59'! primitiveARC4Transform "Perform an ARC4 transform of input. Arguments: buffer transformed data startIndex start of transform stopIndex end of transform m key stream data x key state value y key state value Return value: x@y - updated key state value " | y x mOop stopIndex startIndex bufOop bufSize buffer a m b mask ptOop xOop yOop | self export: true. self var: 'buffer' type: 'unsigned char *'. self var: 'm' type: 'unsigned char *'. interpreterProxy methodArgumentCount = 6 ifFalse:[^interpreterProxy primitiveFail]. "pick up arguments" y := interpreterProxy stackIntegerValue: 0. x := interpreterProxy stackIntegerValue: 1. mOop := interpreterProxy stackObjectValue: 2. stopIndex := interpreterProxy stackIntegerValue: 3. startIndex := interpreterProxy stackIntegerValue: 4. bufOop := interpreterProxy stackObjectValue: 5. interpreterProxy failed ifTrue:[^nil]. ((interpreterProxy isBytes: mOop) and:[interpreterProxy isBytes: bufOop]) ifFalse:[^interpreterProxy primitiveFail]. (interpreterProxy byteSizeOf: mOop) = 256 ifFalse:[^interpreterProxy primitiveFail]. bufSize := interpreterProxy byteSizeOf: bufOop. (startIndex > 0 and:[startIndex <= bufSize]) ifFalse:[^interpreterProxy primitiveFail]. (stopIndex > startIndex and:[stopIndex <= bufSize]) ifFalse:[^interpreterProxy primitiveFail]. m := interpreterProxy firstIndexableField: mOop. buffer := interpreterProxy firstIndexableField: bufOop. startIndex-1 to: stopIndex-1 do:[:i| x := (x + 1) bitAnd: 255. a := m at: x. y := (y + a) bitAnd: 255. b := m at: y. m at: x put: b. m at: y put: a. mask := m at: ((a + b) bitAnd: 255). buffer at: i put: ((buffer at: i) bitXor: mask). ]. ptOop := interpreterProxy instantiateClass: interpreterProxy classPoint indexableSize: 0. interpreterProxy pushRemappableOop: ptOop. xOop := interpreterProxy positive32BitIntegerFor: x. interpreterProxy pushRemappableOop: xOop. yOop := interpreterProxy positive32BitIntegerFor: x. xOop := interpreterProxy popRemappableOop. ptOop := interpreterProxy popRemappableOop. interpreterProxy storePointer: 0 ofObject: ptOop withValue: xOop. interpreterProxy storePointer: 1 ofObject: ptOop withValue: yOop. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy push: ptOop. ! ! !CroquetPlugin methodsFor: 'primitives' stamp: 'ar 3/26/2006 19:45'! primitiveMD5Transform "Perform an MD5 transform of input" | bufOop hashOop hash buffer | self export: true. self var: 'hash' type: 'unsigned int *'. self var: 'buffer' type: 'unsigned int *'. interpreterProxy methodArgumentCount = 2 ifFalse:[^interpreterProxy primitiveFail]. hashOop := interpreterProxy stackObjectValue: 0. ((interpreterProxy isWords: hashOop) and:[(interpreterProxy slotSizeOf: hashOop) = 4]) ifFalse:[^interpreterProxy primitiveFail]. hash := interpreterProxy firstIndexableField: hashOop. bufOop := interpreterProxy stackObjectValue: 1. ((interpreterProxy isWords: bufOop) and:[(interpreterProxy slotSizeOf: bufOop) = 16]) ifFalse:[^interpreterProxy primitiveFail]. buffer := interpreterProxy firstIndexableField: bufOop. self cCode:'MD5Transform(hash, buffer)' inSmalltalk:[ hash. buffer. ^interpreterProxy primitiveFail]. "Pop args; return buffer" interpreterProxy pop: interpreterProxy methodArgumentCount+1. interpreterProxy push: bufOop.! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! CroquetPlugin class instanceVariableNames: ''! !CroquetPlugin class methodsFor: 'as yet unclassified' stamp: 'ar 3/26/2006 19:37'! hasHeaderFile "If there is a single intrinsic header file to be associated with the plugin, here is where you want to flag" ^true! ! !CroquetPlugin class methodsFor: 'as yet unclassified' stamp: 'ar 3/26/2006 19:37'! requiresCrossPlatformFiles "default is ok for most, any plugin needing platform specific files must say so" ^true! !