[Vm-dev] VM Maker: FileAttributesPlugin.oscog-eem.37.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Nov 29 20:26:35 UTC 2019
Eliot Miranda uploaded a new version of FileAttributesPlugin to project VM Maker:
http://source.squeak.org/VMMaker/FileAttributesPlugin.oscog-eem.37.mcz
==================== Summary ====================
Name: FileAttributesPlugin.oscog-eem.37
Author: eem
Time: 20 September 2018, 4:48:56.754659 pm
UUID: 8a9411e4-e8c4-4562-b282-57c8056ad629
Ancestors: FileAttributesPlugin.oscog-AlistairGrant.36
Refactor mem:cp:y: => memcpy:_:_:, st:rn:cpy: => strncpy:_:_:
=============== Diff against FileAttributesPlugin.oscog-AlistairGrant.36 ===============
Item was changed:
----- Method: FileAttributesPlugin>>byteArrayFromCString:to: (in category 'private') -----
byteArrayFromCString: aCString to: byteArrayOop
"Answer a new ByteArray copied from a null-terminated C string.
Caution: This may invoke the garbage collector."
| len newByteArray byteArrayPtr |
<var: 'aCString' type: #'const char *'>
<var: 'byteArrayPtr' type: #'unsigned char *'>
<var: 'byteArrayOop' type: #'sqInt *'>
len := self strlen: aCString.
"We never return strings longer than PATH_MAX"
len > #PATH_MAX ifTrue: [^self stringTooLong].
newByteArray := interpreterProxy
instantiateClass: interpreterProxy classByteArray
indexableSize: len.
newByteArray ifNil:
[^interpreterProxy primitiveFailFor: PrimErrNoMemory].
byteArrayPtr := interpreterProxy arrayValueOf: newByteArray.
+ self memcpy: byteArrayPtr _: aCString _: len.
- self mem: byteArrayPtr cp: aCString y: len.
byteArrayOop at: 0 put: newByteArray.
^0!
Item was changed:
----- Method: FileAttributesPlugin>>openDirectoryStream:ptr: (in category 'private - directory') -----
openDirectoryStream: cPathName ptr: osdirPtr
"Open a new directory stream. Answer a pointer to the directory stream or NULL."
| len dir |
<var: 'osdirPtr' type: #'osdir **'>
<var: 'dir' type: #'osdir *'>
<var: 'cPathName' type: 'char *'>
<returnTypeC: #'int'>
len := self strlen: cPathName.
"The path buffer needs room for a trailing slash and the file name, so subtracting 2 is conservative"
len > (#PATH_MAX - 2) ifTrue: [^self stringTooLong].
(self canOpenDirectoryStreamFor: cPathName length: len)
ifTrue:
[
dir := self cCode: '(osdir *) malloc(sizeof(osdir))'.
dir = nil ifTrue: [^self cantAllocateMemory].
+ self memcpy: dir path _: cPathName _: len.
- self mem: dir path cp: cPathName y: len.
"Ensure path has a trailing slash"
self cCode: 'if (dir->path[len-1] !!= ''/'') {
dir->path[len++] = ''/'';
}'.
self cCode: 'dir->path_file = dir->path + len'.
self cCode: 'dir->path_file[0] = ''\0'''.
self cCode: 'dir->path_len = len'.
self cCode: 'dir->dp = opendir(dir->path)'.
dir dp ifNil:
[self free: dir.
^self cantOpenDir].
osdirPtr at: 0 put: dir.
^0
].
"If we get here, we can't open the directory"
^self cantOpenDir
!
Item was changed:
----- Method: FileAttributesPlugin>>pathOop:toBuffer:maxLen: (in category 'private - file') -----
pathOop: pathNameOop toBuffer: cPathName maxLen: maxLen
"Copy the supplied path name string object to the supplied c string buffer"
| len sPtr |
<var: 'cPathName' type: #'char *'>
<var: 'sPtr' type: #'char *'>
<returnTypeC: #'int'>
len := interpreterProxy stSizeOf: pathNameOop.
(len >= maxLen) ifTrue: [^self stringTooLong].
"Copy pathName to the new string"
sPtr := interpreterProxy arrayValueOf: pathNameOop.
((self canStatFilePath: sPtr length: len) = 0) ifTrue: [^self cantStatPath].
+ self memcpy: cPathName _: sPtr _: len.
- self mem: cPathName cp: sPtr y: len.
cPathName at: len put: 0.
^0.
!
Item was changed:
----- Method: FileAttributesPlugin>>primitiveReaddir (in category 'file primitives') -----
primitiveReaddir
"Get the next entry in the directory stream. Answer the name of the entry, or
nil for the end of the directory stream.
Arguments:
- directoryPointer (ByteArray)"
| dirPointerOop dirStream ent entryName attributeArray resultArray haveEntry entry_len status |
<export: true>
<var: 'ent' type: #'struct dirent *'>
<var: 'dirStream' type: #'osdir *'>
<var: 'haveEntry' type: #int>
dirPointerOop := interpreterProxy stackValue: 0.
dirStream := self pointerFrom: dirPointerOop.
dirStream ifNil:
[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
haveEntry := 0.
[ent := self readdir: dirStream dp.
self cCode: 'if (ent == NULL ||
((!! (ent->d_name[0] == ''.'' && strlen(ent->d_name) == 1)) && strcmp(ent->d_name, "..")))
haveEntry = 1'.
haveEntry = 0] whileTrue.
ent ifNil: "This is the normal case for the end of a directory stream,
although it may indicate other error conditions for which errno would be updated.
Assume the normal case here."
[^interpreterProxy pop: 2 thenPush: interpreterProxy nilObject].
entryName := self unixPathToOop: ent d_name.
"Build the path name (append the entry name to the path name)"
entry_len := self strlen: ent d_name.
[dirStream path_len + entry_len > (#PATH_MAX - 1)] ifTrue:
[^interpreterProxy primitiveFailForOSError: self stringTooLong].
+ self memcpy: dirStream path_file _: ent d_name _: entry_len.
- self mem: dirStream path_file cp: ent d_name y: entry_len.
dirStream path_file at: entry_len put: 0.
status := self fileToAttributeArray: dirStream path mask: 1 array: (self addressOf: attributeArray put: [:val| attributeArray := val]).
"If the stat() fails, still return the filename, just no attributes"
status ~= 0 ifTrue: [attributeArray := interpreterProxy nilObject].
self remapOop: #(entryName attributeArray)
in: [resultArray := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 2].
resultArray ifNil:
[^interpreterProxy primitiveFailFor: PrimErrNoMemory].
interpreterProxy
storePointer: 0 ofObject: resultArray withValue: entryName;
storePointer: 1 ofObject: resultArray withValue: attributeArray;
pop: 2 thenPush: resultArray!
Item was changed:
----- Method: FileAttributesPlugin>>stringFromCString: (in category 'private') -----
stringFromCString: aCString
"Answer a new String copied from a null-terminated C string.
Caution: This may invoke the garbage collector."
| len newString |
<var: 'aCString' type: #'const char *'>
len := self strlen: aCString.
newString := interpreterProxy
instantiateClass: interpreterProxy classString
indexableSize: len.
newString ifNil: [^interpreterProxy primitiveFailFor: PrimErrNoMemory].
+ self strncpy: (interpreterProxy arrayValueOf: newString)
+ _: aCString
+ _: len. "(char *)strncpy()"
- self st: (interpreterProxy arrayValueOf: newString)
- rn: aCString
- cpy: len. "(char *)strncpy()"
^ newString
!
More information about the Vm-dev
mailing list