Merge branch 'master' of git://factorcode.org/git/factor

db4
Slava Pestov 2008-11-14 00:45:25 -06:00
commit a6af48f812
21 changed files with 186 additions and 62 deletions

View File

@ -0,0 +1,6 @@
! Copyright (C) 2008 Your name.
! See http://factorcode.org/license.txt for BSD license.
USING: tools.test io.files.listing strings kernel ;
IN: io.files.listing.tests
[ ] [ "" directory. ] unit-test

View File

@ -0,0 +1,35 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays combinators io io.files kernel
math.parser sequences system vocabs.loader calendar ;
IN: io.files.listing
: ls-time ( timestamp -- string )
[ hour>> ] [ minute>> ] bi
[ number>string 2 CHAR: 0 pad-left ] bi@ ":" swap 3append ;
: ls-timestamp ( timestamp -- string )
[ month>> month-abbreviation ]
[ day>> number>string 2 CHAR: \s pad-left ]
[
dup year>> dup now year>> =
[ drop ls-time ] [ nip number>string ] if
5 CHAR: \s pad-left
] tri 3array " " join ;
: read>string ( ? -- string ) "r" "-" ? ; inline
: write>string ( ? -- string ) "w" "-" ? ; inline
: execute>string ( ? -- string ) "x" "-" ? ; inline
HOOK: (directory.) os ( path -- lines )
: directory. ( path -- )
[ (directory.) ] with-directory-files [ print ] each ;
{
{ [ os unix? ] [ "io.files.listing.unix" ] }
{ [ os windows? ] [ "io.files.listing.windows" ] }
} cond require

View File

@ -0,0 +1 @@
unportable

View File

@ -0,0 +1 @@
Doug Coleman

View File

@ -0,0 +1 @@
unportable

View File

