Filename.st
changeset 14220 2a3457b016be
parent 14218 c87235c8bc2b
child 14232 001979aa0214
--- a/Filename.st	Thu Jul 19 16:42:23 2012 +0200
+++ b/Filename.st	Thu Jul 19 16:42:26 2012 +0200
@@ -955,6 +955,74 @@
     "Modified: / 18.7.1998 / 22:53:24 / cg"
 !
 
+nameWithSpecialExpansions:aString
+    "return the nameString, expanding any OS specific macros. 
+     Here, a ~/ or ~user/ prefix is expanded to the users home dir (as in csh)"
+
+    |dir user cutIdx idx userInfo|
+
+    (aString startsWith:'~') ifFalse:[
+        ^ aString.
+    ].
+
+    aString size > 1 ifTrue:[
+        idx := aString indexOf:self separator.
+        idx == 0 ifTrue:[
+            "aString is '~user'"
+            user := aString copyFrom:2.
+            cutIdx := aString size + 1.
+        ] ifFalse:[
+            "aString is '~user/something'"
+            user := aString copyFrom:2 to:(idx - 1).
+            cutIdx := idx.
+        ].
+        user notEmpty ifTrue:[
+            userInfo := OperatingSystem userInfoOf:user.
+            userInfo notNil ifTrue:[
+                dir := userInfo at:#dir ifAbsent:nil.
+            ].
+            dir isNil ifTrue:[
+"/                 ('Filename [info]: unknown user: ' , user) infoPrintCR.
+                ^ aString
+            ].
+        ].
+    ].
+    dir isNil ifTrue:[
+        "aString is '~' or '~/'"
+        dir := OperatingSystem getHomeDirectory.
+        cutIdx := 2.
+    ].
+
+    ^ dir , (aString copyFrom:cutIdx)
+
+    "
+     Filename new nameWithSpecialExpansions:'~'      
+     Filename new nameWithSpecialExpansions:'~\work'  
+     Filename new nameWithSpecialExpansions:'~stefan'     
+     Filename new nameWithSpecialExpansions:'~stefan\work' 
+     Filename new nameWithSpecialExpansions:'~foo'    
+     Filename new nameWithSpecialExpansions:'~foo\bar' 
+    "
+
+    "
+     UnixFilename new nameWithSpecialExpansions:'~'      
+     UnixFilename new nameWithSpecialExpansions:'~/work'  
+     UnixFilename new nameWithSpecialExpansions:'~stefan'     
+     UnixFilename new nameWithSpecialExpansions:'~stefan/work' 
+     UnixFilename new nameWithSpecialExpansions:'~foo'    
+     UnixFilename new nameWithSpecialExpansions:'~foo/bar' 
+    "
+
+    "
+     PCFilename new nameWithSpecialExpansions:'~'      
+     PCFilename new nameWithSpecialExpansions:'~\work'   
+     PCFilename new nameWithSpecialExpansions:'~stefan'     
+     PCFilename new nameWithSpecialExpansions:'~stefan\work' 
+     PCFilename new nameWithSpecialExpansions:'~foo'    
+     PCFilename new nameWithSpecialExpansions:'~foo\bar' 
+    "
+!
+
 suggest:aFilenameString 
     "return a fileNamestring based on the argument, 
      which is legal on the current platform."
@@ -3883,7 +3951,7 @@
 setName:aString
     "set the filename"
 
-    nameString := self nameWithSpecialExpansions:aString.
+    nameString := aString.
 
     "Modified: / 21.7.1998 / 10:44:18 / cg"
 ! !
@@ -4072,74 +4140,6 @@
     "
 !
 
