Author: smash
Date: Tue Feb 13 08:42:21 2007
New Revision: 16967
Modified:
trunk/languages/tcl/runtime/builtin/file.pir
trunk/languages/tcl/t/cmd_file.t
Log:
[tcl]
* implement [file dirname], check RT#40722 for details
+ added very simple tests
Modified: trunk/languages/tcl/runtime/builtin/file.pir
==============================================================================
--- trunk/languages/tcl/runtime/builtin/file.pir (original)
+++ trunk/languages/tcl/runtime/builtin/file.pir Tue Feb 13 08:42:21 2007
@@ -378,10 +378,54 @@
tcl_error 'wrong # args: should be "file mtime name ?time?"'
.end
-# RT#40722: Stub for test parsing
+# RT#40722: needs windows OS testing
.sub 'dirname'
- .param pmc argv
- .return(0)
+ .param pmc argv
+
+ .local int argc
+ argc = elements argv
+ if argc != 1 goto bad_args
+
+ .local string filename
+ filename = argv[0]
+
+ .local string separator
+ $P0 = get_root_global ['_tcl'], 'slash'
+ separator = $P0
+
+ $S0 = substr filename, -1, 1
+ if $S0 != separator goto continue
+ chopn filename, 1
+
+ continue:
+ .local pmc array
+ array = split separator, filename
+ $S0 = pop array
+ unless $S0 == '' goto skip
+ push array, $S0
+
+ skip:
+ $I0 = elements array
+ if $I0 == 0 goto empty
+
+ $P1 = new .ResizableStringArray
+ loop:
+ unless array goto done
+ $S0 = shift array
+ if $S0 == '' goto loop
+ push $P1, $S0
+ goto loop
+
+ done:
+ $S0 = join separator, $P1
+ $S1 = concat separator, $S0 # guessing that this won't be needed in win
+ .return($S1)
+
+ empty:
+ .return('.')
+
+ bad_args:
+ tcl_error 'wrong # args: should be "file dirname name"'
.end
# RT#40723: Stub (unixy)
Modified: trunk/languages/tcl/t/cmd_file.t
==============================================================================
--- trunk/languages/tcl/t/cmd_file.t (original)
+++ trunk/languages/tcl/t/cmd_file.t Tue Feb 13 08:42:21 2007
@@ -8,7 +8,7 @@
source lib/test_more.tcl
-plan 9 ;# from outer space. (HAH!)
+plan 13 ;# from outer space. (HAH!)
# [file exists]
eval_is {file exists} \
@@ -42,3 +42,18 @@
is [file rootname f..i.le.ext] f..i.le \
{[file rootname] filename with dots and extension}
+
+# [file dirname]
+eval_is {file dirname} \
+ {wrong # args: should be "file dirname name"} \
+ {[file dirname] too few args}
+eval_is {file dirname foo bar} \
+ {wrong # args: should be "file dirname name"} \
+ {[file dirname] too many args}
+
+is [file dirname .] . \
+ {[file dirname] dirname dot}
+
+is [file dirname file.ext] . \
+ {[file dirname] dirname simple file}
+