Merge remote-tracking branch 'origin/master' into modern-harvey3

modern-harvey3
Doug Coleman 2019-04-07 10:26:07 -05:00
commit 08a09f70ff
78 changed files with 1652 additions and 308 deletions

View File

@ -31,6 +31,8 @@ addons:
- cmake - cmake
- libaio-dev - libaio-dev
- libsnappy-dev - libsnappy-dev
- libgtk2.0-dev
- gtk2-engines-pixbuf
before_install: before_install:
- uname -s - uname -s
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./build.sh deps-macosx ; else ./build.sh deps-apt-get ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./build.sh deps-macosx ; else ./build.sh deps-apt-get ; fi

View File

@ -5,9 +5,20 @@ ifdef CONFIG
DEBUG ?= 0 DEBUG ?= 0
REPRODUCIBLE ?= 0 REPRODUCIBLE ?= 0
# gmake's default CXX is g++, we prefer c++
SHELL_CXX = $(shell printenv CXX)
ifeq ($(SHELL_CXX),)
CXX=c++
else
CXX=$(SHELL_CXX)
endif
XCODE_PATH ?= /Applications/Xcode.app
MACOSX_SDK ?= MacOSX10.13.sdk
include $(CONFIG) include $(CONFIG)
CFLAGS = -Wall \ CFLAGS += -Wall \
-pedantic \ -pedantic \
-DFACTOR_VERSION="$(VERSION)" \ -DFACTOR_VERSION="$(VERSION)" \
-DFACTOR_GIT_LABEL="$(GIT_LABEL)" \ -DFACTOR_GIT_LABEL="$(GIT_LABEL)" \

View File

@ -1,4 +1,4 @@
Copyright (c) 2018, Slava Pestov, et al. Copyright (c) 2019, Slava Pestov, et al.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View File

@ -34,8 +34,8 @@ To check out Factor:
To build the latest complete Factor system from git, either use the To build the latest complete Factor system from git, either use the
build script: build script:
* Windows: `build.cmd`
* Unix: `./build.sh update` * Unix: `./build.sh update`
* Windows: `build.cmd`
or download the correct boot image for your system from or download the correct boot image for your system from
http://downloads.factorcode.org/images/master/, put it in the factor http://downloads.factorcode.org/images/master/, put it in the factor

View File

@ -1,5 +1,7 @@
USING: base64 io.encodings.ascii io.encodings.string kernel USING: base64 byte-arrays io.encodings.ascii io.encodings.string
sequences splitting strings tools.test ; kernel sequences splitting strings tools.test ;
{ t } [ 256 <iota> >byte-array dup >base64 base64> = ] unit-test
{ "abcdefghijklmnopqrstuvwxyz" } [ "abcdefghijklmnopqrstuvwxyz" ascii encode >base64 base64> ascii decode { "abcdefghijklmnopqrstuvwxyz" } [ "abcdefghijklmnopqrstuvwxyz" ascii encode >base64 base64> ascii decode
] unit-test ] unit-test
@ -39,3 +41,9 @@ sequences splitting strings tools.test ;
"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY" "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY"
"." split [ base64> ] map "." split [ base64> ] map
] unit-test ] unit-test
{ "01a+b/cd" } [ "\xd3V\xbeo\xf7\x1d" >base64 "" like ] unit-test
{ "\xd3V\xbeo\xf7\x1d" } [ "01a+b/cd" base64> "" like ] unit-test
{ "01a-b_cd" } [ "\xd3V\xbeo\xf7\x1d" >urlsafe-base64 "" like ] unit-test
{ "\xd3V\xbeo\xf7\x1d" } [ "01a-b_cd" urlsafe-base64> "" like ] unit-test

View File

@ -1,8 +1,8 @@
! Copyright (C) 2008 Doug Coleman, Daniel Ehrenberg. ! Copyright (C) 2008 Doug Coleman, Daniel Ehrenberg.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: arrays combinators fry io io.binary io.encodings.binary USING: arrays assocs byte-arrays combinators fry io io.binary
io.streams.byte-array kernel literals math namespaces sbufs io.encodings.binary io.streams.byte-array kernel literals math
sequences ; namespaces sbufs sequences ;
IN: base64 IN: base64
ERROR: malformed-base64 ; ERROR: malformed-base64 ;
@ -10,8 +10,10 @@ ERROR: malformed-base64 ;
<PRIVATE <PRIVATE
<< <<
CONSTANT: alphabet CONSTANT: alphabet $[
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
>byte-array
]
: alphabet-inverse ( alphabet -- seq ) : alphabet-inverse ( alphabet -- seq )
dup supremum 1 + f <array> [ dup supremum 1 + f <array> [
@ -100,3 +102,21 @@ PRIVATE>
: >base64-lines ( seq -- base64 ) : >base64-lines ( seq -- base64 )
binary [ binary [ encode-base64-lines ] with-byte-reader ] with-byte-writer ; binary [ binary [ encode-base64-lines ] with-byte-reader ] with-byte-writer ;
: >urlsafe-base64 ( seq -- base64 )
>base64 H{
{ ch'+ ch'- }
{ ch'/ ch'_ }
} substitute ;
: urlsafe-base64> ( base64 -- seq )
H{
{ ch'- ch'+ }
{ ch'_ ch'/ }
} substitute base64> ;
: >urlsafe-base64-lines ( seq -- base64 )
>base64-lines H{
{ ch'+ ch'- }
{ ch'/ ch'_ }
} substitute ;

View File

@ -1 +1 @@
Base64 encoding/decoding Base64 encoding/decoding (RFC 3548)

View File

@ -7,10 +7,10 @@ unicode multiline ;
IN: globs IN: globs
: not-path-separator ( -- sep ) : not-path-separator ( -- sep )
os windows? R/ [^\\/\\]/ R/ [^\\/]/ ? ; foldable os windows? R/ [^\/\\]/ R/ [^\/]/ ? ; foldable
: wild-path-separator ( -- sep ) : wild-path-separator ( -- sep )
os windows? R/ [^\\/\\][\\/\\]|[^\\/\\]/ R/ [^\\/][\\/]|[^\\/]/ ? ; foldable os windows? R/ [^\/\\][\/\\]|[^\/\\]/ R/ [^\/][\/]|[^\/]/ ? ; foldable
EBNF: <glob> [=[ EBNF: <glob> [=[

View File

@ -13,3 +13,16 @@ USING: io.crlf tools.test io.streams.string io ;
{ "foo\nbar" } [ "foo\n\rbar" crlf>lf ] unit-test { "foo\nbar" } [ "foo\n\rbar" crlf>lf ] unit-test
{ "foo\r\nbar" } [ "foo\nbar" lf>crlf ] unit-test { "foo\r\nbar" } [ "foo\nbar" lf>crlf ] unit-test
{ f } [ "" [ read1-ignoring-crlf ] with-string-reader ] unit-test
{ ch'a } [ "a" [ read1-ignoring-crlf ] with-string-reader ] unit-test
{ ch'b } [ "\nb" [ read1-ignoring-crlf ] with-string-reader ] unit-test
{ ch'c } [ "\r\nc" [ read1-ignoring-crlf ] with-string-reader ] unit-test
{ f } [ "" [ 5 read-ignoring-crlf ] with-string-reader ] unit-test
{ "a" } [ "a" [ 5 read-ignoring-crlf ] with-string-reader ] unit-test
{ "ab" } [ "a\nb" [ 5 read-ignoring-crlf ] with-string-reader ] unit-test
{ "abc" } [ "a\nb\r\nc" [ 5 read-ignoring-crlf ] with-string-reader ] unit-test
{ "abcd" } [ "a\nb\r\ncd" [ 5 read-ignoring-crlf ] with-string-reader ] unit-test
{ "abcde" } [ "a\nb\r\ncd\r\ne" [ 5 read-ignoring-crlf ] with-string-reader ] unit-test
{ "abcde" } [ "a\nb\r\ncd\r\ne\nfghi" [ 5 read-ignoring-crlf ] with-string-reader ] unit-test

View File

@ -1,21 +1,62 @@
! Copyright (C) 2009 Daniel Ehrenberg, Slava Pestov ! Copyright (C) 2009 Daniel Ehrenberg, Slava Pestov
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: io kernel sequences splitting ; USING: byte-vectors io io.private kernel locals math namespaces
sbufs sequences splitting ;
IN: io.crlf IN: io.crlf
: crlf ( -- ) : crlf ( -- )
"\r\n" write ; "\r\n" write ;
:: stream-read-crlf ( stream -- seq )
"\r" stream stream-read-until [
ch'\r assert= stream stream-read1 ch'\n assert=
] [ f like ] if* ;
: read-crlf ( -- seq ) : read-crlf ( -- seq )
"\r" read-until input-stream get stream-read-crlf ;
[ ch'\r assert= read1 ch'\n assert= ] [ f like ] if* ;
:: stream-read-?crlf ( stream -- seq )
"\r\n" stream stream-read-until [
ch'\r = [ stream stream-read1 ch'\n assert= ] when
] [ f like ] if* ;
: read-?crlf ( -- seq ) : read-?crlf ( -- seq )
"\r\n" read-until input-stream get stream-read-?crlf ;
[ ch'\r = [ read1 ch'\n assert= ] when ] [ f like ] if* ;
: crlf>lf ( str -- str' ) : crlf>lf ( str -- str' )
ch'\r swap remove ; ch'\r swap remove ;
: lf>crlf ( str -- str' ) : lf>crlf ( str -- str' )
"\n" split "\r\n" join ; "\n" split "\r\n" join ;
:: stream-read1-ignoring-crlf ( stream -- ch )
stream stream-read1 dup "\r\n" member?
[ drop stream stream-read1-ignoring-crlf ] when ; inline recursive
: read1-ignoring-crlf ( -- ch )
input-stream get stream-read1-ignoring-crlf ;
: push-ignoring-crlf ( elt seq -- )
[ "\r\n" member? not ] swap push-if ;
: push-all-ignoring-crlf ( src dst -- )
[ push-ignoring-crlf ] curry each ;
:: stream-read-ignoring-crlf ( n stream -- seq/f )
n stream stream-read dup [
dup [ "\r\n" member? ] any? [
stream stream-element-type +byte+ =
[ n <byte-vector> ] [ n <sbuf> ] if :> accum
accum push-all-ignoring-crlf
[ accum length n < and ] [
n accum length - stream stream-read
[ accum push-all-ignoring-crlf ] keep
] do while
accum stream stream-exemplar like
] when
] when ;
: read-ignoring-crlf ( n -- seq/f )
input-stream get stream-read-ignoring-crlf ;

View File

@ -1,7 +1,7 @@
USING: combinators fry io.directories io.directories.hierarchy USING: combinators fry grouping io.directories
io.directories.search io.files.unique io.pathnames kernel io.directories.hierarchy io.directories.search io.files.unique
namespaces sequences sorting splitting strings system io.pathnames kernel math namespaces sequences sorting splitting
tools.test ; splitting.monotonic strings tools.test ;
{ t } [ { t } [
[ [
@ -47,49 +47,42 @@ tools.test ;
[ drop f ] find-up-to-root [ drop f ] find-up-to-root
] unit-test ] unit-test
os linux? [ [
{ {
V{ 1 2 3 2 3 1 2 3 2 3 1 2 3 2 3 } "/a"
V{ 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 } "/a/a"
"/a/a/a"
"/a/b"
"/a/b/a"
"/b"
"/b/a"
"/b/a/a"
"/b/b"
"/b/b/a"
"/c"
"/c/a"
"/c/a/a"
"/c/b"
"/c/b/a"
}
{
"/a"
"/b"
"/c"
"/a/a"
"/a/b"
"/b/a"
"/b/b"
"/c/a"
"/c/b"
"/a/a/a"
"/a/b/a"
"/b/a/a"
"/b/b/a"
"/c/a/a"
"/c/b/a"
} }
] [ ] [
{
V{
"/a"
"/a/a"
"/a/a/a"
"/a/b"
"/a/b/a"
"/b"
"/b/a"
"/b/a/a"
"/b/b"
"/b/b/a"
"/c"
"/c/a"
"/c/a/a"
"/c/b"
"/c/b/a"
}
V{
"/a"
"/b"
"/c"
"/a/a"
"/a/b"
"/b/a"
"/b/b"
"/c/a"
"/c/b"
"/a/a/a"
"/a/b/a"
"/b/a/a"
"/b/b/a"
"/c/a/a"
"/c/b/a"
}
}
] if [
[ [
"a" make-directory "a" make-directory
"a/a" make-directory "a/a" make-directory
@ -110,16 +103,21 @@ os linux? [
+depth-first+ traversal-method [ +depth-first+ traversal-method [
"." recursive-directory-files "." recursive-directory-files
current-directory get '[ _ ?head drop ] map current-directory get '[ _ ?head drop ] map
! preserve file traversal order, but sort
! alphabetically for cross-platform testing
dup length 3 / group natural-sort
[ natural-sort ] map concat
] with-variable ] with-variable
+breadth-first+ traversal-method [ +breadth-first+ traversal-method [
"." recursive-directory-files "." recursive-directory-files
current-directory get '[ _ ?head drop ] map current-directory get '[ _ ?head drop ] map
] with-variable
! Linux doesn't return alphabetic ordering ! preserve file traversal order, but sort
os linux? [ ! alphabetically for cross-platform testing
[ [ path-components length ] map ] bi@ [ [ length ] bi@ = ] monotonic-split
] when [ natural-sort ] map concat
] with-variable
] with-test-directory ] with-test-directory
] unit-test ] unit-test

View File

@ -346,9 +346,9 @@ PRIVATE>
M: windows canonicalize-path M: windows canonicalize-path
remove-unicode-prefix canonicalize-path* ; remove-unicode-prefix canonicalize-path* ;
M: object root-path remove-unicode-prefix root-path* ; M: windows root-path remove-unicode-prefix root-path* ;
M: object relative-path remove-unicode-prefix relative-path* ; M: windows relative-path remove-unicode-prefix relative-path* ;
M: windows normalize-path ( string -- string' ) M: windows normalize-path ( string -- string' )
dup unc-path? [ dup unc-path? [

View File

@ -107,7 +107,7 @@ M: ipv4 empty-sockaddr drop sockaddr-in <struct> ;
sockaddr-in <struct> sockaddr-in <struct>
AF_INET >>family AF_INET >>family
swap swap
port>> htons >>port ; inline port>> 0 or htons >>port ; inline
M: ipv4 make-sockaddr ( inet -- sockaddr ) M: ipv4 make-sockaddr ( inet -- sockaddr )
[ make-sockaddr-part ] [ make-sockaddr-part ]
@ -122,7 +122,7 @@ M: ipv4 make-sockaddr-outgoing ( inet -- sockaddr )
M: ipv4 parse-sockaddr ( sockaddr-in addrspec -- newaddrspec ) M: ipv4 parse-sockaddr ( sockaddr-in addrspec -- newaddrspec )
[ addr>> uint <ref> ] dip inet-ntop <ipv4> ; [ addr>> uint <ref> ] dip inet-ntop <ipv4> ;
TUPLE: inet4 < ipv4 { port integer read-only } ; TUPLE: inet4 < ipv4 { port maybe{ integer } read-only } ;
: <inet4> ( host port -- inet4 ) : <inet4> ( host port -- inet4 )
over check-ipv4 inet4 boa ; over check-ipv4 inet4 boa ;
@ -179,7 +179,7 @@ M: ipv6 empty-sockaddr drop sockaddr-in6 <struct> ;
sockaddr-in6 <struct> sockaddr-in6 <struct>
AF_INET6 >>family AF_INET6 >>family
swap swap
port>> htons >>port ; inline port>> 0 or htons >>port ; inline
M: ipv6 make-sockaddr ( inet -- sockaddr ) M: ipv6 make-sockaddr ( inet -- sockaddr )
[ make-sockaddr-in6-part ] [ make-sockaddr-in6-part ]
@ -201,7 +201,7 @@ M: ipv6 present
[ host>> ] [ scope-id>> ] bi [ host>> ] [ scope-id>> ] bi
[ number>string "%" glue ] unless-zero ; [ number>string "%" glue ] unless-zero ;
TUPLE: inet6 < ipv6 { port integer read-only } ; TUPLE: inet6 < ipv6 { port maybe{ integer } read-only } ;
: <inet6> ( host port -- inet6 ) : <inet6> ( host port -- inet6 )
[ dup check-ipv6 0 ] dip inet6 boa ; [ dup check-ipv6 0 ] dip inet6 boa ;

View File

@ -16,9 +16,6 @@ TUPLE: delay < model model timeout timer ;
[ add-dependency ] keep ; [ add-dependency ] keep ;
M: delay model-changed M: delay model-changed
! BUG: timer can't be "restart-timer" inside of its quotation? nip timer>> restart-timer ;
! nip timer>> restart-timer ;
nip timer>> [ stop-timer ] [ start-timer ] bi ;
M: delay model-activated update-delay-model ; M: delay model-activated update-delay-model ;

View File

@ -113,10 +113,10 @@ ARTICLE: "prettyprint-literal" "Literal prettyprinting protocol"
"TUPLE: rect w h ;" "TUPLE: rect w h ;"
"" ""
"SYNTAX: RECT[" "SYNTAX: RECT["
" scan-word" " scan-number"
" scan-word \\ * assert=" " scan-token \"*\" assert="
" scan-word" " scan-number"
" scan-word \\ ] assert=" " scan-token \"]\" assert="
" <rect> suffix! ;" " <rect> suffix! ;"
} }
"An example literal might be:" "An example literal might be:"
@ -126,7 +126,7 @@ ARTICLE: "prettyprint-literal" "Literal prettyprinting protocol"
"However, we can define three methods easily enough:" "However, we can define three methods easily enough:"
{ $code { $code
"M: rect pprint-delims drop \\ RECT[ \\ ] ;" "M: rect pprint-delims drop \\ RECT[ \\ ] ;"
"M: rect >pprint-sequence dup rect-w \\ * rot rect-h 3array ;" "M: rect >pprint-sequence dup w>> \\ * rot h>> 3array ;"
"M: rect pprint* pprint-object ;" "M: rect pprint* pprint-object ;"
} }
"Now, it will be printed in a custom way:" "Now, it will be printed in a custom way:"

View File

@ -3,7 +3,8 @@
USING: accessors arrays assocs combinators USING: accessors arrays assocs combinators
combinators.short-circuit interval-maps kernel locals combinators.short-circuit interval-maps kernel locals
math.parser memoize multiline peg.ebnf regexp.ast regexp.classes math.parser memoize multiline peg.ebnf regexp.ast regexp.classes
sequences sets splitting strings unicode unicode.data unicode.script ; sequences sets splitting strings unicode unicode.data
unicode.script ;
IN: regexp.parser IN: regexp.parser
: allowed-char? ( ch -- ? ) : allowed-char? ( ch -- ? )
@ -70,12 +71,15 @@ MEMO: simple-category-table ( -- table )
: lookup-escape ( char -- ast ) : lookup-escape ( char -- ast )
{ {
{ ch't [ ch'\t ] }
{ ch'n [ ch'\n ] }
{ ch'r [ ch'\r ] }
{ ch'f [ 0xc ] }
{ ch'a [ 0x7 ] } { ch'a [ 0x7 ] }
{ ch'e [ 0x1b ] } { ch'e [ 0x1b ] }
{ ch'f [ 0xc ] }
! { ch'f [ ch'\f ] }
{ ch'n [ ch'\n ] }
{ ch'r [ ch'\r ] }
{ ch't [ ch'\t ] }
{ ch'v [ ch'\v ] }
{ ch'0 [ ch'\0 ] }
{ ch'\\ [ ch'\\ ] } { ch'\\ [ ch'\\ ] }
{ ch'w [ c-identifier-class <primitive-class> ] } { ch'w [ c-identifier-class <primitive-class> ] }

View File

@ -7,7 +7,7 @@ IN: regexp.prettyprint
M: regexp pprint* M: regexp pprint*
[ [
[ [
[ raw>> "\\/" "\\\\/" replace "R/ " % % "/" % ] [ raw>> "/" "\\/" replace "R/ " % % "/" % ]
[ options>> options>string % ] bi [ options>> options>string % ] bi
] "" make ] "" make
] keep present-text ; ] keep present-text ;

View File

@ -49,6 +49,9 @@ IN: regexp.tests
{ t } [ "a" ".+" <regexp> matches? ] unit-test { t } [ "a" ".+" <regexp> matches? ] unit-test
{ t } [ "ab" ".+" <regexp> matches? ] unit-test { t } [ "ab" ".+" <regexp> matches? ] unit-test
{ t } [ "\0" "[\\0]" <regexp> matches? ] unit-test
{ f } [ "0" "[\\0]" <regexp> matches? ] unit-test
{ t } [ " " "[\\s]" <regexp> matches? ] unit-test { t } [ " " "[\\s]" <regexp> matches? ] unit-test
{ f } [ "a" "[\\s]" <regexp> matches? ] unit-test { f } [ "a" "[\\s]" <regexp> matches? ] unit-test
{ f } [ " " "[\\S]" <regexp> matches? ] unit-test { f } [ " " "[\\S]" <regexp> matches? ] unit-test
@ -335,6 +338,10 @@ unit-test
{ "XhXXlXlXoX XwXoXrXlXdX" } [ "hello world" R/ e*/ "X" re-replace ] unit-test { "XhXXlXlXoX XwXoXrXlXdX" } [ "hello world" R/ e*/ "X" re-replace ] unit-test
{ "-- title --" } [ "== title ==" R/ =/ "-" re-replace ] unit-test { "-- title --" } [ "== title ==" R/ =/ "-" re-replace ] unit-test
{ "abc" } [ "a/ \\bc" "/.*\\" <regexp> "" re-replace ] unit-test
{ "ac" } [ "a/ \\bc" R/ \/.*\\./ "" re-replace ] unit-test
{ "abc" } [ "a/ \\bc" R/ \/.*\\/ "" re-replace ] unit-test
{ "" } [ "ab" "a(?!b)" <regexp> first-match >string ] unit-test { "" } [ "ab" "a(?!b)" <regexp> first-match >string ] unit-test
{ "a" } [ "ac" "a(?!b)" <regexp> first-match >string ] unit-test { "a" } [ "ac" "a(?!b)" <regexp> first-match >string ] unit-test
{ t } [ "fxxbar" ".{3}(?!foo)bar" <regexp> matches? ] unit-test { t } [ "fxxbar" ".{3}(?!foo)bar" <regexp> matches? ] unit-test

View File

@ -201,10 +201,11 @@ PRIVATE>
: take-until ( lexer -- string ) : take-until ( lexer -- string )
dup skip-blank [ dup skip-blank [
dupd [ dupd [
[ ch'/ -rot index-from ] keep [ [ "\\/" member? ] find-from ] keep swap [
over [ "Unterminated regexp" throw ] unless ch'\ = [ [ 2 + ] dip t ] [ f ] if
2dup [ 1 - ] dip nth ch'\\ = ] [
[ [ [ 1 + ] dip ] when ] keep "Unterminated regexp" throw
] if*
] loop over [ subseq ] dip 1 + ] loop over [ subseq ] dip 1 +
] change-lexer-column ; ] change-lexer-column ;

View File

@ -1,6 +1,6 @@
! Copyright (C) 2018 Doug Coleman. ! Copyright (C) 2018 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: base85 combinators command-line escape-strings fry USING: base91 combinators command-line escape-strings fry
io.backend io.directories io.directories.search io.backend io.directories io.directories.search
io.encodings.binary io.encodings.utf8 io.files io.files.info io.encodings.binary io.encodings.utf8 io.files io.files.info
io.pathnames kernel locals math namespaces sequences io.pathnames kernel locals math namespaces sequences
@ -28,9 +28,9 @@ IN: tools.directory-to-file
{ [ dup file-info directory? ] [ directory-repr ] } { [ dup file-info directory? ] [ directory-repr ] }
{ [ dup file-is-text? ] [ dup utf8 file-contents escape-string file-repr ] } { [ dup file-is-text? ] [ dup utf8 file-contents escape-string file-repr ] }
[ [
dup binary file-contents >base85 dup binary file-contents >base91
"" like escape-string "" like escape-string
"base85" prepend file-repr "base91" prepend file-repr
] ]
} cond } cond
] map ] map