-nameWithSpecialExpansions:aString
-    "return the nameString, expanding any OS specific macros. 
-     Here, a ~/ or ~user/ prefix is expanded to the users home dir (as in csh)"
-
-    |dir user cutIdx idx userInfo|
-
-    (aString startsWith:'~') ifFalse:[
-        ^ aString.
-    ].
-
-    aString size > 1 ifTrue:[
-        idx := aString indexOf:self separator.
-        idx == 0 ifTrue:[
-            "aString is '~user'"
-            user := aString copyFrom:2.
-            cutIdx := aString size + 1.
-        ] ifFalse:[
-            "aString is '~user/something'"
-            user := aString copyFrom:2 to:(idx - 1).
-            cutIdx := idx.
-        ].
-        user notEmpty ifTrue:[
-            userInfo := OperatingSystem userInfoOf:user.
-            userInfo notNil ifTrue:[
-                dir := userInfo at:#dir ifAbsent:nil.
-            ].
-            dir isNil ifTrue:[
-"/                 ('Filename [info]: unknown user: ' , user) infoPrintCR.
-                ^ aString
-            ].
-        ].
-    ].
-    dir isNil ifTrue:[
-        "aString is '~' or '~/'"
-        dir := OperatingSystem getHomeDirectory.
-        cutIdx := 2.
-    ].
-
-    ^ dir , (aString copyFrom:cutIdx)
-
-    "
-     Filename new nameWithSpecialExpansions:'~'      
-     Filename new nameWithSpecialExpansions:'~\work'  
-     Filename new nameWithSpecialExpansions:'~stefan'     
-     Filename new nameWithSpecialExpansions:'~stefan\work' 
-     Filename new nameWithSpecialExpansions:'~foo'    
-     Filename new nameWithSpecialExpansions:'~foo\bar' 
-    "
-
-    "
-     UnixFilename new nameWithSpecialExpansions:'~'      
-     UnixFilename new nameWithSpecialExpansions:'~/work'  
-     UnixFilename new nameWithSpecialExpansions:'~stefan'     
-     UnixFilename new nameWithSpecialExpansions:'~stefan/work' 
-     UnixFilename new nameWithSpecialExpansions:'~foo'    
-     UnixFilename new nameWithSpecialExpansions:'~foo/bar' 
-    "
-
-    "
-     PCFilename new nameWithSpecialExpansions:'~'      
-     PCFilename new nameWithSpecialExpansions:'~\work'   
-     PCFilename new nameWithSpecialExpansions:'~stefan'     
-     PCFilename new nameWithSpecialExpansions:'~stefan\work' 
-     PCFilename new nameWithSpecialExpansions:'~foo'    
-     PCFilename new nameWithSpecialExpansions:'~foo\bar' 
-    "
-!
-
 separator
     "return the directory-separator character"
 
@@ -4158,7 +4158,7 @@
 
     |newName|
 
-    newName := self nameWithSpecialExpansions:nameString.
+    newName := self class nameWithSpecialExpansions:nameString.
     newName ~= nameString ifTrue:[
         ^ newName asFilename.
     ].
@@ -4540,7 +4540,7 @@
     caseless := self class isCaseSensitive not.
     matching := OrderedCollection new.
 
-    nm := self nameWithSpecialExpansions:nameString.
+    nm := self class nameWithSpecialExpansions:nameString.
     nm := self class canonicalize:nm.
 
     sepString := self class separatorString.
@@ -4718,11 +4718,12 @@
     "return true, if the receiver represents an absolute pathname
      (in contrast to one relative to the current directory)."
 
-    (nameString startsWith:self class separator) ifTrue:[^ true].
+    ((nameString startsWith:self class separator) or:[nameString startsWith:'~']) ifTrue:[^ true].
     ^ self isVolumeAbsolute
 
     "
-     '/foo/bar' asFilename isAbsolute   
+     '/foo/bar' asFilename isAbsolute 
+     '~/bla' asFilename isAbsolute
      '..' asFilename isAbsolute         
      '..' asAbsoluteFilename isAbsolute         
      'source/SBrowser.st' asFilename isAbsolute  
@@ -4892,7 +4893,7 @@
 "/            ^ nameString
 "/        ]
 "/    ].
-    ^ OperatingSystem pathNameOf:nameString.
+    ^ OperatingSystem pathNameOf:(self class nameWithSpecialExpansions:nameString).
 
     "
      '/foo/bar' asFilename pathName  
@@ -4901,6 +4902,7 @@
      '../..' asFilename name           
      '/tmp/../usr' asFilename pathName   
      '/././usr' asFilename pathName     
+     '~/..' asFilename pathName     
     "
 
     "Modified: 27.4.1996 / 18:19:52 / cg"
@@ -5535,7 +5537,11 @@
     "internal - return the OS's name for the receiver to
      access it as a file."
 
-    ^ nameString
+    (nameString startsWith:'~') ifFalse:[
+        ^ nameString.
+    ].
+
+    ^ self class nameWithSpecialExpansions:nameString. 
 ! !
 
 !Filename methodsFor:'suffixes'!
@@ -5882,11 +5888,11 @@
 !Filename class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Filename.st,v 1.375 2012-07-19 13:47:39 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Filename.st,v 1.376 2012-07-19 14:42:26 stefan Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/Filename.st,v 1.375 2012-07-19 13:47:39 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Filename.st,v 1.376 2012-07-19 14:42:26 stefan Exp $'
 ! !
 
 Filename initialize!