@ -0,0 +1,43 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors combinators kernel system unicode.case
io.unix.files io.files.listing generalizations strings
arrays sequences io.files math.parser unix.groups unix.users ;
IN: io.files.listing.unix
: unix-execute>string ( str bools -- str' )
swap {
{ { t t } [ >lower ] }
{ { t f } [ >upper ] }
{ { f t } [ drop "x" ] }
[ 2drop "-" ]
} case ;
: permissions-string ( permissions -- str )
{
[ type>> file-type>ch 1string ]
[ user-read? read>string ]
[ user-write? write>string ]
[ [ uid? ] [ user-execute? ] bi 2array "s" unix-execute>string ]
[ group-read? read>string ]
[ group-write? write>string ]
[ [ gid? ] [ group-execute? ] bi 2array "s" unix-execute>string ]
[ other-read? read>string ]
[ other-write? write>string ]
[ [ sticky? ] [ other-execute? ] bi 2array "t" unix-execute>string ]
} cleave 10 narray concat ;
M: unix (directory.) ( path -- lines )
[ [
[
dup file-info
{
[ permissions-string ]
[ nlink>> number>string 3 CHAR: \s pad-left ]
! [ uid>> ]
! [ gid>> ]
[ size>> number>string 15 CHAR: \s pad-left ]
[ modified>> ls-timestamp ]
} cleave 4 narray swap suffix " " join
] map
] with-group-cache ] with-user-cache ;

View File

@ -0,0 +1 @@
Doug Coleman

View File

@ -0,0 +1 @@
unportable

View File

@ -0,0 +1,21 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors calendar.format combinators io.files
kernel math.parser sequences splitting system io.files.listing
generalizations ;
IN: io.files.listing.windows
: directory-or-size ( file-info -- str )
dup directory? [
drop "<DIR>" 20 CHAR: \s pad-right
] [
size>> number>string 20 CHAR: \s pad-left
] if ;
M: windows (directory.) ( entries -- lines )
[
dup file-info {
[ modified>> timestamp>ymdhms ]
[ directory-or-size ]
} cleave 2 narray swap suffix " " join
] map ;

View File

@ -172,6 +172,30 @@ M: unix (directory-entries) ( path -- seq )
PRIVATE> PRIVATE>
: ch>file-type ( ch -- type )
{
{ CHAR: b [ +block-device+ ] }
{ CHAR: c [ +character-device+ ] }
{ CHAR: d [ +directory+ ] }
{ CHAR: l [ +symbolic-link+ ] }
{ CHAR: s [ +socket+ ] }
{ CHAR: p [ +fifo+ ] }
{ CHAR: - [ +regular-file+ ] }
[ drop +unknown+ ]
} case ;
: file-type>ch ( type -- string )
{
{ +block-device+ [ CHAR: b ] }
{ +character-device+ [ CHAR: c ] }
{ +directory+ [ CHAR: d ] }
{ +symbolic-link+ [ CHAR: l ] }
{ +socket+ [ CHAR: s ] }
{ +fifo+ [ CHAR: p ] }
{ +regular-file+ [ CHAR: - ] }
[ drop CHAR: - ]
} case ;
: UID OCT: 0004000 ; inline : UID OCT: 0004000 ; inline
: GID OCT: 0002000 ; inline : GID OCT: 0002000 ; inline
: STICKY OCT: 0001000 ; inline : STICKY OCT: 0001000 ; inline

View File

@ -149,35 +149,39 @@ SYMBOLS: +read-only+ +hidden+ +system+
+sparse-file+ +reparse-point+ +compressed+ +offline+ +sparse-file+ +reparse-point+ +compressed+ +offline+
+not-content-indexed+ +encrypted+ ; +not-content-indexed+ +encrypted+ ;
: win32-file-attribute ( n attr symbol -- n ) TUPLE: windows-file-info < file-info attributes ;
>r dupd mask? r> swap [ , ] [ drop ] if ;
: win32-file-attribute ( n attr symbol -- )
rot mask? [ , ] [ drop ] if ;
: win32-file-attributes ( n -- seq ) : win32-file-attributes ( n -- seq )
[ [
FILE_ATTRIBUTE_READONLY +read-only+ win32-file-attribute {
FILE_ATTRIBUTE_HIDDEN +hidden+ win32-file-attribute [ +read-only+ FILE_ATTRIBUTE_READONLY win32-file-attribute ]
FILE_ATTRIBUTE_SYSTEM +system+ win32-file-attribute [ +hidden+ FILE_ATTRIBUTE_HIDDEN win32-file-attribute ]
FILE_ATTRIBUTE_DIRECTORY +directory+ win32-file-attribute [ +system+ FILE_ATTRIBUTE_SYSTEM win32-file-attribute ]
FILE_ATTRIBUTE_ARCHIVE +archive+ win32-file-attribute [ +directory+ FILE_ATTRIBUTE_DIRECTORY win32-file-attribute ]
FILE_ATTRIBUTE_DEVICE +device+ win32-file-attribute [ +archive+ FILE_ATTRIBUTE_ARCHIVE win32-file-attribute ]
FILE_ATTRIBUTE_NORMAL +normal+ win32-file-attribute [ +device+ FILE_ATTRIBUTE_DEVICE win32-file-attribute ]
FILE_ATTRIBUTE_TEMPORARY +temporary+ win32-file-attribute [ +normal+ FILE_ATTRIBUTE_NORMAL win32-file-attribute ]
FILE_ATTRIBUTE_SPARSE_FILE +sparse-file+ win32-file-attribute [ +temporary+ FILE_ATTRIBUTE_TEMPORARY win32-file-attribute ]
FILE_ATTRIBUTE_REPARSE_POINT +reparse-point+ win32-file-attribute [ +sparse-file+ FILE_ATTRIBUTE_SPARSE_FILE win32-file-attribute ]
FILE_ATTRIBUTE_COMPRESSED +compressed+ win32-file-attribute [ +reparse-point+ FILE_ATTRIBUTE_REPARSE_POINT win32-file-attribute ]
FILE_ATTRIBUTE_OFFLINE +offline+ win32-file-attribute [ +compressed+ FILE_ATTRIBUTE_COMPRESSED win32-file-attribute ]
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED +not-content-indexed+ win32-file-attribute [ +offline+ FILE_ATTRIBUTE_OFFLINE win32-file-attribute ]
FILE_ATTRIBUTE_ENCRYPTED +encrypted+ win32-file-attribute [ +not-content-indexed+ FILE_ATTRIBUTE_NOT_CONTENT_INDEXED win32-file-attribute ]
drop [ +encrypted+ FILE_ATTRIBUTE_ENCRYPTED win32-file-attribute ]
} cleave
] { } make ; ] { } make ;
: win32-file-type ( n -- symbol ) : win32-file-type ( n -- symbol )
FILE_ATTRIBUTE_DIRECTORY mask? +directory+ +regular-file+ ? ; FILE_ATTRIBUTE_DIRECTORY mask? +directory+ +regular-file+ ? ;
: WIN32_FIND_DATA>file-info ( WIN32_FIND_DATA -- file-info ) : WIN32_FIND_DATA>file-info ( WIN32_FIND_DATA -- file-info )
[ \ file-info new ] dip [ \ windows-file-info new ] dip
{ {
[ WIN32_FIND_DATA-dwFileAttributes win32-file-type >>type ] [ WIN32_FIND_DATA-dwFileAttributes win32-file-type >>type ]
[ WIN32_FIND_DATA-dwFileAttributes win32-file-attributes >>attributes ]
[ [
[ WIN32_FIND_DATA-nFileSizeLow ] [ WIN32_FIND_DATA-nFileSizeLow ]
[ WIN32_FIND_DATA-nFileSizeHigh ] bi >64bit >>size [ WIN32_FIND_DATA-nFileSizeHigh ] bi >64bit >>size
@ -196,9 +200,10 @@ SYMBOLS: +read-only+ +hidden+ +system+
] keep ; ] keep ;
: BY_HANDLE_FILE_INFORMATION>file-info ( HANDLE_FILE_INFORMATION -- file-info ) : BY_HANDLE_FILE_INFORMATION>file-info ( HANDLE_FILE_INFORMATION -- file-info )
[ \ file-info new ] dip [ \ windows-file-info new ] dip
{ {
[ BY_HANDLE_FILE_INFORMATION-dwFileAttributes win32-file-type >>type ] [ BY_HANDLE_FILE_INFORMATION-dwFileAttributes win32-file-type >>type ]
[ BY_HANDLE_FILE_INFORMATION-dwFileAttributes win32-file-attributes >>attributes ]
[ [
[ BY_HANDLE_FILE_INFORMATION-nFileSizeLow ] [ BY_HANDLE_FILE_INFORMATION-nFileSizeLow ]
[ BY_HANDLE_FILE_INFORMATION-nFileSizeHigh ] bi >64bit >>size [ BY_HANDLE_FILE_INFORMATION-nFileSizeHigh ] bi >64bit >>size

View File

@ -0,0 +1 @@
Doug Coleman

View File

@ -1,7 +1,7 @@
! Copyright (C) 2008 Doug Coleman. ! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: help.markup help.syntax kernel sequences strings ; USING: help.markup help.syntax kernel sequences strings ;
IN: hexdump IN: tools.hexdump
HELP: hexdump. HELP: hexdump.
{ $values { "seq" sequence } } { $values { "seq" sequence } }
@ -12,11 +12,11 @@ HELP: hexdump
{ $description "Converts a sequence to its hexadecimal and ASCII representation sixteen characters at a time. Lines are separated by a newline character." } { $description "Converts a sequence to its hexadecimal and ASCII representation sixteen characters at a time. Lines are separated by a newline character." }
{ $see-also hexdump. } ; { $see-also hexdump. } ;
ARTICLE: "hexdump" "Hexdump" ARTICLE: "tools.hexdump" "Hexdump"
"The " { $vocab-link "hexdump" } " vocabulary provides a traditional hexdump view of a sequence." $nl "The " { $vocab-link "tools.hexdump" } " vocabulary provides a traditional hexdump view of a sequence." $nl
"Write hexdump to string:" "Write hexdump to string:"
{ $subsection hexdump } { $subsection hexdump }
"Write the hexdump to the output stream:" "Write the hexdump to the output stream:"
{ $subsection hexdump. } ; { $subsection hexdump. } ;
ABOUT: "hexdump" ABOUT: "tools.hexdump"

View File

@ -1,5 +1,5 @@
IN: hexdump.tests USING: tools.hexdump kernel sequences tools.test ;
USING: hexdump kernel sequences tools.test ; IN: tools.hexdump.tests
[ t ] [ "" hexdump "Length: 0, 0h\n" = ] unit-test [ t ] [ "" hexdump "Length: 0, 0h\n" = ] unit-test
[ t ] [ "abcdefghijklmnopqrstuvwxyz" hexdump "Length: 26, 1ah\n00000000h: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop\n00000010h: 71 72 73 74 75 76 77 78 79 7a qrstuvwxyz\n" = ] unit-test [ t ] [ "abcdefghijklmnopqrstuvwxyz" hexdump "Length: 26, 1ah\n00000000h: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop\n00000010h: 71 72 73 74 75 76 77 78 79 7a qrstuvwxyz\n" = ] unit-test

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: arrays io io.streams.string kernel math math.parser USING: arrays io io.streams.string kernel math math.parser
namespaces sequences splitting grouping strings ascii ; namespaces sequences splitting grouping strings ascii ;
IN: hexdump IN: tools.hexdump
<PRIVATE <PRIVATE

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays classes.singleton combinators USING: accessors arrays classes.singleton combinators
continuations io io.encodings.binary io.encodings.utf8 continuations io io.encodings.binary io.encodings.utf8
io.files io.sockets kernel io.streams.duplex math io.files io.sockets kernel io.streams.duplex math ls
math.parser sequences splitting namespaces strings fry ftp ; math.parser sequences splitting namespaces strings fry ftp ;
IN: ftp.client IN: ftp.client

View File

@ -1,7 +1,7 @@
! Copyright (C) 2008 Doug Coleman. ! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs combinators io io.files kernel USING: accessors arrays assocs combinators io io.files kernel
math.parser sequences strings ; math.parser sequences strings ls ;
IN: ftp IN: ftp
SINGLETON: active SINGLETON: active
@ -32,35 +32,7 @@ TUPLE: ftp-response n strings parsed ;
over strings>> push ; over strings>> push ;
: ftp-send ( string -- ) write "\r\n" write flush ; : ftp-send ( string -- ) write "\r\n" write flush ;
: ftp-ipv4 1 ; inline : ftp-ipv4 1 ; inline
: ftp-ipv6 2 ; inline : ftp-ipv6 2 ; inline
: ch>type ( ch -- type ) : directory-list ( -- seq ) "" ls ;
{
{ CHAR: d [ +directory+ ] }
{ CHAR: l [ +symbolic-link+ ] }
{ CHAR: - [ +regular-file+ ] }
[ drop +unknown+ ]
} case ;
: type>ch ( type -- string )
{
{ +directory+ [ CHAR: d ] }
{ +symbolic-link+ [ CHAR: l ] }
{ +regular-file+ [ CHAR: - ] }
[ drop CHAR: - ]
} case ;
: file-info>string ( file-info name -- string )
[
[
[ type>> type>ch 1string ]
[ drop "rwx------" append ] bi
]
[ size>> number>string 15 CHAR: \s pad-left ] bi
] dip 3array " " join ;
: directory-list ( -- seq )
"" directory-files
[ [ link-info ] keep file-info>string ] map ;

View File

@ -6,12 +6,16 @@ io.encodings.utf8 io.files io.sockets kernel math.parser
namespaces make sequences ftp io.unix.launcher.parser namespaces make sequences ftp io.unix.launcher.parser
unicode.case splitting assocs classes io.servers.connection unicode.case splitting assocs classes io.servers.connection
destructors calendar io.timeouts io.streams.duplex threads destructors calendar io.timeouts io.streams.duplex threads
continuations math concurrency.promises byte-arrays sequences.lib continuations math concurrency.promises byte-arrays
hexdump ; io.backend sequences.lib tools.hexdump ;
IN: ftp.server IN: ftp.server
SYMBOL: client SYMBOL: client
: ftp-server-directory ( -- str )
\ ftp-server-directory get-global "resource:temp" or
normalize-path ;
TUPLE: ftp-command raw tokenized ; TUPLE: ftp-command raw tokenized ;
: <ftp-command> ( -- obj ) : <ftp-command> ( -- obj )
@ -238,10 +242,16 @@ M: ftp-put service-command ( stream obj -- )
! : handle-LPRT ( obj -- ) tokenized>> "," split ; ! : handle-LPRT ( obj -- ) tokenized>> "," split ;
ERROR: not-a-directory ; ERROR: not-a-directory ;
ERROR: no-permissions ;
: handle-CWD ( obj -- ) : handle-CWD ( obj -- )
[ [
tokenized>> second dup directory? [ tokenized>> second dup normalize-path
dup ftp-server-directory head? [
no-permissions
] unless
file-info directory? [
set-current-directory set-current-directory
250 "Directory successully changed." server-response 250 "Directory successully changed." server-response
] [ ] [
@ -256,6 +266,7 @@ ERROR: not-a-directory ;
: handle-client-loop ( -- ) : handle-client-loop ( -- )
<ftp-command> readln <ftp-command> readln
USE: prettyprint global [ dup . flush ] bind
[ >>raw ] [ >>raw ]
[ tokenize-command >>tokenized ] bi [ tokenize-command >>tokenized ] bi
dup tokenized>> first >upper { dup tokenized>> first >upper {
@ -313,7 +324,7 @@ TUPLE: ftp-server < threaded-server ;
M: ftp-server handle-client* ( server -- ) M: ftp-server handle-client* ( server -- )
drop drop
[ [
"" [ ftp-server-directory [
host-name <ftp-client> client set host-name <ftp-client> client set
send-banner handle-client-loop send-banner handle-client-loop
] with-directory ] with-directory
@ -323,6 +334,7 @@ M: ftp-server handle-client* ( server -- )
ftp-server new-threaded-server ftp-server new-threaded-server
swap >>insecure swap >>insecure
"ftp.server" >>name "ftp.server" >>name
5 minutes >>timeout
latin1 >>encoding ; latin1 >>encoding ;
: ftpd ( port -- ) : ftpd ( port -- )

View File

@ -1,6 +1,6 @@
USING: combinators io io.files io.streams.string kernel math USING: combinators io io.files io.streams.string kernel math
math.parser continuations namespaces pack prettyprint sequences math.parser continuations namespaces pack prettyprint sequences
strings system hexdump io.encodings.binary summary accessors strings system tools.hexdump io.encodings.binary summary accessors
io.backend symbols byte-arrays ; io.backend symbols byte-arrays ;
IN: tar IN: tar