1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
'From Squeak 3.2 of 11 July 2002 [latest update: #4917] on 17 August 2002 at 6:10:11 pm'!
"Change Set: RePlugin3-Fixes
Date: 17 August 2002
Author: tim@sumeru.stanford.edu
Some small fixes to RePlugin3 to allow compiling on Acorn"!
!RePlugin methodsFor: 're primitives' stamp: 'tpr 8/17/2002 18:00'!
primPCREExec
"<rcvr primPCREExec: searchObject>, where rcvr is an object with instance variables:
'patternStr compileFlags pcrePtr extraPtr errorStr errorOffset matchFlags'
Apply the regular expression (stored in <pcrePtr> and <extratr>, generated from calls to primPCRECompile), to smalltalk String searchObject using <matchOptions>. If there is no match, answer nil. Otherwise answer a ByteArray of offsets representing the results of the match."
| searchObject searchBuffer length result matchSpacePtr matchSpaceSize |
self export: true.
self var:#searchBuffer declareC: 'char *searchBuffer'.
self var:#matchSpacePtr declareC: 'int *matchSpacePtr'.
self var:#result declareC: 'int result'.
"Load Parameters"
searchObject _ interpreterProxy stackObjectValue: 0.
searchBuffer _ interpreterProxy arrayValueOf: searchObject.
length _ interpreterProxy byteSizeOf: searchObject.
self loadRcvrFromStackAt: 1.
"Load Instance Variables"
pcrePtr _ self rcvrPCREBufferPtr.
extraPtr _ self rcvrExtraPtr.
matchFlags _ self rcvrMatchFlags.
matchSpacePtr _ self rcvrMatchSpacePtr.
matchSpaceSize _ self rcvrMatchSpaceSize.
interpreterProxy failed ifTrue:[^ nil].
result _ self
cCode: 'pcre_exec((pcre *)pcrePtr, (pcre_extra *)extraPtr,
searchBuffer, length, 0, matchFlags, matchSpacePtr, matchSpaceSize)'.
interpreterProxy pop: 2; pushInteger: result.
"empty call so compiler doesn't bug me about variables not used"
self touch: searchBuffer; touch: matchSpacePtr; touch: matchSpaceSize; touch: length
! !
!RePlugin methodsFor: 're primitives' stamp: 'tpr 8/17/2002 18:00'!
primPCREExecfromto
"<rcvr primPCREExec: searchObject> from: fromInteger to: toInteger>, where rcvr is an object with instance variables:
'patternStr compileFlags pcrePtr extraPtr errorStr errorOffset matchFlags'
Apply the regular expression (stored in <pcrePtr> and <extratr>, generated from calls to primPCRECompile), to smalltalk String searchObject using <matchOptions>, beginning at offset <fromInteger> and continuing until offset <toInteger>. If there is no match, answer nil. Otherwise answer a ByteArray of offsets representing the results of the match."
| searchObject searchBuffer length result matchSpacePtr matchSpaceSize fromInteger toInteger |
self export: true.
self var:#searchBuffer declareC: 'char *searchBuffer'.
self var:#fromInteger declareC: 'int fromInteger'.
self var:#toInteger declareC: 'int toInteger'.
self var:#matchSpacePtr declareC: 'int *matchSpacePtr'.
self var:#result declareC: 'int result'.
"Load Parameters"
toInteger _ interpreterProxy stackIntegerValue: 0.
fromInteger _ interpreterProxy stackIntegerValue: 1.
searchObject _ interpreterProxy stackObjectValue: 2.
searchBuffer _ interpreterProxy arrayValueOf: searchObject.
length _ interpreterProxy byteSizeOf: searchObject.
self loadRcvrFromStackAt: 3.
"Validate parameters"
interpreterProxy success: (1 <= fromInteger).
interpreterProxy success: (toInteger<=length).
fromInteger _ fromInteger - 1. "Smalltalk offsets are 1-based"
interpreterProxy success: (fromInteger<=toInteger).
"adjust length, searchBuffer"
length _ toInteger - fromInteger.
searchBuffer _ searchBuffer + fromInteger.
"Load Instance Variables"
pcrePtr _ self rcvrPCREBufferPtr.
extraPtr _ self rcvrExtraPtr.
matchFlags _ self rcvrMatchFlags.
matchSpacePtr _ self rcvrMatchSpacePtr.
matchSpaceSize _ self rcvrMatchSpaceSize.
interpreterProxy failed ifTrue:[^ nil].
result _ self
cCode: 'pcre_exec((pcre *)pcrePtr, (pcre_extra *)extraPtr,
searchBuffer, length, 0, matchFlags, matchSpacePtr, matchSpaceSize)'.
interpreterProxy pop: 2; pushInteger: result.
"empty call so compiler doesn't bug me about variables not used"
self touch: searchBuffer; touch: matchSpacePtr; touch: matchSpaceSize; touch: length
! !
!RePlugin methodsFor: 'rcvr linkage' stamp: 'tpr 8/17/2002 18:01'!
allocateStringAndSetRcvrErrorStrFromCStr: aCStrBuffer
|length errorStrObj errorStrObjPtr |
self var: #aCStrBuffer declareC: 'const char *aCStrBuffer'.
self var: #errorStrObjPtr declareC: 'void *errorStrObjPtr'.
"Allocate errorStrObj"
length _ self cCode: 'strlen(aCStrBuffer)'.
errorStrObj _ interpreterProxy
instantiateClass: (interpreterProxy classString)
indexableSize: length.
self loadRcvrFromStackAt: 0. "Assume garbage collection after instantiation"
"Copy aCStrBuffer to errorStrObj's buffer"
errorStrObjPtr _ interpreterProxy arrayValueOf: errorStrObj.
self cCode:'memcpy(errorStrObjPtr,aCStrBuffer,length)'.
self touch: errorStrObjPtr; touch: errorStrObj.
"Set rcvrErrorStr from errorStrObj and Return"
self rcvrErrorStrFrom: errorStrObj.
^errorStrObj.! !
!RePlugin class methodsFor: 'plugin code generation' stamp: 'tpr 8/17/2002 18:02'!
declareCVarsIn: cg
cg addHeaderFile:'"rePlugin.h"'.
"Memory Managament Error Checking"
cg var: 'netMemory' declareC: 'int netMemory = 0'.
cg var: 'numAllocs' declareC: 'int numAllocs = 0'.
cg var: 'numFrees' declareC: 'int numFrees = 0'.
cg var: 'lastAlloc' declareC: 'int lastAlloc = 0'.
"The receiver Object Pointer"
cg var: 'rcvr' declareC: 'int rcvr'.
"Instance Variables of Receiver Object"
cg var: 'patternStr' declareC: 'int patternStr'.
cg var: 'compileFlags' declareC: 'int compileFlags'.
cg var: 'pcrePtr' declareC: 'int pcrePtr'.
cg var: 'extraPtr' declareC: 'int extraPtr'.
cg var: 'errorStr' declareC: 'int errorStr'.
cg var: 'errorOffset' declareC: 'int errorOffset'.
cg var: 'matchFlags' declareC: 'int matchFlags'.
"Support Variables for Access to Receiver Instance Variables"
cg var: 'patternStrPtr' declareC: 'const char * patternStrPtr'.
cg var: 'errorStrBuffer' declareC: 'const char * errorStrBuffer'.! !
|