View File

@ -1,6 +1,6 @@
! Copyright (C) 2018 Doug Coleman. ! Copyright (C) 2018 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: base85 combinators command-line fry io.directories USING: base91 combinators command-line fry io.directories
io.encodings.binary io.encodings.utf8 io.files io.pathnames io.encodings.binary io.encodings.utf8 io.files io.pathnames
kernel modern modern.out namespaces sequences splitting strings ; kernel modern modern.out namespaces sequences splitting strings ;
IN: tools.file-to-directory IN: tools.file-to-directory
@ -18,8 +18,8 @@ ERROR: expected-modern-path got ;
[ [
second first2 second first2
[ second >string ] [ [ second >string ] [
first3 nip swap "base85" head? [ first3 nip swap "base91" head? [
base85> binary base91> binary
] [ ] [
utf8 utf8
] if ] if

View File

@ -149,7 +149,7 @@ M: word (print-input)
[ interactor-yield ] [ interactor-finish ] bi ; [ interactor-yield ] [ interactor-finish ] bi ;
M: interactor stream-readln M: interactor stream-readln
interactor-read dup [ first ] when ; interactor-read ?first ;
: (call-listener) ( quot command listener -- ) : (call-listener) ( quot command listener -- )
input>> dup interactor-busy? [ 3drop ] [ input>> dup interactor-busy? [ 3drop ] [

View File

@ -65,7 +65,7 @@ IN: validators
v-regexp ; v-regexp ;
: v-url ( str -- str ) : v-url ( str -- str )
"url"R/ (?:ftp|http|https):\\/\\/\S+/ v-regexp ; "url" R/ (?:ftp|http|https):\/\/\S+/ v-regexp ;
: v-captcha ( str -- str ) : v-captcha ( str -- str )
dup empty? [ "must remain blank" throw ] unless ; dup empty? [ "must remain blank" throw ] unless ;

View File

@ -25,12 +25,26 @@ COM-INTERFACE: IDataObject IUnknown {0000010E-0000-0000-C000-000000000046}
HRESULT DUnadvise ( DWORD pdwConnection ) HRESULT DUnadvise ( DWORD pdwConnection )
HRESULT EnumDAdvise ( IEnumSTATDATA** ppenumAdvise ) ; HRESULT EnumDAdvise ( IEnumSTATDATA** ppenumAdvise ) ;
COM-INTERFACE: IDropSource IUnknown {00000121-0000-0000-C000-000000000046}
HRESULT GiveFeedback ( DWORD dwEffect )
HRESULT QueryContinueDrag ( BOOL fEscapePressed, DWORD grfKeyState ) ;
COM-INTERFACE: IDropTarget IUnknown {00000122-0000-0000-C000-000000000046} COM-INTERFACE: IDropTarget IUnknown {00000122-0000-0000-C000-000000000046}
HRESULT DragEnter ( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect ) HRESULT DragEnter ( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )
HRESULT DragOver ( DWORD grfKeyState, POINTL pt, DWORD* pdwEffect ) HRESULT DragOver ( DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )
HRESULT DragLeave ( ) HRESULT DragLeave ( )
HRESULT Drop ( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect ) ; HRESULT Drop ( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect ) ;
TYPEDEF: IDataObject* LPDATAOBJECT
TYPEDEF: IDropSource* LPDROPSOURCE
FUNCTION: HRESULT DoDragDrop (
LPDATAOBJECT pDataObj,
LPDROPSOURCE pDropSource,
DWORD dwOKEffects,
LPDWORD pdwEffect
)
COM-INTERFACE: ISequentialStream IUnknown {0C733A30-2A1C-11CE-ADE5-00AA0044773D} COM-INTERFACE: ISequentialStream IUnknown {0C733A30-2A1C-11CE-ADE5-00AA0044773D}
HRESULT Read ( void* pv, ULONG cb, ULONG* pcbRead ) HRESULT Read ( void* pv, ULONG cb, ULONG* pcbRead )
HRESULT Write ( void* pv, ULONG cb, ULONG* pcbWritten ) ; HRESULT Write ( void* pv, ULONG cb, ULONG* pcbWritten ) ;

View File

@ -1,19 +1,12 @@
! Copyright (C) 2008, 2009 Joe Groff, Slava Pestov. ! Copyright (C) 2008, 2009 Joe Groff, Slava Pestov.
! Copyright (C) 2017-2018 Alexander Ilin. ! Copyright (C) 2017-2018 Alexander Ilin.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.accessors alien.c-types alien.data USING: accessors alien.accessors classes.struct kernel
alien.strings classes.struct io.encodings.utf16n kernel make namespaces sequences ui.backend.windows ui.gadgets.worlds
math namespaces prettyprint sequences specialized-arrays ui.gestures windows.com windows.com.wrapper windows.dropfiles
ui.backend.windows ui.gadgets.worlds ui.gestures windows.kernel32 windows.ole32 windows.user32 ;
ui.tools.listener windows.com windows.com.wrapper
windows.dropfiles windows.kernel32 windows.ole32 windows.shell32
windows.types ;
SPECIALIZED-ARRAY: ushort
SPECIALIZED-ARRAY: WCHAR
IN: windows.dragdrop-listener IN: windows.dragdrop-listener
CONSTANT: E_OUTOFMEMORY -2147024882 ! 0x8007000e
: handle-data-object ( handler: ( hdrop -- x ) data-object -- filenames ) : handle-data-object ( handler: ( hdrop -- x ) data-object -- filenames )
FORMATETC <struct> FORMATETC <struct>
CF_HDROP >>cfFormat CF_HDROP >>cfFormat

View File

@ -270,6 +270,20 @@ STRUCT: TIME_ZONE_INFORMATION
{ DaylightDate SYSTEMTIME } { DaylightDate SYSTEMTIME }
{ DaylightBias LONG } ; { DaylightBias LONG } ;
STRUCT: DYNAMIC_TIME_ZONE_INFORMATION
{ Bias LONG }
{ StandardName WCHAR[32] }
{ StandardDate SYSTEMTIME }
{ StandardBias LONG }
{ DaylightName WCHAR[32] }
{ DaylightDate SYSTEMTIME }
{ DaylightBias LONG }
{ TimeZoneKeyName WCHAR[128] }
{ DynamicDaylightTimeDisabled BOOLEAN } ;
TYPEDEF: DYNAMIC_TIME_ZONE_INFORMATION* PDYNAMIC_TIME_ZONE_INFORMATION
STRUCT: FILETIME STRUCT: FILETIME
{ dwLowDateTime DWORD } { dwLowDateTime DWORD }
{ dwHighDateTime DWORD } ; { dwHighDateTime DWORD } ;
@ -1366,6 +1380,9 @@ ALIAS: GetDiskFreeSpaceEx GetDiskFreeSpaceExW
! FUNCTION: GetDriveTypeA ! FUNCTION: GetDriveTypeA
FUNCTION: UINT GetDriveTypeW ( LPCTSTR lpRootPathName ) FUNCTION: UINT GetDriveTypeW ( LPCTSTR lpRootPathName )
ALIAS: GetDriveType GetDriveTypeW ALIAS: GetDriveType GetDriveTypeW
FUNCTION: DWORD GetDynamicTimeZoneInformation ( PDYNAMIC_TIME_ZONE_INFORMATION pTimeZoneInformation )
FUNCTION: void* GetEnvironmentStringsW ( ) FUNCTION: void* GetEnvironmentStringsW ( )
! FUNCTION: GetEnvironmentStringsA ! FUNCTION: GetEnvironmentStringsA
ALIAS: GetEnvironmentStrings GetEnvironmentStringsW ALIAS: GetEnvironmentStrings GetEnvironmentStringsW

View File

@ -29,8 +29,15 @@ FUNCTION: HRESULT CLSIDFromString ( LPOLESTR lpsz, REFGUID out_rguid )
CONSTANT: S_OK 0 CONSTANT: S_OK 0
CONSTANT: S_FALSE 1 CONSTANT: S_FALSE 1
CONSTANT: DRAGDROP_S_DROP 0x00040100
CONSTANT: DRAGDROP_S_CANCEL 0x00040101
CONSTANT: DRAGDROP_S_USEDEFAULTCURSORS 0x00040102
CONSTANT: E_NOTIMPL 0x80004001
CONSTANT: E_NOINTERFACE 0x80004002 CONSTANT: E_NOINTERFACE 0x80004002
CONSTANT: E_FAIL 0x80004005 CONSTANT: E_FAIL 0x80004005
CONSTANT: E_UNEXPECTED 0x8000FFFF
CONSTANT: E_OUTOFMEMORY 0x8007000E
CONSTANT: E_INVALIDARG 0x80070057 CONSTANT: E_INVALIDARG 0x80070057
CONSTANT: MK_ALT 0x20 CONSTANT: MK_ALT 0x20
@ -45,30 +52,6 @@ CONSTANT: DD_DEFSCROLLINTERVAL 50
CONSTANT: DD_DEFDRAGDELAY 200 CONSTANT: DD_DEFDRAGDELAY 200
CONSTANT: DD_DEFDRAGMINDIST 2 CONSTANT: DD_DEFDRAGMINDIST 2
CONSTANT: CF_TEXT 1
CONSTANT: CF_BITMAP 2
CONSTANT: CF_METAFILEPICT 3
CONSTANT: CF_SYLK 4
CONSTANT: CF_DIF 5
CONSTANT: CF_TIFF 6
CONSTANT: CF_OEMTEXT 7
CONSTANT: CF_DIB 8
CONSTANT: CF_PALETTE 9
CONSTANT: CF_PENDATA 10
CONSTANT: CF_RIFF 11
CONSTANT: CF_WAVE 12
CONSTANT: CF_UNICODETEXT 13
CONSTANT: CF_ENHMETAFILE 14
CONSTANT: CF_HDROP 15
CONSTANT: CF_LOCALE 16
CONSTANT: CF_MAX 17
CONSTANT: CF_OWNERDISPLAY 0x0080
CONSTANT: CF_DSPTEXT 0x0081
CONSTANT: CF_DSPBITMAP 0x0082
CONSTANT: CF_DSPMETAFILEPICT 0x0083
CONSTANT: CF_DSPENHMETAFILE 0x008E
CONSTANT: DVASPECT_CONTENT 1 CONSTANT: DVASPECT_CONTENT 1
CONSTANT: DVASPECT_THUMBNAIL 2 CONSTANT: DVASPECT_THUMBNAIL 2
CONSTANT: DVASPECT_ICON 4 CONSTANT: DVASPECT_ICON 4

View File

@ -243,6 +243,10 @@ TYPEDEF: ITEMIDLIST* LPCITEMIDLIST
TYPEDEF: ITEMIDLIST ITEMID_CHILD TYPEDEF: ITEMIDLIST ITEMID_CHILD
TYPEDEF: ITEMID_CHILD* PITEMID_CHILD TYPEDEF: ITEMID_CHILD* PITEMID_CHILD
TYPEDEF: ITEMID_CHILD* PCUITEMID_CHILD TYPEDEF: ITEMID_CHILD* PCUITEMID_CHILD
TYPEDEF: ITEMIDLIST ITEMIDLIST_RELATIVE
TYPEDEF: ITEMIDLIST ITEMIDLIST_ABSOLUTE
TYPEDEF: ITEMIDLIST_ABSOLUTE* PIDLIST_ABSOLUTE
TYPEDEF: ITEMIDLIST_ABSOLUTE* PCIDLIST_ABSOLUTE
CONSTANT: STRRET_WSTR 0 CONSTANT: STRRET_WSTR 0
CONSTANT: STRRET_OFFSET 1 CONSTANT: STRRET_OFFSET 1
@ -379,3 +383,483 @@ STRUCT: NOTIFYICONDATA
TYPEDEF: NOTIFYICONDATA* PNOTIFYICONDATA TYPEDEF: NOTIFYICONDATA* PNOTIFYICONDATA
FUNCTION: BOOL Shell_NotifyIcon ( DWORD dwMessage, PNOTIFYICONDATA lpdata ) FUNCTION: BOOL Shell_NotifyIcon ( DWORD dwMessage, PNOTIFYICONDATA lpdata )
TYPEDEF: HRESULT SHSTDAPI
FUNCTION: SHSTDAPI SHBindToParent (
PCIDLIST_ABSOLUTE pidl,
REFIID riid,
void **ppv,
PCUITEMID_CHILD *ppidlLast
)
! FUNCTION: AppCompat_RunDLLW
! FUNCTION: AssocCreateForClasses
! FUNCTION: AssocGetDetailsOfPropKey
! FUNCTION: CDefFolderMenu_Create2
! FUNCTION: CheckEscapesW
! FUNCTION: CIDLData_CreateFromIDArray
! FUNCTION: CommandLineToArgvW
! FUNCTION: Control_RunDLL
! FUNCTION: Control_RunDLLA
! FUNCTION: Control_RunDLLAsUserW
! FUNCTION: Control_RunDLLW
! FUNCTION: CreateStorageItemFromPath_FullTrustCaller
! FUNCTION: CreateStorageItemFromPath_FullTrustCaller_ForPackage
! FUNCTION: CreateStorageItemFromPath_PartialTrustCaller
! FUNCTION: CreateStorageItemFromShellItem_FullTrustCaller
! FUNCTION: CreateStorageItemFromShellItem_FullTrustCaller_ForPackage
! FUNCTION: CreateStorageItemFromShellItem_FullTrustCaller_ForPackage_WithProcessHandle
! FUNCTION: CreateStorageItemFromShellItem_FullTrustCaller_UseImplicitFlagsAndPackage
! FUNCTION: CStorageItem_GetValidatedStorageItemObject
! FUNCTION: DAD_AutoScroll
! FUNCTION: DAD_DragEnterEx
! FUNCTION: DAD_DragEnterEx2
! FUNCTION: DAD_DragLeave
! FUNCTION: DAD_DragMove
! FUNCTION: DAD_SetDragImage
! FUNCTION: DAD_ShowDragImage
! FUNCTION: DllCanUnloadNow
! FUNCTION: DllGetActivationFactory
! FUNCTION: DllGetClassObject
! FUNCTION: DllGetVersion
! FUNCTION: DllInstall
! FUNCTION: DllRegisterServer
! FUNCTION: DllUnregisterServer
! FUNCTION: DoEnvironmentSubstA
! FUNCTION: DoEnvironmentSubstW
! FUNCTION: DragQueryFileA
! FUNCTION: DragQueryFileAorW
! FUNCTION: DriveType
! FUNCTION: DuplicateIcon
! FUNCTION: ExtractAssociatedIconA
! FUNCTION: ExtractAssociatedIconExA
! FUNCTION: ExtractAssociatedIconExW
! FUNCTION: ExtractAssociatedIconW
! FUNCTION: ExtractIconA
! FUNCTION: ExtractIconEx
! FUNCTION: ExtractIconExA
! FUNCTION: ExtractIconExW
! FUNCTION: ExtractIconW
! FUNCTION: FindExecutableA
! FUNCTION: FindExecutableW
! FUNCTION: FreeIconList
! FUNCTION: GetCurrentProcessExplicitAppUserModelID
! FUNCTION: GetFileNameFromBrowse
! FUNCTION: GetSystemPersistedStorageItemList
! FUNCTION: ILAppendID
! FUNCTION: ILClone
! FUNCTION: ILCloneFirst
! FUNCTION: ILCombine
! FUNCTION: ILCreateFromPath
! FUNCTION: ILCreateFromPathA
! FUNCTION: ILCreateFromPathW
! FUNCTION: ILFindChild
! FUNCTION: ILFindLastID
! FUNCTION: ILFree
! FUNCTION: ILGetNext
! FUNCTION: ILGetSize
! FUNCTION: ILIsEqual
! FUNCTION: ILIsParent
! FUNCTION: ILLoadFromStreamEx
! FUNCTION: ILRemoveLastID
! FUNCTION: ILSaveToStream
! FUNCTION: InitNetworkAddressControl
! FUNCTION: InternalExtractIconListA
! FUNCTION: InternalExtractIconListW
! FUNCTION: IsDesktopExplorerProcess
! FUNCTION: IsLFNDrive
! FUNCTION: IsLFNDriveA
! FUNCTION: IsLFNDriveW
! FUNCTION: IsNetDrive
! FUNCTION: IsProcessAnExplorer
! FUNCTION: LaunchMSHelp_RunDLLW
! FUNCTION: OpenAs_RunDLL
! FUNCTION: OpenAs_RunDLLA
! FUNCTION: OpenAs_RunDLLW
! FUNCTION: OpenRegStream
! FUNCTION: Options_RunDLL
! FUNCTION: Options_RunDLLA
! FUNCTION: Options_RunDLLW
! FUNCTION: PathCleanupSpec
! FUNCTION: PathGetShortPath
! FUNCTION: PathIsExe
! FUNCTION: PathIsSlowA
! FUNCTION: PathIsSlowW
! FUNCTION: PathMakeUniqueName
! FUNCTION: PathQualify
! FUNCTION: PathResolve
! FUNCTION: PathYetAnotherMakeUniqueName
! FUNCTION: PickIconDlg
! FUNCTION: PifMgr_CloseProperties
! FUNCTION: PifMgr_GetProperties
! FUNCTION: PifMgr_OpenProperties
! FUNCTION: PifMgr_SetProperties
! FUNCTION: PrepareDiscForBurnRunDllW
! FUNCTION: PrintersGetCommand_RunDLL
! FUNCTION: PrintersGetCommand_RunDLLA
! FUNCTION: PrintersGetCommand_RunDLLW
! FUNCTION: ReadCabinetState
! FUNCTION: RealDriveType
! FUNCTION: RealShellExecuteA
! FUNCTION: RealShellExecuteExA
! FUNCTION: RealShellExecuteExW
! FUNCTION: RealShellExecuteW
! FUNCTION: RegenerateUserEnvironment
! FUNCTION: RestartDialog
! FUNCTION: RestartDialogEx
! FUNCTION: RunAsNewUser_RunDLLW
! FUNCTION: SetCurrentProcessExplicitAppUserModelID
! FUNCTION: SHAddDefaultPropertiesByExt
! FUNCTION: SHAddFromPropSheetExtArray
! FUNCTION: SHAddToRecentDocs
! FUNCTION: SHAlloc
! FUNCTION: SHAppBarMessage
! FUNCTION: SHAssocEnumHandlers
! FUNCTION: SHAssocEnumHandlersForProtocolByApplication
! FUNCTION: SHBindToFolderIDListParent
! FUNCTION: SHBindToFolderIDListParentEx
! FUNCTION: SHBindToObject
! FUNCTION: SHBrowseForFolder
! FUNCTION: SHBrowseForFolderA
! FUNCTION: SHBrowseForFolderW
! FUNCTION: SHChangeNotification_Lock
! FUNCTION: SHChangeNotification_Unlock
! FUNCTION: SHChangeNotify
! FUNCTION: SHChangeNotifyDeregister
! FUNCTION: SHChangeNotifyRegister
! FUNCTION: SHChangeNotifyRegisterThread
! FUNCTION: SHChangeNotifySuspendResume
! FUNCTION: SHCloneSpecialIDList
! FUNCTION: SHCLSIDFromString
! FUNCTION: SHCoCreateInstance
! FUNCTION: SHCoCreateInstanceWorker
! FUNCTION: SHCreateAssociationRegistration
! FUNCTION: SHCreateCategoryEnum
! FUNCTION: SHCreateDataObject
! FUNCTION: SHCreateDefaultContextMenu
! FUNCTION: SHCreateDefaultExtractIcon
! FUNCTION: SHCreateDefaultPropertiesOp
! FUNCTION: SHCreateDirectory
! FUNCTION: SHCreateDirectoryExA
! FUNCTION: SHCreateDirectoryExW
! FUNCTION: SHCreateDrvExtIcon
! FUNCTION: SHCreateFileExtractIconW
! FUNCTION: SHCreateItemFromIDList
! FUNCTION: SHCreateItemFromParsingName
! FUNCTION: SHCreateItemFromRelativeName
! FUNCTION: SHCreateItemInKnownFolder
! FUNCTION: SHCreateItemWithParent
! FUNCTION: SHCreateLocalServerRunDll
! FUNCTION: SHCreateProcessAsUserW
! FUNCTION: SHCreatePropSheetExtArray
! FUNCTION: SHCreateQueryCancelAutoPlayMoniker
! FUNCTION: SHCreateShellFolderView
! FUNCTION: SHCreateShellFolderViewEx
! FUNCTION: SHCreateShellItem
! FUNCTION: SHCreateShellItemArray
! FUNCTION: SHCreateShellItemArrayFromDataObject
! FUNCTION: SHCreateShellItemArrayFromIDLists
! FUNCTION: SHCreateShellItemArrayFromShellItem
! FUNCTION: SHCreateStdEnumFmtEtc
! FUNCTION: SHDefExtractIconA
! FUNCTION: SHDefExtractIconW
! FUNCTION: SHDestroyPropSheetExtArray
! FUNCTION: SHDoDragDrop
! FUNCTION: SheChangeDirA
! FUNCTION: SheChangeDirExW
! FUNCTION: SheGetDirA
! FUNCTION: SHELL32_AddToBackIconTable
! FUNCTION: SHELL32_AddToFrontIconTable
! FUNCTION: SHELL32_AreAllItemsAvailable
! FUNCTION: SHELL32_BindToFilePlaceholderHandler
! FUNCTION: SHELL32_CallFileCopyHooks
! FUNCTION: SHELL32_CanDisplayWin8CopyDialog
! FUNCTION: SHELL32_CCommonPlacesFolder_CreateInstance
! FUNCTION: SHELL32_CDBurn_CloseSession
! FUNCTION: SHELL32_CDBurn_DriveSupportedForDataBurn
! FUNCTION: SHELL32_CDBurn_Erase
! FUNCTION: SHELL32_CDBurn_GetCDInfo
! FUNCTION: SHELL32_CDBurn_GetLiveFSDiscInfo
! FUNCTION: SHELL32_CDBurn_GetStagingPathOrNormalPath
! FUNCTION: SHELL32_CDBurn_GetTaskInfo
! FUNCTION: SHELL32_CDBurn_IsBlankDisc
! FUNCTION: SHELL32_CDBurn_IsBlankDisc2
! FUNCTION: SHELL32_CDBurn_IsLiveFS
! FUNCTION: SHELL32_CDBurn_OnDeviceChange
! FUNCTION: SHELL32_CDBurn_OnEject
! FUNCTION: SHELL32_CDBurn_OnMediaChange
! FUNCTION: SHELL32_CDefFolderMenu_Create2
! FUNCTION: SHELL32_CDefFolderMenu_Create2Ex
! FUNCTION: SHELL32_CDefFolderMenu_MergeMenu
! FUNCTION: SHELL32_CDrives_CreateSFVCB
! FUNCTION: SHELL32_CDrivesContextMenu_Create
! FUNCTION: SHELL32_CDrivesDropTarget_Create
! FUNCTION: SHELL32_CFillPropertiesTask_CreateInstance
! FUNCTION: SHELL32_CFSDropTarget_CreateInstance
! FUNCTION: SHELL32_CFSFolderCallback_Create
! FUNCTION: SHELL32_CLibraryDropTarget_CreateInstance
! FUNCTION: SHELL32_CLocationContextMenu_Create
! FUNCTION: SHELL32_CLocationFolderUI_CreateInstance
! FUNCTION: SHELL32_CloseAutoplayPrompt
! FUNCTION: SHELL32_CMountPoint_DoAutorun
! FUNCTION: SHELL32_CMountPoint_DoAutorunPrompt
! FUNCTION: SHELL32_CMountPoint_IsAutoRunDriveAndEnabledByPolicy
! FUNCTION: SHELL32_CMountPoint_ProcessAutoRunFile
! FUNCTION: SHELL32_CMountPoint_WantAutorunUI
! FUNCTION: SHELL32_CMountPoint_WantAutorunUIGetReady
! FUNCTION: SHELL32_CommandLineFromMsiDescriptor
! FUNCTION: SHELL32_CopyFilePlaceholderToNewFile
! FUNCTION: SHELL32_CopySecondaryTiles
! FUNCTION: SHELL32_CPL_CategoryIdArrayFromVariant
! FUNCTION: SHELL32_CPL_IsLegacyCanonicalNameListedUnderKey
! FUNCTION: SHELL32_CPL_ModifyWowDisplayName
! FUNCTION: SHELL32_Create_IEnumUICommand
! FUNCTION: SHELL32_CreateConfirmationInterrupt
! FUNCTION: SHELL32_CreateConflictInterrupt
! FUNCTION: SHELL32_CreateDefaultOperationDataProvider
! FUNCTION: SHELL32_CreateFileFolderContextMenu
! FUNCTION: SHELL32_CreateLinkInfoW
! FUNCTION: SHELL32_CreatePlaceholderFile
! FUNCTION: SHELL32_CreateQosRecorder
! FUNCTION: SHELL32_CreateSharePointView
! FUNCTION: SHELL32_CRecentDocsContextMenu_CreateInstance
! FUNCTION: SHELL32_CSyncRootManager_CreateInstance
! FUNCTION: SHELL32_CTransferConfirmation_CreateInstance
! FUNCTION: SHELL32_DestroyLinkInfo
! FUNCTION: SHELL32_EncryptDirectory
! FUNCTION: SHELL32_EncryptedFileKeyInfo
! FUNCTION: SHELL32_EnumCommonTasks
! FUNCTION: SHELL32_FilePlaceholder_BindToPrimaryStream
! FUNCTION: SHELL32_FilePlaceholder_CreateInstance
! FUNCTION: SHELL32_FreeEncryptedFileKeyInfo
! FUNCTION: SHELL32_GenerateAppID
! FUNCTION: SHELL32_GetAppIDRoot
! FUNCTION: SHELL32_GetCommandProviderForFolderType
! FUNCTION: SHELL32_GetDiskCleanupPath
! FUNCTION: SHELL32_GetDPIAdjustedLogicalSize
! FUNCTION: SHELL32_GetFileNameFromBrowse
! FUNCTION: SHELL32_GetIconOverlayManager
! FUNCTION: SHELL32_GetLinkInfoData
! FUNCTION: SHELL32_GetPlaceholderStatesFromFileAttributesAndReparsePointTag
! FUNCTION: SHELL32_GetRatingBucket
! FUNCTION: SHELL32_GetSkyDriveNetworkStates
! FUNCTION: SHELL32_GetSqmableFileName
! FUNCTION: SHELL32_GetThumbnailAdornerFromFactory
! FUNCTION: SHELL32_GetThumbnailAdornerFromFactory2
! FUNCTION: SHELL32_HandleUnrecognizedFileSystem
! FUNCTION: SHELL32_IconCache_AboutToExtractIcons
! FUNCTION: SHELL32_IconCache_DoneExtractingIcons
! FUNCTION: SHELL32_IconCache_ExpandEnvAndSearchPath
! FUNCTION: SHELL32_IconCache_RememberRecentlyExtractedIconsW
! FUNCTION: SHELL32_IconCacheCreate
! FUNCTION: SHELL32_IconCacheDestroy
! FUNCTION: SHELL32_IconCacheHandleAssociationChanged
! FUNCTION: SHELL32_IconCacheRestore
! FUNCTION: SHELL32_IconOverlayManagerInit
! FUNCTION: SHELL32_IsGetKeyboardLayoutPresent
! FUNCTION: SHELL32_IsSystemUpgradeInProgress
! FUNCTION: SHELL32_IsValidLinkInfo
! FUNCTION: SHELL32_LegacyEnumSpecialTasksByType
! FUNCTION: SHELL32_LegacyEnumTasks
! FUNCTION: SHELL32_LookupBackIconIndex
! FUNCTION: SHELL32_LookupFrontIconIndex
! FUNCTION: SHELL32_NormalizeRating
! FUNCTION: SHELL32_NotifyLinkTrackingServiceOfMove
! FUNCTION: SHELL32_PifMgr_CloseProperties
! FUNCTION: SHELL32_PifMgr_GetProperties
! FUNCTION: SHELL32_PifMgr_OpenProperties
! FUNCTION: SHELL32_PifMgr_SetProperties
! FUNCTION: SHELL32_Printers_CreateBindInfo
! FUNCTION: SHELL32_Printjob_GetPidl
! FUNCTION: SHELL32_PurgeSystemIcon
! FUNCTION: SHELL32_RefreshOverlayImages
! FUNCTION: SHELL32_ResolveLinkInfoW
! FUNCTION: SHELL32_SendToMenu_InvokeTargetedCommand
! FUNCTION: SHELL32_SendToMenu_VerifyTargetedCommand
! FUNCTION: SHELL32_SetPlaceholderReparsePointAttribute
! FUNCTION: SHELL32_SetPlaceholderReparsePointAttribute2
! FUNCTION: SHELL32_SHAddSparseIcon
! FUNCTION: SHELL32_SHCreateByValueOperationInterrupt
! FUNCTION: SHELL32_SHCreateDefaultContextMenu
! FUNCTION: SHELL32_SHCreateLocalServer
! FUNCTION: SHELL32_SHCreateShellFolderView
! FUNCTION: SHELL32_SHDuplicateEncryptionInfoFile
! FUNCTION: SHELL32_SHEncryptFile
! FUNCTION: SHELL32_SHFormatDriveAsync
! FUNCTION: SHELL32_SHGetThreadUndoManager
! FUNCTION: SHELL32_SHGetUserNameW
! FUNCTION: SHELL32_SHIsVirtualDevice
! FUNCTION: SHELL32_SHLaunchPropSheet
! FUNCTION: SHELL32_SHLogILFromFSIL
! FUNCTION: SHELL32_SHOpenWithDialog
! FUNCTION: SHELL32_ShowHideIconOnlyOnDesktop
! FUNCTION: SHELL32_SHStartNetConnectionDialogW
! FUNCTION: SHELL32_SHUICommandFromGUID
! FUNCTION: SHELL32_SimpleRatingToFilterCondition
! FUNCTION: SHELL32_StampIconForFile
! FUNCTION: SHELL32_SuspendUndo
! FUNCTION: SHELL32_TryVirtualDiscImageDriveEject
! FUNCTION: SHELL32_UpdateFilePlaceholderStates
! FUNCTION: SHELL32_VerifySaferTrust
! FUNCTION: Shell_GetCachedImageIndex
! FUNCTION: Shell_GetCachedImageIndexA
! FUNCTION: Shell_GetCachedImageIndexW
! FUNCTION: Shell_GetImageLists
! FUNCTION: Shell_MergeMenus
! FUNCTION: Shell_NotifyIconA
! FUNCTION: Shell_NotifyIconGetRect
! FUNCTION: Shell_NotifyIconW
! FUNCTION: ShellAboutA
! FUNCTION: ShellAboutW
! FUNCTION: ShellExec_RunDLL
! FUNCTION: ShellExec_RunDLLA
! FUNCTION: ShellExec_RunDLLW
! FUNCTION: ShellExecuteA
! FUNCTION: ShellExecuteEx
! FUNCTION: ShellExecuteExA
! FUNCTION: ShellExecuteExW
! FUNCTION: ShellHookProc
! FUNCTION: ShellMessageBoxA
! FUNCTION: ShellMessageBoxW
! FUNCTION: SHEmptyRecycleBinA
! FUNCTION: SHEmptyRecycleBinW
! FUNCTION: SHEnableServiceObject
! FUNCTION: SHEnumerateUnreadMailAccountsW
! FUNCTION: SheSetCurDrive
! FUNCTION: SHEvaluateSystemCommandTemplate
! FUNCTION: SHExtractIconsW
! FUNCTION: SHFileOperation
! FUNCTION: SHFileOperationA
! FUNCTION: SHFileOperationW
! FUNCTION: SHFind_InitMenuPopup
! FUNCTION: SHFindFiles
! FUNCTION: SHFlushSFCache
! FUNCTION: SHFormatDrive
! FUNCTION: SHFree
! FUNCTION: SHFreeNameMappings
! FUNCTION: SHGetAttributesFromDataObject
! FUNCTION: SHGetDataFromIDListA
! FUNCTION: SHGetDataFromIDListW
! FUNCTION: SHGetDiskFreeSpaceA
! FUNCTION: SHGetDiskFreeSpaceExA
! FUNCTION: SHGetDiskFreeSpaceExW
! FUNCTION: SHGetDriveMedia
! FUNCTION: SHGetFileInfo
! FUNCTION: SHGetFileInfoA
! FUNCTION: SHGetFolderLocation
! FUNCTION: SHGetFolderPathA
! FUNCTION: SHGetFolderPathAndSubDirA
! FUNCTION: SHGetFolderPathAndSubDirW
! FUNCTION: SHGetFolderPathEx
! FUNCTION: SHGetIconOverlayIndexA
! FUNCTION: SHGetIconOverlayIndexW
! FUNCTION: SHGetIDListFromObject
! FUNCTION: SHGetImageList
! FUNCTION: SHGetInstanceExplorer
! FUNCTION: SHGetItemFromDataObject
! FUNCTION: SHGetItemFromObject
! FUNCTION: SHGetKnownFolderIDList
! FUNCTION: SHGetKnownFolderItem
! FUNCTION: SHGetKnownFolderPath
! FUNCTION: SHGetLocalizedName
! FUNCTION: SHGetMalloc
! FUNCTION: SHGetNameFromIDList
! FUNCTION: SHGetNewLinkInfo
! FUNCTION: SHGetNewLinkInfoA
! FUNCTION: SHGetNewLinkInfoW
! FUNCTION: SHGetPathFromIDList
! FUNCTION: SHGetPathFromIDListA
! FUNCTION: SHGetPathFromIDListEx
! FUNCTION: SHGetPathFromIDListW
! FUNCTION: SHGetPropertyStoreForWindow
! FUNCTION: SHGetPropertyStoreFromIDList
! FUNCTION: SHGetPropertyStoreFromParsingName
! FUNCTION: SHGetRealIDL
! FUNCTION: SHGetSetFolderCustomSettings
! FUNCTION: SHGetSetSettings
! FUNCTION: SHGetSettings
! FUNCTION: SHGetSpecialFolderLocation
! FUNCTION: SHGetSpecialFolderPathA
! FUNCTION: SHGetSpecialFolderPathW
! FUNCTION: SHGetStockIconInfo
! FUNCTION: SHGetTemporaryPropertyForItem
! FUNCTION: SHGetUnreadMailCountW
! FUNCTION: SHHandleUpdateImage
! FUNCTION: SHHelpShortcuts_RunDLL
! FUNCTION: SHHelpShortcuts_RunDLLA
! FUNCTION: SHHelpShortcuts_RunDLLW
! FUNCTION: SHILCreateFromPath
! FUNCTION: SHInvokePrinterCommandA
! FUNCTION: SHInvokePrinterCommandW
! FUNCTION: SHIsFileAvailableOffline
! FUNCTION: SHLimitInputEdit
! FUNCTION: SHLoadInProc
! FUNCTION: SHLoadNonloadedIconOverlayIdentifiers
! FUNCTION: SHMapPIDLToSystemImageListIndex
! FUNCTION: SHMultiFileProperties
! FUNCTION: SHObjectProperties
! FUNCTION: SHOpenFolderAndSelectItems
! FUNCTION: SHOpenPropSheetW
! FUNCTION: SHOpenWithDialog
! FUNCTION: SHParseDisplayName
! FUNCTION: SHPathPrepareForWriteA
! FUNCTION: SHPathPrepareForWriteW
! FUNCTION: SHPropStgCreate
! FUNCTION: SHPropStgReadMultiple
! FUNCTION: SHPropStgWriteMultiple
! FUNCTION: SHQueryRecycleBinA
! FUNCTION: SHQueryRecycleBinW
! FUNCTION: SHQueryUserNotificationState
! FUNCTION: SHRemoveLocalizedName
! FUNCTION: SHReplaceFromPropSheetExtArray
! FUNCTION: SHResolveLibrary
! FUNCTION: SHRestricted
! FUNCTION: SHSetDefaultProperties
! FUNCTION: SHSetFolderPathA
! FUNCTION: SHSetFolderPathW
! FUNCTION: SHSetInstanceExplorer
! FUNCTION: SHSetKnownFolderPath
! FUNCTION: SHSetLocalizedName
! FUNCTION: SHSetTemporaryPropertyForItem
! FUNCTION: SHSetUnreadMailCountW
! FUNCTION: SHShellFolderView_Message
! FUNCTION: SHShowManageLibraryUI
! FUNCTION: SHSimpleIDListFromPath
! FUNCTION: SHStartNetConnectionDialogW
! FUNCTION: SHTestTokenMembership
! FUNCTION: SHUpdateImageA
! FUNCTION: SHUpdateImageW
! FUNCTION: SHUpdateRecycleBinIcon
! FUNCTION: SHValidateUNC
! FUNCTION: SignalFileOpen
! FUNCTION: StgMakeUniqueName
! FUNCTION: StrChrA
! FUNCTION: StrChrIA
! FUNCTION: StrChrIW
! FUNCTION: StrChrW
! FUNCTION: StrCmpNA
! FUNCTION: StrCmpNIA
! FUNCTION: StrCmpNIW
! FUNCTION: StrCmpNW
! FUNCTION: StrNCmpA
! FUNCTION: StrNCmpIA
! FUNCTION: StrNCmpIW
! FUNCTION: StrNCmpW
! FUNCTION: StrRChrA
! FUNCTION: StrRChrIA
! FUNCTION: StrRChrIW
! FUNCTION: StrRChrW
! FUNCTION: StrRStrA
! FUNCTION: StrRStrIA
! FUNCTION: StrRStrIW
! FUNCTION: StrRStrW
! FUNCTION: StrStrA
! FUNCTION: StrStrIA
! FUNCTION: StrStrIW
! FUNCTION: StrStrW
! FUNCTION: UsersLibrariesFolderUI_CreateInstance
! FUNCTION: WaitForExplorerRestartW
! FUNCTION: Win32DeleteFile
! FUNCTION: WOWShellExecute
! FUNCTION: WriteCabinetState

View File

@ -689,7 +689,7 @@ make_boot_image() {
} }
install_deps_apt() { install_deps_apt() {
sudo apt install --yes libc6-dev libpango1.0-dev libx11-dev xorg-dev libgtk2.0-dev gtk2-engines-pixbuf libgtkglext1-dev wget git git-doc rlwrap clang gcc make screen tmux libssl-dev g++ sudo apt install --yes libc6-dev libpango1.0-dev libx11-dev xorg-dev libgtk2.0-dev gtk2-engines-pixbuf libgtkglext1-dev wget git git-doc rlwrap clang make screen tmux libssl-dev
check_ret sudo check_ret sudo
} }
@ -732,6 +732,8 @@ usage() {
$ECHO " self-update - git pull, recompile, make local boot image, bootstrap" $ECHO " self-update - git pull, recompile, make local boot image, bootstrap"
$ECHO " quick-update - git pull, refresh-all, save" $ECHO " quick-update - git pull, refresh-all, save"
$ECHO " update|latest - git pull, recompile, download a boot image, bootstrap" $ECHO " update|latest - git pull, recompile, download a boot image, bootstrap"
$ECHO " compile - compile the binary"
$ECHO " recompile - recompile the binary"
$ECHO " bootstrap - bootstrap with existing boot image" $ECHO " bootstrap - bootstrap with existing boot image"
$ECHO " net-bootstrap - recompile, download a boot image, bootstrap" $ECHO " net-bootstrap - recompile, download a boot image, bootstrap"
$ECHO " make-target - find and print the os-arch-cpu string" $ECHO " make-target - find and print the os-arch-cpu string"
@ -773,6 +775,7 @@ case "$1" in
quick-update) update; refresh_image ;; quick-update) update; refresh_image ;;
update|latest) update; download_and_bootstrap ;; update|latest) update; download_and_bootstrap ;;
compile) find_build_info; make_factor ;; compile) find_build_info; make_factor ;;
recompile) find_build_info; make_clean; make_factor ;;
bootstrap) get_config_info; bootstrap ;; bootstrap) get_config_info; bootstrap ;;
net-bootstrap) net_bootstrap_no_pull ;; net-bootstrap) net_bootstrap_no_pull ;;
make-target) FIND_MAKE_TARGET=true; ECHO=false; find_build_info; exit_script ;; make-target) FIND_MAKE_TARGET=true; ECHO=false; find_build_info; exit_script ;;

