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 ! |
Free forum by Nabble | Edit this page |