View File

@ -24,7 +24,7 @@ IN: ascii
[ [ 1 ] when-zero cut-slice swap ] [ [ 1 ] when-zero cut-slice swap ]
[ f 0 rot [ length ] keep <slice> ] if* [ f 0 rot [ length ] keep <slice> ] if*
] produce nip ; ] produce nip ;
: capitalize ( str -- str' ) unclip [ >lower ] [ ch>upper ] bi* prefix ; : capitalize ( str -- str' ) >lower 0 over [ ch>upper ] change-nth ;
: >title ( str -- title ) >words [ capitalize ] map concat ; : >title ( str -- title ) >words [ capitalize ] map concat ;
HINTS: >lower string ; HINTS: >lower string ;

View File

@ -40,8 +40,8 @@ HELP: checksum-file
{ $examples { $examples
{ $example { $example
"USING: checksums checksums.crc32 prettyprint ;" "USING: checksums checksums.crc32 prettyprint ;"
"\"resource:LICENSE.txt\" crc32 checksum-file ." "\"resource:core/checksums/crc32/crc-me.txt\" crc32 checksum-file ."
"B{ 125 29 106 28 }" "B{ 196 202 117 155 }"
} }
} ; } ;

View File

@ -0,0 +1 @@
crc me 123

View File

@ -1,8 +1,8 @@
! Copyright (C) 2006, 2010 Slava Pestov, Daniel Ehrenberg. ! Copyright (C) 2006, 2010 Slava Pestov, Daniel Ehrenberg.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs hashtables kernel kernel.private USING: accessors arrays assocs byte-arrays hashtables kernel
make math math.order math.private quotations sequences kernel.private make math math.order math.private quotations
sequences.private sets sorting words ; sequences sequences.private sets sorting words ;
IN: combinators IN: combinators
! Most of these combinators have compile-time expansions in ! Most of these combinators have compile-time expansions in
@ -198,6 +198,8 @@ M: sequence hashcode* [ sequence-hashcode ] recursive-hashcode ;
M: array hashcode* [ sequence-hashcode ] recursive-hashcode ; M: array hashcode* [ sequence-hashcode ] recursive-hashcode ;
M: byte-array hashcode* [ sequence-hashcode ] recursive-hashcode ;
M: reversed hashcode* [ sequence-hashcode ] recursive-hashcode ; M: reversed hashcode* [ sequence-hashcode ] recursive-hashcode ;
M: slice hashcode* [ sequence-hashcode ] recursive-hashcode ; M: slice hashcode* [ sequence-hashcode ] recursive-hashcode ;

View File

@ -99,6 +99,12 @@ IN: generalizations.tests
{ { 1 2 } { 3 4 } { 5 6 } } { { 1 2 } { 3 4 } { 5 6 } }
[ 1 2 3 4 5 6 [ 2array ] 2 3 mnapply ] unit-test [ 1 2 3 4 5 6 [ 2array ] 2 3 mnapply ] unit-test
{ 1 4 9 16 }
[ 1 1 2 2 3 3 4 4 [ * ] 2 4 mnapply ] unit-test
{ 1 8 27 64 125 }
[ 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 [ * * ] 3 5 mnapply ] unit-test
{ { 1 2 3 } { 4 5 6 } } { { 1 2 3 } { 4 5 6 } }
[ 1 2 3 4 5 6 [ 3array ] 3 2 mnapply ] unit-test [ 1 2 3 4 5 6 [ 3array ] 3 2 mnapply ] unit-test

View File

@ -92,10 +92,10 @@ MACRO: nspread* ( m n -- quot )
[ drop [ ] ] [ [ drop [ ] ] [
[ * 0 ] [ drop neg ] 2bi [ * 0 ] [ drop neg ] 2bi
<range> rest >array dup length <iota> <reversed> <range> rest >array dup length <iota> <reversed>
[ [ '[ [ [ _ ndip ] curry ] _ ndip ] ] 2map
'[ [ [ _ ndip ] curry ] _ ndip ] [ [ ] concat-as ]
] 2map dup rest-slice [ [ compose ] compose ] map! drop [ length 1 - [ compose ] <array> concat append ] bi
[ ] concat-as [ call ] compose [ call ] compose
] if-zero ; ] if-zero ;
MACRO: cleave* ( n -- quot ) MACRO: cleave* ( n -- quot )

View File

@ -25,7 +25,5 @@ HOOK: normalize-path io-backend ( path -- path' )
io-backend set-global init-io init-stdio io-backend set-global init-io init-stdio
"io.files" startup-hooks get at call( -- ) ; "io.files" startup-hooks get at call( -- ) ;
! Note that we have 'alien' in our using list so that the alien
! init hook runs before this one.
[ init-io embedded? [ init-stdio ] unless ] [ init-io embedded? [ init-stdio ] unless ]
"io.backend" add-startup-hook "io.backend" add-startup-hook

View File

@ -4,7 +4,9 @@ USING: accessors arrays classes combinators compiler.units
continuations definitions effects io io.encodings.utf8 io.files continuations definitions effects io io.encodings.utf8 io.files
kernel lexer math.parser namespaces parser.notes quotations kernel lexer math.parser namespaces parser.notes quotations
sequences sets slots source-files splitting syntax.modern sequences sets slots source-files splitting syntax.modern
vectors vocabs vocabs.parser words words.symbol ; vectors vocabs vocabs.parser words words.symbol
sequences sets slots source-files vectors vocabs vocabs.parser
words words.symbol ;
IN: parser IN: parser
: location ( -- loc ) : location ( -- loc )
@ -217,7 +219,7 @@ INITIALIZED-SYMBOL: print-use-hook [ [ ] ]
: filter-moved ( set1 set2 -- seq ) : filter-moved ( set1 set2 -- seq )
swap diff members [ swap diff members [
{ {
{ [ dup where dup [ first ] when current-source-file get path>> = not ] [ f ] } { [ dup where ?first current-source-file get path>> = not ] [ f ] }
{ [ dup reader-method? ] [ f ] } { [ dup reader-method? ] [ f ] }
{ [ dup writer-method? ] [ f ] } { [ dup writer-method? ] [ f ] }
[ t ] [ t ]

1
extra/base16/authors.txt Normal file
View File

@ -0,0 +1 @@
John Benediktsson

View File

@ -0,0 +1,14 @@
USING: base16 byte-arrays kernel sequences tools.test ;
{ t } [ 256 <iota> >byte-array dup >base16 base16> = ] unit-test
{ "00" } [ B{ 0 } >base16 "" like ] unit-test
{ "01" } [ B{ 1 } >base16 "" like ] unit-test
{ "0102" } [ B{ 1 2 } >base16 "" like ] unit-test
{ B{ 0 } } [ "00" base16> ] unit-test
{ B{ 1 } } [ "01" base16> ] unit-test
{ B{ 1 2 } } [ "0102" base16> ] unit-test
[ "0" base16> ] [ malformed-base16? ] must-fail-with
[ "Z" base16> ] [ malformed-base16? ] must-fail-with

View File

@ -0,0 +1,57 @@
! Copyright (C) 2019 John Benediktsson.
! See http://factorcode.org/license.txt for BSD license.
USING: base64.private byte-arrays combinators io
io.encodings.binary io.streams.byte-array kernel literals locals
math namespaces sequences ;
IN: base16
ERROR: malformed-base16 ;
! XXX: Optional handle lower-case input
<PRIVATE
<<
CONSTANT: alphabet $[ "0123456789ABCDEF" >byte-array ]
>>
: ch>base16 ( ch -- ch )
alphabet nth ; inline
: base16>ch ( ch -- ch )
$[ alphabet alphabet-inverse ] nth
[ malformed-base16 ] unless* ; inline
:: (encode-base16) ( stream -- )
stream stream-read1 [
16 /mod [ ch>base16 write1 ] bi@
stream (encode-base16)
] when* ;
PRIVATE>
: encode-base16 ( -- )
input-stream get (encode-base16) ;
<PRIVATE
: decode2 ( seq -- n )
first2 [ base16>ch ] bi@ [ 16 * ] [ + ] bi* ;
:: (decode-base16) ( stream -- )
2 stream stream-read dup length {
{ 0 [ drop ] }
{ 2 [ decode2 write1 stream (decode-base16) ] }
[ malformed-base16 ]
} case ;
PRIVATE>
: decode-base16 ( -- )
input-stream get (decode-base16) ;
: >base16 ( seq -- base16 )
binary [ binary [ encode-base16 ] with-byte-reader ] with-byte-writer ;
: base16> ( base16 -- seq )
binary [ binary [ decode-base16 ] with-byte-reader ] with-byte-writer ;

1
extra/base16/summary.txt Normal file
View File

@ -0,0 +1 @@
Base 16 encoding/decoding (RFC 3548)

View File

@ -0,0 +1 @@
John Benediktsson

View File

@ -0,0 +1,20 @@
! Copyright (C) 2019 John Benediktsson
! See http://factorcode.org/license.txt for BSD license
USING: base32-crockford tools.test ;
{ "16J" } [ 1234 base32-crockford> ] unit-test
{ "16JD" } [ 1234 base32-crockford-checksum> ] unit-test
{ "0" } [ 0 base32-crockford> ] unit-test
{ "00" } [ 0 base32-crockford-checksum> ] unit-test
[ -1 base32-crockford> ] must-fail
[ 1.0 base32-crockford> ] must-fail
{ 1234 } [ "16J" >base32-crockford ] unit-test
{ 1234 } [ "I6J" >base32-crockford ] unit-test
{ 1234 } [ "i6J" >base32-crockford ] unit-test
{ 1234 } [ "16JD" >base32-crockford-checksum ] unit-test
{ 1234 } [ "I6JD" >base32-crockford-checksum ] unit-test
{ 1234 } [ "i6JD" >base32-crockford-checksum ] unit-test
{ 0 } [ "0" >base32-crockford ] unit-test
{ 0 } [ "00" >base32-crockford-checksum ] unit-test

View File

@ -0,0 +1,43 @@
! Copyright (C) 2019 John Benediktsson
! See http://factorcode.org/license.txt for BSD license
USING: ascii assocs byte-arrays kernel literals math sequences ;
IN: base32-crockford
<PRIVATE
<<
CONSTANT: ALPHABET $[ "0123456789ABCDEFGHJKMNPQRSTVWXYZ" >byte-array ]
>>
CONSTANT: INVERSE $[ 256 [ ALPHABET index 0xff or ] B{ } map-integers ]
CONSTANT: CHECKSUM $[ ALPHABET "*~$=U" append ]
: normalize-base32 ( seq -- seq' )
CHAR: - swap remove >upper H{
{ CHAR: I CHAR: 1 }
{ CHAR: L CHAR: 1 }
{ CHAR: O CHAR: 0 }
} substitute ;
: parse-base32 ( seq -- base32 )
0 swap [ [ 32 * ] [ INVERSE nth + ] bi* ] each ;
PRIVATE>
: >base32-crockford ( seq -- base32 )
normalize-base32 parse-base32 ;
: base32-crockford> ( base32 -- seq )
dup 0 < [ non-negative-integer-expected ] when
[ dup 0 > ] [ 32 /mod ALPHABET nth ] "" produce-as nip
[ "0" ] when-empty reverse! ;
: >base32-crockford-checksum ( seq -- base32 )
normalize-base32 unclip-last [ parse-base32 ] dip
CHECKSUM index over 37 mod assert= ;
: base32-crockford-checksum> ( base32 -- seq )
[ base32-crockford> ] keep 37 mod CHECKSUM nth suffix ;

View File

@ -0,0 +1 @@
Douglas Crockford's Base 32 encoding/decoding

1
extra/base32/authors.txt Normal file
View File

@ -0,0 +1 @@
John Benediktsson

View File

@ -1,20 +1,24 @@
! Copyright (C) 2019 John Benediktsson ! Copyright (C) 2019 John Benediktsson
! See http://factorcode.org/license.txt for BSD license ! See http://factorcode.org/license.txt for BSD license
USING: base32 tools.test ; USING: base32 byte-arrays kernel sequences tools.test ;
{ "16J" } [ 1234 base32> ] unit-test { t } [ 256 <iota> >byte-array dup >base32 base32> = ] unit-test
{ "16JD" } [ 1234 base32-checksum> ] unit-test
{ "0" } [ 0 base32> ] unit-test
{ "00" } [ 0 base32-checksum> ] unit-test
[ -1 base32> ] must-fail
[ 1.0 base32> ] must-fail
{ 1234 } [ "16J" >base32 ] unit-test { B{ } } [ f >base32 ] unit-test
{ 1234 } [ "I6J" >base32 ] unit-test { B{ } } [ B{ } >base32 ] unit-test
{ 1234 } [ "i6J" >base32 ] unit-test { "AA======" } [ "\0" >base32 "" like ] unit-test
{ 1234 } [ "16JD" >base32-checksum ] unit-test { "ME======" } [ "a" >base32 "" like ] unit-test
{ 1234 } [ "I6JD" >base32-checksum ] unit-test { "MFRA====" } [ "ab" >base32 "" like ] unit-test
{ 1234 } [ "i6JD" >base32-checksum ] unit-test { "MFRGG===" } [ "abc" >base32 "" like ] unit-test
{ 0 } [ "0" >base32 ] unit-test { "MFRGGZA=" } [ "abcd" >base32 "" like ] unit-test
{ 0 } [ "00" >base32-checksum ] unit-test { "MFRGGZDF" } [ "abcde" >base32 "" like ] unit-test
{ B{ } } [ f base32> ] unit-test
{ B{ } } [ B{ } base32> ] unit-test
{ "\0" } [ "AA======" base32> "" like ] unit-test
{ "a" } [ "ME======" base32> "" like ] unit-test
{ "ab" } [ "MFRA====" base32> "" like ] unit-test
{ "abc" } [ "MFRGG===" base32> "" like ] unit-test
{ "abcd" } [ "MFRGGZA=" base32> "" like ] unit-test
{ "abcde" } [ "MFRGGZDF" base32> "" like ] unit-test

View File

@ -1,41 +1,77 @@
! Copyright (C) 2019 John Benediktsson ! Copyright (C) 2019 John Benediktsson
! See http://factorcode.org/license.txt for BSD license ! See http://factorcode.org/license.txt for BSD license
USING: base64.private byte-arrays combinators fry io io.binary
USING: ascii assocs kernel literals math sequences ; io.encodings.binary io.streams.byte-array kernel literals math
namespaces sequences ;
IN: base32 IN: base32
ERROR: malformed-base32 ;
! XXX: Optional map 0 as O
! XXX: Optional map 1 as L or I
! XXX: Optional handle lower-case input
<PRIVATE <PRIVATE
<< <<
CONSTANT: ALPHABET "0123456789ABCDEFGHJKMNPQRSTVWXYZ" CONSTANT: alphabet $[ "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" >byte-array ]
>> >>
CONSTANT: CHECKSUM $[ ALPHABET "*~$=U" append ]
: normalize-base32 ( seq -- seq' ) : ch>base32 ( ch -- ch )
CHAR: - swap remove >upper H{ alphabet nth ; inline
{ CHAR: I CHAR: 1 }
{ CHAR: L CHAR: 1 }
{ CHAR: O CHAR: 0 }
} substitute ;
: parse-base32 ( seq -- base32 ) : base32>ch ( ch -- ch )
0 swap [ [ 32 * ] [ ALPHABET index + ] bi* ] each ; $[ alphabet alphabet-inverse 0 CHAR: = pick set-nth ] nth
[ malformed-base32 ] unless* ; inline
: encode5 ( seq -- byte-array )
be> { -35 -30 -25 -20 -15 -10 -5 0 } '[
shift 0x1f bitand ch>base32
] with B{ } map-as ; inline
: encode-pad ( seq n -- byte-array )
[ 5 0 pad-tail encode5 ] [ B{ 0 2 4 5 7 } nth ] bi* head-slice
8 CHAR: = pad-tail ; inline
: (encode-base32) ( stream column -- )
5 pick stream-read dup length {
{ 0 [ 3drop ] }
{ 5 [ encode5 write-lines (encode-base32) ] }
[ encode-pad write-lines (encode-base32) ]
} case ;
PRIVATE> PRIVATE>
: encode-base32 ( -- )
input-stream get f (encode-base32) ;
: encode-base32-lines ( -- )
input-stream get 0 (encode-base32) ;
<PRIVATE
: decode8 ( seq -- )
[ 0 [ base32>ch swap 5 shift bitor ] reduce 5 >be ]
[ [ CHAR: = = ] count ] bi
[ write ] [ B{ 0 4 0 3 2 0 1 } nth head-slice write ] if-zero ; inline
: (decode-base32) ( stream -- )
8 "\n\r" pick read-ignoring dup length {
{ 0 [ 2drop ] }
{ 8 [ decode8 (decode-base32) ] }
[ drop 8 CHAR: = pad-tail decode8 (decode-base32) ]
} case ;
PRIVATE>
: decode-base32 ( -- )
input-stream get (decode-base32) ;
: >base32 ( seq -- base32 ) : >base32 ( seq -- base32 )
normalize-base32 parse-base32 ; binary [ binary [ encode-base32 ] with-byte-reader ] with-byte-writer ;
: base32> ( base32 -- seq ) : base32> ( base32 -- seq )
dup 0 < [ non-negative-integer-expected ] when binary [ binary [ decode-base32 ] with-byte-reader ] with-byte-writer ;
[ dup 0 > ] [
32 /mod ALPHABET nth
] "" produce-as nip [ "0" ] when-empty reverse! ;
: >base32-checksum ( seq -- base32 ) : >base32-lines ( seq -- base32 )
normalize-base32 unclip-last [ parse-base32 ] dip binary [ binary [ encode-base32-lines ] with-byte-reader ] with-byte-writer ;
CHECKSUM index over 37 mod assert= ;
: base32-checksum> ( base32 -- seq )
[ base32> ] keep 37 mod CHECKSUM nth suffix ;

View File

@ -1 +1 @@
Douglas Crockford's Base 32 encoding/decoding Base 32 encoding/decoding (RFC 3548)

View File

@ -1,7 +1,6 @@
USING: base85 kernel strings tools.test ; USING: base85 byte-arrays kernel sequences strings tools.test ;
{ t } [ "Hello, world" dup >base85 base85> >string = ] unit-test { t } [ 256 <iota> >byte-array dup >base85 base85> = ] unit-test
{ t } [ "ready" dup >base85 base85> >string = ] unit-test
{ "NM!" } [ "He" >base85 >string ] unit-test { "NM!" } [ "He" >base85 >string ] unit-test
{ t } [ "He" dup >base85 base85> >string = ] unit-test { t } [ "He" dup >base85 base85> >string = ] unit-test

View File

@ -1,6 +1,6 @@
! Copyright (C) 2013 John Benediktsson. ! Copyright (C) 2013 John Benediktsson.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: base64.private combinators io io.binary USING: base64.private byte-arrays combinators io io.binary
io.encodings.binary io.streams.byte-array kernel literals math io.encodings.binary io.streams.byte-array kernel literals math
namespaces sequences ; namespaces sequences ;
IN: base85 IN: base85
@ -10,9 +10,12 @@ ERROR: malformed-base85 ;
<PRIVATE <PRIVATE
<< <<
CONSTANT: alphabet CONSTANT: alphabet $[
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~" "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"
>byte-array
]
>> >>
: ch>base85 ( ch -- ch ) : ch>base85 ( ch -- ch )
alphabet nth ; inline alphabet nth ; inline

1
extra/base91/authors.txt Normal file
View File

@ -0,0 +1 @@
John Benediktsson

View File

@ -0,0 +1,23 @@
USING: base91 byte-arrays kernel sequences tools.test ;
{ t } [ 256 <iota> >byte-array dup >base91 base91> = ] unit-test
{ B{ } } [ f >base91 ] unit-test
{ "AA" } [ B{ 0 } >base91 "" like ] unit-test
{ "GB" } [ "a" >base91 "" like ] unit-test
{ "#GD" } [ "ab" >base91 "" like ] unit-test
{ "#G(I" } [ "abc" >base91 "" like ] unit-test
{ "#G(IZ" } [ "abcd" >base91 "" like ] unit-test
{ "#G(Ic,A" } [ "abcde" >base91 "" like ] unit-test
{ "#G(Ic,WC" } [ "abcdef" >base91 "" like ] unit-test
{ "#G(Ic,5pG" } [ "abcdefg" >base91 "" like ] unit-test
{ B{ } } [ f base91> ] unit-test
{ "\0" } [ "AA" base91> "" like ] unit-test
{ "a" } [ "GB" base91> "" like ] unit-test
{ "ab" } [ "#GD" base91> "" like ] unit-test
{ "abc" } [ "#G(I" base91> "" like ] unit-test
{ "abcd" } [ "#G(IZ" base91> "" like ] unit-test
{ "abcde" } [ "#G(Ic,A" base91> "" like ] unit-test
{ "abcdef" } [ "#G(Ic,WC" base91> "" like ] unit-test
{ "abcdefg" } [ "#G(Ic,5pG" base91> "" like ] unit-test

View File

@ -0,0 +1,83 @@
! Copyright (C) 2019 John Benediktsson.
! See http://factorcode.org/license.txt for BSD license.
USING: base64.private byte-arrays kernel literals locals math
sequences ;
IN: base91
ERROR: malformed-base91 ;
<PRIVATE
<<
CONSTANT: alphabet $[
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~\""
>byte-array
]
>>
: ch>base91 ( ch -- ch )
alphabet nth ; inline
: base91>ch ( ch -- ch )
$[ alphabet alphabet-inverse ] nth
[ malformed-base91 ] unless* ; inline
PRIVATE>
:: >base91 ( seq -- base91 )
0 :> b!
0 :> n!
BV{ } clone :> accum
seq [
n shift b bitor b!
n 8 + n!
n 13 > [
b 0x1fff bitand dup 88 > [
b -13 shift b!
n 13 - n!
] [
drop b 0x3fff bitand
b -14 shift b!
n 14 - n!
] if 91 /mod swap [ ch>base91 accum push ] bi@
] when
] each
n 0 > [
b 91 mod ch>base91 accum push
n 7 > b 90 > or [
b 91 /i ch>base91 accum push
] when
] when
accum B{ } like ;
:: base91> ( base91 -- seq )
f :> v!
0 :> b!
0 :> n!
BV{ } clone :> accum
base91 [
base91>ch
v [
91 * v + v!
v n shift b bitor b!
v 0x1fff bitand 88 > 13 14 ? n + n!
[ n 7 > ] [
b 0xff bitand accum push
b -8 shift b!
n 8 - n!
] do while
f v!
] [
v!
] if
] each
v [
b v n shift bitor 0xff bitand accum push
] when
accum B{ } like ;

1
extra/base91/summary.txt Normal file
View File

@ -0,0 +1 @@
Base91 encoding/decoding

View File

@ -24,26 +24,10 @@ $nl
169 74 143 229 204 177 155 166 28 76 8 115 211 145 233 169 74 143 229 204 177 155 166 28 76 8 115 211 145 233
135 152 47 187 211 135 152 47 187 211
} }
}" } }"
$nl
{ $example "USING: checksums checksums.common checksums.md5 "
"checksums.multi checksums.sha io io.encodings.binary namespaces ;"
"\"resource:LICENSE.txt\" binary ["
" input-stream get { md5 sha1 } <multi-checksum> checksum-stream"
"] with-file-reader ."
"{
B{
220 158 207 218 50 163 198 36 234 90 122 65 197 14 224
16
} }
B{
132 132 148 224 101 202 198 114 38 53 127 18 70 170 108
53 25 255 174 207
}
}" }
} ; } ;
HELP: <multi-checksum> HELP: <multi-checksum>
{ $values { $values
{ "checksums" sequence } { "checksums" sequence }

View File

@ -1,12 +1,14 @@
! Copyright (C) 2018 Alexander Ilin. ! Copyright (C) 2018 Alexander Ilin.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: byte-arrays checksums checksums.md5 checksums.multi USING: byte-arrays checksums checksums.md5 checksums.multi
checksums.sha io io.encodings.binary io.files namespaces tools.test ; checksums.sha tools.test ;
IN: checksums.multi.tests IN: checksums.multi.tests
{ {
{ {
B{ 9 143 107 205 70 33 211 115 202 222 78 131 38 39 180 246 } B{
9 143 107 205 70 33 211 115 202 222 78 131 38 39 180 246
}
B{ B{
169 74 143 229 204 177 155 166 28 76 8 115 211 145 233 169 74 143 229 204 177 155 166 28 76 8 115 211 145 233
135 152 47 187 211 135 152 47 187 211
@ -15,17 +17,3 @@ IN: checksums.multi.tests
} [ } [
"test" >byte-array { md5 sha1 } <multi-checksum> checksum-bytes "test" >byte-array { md5 sha1 } <multi-checksum> checksum-bytes
] unit-test ] unit-test
{
{
B{ 220 158 207 218 50 163 198 36 234 90 122 65 197 14 224 16 }
B{
132 132 148 224 101 202 198 114 38 53 127 18 70 170 108
53 25 255 174 207
}
}
} [
"resource:LICENSE.txt" binary [
input-stream get { md5 sha1 } <multi-checksum> checksum-stream
] with-file-reader
] unit-test

View File

@ -1,22 +1,145 @@
USING: calendar crontab kernel tools.test ; USING: calendar calendar.format crontab kernel math.order
sequences tools.test ;
{ IN: crontab.tests
T{ timestamp
{ year 2018 } { +lt+ } [
{ month 3 } now "*/1 * * * *" parse-cronentry next-time <=>
{ day 9 }
{ hour 12 }
{ minute 23 }
{ gmt-offset T{ duration { hour -8 } } }
}
} [
"23 0-20/2 * * *" parse-cronentry
T{ timestamp
{ year 2018 }
{ month 3 }
{ day 9 }
{ hour 12 }
{ minute 6 }
{ gmt-offset T{ duration { hour -8 } } }
} [ next-time-after ] keep
] unit-test ] unit-test
[ "0 0 30 2 *" parse-cronentry ] [ invalid-cronentry? ] must-fail-with
[ "0 0 31 4 *" parse-cronentry ] [ invalid-cronentry? ] must-fail-with
CONSTANT: start-timestamp T{ timestamp
{ year 2019 }
{ month 3 }
{ day 23 }
{ hour 14 }
{ second 16+4353/8000 }
{ gmt-offset T{ duration { hour -7 } } }
}
: next-few-times ( pattern -- timestamps )
parse-cronentry 5 start-timestamp next-times-after
[ timestamp>rfc822 ] map ;
! At 04:05.
{
{
"Sun, 24 Mar 2019 04:05:00 -0700"
"Mon, 25 Mar 2019 04:05:00 -0700"
"Tue, 26 Mar 2019 04:05:00 -0700"
"Wed, 27 Mar 2019 04:05:00 -0700"
"Thu, 28 Mar 2019 04:05:00 -0700"
}
} [ "5 4 * * *" next-few-times ] unit-test
! At 00:05 in August.
{
{
"Thu, 1 Aug 2019 00:05:00 -0700"
"Fri, 2 Aug 2019 00:05:00 -0700"
"Sat, 3 Aug 2019 00:05:00 -0700"
"Sun, 4 Aug 2019 00:05:00 -0700"
"Mon, 5 Aug 2019 00:05:00 -0700"
}
} [ "5 0 * 8 *" next-few-times ] unit-test
! At 14:15 on day-of-month 1.
{
{
"Mon, 1 Apr 2019 14:15:00 -0700"
"Wed, 1 May 2019 14:15:00 -0700"
"Sat, 1 Jun 2019 14:15:00 -0700"
"Mon, 1 Jul 2019 14:15:00 -0700"
"Thu, 1 Aug 2019 14:15:00 -0700"
}
} [ "15 14 1 * *" next-few-times ] unit-test
! At 22:00 on every day-of-week from Monday through Friday.
{
{
"Mon, 25 Mar 2019 22:00:00 -0700"
"Tue, 26 Mar 2019 22:00:00 -0700"
"Wed, 27 Mar 2019 22:00:00 -0700"
"Thu, 28 Mar 2019 22:00:00 -0700"
"Fri, 29 Mar 2019 22:00:00 -0700"
}
} [ "0 22 * * 1-5" next-few-times ] unit-test
! At minute 23 past every 2nd hour from 0 through 20.
{
{
"Sat, 23 Mar 2019 14:23:00 -0700"
"Sat, 23 Mar 2019 16:23:00 -0700"
"Sat, 23 Mar 2019 18:23:00 -0700"
"Sat, 23 Mar 2019 20:23:00 -0700"
"Sun, 24 Mar 2019 00:23:00 -0700"
}
} [ "23 0-20/2 * * *" next-few-times ] unit-test
! At 04:05 on Sunday.
{
{
"Sun, 24 Mar 2019 04:05:00 -0700"
"Sun, 31 Mar 2019 04:05:00 -0700"
"Sun, 7 Apr 2019 04:05:00 -0700"
"Sun, 14 Apr 2019 04:05:00 -0700"
"Sun, 21 Apr 2019 04:05:00 -0700"
}
} [ "5 4 * * sun" next-few-times ] unit-test
! At minute 0 past hour 0 and 12 on day-of-month 1 in every 2nd month.
{
{
"Wed, 1 May 2019 00:00:00 -0700"
"Wed, 1 May 2019 12:00:00 -0700"
"Mon, 1 Jul 2019 00:00:00 -0700"
"Mon, 1 Jul 2019 12:00:00 -0700"
"Sun, 1 Sep 2019 00:00:00 -0700"
}
} [ "0 0,12 1 */2 *" next-few-times ] unit-test
! At 04:00 on every day-of-month from 8 through 14.
{
{
"Mon, 8 Apr 2019 04:00:00 -0700"
"Tue, 9 Apr 2019 04:00:00 -0700"
"Wed, 10 Apr 2019 04:00:00 -0700"
"Thu, 11 Apr 2019 04:00:00 -0700"
"Fri, 12 Apr 2019 04:00:00 -0700"
}
} [ "0 4 8-14 * *" next-few-times ] unit-test
! At 00:00 on day-of-month 1 and 15 and on Wednesday.
{
{
"Wed, 27 Mar 2019 00:00:00 -0700"
"Mon, 1 Apr 2019 00:00:00 -0700"
"Wed, 3 Apr 2019 00:00:00 -0700"
"Wed, 10 Apr 2019 00:00:00 -0700"
"Mon, 15 Apr 2019 00:00:00 -0700"
}
} [ "0 0 1,15 * 3" next-few-times ] unit-test
! At 00:00 on Sunday.
{
{
"Sun, 24 Mar 2019 00:00:00 -0700"
"Sun, 31 Mar 2019 00:00:00 -0700"
"Sun, 7 Apr 2019 00:00:00 -0700"
"Sun, 14 Apr 2019 00:00:00 -0700"
"Sun, 21 Apr 2019 00:00:00 -0700"
}
} [ "@weekly" next-few-times ] unit-test
! At 00:00 on day-of-month 29 in February.
{
{
"Sat, 29 Feb 2020 00:00:00 -0700"
"Thu, 29 Feb 2024 00:00:00 -0700"
"Tue, 29 Feb 2028 00:00:00 -0700"
"Sun, 29 Feb 2032 00:00:00 -0700"
"Fri, 29 Feb 2036 00:00:00 -0700"
}
} [ "0 0 29 2 *" next-few-times ] unit-test

View File

@ -2,11 +2,14 @@
! See http://factorcode.org/license.txt for BSD license ! See http://factorcode.org/license.txt for BSD license
USING: accessors arrays ascii assocs calendar calendar.english USING: accessors arrays ascii assocs calendar calendar.english
calendar.private combinators io kernel literals locals math calendar.private combinators combinators.short-circuit io kernel
math.order math.parser math.ranges sequences splitting ; literals locals math math.order math.parser math.ranges
sequences splitting ;
IN: crontab IN: crontab
ERROR: invalid-cronentry value ;
:: parse-value ( value quot: ( value -- value' ) seq -- value ) :: parse-value ( value quot: ( value -- value' ) seq -- value )
value { value {
{ [ ch', over member? ] [ { [ ch', over member? ] [
@ -42,63 +45,92 @@ CONSTANT: aliases H{
{ "@hourly" "0 * * * *" } { "@hourly" "0 * * * *" }
} }
: check-cronentry ( cronentry -- cronentry )
dup {
[ days-of-week>> [ 0 6 between? ] all? ]
[ months>> [ 1 12 between? ] all? ]
[
[ days>> 1 ] [ months>> ] bi [
{ 0 31 29 31 30 31 30 31 31 30 31 30 31 } nth
] map supremum [ between? ] 2curry all?
]
[ minutes>> [ 0 59 between? ] all? ]
[ hours>> [ 0 23 between? ] all? ]
} 1&& [ invalid-cronentry ] unless ;
: parse-cronentry ( entry -- cronentry ) : parse-cronentry ( entry -- cronentry )
" " split1 [ aliases ?at drop ] dip " " glue " " split1 [ aliases ?at drop ] dip " " glue
" " split1 " " split1 " " split1 " " split1 " " split1 { " " split1 " " split1 " " split1 " " split1 " " split1 {
[ [ string>number ] T{ range f 0 60 1 } parse-value ] [ [ string>number ] T{ range f 0 60 1 } parse-value ]
[ [ string>number ] T{ range f 0 24 1 } parse-value ] [ [ string>number ] T{ range f 0 24 1 } parse-value ]
[ [ string>number ] T{ range f 0 31 1 } parse-value ] [ [ string>number ] T{ range f 1 31 1 } parse-value ]
[ [ parse-month ] T{ range f 0 12 1 } parse-value ] [ [ parse-month ] T{ range f 1 12 1 } parse-value ]
[ [ parse-day ] T{ range f 0 7 1 } parse-value ] [ [ parse-day ] T{ range f 0 7 1 } parse-value ]
[ ] [ ]
} spread cronentry boa ; } spread cronentry boa check-cronentry ;
:: next-time-after ( cronentry timestamp -- ) <PRIVATE
:: (next-time-after) ( cronentry timestamp -- )
f ! should we keep searching for a matching time
timestamp month>> :> month timestamp month>> :> month
cronentry months>> [ month >= ] find nip [ cronentry months>> [ month >= ] find nip
dup month = [ drop f ] [ timestamp month<< t ] if dup month = [ drop ] [
] [ [ cronentry months>> first timestamp 1 +year drop ] unless*
timestamp cronentry months>> first >>month 1 +year timestamp 1 >>day 0 >>hour 0 >>minute month<< drop t
] if* [ cronentry timestamp next-time-after ] when
timestamp hour>> :> hour
cronentry hours>> [ hour >= ] find nip [
dup hour = [ drop f ] [
timestamp hour<< 0 timestamp minute<< t
] if ] if
] [
timestamp cronentry hours>> first >>hour 1 +day
] if* [ cronentry timestamp next-time-after ] when
timestamp minute>> :> minute
cronentry minutes>> [ minute >= ] find nip [
dup minute = [ drop f ] [ timestamp minute<< t ] if
] [
timestamp cronentry minutes>> first >>minute 1 +hour
] if* [ cronentry timestamp next-time-after ] when
timestamp day-of-week :> weekday timestamp day-of-week :> weekday
cronentry days-of-week>> [ weekday >= ] find nip [ cronentry days-of-week>> [ weekday >= ] find nip [
cronentry days-of-week>> first 7 + cronentry days-of-week>> first 7 +
] unless* weekday - ] unless* weekday - :> days-to-weekday
timestamp day>> :> day timestamp day>> :> day
cronentry days>> [ day >= ] find nip [ cronentry days>> [ day >= ] find nip [
day - cronentry days>> first timestamp days-in-month +
] [ ] unless* day - :> days-to-day
timestamp 1 months time+
cronentry days>> first >>day
day-of-year timestamp day-of-year -
] if*
min [ cronentry days-of-week>> T{ range f 0 7 1 } =
timestamp swap +day drop cronentry days>> T{ range f 1 31 1 } = 2array
cronentry timestamp next-time-after {
] unless-zero ; { { f t } [ days-to-weekday ] }
{ { t f } [ days-to-day ] }
[ drop days-to-weekday days-to-day min ]
} case [
timestamp 0 >>hour 0 >>minute swap +day 2drop t
] unless-zero
timestamp hour>> :> hour
cronentry hours>> [ hour >= ] find nip
dup hour = [ drop ] [
[ cronentry hours>> first timestamp 1 +day drop ] unless*
timestamp 0 >>minute hour<< drop t
] if
timestamp minute>> :> minute
cronentry minutes>> [ minute >= ] find nip
dup minute = [ drop ] [
[ cronentry minutes>> first timestamp 1 +hour drop ] unless*
timestamp minute<< drop t
] if
[ cronentry timestamp (next-time-after) ] when ;
PRIVATE>
: next-time-after ( cronentry timestamp -- timestamp )
1 minutes time+ 0 >>second [ (next-time-after) ] keep ;
: next-time ( cronentry -- timestamp ) : next-time ( cronentry -- timestamp )
now 0 >>second [ next-time-after ] keep ; now next-time-after ;
: parse-crontab ( -- entries ) : next-times-after ( cronentry n timestamp -- timestamps )
lines [ [ f ] [ parse-cronentry ] if-empty ] map harvest ; swap [ dupd next-time-after dup ] replicate 2nip ;
: next-times ( cronentry n -- timestamps )
now next-times-after ;
: read-crontab ( -- entries )
lines harvest [ parse-cronentry ] map ;

View File

@ -0,0 +1,16 @@
USING: tools.deploy.config ;
H{
{ deploy-console? f }
{ deploy-io 3 }
{ deploy-reflection 5 }
{ deploy-ui? t }
{ deploy-word-defs? f }
{ deploy-threads? t }
{ "stop-after-last-window?" t }
{ deploy-math? t }
{ deploy-word-props? f }
{ deploy-c-types? f }
{ deploy-help? f }
{ deploy-name "Game of Life" }
{ deploy-unicode? f }
}

View File

@ -0,0 +1 @@
John Benediktsson

View File

@ -0,0 +1,10 @@
USING: geohash tools.test ;
{ "tuvz4p141zc1" } [ 27.988056 86.925278 >geohash ] unit-test
{ 27.9880559630692 86.92527785897255 } [ "tuvz4p141zc1" geohash> ] unit-test
{ "u4pruydqqvj8" } [ 57.64911 10.40744 >geohash ] unit-test
{ 57.48046875 10.1953125 } [ "u4pr" geohash> ] unit-test

View File

@ -0,0 +1,60 @@
! Copyright (C) 2019 John Benediktsson
! See http://factorcode.org/license.txt for BSD license
USING: byte-arrays fry kernel literals math math.bitwise
sequences ;
IN: geohash
<PRIVATE
: quantize ( lat lon -- lat' lon' )
[ 90.0 + 180.0 / ] [ 180.0 + 360.0 / ] bi*
[ 32 2^ * >integer 32 bits ] bi@ ;
: spread-bits ( m -- n )
dup 16 shift bitor 0x0000ffff0000ffff bitand
dup 8 shift bitor 0x00ff00ff00ff00ff bitand
dup 4 shift bitor 0x0f0f0f0f0f0f0f0f bitand
dup 2 shift bitor 0x3333333333333333 bitand
dup 1 shift bitor 0x5555555555555555 bitand ;
: interleave-bits ( x y -- z )
[ spread-bits ] bi@ 1 shift bitor ;
: dequantize ( lat lon -- lat' lon' )
[ 32 2^ /f ] bi@ [ 180.0 * 90 - ] [ 360.0 * 180.0 - ] bi* ;
: squash-bits ( m -- n )
0x5555555555555555 bitand
dup -1 shift bitor 0x3333333333333333 bitand
dup -2 shift bitor 0x0f0f0f0f0f0f0f0f bitand
dup -4 shift bitor 0x00ff00ff00ff00ff bitand
dup -8 shift bitor 0x0000ffff0000ffff bitand
dup -16 shift bitor 0x00000000ffffffff bitand ;
: deinterleave-bits ( z -- x y )
dup -1 shift [ squash-bits ] bi@ ;
<<
CONSTANT: base32-alphabet $[ "0123456789bcdefghjkmnpqrstuvwxyz" >byte-array ]
>>
CONSTANT: base32-inverse $[ 256 [ base32-alphabet index 0xff or ] B{ } map-integers ]
: base32-encode ( x -- str )
-59 12 [
dupd [ shift 5 bits base32-alphabet nth ] keep 5 + swap
] "" replicate-as 2nip ;
: base32-decode ( str -- x )
[ 0 59 ] dip [
base32-inverse nth swap [ shift bitor ] keep 5 -
] each drop ;
PRIVATE>
: >geohash ( lat lon -- geohash )
quantize interleave-bits base32-encode ;
: geohash> ( geohash -- lat lon )
base32-decode deinterleave-bits dequantize ;

View File

@ -0,0 +1 @@
Geohash geocoding system.

View File

@ -0,0 +1 @@
John Benediktsson

View File

@ -0,0 +1,18 @@
! Copyright (C) 2011 John Benediktsson
! See http://factorcode.org/license.txt for BSD license
USING: accessors assocs classes.tuple formatting http.client
images.http json.reader kernel sequences strings ;
IN: gravatar
TUPLE: info aboutMe accounts currentLocation displayName emails
hash id ims name phoneNumbers photos preferredUsername
profileBackground profileUrl requestHash thumbnailUrl urls ;
: gravatar-info ( gravatar-id -- info )
"http://gravatar.com/%s.json" sprintf http-get nip
>string json> "entry" of first info from-slots ;
: gravatar. ( gravatar-id -- )
gravatar-info thumbnailUrl>> http-image. ;

View File

@ -0,0 +1 @@
Wrapper for the Gravatar service.

View File

@ -283,11 +283,11 @@ CONSTANT: sky H{
CONSTANT: re-timestamp R[[\d{6}Z]] CONSTANT: re-timestamp R[[\d{6}Z]]
CONSTANT: re-station R[[\w{4}]] CONSTANT: re-station R[[\w{4}]]
CONSTANT: re-temperature R[[[M]?\d{2}\\/([M]?\d{2})?]] CONSTANT: re-temperature R[[[M]?\d{2}\/([M]?\d{2})?]]
CONSTANT: re-wind R[[(VRB|\d{3})\d{2,3}(G\d{2,3})?KT]] CONSTANT: re-wind R[[(VRB|\d{3})\d{2,3}(G\d{2,3})?KT]]
CONSTANT: re-wind-variable R[[\d{3}V\d{3}]] CONSTANT: re-wind-variable R[[\d{3}V\d{3}]]
CONSTANT: re-visibility R[[[MP]?\d+(\\/\d+)?SM]] CONSTANT: re-visibility R[[[MP]?\d+(\/\d+)?SM]]
CONSTANT: re-rvr R[[R\d{2}[RLC]?\\/\d{4}(V\d{4})?FT]] CONSTANT: re-rvr R[[R\d{2}[RLC]?\/\d{4}(V\d{4})?FT]]
CONSTANT: re-weather R[[[+-]?(VC)?(\w{2}|\w{4})]] CONSTANT: re-weather R[[[+-]?(VC)?(\w{2}|\w{4})]]
CONSTANT: re-sky-condition R[[(\w{2,3}\d{3}(\w+)?|\w{3}|CAVOK)]] CONSTANT: re-sky-condition R[[(\w{2,3}\d{3}(\w+)?|\w{3}|CAVOK)]]
CONSTANT: re-altimeter R[[[AQ]\d{4}]] CONSTANT: re-altimeter R[[[AQ]\d{4}]]
@ -519,23 +519,23 @@ CONSTANT: re-recent-weather R[[((\w{2})?[BE]\d{2,4}((\w{2})?[BE]\d{2,4})?)+]]
{ [ dup R[[1\d{4}]] matches? ] [ parse-6hr-max-temp ] } { [ dup R[[1\d{4}]] matches? ] [ parse-6hr-max-temp ] }
{ [ dup R[[2\d{4}]] matches? ] [ parse-6hr-min-temp ] } { [ dup R[[2\d{4}]] matches? ] [ parse-6hr-min-temp ] }
{ [ dup R[[4\d{8}]] matches? ] [ parse-24hr-temp ] } { [ dup R[[4\d{8}]] matches? ] [ parse-24hr-temp ] }
{ [ dup R[[4\\/\d{3}]] matches? ] [ parse-snow-depth ] } { [ dup R[[4\/\d{3}]] matches? ] [ parse-snow-depth ] }
{ [ dup R[[5\d{4}]] matches? ] [ parse-1hr-pressure ] } { [ dup R[[5\d{4}]] matches? ] [ parse-1hr-pressure ] }
{ [ dup R[[6[\d\\/]{4}]] matches? ] [ parse-6hr-precipitation ] } { [ dup R[[6[\d\/]{4}]] matches? ] [ parse-6hr-precipitation ] }
{ [ dup R[[7\d{4}]] matches? ] [ parse-24hr-precipitation ] } { [ dup R[[7\d{4}]] matches? ] [ parse-24hr-precipitation ] }
{ [ dup R[[8\\/\d{3}]] matches? ] [ parse-cloud-cover ] } { [ dup R[[8\/\d{3}]] matches? ] [ parse-cloud-cover ] }
{ [ dup R[[931\d{3}]] matches? ] [ parse-6hr-snowfall ] } { [ dup R[[931\d{3}]] matches? ] [ parse-6hr-snowfall ] }
{ [ dup R[[933\d{3}]] matches? ] [ parse-water-equivalent-snow ] } { [ dup R[[933\d{3}]] matches? ] [ parse-water-equivalent-snow ] }
{ [ dup R[[98\d{3}]] matches? ] [ parse-duration-of-sunshine ] } { [ dup R[[98\d{3}]] matches? ] [ parse-duration-of-sunshine ] }
{ [ dup R[[T\d{4,8}]] matches? ] [ parse-1hr-temp ] } { [ dup R[[T\d{4,8}]] matches? ] [ parse-1hr-temp ] }
{ [ dup R[[\d{3}\d{2,3}\\/\d{2,4}]] matches? ] [ parse-peak-wind ] } { [ dup R[[\d{3}\d{2,3}\/\d{2,4}]] matches? ] [ parse-peak-wind ] }
{ [ dup R[[P\d{4}]] matches? ] [ parse-1hr-precipitation ] } { [ dup R[[P\d{4}]] matches? ] [ parse-1hr-precipitation ] }
{ [ dup R[[SLP\d{3}]] matches? ] [ parse-sea-level-pressure ] } { [ dup R[[SLP\d{3}]] matches? ] [ parse-sea-level-pressure ] }
{ [ dup R[[LTG\w+]] matches? ] [ parse-lightning ] } { [ dup R[[LTG\w+]] matches? ] [ parse-lightning ] }
{ [ dup R[[PROB\d+]] matches? ] [ parse-probability ] } { [ dup R[[PROB\d+]] matches? ] [ parse-probability ] }
{ [ dup R[[\d{3}V\d{3}]] matches? ] [ parse-varying ] } { [ dup R[[\d{3}V\d{3}]] matches? ] [ parse-varying ] }
{ [ dup R[[[^-]+(-[^-]+)+]] matches? ] [ parse-from-to ] } { [ dup R[[[^-]+(-[^-]+)+]] matches? ] [ parse-from-to ] }
{ [ dup R[[[^\\/]+(\\/[^\\/]+)+]] matches? ] [ ] } { [ dup R[[[^\/]+(\/[^\/]+)+]] matches? ] [ ] }
{ [ dup R[[\d+.\d+]] matches? ] [ ] } { [ dup R[[\d+.\d+]] matches? ] [ ] }
{ [ dup re-recent-weather matches? ] [ parse-recent-weather ] } { [ dup re-recent-weather matches? ] [ parse-recent-weather ] }
{ [ dup re-weather matches? ] [ parse-weather ] } { [ dup re-weather matches? ] [ parse-weather ] }

View File

@ -0,0 +1,18 @@
! Copyright (C) 2019 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: tools.test resolv-conf ;
IN: resolv-conf.tests
{
T{ resolv.conf
{ nameserver V{ "127.0.0.53" } }
{ domain V{ } }
{ lookup V{ } }
{ search V{ "localdomain" } }
{ sortlist V{ } }
{ options T{ options { edns0? t } } }
}
} [
"nameserver 127.0.0.53
options edns0
search localdomain" string>resolv.conf
] unit-test

View File

@ -68,6 +68,7 @@ ERROR: unsupported-resolv.conf-option string ;
{ [ "rotate" ?head ] [ drop t >>rotate? ] } { [ "rotate" ?head ] [ drop t >>rotate? ] }
{ [ "no-check-names" ?head ] [ drop t >>no-check-names? ] } { [ "no-check-names" ?head ] [ drop t >>no-check-names? ] }
{ [ "inet6" ?head ] [ drop t >>inet6? ] } { [ "inet6" ?head ] [ drop t >>inet6? ] }
{ [ "edns0" ?head ] [ drop t >>edns0? ] }
[ unsupported-resolv.conf-option ] [ unsupported-resolv.conf-option ]
} cond drop ; } cond drop ;
@ -86,12 +87,17 @@ ERROR: unsupported-resolv.conf-line string ;
PRIVATE> PRIVATE>
: parse-resolve.conf ( path -- resolv.conf ) : lines>resolv.conf ( lines -- resolv.conf )
[ <resolv.conf> ] dip [ <resolv.conf> ] dip
utf8 file-lines
[ [ blank? ] trim ] map harvest [ [ blank? ] trim ] map harvest
[ "#" head? ] reject [ "#" head? ] reject
[ parse-resolv.conf-line ] each ; [ parse-resolv.conf-line ] each ;
: string>resolv.conf ( string -- resolv.conf )
string-lines lines>resolv.conf ;
: path>resolv.conf ( path -- resolv.conf )
utf8 file-lines lines>resolv.conf ;
: default-resolv.conf ( -- resolv.conf ) : default-resolv.conf ( -- resolv.conf )
"/etc/resolv.conf" parse-resolve.conf ; "/etc/resolv.conf" path>resolv.conf ;

View File

@ -13,7 +13,7 @@ IN: xkcd
: comic-image ( url -- image ) : comic-image ( url -- image )
http-get nip http-get nip
R/ \/\/imgs\.xkcd\.com\\/comics\\/[^\.]+\.(png|jpg)/ R/ \/\/imgs\.xkcd\.com\/comics\/[^\.]+\.(png|jpg)/
first-match >string "http:" prepend load-http-image ; first-match >string "http:" prepend load-http-image ;
: comic-image. ( url -- ) : comic-image. ( url -- )

View File

@ -1144,10 +1144,20 @@ Zone Indian/Reunion 3:41:52 - LMT 1911 Jun # Saint-Denis
# the switch is from 01:00 to 02:00 ... [Decree No. 25/2017] # the switch is from 01:00 to 02:00 ... [Decree No. 25/2017]
# http://www.mnec.gov.st/index.php/publicacoes/documentos/file/90-decreto-lei-n-25-2017 # http://www.mnec.gov.st/index.php/publicacoes/documentos/file/90-decreto-lei-n-25-2017
# From Vadim Nasardinov (2018-12-29):
# São Tomé and Príncipe is about to do the following on Jan 1, 2019:
# https://www.stp-press.st/2018/12/05/governo-jesus-ja-decidiu-repor-hora-legal-sao-tomense/
#
# From Michael Deckers (2018-12-30):
# https://www.legis-palop.org/download.jsp?idFile=102818
# ... [The legal time of the country, which coincides with universal
# coordinated time, will be restituted at 2 o'clock on day 1 of January, 2019.]
Zone Africa/Sao_Tome 0:26:56 - LMT 1884 Zone Africa/Sao_Tome 0:26:56 - LMT 1884
-0:36:45 - LMT 1912 Jan 1 00:00u # Lisbon MT -0:36:45 - LMT 1912 Jan 1 00:00u # Lisbon MT
0:00 - GMT 2018 Jan 1 01:00 0:00 - GMT 2018 Jan 1 01:00
1:00 - WAT 1:00 - WAT 2019 Jan 1 02:00
0:00 - GMT
# Senegal # Senegal
# See Africa/Abidjan. # See Africa/Abidjan.

173
extra/zoneinfo/calendars Normal file
View File

@ -0,0 +1,173 @@
----- Calendrical issues -----
As mentioned in Theory.html, although calendrical issues are out of
scope for tzdb, they indicate the sort of problems that we would run
into if we extended tzdb further into the past. The following
information and sources go beyond Theory.html's brief discussion.
They sometimes disagree.
France
Gregorian calendar adopted 1582-12-20.
French Revolutionary calendar used 1793-11-24 through 1805-12-31,
and (in Paris only) 1871-05-06 through 1871-05-23.
Russia
From Chris Carrier (1996-12-02):
On 1929-10-01 the Soviet Union instituted an "Eternal Calendar"
with 30-day months plus 5 holidays, with a 5-day week.
On 1931-12-01 it changed to a 6-day week; in 1934 it reverted to the
Gregorian calendar while retaining the 6-day week; on 1940-06-27 it
reverted to the 7-day week. With the 6-day week the usual days
off were the 6th, 12th, 18th, 24th and 30th of the month.
(Source: Evitiar Zerubavel, _The Seven Day Circle_)
Mark Brader reported a similar story in "The Book of Calendars", edited
by Frank Parise (1982, Facts on File, ISBN 0-8719-6467-8), page 377. But:
From: Petteri Sulonen (via Usenet)
Date: 14 Jan 1999 00:00:00 GMT
...
If your source is correct, how come documents between 1929 and 1940 were
still dated using the conventional, Gregorian calendar?
I can post a scan of a document dated December 1, 1934, signed by
Yenukidze, the secretary, on behalf of Kalinin, the President of the
Executive Committee of the Supreme Soviet, if you like.
Sweden (and Finland)
From: Mark Brader
Subject: Re: Gregorian reform - a part of locale?
<news:1996Jul6.012937.29190@sq.com>
Date: 1996-07-06
In 1700, Denmark made the transition from Julian to Gregorian. Sweden
decided to *start* a transition in 1700 as well, but rather than have one of
those unsightly calendar gaps :-), they simply decreed that the next leap
year after 1696 would be in 1744 - putting the whole country on a calendar
different from both Julian and Gregorian for a period of 40 years.
However, in 1704 something went wrong and the plan was not carried through;
they did, after all, have a leap year that year. And one in 1708. In 1712
they gave it up and went back to Julian, putting 30 days in February that
year!...
Then in 1753, Sweden made the transition to Gregorian in the usual manner,
getting there only 13 years behind the original schedule.
(A previous posting of this story was challenged, and Swedish readers
produced the following references to support it: "Tideräkning och historia"
by Natanael Beckman (1924) and "Tid, en bok om tideräkning och
kalenderväsen" by Lars-Olof Lodén (1968).
Grotefend's data
From: "Michael Palmer" [with one obvious typo fixed]
Subject: Re: Gregorian Calendar (was Re: Another FHC related question
Newsgroups: soc.genealogy.german
Date: Tue, 9 Feb 1999 02:32:48 -800
...
The following is a(n incomplete) listing, arranged chronologically, of
European states, with the date they converted from the Julian to the
Gregorian calendar:
04/15 Oct 1582 - Italy (with exceptions), Spain, Portugal, Poland (Roman
Catholics and Danzig only)
09/20 Dec 1582 - France, Lorraine
21 Dec 1582/
01 Jan 1583 - Holland, Brabant, Flanders, Hennegau
10/21 Feb 1583 - bishopric of Liege (Lüttich)
13/24 Feb 1583 - bishopric of Augsburg
04/15 Oct 1583 - electorate of Trier
05/16 Oct 1583 - Bavaria, bishoprics of Freising, Eichstedt, Regensburg,
Salzburg, Brixen
13/24 Oct 1583 - Austrian Oberelsaß and Breisgau
20/31 Oct 1583 - bishopric of Basel
02/13 Nov 1583 - duchy of Jülich-Berg
02/13 Nov 1583 - electorate and city of Köln
04/15 Nov 1583 - bishopric of Würzburg
11/22 Nov 1583 - electorate of Mainz
16/27 Nov 1583 - bishopric of Strassburg and the margraviate of Baden
17/28 Nov 1583 - bishopric of Münster and duchy of Cleve
14/25 Dec 1583 - Steiermark
06/17 Jan 1584 - Austria and Bohemia
11/22 Jan 1584 - Lucerne, Uri, Schwyz, Zug, Freiburg, Solothurn
12/23 Jan 1584 - Silesia and the Lausitz
22 Jan/
02 Feb 1584 - Hungary (legally on 21 Oct 1587)
Jun 1584 - Unterwalden
01/12 Jul 1584 - duchy of Westfalen
16/27 Jun 1585 - bishopric of Paderborn
14/25 Dec 1590 - Transylvania
22 Aug/
02 Sep 1612 - duchy of Prussia
13/24 Dec 1614 - Pfalz-Neuburg
1617 - duchy of Kurland (reverted to the Julian calendar in
1796)
1624 - bishopric of Osnabrück
1630 - bishopric of Minden
15/26 Mar 1631 - bishopric of Hildesheim
1655 - Kanton Wallis
05/16 Feb 1682 - city of Strassburg
18 Feb/
01 Mar 1700 - Protestant Germany (including Swedish possessions in
Germany), Denmark, Norway
30 Jun/
12 Jul 1700 - Gelderland, Zutphen
10 Nov/
12 Dec 1700 - Utrecht, Overijssel
31 Dec 1700/
12 Jan 1701 - Friesland, Groningen, Zürich, Bern, Basel, Geneva,
Turgau, and Schaffhausen
1724 - Glarus, Appenzell, and the city of St. Gallen
01 Jan 1750 - Pisa and Florence
02/14 Sep 1752 - Great Britain
17 Feb/
01 Mar 1753 - Sweden
1760-1812 - Graubünden
The Russian empire (including Finland and the Baltic states) did not
convert to the Gregorian calendar until the Soviet revolution of 1917.
Source: H. Grotefend, _Taschenbuch der Zeitrechnung des deutschen
Mittelalters und der Neuzeit_, herausgegeben von Dr. O. Grotefend
(Hannover: Hahnsche Buchhandlung, 1941), pp. 26-28.
-----
This file is in the public domain, so clarified as of 2009-05-17 by
Arthur David Olson.
-----
Local Variables:
coding: utf-8
End:

1
extra/zoneinfo/version Normal file
View File

@ -0,0 +1 @@
2018i

View File

@ -5,6 +5,9 @@ LIBS = -ldl -lm -lrt -lpthread -Wl,--export-dynamic
# clang spams warnings if we use -Wl,--no-as-needed with -c # clang spams warnings if we use -Wl,--no-as-needed with -c
# -Wl,--no-as-needed is a gcc optimization, not required # -Wl,--no-as-needed is a gcc optimization, not required
ifneq ($(CXX),clang++) # we want to work with g++ aliased as c++ here, too
IS_GCC = $(shell $(CXX) --version | grep -o '(GCC)')
ifeq ($(IS_GCC), (GCC))
SITE_CFLAGS += -Wl,--no-as-needed SITE_CFLAGS += -Wl,--no-as-needed
endif endif

View File

@ -1,2 +1,6 @@
include vm/Config.macosx include vm/Config.macosx
include vm/Config.x86.32 include vm/Config.x86.32
# The last SDK to support x86 is 10.13
CFLAGS += --sysroot=$(XCODE_PATH)/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSX_SDK)
CXXFLAGS += --sysroot=$(XCODE_PATH)/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSX_SDK)