diff --git a/Factor.app/Contents/Info.plist b/Factor.app/Contents/Info.plist
index c87520d0fd..1c07f95643 100644
--- a/Factor.app/Contents/Info.plist
+++ b/Factor.app/Contents/Info.plist
@@ -31,8 +31,10 @@
Factor
CFBundlePackageType
APPL
+ CFBundleVersion
+ 0.93
NSHumanReadableCopyright
- Copyright © 2003-2009, Slava Pestov and friends
+ Copyright © 2003-2010 Factor developers
NSServices
diff --git a/GNUmakefile b/GNUmakefile
index c4796de63b..eac1c696df 100755
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -4,7 +4,7 @@ ifdef CONFIG
AR = ar
LD = ld
- VERSION = 0.92
+ VERSION = 0.93
BUNDLE = Factor.app
LIBPATH = -L/usr/X11R6/lib
diff --git a/basis/alien/arrays/arrays.factor b/basis/alien/arrays/arrays.factor
index 7eed1a0664..ce6eb85245 100644
--- a/basis/alien/arrays/arrays.factor
+++ b/basis/alien/arrays/arrays.factor
@@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license.
USING: alien alien.strings alien.c-types alien.data alien.accessors
arrays words sequences math kernel namespaces fry cpu.architecture
-io.encodings.utf8 accessors ;
+io.encodings.binary io.encodings.utf8 accessors ;
IN: alien.arrays
INSTANCE: array value-type
@@ -35,15 +35,12 @@ M: array box-return drop void* box-return ;
M: array stack-size drop void* stack-size ;
M: array c-type-boxer-quot
- unclip
- [ array-length ]
- [ [ require-c-array ] keep ] bi*
- [ ] 2curry ;
+ unclip [ array-length ] dip [ ] 2curry ;
M: array c-type-unboxer-quot drop [ >c-ptr ] ;
PREDICATE: string-type < pair
- first2 [ char* = ] [ word? ] bi* and ;
+ first2 [ c-string = ] [ word? ] bi* and ;
M: string-type c-type ;
@@ -88,10 +85,14 @@ M: string-type c-type-unboxer
drop void* c-type-unboxer ;
M: string-type c-type-boxer-quot
- second '[ _ alien>string ] ;
+ second dup binary =
+ [ drop void* c-type-boxer-quot ]
+ [ '[ _ alien>string ] ] if ;
M: string-type c-type-unboxer-quot
- second '[ _ string>alien ] ;
+ second dup binary =
+ [ drop void* c-type-unboxer-quot ]
+ [ '[ _ string>alien ] ] if ;
M: string-type c-type-getter
drop [ alien-cell ] ;
@@ -99,8 +100,5 @@ M: string-type c-type-getter
M: string-type c-type-setter
drop [ set-alien-cell ] ;
-{ char* utf8 } char* typedef
-char* uchar* typedef
+{ c-string utf8 } c-string typedef
-char char* "pointer-c-type" set-word-prop
-uchar uchar* "pointer-c-type" set-word-prop
diff --git a/basis/alien/c-types/c-types-docs.factor b/basis/alien/c-types/c-types-docs.factor
index b221051efc..9592fb1812 100644
--- a/basis/alien/c-types/c-types-docs.factor
+++ b/basis/alien/c-types/c-types-docs.factor
@@ -6,10 +6,6 @@ QUALIFIED: math
QUALIFIED: sequences
IN: alien.c-types
-HELP: byte-length
-{ $values { "seq" "A byte array or float array" } { "n" "a non-negative integer" } }
-{ $contract "Outputs the size of the byte array, struct, or specialized array data in bytes." } ;
-
HELP: heap-size
{ $values { "name" "a C type name" } { "size" math:integer } }
{ $description "Outputs the number of bytes needed for a heap-allocated value of this C type." }
@@ -32,13 +28,10 @@ HELP: no-c-type
{ $description "Throws a " { $link no-c-type } " error." }
{ $error-description "Thrown by " { $link c-type } " if a given string does not name a C type. When thrown during compile time, indicates a typo in an " { $link alien-invoke } " or " { $link alien-callback } " form." } ;
-HELP: c-types
-{ $var-description "Global variable holding a hashtable mapping C type names to C types. Use the " { $link c-type } " word to look up C types." } ;
-
HELP: c-type
{ $values { "name" "a C type" } { "c-type" c-type } }
{ $description "Looks up a C type by name." }
-{ $errors "Throws a " { $link no-c-type } " error if the type does not exist." } ;
+{ $errors "Throws a " { $link no-c-type } " error if the type does not exist, or the word is not a C type." } ;
HELP: c-getter
{ $values { "name" "a C type" } { "quot" { $quotation "( c-ptr n -- obj )" } } }
@@ -106,8 +99,8 @@ HELP: ulonglong
HELP: void
{ $description "This symbol is not a valid C type, but it can be used as the return type for a " { $link POSTPONE: FUNCTION: } " or " { $link POSTPONE: CALLBACK: } " definition or for an " { $link alien-invoke } " or " { $link alien-callback } " call." } ;
HELP: void*
-{ $description "This C type represents a pointer to C memory. " { $link byte-array } " and " { $link alien } " values can be passed as " { $snippet "void*" } " function inputs, but see " { $link "byte-arrays-gc" } " for notes about passing byte arrays into C functions. " { $snippet "void*" } " output values are returned as " { $link alien } "s." } ;
-HELP: char*
+{ $description "This C type represents a generic pointer to C memory. See " { $link pointer } " for information on pointer C types." } ;
+HELP: c-string
{ $description "This C type represents a pointer to a C string. See " { $link "c-strings" } " for details about using strings with the FFI." } ;
HELP: float
{ $description "This C type represents a single-precision IEEE 754 floating-point type. Input values will be converted to Factor " { $link math:float } "s and demoted to single-precision; output values will be returned as Factor " { $link math:float } "s." } ;
@@ -118,6 +111,19 @@ HELP: complex-float
HELP: complex-double
{ $description "This C type represents a double-precision IEEE 754 floating-point complex type. Input values will be converted from Factor " { $link math:complex } " objects into a double-precision complex float type; output values will be returned as Factor " { $link math:complex } " objects." } ;
+HELP: pointer:
+{ $syntax "pointer: c-type" }
+{ $description "Constructs a " { $link pointer } " C type." } ;
+
+HELP: pointer
+{ $class-description "Represents a pointer C type. The " { $snippet "to" } " slot contains the C type being pointed to." { $link byte-array } " and " { $link alien } " values can be provided as pointer function inputs, but see " { $link "byte-arrays-gc" } " for notes about passing byte arrays into C functions. Objects with methods on " { $link >c-ptr } ", such as structs and specialized arrays, may also be used as pointer inputs."
+$nl
+"Pointer output values are represented in Factor as " { $link alien } "s. If the pointed-to type is a struct, the alien will automatically be wrapped in a struct object if it is not null."
+$nl
+"In " { $link POSTPONE: TYPEDEF: } ", " { $link POSTPONE: FUNCTION: } ", " { $link POSTPONE: CALLBACK: } ", and " { $link POSTPONE: STRUCT: } " definitions, pointer types can be created by suffixing " { $snippet "*" } " to a C type name. Outside of FFI definitions, a pointer C type can be created using the " { $link POSTPONE: pointer: } " syntax word:"
+{ $unchecked-example "FUNCTION: int* foo ( char* bar ) ;" }
+{ $unchecked-example """: foo ( bar -- int* )
+ pointer: int f \"foo\" { pointer: char } alien-invoke ;""" } } ;
ARTICLE: "byte-arrays-gc" "Byte arrays and the garbage collector"
"The Factor garbage collector can move byte arrays around, and it is only safe to pass byte arrays to C functions if the garbage collector will not run while C code still has a reference to the data."
@@ -194,11 +200,11 @@ ARTICLE: "c-types.primitives" "Primitive C types"
"When making alien calls, Factor numbers are converted to and from the above types in a canonical way. Converting a Factor number to a C value may result in a loss of precision." ;
ARTICLE: "c-types.pointers" "Pointer and array types"
-"Pointer types are specified by suffixing a C type with " { $snippet "*" } ", for example " { $snippet "float*" } ". One special case is " { $link void* } ", which denotes a generic pointer; " { $link void } " by itself is not a valid C type specifier. With the exception of strings (see " { $link "c-strings" } "), all pointer types are identical to " { $snippet "void*" } " as far as the C library interface is concerned."
+"Pointer types are specified by suffixing a C type with " { $snippet "*" } ", for example " { $snippet "float*" } ". One special case is " { $link void* } ", which denotes a generic pointer; " { $link void } " by itself is not a valid C type specifier. This syntax constructs a " { $link pointer } " object to represent the C type."
$nl
"Fixed-size array types are supported; the syntax consists of a C type name followed by dimension sizes in brackets; the following denotes a 3 by 4 array of integers:"
{ $code "int[3][4]" }
-"Fixed-size arrays differ from pointers in that they are allocated inside structures and unions; however when used as function parameters they behave exactly like pointers and thus the dimensions only serve as documentation." ;
+"Fixed-size arrays differ from pointers in that they are allocated inside structures and unions; however, when used as function parameters, they behave exactly like pointers with the dimensions only serving as documentation." ;
ARTICLE: "c-types.ambiguity" "Word name clashes with C types"
"Note that some of the C type word names clash with commonly-used Factor words:"
@@ -231,7 +237,7 @@ ARTICLE: "c-types.structs" "Struct and union types"
"Struct and union types are identified by their class word. See " { $link "classes.struct" } "." ;
ARTICLE: "c-types-specs" "C type specifiers"
-"C types are identified by special words, and type names occur as parameters to the " { $link alien-invoke } ", " { $link alien-indirect } " and " { $link alien-callback } " words."
+"C types are identified by special words. Type names occur as parameters to the " { $link alien-invoke } ", " { $link alien-indirect } " and " { $link alien-callback } " words."
$nl
"Defining new C types:"
{ $subsections
diff --git a/basis/alien/c-types/c-types-tests.factor b/basis/alien/c-types/c-types-tests.factor
index faee8955e9..7ad4bbb074 100644
--- a/basis/alien/c-types/c-types-tests.factor
+++ b/basis/alien/c-types/c-types-tests.factor
@@ -1,6 +1,6 @@
USING: alien alien.syntax alien.c-types alien.parser
eval kernel tools.test sequences system libc alien.strings
-io.encodings.utf8 math.constants classes.struct classes
+io.encodings.ascii io.encodings.utf8 math.constants classes.struct classes
accessors compiler.units ;
IN: alien.c-types.tests
@@ -16,36 +16,39 @@ UNION-STRUCT: foo
{ a int }
{ b int } ;
-[ f ] [ char resolve-pointer-type c-type void* c-type eq? ] unit-test
-[ t ] [ char* resolve-pointer-type c-type void* c-type eq? ] unit-test
+[ t ] [ pointer: void c-type void* c-type = ] unit-test
+[ t ] [ pointer: int c-type void* c-type = ] unit-test
+[ t ] [ pointer: int* c-type void* c-type = ] unit-test
+[ f ] [ pointer: foo c-type void* c-type = ] unit-test
+[ t ] [ pointer: foo* c-type void* c-type = ] unit-test
+
+[ t ] [ c-string c-type c-string c-type = ] unit-test
[ t ] [ foo heap-size int heap-size = ] unit-test
TYPEDEF: int MyInt
-[ t ] [ int c-type MyInt c-type eq? ] unit-test
-[ t ] [ void* c-type MyInt resolve-pointer-type c-type eq? ] unit-test
-
-TYPEDEF: char MyChar
-
-[ t ] [ char c-type MyChar c-type eq? ] unit-test
-[ f ] [ void* c-type MyChar resolve-pointer-type c-type eq? ] unit-test
-[ t ] [ char* c-type MyChar resolve-pointer-type c-type eq? ] unit-test
+[ t ] [ int c-type MyInt c-type = ] unit-test
+[ t ] [ void* c-type pointer: MyInt c-type = ] unit-test
[ 32 ] [ { int 8 } heap-size ] unit-test
-TYPEDEF: char* MyString
+TYPEDEF: char MyChar
-[ t ] [ char* c-type MyString c-type eq? ] unit-test
-[ t ] [ void* c-type MyString resolve-pointer-type c-type eq? ] unit-test
+[ t ] [ pointer: void c-type pointer: MyChar c-type = ] unit-test
+
+TYPEDEF: { c-string ascii } MyFunkyString
+
+[ { c-string ascii } ] [ MyFunkyString c-type ] unit-test
+
+TYPEDEF: c-string MyString
+
+[ t ] [ c-string c-type MyString c-type = ] unit-test
+[ t ] [ void* c-type pointer: MyString c-type = ] unit-test
TYPEDEF: int* MyIntArray
-[ t ] [ void* c-type MyIntArray c-type eq? ] unit-test
-
-TYPEDEF: uchar* MyLPBYTE
-
-[ t ] [ { char* utf8 } c-type MyLPBYTE c-type = ] unit-test
+[ t ] [ void* c-type MyIntArray c-type = ] unit-test
[
0 B{ 1 2 3 4 }
@@ -63,7 +66,7 @@ os windows? cpu x86.64? and [
C-TYPE: opaque
-[ t ] [ void* c-type opaque resolve-pointer-type c-type eq? ] unit-test
+[ t ] [ void* c-type pointer: opaque c-type = ] unit-test
[ opaque c-type ] [ no-c-type? ] must-fail-with
[ """
diff --git a/basis/alien/c-types/c-types.factor b/basis/alien/c-types/c-types.factor
index e2f15f5de8..17bf4765b8 100644
--- a/basis/alien/c-types/c-types.factor
+++ b/basis/alien/c-types/c-types.factor
@@ -17,8 +17,9 @@ SYMBOLS:
long ulong
longlong ulonglong
float double
- void* bool
- void ;
+ void* bool ;
+
+SINGLETON: void
DEFER:
DEFER: *char
@@ -43,65 +44,24 @@ stack-align? ;
: ( -- c-type )
\ c-type new ; inline
-SYMBOL: c-types
-
-global [
- c-types [ H{ } assoc-like ] change
-] bind
-
ERROR: no-c-type name ;
-PREDICATE: c-type-word < word
- "c-type" word-prop ;
-
-UNION: c-type-name string c-type-word ;
-
! C type protocol
GENERIC: c-type ( name -- c-type ) foldable
-GENERIC: resolve-pointer-type ( name -- c-type )
+PREDICATE: c-type-word < word
+ "c-type" word-prop ;
-<< \ void \ void* "pointer-c-type" set-word-prop >>
+TUPLE: pointer { to initial: void read-only } ;
+C: pointer
-: void? ( c-type -- ? )
- { void "void" } member? ;
-
-M: word resolve-pointer-type
- dup "pointer-c-type" word-prop
- [ ] [ drop void* ] ?if ;
-
-M: string resolve-pointer-type
- dup "*" append dup c-types get at
- [ nip ] [
- drop
- c-types get at dup c-type-name?
- [ resolve-pointer-type ] [ drop void* ] if
- ] if ;
-
-M: array resolve-pointer-type
- first resolve-pointer-type ;
+UNION: c-type-name
+ c-type-word pointer ;
: resolve-typedef ( name -- c-type )
dup void? [ no-c-type ] when
dup c-type-name? [ c-type ] when ;
-number ] map ] dip ;
-
-PRIVATE>
-
-M: string c-type ( name -- c-type )
- CHAR: ] over member? [
- parse-array-type prefix
- ] [
- dup c-types get at [ ] [
- "*" ?tail [ resolve-pointer-type ] [ no-c-type ] if
- ] ?if resolve-typedef
- ] if ;
-
M: word c-type
dup "c-type" word-prop resolve-typedef
[ ] [ no-c-type ] ?if ;
@@ -233,12 +193,6 @@ M: c-type-name stack-size c-type stack-size ;
M: c-type stack-size size>> cell align ;
-GENERIC: byte-length ( seq -- n ) flushable
-
-M: byte-array byte-length length ; inline
-
-M: f byte-length drop 0 ; inline
-
: >c-bool ( ? -- int ) 1 0 ? ; inline
: c-bool> ( int -- ? ) 0 = not ; inline
@@ -263,24 +217,13 @@ MIXIN: value-type
\ swap , [ heap-size , [ * >fixnum ] % ] [ % ] bi*
] [ ] make ;
-GENERIC: typedef ( old new -- )
-
PREDICATE: typedef-word < c-type-word
"c-type" word-prop c-type-name? ;
-M: string typedef ( old new -- ) c-types get set-at ;
-
-M: word typedef ( old new -- )
+: typedef ( old new -- )
{
[ nip define-symbol ]
- [ name>> typedef ]
[ swap "c-type" set-word-prop ]
- [
- swap dup c-type-name? [
- resolve-pointer-type
- "pointer-c-type" set-word-prop
- ] [ 2drop ] if
- ]
} 2cleave ;
TUPLE: long-long-type < c-type ;
@@ -315,6 +258,10 @@ M: long-long-type box-return ( c-type -- )
: if-void ( c-type true false -- )
pick void? [ drop nip call ] [ nip call ] if ; inline
+SYMBOLS:
+ ptrdiff_t intptr_t uintptr_t size_t
+ c-string ;
+
CONSTANT: primitive-types
{
char uchar
@@ -324,11 +271,30 @@ CONSTANT: primitive-types
longlong ulonglong
float double
void* bool
+ c-string
}
-SYMBOLS:
- ptrdiff_t intptr_t uintptr_t size_t
- char* uchar* ;
+: (pointer-c-type) ( void* type -- void*' )
+ [ clone ] dip c-type-boxer-quot '[ _ [ f ] if* ] >>boxer-quot ;
+
+
+
+M: pointer c-type
+ [ \ void* c-type ] dip
+ to>> dup primitive-pointer-type? [ drop ] [ (pointer-c-type) ] if ;
: 8-byte-alignment ( c-type -- c-type )
{
@@ -541,6 +507,7 @@ SYMBOLS:
\ uint c-type \ uintptr_t typedef
\ uint c-type \ size_t typedef
] if
+
] with-compilation-unit
M: char-16-rep rep-component-type drop char ;
diff --git a/basis/alien/complex/complex-tests.factor b/basis/alien/complex/complex-tests.factor
index 87f0c98b47..63d73ef029 100644
--- a/basis/alien/complex/complex-tests.factor
+++ b/basis/alien/complex/complex-tests.factor
@@ -16,6 +16,6 @@ STRUCT: complex-holder
[ C{ 1.0 2.0 } ] [ "h" get z>> ] unit-test
-[ complex ] [ "complex-float" c-type-boxed-class ] unit-test
+[ complex ] [ complex-float c-type-boxed-class ] unit-test
-[ complex ] [ "complex-double" c-type-boxed-class ] unit-test
+[ complex ] [ complex-double c-type-boxed-class ] unit-test
diff --git a/basis/alien/complex/complex.factor b/basis/alien/complex/complex.factor
index 65c4095e25..fbf28071d0 100644
--- a/basis/alien/complex/complex.factor
+++ b/basis/alien/complex/complex.factor
@@ -6,8 +6,10 @@ IN: alien.complex
<<
{ "float" "double" } [ dup "complex-" prepend define-complex-type ] each
+>>
+<<
! This overrides the fact that small structures are never returned
! in registers on NetBSD, Linux and Solaris running on 32-bit x86.
-"complex-float" c-type t >>return-in-registers? drop
+\ complex-float c-type t >>return-in-registers? drop
>>
diff --git a/basis/alien/complex/functor/functor.factor b/basis/alien/complex/functor/functor.factor
index cb46f2d67a..90fb5174c1 100644
--- a/basis/alien/complex/functor/functor.factor
+++ b/basis/alien/complex/functor/functor.factor
@@ -7,6 +7,8 @@ IN: alien.complex.functor
FUNCTOR: define-complex-type ( N T -- )
+N-type IS ${N}
+
T-class DEFINES-CLASS ${T}
DEFINES <${T}>
@@ -14,7 +16,7 @@ T-class DEFINES-CLASS ${T}
WHERE
-STRUCT: T-class { real N } { imaginary N } ;
+STRUCT: T-class { real N-type } { imaginary N-type } ;
: ( z -- alien )
>rect T-class >c-ptr ;
diff --git a/basis/alien/data/data-docs.factor b/basis/alien/data/data-docs.factor
index 0536d15736..4600ea6837 100644
--- a/basis/alien/data/data-docs.factor
+++ b/basis/alien/data/data-docs.factor
@@ -21,11 +21,6 @@ HELP: memory>byte-array
{ $values { "alien" c-ptr } { "len" "a non-negative integer" } { "byte-array" byte-array } }
{ $description "Reads " { $snippet "len" } " bytes starting from " { $snippet "base" } " and stores them in a new byte array." } ;
-HELP: byte-array>memory
-{ $values { "byte-array" byte-array } { "base" c-ptr } }
-{ $description "Writes a byte array to memory starting from the " { $snippet "base" } " address." }
-{ $warning "This word is unsafe. Improper use can corrupt memory." } ;
-
HELP: malloc-array
{ $values { "n" "a non-negative integer" } { "type" "a C type" } { "array" "a specialized array" } }
{ $description "Allocates an unmanaged memory block large enough to hold " { $snippet "n" } " values of a C type, then wraps the memory in a sequence object using " { $link } "." }
@@ -75,9 +70,7 @@ $nl
"You can unsafely copy a range of bytes from one memory location to another:"
{ $subsections memcpy }
"You can copy a range of bytes from memory into a byte array:"
-{ $subsections memory>byte-array }
-"You can copy a byte array to memory unsafely:"
-{ $subsections byte-array>memory } ;
+{ $subsections memory>byte-array } ;
ARTICLE: "c-pointers" "Passing pointers to C functions"
"The following Factor objects may be passed to C function parameters with pointer types:"
@@ -85,7 +78,7 @@ ARTICLE: "c-pointers" "Passing pointers to C functions"
{ "Instances of " { $link alien } "." }
{ "Instances of " { $link f } "; this is interpreted as a null pointer." }
{ "Instances of " { $link byte-array } "; the C function receives a pointer to the first element of the array." }
- { "Any data type which defines a method on " { $link >c-ptr } " that returns an instance of one of the above. This includes " { $link "classes.struct" } " and " { $link "specialized-arrays" } "." }
+ { "Any data type which defines a method on " { $link >c-ptr } ". This includes " { $link "classes.struct" } " and " { $link "specialized-arrays" } "." }
}
"The class of primitive C pointer types:"
{ $subsections c-ptr }
@@ -111,7 +104,7 @@ $nl
{ $subsections "byte-arrays-gc" }
"C-style enumerated types are supported:"
{ $subsections POSTPONE: C-ENUM: }
-"C types can be aliased for convenience and consitency with native library documentation:"
+"C types can be aliased for convenience and consistency with native library documentation:"
{ $subsections POSTPONE: TYPEDEF: }
"A utility for defining " { $link "destructors" } " for deallocating memory:"
{ $subsections "alien.destructors" }
@@ -140,13 +133,13 @@ HELP:
{ $notes "The appropriate specialized array vocabulary must be loaded; otherwise, an error will be thrown. The vocabulary can be loaded with the " { $link require-c-array } " word. See the " { $vocab-link "specialized-arrays" } " vocabulary for details on the underlying sequence type constructed." } ;
ARTICLE: "c-strings" "C strings"
-"C string types are arrays with shape " { $snippet "{ char* encoding }" } ", where " { $snippet "encoding" } " is an encoding descriptor. The type " { $link char* } " is an alias for " { $snippet "{ char* utf8 }" } ". See " { $link "encodings-descriptors" } " for information about encoding descriptors."
+"C string types are arrays with shape " { $snippet "{ c-string encoding }" } ", where " { $snippet "encoding" } " is an encoding descriptor. The type " { $link c-string } " is an alias for " { $snippet "{ c-string utf8 }" } ". See " { $link "encodings-descriptors" } " for information about encoding descriptors. In " { $link POSTPONE: TYPEDEF: } ", " { $link POSTPONE: FUNCTION: } ", " { $link POSTPONE: CALLBACK: } ", and " { $link POSTPONE: STRUCT: } " definitions, the shorthand syntax " { $snippet "c-string[encoding]" } " can be used to specify the string encoding."
$nl
-"Passing a Factor string to a C function expecting a C string allocates a " { $link byte-array } " in the Factor heap; the string is then converted to the requested format and a raw pointer is passed to the function."
+"Passing a Factor string to a C function expecting a " { $link c-string } " allocates a " { $link byte-array } " in the Factor heap; the string is then converted to the requested format and a raw pointer is passed to the function."
$nl
"If the conversion fails, for example if the string contains null bytes or characters with values higher than 255, a " { $link c-string-error. } " is thrown."
$nl
-"Care must be taken if the C function expects a " { $link char* } " with a length in bytes, rather than a null-terminated " { $link char* } "; passing the result of calling " { $link length } " on the string object will not suffice. This is because a Factor string of " { $emphasis "n" } " characters will not necessarily encode to " { $emphasis "n" } " bytes. The correct idiom for C functions which take a string with a length is to first encode the string using " { $link encode } ", and then pass the resulting byte array together with the length of this byte array."
+"Care must be taken if the C function expects a pointer to a string with its length represented by another parameter rather than a null terminator. Passing the result of calling " { $link length } " on the string object will not suffice. This is because a Factor string of " { $emphasis "n" } " characters will not necessarily encode to " { $emphasis "n" } " bytes. The correct idiom for C functions which take a string with a length is to first encode the string using " { $link encode } ", and then pass the resulting byte array together with the length of this byte array."
$nl
"Sometimes a C function has a parameter type of " { $link void* } ", and various data types, among them strings, can be passed in. In this case, strings are not automatically converted to aliens, and instead you must call one of these words:"
{ $subsections
@@ -155,7 +148,9 @@ $nl
}
"The first allocates " { $link byte-array } "s, and the latter allocates manually-managed memory which is not moved by the garbage collector and has to be explicitly freed by calling " { $link free } ". See " { $link "byte-arrays-gc" } " for a discussion of the two approaches."
$nl
+"The C type " { $link char } { $snippet "*" } " represents a generic pointer to " { $snippet "char" } "; arguments with this type will expect and return " { $link alien } "s, and won't perform any implicit string conversion."
+$nl
"A word to read strings from arbitrary addresses:"
{ $subsections alien>string }
-"For example, if a C function returns a " { $link char* } " but stipulates that the caller must deallocate the memory afterward, you must define the function as returning " { $link void* } ", and call one of the above words before passing the pointer to " { $link free } "." ;
+"For example, if a C function returns a " { $link c-string } " but stipulates that the caller must deallocate the memory afterward, you must define the function as returning " { $snippet "char*" } " and call one of the above words before passing the pointer to " { $link free } "." ;
diff --git a/basis/alien/data/data.factor b/basis/alien/data/data.factor
index 93b1afd436..2d572e9f13 100644
--- a/basis/alien/data/data.factor
+++ b/basis/alien/data/data.factor
@@ -1,7 +1,8 @@
-! (c)2009 Slava Pestov, Joe Groff bsd license
+! (c)2009, 2010 Slava Pestov, Joe Groff bsd license
USING: accessors alien alien.c-types alien.strings arrays
byte-arrays cpu.architecture fry io io.encodings.binary
-io.files io.streams.memory kernel libc math sequences words ;
+io.files io.streams.memory kernel libc math sequences words
+byte-vectors ;
IN: alien.data
GENERIC: require-c-array ( c-type -- )
@@ -48,7 +49,7 @@ M: word
heap-size malloc ; inline
: malloc-byte-array ( byte-array -- alien )
- dup byte-length [ nip malloc dup ] 2keep memcpy ;
+ binary-object [ nip malloc dup ] 2keep memcpy ;
: memory>byte-array ( alien len -- byte-array )
[ nip (byte-array) dup ] 2keep memcpy ;
@@ -62,8 +63,12 @@ M: memory-stream stream-read
swap memory>byte-array
] [ [ + ] change-index drop ] 2bi ;
-: byte-array>memory ( byte-array base -- )
- swap dup byte-length memcpy ; inline
+M: byte-vector stream-write
+ [ dup byte-length tail-slice ]
+ [ [ [ byte-length ] bi@ + ] keep lengthen ]
+ [ drop byte-length ]
+ 2tri
+ [ >c-ptr swap >c-ptr ] dip memcpy ;
M: value-type c-type-rep drop int-rep ;
diff --git a/basis/alien/fortran/fortran-tests.factor b/basis/alien/fortran/fortran-tests.factor
index 80a5ec8bae..dc0585cab8 100644
--- a/basis/alien/fortran/fortran-tests.factor
+++ b/basis/alien/fortran/fortran-tests.factor
@@ -4,6 +4,7 @@ alien.data alien.fortran alien.fortran.private alien.strings
classes.struct arrays assocs byte-arrays combinators fry
generalizations io.encodings.ascii kernel macros
macros.expander namespaces sequences shuffle tools.test vocabs.parser ;
+FROM: alien.syntax => pointer: ;
QUALIFIED-WITH: alien.c-types c
IN: alien.fortran.tests
@@ -100,16 +101,16 @@ intel-unix-abi fortran-abi [
! fortran-arg-type>c-type
- [ c:void* { } ]
+ [ pointer: c:int { } ]
[ "integer" fortran-arg-type>c-type ] unit-test
- [ c:void* { } ]
+ [ pointer: { c:int 3 } { } ]
[ "integer(3)" fortran-arg-type>c-type ] unit-test
- [ c:void* { } ]
+ [ pointer: { c:int 0 } { } ]
[ "integer(*)" fortran-arg-type>c-type ] unit-test
- [ c:void* { } ]
+ [ pointer: fortran_test_record { } ]
[
[
"alien.fortran.tests" use-vocab
@@ -117,13 +118,13 @@ intel-unix-abi fortran-abi [
] with-manifest
] unit-test
- [ c:char* { } ]
+ [ pointer: c:char { } ]
[ "character" fortran-arg-type>c-type ] unit-test
- [ c:char* { } ]
+ [ pointer: c:char { } ]
[ "character(1)" fortran-arg-type>c-type ] unit-test
- [ c:char* { long } ]
+ [ pointer: { c:char 17 } { long } ]
[ "character(17)" fortran-arg-type>c-type ] unit-test
! fortran-ret-type>c-type
@@ -131,7 +132,7 @@ intel-unix-abi fortran-abi [
[ c:char { } ]
[ "character(1)" fortran-ret-type>c-type ] unit-test
- [ c:void { c:char* long } ]
+ [ c:void { pointer: { c:char 17 } long } ]
[ "character(17)" fortran-ret-type>c-type ] unit-test
[ c:int { } ]
@@ -143,22 +144,22 @@ intel-unix-abi fortran-abi [
[ c:float { } ]
[ "real" fortran-ret-type>c-type ] unit-test
- [ c:void { c:void* } ]
+ [ c:void { pointer: { c:float 0 } } ]
[ "real(*)" fortran-ret-type>c-type ] unit-test
[ c:double { } ]
[ "double-precision" fortran-ret-type>c-type ] unit-test
- [ c:void { c:void* } ]
+ [ c:void { pointer: complex-float } ]
[ "complex" fortran-ret-type>c-type ] unit-test
- [ c:void { c:void* } ]
+ [ c:void { pointer: complex-double } ]
[ "double-complex" fortran-ret-type>c-type ] unit-test
- [ c:void { c:void* } ]
+ [ c:void { pointer: { c:int 0 } } ]
[ "integer(*)" fortran-ret-type>c-type ] unit-test
- [ c:void { c:void* } ]
+ [ c:void { pointer: fortran_test_record } ]
[
[
"alien.fortran.tests" use-vocab
@@ -168,19 +169,19 @@ intel-unix-abi fortran-abi [
! fortran-sig>c-sig
- [ c:float { c:void* c:char* c:void* c:void* c:long } ]
+ [ c:float { pointer: c:int pointer: { c:char 17 } pointer: c:float pointer: c:double c:long } ]
[ "real" { "integer" "character*17" "real" "real*8" } fortran-sig>c-sig ]
unit-test
- [ c:char { c:char* c:char* c:void* c:long } ]
+ [ c:char { pointer: { c:char 17 } pointer: c:char pointer: c:int c:long } ]
[ "character(1)" { "character*17" "character" "integer" } fortran-sig>c-sig ]
unit-test
- [ c:void { c:char* c:long c:char* c:char* c:void* c:long } ]
+ [ c:void { pointer: { c:char 18 } c:long pointer: { c:char 17 } pointer: c:char pointer: c:int c:long } ]
[ "character*18" { "character*17" "character" "integer" } fortran-sig>c-sig ]
unit-test
- [ c:void { c:void* c:char* c:char* c:void* c:long } ]
+ [ c:void { pointer: complex-float pointer: { c:char 17 } pointer: c:char pointer: c:int c:long } ]
[ "complex" { "character*17" "character" "integer" } fortran-sig>c-sig ]
unit-test
@@ -201,7 +202,7 @@ intel-unix-abi fortran-abi [
! [fortran-invoke]
[
c:void "funpack" "funtimes_"
- { c:char* c:void* c:void* c:void* c:void* c:long }
+ { pointer: { c:char 12 } pointer: c:longlong pointer: c:float pointer: complex-float pointer: c:short c:long }
alien-invoke
] 6 nkeep
! [fortran-results>]
@@ -226,7 +227,7 @@ intel-unix-abi fortran-abi [
[ { [ drop ] } spread ]
} 1 ncleave
! [fortran-invoke]
- [ c:float "funpack" "fun_times_" { void* } alien-invoke ]
+ [ c:float "funpack" "fun_times_" { pointer: { c:float 0 } } alien-invoke ]
1 nkeep
! [fortran-results>]
shuffle( reta aa -- reta aa )
@@ -244,7 +245,7 @@ intel-unix-abi fortran-abi [
! [fortran-invoke]
[
c:void "funpack" "fun_times_"
- { void* void* }
+ { pointer: complex-float pointer: { c:float 0 } }
alien-invoke
] 2 nkeep
! [fortran-results>]
@@ -261,7 +262,7 @@ intel-unix-abi fortran-abi [
! [fortran-invoke]
[
c:void "funpack" "fun_times_"
- { c:char* long }
+ { pointer: { c:char 20 } long }
alien-invoke
] 2 nkeep
! [fortran-results>]
@@ -287,7 +288,7 @@ intel-unix-abi fortran-abi [
! [fortran-invoke]
[
c:void "funpack" "fun_times_"
- { c:char* long c:char* c:void* c:char* c:long c:long }
+ { pointer: { c:char 10 } long pointer: { c:char 20 } pointer: c:float pointer: { c:char 30 } c:long c:long }
alien-invoke
] 7 nkeep
! [fortran-results>]
@@ -321,16 +322,16 @@ f2c-abi fortran-abi [
[ { c:char 1 } ]
[ "character(1)" fortran-type>c-type ] unit-test
- [ c:char* { c:long } ]
+ [ pointer: c:char { c:long } ]
[ "character" fortran-arg-type>c-type ] unit-test
- [ c:void { c:char* c:long } ]
+ [ c:void { pointer: c:char c:long } ]
[ "character" fortran-ret-type>c-type ] unit-test
[ c:double { } ]
[ "real" fortran-ret-type>c-type ] unit-test
- [ c:void { void* } ]
+ [ c:void { pointer: { c:float 0 } } ]
[ "real(*)" fortran-ret-type>c-type ] unit-test
[ "fun_" ] [ "FUN" fortran-name>symbol-name ] unit-test
@@ -344,7 +345,7 @@ gfortran-abi fortran-abi [
[ c:float { } ]
[ "real" fortran-ret-type>c-type ] unit-test
- [ c:void { void* } ]
+ [ c:void { pointer: { c:float 0 } } ]
[ "real(*)" fortran-ret-type>c-type ] unit-test
[ complex-float { } ]
@@ -356,10 +357,10 @@ gfortran-abi fortran-abi [
[ { char 1 } ]
[ "character(1)" fortran-type>c-type ] unit-test
- [ c:char* { c:long } ]
+ [ pointer: c:char { c:long } ]
[ "character" fortran-arg-type>c-type ] unit-test
- [ c:void { c:char* c:long } ]
+ [ c:void { pointer: c:char c:long } ]
[ "character" fortran-ret-type>c-type ] unit-test
[ complex-float { } ]
@@ -368,7 +369,7 @@ gfortran-abi fortran-abi [
[ complex-double { } ]
[ "double-complex" fortran-ret-type>c-type ] unit-test
- [ c:void { c:void* } ]
+ [ c:void { pointer: { complex-double 3 } } ]
[ "double-complex(3)" fortran-ret-type>c-type ] unit-test
] with-variable
diff --git a/basis/alien/fortran/fortran.factor b/basis/alien/fortran/fortran.factor
index 65e927f85a..9255c66c9f 100644
--- a/basis/alien/fortran/fortran.factor
+++ b/basis/alien/fortran/fortran.factor
@@ -392,13 +392,13 @@ PRIVATE>
: fortran-arg-type>c-type ( fortran-type -- c-type added-args )
parse-fortran-type
- [ (fortran-type>c-type) resolve-pointer-type ]
+ [ (fortran-type>c-type) ]
[ added-c-args ] bi ;
: fortran-ret-type>c-type ( fortran-type -- c-type added-args )
parse-fortran-type dup returns-by-value?
[ (fortran-ret-type>c-type) { } ] [
c:void swap
- [ added-c-args ] [ (fortran-type>c-type) resolve-pointer-type ] bi prefix
+ [ added-c-args ] [ (fortran-type>c-type) ] bi prefix
] if ;
: fortran-arg-types>c-types ( fortran-types -- c-types )
diff --git a/basis/alien/libraries/authors.txt b/basis/alien/libraries/authors.txt
index 1901f27a24..580f882c8d 100644
--- a/basis/alien/libraries/authors.txt
+++ b/basis/alien/libraries/authors.txt
@@ -1 +1,2 @@
Slava Pestov
+Joe Groff
diff --git a/basis/alien/libraries/libraries-docs.factor b/basis/alien/libraries/libraries-docs.factor
index 245565d9ed..59142733b9 100644
--- a/basis/alien/libraries/libraries-docs.factor
+++ b/basis/alien/libraries/libraries-docs.factor
@@ -60,6 +60,10 @@ $nl
}
"Note the parse time evaluation with " { $link POSTPONE: << } "." } ;
+HELP: deploy-library
+{ $values { "name" string } }
+{ $description "Specifies that the logical library named " { $snippet "name" } " should be included during " { $link "tools.deploy" } ". " { $snippet "name" } " must be the name of a library previously loaded with " { $link add-library } "." } ;
+
HELP: remove-library
{ $values { "name" string } }
{ $description "Unloads a library and removes it from the internal list of libraries. The " { $snippet "name" } " parameter should be a name that was previously passed to " { $link add-library } ". If no library with that name exists, this word does nothing." } ;
@@ -72,4 +76,9 @@ ARTICLE: "loading-libs" "Loading native libraries"
}
"Once a library has been defined, you can try loading it to see if the path name is correct:"
{ $subsections load-library }
-"If the compiler cannot load a library, or cannot resolve a symbol in a library, a linkage error is reported using the compiler error mechanism (see " { $link "compiler-errors" } "). Once you install the right library, reload the source file containing the " { $link add-library } " form to force the compiler to try loading the library again." ;
+"If the compiler cannot load a library, or cannot resolve a symbol in a library, a linkage error is reported using the compiler error mechanism (see " { $link "compiler-errors" } "). Once you install the right library, reload the source file containing the " { $link add-library } " form to force the compiler to try loading the library again."
+$nl
+"Libraries that do not come standard with the operating system need to be included with deployed applications that use them. A word is provided to instruct " { $link "tools.deploy" } " that a library must be so deployed:"
+{ $subsections
+ deploy-library
+} ;
diff --git a/basis/alien/libraries/libraries.factor b/basis/alien/libraries/libraries.factor
index 0d255b8d07..47e34fe5ff 100644
--- a/basis/alien/libraries/libraries.factor
+++ b/basis/alien/libraries/libraries.factor
@@ -1,7 +1,7 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov, Joe Groff.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien alien.strings assocs io.backend
-kernel namespaces destructors ;
+kernel namespaces destructors sequences system io.pathnames ;
IN: alien.libraries
: dlopen ( path -- dll ) native-string>alien (dlopen) ;
@@ -14,6 +14,8 @@ libraries [ H{ } clone ] initialize
TUPLE: library path abi dll ;
+ERROR: no-library name ;
+
: library ( name -- library ) libraries get at ;
: ( path abi -- library )
@@ -31,4 +33,31 @@ M: library dispose dll>> [ dispose ] when* ;
: add-library ( name path abi -- )
[ 2drop remove-library ]
- [ swap libraries get set-at ] 3bi ;
\ No newline at end of file
+ [ swap libraries get set-at ] 3bi ;
+
+: library-abi ( library -- abi )
+ library [ abi>> ] [ "cdecl" ] if* ;
+
+SYMBOL: deploy-libraries
+
+deploy-libraries [ V{ } clone ] initialize
+
+: deploy-library ( name -- )
+ dup libraries get key?
+ [ deploy-libraries get 2dup member? [ 2drop ] [ push ] if ]
+ [ no-library ] if ;
+
+deployed-library-path os ( path -- path' )
+
+M: windows >deployed-library-path
+ file-name ;
+
+M: unix >deployed-library-path
+ file-name "$ORIGIN" prepend-path ;
+
+M: macosx >deployed-library-path
+ file-name "@executable_path/../Frameworks" prepend-path ;
+
+PRIVATE>
diff --git a/basis/alien/parser/parser-tests.factor b/basis/alien/parser/parser-tests.factor
index e405f49995..26a71e9623 100644
--- a/basis/alien/parser/parser-tests.factor
+++ b/basis/alien/parser/parser-tests.factor
@@ -1,7 +1,7 @@
! (c)2009 Joe Groff bsd license
USING: accessors alien.c-types alien.parser alien.syntax
-tools.test vocabs.parser parser eval vocabs.parser debugger
-continuations ;
+tools.test vocabs.parser parser eval debugger kernel
+continuations words ;
IN: alien.parser.tests
TYPEDEF: char char2
@@ -18,22 +18,28 @@ CONSTANT: eleven 11
[ { int 5 } ] [ "int[5]" parse-c-type ] unit-test
[ { int 5 10 11 } ] [ "int[5][10][11]" parse-c-type ] unit-test
[ { int 5 10 eleven } ] [ "int[5][10][eleven]" parse-c-type ] unit-test
- [ void* ] [ "int*" parse-c-type ] unit-test
- [ void* ] [ "int**" parse-c-type ] unit-test
- [ void* ] [ "int***" parse-c-type ] unit-test
- [ void* ] [ "int****" parse-c-type ] unit-test
- [ char* ] [ "char*" parse-c-type ] unit-test
- [ void* ] [ "char**" parse-c-type ] unit-test
- [ void* ] [ "char***" parse-c-type ] unit-test
- [ void* ] [ "char****" parse-c-type ] unit-test
+ [ pointer: void ] [ "void*" parse-c-type ] unit-test
+ [ pointer: int ] [ "int*" parse-c-type ] unit-test
+ [ pointer: int* ] [ "int**" parse-c-type ] unit-test
+ [ pointer: int** ] [ "int***" parse-c-type ] unit-test
+ [ pointer: int*** ] [ "int****" parse-c-type ] unit-test
+ [ c-string ] [ "c-string" parse-c-type ] unit-test
[ char2 ] [ "char2" parse-c-type ] unit-test
- [ char* ] [ "char2*" parse-c-type ] unit-test
+ [ pointer: char2 ] [ "char2*" parse-c-type ] unit-test
- [ "not-c-type" parse-c-type ] [ no-c-type? ] must-fail-with
[ "not-word" parse-c-type ] [ error>> no-word-error? ] must-fail-with
-
] with-file-vocabs
+FUNCTION: void* alien-parser-function-effect-test ( int *arg1 float arg2 ) ;
+[ (( arg1 arg2 -- void* )) ] [
+ \ alien-parser-function-effect-test "declared-effect" word-prop
+] unit-test
+
+CALLBACK: void* alien-parser-callback-effect-test ( int *arg1 float arg2 ) ;
+[ (( arg1 arg2 -- void* )) ] [
+ \ alien-parser-callback-effect-test "callback-effect" word-prop
+] unit-test
+
! Reported by mnestic
TYPEDEF: int alien-parser-test-int ! reasonably unique name...
diff --git a/basis/alien/parser/parser.factor b/basis/alien/parser/parser.factor
index 0cf495fd25..cf8c878589 100644
--- a/basis/alien/parser/parser.factor
+++ b/basis/alien/parser/parser.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov, Doug Coleman.
+! Copyright (C) 2008, 2010 Slava Pestov, Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien alien.c-types alien.parser
alien.libraries arrays assocs classes combinators
@@ -18,35 +18,41 @@ IN: alien.parser
{
{ [ dup "void" = ] [ drop void ] }
{ [ CHAR: ] over member? ] [ parse-array-type parse-c-type-name prefix ] }
+ { [ "*" ?tail ] [ (parse-c-type) ] }
{ [ dup search ] [ parse-c-type-name ] }
- { [ "**" ?tail ] [ drop void* ] }
- { [ "*" ?tail ] [ parse-c-type-name resolve-pointer-type ] }
[ dup search [ ] [ no-word ] ?if ]
} cond ;
: valid-c-type? ( c-type -- ? )
- { [ array? ] [ c-type-name? ] [ void? ] } 1|| ;
+ { [ array? ] [ c-type-word? ] [ pointer? ] [ void? ] } 1|| ;
: parse-c-type ( string -- type )
(parse-c-type) dup valid-c-type? [ no-c-type ] unless ;
: scan-c-type ( -- c-type )
- scan dup "{" =
- [ drop \ } parse-until >array ]
- [ parse-c-type ] if ;
+ scan {
+ { [ dup "{" = ] [ drop \ } parse-until >array ] }
+ { [ dup "pointer:" = ] [ drop scan-c-type ] }
+ [ parse-c-type ]
+ } cond ;
: reset-c-type ( word -- )
dup "struct-size" word-prop
[ dup [ forget-class ] [ { "struct-size" } reset-props ] bi ] when
{
"c-type"
- "pointer-c-type"
"callback-effect"
"callback-library"
} reset-props ;
+ERROR: *-in-c-type-name name ;
+
+: validate-c-type-name ( name -- name )
+ dup "*" tail?
+ [ *-in-c-type-name ] when ;
+
: CREATE-C-TYPE ( -- word )
- scan current-vocab create {
+ scan validate-c-type-name current-vocab create {
[ fake-definition ]
[ set-word ]
[ reset-c-type ]
@@ -61,19 +67,27 @@ IN: alien.parser
] bi
[ parse-c-type ] dip ;
+> ;
+M: pointer return-type-name to>> return-type-name CHAR: * suffix ;
+PRIVATE>
+
: parse-arglist ( parameters return -- types effect )
[
2 group [ first2 normalize-c-arg 2array ] map
unzip [ "," ?tail drop ] map
]
- [ [ { } ] [ 1array ] if-void ]
+ [ [ { } ] [ return-type-name 1array ] if-void ]
bi* ;
: function-quot ( return library function types -- quot )
'[ _ _ _ _ alien-invoke ] ;
-:: make-function ( return! library function! parameters -- word quot effect )
- return function normalize-c-arg function! return!
+:: make-function ( return library function parameters -- word quot effect )
+ return function normalize-c-arg :> ( return function )
function create-in dup reset-generic
return library function
parameters return parse-arglist [ function-quot ] dip ;
@@ -88,13 +102,10 @@ IN: alien.parser
make-function define-declared ;
: callback-quot ( return types abi -- quot )
- [ [ ] 3curry dip alien-callback ] 3curry ;
+ '[ [ _ _ _ ] dip alien-callback ] ;
-: library-abi ( lib -- abi )
- library [ abi>> ] [ "cdecl" ] if* ;
-
-:: make-callback-type ( lib return! type-name! parameters -- word quot effect )
- return type-name normalize-c-arg type-name! return!
+:: make-callback-type ( lib return type-name parameters -- word quot effect )
+ return type-name normalize-c-arg :> ( return type-name )
type-name current-vocab create :> type-word
type-word [ reset-generic ] [ reset-c-type ] bi
void* type-word typedef
@@ -115,4 +126,3 @@ PREDICATE: alien-function-word < word
PREDICATE: alien-callback-type-word < typedef-word
"callback-effect" word-prop ;
-
diff --git a/basis/alien/prettyprint/prettyprint.factor b/basis/alien/prettyprint/prettyprint.factor
index ded8f692cd..52e9978a5f 100644
--- a/basis/alien/prettyprint/prettyprint.factor
+++ b/basis/alien/prettyprint/prettyprint.factor
@@ -19,12 +19,25 @@ M: c-type-word definer drop \ C-TYPE: f ;
M: c-type-word definition drop f ;
M: c-type-word declarations. drop ;
+> ;
+M: pointer pointer-string to>> pointer-string [ CHAR: * suffix ] [ f ] if* ;
+PRIVATE>
+
GENERIC: pprint-c-type ( c-type -- )
M: word pprint-c-type pprint-word ;
+M: pointer pprint-c-type
+ dup pointer-string
+ [ swap present-text ]
+ [ pprint* ] if* ;
M: wrapper pprint-c-type wrapped>> pprint-word ;
M: string pprint-c-type text ;
M: array pprint-c-type pprint* ;
+M: pointer pprint* \ pointer: pprint-word to>> pprint-c-type ;
+
M: typedef-word definer drop \ TYPEDEF: f ;
M: typedef-word synopsis*
diff --git a/basis/alien/remote-control/remote-control.factor b/basis/alien/remote-control/remote-control.factor
index ae694bed9c..c305d720f0 100644
--- a/basis/alien/remote-control/remote-control.factor
+++ b/basis/alien/remote-control/remote-control.factor
@@ -6,7 +6,7 @@ eval ;
IN: alien.remote-control
: eval-callback ( -- callback )
- void* { char* } "cdecl"
+ void* { c-string } "cdecl"
[ eval>string utf8 malloc-string ] alien-callback ;
: yield-callback ( -- callback )
diff --git a/basis/alien/syntax/syntax-docs.factor b/basis/alien/syntax/syntax-docs.factor
index a8d3048b82..3d1c757035 100644
--- a/basis/alien/syntax/syntax-docs.factor
+++ b/basis/alien/syntax/syntax-docs.factor
@@ -40,11 +40,11 @@ $nl
}
"You can define a word for invoking it:"
{ $unchecked-example
- "LIBRARY: foo\nFUNCTION: void the_answer ( char* question, int value ) ;"
- "USE: compiler"
+ "LIBRARY: foo\nFUNCTION: void the_answer ( c-string question, int value ) ;"
"\"the question\" 42 the_answer"
"The answer to the question is 42."
} }
+"Using the " { $link c-string } " type instead of " { $snippet "char*" } " causes the FFI to automatically convert Factor strings to C strings. See " { $link "c-strings" } " for more information on using strings with the FFI."
{ $notes "Note that the parentheses and commas are only syntax sugar and can be omitted; they serve no purpose other than to make the declaration slightly easier to read:"
{ $code
"FUNCTION: void glHint ( GLenum target, GLenum mode ) ;"
@@ -54,7 +54,7 @@ $nl
HELP: TYPEDEF:
{ $syntax "TYPEDEF: old new" }
{ $values { "old" "a C type" } { "new" "a C type" } }
-{ $description "Aliases the C type " { $snippet "old" } " under the name " { $snippet "new" } " if ." }
+{ $description "Aliases the C type " { $snippet "old" } " under the name " { $snippet "new" } "." }
{ $notes "This word differs from " { $link typedef } " in that it runs at parse time, to ensure correct ordering of operations when loading source files. Words defined in source files are compiled before top-level forms are run, so if a source file defines C binding words and uses " { $link typedef } ", the type alias won't be available at compile time." } ;
HELP: C-ENUM:
@@ -72,12 +72,12 @@ HELP: C-ENUM:
HELP: C-TYPE:
{ $syntax "C-TYPE: type" }
{ $values { "type" "a new C type" } }
-{ $description "Defines a new, opaque C type. Since it is opaque, " { $snippet "type" } " will not be directly usable as a parameter or return type of a " { $link POSTPONE: FUNCTION: } " or as a slot of a " { $link POSTPONE: STRUCT: } ". However, it can be used as the type of a pointer (that is, as " { $snippet "type*" } ")." $nl
-{ $snippet "C-TYPE:" } " can also be used to forward-declare C types to enable circular dependencies. For example:"
+{ $description "Defines a new, opaque C type. Since it is opaque, " { $snippet "type" } " will not be directly usable as a parameter or return type of a " { $link POSTPONE: FUNCTION: } " or as a slot of a " { $link POSTPONE: STRUCT: } ". However, it can be used as the type of a " { $link pointer } "."
+{ $snippet "C-TYPE:" } " can also be used to forward declare C types, allowing circular dependencies to occur between types. For example:"
{ $code """C-TYPE: forward
STRUCT: backward { x forward* } ;
STRUCT: forward { x backward* } ; """ } }
-{ $notes "Primitive C types are also displayed using " { $snippet "C-TYPE:" } " syntax when they are displayed by " { $link see } "." } ;
+{ $notes "Primitive C types are displayed using " { $snippet "C-TYPE:" } " syntax when they are " { $link see } "n." } ;
HELP: CALLBACK:
{ $syntax "CALLBACK: return type ( parameters ) ;" }
diff --git a/basis/alien/syntax/syntax.factor b/basis/alien/syntax/syntax.factor
index 295bcff089..9eb8ca6287 100644
--- a/basis/alien/syntax/syntax.factor
+++ b/basis/alien/syntax/syntax.factor
@@ -47,3 +47,6 @@ SYNTAX: &:
[ nip ] [ global-quot ] 2bi (( -- value )) define-declared ;
SYNTAX: C-GLOBAL: scan-c-type CREATE-WORD define-global ;
+
+SYNTAX: pointer:
+ scan-c-type suffix! ;
diff --git a/basis/base64/base64.factor b/basis/base64/base64.factor
index 1a0648cef8..9a57740936 100644
--- a/basis/base64/base64.factor
+++ b/basis/base64/base64.factor
@@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license.
USING: combinators io io.binary io.encodings.binary
io.streams.byte-array kernel math namespaces
-sequences strings io.crlf ;
+sequences strings ;
IN: base64
ERROR: malformed-base64 ;
@@ -35,7 +35,7 @@ SYMBOL: column
: write1-lines ( ch -- )
write1
column get [
- 1 + [ 76 = [ crlf ] when ]
+ 1 + [ 76 = [ B{ CHAR: \r CHAR: \n } write ] when ]
[ 76 mod column set ] bi
] when* ;
diff --git a/basis/bit-arrays/bit-arrays.factor b/basis/bit-arrays/bit-arrays.factor
index 4fafc528fd..798bfb8ae9 100644
--- a/basis/bit-arrays/bit-arrays.factor
+++ b/basis/bit-arrays/bit-arrays.factor
@@ -1,6 +1,6 @@
! Copyright (C) 2007, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: alien.c-types alien.data accessors math alien.accessors kernel
+USING: alien alien.data accessors math alien.accessors kernel
kernel.private sequences sequences.private byte-arrays
parser prettyprint.custom fry ;
IN: bit-arrays
diff --git a/basis/bootstrap/compiler/timing/tags.txt b/basis/bootstrap/compiler/timing/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/bootstrap/compiler/timing/tags.txt
+++ b/basis/bootstrap/compiler/timing/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/cairo/ffi/ffi.factor b/basis/cairo/ffi/ffi.factor
index 947869e357..c4700d2dad 100644
--- a/basis/cairo/ffi/ffi.factor
+++ b/basis/cairo/ffi/ffi.factor
@@ -18,7 +18,7 @@ IN: cairo.ffi
LIBRARY: cairo
FUNCTION: int cairo_version ( ) ;
-FUNCTION: char* cairo_version_string ( ) ;
+FUNCTION: c-string cairo_version_string ( ) ;
TYPEDEF: int cairo_bool_t
@@ -38,7 +38,7 @@ TYPEDEF: void* cairo_pattern_t
TYPEDEF: void* cairo_destroy_func_t
: cairo-destroy-func ( quot -- callback )
- [ void { void* } "cdecl" ] dip alien-callback ; inline
+ [ void { pointer: void } "cdecl" ] dip alien-callback ; inline
! See cairo.h for details
STRUCT: cairo_user_data_key_t
@@ -79,11 +79,11 @@ CONSTANT: CAIRO_CONTENT_COLOR_ALPHA HEX: 3000
TYPEDEF: void* cairo_write_func_t
: cairo-write-func ( quot -- callback )
- [ cairo_status_t { void* uchar* int } "cdecl" ] dip alien-callback ; inline
+ [ cairo_status_t { pointer: void c-string int } "cdecl" ] dip alien-callback ; inline
TYPEDEF: void* cairo_read_func_t
: cairo-read-func ( quot -- callback )
- [ cairo_status_t { void* uchar* int } "cdecl" ] dip alien-callback ; inline
+ [ cairo_status_t { pointer: void c-string int } "cdecl" ] dip alien-callback ; inline
! Functions for manipulating state objects
FUNCTION: cairo_t*
@@ -463,7 +463,7 @@ cairo_font_options_get_hint_metrics ( cairo_font_options_t* options ) ;
! font object inside the the cairo_t.
FUNCTION: void
-cairo_select_font_face ( cairo_t* cr, char* family, cairo_font_slant_t slant, cairo_font_weight_t weight ) ;
+cairo_select_font_face ( cairo_t* cr, c-string family, cairo_font_slant_t slant, cairo_font_weight_t weight ) ;
FUNCTION: void
cairo_set_font_size ( cairo_t* cr, double size ) ;
@@ -493,19 +493,19 @@ FUNCTION: cairo_scaled_font_t*
cairo_get_scaled_font ( cairo_t* cr ) ;
FUNCTION: void
-cairo_show_text ( cairo_t* cr, char* utf8 ) ;
+cairo_show_text ( cairo_t* cr, c-string utf8 ) ;
FUNCTION: void
cairo_show_glyphs ( cairo_t* cr, cairo_glyph_t* glyphs, int num_glyphs ) ;
FUNCTION: void
-cairo_text_path ( cairo_t* cr, char* utf8 ) ;
+cairo_text_path ( cairo_t* cr, c-string utf8 ) ;
FUNCTION: void
cairo_glyph_path ( cairo_t* cr, cairo_glyph_t* glyphs, int num_glyphs ) ;
FUNCTION: void
-cairo_text_extents ( cairo_t* cr, char* utf8, cairo_text_extents_t* extents ) ;
+cairo_text_extents ( cairo_t* cr, c-string utf8, cairo_text_extents_t* extents ) ;
FUNCTION: void
cairo_glyph_extents ( cairo_t* cr, cairo_glyph_t* glyphs, int num_glyphs, cairo_text_extents_t* extents ) ;
@@ -573,7 +573,7 @@ FUNCTION: void
cairo_scaled_font_extents ( cairo_scaled_font_t* scaled_font, cairo_font_extents_t* extents ) ;
FUNCTION: void
-cairo_scaled_font_text_extents ( cairo_scaled_font_t* scaled_font, char* utf8, cairo_text_extents_t* extents ) ;
+cairo_scaled_font_text_extents ( cairo_scaled_font_t* scaled_font, c-string utf8, cairo_text_extents_t* extents ) ;
FUNCTION: void
cairo_scaled_font_glyph_extents ( cairo_scaled_font_t* scaled_font, cairo_glyph_t* glyphs, int num_glyphs, cairo_text_extents_t* extents ) ;
@@ -682,7 +682,7 @@ cairo_path_destroy ( cairo_path_t* path ) ;
FUNCTION: cairo_status_t
cairo_status ( cairo_t* cr ) ;
-FUNCTION: char*
+FUNCTION: c-string
cairo_status_to_string ( cairo_status_t status ) ;
! Surface manipulation
@@ -731,7 +731,7 @@ FUNCTION: cairo_content_t
cairo_surface_get_content ( cairo_surface_t* surface ) ;
FUNCTION: cairo_status_t
-cairo_surface_write_to_png ( cairo_surface_t* surface, char* filename ) ;
+cairo_surface_write_to_png ( cairo_surface_t* surface, c-string filename ) ;
FUNCTION: cairo_status_t
cairo_surface_write_to_png_stream ( cairo_surface_t* surface, cairo_write_func_t write_func, void* closure ) ;
@@ -786,7 +786,7 @@ FUNCTION: int
cairo_format_stride_for_width ( cairo_format_t format, int width ) ;
FUNCTION: cairo_surface_t*
-cairo_image_surface_create_for_data ( uchar* data, cairo_format_t format, int width, int height, int stride ) ;
+cairo_image_surface_create_for_data ( char* data, cairo_format_t format, int width, int height, int stride ) ;
FUNCTION: uchar*
cairo_image_surface_get_data ( cairo_surface_t* surface ) ;
@@ -804,7 +804,7 @@ FUNCTION: int
cairo_image_surface_get_stride ( cairo_surface_t* surface ) ;
FUNCTION: cairo_surface_t*
-cairo_image_surface_create_from_png ( char* filename ) ;
+cairo_image_surface_create_from_png ( c-string filename ) ;
FUNCTION: cairo_surface_t*
cairo_image_surface_create_from_png_stream ( cairo_read_func_t read_func, void* closure ) ;
diff --git a/basis/calendar/calendar-docs.factor b/basis/calendar/calendar-docs.factor
index 616c4d2c2c..6ce8b1d5fd 100644
--- a/basis/calendar/calendar-docs.factor
+++ b/basis/calendar/calendar-docs.factor
@@ -309,7 +309,7 @@ HELP: time-
} ;
HELP: convert-timezone
-{ $values { "timestamp" timestamp } { "duration" duration } { "timestamp" timestamp } }
+{ $values { "timestamp" timestamp } { "duration" duration } { "timestamp'" timestamp } }
{ $description "Converts the " { $snippet "timestamp" } "'s " { $snippet "gmt-offset" } " to the GMT offset represented by the " { $snippet "duration" } "." }
{ $examples
{ $example "USING: accessors calendar prettyprint ;"
@@ -319,7 +319,7 @@ HELP: convert-timezone
} ;
HELP: >local-time
-{ $values { "timestamp" timestamp } { "timestamp" timestamp } }
+{ $values { "timestamp" timestamp } { "timestamp'" timestamp } }
{ $description "Converts the " { $snippet "timestamp" } " to the timezone of your computer." }
{ $examples
{ $example "USING: accessors calendar kernel prettyprint ;"
@@ -329,7 +329,7 @@ HELP: >local-time
} ;
HELP: >gmt
-{ $values { "timestamp" timestamp } { "timestamp" timestamp } }
+{ $values { "timestamp" timestamp } { "timestamp'" timestamp } }
{ $description "Converts the " { $snippet "timestamp" } " to the GMT timezone." }
{ $examples
{ $example "USING: accessors calendar kernel prettyprint ;"
diff --git a/basis/calendar/calendar.factor b/basis/calendar/calendar.factor
index 3940af4856..1a64ceb646 100644
--- a/basis/calendar/calendar.factor
+++ b/basis/calendar/calendar.factor
@@ -316,15 +316,15 @@ M: duration <=> [ duration>years ] compare ;
GENERIC: time- ( time1 time2 -- time3 )
-: convert-timezone ( timestamp duration -- timestamp )
+: convert-timezone ( timestamp duration -- timestamp' )
over gmt-offset>> over = [ drop ] [
[ over gmt-offset>> time- time+ ] keep >>gmt-offset
] if ;
-: >local-time ( timestamp -- timestamp )
+: >local-time ( timestamp -- timestamp' )
gmt-offset-duration convert-timezone ;
-: >gmt ( timestamp -- timestamp )
+: >gmt ( timestamp -- timestamp' )
instant convert-timezone ;
M: timestamp <=> ( ts1 ts2 -- n )
diff --git a/basis/calendar/unix/platforms.txt b/basis/calendar/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/calendar/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/calendar/unix/tags.txt b/basis/calendar/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/calendar/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/calendar/unix/unix.factor b/basis/calendar/unix/unix.factor
index ac72385d8c..fdc85c943a 100644
--- a/basis/calendar/unix/unix.factor
+++ b/basis/calendar/unix/unix.factor
@@ -21,7 +21,7 @@ IN: calendar.unix
timespec>seconds since-1970 ;
: get-time ( -- alien )
- f time localtime tm memory>struct ;
+ f time localtime ;
: timezone-name ( -- string )
get-time zone>> ;
diff --git a/basis/calendar/windows/platforms.txt b/basis/calendar/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/calendar/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/calendar/windows/tags.txt b/basis/calendar/windows/tags.txt
deleted file mode 100755
index 6bf68304bb..0000000000
--- a/basis/calendar/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/classes/struct/struct-docs.factor b/basis/classes/struct/struct-docs.factor
index 1a5294992e..7dbfda1f4f 100644
--- a/basis/classes/struct/struct-docs.factor
+++ b/basis/classes/struct/struct-docs.factor
@@ -159,7 +159,7 @@ $nl
"A C function which returns a struct by value:"
{ $code
"USING: alien.syntax ;"
- "FUNCTION: Point give_me_a_point ( char* description ) ;"
+ "FUNCTION: Point give_me_a_point ( c-string description ) ;"
}
"A C function which takes a struct parameter by reference:"
{ $code
diff --git a/basis/classes/struct/struct-tests.factor b/basis/classes/struct/struct-tests.factor
index 2c0db93522..dafd31efde 100644
--- a/basis/classes/struct/struct-tests.factor
+++ b/basis/classes/struct/struct-tests.factor
@@ -1,11 +1,11 @@
! (c)Joe Groff bsd license
-USING: accessors alien alien.c-types alien.data ascii
-assocs byte-arrays classes.struct classes.tuple.private
-combinators compiler.tree.debugger compiler.units destructors
-io.encodings.utf8 io.pathnames io.streams.string kernel libc
-literals math mirrors namespaces prettyprint
-prettyprint.config see sequences specialized-arrays system
-tools.test parser lexer eval layouts ;
+USING: accessors alien alien.c-types alien.data alien.syntax ascii
+assocs byte-arrays classes.struct classes.tuple.parser
+classes.tuple.private classes.tuple combinators compiler.tree.debugger
+compiler.units destructors io.encodings.utf8 io.pathnames
+io.streams.string kernel libc literals math mirrors namespaces
+prettyprint prettyprint.config see sequences specialized-arrays system
+tools.test parser lexer eval layouts generic.single classes ;
FROM: math => float ;
QUALIFIED-WITH: alien.c-types c
SPECIALIZED-ARRAY: char
@@ -139,7 +139,7 @@ UNION-STRUCT: struct-test-float-and-bits
[ 123 ] [ [ struct-test-foo malloc-struct &free y>> ] with-destructors ] unit-test
STRUCT: struct-test-string-ptr
- { x char* } ;
+ { x c-string } ;
[ "hello world" ] [
[
@@ -219,7 +219,7 @@ UNION-STRUCT: struct-test-float-and-bits
{ type bool }
{ class object }
}
-} ] [ "struct-test-foo" c-type fields>> ] unit-test
+} ] [ struct-test-foo c-type fields>> ] unit-test
[ {
T{ struct-slot-spec
@@ -236,7 +236,7 @@ UNION-STRUCT: struct-test-float-and-bits
{ class integer }
{ initial 0 }
}
-} ] [ "struct-test-float-and-bits" c-type fields>> ] unit-test
+} ] [ struct-test-float-and-bits c-type fields>> ] unit-test
STRUCT: struct-test-equality-1
{ x int } ;
@@ -334,24 +334,40 @@ STRUCT: struct-that's-a-word { x int } ;
"struct-class-test-1" parse-stream
] [ error>> error>> unexpected-eof? ] must-fail-with
+[
+ "USING: alien.c-types classes.struct ; IN: classes.struct.tests STRUCT: struct-test-duplicate-slots { x uint } { x uint } ;" eval( -- )
+] [ error>> duplicate-slot-names? ] must-fail-with
+
+[
+ "USING: alien.c-types classes.struct ; IN: classes.struct.tests STRUCT: struct-test-duplicate-slots { x uint } { x float } ;" eval( -- )
+] [ error>> duplicate-slot-names? ] must-fail-with
+
! S{ with non-struct type
[
"USE: classes.struct IN: classes.struct.tests TUPLE: not-a-struct ; S{ not-a-struct }"
eval( -- value )
-] must-fail
+] [ error>> no-method? ] must-fail-with
! Subclassing a struct class should not be allowed
[
- "USE: classes.struct IN: classes.struct.tests STRUCT: a-struct { x int } ; TUPLE: not-a-struct < a-struct ;"
+ "USING: alien.c-types classes.struct ; IN: classes.struct.tests STRUCT: a-struct { x int } ; TUPLE: not-a-struct < a-struct ;"
eval( -- )
-] must-fail
+] [ error>> bad-superclass? ] must-fail-with
-! Remove c-type when struct class is forgotten
-[ ] [
- "USE: classes.struct IN: classes.struct.tests TUPLE: a-struct ;" eval( -- )
-] unit-test
+! Changing a superclass into a struct should reset the subclass
+TUPLE: will-become-struct ;
-[ f ] [ "a-struct" c-types get key? ] unit-test
+TUPLE: a-subclass < will-become-struct ;
+
+[ f ] [ will-become-struct struct-class? ] unit-test
+
+[ will-become-struct ] [ a-subclass superclass ] unit-test
+
+[ ] [ "IN: classes.struct.tests USING: classes.struct alien.c-types ; STRUCT: will-become-struct { x int } ;" eval( -- ) ] unit-test
+
+[ t ] [ will-become-struct struct-class? ] unit-test
+
+[ tuple ] [ a-subclass superclass ] unit-test
STRUCT: bit-field-test
{ a uint bits: 12 }
@@ -366,6 +382,63 @@ STRUCT: bit-field-test
[ 1 ] [ bit-field-test 257 >>c c>> ] unit-test
[ 3 ] [ bit-field-test heap-size ] unit-test
+STRUCT: referent
+ { y int } ;
+STRUCT: referrer
+ { x referent* } ;
+
+[ 57 ] [
+ [
+ referrer
+ referent malloc-struct &free
+ 57 >>y
+ >>x
+ x>> y>>
+ ] with-destructors
+] unit-test
+
+STRUCT: self-referent
+ { x self-referent* }
+ { y int } ;
+
+[ 75 ] [
+ [
+ self-referent
+ self-referent malloc-struct &free
+ 75 >>y
+ >>x
+ x>> y>>
+ ] with-destructors
+] unit-test
+
+C-TYPE: forward-referent
+STRUCT: backward-referent
+ { x forward-referent* }
+ { y int } ;
+STRUCT: forward-referent
+ { x backward-referent* }
+ { y int } ;
+
+[ 41 ] [
+ [
+ forward-referent
+ backward-referent malloc-struct &free
+ 41 >>y
+ >>x
+ x>> y>>
+ ] with-destructors
+] unit-test
+
+[ 14 ] [
+ [
+ backward-referent
+ forward-referent malloc-struct &free
+ 14 >>y
+ >>x
+ x>> y>>
+ ] with-destructors
+] unit-test
+
cpu ppc? [
STRUCT: ppc-align-test-1
{ x longlong }
diff --git a/basis/classes/struct/struct.factor b/basis/classes/struct/struct.factor
index fae39cd229..79dea73d8c 100644
--- a/basis/classes/struct/struct.factor
+++ b/basis/classes/struct/struct.factor
@@ -8,7 +8,8 @@ generalizations generic.parser kernel kernel.private lexer libc
locals macros make math math.order parser quotations sequences
slots slots.private specialized-arrays vectors words summary
namespaces assocs vocabs.parser math.functions
-classes.struct.bit-accessors bit-arrays ;
+classes.struct.bit-accessors bit-arrays
+stack-checker.dependencies ;
QUALIFIED: math
IN: classes.struct
@@ -32,8 +33,6 @@ TUPLE: struct-bit-slot-spec < struct-slot-spec
PREDICATE: struct-class < tuple-class
superclass \ struct eq? ;
-M: struct-class valid-superclass? drop f ;
-
SLOT: fields
: struct-slots ( struct-class -- slots )
@@ -47,11 +46,11 @@ M: struct >c-ptr
M: struct equal?
{
[ [ class ] bi@ = ]
- [ [ >c-ptr ] [ [ >c-ptr ] [ byte-length ] bi ] bi* memory= ]
+ [ [ >c-ptr ] [ binary-object ] bi* memory= ]
} 2&& ; inline
M: struct hashcode*
- [ >c-ptr ] [ byte-length ] bi hashcode* ; inline
+ binary-object hashcode* ; inline
: struct-prototype ( class -- prototype ) "prototype" word-prop ; foldable
@@ -126,11 +125,19 @@ M: struct-bit-slot-spec (writer-quot)
: (unboxer-quot) ( class -- quot )
drop [ >c-ptr ] ;
+
+MACRO: read-struct-slot ( slot -- )
+ dup type>> depends-on-c-type
+ (reader-quot) ;
+
+MACRO: write-struct-slot ( slot -- )
+ dup type>> depends-on-c-type
+ (writer-quot) ;
PRIVATE>
M: struct-class boa>object
swap pad-struct-slots
- [ ] [ struct-slots ] bi
+ [ ] [ struct-slots ] bi
[ [ (writer-quot) call( value struct -- ) ] with 2each ] curry keep ;
M: struct-class initial-value* ; inline
@@ -140,10 +147,11 @@ M: struct-class initial-value* ; inline
GENERIC: struct-slot-values ( struct -- sequence )
M: struct-class reader-quot
- nip (reader-quot) ;
+ dup type>> array? [ dup type>> first define-array-vocab drop ] when
+ nip '[ _ read-struct-slot ] ;
M: struct-class writer-quot
- nip (writer-quot) ;
+ nip '[ _ write-struct-slot ] ;
: offset-of ( field struct -- offset )
struct-slots slot-named offset>> ; inline
@@ -195,7 +203,7 @@ M: struct-c-type c-struct? drop t ;
define-inline-method ;
: clone-underlying ( struct -- byte-array )
- [ >c-ptr ] [ byte-length ] bi memory>byte-array ; inline
+ binary-object memory>byte-array ; inline
: (define-clone-method) ( class -- )
[ \ clone ]
@@ -273,7 +281,7 @@ M: struct binary-zero? >c-ptr [ 0 = ] all? ;
[ type>> c-type drop ] each ;
: redefine-struct-tuple-class ( class -- )
- [ dup class? [ forget-class ] [ drop ] if ] [ struct f define-tuple-class ] bi ;
+ [ struct f define-tuple-class ] [ make-final ] bi ;
:: (define-struct-class) ( class slots offsets-quot -- )
slots empty? [ struct-must-have-slots ] when
@@ -298,9 +306,6 @@ PRIVATE>
: define-union-struct-class ( class slots -- )
[ compute-union-offsets ] (define-struct-class) ;
-M: struct-class reset-class
- [ call-next-method ] [ name>> c-types get delete-at ] bi ;
-
ERROR: invalid-struct-slot token ;
: struct-slot-class ( c-type -- class' )
@@ -348,7 +353,7 @@ PRIVATE>
;
-
+
: parse-struct-slots ( slots -- slots' more? )
scan {
{ ";" [ f ] }
@@ -358,7 +363,8 @@ PRIVATE>
} case ;
: parse-struct-definition ( -- class slots )
- CREATE-CLASS 8 [ parse-struct-slots ] [ ] while >array ;
+ CREATE-CLASS 8 [ parse-struct-slots ] [ ] while >array
+ dup [ name>> ] map check-duplicate-slots ;
PRIVATE>
SYNTAX: STRUCT:
diff --git a/basis/cocoa/application/platforms.txt b/basis/cocoa/application/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/application/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/application/tags.txt b/basis/cocoa/application/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/application/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/callbacks/callbacks.factor b/basis/cocoa/callbacks/callbacks.factor
index e1ec43f1dc..87b5f628a9 100644
--- a/basis/cocoa/callbacks/callbacks.factor
+++ b/basis/cocoa/callbacks/callbacks.factor
@@ -1,7 +1,7 @@
! Copyright (C) 2005, 2006 Kevin Reid.
! See http://factorcode.org/license.txt for BSD license.
-USING: assocs kernel namespaces cocoa cocoa.classes
-cocoa.subclassing debugger ;
+USING: alien.c-types assocs kernel namespaces cocoa
+cocoa.classes cocoa.runtime cocoa.subclassing debugger ;
IN: cocoa.callbacks
SYMBOL: callbacks
diff --git a/basis/cocoa/callbacks/platforms.txt b/basis/cocoa/callbacks/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/callbacks/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/callbacks/tags.txt b/basis/cocoa/callbacks/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/callbacks/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/cocoa.factor b/basis/cocoa/cocoa.factor
index 34bac0a505..fb21843c0f 100644
--- a/basis/cocoa/cocoa.factor
+++ b/basis/cocoa/cocoa.factor
@@ -39,6 +39,7 @@ SYNTAX: IMPORT: scan [ ] import-objc-class ;
[
{
+ "NSAlert"
"NSApplication"
"NSArray"
"NSAutoreleasePool"
diff --git a/basis/cocoa/dialogs/platforms.txt b/basis/cocoa/dialogs/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/dialogs/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/dialogs/tags.txt b/basis/cocoa/dialogs/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/dialogs/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/enumeration/platforms.txt b/basis/cocoa/enumeration/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/enumeration/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/enumeration/tags.txt b/basis/cocoa/enumeration/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/enumeration/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/messages/messages.factor b/basis/cocoa/messages/messages.factor
index 02e6335c54..a744087037 100644
--- a/basis/cocoa/messages/messages.factor
+++ b/basis/cocoa/messages/messages.factor
@@ -76,13 +76,13 @@ MACRO: (send) ( selector super? -- quot )
: super-send ( receiver args... selector -- return... ) t (send) ; inline
! Runtime introspection
-SYMBOL: class-startup-hooks
+SYMBOL: class-init-hooks
-class-startup-hooks [ H{ } clone ] initialize
+class-init-hooks [ H{ } clone ] initialize
: (objc-class) ( name word -- class )
2dup execute dup [ 2nip ] [
- drop over class-startup-hooks get at [ call( -- ) ] when*
+ drop over class-init-hooks get at [ call( -- ) ] when*
2dup execute dup [ 2nip ] [
2drop "No such class: " prepend throw
] if
@@ -110,7 +110,7 @@ H{
{ "d" c:double }
{ "B" c:bool }
{ "v" c:void }
- { "*" c:char* }
+ { "*" c:c-string }
{ "?" unknown_type }
{ "@" id }
{ "#" Class }
@@ -229,16 +229,19 @@ ERROR: no-objc-type name ;
: class-exists? ( string -- class ) objc_getClass >boolean ;
: define-objc-class-word ( quot name -- )
- [ class-startup-hooks get set-at ]
+ [ class-init-hooks get set-at ]
[
[ "cocoa.classes" create ] [ '[ _ objc-class ] ] bi
(( -- class )) define-declared
] bi ;
: import-objc-class ( name quot -- )
- over define-objc-class-word
- [ objc-class register-objc-methods ]
- [ objc-meta-class register-objc-methods ] bi ;
+ 2dup swap define-objc-class-word
+ over class-exists? [ drop ] [ call( -- ) ] if
+ dup class-exists? [
+ [ objc_getClass register-objc-methods ]
+ [ objc_getMetaClass register-objc-methods ] bi
+ ] [ drop ] if ;
: root-class ( class -- root )
dup class_getSuperclass [ root-class ] [ ] ?if ;
diff --git a/basis/cocoa/messages/platforms.txt b/basis/cocoa/messages/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/messages/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/messages/tags.txt b/basis/cocoa/messages/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/messages/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/nibs/platforms.txt b/basis/cocoa/nibs/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/nibs/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/nibs/tags.txt b/basis/cocoa/nibs/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/nibs/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/pasteboard/platforms.txt b/basis/cocoa/pasteboard/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/pasteboard/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/pasteboard/tags.txt b/basis/cocoa/pasteboard/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/pasteboard/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/platforms.txt b/basis/cocoa/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/plists/platforms.txt b/basis/cocoa/plists/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/plists/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/plists/tags.txt b/basis/cocoa/plists/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/plists/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/runtime/platforms.txt b/basis/cocoa/runtime/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/runtime/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/runtime/runtime.factor b/basis/cocoa/runtime/runtime.factor
index f02f1f6182..9e49835242 100644
--- a/basis/cocoa/runtime/runtime.factor
+++ b/basis/cocoa/runtime/runtime.factor
@@ -7,11 +7,11 @@ TYPEDEF: void* SEL
TYPEDEF: void* id
-FUNCTION: char* sel_getName ( SEL aSelector ) ;
+FUNCTION: c-string sel_getName ( SEL aSelector ) ;
FUNCTION: char sel_isMapped ( SEL aSelector ) ;
-FUNCTION: SEL sel_registerName ( char* str ) ;
+FUNCTION: SEL sel_registerName ( c-string str ) ;
TYPEDEF: void* Class
TYPEDEF: void* Method
@@ -33,13 +33,13 @@ CONSTANT: CLS_METHOD_ARRAY HEX: 100
FUNCTION: int objc_getClassList ( void* buffer, int bufferLen ) ;
-FUNCTION: Class objc_getClass ( char* class ) ;
+FUNCTION: Class objc_getClass ( c-string class ) ;
-FUNCTION: Class objc_getMetaClass ( char* class ) ;
+FUNCTION: Class objc_getMetaClass ( c-string class ) ;
-FUNCTION: Protocol objc_getProtocol ( char* class ) ;
+FUNCTION: Protocol objc_getProtocol ( c-string class ) ;
-FUNCTION: Class objc_allocateClassPair ( Class superclass, char* name, size_t extraBytes ) ;
+FUNCTION: Class objc_allocateClassPair ( Class superclass, c-string name, size_t extraBytes ) ;
FUNCTION: void objc_registerClassPair ( Class cls ) ;
FUNCTION: id class_createInstance ( Class class, uint additionalByteCount ) ;
@@ -54,7 +54,7 @@ FUNCTION: Method* class_copyMethodList ( Class class, uint* outCount ) ;
FUNCTION: Class class_getSuperclass ( Class cls ) ;
-FUNCTION: char* class_getName ( Class cls ) ;
+FUNCTION: c-string class_getName ( Class cls ) ;
FUNCTION: char class_addMethod ( Class class, SEL name, void* imp, void* types ) ;
@@ -64,7 +64,7 @@ FUNCTION: uint method_getNumberOfArguments ( Method method ) ;
FUNCTION: uint method_getSizeOfArguments ( Method method ) ;
-FUNCTION: uint method_getArgumentInfo ( Method method, int argIndex, char** type, int* offset ) ;
+FUNCTION: uint method_getArgumentInfo ( Method method, int argIndex, c-string* type, int* offset ) ;
FUNCTION: void* method_copyReturnType ( Method method ) ;
diff --git a/basis/cocoa/runtime/tags.txt b/basis/cocoa/runtime/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/runtime/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/subclassing/platforms.txt b/basis/cocoa/subclassing/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/subclassing/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/subclassing/tags.txt b/basis/cocoa/subclassing/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/subclassing/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/tags.txt b/basis/cocoa/tags.txt
index 2320bdd648..40fc52b29b 100644
--- a/basis/cocoa/tags.txt
+++ b/basis/cocoa/tags.txt
@@ -1,2 +1,2 @@
-unportable
bindings
+ffi
diff --git a/basis/cocoa/types/platforms.txt b/basis/cocoa/types/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/types/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/types/tags.txt b/basis/cocoa/types/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/types/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/views/platforms.txt b/basis/cocoa/views/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/views/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/views/tags.txt b/basis/cocoa/views/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/views/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cocoa/windows/platforms.txt b/basis/cocoa/windows/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/cocoa/windows/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/cocoa/windows/tags.txt b/basis/cocoa/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cocoa/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/compiler/crossref/crossref-tests.factor b/basis/compiler/crossref/crossref-tests.factor
new file mode 100644
index 0000000000..9cd475b2de
--- /dev/null
+++ b/basis/compiler/crossref/crossref-tests.factor
@@ -0,0 +1,9 @@
+USING: compiler.crossref fry kernel sequences tools.test vocabs words ;
+IN: compiler.crossref.tests
+
+! Dependencies of all words should always be satisfied unless we're
+! in the middle of recompiling something
+[ { } ] [
+ all-words dup [ subwords ] map concat append
+ H{ } clone '[ _ dependencies-satisfied? not ] filter
+] unit-test
diff --git a/basis/compiler/tests/alien.factor b/basis/compiler/tests/alien.factor
index aba73d1a22..acb5555bc3 100755
--- a/basis/compiler/tests/alien.factor
+++ b/basis/compiler/tests/alien.factor
@@ -67,7 +67,7 @@ FUNCTION: FOO ffi_test_14 int x int y ;
[ 11 6 ] [ 11 6 ffi_test_14 [ x>> ] [ y>> ] bi ] unit-test
-FUNCTION: char* ffi_test_15 char* x char* y ;
+FUNCTION: c-string ffi_test_15 c-string x c-string y ;
[ "foo" ] [ "xy" "zt" ffi_test_15 ] unit-test
[ "bar" ] [ "xy" "xy" ffi_test_15 ] unit-test
@@ -576,7 +576,7 @@ FUNCTION: complex-float ffi_test_47 ( complex-float x, complex-double y ) ;
! Reported by jedahu
STRUCT: bool-field-test
- { name char* }
+ { name c-string }
{ on bool }
{ parents short } ;
diff --git a/basis/compiler/tests/redefine22.factor b/basis/compiler/tests/redefine22.factor
new file mode 100644
index 0000000000..5837d68c73
--- /dev/null
+++ b/basis/compiler/tests/redefine22.factor
@@ -0,0 +1,11 @@
+IN: compiler.tests.redefine22
+USING: kernel sequences compiler.units vocabs tools.test definitions ;
+
+TUPLE: ttt ;
+INSTANCE: ttt sequence
+M: ttt new-sequence 2drop ttt new ;
+
+: www-1 ( a -- b ) T{ ttt } new-sequence ;
+
+! This used to break with a compiler error in the above word
+[ ] [ [ \ ttt forget ] with-compilation-unit ] unit-test
diff --git a/basis/compiler/tests/redefine23.factor b/basis/compiler/tests/redefine23.factor
new file mode 100644
index 0000000000..e6061937b6
--- /dev/null
+++ b/basis/compiler/tests/redefine23.factor
@@ -0,0 +1,13 @@
+IN: compiler.tests.redefine23
+USING: classes.struct specialized-arrays alien.c-types sequences
+compiler.units vocabs tools.test ;
+
+STRUCT: my-struct { x int } ;
+SPECIALIZED-ARRAY: my-struct
+: my-word ( a -- b ) iota [ my-struct ] my-struct-array{ } map-as ;
+
+[ ] [
+ [
+ "specialized-arrays.instances.compiler.tests.redefine23" forget-vocab
+ ] with-compilation-unit
+] unit-test
diff --git a/basis/compiler/tests/redefine24.factor b/basis/compiler/tests/redefine24.factor
new file mode 100644
index 0000000000..391102102e
--- /dev/null
+++ b/basis/compiler/tests/redefine24.factor
@@ -0,0 +1,39 @@
+USING: alien alien.syntax eval math tools.test ;
+QUALIFIED: alien.c-types
+IN: compiler.tests.redefine24
+
+TYPEDEF: alien.c-types:int type-1
+
+TYPEDEF: alien.c-types:int type-3
+
+: callback ( -- ptr )
+ type-3 { type-1 type-1 } "cdecl" [ + >integer ] alien-callback ;
+
+TYPEDEF: alien.c-types:float type-2
+
+: indirect ( x y ptr -- z )
+ type-3 { type-2 type-2 } "cdecl" alien-indirect ;
+
+[ ] [
+ "USING: alien.c-types alien.syntax ;
+ IN: compiler.tests.redefine24 TYPEDEF: int type-2" eval( -- )
+] unit-test
+
+[ 3 ] [ 1 2 callback indirect ] unit-test
+
+[ ] [
+ "USING: alien.c-types alien.syntax ;
+ IN: compiler.tests.redefine24
+ TYPEDEF: float type-1
+ TYPEDEF: float type-2" eval( -- )
+] unit-test
+
+[ 3 ] [ 1.0 2.0 callback indirect ] unit-test
+
+[ ] [
+ "USING: alien.c-types alien.syntax ;
+ IN: compiler.tests.redefine24
+ TYPEDEF: float type-3" eval( -- )
+] unit-test
+
+[ 3.0 ] [ 1.0 2.0 callback indirect ] unit-test
diff --git a/basis/compiler/tree/cleanup/cleanup.factor b/basis/compiler/tree/cleanup/cleanup.factor
index b19c99c360..b69f053898 100644
--- a/basis/compiler/tree/cleanup/cleanup.factor
+++ b/basis/compiler/tree/cleanup/cleanup.factor
@@ -51,11 +51,16 @@ GENERIC: cleanup* ( node -- node/nodes )
[ in-d>> #drop ]
bi prefix ;
-: record-predicate-folding ( #call -- )
- [ node-input-infos first class>> ]
+: >predicate-folding< ( #call -- value-info class result )
+ [ node-input-infos first ]
[ word>> "predicating" word-prop ]
- [ node-output-infos first literal>> ] tri
- [ depends-on-class<= ] [ depends-on-classes-disjoint ] if ;
+ [ node-output-infos first literal>> ] tri ;
+
+: record-predicate-folding ( #call -- )
+ >predicate-folding< pick literal?>>
+ [ [ literal>> ] 2dip depends-on-instance-predicate ]
+ [ [ class>> ] 2dip depends-on-class-predicate ]
+ if ;
: record-folding ( #call -- )
dup word>> predicate?
diff --git a/basis/compiler/tree/propagation/info/info.factor b/basis/compiler/tree/propagation/info/info.factor
index 28ffb96f8f..7f5b9f6fcd 100644
--- a/basis/compiler/tree/propagation/info/info.factor
+++ b/basis/compiler/tree/propagation/info/info.factor
@@ -1,10 +1,11 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs classes classes.algebra classes.tuple
-classes.tuple.private kernel accessors math math.intervals namespaces
-sequences sequences.private words combinators memoize
-combinators.short-circuit byte-arrays strings arrays layouts
-cpu.architecture compiler.tree.propagation.copy ;
+classes.tuple.private classes.singleton kernel accessors math
+math.intervals namespaces sequences sequences.private words
+combinators memoize combinators.short-circuit byte-arrays
+strings arrays layouts cpu.architecture
+compiler.tree.propagation.copy ;
IN: compiler.tree.propagation.info
: false-class? ( class -- ? ) \ f class<= ;
@@ -65,9 +66,17 @@ DEFER:
UNION: fixed-length array byte-array string ;
+: literal-class ( obj -- class )
+ #! Handle forgotten tuples and singleton classes properly
+ dup singleton-class? [
+ class dup class? [
+ drop tuple
+ ] unless
+ ] unless ;
+
: init-literal-info ( info -- info )
empty-interval >>interval
- dup literal>> class >>class
+ dup literal>> literal-class >>class
dup literal>> {
{ [ dup real? ] [ [a,a] >>interval ] }
{ [ dup tuple? ] [ tuple-slot-infos >>slots ] }
diff --git a/basis/compiler/tree/propagation/propagation-tests.factor b/basis/compiler/tree/propagation/propagation-tests.factor
index e2bfe58788..444a424766 100644
--- a/basis/compiler/tree/propagation/propagation-tests.factor
+++ b/basis/compiler/tree/propagation/propagation-tests.factor
@@ -648,7 +648,7 @@ M: array iterate first t ; inline
] final-info drop
] unit-test
-[ V{ word } ] [
+[ V{ t } ] [
[ { hashtable } declare hashtable instance? ] final-classes
] unit-test
@@ -660,7 +660,7 @@ M: array iterate first t ; inline
[ { assoc } declare hashtable instance? ] final-classes
] unit-test
-[ V{ word } ] [
+[ V{ t } ] [
[ { string } declare string? ] final-classes
] unit-test
@@ -774,7 +774,7 @@ MIXIN: empty-mixin
[ { fixnum } declare log2 ] final-classes
] unit-test
-[ V{ word } ] [
+[ V{ t } ] [
[ { fixnum } declare log2 0 >= ] final-classes
] unit-test
diff --git a/basis/compiler/tree/propagation/simple/simple.factor b/basis/compiler/tree/propagation/simple/simple.factor
index ccfd6ffabd..ce169233c1 100644
--- a/basis/compiler/tree/propagation/simple/simple.factor
+++ b/basis/compiler/tree/propagation/simple/simple.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: fry accessors kernel sequences sequences.private assocs
words namespaces classes.algebra combinators
@@ -72,7 +72,7 @@ M: #declare propagate-before
: foldable-call? ( #call word -- ? )
{
- [ nip "foldable" word-prop ]
+ [ nip foldable? ]
[ drop literal-inputs? ]
[ input-classes-match? ]
} 2&& ;
@@ -93,11 +93,8 @@ M: #declare propagate-before
recover ;
: predicate-output-infos/class ( info class -- info )
- [ class>> ] dip {
- { [ 2dup class<= ] [ t ] }
- { [ 2dup classes-intersect? not ] [ f ] }
- [ object-info ]
- } cond 2nip ;
+ [ class>> ] dip compare-classes
+ dup +incomparable+ eq? [ drop object-info ] [ ] if ;
: predicate-output-infos ( info class -- info )
over literal?>>
diff --git a/basis/compression/lzw/lzw-docs.factor b/basis/compression/lzw/lzw-docs.factor
index 28dc36902b..55c54bc9f7 100644
--- a/basis/compression/lzw/lzw-docs.factor
+++ b/basis/compression/lzw/lzw-docs.factor
@@ -20,7 +20,6 @@ HELP: tiff-lzw-uncompress
HELP: lzw-read
{ $values
- { "lzw" lzw }
{ "lzw" lzw } { "n" integer }
}
{ $description "Read the next LZW code." } ;
@@ -48,7 +47,6 @@ HELP: code-space-full?
HELP: reset-lzw-uncompress
{ $values
{ "lzw" lzw }
- { "lzw" lzw }
}
{ $description "Reset the LZW uncompressor state (either at initialization time or immediately after receiving a Clear Code). " } ;
diff --git a/basis/concurrency/mailboxes/mailboxes-tests.factor b/basis/concurrency/mailboxes/mailboxes-tests.factor
index 56d579d6c7..87a4c3cdba 100644
--- a/basis/concurrency/mailboxes/mailboxes-tests.factor
+++ b/basis/concurrency/mailboxes/mailboxes-tests.factor
@@ -1,89 +1,54 @@
-USING: concurrency.mailboxes concurrency.count-downs concurrency.conditions
-vectors sequences threads tools.test math kernel strings namespaces
-continuations calendar destructors ;
-IN: concurrency.mailboxes.tests
-
-{ 1 1 } [ [ integer? ] mailbox-get? ] must-infer-as
-
-[ V{ 1 2 3 } ] [
- 0
-
- [ mailbox-get swap push ] in-thread
- [ mailbox-get swap push ] in-thread
- [ mailbox-get swap push ] in-thread
- 1 over mailbox-put
- 2 over mailbox-put
- 3 swap mailbox-put
-] unit-test
-
-[ V{ 1 2 3 } ] [
- 0
-
- [ [ integer? ] mailbox-get? swap push ] in-thread
- [ [ integer? ] mailbox-get? swap push ] in-thread
- [ [ integer? ] mailbox-get? swap push ] in-thread
- 1 over mailbox-put
- 2 over mailbox-put
- 3 swap mailbox-put
-] unit-test
-
-[ V{ 1 "junk" 3 "junk2" } [ 456 ] ] [
- 0
-
- [ [ integer? ] mailbox-get? swap push ] in-thread
- [ [ integer? ] mailbox-get? swap push ] in-thread
- [ [ string? ] mailbox-get? swap push ] in-thread
- [ [ string? ] mailbox-get? swap push ] in-thread
- 1 over mailbox-put
- "junk" over mailbox-put
- [ 456 ] over mailbox-put
- 3 over mailbox-put
- "junk2" over mailbox-put
- mailbox-get
-] unit-test
-
- "m" set
-
-1 "c" set
-1 "d" set
-
-[
- "c" get await
- [ "m" get mailbox-get drop ]
- [ drop "d" get count-down ] recover
-] "Mailbox close test" spawn drop
-
-[ ] [ "c" get count-down ] unit-test
-[ ] [ "m" get dispose ] unit-test
-[ ] [ "d" get 5 seconds await-timeout ] unit-test
-
-[ ] [ "m" get dispose ] unit-test
-
- "m" set
-
-1 "c" set
-1 "d" set
-
-[
- "c" get await
- "m" get wait-for-close
- "d" get count-down
-] "Mailbox close test" spawn drop
-
-[ ] [ "c" get count-down ] unit-test
-[ ] [ "m" get dispose ] unit-test
-[ ] [ "d" get 5 seconds await-timeout ] unit-test
-
-[ ] [ "m" get dispose ] unit-test
-
-[ { "foo" "bar" } ] [
-
- "foo" over mailbox-put
- "bar" over mailbox-put
- mailbox-get-all
-] unit-test
-
-[
- 1 seconds mailbox-get-timeout
-] [ wait-timeout? ] must-fail-with
-
+USING: concurrency.mailboxes concurrency.count-downs concurrency.conditions
+vectors sequences threads tools.test math kernel strings namespaces
+continuations calendar destructors ;
+IN: concurrency.mailboxes.tests
+
+{ 1 1 } [ [ integer? ] mailbox-get? ] must-infer-as
+
+[ V{ 1 2 3 } ] [
+ 0
+
+ [ mailbox-get swap push ] in-thread
+ [ mailbox-get swap push ] in-thread
+ [ mailbox-get swap push ] in-thread
+ 1 over mailbox-put
+ 2 over mailbox-put
+ 3 swap mailbox-put
+] unit-test
+
+[ V{ 1 2 3 } ] [
+ 0
+
+ [ [ integer? ] mailbox-get? swap push ] in-thread
+ [ [ integer? ] mailbox-get? swap push ] in-thread
+ [ [ integer? ] mailbox-get? swap push ] in-thread
+ 1 over mailbox-put
+ 2 over mailbox-put
+ 3 swap mailbox-put
+] unit-test
+
+[ V{ 1 "junk" 3 "junk2" } [ 456 ] ] [
+ 0
+
+ [ [ integer? ] mailbox-get? swap push ] in-thread
+ [ [ integer? ] mailbox-get? swap push ] in-thread
+ [ [ string? ] mailbox-get? swap push ] in-thread
+ [ [ string? ] mailbox-get? swap push ] in-thread
+ 1 over mailbox-put
+ "junk" over mailbox-put
+ [ 456 ] over mailbox-put
+ 3 over mailbox-put
+ "junk2" over mailbox-put
+ mailbox-get
+] unit-test
+
+[ { "foo" "bar" } ] [
+
+ "foo" over mailbox-put
+ "bar" over mailbox-put
+ mailbox-get-all
+] unit-test
+
+[
+ 1 seconds mailbox-get-timeout
+] [ wait-timeout? ] must-fail-with
diff --git a/basis/concurrency/mailboxes/mailboxes.factor b/basis/concurrency/mailboxes/mailboxes.factor
index 7834a2a3e1..221a5a1fa3 100644
--- a/basis/concurrency/mailboxes/mailboxes.factor
+++ b/basis/concurrency/mailboxes/mailboxes.factor
@@ -1,96 +1,94 @@
-! Copyright (C) 2005, 2008 Chris Double, Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: dlists deques threads sequences continuations
-destructors namespaces math quotations words kernel
-arrays assocs init system concurrency.conditions accessors
-debugger debugger.threads locals fry ;
-IN: concurrency.mailboxes
-
-TUPLE: mailbox < disposable threads data ;
-
-M: mailbox dispose* threads>> notify-all ;
-
-: ( -- mailbox )
- mailbox new-disposable >>threads >>data ;
-
-: mailbox-empty? ( mailbox -- bool )
- data>> deque-empty? ;
-
-: mailbox-put ( obj mailbox -- )
- [ data>> push-front ]
- [ threads>> notify-all ] bi yield ;
-
-: wait-for-mailbox ( mailbox timeout -- )
- [ threads>> ] dip "mailbox" wait ;
-
-:: block-unless-pred ( mailbox timeout pred: ( message -- ? ) -- )
- mailbox check-disposed
- mailbox data>> pred dlist-any? [
- mailbox timeout wait-for-mailbox
- mailbox timeout pred block-unless-pred
- ] unless ; inline recursive
-
-: block-if-empty ( mailbox timeout -- mailbox )
- over check-disposed
- over mailbox-empty? [
- 2dup wait-for-mailbox block-if-empty
- ] [
- drop
- ] if ;
-
-: mailbox-peek ( mailbox -- obj )
- data>> peek-back ;
-
-: mailbox-get-timeout ( mailbox timeout -- obj )
- block-if-empty data>> pop-back ;
-
-: mailbox-get ( mailbox -- obj )
- f mailbox-get-timeout ;
-
-: mailbox-get-all-timeout ( mailbox timeout -- array )
- block-if-empty
- [ dup mailbox-empty? not ]
- [ dup data>> pop-back ]
- produce nip ;
-
-: mailbox-get-all ( mailbox -- array )
- f mailbox-get-all-timeout ;
-
-: while-mailbox-empty ( mailbox quot -- )
- [ '[ _ mailbox-empty? ] ] dip while ; inline
-
-: mailbox-get-timeout? ( mailbox timeout pred -- obj )
- [ block-unless-pred ]
- [ [ drop data>> ] dip delete-node-if ]
- 3bi ; inline
-
-: mailbox-get? ( mailbox pred -- obj )
- f swap mailbox-get-timeout? ; inline
-
-: wait-for-close-timeout ( mailbox timeout -- )
- over disposed>>
- [ 2drop ] [ 2dup wait-for-mailbox wait-for-close-timeout ] if ;
-
-: wait-for-close ( mailbox -- )
- f wait-for-close-timeout ;
-
-TUPLE: linked-error error thread ;
-
-M: linked-error error.
- [ thread>> error-in-thread. ] [ error>> error. ] bi ;
-
-C: linked-error
-
-: ?linked ( message -- message )
- dup linked-error? [ rethrow ] when ;
-
-TUPLE: linked-thread < thread supervisor ;
-
-M: linked-thread error-in-thread
- [ ] [ supervisor>> ] bi mailbox-put ;
-
-: ( quot name mailbox -- thread' )
- [ linked-thread new-thread ] dip >>supervisor ;
-
-: spawn-linked-to ( quot name mailbox -- thread )
- [ (spawn) ] keep ;
+! Copyright (C) 2005, 2010 Chris Double, Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: dlists deques threads sequences continuations namespaces
+math quotations words kernel arrays assocs init system
+concurrency.conditions accessors debugger debugger.threads
+locals fry ;
+IN: concurrency.mailboxes
+
+TUPLE: mailbox threads data ;
+
+: ( -- mailbox )
+ mailbox new
+ >>threads
+ >>data ;
+
+: mailbox-empty? ( mailbox -- bool )
+ data>> deque-empty? ;
+
+: mailbox-put ( obj mailbox -- )
+ [ data>> push-front ]
+ [ threads>> notify-all ] bi yield ;
+
+: wait-for-mailbox ( mailbox timeout -- )
+ [ threads>> ] dip "mailbox" wait ;
+
+:: block-unless-pred ( mailbox timeout pred: ( message -- ? ) -- )
+ mailbox data>> pred dlist-any? [
+ mailbox timeout wait-for-mailbox
+ mailbox timeout pred block-unless-pred
+ ] unless ; inline recursive
+
+: block-if-empty ( mailbox timeout -- mailbox )
+ over mailbox-empty? [
+ 2dup wait-for-mailbox block-if-empty
+ ] [
+ drop
+ ] if ;
+
+: mailbox-peek ( mailbox -- obj )
+ data>> peek-back ;
+
+: mailbox-get-timeout ( mailbox timeout -- obj )
+ block-if-empty data>> pop-back ;
+
+: mailbox-get ( mailbox -- obj )
+ f mailbox-get-timeout ;
+
+: mailbox-get-all-timeout ( mailbox timeout -- array )
+ block-if-empty
+ [ dup mailbox-empty? not ]
+ [ dup data>> pop-back ]
+ produce nip ;
+
+: mailbox-get-all ( mailbox -- array )
+ f mailbox-get-all-timeout ;
+
+: while-mailbox-empty ( mailbox quot -- )
+ [ '[ _ mailbox-empty? ] ] dip while ; inline
+
+: mailbox-get-timeout? ( mailbox timeout pred -- obj )
+ [ block-unless-pred ]
+ [ [ drop data>> ] dip delete-node-if ]
+ 3bi ; inline
+
+: mailbox-get? ( mailbox pred -- obj )
+ f swap mailbox-get-timeout? ; inline
+
+: wait-for-close-timeout ( mailbox timeout -- )
+ over disposed>>
+ [ 2drop ] [ 2dup wait-for-mailbox wait-for-close-timeout ] if ;
+
+: wait-for-close ( mailbox -- )
+ f wait-for-close-timeout ;
+
+TUPLE: linked-error error thread ;
+
+M: linked-error error.
+ [ thread>> error-in-thread. ] [ error>> error. ] bi ;
+
+C: linked-error
+
+: ?linked ( message -- message )
+ dup linked-error? [ rethrow ] when ;
+
+TUPLE: linked-thread < thread supervisor ;
+
+M: linked-thread error-in-thread
+ [ ] [ supervisor>> ] bi mailbox-put ;
+
+: ( quot name mailbox -- thread' )
+ [ linked-thread new-thread ] dip >>supervisor ;
+
+: spawn-linked-to ( quot name mailbox -- thread )
+ [ (spawn) ] keep ;
diff --git a/basis/concurrency/promises/promises.factor b/basis/concurrency/promises/promises.factor
index 2ff338c4e3..4d6439cf30 100644
--- a/basis/concurrency/promises/promises.factor
+++ b/basis/concurrency/promises/promises.factor
@@ -1,26 +1,27 @@
-! Copyright (C) 2005, 2008 Chris Double, Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors concurrency.mailboxes kernel continuations ;
-IN: concurrency.promises
-
-TUPLE: promise mailbox ;
-
-: ( -- promise )
- promise boa ;
-
-: promise-fulfilled? ( promise -- ? )
- mailbox>> mailbox-empty? not ;
-
-ERROR: promise-already-fulfilled promise ;
-: fulfill ( value promise -- )
- dup promise-fulfilled? [
- promise-already-fulfilled
- ] [
- mailbox>> mailbox-put
- ] if ;
-
-: ?promise-timeout ( promise timeout -- result )
- [ mailbox>> ] dip block-if-empty mailbox-peek ;
-
-: ?promise ( promise -- result )
- f ?promise-timeout ;
+! Copyright (C) 2005, 2008 Chris Double, Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors concurrency.mailboxes kernel continuations ;
+IN: concurrency.promises
+
+TUPLE: promise mailbox ;
+
+: ( -- promise )
+ promise boa ;
+
+: promise-fulfilled? ( promise -- ? )
+ mailbox>> mailbox-empty? not ;
+
+ERROR: promise-already-fulfilled promise ;
+
+: fulfill ( value promise -- )
+ dup promise-fulfilled? [
+ promise-already-fulfilled
+ ] [
+ mailbox>> mailbox-put
+ ] if ;
+
+: ?promise-timeout ( promise timeout -- result )
+ [ mailbox>> ] dip block-if-empty mailbox-peek ;
+
+: ?promise ( promise -- result )
+ f ?promise-timeout ;
diff --git a/basis/core-foundation/arrays/platforms.txt b/basis/core-foundation/arrays/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/arrays/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/arrays/tags.txt b/basis/core-foundation/arrays/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/core-foundation/arrays/tags.txt
+++ b/basis/core-foundation/arrays/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/core-foundation/attributed-strings/platforms.txt b/basis/core-foundation/attributed-strings/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/attributed-strings/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/attributed-strings/tags.txt b/basis/core-foundation/attributed-strings/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/core-foundation/attributed-strings/tags.txt
+++ b/basis/core-foundation/attributed-strings/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/core-foundation/bundles/platforms.txt b/basis/core-foundation/bundles/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/bundles/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/bundles/tags.txt b/basis/core-foundation/bundles/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/core-foundation/bundles/tags.txt
+++ b/basis/core-foundation/bundles/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/core-foundation/data/data.factor b/basis/core-foundation/data/data.factor
index c4c09d0cc5..bb04431a0e 100644
--- a/basis/core-foundation/data/data.factor
+++ b/basis/core-foundation/data/data.factor
@@ -12,7 +12,7 @@ CONSTANT: kCFPropertyListImmutable 0
CONSTANT: kCFPropertyListMutableContainers 1
CONSTANT: kCFPropertyListMutableContainersAndLeaves 2
-FUNCTION: CFDataRef CFDataCreate ( CFAllocatorRef allocator, uchar* bytes, CFIndex length ) ;
+FUNCTION: CFDataRef CFDataCreate ( CFAllocatorRef allocator, UInt8* bytes, CFIndex length ) ;
FUNCTION: CFTypeID CFGetTypeID ( CFTypeRef cf ) ;
diff --git a/basis/core-foundation/data/platforms.txt b/basis/core-foundation/data/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/data/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/data/tags.txt b/basis/core-foundation/data/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/core-foundation/data/tags.txt
+++ b/basis/core-foundation/data/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/core-foundation/dictionaries/platforms.txt b/basis/core-foundation/dictionaries/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/dictionaries/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/dictionaries/tags.txt b/basis/core-foundation/dictionaries/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/core-foundation/dictionaries/tags.txt
+++ b/basis/core-foundation/dictionaries/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/core-foundation/file-descriptors/platforms.txt b/basis/core-foundation/file-descriptors/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/file-descriptors/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/file-descriptors/tags.txt b/basis/core-foundation/file-descriptors/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/core-foundation/file-descriptors/tags.txt
+++ b/basis/core-foundation/file-descriptors/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/core-foundation/fsevents/fsevents.factor b/basis/core-foundation/fsevents/fsevents.factor
index 37dbcd1e4f..ef1a3ff7f1 100644
--- a/basis/core-foundation/fsevents/fsevents.factor
+++ b/basis/core-foundation/fsevents/fsevents.factor
@@ -36,7 +36,6 @@ STRUCT: FSEventStreamContext
{ release void* }
{ copyDescription void* } ;
-! callback(
CALLBACK: void FSEventStreamCallback ( FSEventStreamRef streamRef, void* clientCallBackInfo, size_t numEvents, void* eventPaths, FSEventStreamEventFlags* eventFlags, FSEventStreamEventId* eventIds ) ;
CONSTANT: FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF
@@ -173,16 +172,7 @@ SYMBOL: event-stream-callbacks
info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
: master-event-source-callback ( -- alien )
- "void"
- {
- "FSEventStreamRef"
- "void*" ! info
- "size_t" ! numEvents
- "void*" ! eventPaths
- "FSEventStreamEventFlags*"
- "FSEventStreamEventId*"
- }
- "cdecl" [ (master-event-source-callback) ] alien-callback ;
+ [ (master-event-source-callback) ] FSEventStreamCallback ;
TUPLE: event-stream < disposable info handle ;
diff --git a/basis/core-foundation/fsevents/platforms.txt b/basis/core-foundation/fsevents/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/fsevents/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/fsevents/tags.txt b/basis/core-foundation/fsevents/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/core-foundation/fsevents/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/core-foundation/numbers/platforms.txt b/basis/core-foundation/numbers/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/numbers/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/numbers/tags.txt b/basis/core-foundation/numbers/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/core-foundation/numbers/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/core-foundation/platforms.txt b/basis/core-foundation/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/run-loop/platforms.txt b/basis/core-foundation/run-loop/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/core-foundation/run-loop/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/core-foundation/run-loop/run-loop.factor b/basis/core-foundation/run-loop/run-loop.factor
index 2370dd4562..56b5a9c798 100644
--- a/basis/core-foundation/run-loop/run-loop.factor
+++ b/basis/core-foundation/run-loop/run-loop.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov
+! Copyright (C) 2008, 2010 Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien alien.c-types alien.syntax kernel math
namespaces sequences destructors combinators threads heaps
@@ -91,6 +91,12 @@ TUPLE: run-loop fds sources timers ;
CFRunLoopAddTimer
] bi ;
+: invalidate-run-loop-timers ( -- )
+ run-loop [
+ [ [ CFRunLoopTimerInvalidate ] [ CFRelease ] bi ] each
+ V{ } clone
+ ] change-timers drop ;
+
>return-in-registers? drop
+complex-double c-type t >>return-in-registers? drop
diff --git a/basis/cpu/ppc/tags.txt b/basis/cpu/ppc/tags.txt
index 8e66660f70..6c8f59c757 100644
--- a/basis/cpu/ppc/tags.txt
+++ b/basis/cpu/ppc/tags.txt
@@ -1,2 +1,2 @@
-unportable
compiler
+untested
diff --git a/basis/cpu/x86/32/tags.txt b/basis/cpu/x86/32/tags.txt
index 8e66660f70..50dfc5156e 100644
--- a/basis/cpu/x86/32/tags.txt
+++ b/basis/cpu/x86/32/tags.txt
@@ -1,2 +1,2 @@
-unportable
+untested
compiler
diff --git a/basis/cpu/x86/64/tags.txt b/basis/cpu/x86/64/tags.txt
index 8e66660f70..50dfc5156e 100644
--- a/basis/cpu/x86/64/tags.txt
+++ b/basis/cpu/x86/64/tags.txt
@@ -1,2 +1,2 @@
-unportable
+untested
compiler
diff --git a/basis/cpu/x86/64/unix/tags.txt b/basis/cpu/x86/64/unix/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/cpu/x86/64/unix/tags.txt
+++ b/basis/cpu/x86/64/unix/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/cpu/x86/64/winnt/tags.txt b/basis/cpu/x86/64/winnt/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/cpu/x86/64/winnt/tags.txt
+++ b/basis/cpu/x86/64/winnt/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/cpu/x86/assembler/syntax/tags.txt b/basis/cpu/x86/assembler/syntax/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/cpu/x86/assembler/syntax/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/cpu/x86/features/tags.txt b/basis/cpu/x86/features/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/cpu/x86/features/tags.txt
+++ b/basis/cpu/x86/features/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/cpu/x86/tags.txt b/basis/cpu/x86/tags.txt
index 8e66660f70..50dfc5156e 100644
--- a/basis/cpu/x86/tags.txt
+++ b/basis/cpu/x86/tags.txt
@@ -1,2 +1,2 @@
-unportable
+untested
compiler
diff --git a/basis/db/postgresql/ffi/ffi.factor b/basis/db/postgresql/ffi/ffi.factor
index f4a55e3280..812507a20f 100644
--- a/basis/db/postgresql/ffi/ffi.factor
+++ b/basis/db/postgresql/ffi/ffi.factor
@@ -63,7 +63,6 @@ C-TYPE: PGconn
C-TYPE: PGresult
C-TYPE: PGcancel
TYPEDEF: uint Oid
-TYPEDEF: uint* Oid*
TYPEDEF: char pqbool
C-TYPE: PQconninfoOption
C-TYPE: PGnotify
@@ -78,15 +77,15 @@ LIBRARY: postgresql
! make a new client connection to the backend
! Asynchronous (non-blocking)
-FUNCTION: PGconn* PQconnectStart ( char* conninfo ) ;
+FUNCTION: PGconn* PQconnectStart ( c-string conninfo ) ;
FUNCTION: PostgresPollingStatusType PQconnectPoll ( PGconn* conn ) ;
! Synchronous (blocking)
-FUNCTION: PGconn* PQconnectdb ( char* conninfo ) ;
-FUNCTION: PGconn* PQsetdbLogin ( char* pghost, char* pgport,
- char* pgoptions, char* pgtty,
- char* dbName,
- char* login, char* pwd ) ;
+FUNCTION: PGconn* PQconnectdb ( c-string conninfo ) ;
+FUNCTION: PGconn* PQsetdbLogin ( c-string pghost, c-string pgport,
+ c-string pgoptions, c-string pgtty,
+ c-string dbName,
+ c-string login, c-string pwd ) ;
: PQsetdb ( M_PGHOST M_PGPORT M_PGOPT M_PGTTY M_DBNAME -- PGconn* )
f f PQsetdbLogin ;
@@ -117,24 +116,24 @@ FUNCTION: void PQfreeCancel ( PGcancel* cancel ) ;
FUNCTION: int PQrequestCancel ( PGconn* conn ) ;
! Accessor functions for PGconn objects
-FUNCTION: char* PQdb ( PGconn* conn ) ;
-FUNCTION: char* PQuser ( PGconn* conn ) ;
-FUNCTION: char* PQpass ( PGconn* conn ) ;
-FUNCTION: char* PQhost ( PGconn* conn ) ;
-FUNCTION: char* PQport ( PGconn* conn ) ;
-FUNCTION: char* PQtty ( PGconn* conn ) ;
-FUNCTION: char* PQoptions ( PGconn* conn ) ;
+FUNCTION: c-string PQdb ( PGconn* conn ) ;
+FUNCTION: c-string PQuser ( PGconn* conn ) ;
+FUNCTION: c-string PQpass ( PGconn* conn ) ;
+FUNCTION: c-string PQhost ( PGconn* conn ) ;
+FUNCTION: c-string PQport ( PGconn* conn ) ;
+FUNCTION: c-string PQtty ( PGconn* conn ) ;
+FUNCTION: c-string PQoptions ( PGconn* conn ) ;
FUNCTION: ConnStatusType PQstatus ( PGconn* conn ) ;
FUNCTION: PGTransactionStatusType PQtransactionStatus ( PGconn* conn ) ;
-FUNCTION: char* PQparameterStatus ( PGconn* conn,
- char* paramName ) ;
+FUNCTION: c-string PQparameterStatus ( PGconn* conn,
+ c-string paramName ) ;
FUNCTION: int PQprotocolVersion ( PGconn* conn ) ;
! FUNCTION: int PQServerVersion ( PGconn* conn ) ;
-FUNCTION: char* PQerrorMessage ( PGconn* conn ) ;
+FUNCTION: c-string PQerrorMessage ( PGconn* conn ) ;
FUNCTION: int PQsocket ( PGconn* conn ) ;
FUNCTION: int PQbackendPID ( PGconn* conn ) ;
FUNCTION: int PQclientEncoding ( PGconn* conn ) ;
-FUNCTION: int PQsetClientEncoding ( PGconn* conn, char* encoding ) ;
+FUNCTION: int PQsetClientEncoding ( PGconn* conn, c-string encoding ) ;
! May not be compiled into libpq
! Get the SSL structure associated with a connection
@@ -154,7 +153,7 @@ FUNCTION: void PQuntrace ( PGconn* conn ) ;
! BROKEN
! Function types for notice-handling callbacks
! typedef void (*PQnoticeReceiver) (void *arg, PGresult *res);
-! typedef void (*PQnoticeProcessor) (void *arg, char* message);
+! typedef void (*PQnoticeProcessor) (void *arg, c-string message);
! ALIAS: void* PQnoticeReceiver
! ALIAS: void* PQnoticeProcessor
@@ -170,43 +169,43 @@ FUNCTION: void PQuntrace ( PGconn* conn ) ;
! === in fe-exec.c ===
! Simple synchronous query
-FUNCTION: PGresult* PQexec ( PGconn* conn, char* query ) ;
+FUNCTION: PGresult* PQexec ( PGconn* conn, c-string query ) ;
FUNCTION: PGresult* PQexecParams ( PGconn* conn,
- char* command,
+ c-string command,
int nParams,
Oid* paramTypes,
- char** paramValues,
+ c-string* paramValues,
int* paramLengths,
int* paramFormats,
int resultFormat ) ;
-FUNCTION: PGresult* PQprepare ( PGconn* conn, char* stmtName,
- char* query, int nParams,
+FUNCTION: PGresult* PQprepare ( PGconn* conn, c-string stmtName,
+ c-string query, int nParams,
Oid* paramTypes ) ;
FUNCTION: PGresult* PQexecPrepared ( PGconn* conn,
- char* stmtName,
+ c-string stmtName,
int nParams,
- char** paramValues,
+ c-string* paramValues,
int* paramLengths,
int* paramFormats,
int resultFormat ) ;
! Interface for multiple-result or asynchronous queries
-FUNCTION: int PQsendQuery ( PGconn* conn, char* query ) ;
+FUNCTION: int PQsendQuery ( PGconn* conn, c-string query ) ;
FUNCTION: int PQsendQueryParams ( PGconn* conn,
- char* command,
+ c-string command,
int nParams,
Oid* paramTypes,
- char** paramValues,
+ c-string* paramValues,
int* paramLengths,
int* paramFormats,
int resultFormat ) ;
-FUNCTION: PGresult* PQsendPrepare ( PGconn* conn, char* stmtName,
- char* query, int nParams,
+FUNCTION: PGresult* PQsendPrepare ( PGconn* conn, c-string stmtName,
+ c-string query, int nParams,
Oid* paramTypes ) ;
FUNCTION: int PQsendQueryPrepared ( PGconn* conn,
- char* stmtName,
+ c-string stmtName,
int nParams,
- char** paramValues,
+ c-string* paramValues,
int *paramLengths,
int *paramFormats,
int resultFormat ) ;
@@ -220,15 +219,15 @@ FUNCTION: int PQconsumeInput ( PGconn* conn ) ;
FUNCTION: PGnotify* PQnotifies ( PGconn* conn ) ;
! Routines for copy in/out
-FUNCTION: int PQputCopyData ( PGconn* conn, char* buffer, int nbytes ) ;
-FUNCTION: int PQputCopyEnd ( PGconn* conn, char* errormsg ) ;
-FUNCTION: int PQgetCopyData ( PGconn* conn, char** buffer, int async ) ;
+FUNCTION: int PQputCopyData ( PGconn* conn, c-string buffer, int nbytes ) ;
+FUNCTION: int PQputCopyEnd ( PGconn* conn, c-string errormsg ) ;
+FUNCTION: int PQgetCopyData ( PGconn* conn, c-string* buffer, int async ) ;
! Deprecated routines for copy in/out
-FUNCTION: int PQgetline ( PGconn* conn, char* string, int length ) ;
-FUNCTION: int PQputline ( PGconn* conn, char* string ) ;
-FUNCTION: int PQgetlineAsync ( PGconn* conn, char* buffer, int bufsize ) ;
-FUNCTION: int PQputnbytes ( PGconn* conn, char* buffer, int nbytes ) ;
+FUNCTION: int PQgetline ( PGconn* conn, c-string string, int length ) ;
+FUNCTION: int PQputline ( PGconn* conn, c-string string ) ;
+FUNCTION: int PQgetlineAsync ( PGconn* conn, c-string buffer, int bufsize ) ;
+FUNCTION: int PQputnbytes ( PGconn* conn, c-string buffer, int nbytes ) ;
FUNCTION: int PQendcopy ( PGconn* conn ) ;
! Set blocking/nonblocking connection to the backend
@@ -252,25 +251,25 @@ FUNCTION: PGresult* PQfn ( PGconn* conn,
! Accessor functions for PGresult objects
FUNCTION: ExecStatusType PQresultStatus ( PGresult* res ) ;
-FUNCTION: char* PQresStatus ( ExecStatusType status ) ;
-FUNCTION: char* PQresultErrorMessage ( PGresult* res ) ;
-FUNCTION: char* PQresultErrorField ( PGresult* res, int fieldcode ) ;
+FUNCTION: c-string PQresStatus ( ExecStatusType status ) ;
+FUNCTION: c-string PQresultErrorMessage ( PGresult* res ) ;
+FUNCTION: c-string PQresultErrorField ( PGresult* res, int fieldcode ) ;
FUNCTION: int PQntuples ( PGresult* res ) ;
FUNCTION: int PQnfields ( PGresult* res ) ;
FUNCTION: int PQbinaryTuples ( PGresult* res ) ;
-FUNCTION: char* PQfname ( PGresult* res, int field_num ) ;
-FUNCTION: int PQfnumber ( PGresult* res, char* field_name ) ;
+FUNCTION: c-string PQfname ( PGresult* res, int field_num ) ;
+FUNCTION: int PQfnumber ( PGresult* res, c-string field_name ) ;
FUNCTION: Oid PQftable ( PGresult* res, int field_num ) ;
FUNCTION: int PQftablecol ( PGresult* res, int field_num ) ;
FUNCTION: int PQfformat ( PGresult* res, int field_num ) ;
FUNCTION: Oid PQftype ( PGresult* res, int field_num ) ;
FUNCTION: int PQfsize ( PGresult* res, int field_num ) ;
FUNCTION: int PQfmod ( PGresult* res, int field_num ) ;
-FUNCTION: char* PQcmdStatus ( PGresult* res ) ;
-FUNCTION: char* PQoidStatus ( PGresult* res ) ;
+FUNCTION: c-string PQcmdStatus ( PGresult* res ) ;
+FUNCTION: c-string PQoidStatus ( PGresult* res ) ;
FUNCTION: Oid PQoidValue ( PGresult* res ) ;
-FUNCTION: char* PQcmdTuples ( PGresult* res ) ;
-! FUNCTION: char* PQgetvalue ( PGresult* res, int tup_num, int field_num ) ;
+FUNCTION: c-string PQcmdTuples ( PGresult* res ) ;
+! FUNCTION: c-string PQgetvalue ( PGresult* res, int tup_num, int field_num ) ;
FUNCTION: void* PQgetvalue ( PGresult* res, int tup_num, int field_num ) ;
FUNCTION: int PQgetlength ( PGresult* res, int tup_num, int field_num ) ;
FUNCTION: int PQgetisnull ( PGresult* res, int tup_num, int field_num ) ;
@@ -293,16 +292,16 @@ FUNCTION: PGresult* PQmakeEmptyPGresult ( PGconn* conn, ExecStatusType status )
! Quoting strings before inclusion in queries.
FUNCTION: size_t PQescapeStringConn ( PGconn* conn,
- char* to, char* from, size_t length,
+ c-string to, c-string from, size_t length,
int* error ) ;
-FUNCTION: uchar* PQescapeByteaConn ( PGconn* conn,
- char* from, size_t length,
+FUNCTION: c-string PQescapeByteaConn ( PGconn* conn,
+ c-string from, size_t length,
size_t* to_length ) ;
-FUNCTION: void* PQunescapeBytea ( uchar* strtext, size_t* retbuflen ) ;
-! FUNCTION: uchar* PQunescapeBytea ( uchar* strtext, size_t* retbuflen ) ;
+FUNCTION: void* PQunescapeBytea ( c-string strtext, size_t* retbuflen ) ;
+! FUNCTION: c-string PQunescapeBytea ( c-string strtext, size_t* retbuflen ) ;
! These forms are deprecated!
-FUNCTION: size_t PQescapeString ( void* to, char* from, size_t length ) ;
-FUNCTION: uchar* PQescapeBytea ( uchar* bintext, size_t binlen,
+FUNCTION: size_t PQescapeString ( void* to, c-string from, size_t length ) ;
+FUNCTION: c-string PQescapeBytea ( c-string bintext, size_t binlen,
size_t* bytealen ) ;
! === in fe-print.c ===
@@ -313,7 +312,7 @@ FUNCTION: void PQprint ( FILE* fout, PGresult* res, PQprintOpt* ps ) ;
FUNCTION: void PQdisplayTuples ( PGresult* res,
FILE* fp,
int fillAlign,
- char* fieldSep,
+ c-string fieldSep,
int printHeader,
int quiet ) ;
@@ -327,23 +326,23 @@ FUNCTION: void PQprintTuples ( PGresult* res,
! Large-object access routines
FUNCTION: int lo_open ( PGconn* conn, Oid lobjId, int mode ) ;
FUNCTION: int lo_close ( PGconn* conn, int fd ) ;
-FUNCTION: int lo_read ( PGconn* conn, int fd, char* buf, size_t len ) ;
-FUNCTION: int lo_write ( PGconn* conn, int fd, char* buf, size_t len ) ;
+FUNCTION: int lo_read ( PGconn* conn, int fd, c-string buf, size_t len ) ;
+FUNCTION: int lo_write ( PGconn* conn, int fd, c-string buf, size_t len ) ;
FUNCTION: int lo_lseek ( PGconn* conn, int fd, int offset, int whence ) ;
FUNCTION: Oid lo_creat ( PGconn* conn, int mode ) ;
! FUNCTION: Oid lo_creat ( PGconn* conn, Oid lobjId ) ;
FUNCTION: int lo_tell ( PGconn* conn, int fd ) ;
FUNCTION: int lo_unlink ( PGconn* conn, Oid lobjId ) ;
-FUNCTION: Oid lo_import ( PGconn* conn, char* filename ) ;
-FUNCTION: int lo_export ( PGconn* conn, Oid lobjId, char* filename ) ;
+FUNCTION: Oid lo_import ( PGconn* conn, c-string filename ) ;
+FUNCTION: int lo_export ( PGconn* conn, Oid lobjId, c-string filename ) ;
! === in fe-misc.c ===
! Determine length of multibyte encoded char at *s
-FUNCTION: int PQmblen ( uchar* s, int encoding ) ;
+FUNCTION: int PQmblen ( c-string s, int encoding ) ;
! Determine display length of multibyte encoded char at *s
-FUNCTION: int PQdsplen ( uchar* s, int encoding ) ;
+FUNCTION: int PQdsplen ( c-string s, int encoding ) ;
! Get encoding id from environment variable PGCLIENTENCODING
FUNCTION: int PQenv2encoding ( ) ;
diff --git a/basis/db/sqlite/ffi/ffi.factor b/basis/db/sqlite/ffi/ffi.factor
index c180df9bf5..f93b961799 100644
--- a/basis/db/sqlite/ffi/ffi.factor
+++ b/basis/db/sqlite/ffi/ffi.factor
@@ -99,17 +99,17 @@ CONSTANT: SQLITE_OPEN_TEMP_JOURNAL HEX: 00001000
CONSTANT: SQLITE_OPEN_SUBJOURNAL HEX: 00002000
CONSTANT: SQLITE_OPEN_MASTER_JOURNAL HEX: 00004000
-TYPEDEF: void* sqlite3*
-TYPEDEF: void* sqlite3_stmt*
+C-TYPE: sqlite3
+C-TYPE: sqlite3_stmt
TYPEDEF: longlong sqlite3_int64
TYPEDEF: ulonglong sqlite3_uint64
LIBRARY: sqlite
-FUNCTION: int sqlite3_open ( char* filename, void* ppDb ) ;
+FUNCTION: int sqlite3_open ( c-string filename, void* ppDb ) ;
FUNCTION: int sqlite3_close ( sqlite3* pDb ) ;
-FUNCTION: char* sqlite3_errmsg ( sqlite3* pDb ) ;
-FUNCTION: int sqlite3_prepare ( sqlite3* pDb, char* zSql, int nBytes, void* ppStmt, void* pzTail ) ;
-FUNCTION: int sqlite3_prepare_v2 ( sqlite3* pDb, char* zSql, int nBytes, void* ppStmt, void* pzTail ) ;
+FUNCTION: c-string sqlite3_errmsg ( sqlite3* pDb ) ;
+FUNCTION: int sqlite3_prepare ( sqlite3* pDb, c-string zSql, int nBytes, void* ppStmt, void* pzTail ) ;
+FUNCTION: int sqlite3_prepare_v2 ( sqlite3* pDb, c-string zSql, int nBytes, void* ppStmt, void* pzTail ) ;
FUNCTION: int sqlite3_finalize ( sqlite3_stmt* pStmt ) ;
FUNCTION: int sqlite3_reset ( sqlite3_stmt* pStmt ) ;
FUNCTION: int sqlite3_step ( sqlite3_stmt* pStmt ) ;
@@ -121,22 +121,22 @@ FUNCTION: int sqlite3_bind_int64 ( sqlite3_stmt* pStmt, int index, sqlite3_int64
! Bind the same function as above, but for unsigned 64bit integers
: sqlite3-bind-uint64 ( pStmt index in64 -- int )
int "sqlite" "sqlite3_bind_int64"
- { sqlite3_stmt* int sqlite3_uint64 } alien-invoke ;
+ { pointer: sqlite3_stmt int sqlite3_uint64 } alien-invoke ;
FUNCTION: int sqlite3_bind_null ( sqlite3_stmt* pStmt, int n ) ;
-FUNCTION: int sqlite3_bind_text ( sqlite3_stmt* pStmt, int index, char* text, int len, int destructor ) ;
-FUNCTION: int sqlite3_bind_parameter_index ( sqlite3_stmt* pStmt, char* name ) ;
+FUNCTION: int sqlite3_bind_text ( sqlite3_stmt* pStmt, int index, c-string text, int len, int destructor ) ;
+FUNCTION: int sqlite3_bind_parameter_index ( sqlite3_stmt* pStmt, c-string name ) ;
FUNCTION: int sqlite3_clear_bindings ( sqlite3_stmt* pStmt ) ;
FUNCTION: int sqlite3_column_count ( sqlite3_stmt* pStmt ) ;
FUNCTION: void* sqlite3_column_blob ( sqlite3_stmt* pStmt, int col ) ;
FUNCTION: int sqlite3_column_bytes ( sqlite3_stmt* pStmt, int col ) ;
-FUNCTION: char* sqlite3_column_decltype ( sqlite3_stmt* pStmt, int col ) ;
+FUNCTION: c-string sqlite3_column_decltype ( sqlite3_stmt* pStmt, int col ) ;
FUNCTION: int sqlite3_column_int ( sqlite3_stmt* pStmt, int col ) ;
FUNCTION: sqlite3_int64 sqlite3_column_int64 ( sqlite3_stmt* pStmt, int col ) ;
! Bind the same function as above, but for unsigned 64bit integers
: sqlite3-column-uint64 ( pStmt col -- uint64 )
sqlite3_uint64 "sqlite" "sqlite3_column_int64"
- { sqlite3_stmt* int } alien-invoke ;
+ { pointer: sqlite3_stmt int } alien-invoke ;
FUNCTION: double sqlite3_column_double ( sqlite3_stmt* pStmt, int col ) ;
-FUNCTION: char* sqlite3_column_name ( sqlite3_stmt* pStmt, int col ) ;
-FUNCTION: char* sqlite3_column_text ( sqlite3_stmt* pStmt, int col ) ;
+FUNCTION: c-string sqlite3_column_name ( sqlite3_stmt* pStmt, int col ) ;
+FUNCTION: c-string sqlite3_column_text ( sqlite3_stmt* pStmt, int col ) ;
FUNCTION: int sqlite3_column_type ( sqlite3_stmt* pStmt, int col ) ;
diff --git a/basis/db/tuples/tuples-docs.factor b/basis/db/tuples/tuples-docs.factor
index 01d65484f3..3f77f9abaf 100644
--- a/basis/db/tuples/tuples-docs.factor
+++ b/basis/db/tuples/tuples-docs.factor
@@ -51,7 +51,7 @@ HELP:
HELP:
{ $values
{ "tuple" tuple } { "class" class }
- { "tuple" tuple } }
+ { "statement" tuple } }
{ $description "A database-specific hook for generating the SQL for a select statement." } ;
HELP:
@@ -267,7 +267,7 @@ T{ book
{ $list
"Make a new tuple to represent your data"
{ "Map the Factor types to the database types with " { $link define-persistent } }
- { "Make a custom database combinator (see" { $link "db-custom-database-combinators" } ") to open your database and run a " { $link quotation } }
+ { "Make a custom database combinator (see " { $link "db-custom-database-combinators" } ") to open your database and run a " { $link quotation } }
{ "Create a table with " { $link create-table } ", " { $link ensure-table } ", or " { $link recreate-table } }
{ "Start making and storing objects with " { $link insert-tuple } ", " { $link update-tuple } ", " { $link delete-tuples } ", and " { $link select-tuples } }
} ;
diff --git a/basis/db/tuples/tuples.factor b/basis/db/tuples/tuples.factor
index 388c9ba47e..d193b5921e 100644
--- a/basis/db/tuples/tuples.factor
+++ b/basis/db/tuples/tuples.factor
@@ -14,7 +14,7 @@ HOOK: db-connection ( class -- object )
HOOK: db-connection ( class -- object )
HOOK: db-connection ( class -- object )
HOOK: db-connection ( tuple class -- object )
-HOOK: db-connection ( tuple class -- tuple )
+HOOK: db-connection ( tuple class -- statement )
HOOK: db-connection ( query -- statement )
HOOK: query>statement db-connection ( query -- statement )
HOOK: insert-tuple-set-key db-connection ( tuple statement -- )
diff --git a/basis/debugger/debugger.factor b/basis/debugger/debugger.factor
index 815304b21f..b6497c52a9 100644
--- a/basis/debugger/debugger.factor
+++ b/basis/debugger/debugger.factor
@@ -194,7 +194,7 @@ M: not-a-tuple summary
drop "Not a tuple" ;
M: bad-superclass summary
- drop "Tuple classes can only inherit from other tuple classes" ;
+ drop "Tuple classes can only inherit from non-final tuple classes" ;
M: no-initial-value summary
drop "Initial value must be provided for slots specialized to this class" ;
diff --git a/basis/debugger/windows/platforms.txt b/basis/debugger/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/debugger/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/debugger/windows/tags.txt b/basis/debugger/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/debugger/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/delegate/delegate.factor b/basis/delegate/delegate.factor
index d033b7115b..662a2840a1 100644
--- a/basis/delegate/delegate.factor
+++ b/basis/delegate/delegate.factor
@@ -99,11 +99,8 @@ M: consultation forget*
! Protocols
[ push-front ] keep ;
-: dlist-filter ( dlist quot -- dlist )
+: dlist-filter ( dlist quot -- dlist' )
over [ '[ dup obj>> @ [ drop ] [ _ delete-node ] if ] dlist-each-node ] keep ; inline
M: dlist clone
diff --git a/basis/editors/editpadlite/tags.txt b/basis/editors/editpadlite/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/editpadlite/tags.txt
+++ b/basis/editors/editpadlite/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/editpadpro/tags.txt b/basis/editors/editpadpro/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/editpadpro/tags.txt
+++ b/basis/editors/editpadpro/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/editplus/tags.txt b/basis/editors/editplus/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/editplus/tags.txt
+++ b/basis/editors/editplus/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/emacs/tags.txt b/basis/editors/emacs/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/emacs/tags.txt
+++ b/basis/editors/emacs/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/emacs/windows/tags.txt b/basis/editors/emacs/windows/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/emacs/windows/tags.txt
+++ b/basis/editors/emacs/windows/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/emeditor/tags.txt b/basis/editors/emeditor/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/emeditor/tags.txt
+++ b/basis/editors/emeditor/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/etexteditor/tags.txt b/basis/editors/etexteditor/tags.txt
index 6bf68304bb..5d77766703 100755
--- a/basis/editors/etexteditor/tags.txt
+++ b/basis/editors/etexteditor/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/gedit/tags.txt b/basis/editors/gedit/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/gedit/tags.txt
+++ b/basis/editors/gedit/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/gvim/tags.txt b/basis/editors/gvim/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/gvim/tags.txt
+++ b/basis/editors/gvim/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/gvim/unix/tags.txt b/basis/editors/gvim/unix/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/gvim/unix/tags.txt
+++ b/basis/editors/gvim/unix/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/gvim/windows/tags.txt b/basis/editors/gvim/windows/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/gvim/windows/tags.txt
+++ b/basis/editors/gvim/windows/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/jedit/tags.txt b/basis/editors/jedit/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/jedit/tags.txt
+++ b/basis/editors/jedit/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/macvim/tags.txt b/basis/editors/macvim/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/macvim/tags.txt
+++ b/basis/editors/macvim/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/notepad/tags.txt b/basis/editors/notepad/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/notepad/tags.txt
+++ b/basis/editors/notepad/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/notepad2/tags.txt b/basis/editors/notepad2/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/notepad2/tags.txt
+++ b/basis/editors/notepad2/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/notepadpp/tags.txt b/basis/editors/notepadpp/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/notepadpp/tags.txt
+++ b/basis/editors/notepadpp/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/scite/tags.txt b/basis/editors/scite/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/scite/tags.txt
+++ b/basis/editors/scite/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/ted-notepad/tags.txt b/basis/editors/ted-notepad/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/ted-notepad/tags.txt
+++ b/basis/editors/ted-notepad/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/textedit/tags.txt b/basis/editors/textedit/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/textedit/tags.txt
+++ b/basis/editors/textedit/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/textmate/tags.txt b/basis/editors/textmate/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/textmate/tags.txt
+++ b/basis/editors/textmate/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/textpad/tags.txt b/basis/editors/textpad/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/textpad/tags.txt
+++ b/basis/editors/textpad/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/textwrangler/tags.txt b/basis/editors/textwrangler/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/textwrangler/tags.txt
+++ b/basis/editors/textwrangler/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/ultraedit/tags.txt b/basis/editors/ultraedit/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/ultraedit/tags.txt
+++ b/basis/editors/ultraedit/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/vim/generate-syntax/tags.txt b/basis/editors/vim/generate-syntax/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/vim/generate-syntax/tags.txt
+++ b/basis/editors/vim/generate-syntax/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/vim/tags.txt b/basis/editors/vim/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/vim/tags.txt
+++ b/basis/editors/vim/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/editors/wordpad/tags.txt b/basis/editors/wordpad/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/editors/wordpad/tags.txt
+++ b/basis/editors/wordpad/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/environment/unix/macosx/platforms.txt b/basis/environment/unix/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/environment/unix/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/environment/unix/macosx/tags.txt b/basis/environment/unix/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/environment/unix/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/environment/unix/platforms.txt b/basis/environment/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/environment/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/environment/unix/tags.txt b/basis/environment/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/environment/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/environment/winnt/platforms.txt b/basis/environment/winnt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/environment/winnt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/environment/winnt/tags.txt b/basis/environment/winnt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/environment/winnt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/formatting/formatting-docs.factor b/basis/formatting/formatting-docs.factor
index 47720ad671..9625c40577 100644
--- a/basis/formatting/formatting-docs.factor
+++ b/basis/formatting/formatting-docs.factor
@@ -36,7 +36,7 @@ HELP: printf
"For example:\n"
{ $list
"\"%5s\" formats a string padding with spaces up to 5 characters wide."
- "\"%08d\" formats an integer padding with zeros up to 3 characters wide."
+ "\"%03d\" formats an integer padding with zeros up to 3 characters wide."
"\"%'#5f\" formats a float padding with '#' up to 3 characters wide."
"\"%-10d\" formats an integer to 10 characters wide and left-aligns."
}
diff --git a/basis/formatting/formatting.factor b/basis/formatting/formatting.factor
index 40279749d6..ec3c9f1d8e 100644
--- a/basis/formatting/formatting.factor
+++ b/basis/formatting/formatting.factor
@@ -12,18 +12,18 @@ IN: formatting
[ ] [ compose ] reduce ;
: fix-sign ( string -- string )
- dup CHAR: 0 swap index 0 =
+ dup CHAR: 0 swap index 0 =
[ dup 0 swap [ [ CHAR: 0 = not ] keep digit? and ] find-from
[ dup 1 - rot dup [ nth ] dip swap
{
{ CHAR: - [ [ 1 - ] dip remove-nth "-" prepend ] }
{ CHAR: + [ [ 1 - ] dip remove-nth "+" prepend ] }
- [ drop swap drop ]
- } case
+ [ drop swap drop ]
+ } case
] [ drop ] if
] when ;
-: >digits ( string -- digits )
+: >digits ( string -- digits )
[ 0 ] [ string>number ] if-empty ;
: pad-digits ( string digits -- string' )
@@ -33,20 +33,20 @@ IN: formatting
10^ [ * round ] keep / ; inline
: >exp ( x -- exp base )
- [
+ [
abs 0 swap
[ dup [ 10.0 >= ] [ 1.0 < ] bi or ]
[ dup 10.0 >=
[ 10.0 / [ 1 + ] dip ]
[ 10.0 * [ 1 - ] dip ] if
- ] while
+ ] while
] keep 0 < [ neg ] when ;
: exp>string ( exp base digits -- string )
[ max-digits ] keep -rot
[
[ 0 < "-" "+" ? ]
- [ abs number>string 2 CHAR: 0 pad-head ] bi
+ [ abs number>string 2 CHAR: 0 pad-head ] bi
"e" -rot 3append
]
[ number>string ] bi*
@@ -58,19 +58,19 @@ zero = "0" => [[ CHAR: 0 ]]
char = "'" (.) => [[ second ]]
pad-char = (zero|char)? => [[ CHAR: \s or ]]
-pad-align = ("-")? => [[ \ pad-tail \ pad-head ? ]]
+pad-align = ("-")? => [[ \ pad-tail \ pad-head ? ]]
pad-width = ([0-9])* => [[ >digits ]]
pad = pad-align pad-char pad-width => [[ reverse >quotation dup first 0 = [ drop [ ] ] when ]]
sign = ("+")? => [[ [ dup CHAR: - swap index [ "+" prepend ] unless ] [ ] ? ]]
width_ = "." ([0-9])* => [[ second >digits '[ _ short head ] ]]
-width = (width_)? => [[ [ ] or ]]
+width = (width_)? => [[ [ ] or ]]
digits_ = "." ([0-9])* => [[ second >digits ]]
digits = (digits_)? => [[ 6 or ]]
-fmt-% = "%" => [[ [ "%" ] ]]
+fmt-% = "%" => [[ [ "%" ] ]]
fmt-c = "c" => [[ [ 1string ] ]]
fmt-C = "C" => [[ [ 1string >upper ] ]]
fmt-s = "s" => [[ [ dup number? [ number>string ] when ] ]]
@@ -78,7 +78,7 @@ fmt-S = "S" => [[ [ dup number? [ number>string ] when >upp
fmt-d = "d" => [[ [ >fixnum number>string ] ]]
fmt-e = digits "e" => [[ first '[ >exp _ exp>string ] ]]
fmt-E = digits "E" => [[ first '[ >exp _ exp>string >upper ] ]]
-fmt-f = digits "f" => [[ first dup '[ >float _ max-digits number>string _ pad-digits ] ]]
+fmt-f = digits "f" => [[ first dup '[ >float _ max-digits number>string _ pad-digits ] ]]
fmt-x = "x" => [[ [ >hex ] ]]
fmt-X = "X" => [[ [ >hex >upper ] ]]
unknown = (.)* => [[ "Unknown directive" throw ]]
@@ -89,9 +89,9 @@ strings = pad width strings_ => [[ reverse compose-all ]]
numbers_ = fmt-d|fmt-e|fmt-E|fmt-f|fmt-x|fmt-X
numbers = sign pad numbers_ => [[ unclip-last prefix compose-all [ fix-sign ] append ]]
-types = strings|numbers
+types = strings|numbers
-lists = "[%" types ", %]" => [[ second '[ _ map ", " join "{ " prepend " }" append ] ]]
+lists = "[%" types ", %]" => [[ second '[ _ map ", " join "{ " prepend " }" append ] ]]
assocs = "[%" types ": %" types " %]" => [[ [ second ] [ fourth ] bi '[ unzip [ _ map ] dip _ map zip [ ":" join ] map ", " join "{ " prepend " }" append ] ]]
diff --git a/basis/ftp/server/server.factor b/basis/ftp/server/server.factor
index 1077aebf07..f1bc8adef9 100644
--- a/basis/ftp/server/server.factor
+++ b/basis/ftp/server/server.factor
@@ -1,15 +1,14 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs byte-arrays calendar classes
-combinators combinators.short-circuit concurrency.promises
-continuations destructors ftp io io.backend io.directories
-io.encodings io.encodings.binary
-tools.files io.encodings.utf8 io.files io.files.info
-io.pathnames io.launcher.unix.parser io.servers.connection
-io.sockets io.streams.duplex io.streams.string io.timeouts
-kernel make math math.bitwise math.parser namespaces sequences
-splitting threads unicode.case logging calendar.format
-strings io.files.links io.files.types io.encodings.8-bit.latin1 ;
+USING: accessors assocs byte-arrays calendar classes combinators
+combinators.short-circuit concurrency.promises continuations
+destructors ftp io io.backend io.directories io.encodings
+io.encodings.binary tools.files io.encodings.utf8 io.files
+io.files.info io.pathnames io.servers.connection io.sockets
+io.streams.duplex io.streams.string io.timeouts kernel make math
+math.bitwise math.parser namespaces sequences splitting threads
+unicode.case logging calendar.format strings io.files.links
+io.files.types io.encodings.8-bit.latin1 simple-tokenizer ;
IN: ftp.server
SYMBOL: server
@@ -24,7 +23,7 @@ TUPLE: ftp-command raw tokenized ;
dup \ DEBUG log-message
ftp-command new
over >>raw
- swap tokenize-command >>tokenized ;
+ swap tokenize >>tokenized ;
TUPLE: ftp-get path ;
: ( path -- obj )
diff --git a/basis/functors/backend/backend.factor b/basis/functors/backend/backend.factor
index dd3d891f7b..331864417e 100644
--- a/basis/functors/backend/backend.factor
+++ b/basis/functors/backend/backend.factor
@@ -1,6 +1,6 @@
USING: accessors arrays assocs generic.standard kernel
lexer locals.types namespaces parser quotations vocabs.parser
-words ;
+words classes.tuple ;
IN: functors.backend
DEFER: functor-words
@@ -27,7 +27,11 @@ SYNTAX: FUNCTOR-SYNTAX:
: define* ( word def -- ) over set-word define ;
-: define-declared* ( word def effect -- ) pick set-word define-declared ;
+: define-declared* ( word def effect -- )
+ pick set-word define-declared ;
-: define-simple-generic* ( word effect -- ) over set-word define-simple-generic ;
+: define-simple-generic* ( word effect -- )
+ over set-word define-simple-generic ;
+: define-tuple-class* ( class superclass slots -- )
+ pick set-word define-tuple-class ;
diff --git a/basis/functors/functors-tests.factor b/basis/functors/functors-tests.factor
index 544c2ed1e4..c756d1b83d 100644
--- a/basis/functors/functors-tests.factor
+++ b/basis/functors/functors-tests.factor
@@ -1,5 +1,5 @@
-USING: classes.struct functors tools.test math words kernel
-multiline parser io.streams.string generic ;
+USING: classes.struct classes.tuple functors tools.test math
+words kernel multiline parser io.streams.string generic ;
QUALIFIED-WITH: alien.c-types c
IN: functors.tests
@@ -36,7 +36,7 @@ WW DEFINES ${W}${W}
WHERE
-: WW ( a -- b ) \ W twice ; inline
+: WW ( a -- b ) \ W twice ;
;FUNCTOR
@@ -211,3 +211,44 @@ STRUCT: T-class
}
] [ a-struct struct-slots ] unit-test
+<<
+
+FUNCTOR: define-an-inline-word ( W -- )
+
+W DEFINES ${W}
+W-W DEFINES ${W}-${W}
+
+WHERE
+
+: W ( -- ) ; inline
+: W-W ( -- ) W W ;
+
+;FUNCTOR
+
+"an-inline-word" define-an-inline-word
+
+>>
+
+[ t ] [ \ an-inline-word inline? ] unit-test
+[ f ] [ \ an-inline-word-an-inline-word inline? ] unit-test
+
+<<
+
+FUNCTOR: define-a-final-class ( T W -- )
+
+T DEFINES-CLASS ${T}
+W DEFINES ${W}
+
+WHERE
+
+TUPLE: T ; final
+
+: W ( -- ) ;
+
+;FUNCTOR
+
+"a-final-tuple" "a-word" define-a-final-class
+
+>>
+
+[ t ] [ a-final-tuple final-class? ] unit-test
diff --git a/basis/functors/functors.factor b/basis/functors/functors.factor
index ac2e52f68e..1895c6e0f4 100644
--- a/basis/functors/functors.factor
+++ b/basis/functors/functors.factor
@@ -61,7 +61,10 @@ FUNCTOR-SYNTAX: TUPLE:
make suffix!
]
} case
- \ define-tuple-class suffix! ;
+ \ define-tuple-class* suffix! ;
+
+FUNCTOR-SYNTAX: final
+ [ word make-final ] append! ;
FUNCTOR-SYNTAX: SINGLETON:
scan-param suffix!
diff --git a/basis/game/input/dinput/dinput.factor b/basis/game/input/dinput/dinput.factor
index e2c1fda759..a95dbd06c3 100755
--- a/basis/game/input/dinput/dinput.factor
+++ b/basis/game/input/dinput/dinput.factor
@@ -94,7 +94,6 @@ SYMBOLS: +dinput+ +keyboard-device+ +keyboard-state+
: find-device-axes-callback ( -- alien )
[ ! ( lpddoi pvRef -- BOOL )
- [ DIDEVICEOBJECTINSTANCEW memory>struct ] dip
+controller-devices+ get at
swap guidType>> {
{ [ dup GUID_XAxis = ] [ drop 0.0 >>x ] }
@@ -142,7 +141,7 @@ SYMBOLS: +dinput+ +keyboard-device+ +keyboard-state+
: find-controller-callback ( -- alien )
[ ! ( lpddi pvRef -- BOOL )
- drop DIDEVICEINSTANCEW memory>struct guidInstance>> add-controller
+ drop guidInstance>> add-controller
DIENUM_CONTINUE
] LPDIENUMDEVICESCALLBACKW ; inline
diff --git a/basis/game/input/dinput/platforms.txt b/basis/game/input/dinput/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/game/input/dinput/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/game/input/dinput/tags.txt b/basis/game/input/dinput/tags.txt
index 82506ff250..84d4140a70 100755
--- a/basis/game/input/dinput/tags.txt
+++ b/basis/game/input/dinput/tags.txt
@@ -1,2 +1 @@
-unportable
games
diff --git a/basis/game/input/input-docs.factor b/basis/game/input/input-docs.factor
index 29b74ff570..1ea5dcc650 100644
--- a/basis/game/input/input-docs.factor
+++ b/basis/game/input/input-docs.factor
@@ -32,6 +32,12 @@ ARTICLE: "game-input" "Game controller input"
controller-state
keyboard-state
mouse-state
+}
+"Convenience functions are provided to convert a pair of key or button state sequences into a sequence of " { $link pressed } "/" { $link released } " deltas:"
+{ $subsections
+ button-delta
+ buttons-delta
+ buttons-delta-as
} ;
HELP: open-game-input
@@ -136,7 +142,7 @@ HELP: controller-state
{ "A value of " { $link f } " in any slot (besides the elements of " { $snippet "buttons" } ") indicates that the corresponding element is not present on the device." } } } ;
HELP: keyboard-state
-{ $class-description "The " { $link read-keyboard } " word returns objects of this class. The " { $snippet "keys" } " slot of a " { $snippet "keyboard-state" } " object contains a " { $link sequence } " of 256 members representing the state of the keys on the keyboard. Each element is a boolean value indicating whether the corresponding key is pressed. The sequence is indexed by scancode as defined under usage page 7 of the USB HID standard. Named scancode constants are provided in the " { $vocab-link "game.input.scancodes" } " vocabulary." }
+{ $class-description "The " { $link read-keyboard } " word returns objects of this class. The " { $snippet "keys" } " slot of a " { $snippet "keyboard-state" } " object contains a " { $link sequence } " of 256 members representing the state of the keys on the keyboard. Each element is a boolean value indicating whether the corresponding key is pressed. The sequence is indexed by scancode as defined by the USB HID standard. Named scancode constants are provided in the " { $vocab-link "game.input.scancodes" } " vocabulary." }
{ $warning "The scancodes used to index " { $snippet "keyboard-state" } " objects correspond to physical key positions on the keyboard--they are unaffected by keymaps, modifier keys, or other operating environment postprocessing. The face value of the constants in " { $vocab-link "game.input.scancodes" } " do not necessarily correspond to what the user expects the key to type. Because of this, " { $link read-keyboard } " should not be used for text entry purposes. The Factor UI's standard gesture mechanism should be used in cases where the logical meaning of keypresses is needed; see " { $link "keyboard-gestures" } "." } ;
HELP: mouse-state
@@ -151,7 +157,30 @@ HELP: mouse-state
"Mouse movement is recorded relative to when the game input interface was opened with " { $link open-game-input } " or the mouse state is reset with " { $link reset-mouse } "."
} ;
-
{ keyboard-state read-keyboard } related-words
+HELP: button-delta
+{ $values { "old?" boolean } { "new?" boolean } { "delta" { $link pressed } ", " { $link released } ", or " { $link POSTPONE: f } } }
+{ $description "Outputs a symbol representing the change in a key or button's state given a \"before\" and \"after\" sample of its state. Outputs " { $link pressed } " if " { $snippet "old?" } " is false and " { $snippet "new?" } " is true, " { $link released } " if " { $snippet "old?" } " is true and " { $snippet "new?" } " is false, or " { $link POSTPONE: f } " if the two inputs have the same boolean value." } ;
+
+HELP: buttons-delta
+{ $values { "old-buttons" sequence } { "new-buttons" sequence } { "delta" "an array of " { $link pressed } ", " { $link released } ", or " { $link POSTPONE: f } } }
+{ $description "Outputs an array of symbols representing the change in a set of keys or buttons' states given \"before\" and \"after\" samples of their state. For each corresponding pair of values in the two input sequences, outputs " { $link pressed } " if " { $snippet "old-buttons" } " contains a false and " { $snippet "new-buttons" } " a true value, " { $link released } " if " { $snippet "old-buttons" } " contains true and " { $snippet "new-buttons" } " false, or " { $link POSTPONE: f } " if the two elements have the same boolean value."
+$nl
+"This word can be used with two samples of a " { $link keyboard-state } "'s " { $snippet "keys" } " slot or of a " { $link mouse-state } "'s or " { $link controller-state } "'s " { $snippet "buttons" } " slot to convert the button states into pressed/released values. Remember to " { $link clone } " state objects to record snapshots of their state." } ;
+
+HELP: buttons-delta-as
+{ $values { "old-buttons" sequence } { "new-buttons" sequence } { "exemplar" sequence } { "delta" "a sequence of " { $link pressed } ", " { $link released } ", or " { $link POSTPONE: f } } }
+{ $description "Like " { $link buttons-delta } ", but returns a sequence matching the type of the " { $snippet "exemplar" } "." } ;
+
+{ button-delta buttons-delta buttons-delta-as } related-words
+
+HELP: pressed
+{ $class-description "This symbol is returned by " { $link button-delta } " or " { $link buttons-delta } " to represent a button or key being pressed between two samples of its state." } ;
+
+HELP: released
+{ $class-description "This symbol is returned by " { $link button-delta } " or " { $link buttons-delta } " to represent a button or key being released between two samples of its state." } ;
+
+{ pressed released } related-words
+
ABOUT: "game-input"
diff --git a/basis/game/input/input-tests.factor b/basis/game/input/input-tests.factor
index bd993bf811..923815328e 100644
--- a/basis/game/input/input-tests.factor
+++ b/basis/game/input/input-tests.factor
@@ -7,3 +7,14 @@ os { [ windows? ] [ macosx? ] } 1|| [
[ ] [ 1 seconds sleep ] unit-test
[ ] [ close-game-input ] unit-test
] when
+
+[ f ] [ t t button-delta ] unit-test
+[ pressed ] [ f t button-delta ] unit-test
+[ released ] [ t f button-delta ] unit-test
+
+[ f ] [ 0.5 1.0 button-delta ] unit-test
+[ pressed ] [ f 0.7 button-delta ] unit-test
+[ released ] [ 0.2 f button-delta ] unit-test
+
+[ { pressed f f released } ] [ { f t f t } { t t f f } buttons-delta ] unit-test
+[ V{ pressed f f released } ] [ { f t f t } { t t f f } V{ } buttons-delta-as ] unit-test
diff --git a/basis/game/input/input.factor b/basis/game/input/input.factor
index a2afbe92a3..f27e1f36d1 100644
--- a/basis/game/input/input.factor
+++ b/basis/game/input/input.factor
@@ -90,8 +90,24 @@ TUPLE: mouse-state dx dy scroll-dx scroll-dy buttons ;
M: mouse-state clone
call-next-method dup buttons>> clone >>buttons ;
+SYMBOLS: pressed released ;
+
+: button-delta ( old? new? -- delta )
+ {
+ { [ 2dup xor not ] [ 2drop f ] }
+ { [ dup not ] [ 2drop released ] }
+ { [ over not ] [ 2drop pressed ] }
+ } cond ; inline
+
+: buttons-delta-as ( old-buttons new-buttons exemplar -- delta )
+ [ button-delta ] swap 2map-as ; inline
+
+: buttons-delta ( old-buttons new-buttons -- delta )
+ { } buttons-delta-as ; inline
+
{
{ [ os windows? ] [ "game.input.xinput" require ] }
{ [ os macosx? ] [ "game.input.iokit" require ] }
- { [ t ] [ ] }
+ { [ os linux? ] [ "game.input.linux" require ] }
+ [ ]
} cond
diff --git a/basis/game/input/iokit/platforms.txt b/basis/game/input/iokit/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/game/input/iokit/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/game/input/iokit/tags.txt b/basis/game/input/iokit/tags.txt
index 82506ff250..84d4140a70 100755
--- a/basis/game/input/iokit/tags.txt
+++ b/basis/game/input/iokit/tags.txt
@@ -1,2 +1 @@
-unportable
games
diff --git a/basis/game/input/linux/authors.txt b/basis/game/input/linux/authors.txt
new file mode 100644
index 0000000000..67cf648cf5
--- /dev/null
+++ b/basis/game/input/linux/authors.txt
@@ -0,0 +1 @@
+Erik Charlebois
\ No newline at end of file
diff --git a/basis/game/input/linux/linux.factor b/basis/game/input/linux/linux.factor
new file mode 100644
index 0000000000..0d451e96f0
--- /dev/null
+++ b/basis/game/input/linux/linux.factor
@@ -0,0 +1,47 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel game.input namespaces classes bit-arrays vectors ;
+IN: game.input.linux
+
+SINGLETON: linux-game-input-backend
+
+linux-game-input-backend game-input-backend set-global
+
+M: linux-game-input-backend (open-game-input)
+ ;
+
+M: linux-game-input-backend (close-game-input)
+ ;
+
+M: linux-game-input-backend (reset-game-input)
+ ;
+
+M: linux-game-input-backend get-controllers
+ { } ;
+
+M: linux-game-input-backend product-string
+ drop "" ;
+
+M: linux-game-input-backend product-id
+ drop f ;
+
+M: linux-game-input-backend instance-id
+ drop f ;
+
+M: linux-game-input-backend read-controller
+ drop controller-state new ;
+
+M: linux-game-input-backend calibrate-controller
+ drop ;
+
+M: linux-game-input-backend vibrate-controller
+ 3drop ;
+
+M: linux-game-input-backend read-keyboard
+ 256 keyboard-state boa ;
+
+M: linux-game-input-backend read-mouse
+ 0 0 0 0 2 mouse-state boa ;
+
+M: linux-game-input-backend reset-mouse
+ ;
diff --git a/basis/game/input/linux/platforms.txt b/basis/game/input/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/game/input/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/game/input/linux/summary.txt b/basis/game/input/linux/summary.txt
new file mode 100644
index 0000000000..5c88274722
--- /dev/null
+++ b/basis/game/input/linux/summary.txt
@@ -0,0 +1 @@
+Linux backend for game input.
diff --git a/basis/game/input/linux/tags.txt b/basis/game/input/linux/tags.txt
new file mode 100644
index 0000000000..84d4140a70
--- /dev/null
+++ b/basis/game/input/linux/tags.txt
@@ -0,0 +1 @@
+games
diff --git a/basis/game/input/xinput/platforms.txt b/basis/game/input/xinput/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/game/input/xinput/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/game/input/xinput/tags.txt b/basis/game/input/xinput/tags.txt
index 82506ff250..84d4140a70 100644
--- a/basis/game/input/xinput/tags.txt
+++ b/basis/game/input/xinput/tags.txt
@@ -1,2 +1 @@
-unportable
games
diff --git a/basis/globs/globs-tests.factor b/basis/globs/globs-tests.factor
old mode 100644
new mode 100755
index bdc0623d54..b2432754b1
--- a/basis/globs/globs-tests.factor
+++ b/basis/globs/globs-tests.factor
@@ -1,4 +1,4 @@
-USING: tools.test globs ;
+USING: arrays tools.test globs io.pathnames sequences ;
IN: globs.tests
[ f ] [ "abd" "fdf" glob-matches? ] unit-test
@@ -17,3 +17,24 @@ IN: globs.tests
[ f ] [ "foo." "*.{xml,txt}" glob-matches? ] unit-test
[ t ] [ "foo." "*.{,xml,txt}" glob-matches? ] unit-test
[ t ] [ "foo.{" "*.{" glob-matches? ] unit-test
+
+[ f ] [ "foo" "bar" append-path "*" glob-matches? ] unit-test
+[ t ] [ "foo" "bar" append-path "*" "*" append-path glob-matches? ] unit-test
+[ f ] [ "foo" "bar" append-path "foo?bar" glob-matches? ] unit-test
+[ t ] [ "foo" "bar" append-path "fo?" "bar" append-path glob-matches? ] unit-test
+
+[ f ] [ "foo" glob-pattern? ] unit-test
+[ t ] [ "fo?" glob-pattern? ] unit-test
+[ t ] [ "fo*" glob-pattern? ] unit-test
+[ t ] [ "fo[mno]" glob-pattern? ] unit-test
+[ t ] [ "fo\\*" glob-pattern? ] unit-test
+[ t ] [ "fo{o,bro}" glob-pattern? ] unit-test
+
+{ "foo" "bar" } path-separator join 1array
+[ { "foo" "bar" "ba?" } path-separator join glob-parent-directory ] unit-test
+
+[ "foo" ]
+[ { "foo" "b?r" "bas" } path-separator join glob-parent-directory ] unit-test
+
+[ "" ]
+[ { "f*" "bar" "bas" } path-separator join glob-parent-directory ] unit-test
diff --git a/basis/globs/globs.factor b/basis/globs/globs.factor
index cac7fd9a2f..9cd6a73891 100644
--- a/basis/globs/globs.factor
+++ b/basis/globs/globs.factor
@@ -1,9 +1,12 @@
! Copyright (C) 2007, 2009 Slava Pestov, Daniel Ehrenberg.
! See http://factorcode.org/license.txt for BSD license.
-USING: sequences kernel regexp.combinators strings unicode.case
-peg.ebnf regexp arrays ;
+USING: sequences io.pathnames kernel regexp.combinators
+strings splitting system unicode.case peg.ebnf regexp arrays ;
IN: globs
+: not-path-separator ( -- sep )
+ os windows? R! [^/\\]! R! [^/]! ? ; foldable
+
EBNF:
Character = "\\" .:c => [[ c 1string ]]
@@ -24,8 +27,8 @@ CharClass = "^"?:n Ranges:e => [[ e n [ ] when ]]
AlternationBody = Concatenation:c "," AlternationBody:a => [[ a c prefix ]]
| Concatenation => [[ 1array ]]
-Element = "*" => [[ R/ .*/ ]]
- | "?" => [[ R/ ./ ]]
+Element = "*" => [[ not-path-separator ]]
+ | "?" => [[ not-path-separator ]]
| "[" CharClass:c "]" => [[ c ]]
| "{" AlternationBody:b "}" => [[ b ]]
| Character
@@ -40,3 +43,10 @@ Main = Concatenation End
: glob-matches? ( input glob -- ? )
[ >case-fold ] bi@ matches? ;
+
+: glob-pattern? ( string -- ? )
+ [ "\\*?[{" member? ] any? ;
+
+: glob-parent-directory ( glob -- parent-directory )
+ path-separator split harvest dup [ glob-pattern? ] find drop head
+ path-separator join ;
diff --git a/basis/grouping/grouping-docs.factor b/basis/grouping/grouping-docs.factor
index 2c2fee1d70..0c9db38f4b 100644
--- a/basis/grouping/grouping-docs.factor
+++ b/basis/grouping/grouping-docs.factor
@@ -8,22 +8,48 @@ ARTICLE: "grouping" "Groups and clumps"
{ $subsections groups }
"Splitting a sequence into overlapping, fixed-length subsequences:"
{ $subsections clump }
+"Splitting a sequence into overlapping, fixed-length subsequences, wrapping around the end of the sequence:"
+{ $subsections circular-clump }
"A virtual sequence for splitting a sequence into overlapping, fixed-length subsequences:"
{ $subsections clumps }
+"A virtual sequence for splitting a sequence into overlapping, fixed-length subsequences:"
+{ $subsections circular-clumps }
"The difference can be summarized as the following:"
{ $list
{ "With groups, the subsequences form the original sequence when concatenated:"
+ { $unchecked-example
+ "USING: grouping ;"
+ "{ 1 2 3 4 } 2 group ." "{ { 1 2 } { 3 4 } }"
+ }
{ $unchecked-example
"USING: grouping ;"
"{ 1 2 3 4 } dup" "2 concat sequence= ." "t"
}
}
{ "With clumps, collecting the first element of each subsequence but the last one, together with the last subseqence, yields the original sequence:"
+ { $unchecked-example
+ "USING: grouping ;"
+ "{ 1 2 3 4 } 2 clump ." "{ { 1 2 } { 2 3 } { 3 4 } }"
+ }
{ $unchecked-example
"USING: grouping ;"
"{ 1 2 3 4 } dup" "2 unclip-last [ [ first ] map ] dip append sequence= ." "t"
}
}
+ { "With circular clumps, collecting the first element of each subsequence yields the original sequence. Collecting the " { $snippet "n" } "th element of each subsequence would rotate the original sequence " { $snippet "n" } " elements rightward:"
+ { $unchecked-example
+ "USING: grouping ;"
+ "{ 1 2 3 4 } 2 circular-clump ." "{ { 1 2 } { 2 3 } { 3 4 } { 4 1 } }"
+ }
+ { $unchecked-example
+ "USING: grouping ;"
+ "{ 1 2 3 4 } dup" "2 [ first ] map sequence= ." "t"
+ }
+ { $unchecked-example
+ "USING: grouping ;"
+ "{ 1 2 3 4 } dup" "2 [ second ] { } map-as ." "{ 2 3 4 1 }"
+ }
+ }
}
$nl
"A combinator built using clumps:"
@@ -79,18 +105,31 @@ HELP:
} ;
HELP: clumps
-{ $class-description "Instances are virtual sequences whose elements are overlapping fixed-length subsequences o an underlying sequence. Clumps are mutable and resizable if the underlying sequence is mutable and resizable, respectively."
+{ $class-description "Instances are virtual sequences whose elements are overlapping fixed-length subsequences of an underlying sequence. Clumps are mutable and resizable if the underlying sequence is mutable and resizable, respectively."
$nl
"New clumps are created by calling " { $link } " and " { $link } "." } ;
+HELP: circular-clumps
+{ $class-description "Instances are virtual sequences whose elements are overlapping fixed-length subsequences of an underlying sequence, beginning with every element in the original sequence and wrapping around its end. Circular clumps are mutable and resizable if the underlying sequence is mutable and resizable, respectively."
+$nl
+"New clumps are created by calling " { $link } " and " { $link } "." } ;
+
HELP: clump
{ $values { "seq" "a sequence" } { "n" "a non-negative integer" } { "array" "a sequence of sequences" } }
{ $description "Splits the sequence into overlapping clumps of " { $snippet "n" } " elements and collects the clumps into a new array." }
-{ $errors "Throws an error if " { $snippet "n" } " is smaller than the length of the sequence." }
+{ $errors "Throws an error if " { $snippet "n" } " is larger than the length of the sequence." }
{ $examples
{ $example "USING: grouping prettyprint ;" "{ 3 1 3 3 7 } 2 clump ." "{ { 3 1 } { 1 3 } { 3 3 } { 3 7 } }" }
} ;
+HELP: circular-clump
+{ $values { "seq" "a sequence" } { "n" "a non-negative integer" } { "array" "a sequence of sequences" } }
+{ $description "Splits the sequence into overlapping clumps of " { $snippet "n" } " elements, wrapping around the end of the sequence, and collects the clumps into a new array." }
+{ $errors "Throws an error if " { $snippet "n" } " is larger than the length of the sequence." }
+{ $examples
+ { $example "USING: grouping prettyprint ;" "{ 3 1 3 3 7 } 2 circular-clump ." "{ { 3 1 } { 1 3 } { 3 3 } { 3 7 } { 7 3 } }" }
+} ;
+
HELP:
{ $values { "seq" "a sequence" } { "n" "a non-negative integer" } { "clumps" clumps } }
{ $description "Outputs a virtual sequence whose elements are overlapping subsequences of " { $snippet "n" } " elements from the underlying sequence." }
@@ -111,24 +150,35 @@ HELP:
}
} ;
-HELP:
+HELP:
{ $values { "seq" "a sequence" } { "n" "a non-negative integer" } { "clumps" clumps } }
-{ $description "Outputs a virtual sequence whose elements are overlapping slices of " { $snippet "n" } " elements from the underlying sequence." }
+{ $description "Outputs a virtual sequence whose elements are overlapping subsequences of " { $snippet "n" } " elements from the underlying sequence, starting with each of its elements and wrapping around the end of the sequence." }
{ $examples
{ $example
"USING: kernel sequences grouping prettyprint ;"
- "{ 1 2 3 4 5 6 } 3 second ."
- "T{ slice { from 1 } { to 4 } { seq { 1 2 3 4 5 6 } } }"
+ "{ 1 2 3 4 } 3 third ."
+ "{ 3 4 1 }"
}
} ;
-{ clumps groups } related-words
+HELP:
+{ $values { "seq" "a sequence" } { "n" "a non-negative integer" } { "clumps" clumps } }
+{ $description "Outputs a virtual sequence whose elements are overlapping slices of " { $snippet "n" } " elements from the underlying sequence, starting with each of its elements and wrapping around the end of the sequence." }
+{ $examples
+ { $example
+ "USING: arrays kernel sequences grouping prettyprint ;"
+ "{ 1 2 3 4 } 3 third >array ."
+ "{ 3 4 1 }"
+ }
+} ;
-{ clump group } related-words
+{ clumps circular-clumps groups } related-words
-{ } related-words
+{ clump circular-clump group } related-words
-{ } related-words
+{ } related-words
+
+{ } related-words
HELP: monotonic?
{ $values { "seq" sequence } { "quot" { $quotation "( elt elt -- ? )" } } { "?" "a boolean" } }
diff --git a/basis/grouping/grouping-tests.factor b/basis/grouping/grouping-tests.factor
index 60500558a7..9340b322e2 100644
--- a/basis/grouping/grouping-tests.factor
+++ b/basis/grouping/grouping-tests.factor
@@ -17,6 +17,15 @@ IN: grouping.tests
[ 1 ] [ { 1 2 } 2 length ] unit-test
[ 2 ] [ { 1 2 3 } 2 length ] unit-test
+[ { } 2 length ] must-fail
+[ { 1 } 2 length ] must-fail
+
+[ 2 ] [ { 1 2 } 2 length ] unit-test
+[ 3 ] [ { 1 2 3 } 2 length ] unit-test
+
+[ { { 1 2 } { 2 1 } } ] [ { 1 2 } 2 circular-clump ] unit-test
+[ { { 1 2 } { 2 3 } { 3 1 } } ] [ { 1 2 3 } 2 circular-clump ] unit-test
+
[ 1 ] [ V{ } 2 0 over set-length seq>> length ] unit-test
[ 2 ] [ V{ } 2 1 over set-length seq>> length ] unit-test
[ 3 ] [ V{ } 2 2 over set-length seq>> length ] unit-test
diff --git a/basis/grouping/grouping.factor b/basis/grouping/grouping.factor
index 4ee0d0c385..0dced6ad9d 100644
--- a/basis/grouping/grouping.factor
+++ b/basis/grouping/grouping.factor
@@ -1,7 +1,7 @@
! Copyright (C) 2005, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math math.order strings arrays vectors sequences
-sequences.private accessors fry ;
+sequences.private accessors fry combinators.short-circuit ;
IN: grouping
= [ - ] [ drop ] if ; inline
+
+: check-circular-clumps ( seq n -- seq n )
+ 2dup { [ nip 0 <= ] [ swap length > ] } 2||
+ [ "Invalid clump size" throw ] when ; inline
+
PRIVATE>
TUPLE: groups < chunking-seq ;
@@ -106,3 +113,37 @@ INSTANCE: sliced-clumps abstract-clumps
: all-equal? ( seq -- ? ) [ = ] monotonic? ;
: all-eq? ( seq -- ? ) [ eq? ] monotonic? ;
+
+TUPLE: circular-slice < slice ;
+M: circular-slice virtual@
+ [ from>> + ] [ seq>> ] bi [ length slice-mod ] keep ; inline
+
+C: circular-slice
+
+TUPLE: sliced-circular-clumps < chunking-seq ;
+INSTANCE: sliced-circular-clumps sequence
+
+M: sliced-circular-clumps length
+ seq>> length ; inline
+
+M: sliced-circular-clumps nth
+ [ n>> over + ] [ seq>> ] bi ; inline
+
+: ( seq n -- clumps )
+ check-circular-clumps sliced-circular-clumps boa ; inline
+
+TUPLE: circular-clumps < chunking-seq ;
+INSTANCE: circular-clumps sequence
+
+M: circular-clumps length
+ seq>> length ; inline
+
+M: circular-clumps nth
+ [ n>> over + ] [ seq>> ] bi [ ] [ like ] bi ; inline
+
+: ( seq n -- clumps )
+ check-circular-clumps circular-clumps boa ; inline
+
+: circular-clump ( seq n -- array )
+ { } like ; inline
+
diff --git a/basis/help/lint/checks/checks.factor b/basis/help/lint/checks/checks.factor
index 340f9b16d3..632cdb46e2 100644
--- a/basis/help/lint/checks/checks.factor
+++ b/basis/help/lint/checks/checks.factor
@@ -33,7 +33,7 @@ SYMBOL: vocab-articles
: extract-values ( element -- seq )
\ $values swap elements dup empty? [
- first rest [ first ] map prune
+ first rest [ first ] map
] unless ;
: effect-values ( word -- seq )
diff --git a/basis/help/markup/markup.factor b/basis/help/markup/markup.factor
index 75e6538243..f951f30b2f 100644
--- a/basis/help/markup/markup.factor
+++ b/basis/help/markup/markup.factor
@@ -129,8 +129,8 @@ ALIAS: $slot $snippet
"Examples" $heading print-element ;
: $example ( element -- )
- 1 cut* swap "\n" join dup [
- input-style get format nl print-element
+ 1 cut* [ "\n" join ] bi@ over [
+ [ print ] [ output-style get format ] bi*
] ($code) ;
: $unchecked-example ( element -- )
diff --git a/basis/help/stylesheet/stylesheet.factor b/basis/help/stylesheet/stylesheet.factor
index 8a119823cc..254b65e5ac 100644
--- a/basis/help/stylesheet/stylesheet.factor
+++ b/basis/help/stylesheet/stylesheet.factor
@@ -80,8 +80,11 @@ H{
{ wrap-margin f }
} code-style set-global
-SYMBOL: input-style
-H{ { font-style bold } } input-style set-global
+SYMBOL: output-style
+H{
+ { font-style bold }
+ { foreground COLOR: DarkOrange4 }
+} output-style set-global
SYMBOL: url-style
H{
diff --git a/basis/images/normalization/normalization-docs.factor b/basis/images/normalization/normalization-docs.factor
index 8ed4b659ed..39e2fee769 100644
--- a/basis/images/normalization/normalization-docs.factor
+++ b/basis/images/normalization/normalization-docs.factor
@@ -6,14 +6,14 @@ IN: images.normalization
HELP: normalize-image
{ $values
{ "image" image }
- { "image" image }
+ { "image'" image }
}
{ $description "Converts the image to RGBA with ubyte-components. If the image is upside-down, it will be flipped right side up such that the 1st byte in the bitmap slot's byte array corresponds to the first color component of the pixel in the upper-left corner of the image." } ;
HELP: reorder-components
{ $values
{ "image" image } { "component-order" component-order }
- { "image" image }
+ { "image'" image }
}
{ $description "Convert the bitmap in " { $snippet "image" } " such that the pixel sample layout corresponds to " { $snippet "component-order" } ". If the destination layout cannot find a corresponding value from the source layout, the value " { $snippet "255" } " will be substituted for that byte." }
{ $warning "The image's " { $snippet "component-type" } " will be changed to " { $snippet "ubyte-components" } " if it is not already in that format."
diff --git a/basis/images/normalization/normalization.factor b/basis/images/normalization/normalization.factor
index 2bd7e6883f..6eaca01e15 100644
--- a/basis/images/normalization/normalization.factor
+++ b/basis/images/normalization/normalization.factor
@@ -55,7 +55,7 @@ M: ushort-components normalize-component-type*
M: ubyte-components normalize-component-type*
drop ;
-: normalize-scan-line-order ( image -- image )
+: normalize-scan-line-order ( image -- image' )
dup upside-down?>> [
dup dim>> first 4 * '[
_ reverse concat
@@ -71,14 +71,14 @@ M: ubyte-components normalize-component-type*
PRIVATE>
-: reorder-components ( image component-order -- image )
+: reorder-components ( image component-order -- image' )
[
dup component-type>> '[ _ normalize-component-type* ] change-bitmap
dup component-order>>
] dip
validate-request [ (reorder-components) ] keep >>component-order ;
-: normalize-image ( image -- image )
+: normalize-image ( image -- image' )
[ >byte-array ] change-bitmap
RGBA reorder-components
normalize-scan-line-order ;
diff --git a/basis/images/processing/processing.factor b/basis/images/processing/processing.factor
index b21eb50c62..aa6434743f 100644
--- a/basis/images/processing/processing.factor
+++ b/basis/images/processing/processing.factor
@@ -6,7 +6,7 @@ math.ranges math.vectors sequences sequences.deep fry ;
IN: images.processing
: coord-matrix ( dim -- m )
- [ iota ] map first2 [ [ 2array ] with map ] curry map ;
+ [ iota ] map first2 cartesian-product ;
: map^2 ( m quot -- m' ) '[ _ map ] map ; inline
: each^2 ( m quot -- m' ) '[ _ each ] each ; inline
diff --git a/basis/images/tags.txt b/basis/images/tags.txt
index 04b54a06f4..9347bd326b 100644
--- a/basis/images/tags.txt
+++ b/basis/images/tags.txt
@@ -1 +1 @@
-bitmap graphics
+graphics
diff --git a/basis/inverse/inverse.factor b/basis/inverse/inverse.factor
index d112e4e6eb..3485b3efa7 100644
--- a/basis/inverse/inverse.factor
+++ b/basis/inverse/inverse.factor
@@ -1,10 +1,10 @@
! Copyright (C) 2007, 2009 Daniel Ehrenberg.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel locals words summary slots quotations
-sequences assocs math arrays stack-checker effects
-continuations debugger classes.tuple namespaces make vectors
-bit-arrays byte-arrays strings sbufs math.functions macros
-sequences.private combinators mirrors splitting combinators.smart
+sequences assocs math arrays stack-checker effects continuations
+classes.tuple namespaces make vectors bit-arrays byte-arrays
+strings sbufs math.functions macros sequences.private
+combinators mirrors splitting combinators.smart
combinators.short-circuit fry words.symbol generalizations
classes ;
IN: inverse
diff --git a/basis/io/backend/unix/bsd/platforms.txt b/basis/io/backend/unix/bsd/platforms.txt
new file mode 100644
index 0000000000..df796f15d4
--- /dev/null
+++ b/basis/io/backend/unix/bsd/platforms.txt
@@ -0,0 +1 @@
+bsd
diff --git a/basis/io/backend/unix/bsd/tags.txt b/basis/io/backend/unix/bsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/bsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/freebsd/platforms.txt b/basis/io/backend/unix/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/io/backend/unix/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/io/backend/unix/freebsd/tags.txt b/basis/io/backend/unix/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/linux/platforms.txt b/basis/io/backend/unix/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/io/backend/unix/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/io/backend/unix/linux/tags.txt b/basis/io/backend/unix/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/macosx/platforms.txt b/basis/io/backend/unix/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/io/backend/unix/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/io/backend/unix/macosx/tags.txt b/basis/io/backend/unix/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/multiplexers/epoll/platforms.txt b/basis/io/backend/unix/multiplexers/epoll/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/io/backend/unix/multiplexers/epoll/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/io/backend/unix/multiplexers/epoll/tags.txt b/basis/io/backend/unix/multiplexers/epoll/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/multiplexers/epoll/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/multiplexers/kqueue/platforms.txt b/basis/io/backend/unix/multiplexers/kqueue/platforms.txt
new file mode 100644
index 0000000000..df796f15d4
--- /dev/null
+++ b/basis/io/backend/unix/multiplexers/kqueue/platforms.txt
@@ -0,0 +1 @@
+bsd
diff --git a/basis/io/backend/unix/multiplexers/kqueue/tags.txt b/basis/io/backend/unix/multiplexers/kqueue/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/multiplexers/kqueue/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/multiplexers/platforms.txt b/basis/io/backend/unix/multiplexers/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/backend/unix/multiplexers/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/backend/unix/multiplexers/run-loop/platforms.txt b/basis/io/backend/unix/multiplexers/run-loop/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/io/backend/unix/multiplexers/run-loop/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/io/backend/unix/multiplexers/run-loop/tags.txt b/basis/io/backend/unix/multiplexers/run-loop/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/multiplexers/run-loop/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/multiplexers/select/platforms.txt b/basis/io/backend/unix/multiplexers/select/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/backend/unix/multiplexers/select/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/backend/unix/multiplexers/select/select.factor b/basis/io/backend/unix/multiplexers/select/select.factor
index f2d1a3a3b7..5a3dab4dcc 100644
--- a/basis/io/backend/unix/multiplexers/select/select.factor
+++ b/basis/io/backend/unix/multiplexers/select/select.factor
@@ -1,8 +1,9 @@
! Copyright (C) 2004, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: alien.c-types kernel bit-arrays sequences assocs unix
-math namespaces accessors math.order locals unix.time fry
-io.ports io.backend.unix io.backend.unix.multiplexers ;
+USING: alien.c-types kernel bit-arrays sequences assocs math
+namespaces accessors math.order locals fry io.ports
+io.backend.unix io.backend.unix.multiplexers unix unix.ffi
+unix.time ;
IN: io.backend.unix.multiplexers.select
TUPLE: select-mx < mx read-fdset write-fdset ;
diff --git a/basis/io/backend/unix/multiplexers/select/tags.txt b/basis/io/backend/unix/multiplexers/select/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/multiplexers/select/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/multiplexers/tags.txt b/basis/io/backend/unix/multiplexers/tags.txt
deleted file mode 100755
index 6abe115b12..0000000000
--- a/basis/io/backend/unix/multiplexers/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/netbsd/platforms.txt b/basis/io/backend/unix/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/io/backend/unix/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/io/backend/unix/netbsd/tags.txt b/basis/io/backend/unix/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/openbsd/platforms.txt b/basis/io/backend/unix/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/io/backend/unix/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/io/backend/unix/openbsd/tags.txt b/basis/io/backend/unix/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/unix/platforms.txt b/basis/io/backend/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/backend/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/backend/unix/tags.txt b/basis/io/backend/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/windows/nt/platforms.txt b/basis/io/backend/windows/nt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/io/backend/windows/nt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/io/backend/windows/nt/privileges/platforms.txt b/basis/io/backend/windows/nt/privileges/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/io/backend/windows/nt/privileges/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/io/backend/windows/nt/privileges/tags.txt b/basis/io/backend/windows/nt/privileges/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/windows/nt/privileges/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/windows/nt/tags.txt b/basis/io/backend/windows/nt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/windows/nt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/windows/platforms.txt b/basis/io/backend/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/backend/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/backend/windows/privileges/platforms.txt b/basis/io/backend/windows/privileges/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/backend/windows/privileges/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/backend/windows/privileges/tags.txt b/basis/io/backend/windows/privileges/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/backend/windows/privileges/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/backend/windows/tags.txt b/basis/io/backend/windows/tags.txt
deleted file mode 100755
index 6bf68304bb..0000000000
--- a/basis/io/backend/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/buffers/buffers-tests.factor b/basis/io/buffers/buffers-tests.factor
index 836b4d0cc8..07e783f267 100644
--- a/basis/io/buffers/buffers-tests.factor
+++ b/basis/io/buffers/buffers-tests.factor
@@ -4,8 +4,9 @@ kernel.private libc sequences tools.test namespaces byte-arrays
strings accessors destructors ;
: buffer-set ( string buffer -- )
- over >byte-array over ptr>> byte-array>memory
- [ length ] dip buffer-reset ;
+ [ ptr>> swap >byte-array binary-object memcpy ]
+ [ [ length ] dip buffer-reset ]
+ 2bi ;
: string>buffer ( string -- buffer )
dup length [ buffer-set ] keep ;
diff --git a/basis/io/buffers/buffers.factor b/basis/io/buffers/buffers.factor
index 23358d9a0e..562abad082 100644
--- a/basis/io/buffers/buffers.factor
+++ b/basis/io/buffers/buffers.factor
@@ -60,8 +60,8 @@ HINTS: buffer-read fixnum buffer ;
HINTS: n>buffer fixnum buffer ;
: >buffer ( byte-array buffer -- )
- [ buffer-end byte-array>memory ]
- [ [ length ] dip n>buffer ]
+ [ buffer-end swap binary-object memcpy ]
+ [ [ byte-length ] dip n>buffer ]
2bi ;
HINTS: >buffer byte-array buffer ;
diff --git a/basis/io/directories/directories-docs.factor b/basis/io/directories/directories-docs.factor
index 4af5ee4592..804a2f4a8d 100644
--- a/basis/io/directories/directories-docs.factor
+++ b/basis/io/directories/directories-docs.factor
@@ -46,10 +46,18 @@ HELP: directory-files
{ $values { "path" "a pathname string" } { "seq" "a sequence of filenames" } }
{ $description "Outputs the contents of a directory named by " { $snippet "path" } "." } ;
+HELP: directory-tree-files
+{ $values { "path" "a pathname string" } { "seq" "a sequence of filenames" } }
+{ $description "Outputs a sequence of all files and subdirectories inside the directory named by " { $snippet "path" } " or recursively inside its subdirectories." } ;
+
HELP: with-directory-files
{ $values { "path" "a pathname string" } { "quot" quotation } }
{ $description "Calls the quotation with the directory file names on the stack and with the directory set as the " { $link current-directory } ". Restores the current directory after the quotation is called." } ;
+HELP: with-directory-tree-files
+{ $values { "path" "a pathname string" } { "quot" quotation } }
+{ $description "Calls the quotation with the recursive directory file names on the stack and with the directory set as the " { $link current-directory } ". Restores the current directory after the quotation is called." } ;
+
HELP: with-directory-entries
{ $values { "path" "a pathname string" } { "quot" quotation } }
{ $description "Calls the quotation with the directory entries on the stack and with the directory set as the " { $link current-directory } ". Restores the current directory after the quotation is called." } ;
diff --git a/basis/io/directories/directories-tests.factor b/basis/io/directories/directories-tests.factor
index b703421b45..742a927b4b 100644
--- a/basis/io/directories/directories-tests.factor
+++ b/basis/io/directories/directories-tests.factor
@@ -22,6 +22,24 @@ IN: io.directories.tests
] with-directory-files
] unit-test
+[ { "classes/tuple/tuple.factor" } ] [
+ "resource:core" [
+ "." directory-tree-files [ "classes/tuple/tuple.factor" = ] filter
+ ] with-directory
+] unit-test
+
+[ { "classes/tuple" } ] [
+ "resource:core" [
+ "." directory-tree-files [ "classes/tuple" = ] filter
+ ] with-directory
+] unit-test
+
+[ { "classes/tuple/tuple.factor" } ] [
+ "resource:core" [
+ [ "classes/tuple/tuple.factor" = ] filter
+ ] with-directory-tree-files
+] unit-test
+
[ ] [ "blahblah" temp-file dup exists? [ delete-directory ] [ drop ] if ] unit-test
[ ] [ "blahblah" temp-file make-directory ] unit-test
[ t ] [ "blahblah" temp-file file-info directory? ] unit-test
diff --git a/basis/io/directories/directories.factor b/basis/io/directories/directories.factor
index 0524398304..d12adc5f41 100644
--- a/basis/io/directories/directories.factor
+++ b/basis/io/directories/directories.factor
@@ -1,8 +1,8 @@
! Copyright (C) 2004, 2008 Slava Pestov, Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators destructors io io.backend
-io.encodings.binary io.files io.pathnames kernel namespaces
-sequences system vocabs.loader fry ;
+USING: accessors arrays combinators destructors io io.backend
+io.encodings.binary io.files io.files.types io.pathnames
+kernel namespaces sequences system vocabs.loader fry ;
IN: io.directories
: set-current-directory ( path -- )
@@ -41,12 +41,26 @@ HOOK: (directory-entries) os ( path -- seq )
: directory-files ( path -- seq )
directory-entries [ name>> ] map ;
+: directory-tree-files ( path -- seq )
+ dup directory-entries
+ [
+ dup type>> +directory+ =
+ [ name>>
+ [ append-path directory-tree-files ]
+ [ [ prepend-path ] curry map ]
+ [ prefix ] tri
+ ] [ nip name>> 1array ] if
+ ] with map concat ;
+
: with-directory-entries ( path quot -- )
'[ "" directory-entries @ ] with-directory ; inline
: with-directory-files ( path quot -- )
'[ "" directory-files @ ] with-directory ; inline
+: with-directory-tree-files ( path quot -- )
+ '[ "" directory-tree-files @ ] with-directory ; inline
+
! Touching files
HOOK: touch-file io-backend ( path -- )
diff --git a/basis/io/directories/search/windows/platforms.txt b/basis/io/directories/search/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/directories/search/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/directories/search/windows/tags.txt b/basis/io/directories/search/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/directories/search/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/directories/unix/linux/platforms.txt b/basis/io/directories/unix/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/io/directories/unix/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/io/directories/unix/linux/tags.txt b/basis/io/directories/unix/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/directories/unix/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/directories/unix/platforms.txt b/basis/io/directories/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/directories/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/directories/unix/tags.txt b/basis/io/directories/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/directories/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/directories/windows/platforms.txt b/basis/io/directories/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/directories/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/directories/windows/tags.txt b/basis/io/directories/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/directories/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/encodings/utf32/utf32-tests.factor b/basis/io/encodings/utf32/utf32-tests.factor
index 2a80e47c7b..adff0ecf4b 100644
--- a/basis/io/encodings/utf32/utf32-tests.factor
+++ b/basis/io/encodings/utf32/utf32-tests.factor
@@ -12,7 +12,7 @@ IN: io.encodings.utf32.tests
[ { CHAR: replacement-character } ] [ B{ 0 } utf32be decode >array ] unit-test
[ { } ] [ { } utf32be decode >array ] unit-test
-[ { 0 0 0 CHAR: x 0 1 HEX: D1 HEX: 1E } ] [ { CHAR: x HEX: 1d11e } >string utf32be encode >array ] unit-test
+[ B{ 0 0 0 CHAR: x 0 1 HEX: D1 HEX: 1E } ] [ { CHAR: x HEX: 1d11e } >string utf32be encode ] unit-test
[ { CHAR: x } ] [ B{ CHAR: x 0 0 0 } utf32le decode >array ] unit-test
[ { HEX: 1d11e } ] [ B{ HEX: 1e HEX: d1 1 0 } utf32le decode >array ] unit-test
@@ -21,10 +21,10 @@ IN: io.encodings.utf32.tests
[ { CHAR: replacement-character } ] [ B{ HEX: 1e } utf32le decode >array ] unit-test
[ { } ] [ { } utf32le decode >array ] unit-test
-[ { 120 0 0 0 HEX: 1e HEX: d1 1 0 } ] [ { CHAR: x HEX: 1d11e } >string utf32le encode >array ] unit-test
+[ B{ 120 0 0 0 HEX: 1e HEX: d1 1 0 } ] [ { CHAR: x HEX: 1d11e } >string utf32le encode ] unit-test
[ { CHAR: x } ] [ B{ HEX: ff HEX: fe 0 0 CHAR: x 0 0 0 } utf32 decode >array ] unit-test
[ { CHAR: x } ] [ B{ 0 0 HEX: fe HEX: ff 0 0 0 CHAR: x } utf32 decode >array ] unit-test
-[ { HEX: ff HEX: fe 0 0 120 0 0 0 HEX: 1e HEX: d1 1 0 } ] [ { CHAR: x HEX: 1d11e } >string utf32 encode >array ] unit-test
+[ B{ HEX: ff HEX: fe 0 0 120 0 0 0 HEX: 1e HEX: d1 1 0 } ] [ { CHAR: x HEX: 1d11e } >string utf32 encode ] unit-test
diff --git a/basis/io/files/info/unix/bsd/platforms.txt b/basis/io/files/info/unix/bsd/platforms.txt
new file mode 100644
index 0000000000..df796f15d4
--- /dev/null
+++ b/basis/io/files/info/unix/bsd/platforms.txt
@@ -0,0 +1 @@
+bsd
diff --git a/basis/io/files/info/unix/bsd/tags.txt b/basis/io/files/info/unix/bsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/info/unix/bsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/info/unix/freebsd/freebsd.factor b/basis/io/files/info/unix/freebsd/freebsd.factor
index f1d6b4db66..7c13d86a3c 100644
--- a/basis/io/files/info/unix/freebsd/freebsd.factor
+++ b/basis/io/files/info/unix/freebsd/freebsd.factor
@@ -1,6 +1,6 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.syntax combinators
+USING: accessors alien alien.c-types alien.syntax combinators
io.backend io.files io.files.info io.files.unix kernel math system unix
unix.statfs.freebsd unix.statvfs.freebsd unix.getfsstat.freebsd
sequences grouping alien.strings io.encodings.utf8 unix.types
diff --git a/basis/io/files/info/unix/freebsd/platforms.txt b/basis/io/files/info/unix/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/io/files/info/unix/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/io/files/info/unix/freebsd/tags.txt b/basis/io/files/info/unix/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/info/unix/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/info/unix/linux/platforms.txt b/basis/io/files/info/unix/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/io/files/info/unix/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/io/files/info/unix/linux/tags.txt b/basis/io/files/info/unix/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/info/unix/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/info/unix/macosx/platforms.txt b/basis/io/files/info/unix/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/io/files/info/unix/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/io/files/info/unix/macosx/tags.txt b/basis/io/files/info/unix/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/info/unix/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/info/unix/netbsd/netbsd.factor b/basis/io/files/info/unix/netbsd/netbsd.factor
index 9e37ec8aa9..9ea475433b 100644
--- a/basis/io/files/info/unix/netbsd/netbsd.factor
+++ b/basis/io/files/info/unix/netbsd/netbsd.factor
@@ -1,6 +1,6 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: alien.syntax kernel unix.stat math unix
+USING: alien alien.syntax kernel unix.stat math unix
combinators system io.backend accessors alien.c-types
io.encodings.utf8 alien.strings unix.types io.files.unix
io.files io.files.info unix.statvfs.netbsd unix.getfsstat.netbsd arrays
diff --git a/basis/io/files/info/unix/netbsd/platforms.txt b/basis/io/files/info/unix/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/io/files/info/unix/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/io/files/info/unix/netbsd/tags.txt b/basis/io/files/info/unix/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/info/unix/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/info/unix/openbsd/openbsd.factor b/basis/io/files/info/unix/openbsd/openbsd.factor
index be88929f2e..e80a4fdafd 100644
--- a/basis/io/files/info/unix/openbsd/openbsd.factor
+++ b/basis/io/files/info/unix/openbsd/openbsd.factor
@@ -1,6 +1,6 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.strings alien.syntax
+USING: accessors alien alien.c-types alien.strings alien.syntax
combinators io.backend io.files io.files.info io.files.unix kernel math
sequences system unix unix.getfsstat.openbsd grouping
unix.statfs.openbsd unix.statvfs.openbsd unix.types
diff --git a/basis/io/files/info/unix/openbsd/platforms.txt b/basis/io/files/info/unix/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/io/files/info/unix/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/io/files/info/unix/openbsd/tags.txt b/basis/io/files/info/unix/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/info/unix/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/info/unix/platforms.txt b/basis/io/files/info/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/files/info/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/files/info/unix/tags.txt b/basis/io/files/info/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/info/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/info/windows/platforms.txt b/basis/io/files/info/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/files/info/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/files/info/windows/tags.txt b/basis/io/files/info/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/info/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/links/unix/platforms.txt b/basis/io/files/links/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/files/links/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/files/links/unix/tags.txt b/basis/io/files/links/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/links/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/unique/unix/platforms.txt b/basis/io/files/unique/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/files/unique/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/files/unique/unix/tags.txt b/basis/io/files/unique/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/unique/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/unique/windows/platforms.txt b/basis/io/files/unique/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/files/unique/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/files/unique/windows/tags.txt b/basis/io/files/unique/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/unique/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/unix/platforms.txt b/basis/io/files/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/files/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/files/unix/tags.txt b/basis/io/files/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/windows/nt/platforms.txt b/basis/io/files/windows/nt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/io/files/windows/nt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/io/files/windows/nt/tags.txt b/basis/io/files/windows/nt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/windows/nt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/files/windows/platforms.txt b/basis/io/files/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/files/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/files/windows/tags.txt b/basis/io/files/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/files/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/launcher/unix/parser/parser-tests.factor b/basis/io/launcher/unix/parser/parser-tests.factor
deleted file mode 100644
index 90504ccac2..0000000000
--- a/basis/io/launcher/unix/parser/parser-tests.factor
+++ /dev/null
@@ -1,33 +0,0 @@
-IN: io.launcher.unix.parser.tests
-USING: io.launcher.unix.parser tools.test ;
-
-[ "" tokenize-command ] must-fail
-[ " " tokenize-command ] must-fail
-[ V{ "a" } ] [ "a" tokenize-command ] unit-test
-[ V{ "abc" } ] [ "abc" tokenize-command ] unit-test
-[ V{ "abc" } ] [ "abc " tokenize-command ] unit-test
-[ V{ "abc" } ] [ " abc" tokenize-command ] unit-test
-[ V{ "abc" "def" } ] [ "abc def" tokenize-command ] unit-test
-[ V{ "abc def" } ] [ "abc\\ def" tokenize-command ] unit-test
-[ V{ "abc\\" "def" } ] [ "abc\\\\ def" tokenize-command ] unit-test
-[ V{ "abc\\ def" } ] [ "\"abc\\\\ def\"" tokenize-command ] unit-test
-[ V{ "abc\\ def" } ] [ " \"abc\\\\ def\"" tokenize-command ] unit-test
-[ V{ "abc\\ def" "hey" } ] [ "\"abc\\\\ def\" hey" tokenize-command ] unit-test
-[ V{ "abc def" "hey" } ] [ "\"abc def\" \"hey\"" tokenize-command ] unit-test
-[ "\"abc def\" \"hey" tokenize-command ] must-fail
-[ "\"abc def" tokenize-command ] must-fail
-[ V{ "abc def" "h\"ey" } ] [ "\"abc def\" \"h\\\"ey\" " tokenize-command ] unit-test
-
-[
- V{
- "Hello world.app/Contents/MacOS/hello-ui"
- "-i=boot.macosx-ppc.image"
- "-include= math compiler ui"
- "-deploy-vocab=hello-ui"
- "-output-image=Hello world.app/Contents/Resources/hello-ui.image"
- "-no-stack-traces"
- "-no-user-init"
- }
-] [
- "\"Hello world.app/Contents/MacOS/hello-ui\" -i=boot.macosx-ppc.image \"-include= math compiler ui\" -deploy-vocab=hello-ui \"-output-image=Hello world.app/Contents/Resources/hello-ui.image\" -no-stack-traces -no-user-init" tokenize-command
-] unit-test
diff --git a/basis/io/launcher/unix/parser/tags.txt b/basis/io/launcher/unix/parser/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/launcher/unix/parser/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/launcher/unix/platforms.txt b/basis/io/launcher/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/launcher/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/launcher/unix/tags.txt b/basis/io/launcher/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/launcher/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/launcher/unix/unix.factor b/basis/io/launcher/unix/unix.factor
index d8b55d3d17..aaaccd4719 100644
--- a/basis/io/launcher/unix/unix.factor
+++ b/basis/io/launcher/unix/unix.factor
@@ -1,15 +1,14 @@
-! Copyright (C) 2007, 2008 Slava Pestov.
+! Copyright (C) 2007, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.c-types arrays assocs combinators
continuations environment io io.backend io.backend.unix
-io.files io.files.private io.files.unix io.launcher
-io.launcher.unix.parser io.pathnames io.ports kernel math
-namespaces sequences strings system threads unix
-unix.process unix.ffi ;
+io.files io.files.private io.files.unix io.launcher io.pathnames
+io.ports kernel math namespaces sequences strings system threads
+unix unix.process unix.ffi simple-tokenizer ;
IN: io.launcher.unix
: get-arguments ( process -- seq )
- command>> dup string? [ tokenize-command ] when ;
+ command>> dup string? [ tokenize ] when ;
: assoc>env ( assoc -- env )
[ "=" glue ] { } assoc>map ;
diff --git a/basis/io/launcher/windows/nt/platforms.txt b/basis/io/launcher/windows/nt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/io/launcher/windows/nt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/io/launcher/windows/nt/tags.txt b/basis/io/launcher/windows/nt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/launcher/windows/nt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/launcher/windows/platforms.txt b/basis/io/launcher/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/launcher/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/launcher/windows/tags.txt b/basis/io/launcher/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/launcher/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/mmap/unix/platforms.txt b/basis/io/mmap/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/mmap/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/mmap/unix/tags.txt b/basis/io/mmap/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/mmap/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/mmap/windows/platforms.txt b/basis/io/mmap/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/mmap/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/mmap/windows/tags.txt b/basis/io/mmap/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/mmap/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/monitors/linux/linux.factor b/basis/io/monitors/linux/linux.factor
index 7653eaa84c..eacc920303 100644
--- a/basis/io/monitors/linux/linux.factor
+++ b/basis/io/monitors/linux/linux.factor
@@ -59,7 +59,9 @@ M: linux-monitor dispose* ( monitor -- )
[ inotify>> handle>> handle-fd ] [ wd>> ] bi
inotify_rm_watch io-error
] if
- ] bi ;
+ ]
+ [ call-next-method ]
+ tri ;
: ignore-flags? ( mask -- ? )
{
diff --git a/basis/io/monitors/linux/platforms.txt b/basis/io/monitors/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/io/monitors/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/io/monitors/linux/tags.txt b/basis/io/monitors/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/monitors/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/monitors/macosx/macosx.factor b/basis/io/monitors/macosx/macosx.factor
index e71fb2eca2..dbbbe7c7e3 100644
--- a/basis/io/monitors/macosx/macosx.factor
+++ b/basis/io/monitors/macosx/macosx.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: io.backend io.monitors
core-foundation.fsevents continuations kernel sequences
@@ -16,6 +16,7 @@ M:: macosx (monitor) ( path recursive? mailbox -- monitor )
dup [ enqueue-notifications ] curry
path 1array 0 0 >>handle ;
-M: macosx-monitor dispose* handle>> dispose ;
+M: macosx-monitor dispose*
+ [ handle>> dispose ] [ call-next-method ] bi ;
macosx set-io-backend
diff --git a/basis/io/monitors/macosx/platforms.txt b/basis/io/monitors/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/io/monitors/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/io/monitors/macosx/tags.txt b/basis/io/monitors/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/monitors/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/monitors/monitors-tests.factor b/basis/io/monitors/monitors-tests.factor
index 576ac7ca30..ac17c4a39f 100644
--- a/basis/io/monitors/monitors-tests.factor
+++ b/basis/io/monitors/monitors-tests.factor
@@ -3,7 +3,7 @@ USING: io.monitors tools.test io.files system sequences
continuations namespaces concurrency.count-downs kernel io
threads calendar prettyprint destructors io.timeouts
io.files.temp io.directories io.directories.hierarchy
-io.pathnames accessors ;
+io.pathnames accessors concurrency.promises ;
os { winnt linux macosx } member? [
[
@@ -110,4 +110,23 @@ os { winnt linux macosx } member? [
[ [ t ] [ "m" get next-change drop ] while ] must-fail
[ ] [ "m" get dispose ] unit-test
] with-monitors
+
+ ! Disposing a monitor should throw an error in any threads
+ ! waiting on notifications
+ [
+ [ ] [
+ "p" set
+ "monitor-test" temp-file t "m" set
+ 10 seconds "m" get set-timeout
+ ] unit-test
+
+ [
+ [ "m" get next-change ] [ ] recover
+ "p" get fulfill
+ ] in-thread
+
+ [ ] [ 1 seconds sleep ] unit-test
+ [ ] [ "m" get dispose ] unit-test
+ [ t ] [ "p" get 10 seconds ?promise-timeout already-disposed? ] unit-test
+ ] with-monitors
] when
diff --git a/basis/io/monitors/monitors.factor b/basis/io/monitors/monitors.factor
index cb2f552a32..731798c424 100644
--- a/basis/io/monitors/monitors.factor
+++ b/basis/io/monitors/monitors.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: io.backend kernel continuations destructors namespaces
sequences assocs hashtables sorting arrays threads boxes
@@ -26,6 +26,15 @@ M: monitor timeout timeout>> ;
M: monitor set-timeout (>>timeout) ;
+
+
+M: monitor dispose*
+ [ monitor-disposed ] dip queue>> mailbox-put ;
+
: new-monitor ( path mailbox class -- monitor )
new-disposable
swap >>queue
@@ -34,8 +43,11 @@ M: monitor set-timeout (>>timeout) ;
TUPLE: file-change path changed monitor ;
: queue-change ( path changes monitor -- )
- 3dup and and
- [ [ file-change boa ] keep queue>> mailbox-put ] [ 3drop ] if ;
+ 3dup and and [
+ [ check-disposed ] keep
+ [ file-change boa ] keep
+ queue>> mailbox-put
+ ] [ 3drop ] if ;
HOOK: (monitor) io-backend ( path recursive? mailbox -- monitor )
@@ -43,7 +55,11 @@ HOOK: (monitor) io-backend ( path recursive? mailbox -- monitor )
(monitor) ;
: next-change ( monitor -- change )
- [ queue>> ] [ timeout ] bi mailbox-get-timeout ;
+ [ check-disposed ]
+ [
+ [ ] [ queue>> ] [ timeout ] tri mailbox-get-timeout
+ dup monitor-disposed eq? [ drop already-disposed ] [ nip ] if
+ ] bi ;
SYMBOL: +add-file+
SYMBOL: +remove-file+
diff --git a/basis/io/monitors/recursive/recursive.factor b/basis/io/monitors/recursive/recursive.factor
index 33477abdb6..b573e2fa2b 100644
--- a/basis/io/monitors/recursive/recursive.factor
+++ b/basis/io/monitors/recursive/recursive.factor
@@ -39,17 +39,19 @@ DEFER: add-child-monitor
: remove-child-monitor ( monitor -- )
monitor tget children>> delete-at* [ dispose ] [ drop ] if ;
+SYMBOL: +stop+
+
M: recursive-monitor dispose*
- [ "stop" swap thread>> send-synchronous drop ]
- [ queue>> dispose ]
- bi ;
+ [ [ +stop+ ] dip thread>> send ] [ call-next-method ] bi ;
: stop-pump ( -- )
monitor tget children>> values dispose-each ;
: pump-step ( msg -- )
- [ [ monitor>> path>> ] [ path>> ] bi append-path ] [ changed>> ] bi
- monitor tget queue-change ;
+ monitor tget disposed>> [ drop ] [
+ [ [ monitor>> path>> ] [ path>> ] bi append-path ] [ changed>> ] bi
+ monitor tget queue-change
+ ] if ;
: child-added ( path monitor -- )
path>> prepend-path add-child-monitor ;
@@ -69,8 +71,8 @@ M: recursive-monitor dispose*
] with with each ;
: pump-loop ( -- )
- receive dup synchronous? [
- [ stop-pump t ] dip reply-synchronous
+ receive dup +stop+ eq? [
+ drop stop-pump
] [
[ '[ _ update-hierarchy ] ignore-errors ] [ pump-step ] bi
pump-loop
diff --git a/basis/io/monitors/windows/nt/nt.factor b/basis/io/monitors/windows/nt/nt.factor
index 9cd8bc4df8..4d061cbb1a 100644
--- a/basis/io/monitors/windows/nt/nt.factor
+++ b/basis/io/monitors/windows/nt/nt.factor
@@ -100,4 +100,4 @@ M:: winnt (monitor) ( path recursive? mailbox -- monitor )
] with-destructors ;
M: win32-monitor dispose
- port>> dispose ;
+ [ port>> dispose ] [ call-next-method ] bi ;
diff --git a/basis/io/monitors/windows/nt/platforms.txt b/basis/io/monitors/windows/nt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/io/monitors/windows/nt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/io/monitors/windows/nt/tags.txt b/basis/io/monitors/windows/nt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/monitors/windows/nt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/pipes/unix/platforms.txt b/basis/io/pipes/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/pipes/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/pipes/unix/tags.txt b/basis/io/pipes/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/pipes/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/pipes/windows/nt/platforms.txt b/basis/io/pipes/windows/nt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/io/pipes/windows/nt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/io/pipes/windows/nt/tags.txt b/basis/io/pipes/windows/nt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/pipes/windows/nt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/ports/ports-tests.factor b/basis/io/ports/ports-tests.factor
new file mode 100644
index 0000000000..c7af6909e1
--- /dev/null
+++ b/basis/io/ports/ports-tests.factor
@@ -0,0 +1,25 @@
+USING: destructors io io.directories io.encodings.binary
+io.files io.files.temp kernel libc math sequences
+specialized-arrays.instances.alien.c-types.int tools.test ;
+IN: io.ports.tests
+
+! Make sure that writing malloced storage to a file works, and
+! also make sure that writes larger than the buffer size work
+
+[ ] [
+ "test.txt" temp-file binary [
+ [
+ 100,000 iota
+ 0
+ 100,000 malloc-int-array &free [ copy ] keep write
+ ] with-destructors
+ ] with-file-writer
+] unit-test
+
+[ t ] [
+ "test.txt" temp-file binary [
+ 100,000 4 * read byte-array>int-array 100,000 iota sequence=
+ ] with-file-reader
+] unit-test
+
+[ ] [ "test.txt" temp-file delete-file ] unit-test
diff --git a/basis/io/ports/ports.factor b/basis/io/ports/ports.factor
index 727d69adf8..0927e7e480 100644
--- a/basis/io/ports/ports.factor
+++ b/basis/io/ports/ports.factor
@@ -1,10 +1,11 @@
-! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman
+! Copyright (C) 2005, 2010 Slava Pestov, Doug Coleman
! See http://factorcode.org/license.txt for BSD license.
USING: math kernel io sequences io.buffers io.timeouts generic
byte-vectors system io.encodings math.order io.backend
-continuations classes byte-arrays namespaces splitting
-grouping dlists assocs io.encodings.binary summary accessors
-destructors combinators ;
+continuations classes byte-arrays namespaces splitting grouping
+dlists alien alien.c-types assocs io.encodings.binary summary
+accessors destructors combinators fry specialized-arrays ;
+SPECIALIZED-ARRAY: uchar
IN: io.ports
SYMBOL: default-buffer-size
@@ -111,14 +112,17 @@ M: output-port stream-write1
1 over wait-to-write
buffer>> byte>buffer ; inline
+: write-in-groups ( byte-array port -- )
+ [ binary-object ] dip
+ [ buffer>> size>> ] [ '[ _ stream-write ] ] bi
+ each ;
+
M: output-port stream-write
dup check-disposed
- over length over buffer>> size>> > [
- [ buffer>> size>> ]
- [ [ stream-write ] curry ] bi
- each
+ 2dup [ byte-length ] [ buffer>> size>> ] bi* > [
+ write-in-groups
] [
- [ [ length ] dip wait-to-write ]
+ [ [ byte-length ] dip wait-to-write ]
[ buffer>> >buffer ] 2bi
] if ;
diff --git a/basis/io/sockets/secure/unix/platforms.txt b/basis/io/sockets/secure/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/sockets/secure/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/sockets/secure/unix/tags.txt b/basis/io/sockets/secure/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/sockets/secure/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/sockets/sockets.factor b/basis/io/sockets/sockets.factor
index 59d12f95bc..a1260e80be 100644
--- a/basis/io/sockets/sockets.factor
+++ b/basis/io/sockets/sockets.factor
@@ -241,7 +241,7 @@ HOOK: (send) io-backend ( packet addrspec datagram -- )
parse-sockaddr ;
: parse-addrinfo-list ( addrinfo -- seq )
- [ next>> dup [ addrinfo memory>struct ] when ] follow
+ [ next>> ] follow
[ addrinfo>addrspec ] map
sift ;
diff --git a/basis/io/sockets/unix/platforms.txt b/basis/io/sockets/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/io/sockets/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/io/sockets/unix/tags.txt b/basis/io/sockets/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/sockets/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/sockets/windows/nt/nt.factor b/basis/io/sockets/windows/nt/nt.factor
index 0dd85954ac..8eb2df5b46 100644
--- a/basis/io/sockets/windows/nt/nt.factor
+++ b/basis/io/sockets/windows/nt/nt.factor
@@ -55,8 +55,8 @@ TUPLE: ConnectEx-args port
[ lpOverlapped>> ]
[ ptr>> ]
} cleave
- "int"
- { "SOCKET" "sockaddr_in*" "int" "PVOID" "DWORD" "LPDWORD" "void*" }
+ int
+ { SOCKET void* int PVOID DWORD LPDWORD void* }
"stdcall" alien-indirect drop
winsock-error-string [ throw ] when* ; inline
diff --git a/basis/io/sockets/windows/nt/platforms.txt b/basis/io/sockets/windows/nt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/io/sockets/windows/nt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/io/sockets/windows/nt/tags.txt b/basis/io/sockets/windows/nt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/sockets/windows/nt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/io/sockets/windows/platforms.txt b/basis/io/sockets/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/io/sockets/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/io/sockets/windows/tags.txt b/basis/io/sockets/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/io/sockets/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/iokit/hid/hid.factor b/basis/iokit/hid/hid.factor
index ca339a78ef..a2ac0d5e6f 100644
--- a/basis/iokit/hid/hid.factor
+++ b/basis/iokit/hid/hid.factor
@@ -162,10 +162,10 @@ FUNCTION: IOReturn IOHIDDeviceGetValue ( IOHIDDeviceRef device, IOHIDElementRef
FUNCTION: IOReturn IOHIDDeviceCopyValueMultiple ( IOHIDDeviceRef device, CFArrayRef elements, CFDictionaryRef* pMultiple ) ;
FUNCTION: IOReturn IOHIDDeviceGetValueWithCallback ( IOHIDDeviceRef device, IOHIDElementRef element, IOHIDValueRef* pValue, CFTimeInterval timeout, IOHIDValueCallback callback, void* context ) ;
FUNCTION: IOReturn IOHIDDeviceCopyValueMultipleWithCallback ( IOHIDDeviceRef device, CFArrayRef elements, CFDictionaryRef* pMultiple, CFTimeInterval timeout, IOHIDValueMultipleCallback callback, void* context ) ;
-FUNCTION: IOReturn IOHIDDeviceSetReport ( IOHIDDeviceRef device, IOHIDReportType reportType, CFIndex reportID, uchar* report, CFIndex reportLength ) ;
-FUNCTION: IOReturn IOHIDDeviceSetReportWithCallback ( IOHIDDeviceRef device, IOHIDReportType reportType, CFIndex reportID, uchar* report, CFIndex reportLength, CFTimeInterval timeout, IOHIDReportCallback callback, void* context ) ;
-FUNCTION: IOReturn IOHIDDeviceGetReport ( IOHIDDeviceRef device, IOHIDReportType reportType, CFIndex reportID, uchar* report, CFIndex* pReportLength ) ;
-FUNCTION: IOReturn IOHIDDeviceGetReportWithCallback ( IOHIDDeviceRef device, IOHIDReportType reportType, CFIndex reportID, uchar* report, CFIndex* pReportLength, CFTimeInterval timeout, IOHIDReportCallback callback, void* context ) ;
+FUNCTION: IOReturn IOHIDDeviceSetReport ( IOHIDDeviceRef device, IOHIDReportType reportType, CFIndex reportID, char* report, CFIndex reportLength ) ;
+FUNCTION: IOReturn IOHIDDeviceSetReportWithCallback ( IOHIDDeviceRef device, IOHIDReportType reportType, CFIndex reportID, char* report, CFIndex reportLength, CFTimeInterval timeout, IOHIDReportCallback callback, void* context ) ;
+FUNCTION: IOReturn IOHIDDeviceGetReport ( IOHIDDeviceRef device, IOHIDReportType reportType, CFIndex reportID, char* report, CFIndex* pReportLength ) ;
+FUNCTION: IOReturn IOHIDDeviceGetReportWithCallback ( IOHIDDeviceRef device, IOHIDReportType reportType, CFIndex reportID, char* report, CFIndex* pReportLength, CFTimeInterval timeout, IOHIDReportCallback callback, void* context ) ;
! IOHIDManager
@@ -226,8 +226,8 @@ FUNCTION: Boolean IOHIDElementSetProperty ( IOHIDElementRef element, CFStringRef
FUNCTION: CFTypeID IOHIDValueGetTypeID ( ) ;
FUNCTION: IOHIDValueRef IOHIDValueCreateWithIntegerValue ( CFAllocatorRef allocator, IOHIDElementRef element, ulonglong timeStamp, CFIndex value ) ;
-FUNCTION: IOHIDValueRef IOHIDValueCreateWithBytes ( CFAllocatorRef allocator, IOHIDElementRef element, ulonglong timeStamp, uchar* bytes, CFIndex length ) ;
-FUNCTION: IOHIDValueRef IOHIDValueCreateWithBytesNoCopy ( CFAllocatorRef allocator, IOHIDElementRef element, ulonglong timeStamp, uchar* bytes, CFIndex length ) ;
+FUNCTION: IOHIDValueRef IOHIDValueCreateWithBytes ( CFAllocatorRef allocator, IOHIDElementRef element, ulonglong timeStamp, c-string bytes, CFIndex length ) ;
+FUNCTION: IOHIDValueRef IOHIDValueCreateWithBytesNoCopy ( CFAllocatorRef allocator, IOHIDElementRef element, ulonglong timeStamp, c-string bytes, CFIndex length ) ;
FUNCTION: IOHIDElementRef IOHIDValueGetElement ( IOHIDValueRef value ) ;
FUNCTION: ulonglong IOHIDValueGetTimeStamp ( IOHIDValueRef value ) ;
FUNCTION: CFIndex IOHIDValueGetLength ( IOHIDValueRef value ) ;
diff --git a/basis/iokit/hid/platforms.txt b/basis/iokit/hid/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/iokit/hid/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/iokit/hid/tags.txt b/basis/iokit/hid/tags.txt
index bf2a35f15b..bb863cf9a0 100755
--- a/basis/iokit/hid/tags.txt
+++ b/basis/iokit/hid/tags.txt
@@ -1,2 +1 @@
bindings
-unportable
diff --git a/basis/iokit/iokit.factor b/basis/iokit/iokit.factor
index 2b31e5c8a8..577c9e1273 100644
--- a/basis/iokit/iokit.factor
+++ b/basis/iokit/iokit.factor
@@ -104,9 +104,9 @@ CONSTANT: KERN_SUCCESS 0
FUNCTION: IOReturn IOMasterPort ( mach_port_t bootstrap, mach_port_t* master ) ;
-FUNCTION: CFDictionaryRef IOServiceMatching ( char* name ) ;
-FUNCTION: CFDictionaryRef IOServiceNameMatching ( char* name ) ;
-FUNCTION: CFDictionaryRef IOBSDNameMatching ( char* name ) ;
+FUNCTION: CFDictionaryRef IOServiceMatching ( c-string name ) ;
+FUNCTION: CFDictionaryRef IOServiceNameMatching ( c-string name ) ;
+FUNCTION: CFDictionaryRef IOBSDNameMatching ( c-string name ) ;
FUNCTION: IOReturn IOObjectRetain ( io_object_t o ) ;
FUNCTION: IOReturn IOObjectRelease ( io_object_t o ) ;
@@ -121,7 +121,7 @@ FUNCTION: IOReturn IORegistryEntryGetPath ( io_registry_entry_t entry, io_name_t
FUNCTION: IOReturn IORegistryEntryCreateCFProperties ( io_registry_entry_t entry, CFMutableDictionaryRef properties, CFAllocatorRef allocator, IOOptionBits options ) ;
-FUNCTION: char* mach_error_string ( IOReturn error ) ;
+FUNCTION: c-string mach_error_string ( IOReturn error ) ;
TUPLE: mach-error error-code error-string ;
: ( code -- error )
diff --git a/basis/iokit/platforms.txt b/basis/iokit/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/iokit/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/iokit/tags.txt b/basis/iokit/tags.txt
index bf2a35f15b..bb863cf9a0 100755
--- a/basis/iokit/tags.txt
+++ b/basis/iokit/tags.txt
@@ -1,2 +1 @@
bindings
-unportable
diff --git a/basis/libc/libc.factor b/basis/libc/libc.factor
index e935d49748..5f6a808b2e 100644
--- a/basis/libc/libc.factor
+++ b/basis/libc/libc.factor
@@ -96,6 +96,6 @@ PRIVATE>
memcmp 0 = ;
: strlen ( alien -- len )
- size_t "libc" "strlen" { char* } alien-invoke ;
+ size_t "libc" "strlen" { c-string } alien-invoke ;
DESTRUCTOR: free
diff --git a/basis/listener/listener-docs.factor b/basis/listener/listener-docs.factor
index 77bec12c1a..bb014fef62 100644
--- a/basis/listener/listener-docs.factor
+++ b/basis/listener/listener-docs.factor
@@ -1,8 +1,9 @@
-USING: help.markup help.syntax kernel io system prettyprint continuations quotations ;
+USING: help.markup help.syntax kernel io system prettyprint
+continuations quotations vocabs.loader parser ;
IN: listener
ARTICLE: "listener-watch" "Watching variables in the listener"
-"The listener prints the concepts of the data and retain stacks after every expression. It can also print values of dynamic variables which are added to a watch list:"
+"The listener prints values of dynamic variables which are added to a watch list:"
{ $subsections visible-vars }
"To add or remove a single variable:"
{ $subsections
@@ -14,7 +15,7 @@ ARTICLE: "listener-watch" "Watching variables in the listener"
show-vars
hide-vars
}
-"Hiding all visible variables:"
+"Clearing the watch list:"
{ $subsections hide-all-vars } ;
HELP: only-use-vocabs
@@ -46,21 +47,33 @@ HELP: hide-all-vars
{ $description "Removes all variables from the watch list." } ;
ARTICLE: "listener" "The listener"
-"The listener evaluates Factor expressions read from a stream. The listener is the primary interface to the Factor runtime. Typically, you write Factor code in a text editor, then load it using the listener and test it."
+"The listener evaluates Factor expressions read from the input stream. Typically, you write Factor code in a text editor, load it from the listener by calling " { $link require } ", " { $link reload } " or " { $link run-file } ", and then test it from interactively."
$nl
"The classical first program can be run in the listener:"
{ $example "\"Hello, world\" print" "Hello, world" }
+"New words can also be defined in the listener:"
+{ $example
+ "USE: math.functions"
+ ": twice ( word -- ) [ execute ] [ execute ] bi ; inline"
+ "81 \\ sqrt twice ."
+ "3.0"
+}
"Multi-line expressions are supported:"
{ $example "{ 1 2 3 } [\n .\n] each" "1\n2\n3" }
-"The listener knows when to expect more input by looking at the height of the stack. Parsing words such as " { $link POSTPONE: { } " leave elements on the parser stack, and corresponding words such as " { $link POSTPONE: } } " pop them."
+"The listener will display the current contents of the datastack after every line of input."
$nl
-"The listener will display the current contents of the datastack after every expression is evaluated. The listener can additionally watch dynamic variables:"
+"The listener can watch dynamic variables:"
{ $subsections "listener-watch" }
-"To start a nested listener:"
+"Nested listeners can be useful for testing code in other dynamic scopes. For example, when doing database maintanance using the " { $vocab-link "db.tuples" } " vocabulary, it can be useful to start a listener with a database connection:"
+{ $code
+ "USING: db db.sqlite listener ;"
+ "\"data.db\" [ listener ] with-db"
+}
+"Starting a nested listener:"
{ $subsections listener }
"To exit a listener, invoke the " { $link return } " word."
$nl
-"Multi-line quotations can be read independently of the rest of the listener:"
+"The listener's mechanism for reading multi-line expressions from the input stream can be called from user code:"
{ $subsections read-quot } ;
ABOUT: "listener"
diff --git a/basis/lists/lazy/lazy-docs.factor b/basis/lists/lazy/lazy-docs.factor
index 3b23e1186e..201764bd95 100644
--- a/basis/lists/lazy/lazy-docs.factor
+++ b/basis/lists/lazy/lazy-docs.factor
@@ -144,7 +144,7 @@ HELP: lcomp
{ $description "Get the cartesian product of the lists in " { $snippet "list" } " and call " { $snippet "quot" } " call with each element from the cartesian product on the stack, the result of which is returned in the final " { $snippet "list" } "." } ;
HELP: lcomp*
-{ $values { "list" "a list of lists" } { "guards" "a sequence of quotations with stack effect ( seq -- bool )" } { "quot" { $quotation "( seq -- X )" } } { "list" "the resulting list" } { "result" "a list" } }
+{ $values { "list" "a list of lists" } { "guards" "a sequence of quotations with stack effect ( seq -- bool )" } { "quot" { $quotation "( seq -- X )" } } { "result" "a list" } }
{ $description "Get the cartesian product of the lists in " { $snippet "list" } ", filter it by applying each guard quotation to it and call " { $snippet "quot" } " call with each element from the remaining cartesian product items on the stack, the result of which is returned in the final " { $snippet "list" } "." }
{ $examples
{ $code "{ 1 2 3 } >list { 4 5 6 } >list 2list { [ first odd? ] } [ first2 + ] lcomp*" }
diff --git a/basis/macros/macros.factor b/basis/macros/macros.factor
index 91ca2f301c..9137588e6c 100644
--- a/basis/macros/macros.factor
+++ b/basis/macros/macros.factor
@@ -1,8 +1,8 @@
! Copyright (C) 2007, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: parser kernel sequences words effects combinators assocs
-definitions quotations namespaces memoize accessors fry
-compiler.units ;
+USING: parser effects.parser kernel sequences words effects
+combinators assocs definitions quotations namespaces memoize
+accessors fry compiler.units ;
IN: macros
signed ( x n -- y ) 2dup neg 1 + shift 1 = [ 2^ - ] [ drop ] if ;
+: >odd ( m -- n ) 0 set-bit ; foldable
+: >even ( m -- n ) 0 clear-bit ; foldable
+: next-even ( m -- n ) >even 2 + ; foldable
+: next-odd ( m -- n ) dup even? [ 1 + ] [ 2 + ] if ; foldable
+: shift-mod ( m s w -- n ) [ shift ] dip 2^ wrap ; inline
: bitroll ( x s w -- y )
[ wrap ] keep
[ shift-mod ] [ [ - ] keep shift-mod ] 3bi bitor ; inline
-: bitroll-32 ( n s -- n' ) 32 bitroll ; inline
+: bitroll-32 ( m s -- n ) 32 bitroll ; inline
-: bitroll-64 ( n s -- n' ) 64 bitroll ; inline
+: bitroll-64 ( m s -- n ) 64 bitroll ; inline
! 32-bit arithmetic
-: w+ ( int int -- int ) + 32 bits ; inline
-: w- ( int int -- int ) - 32 bits ; inline
-: w* ( int int -- int ) * 32 bits ; inline
+: w+ ( x y -- z ) + 32 bits ; inline
+: w- ( x y -- z ) - 32 bits ; inline
+: w* ( x y -- z ) * 32 bits ; inline
! 64-bit arithmetic
-: W+ ( int int -- int ) + 64 bits ; inline
-: W- ( int int -- int ) - 64 bits ; inline
-: W* ( int int -- int ) * 64 bits ; inline
+: W+ ( x y -- z ) + 64 bits ; inline
+: W- ( x y -- z ) - 64 bits ; inline
+: W* ( x y -- z ) * 64 bits ; inline
! flags
MACRO: flags ( values -- )
@@ -114,19 +117,7 @@ M: byte-array bit-count
byte-array-bit-count ;
M: object bit-count
- [ >c-ptr ] [ byte-length ] bi
- byte-array-bit-count ;
-
-: >signed ( x n -- y )
- 2dup neg 1 + shift 1 = [ 2^ - ] [ drop ] if ;
-
-: >odd ( n -- int ) 0 set-bit ; foldable
-
-: >even ( n -- int ) 0 clear-bit ; foldable
-
-: next-even ( m -- n ) >even 2 + ; foldable
-
-: next-odd ( m -- n ) dup even? [ 1 + ] [ 2 + ] if ; foldable
+ binary-object byte-array-bit-count ;
: even-parity? ( obj -- ? ) bit-count even? ;
diff --git a/basis/math/blas/config/config-docs.factor b/basis/math/blas/config/config-docs.factor
index 5c6cef83b8..826f26c646 100644
--- a/basis/math/blas/config/config-docs.factor
+++ b/basis/math/blas/config/config-docs.factor
@@ -6,20 +6,25 @@ ARTICLE: "math.blas.config" "Configuring the BLAS interface"
{ $subsections
blas-library
blas-fortran-abi
+ deploy-blas?
}
"The interface attempts to set default values based on the ones encountered on the Factor project's build machines. If these settings don't work with your system's BLAS, or you wish to use a commercial BLAS, you may change the global values of those variables in your " { $link "factor-rc" } ". For example, to use AMD's ACML library on Windows with " { $snippet "math.blas" } ", your " { $snippet "factor-rc" } " would look like this:"
{ $code """
USING: math.blas.config namespaces ;
"X:\\path\\to\\acml.dll" blas-library set-global
intel-windows-abi blas-fortran-abi set-global
+t deploy-blas? set-global
""" }
"To take effect, the " { $snippet "blas-library" } " and " { $snippet "blas-fortran-abi" } " variables must be set before any other " { $snippet "math.blas" } " vocabularies are loaded."
;
HELP: blas-library
-{ $description "The name of the shared library containing the BLAS interface to load. The value of this variable must be a valid shared library name that can be passed to " { $link add-fortran-library } ". To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ;
+{ $var-description "The name of the shared library containing the BLAS interface to load. The value of this variable must be a valid shared library name that can be passed to " { $link add-fortran-library } ". To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ;
HELP: blas-fortran-abi
-{ $description "The Fortran ABI used by the BLAS interface specified in the " { $link blas-library } " variable. The value of " { $snippet "blas-fortran-abi" } " must be one of the " { $link "alien.fortran-abis" } " that can be passed to " { $link add-fortran-library } ". To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ;
+{ $var-description "The Fortran ABI used by the BLAS interface specified in the " { $link blas-library } " variable. The value of " { $snippet "blas-fortran-abi" } " must be one of the " { $link "alien.fortran-abis" } " that can be passed to " { $link add-fortran-library } ". To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ;
+
+HELP: deploy-blas?
+{ $var-description "If set to a true value, the BLAS library will be configured to deploy with applications that use it. To take effect, this variable must be set before any other " { $snippet "math.blas" } " vocabularies are loaded. See " { $link "math.blas.config" } " for details and examples." } ;
ABOUT: "math.blas.config"
diff --git a/basis/math/blas/config/config.factor b/basis/math/blas/config/config.factor
index bce6e663af..76524d80ee 100644
--- a/basis/math/blas/config/config.factor
+++ b/basis/math/blas/config/config.factor
@@ -1,7 +1,7 @@
USING: alien.fortran combinators kernel namespaces system ;
IN: math.blas.config
-SYMBOLS: blas-library blas-fortran-abi ;
+SYMBOLS: blas-library blas-fortran-abi deploy-blas? ;
blas-library [
{
@@ -21,3 +21,5 @@ blas-fortran-abi [
[ f2c-abi ]
} cond
] initialize
+
+deploy-blas? [ os macosx? not ] initialize
diff --git a/basis/math/blas/ffi/ffi.factor b/basis/math/blas/ffi/ffi.factor
index b7748f500f..5cc6a18b6d 100644
--- a/basis/math/blas/ffi/ffi.factor
+++ b/basis/math/blas/ffi/ffi.factor
@@ -1,9 +1,12 @@
USING: alien.fortran kernel math.blas.config namespaces ;
+FROM: alien.libraries => deploy-library ;
IN: math.blas.ffi
<<
"blas" blas-library blas-fortran-abi [ get ] bi@
add-fortran-library
+
+deploy-blas? get [ "blas" deploy-library ] when
>>
LIBRARY: blas
diff --git a/basis/math/blas/matrices/matrices.factor b/basis/math/blas/matrices/matrices.factor
index 0a6fc147ad..22c649c544 100644
--- a/basis/math/blas/matrices/matrices.factor
+++ b/basis/math/blas/matrices/matrices.factor
@@ -305,10 +305,10 @@ M: MATRIX pprint-delims
: define-complex-blas-matrix ( TYPE T -- )
"U" "C" (define-blas-matrix) ;
-"float" "S" define-real-blas-matrix
-"double" "D" define-real-blas-matrix
-"complex-float" "C" define-complex-blas-matrix
-"complex-double" "Z" define-complex-blas-matrix
+float "S" define-real-blas-matrix
+double "D" define-real-blas-matrix
+complex-float "C" define-complex-blas-matrix
+complex-double "Z" define-complex-blas-matrix
>>
diff --git a/basis/math/blas/vectors/vectors.factor b/basis/math/blas/vectors/vectors.factor
index 083400224e..caf0984aa4 100644
--- a/basis/math/blas/vectors/vectors.factor
+++ b/basis/math/blas/vectors/vectors.factor
@@ -238,10 +238,10 @@ M: VECTOR Vasum
[ drop (define-blas-vector) ]
[ (define-complex-blas-vector) ] 3bi ;
-"float" "S" define-real-blas-vector
-"double" "D" define-real-blas-vector
-"complex-float" "C" "S" define-complex-blas-vector
-"complex-double" "Z" "D" define-complex-blas-vector
+float "S" define-real-blas-vector
+double "D" define-real-blas-vector
+complex-float "C" "S" define-complex-blas-vector
+complex-double "Z" "D" define-complex-blas-vector
>>
diff --git a/basis/math/combinatorics/combinatorics-docs.factor b/basis/math/combinatorics/combinatorics-docs.factor
index ec3cd6ee76..0a2a0d4011 100644
--- a/basis/math/combinatorics/combinatorics-docs.factor
+++ b/basis/math/combinatorics/combinatorics-docs.factor
@@ -26,7 +26,7 @@ HELP: nCk
} ;
HELP: permutation
-{ $values { "n" "a non-negative integer" } { "seq" sequence } { "seq" sequence } }
+{ $values { "n" "a non-negative integer" } { "seq" sequence } { "seq'" sequence } }
{ $description "Outputs the " { $snippet "nth" } " lexicographical permutation of " { $snippet "seq" } "." }
{ $notes "Permutations are 0-based and a bounds error will be thrown if " { $snippet "n" } " is larger than " { $snippet "seq length factorial 1 -" } "." }
{ $examples
@@ -37,7 +37,7 @@ HELP: permutation
} ;
HELP: all-permutations
-{ $values { "seq" sequence } { "seq" sequence } }
+{ $values { "seq" sequence } { "seq'" sequence } }
{ $description "Outputs a sequence containing all permutations of " { $snippet "seq" } " in lexicographical order." }
{ $examples
{ $example "USING: math.combinatorics prettyprint ;"
@@ -60,7 +60,7 @@ HELP: inverse-permutation
} ;
HELP: combination
-{ $values { "m" "a non-negative integer" } { "seq" sequence } { "k" "a non-negative integer" } { "seq" sequence } }
+{ $values { "m" "a non-negative integer" } { "seq" sequence } { "k" "a non-negative integer" } { "seq'" sequence } }
{ $description "Outputs the " { $snippet "mth" } " lexicographical combination of " { $snippet "seq" } " choosing " { $snippet "k" } " elements." }
{ $notes "Combinations are 0-based and a bounds error will be thrown if " { $snippet "m" } " is larger than " { $snippet "seq length k nCk" } "." }
{ $examples
@@ -71,7 +71,7 @@ HELP: combination
} ;
HELP: all-combinations
-{ $values { "seq" sequence } { "k" "a non-negative integer" } { "seq" sequence } }
+{ $values { "seq" sequence } { "k" "a non-negative integer" } { "seq'" sequence } }
{ $description "Outputs a sequence containing all combinations of " { $snippet "seq" } " choosing " { $snippet "k" } " elements, in lexicographical order." }
{ $examples
{ $example "USING: math.combinatorics prettyprint ;"
diff --git a/basis/math/combinatorics/combinatorics.factor b/basis/math/combinatorics/combinatorics.factor
index 7c68aede09..5a9f627015 100644
--- a/basis/math/combinatorics/combinatorics.factor
+++ b/basis/math/combinatorics/combinatorics.factor
@@ -42,10 +42,10 @@ PRIVATE>
PRIVATE>
-: permutation ( n seq -- seq )
+: permutation ( n seq -- seq' )
[ permutation-indices ] keep nths ;
-: all-permutations ( seq -- seq )
+: all-permutations ( seq -- seq' )
[ length factorial iota ] keep
'[ _ permutation ] map ;
@@ -118,10 +118,10 @@ PRIVATE>
: map>assoc-combinations ( seq k quot exemplar -- )
[ combinations-quot ] dip map>assoc ; inline
-: combination ( m seq k -- seq )
+: combination ( m seq k -- seq' )
apply-combination ;
-: all-combinations ( seq k -- seq )
+: all-combinations ( seq k -- seq' )
[ ] combinations-quot map ;
: reduce-combinations ( seq k identity quot -- result )
diff --git a/basis/math/floats/env/ppc/tags.txt b/basis/math/floats/env/ppc/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/math/floats/env/ppc/tags.txt
+++ b/basis/math/floats/env/ppc/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/math/floats/env/x86/32/tags.txt b/basis/math/floats/env/x86/32/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/math/floats/env/x86/32/tags.txt
+++ b/basis/math/floats/env/x86/32/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/math/floats/env/x86/64/tags.txt b/basis/math/floats/env/x86/64/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/math/floats/env/x86/64/tags.txt
+++ b/basis/math/floats/env/x86/64/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/math/floats/env/x86/tags.txt b/basis/math/floats/env/x86/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/math/floats/env/x86/tags.txt
+++ b/basis/math/floats/env/x86/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/math/matrices/matrices-tests.factor b/basis/math/matrices/matrices-tests.factor
index 3ee1ddbd6d..b827741209 100644
--- a/basis/math/matrices/matrices-tests.factor
+++ b/basis/math/matrices/matrices-tests.factor
@@ -99,14 +99,12 @@ USING: math.matrices math.vectors tools.test math ;
m.
] unit-test
-[ { 0 0 -1 } ] [ { 1 0 0 } { 0 1 0 } cross ] unit-test
+[ { 0 0 1 } ] [ { 1 0 0 } { 0 1 0 } cross ] unit-test
[ { 1 0 0 } ] [ { 0 1 0 } { 0 0 1 } cross ] unit-test
[ { 0 1 0 } ] [ { 0 0 1 } { 1 0 0 } cross ] unit-test
+[ { 0.0 -0.707 0.707 } ] [ { 1.0 0.0 0.0 } { 0.0 0.707 0.707 } cross ] unit-test
[ { 1 0 0 } ] [ { 1 1 0 } { 1 0 0 } proj ] unit-test
-[ { { { 1 "a" } { 1 "b" } } { { 2 "a" } { 2 "b" } } } ]
-[ { 1 2 } { "a" "b" } cross-zip ] unit-test
-
[ { { 4181 6765 } { 6765 10946 } } ]
[ { { 0 1 } { 1 1 } } 20 m^n ] unit-test
diff --git a/basis/math/matrices/matrices.factor b/basis/math/matrices/matrices.factor
index bf14d7ba13..216d2c31bb 100644
--- a/basis/math/matrices/matrices.factor
+++ b/basis/math/matrices/matrices.factor
@@ -11,7 +11,7 @@ IN: math.matrices
: identity-matrix ( n -- matrix )
#! Make a nxn identity matrix.
- iota dup [ [ = 1 0 ? ] with map ] curry map ;
+ iota dup [ = 1 0 ? ] cartesian-map ;
:: rotation-matrix3 ( axis theta -- matrix )
theta cos :> c
@@ -111,12 +111,18 @@ IN: math.matrices
: mnorm ( m -- n ) dup mmax abs m/n ;
: cross ( vec1 vec2 -- vec3 )
- [ [ { 1 2 1 } vshuffle ] [ { 2 0 0 } vshuffle ] bi* v* ]
- [ [ { 2 0 0 } vshuffle ] [ { 1 2 1 } vshuffle ] bi* v* ] 2bi v- ; inline
+ [ [ { 1 2 0 } vshuffle ] [ { 2 0 1 } vshuffle ] bi* v* ]
+ [ [ { 2 0 1 } vshuffle ] [ { 1 2 0 } vshuffle ] bi* v* ] 2bi v- ; inline
: proj ( v u -- w )
[ [ v. ] [ norm-sq ] bi / ] keep n*v ;
+: perp ( v u -- w )
+ dupd proj v- ;
+
+: angle-between ( v u -- a )
+ [ normalize ] bi@ v. acos ;
+
: (gram-schmidt) ( v seq -- newseq )
[ dupd proj v- ] each ;
@@ -126,9 +132,6 @@ IN: math.matrices
: norm-gram-schmidt ( seq -- orthonormal )
gram-schmidt [ normalize ] map ;
-: cross-zip ( seq1 seq2 -- seq1xseq2 )
- [ [ 2array ] with map ] curry map ;
-
: m^n ( m n -- n )
make-bits over first length identity-matrix
[ [ dupd m. ] when [ dup m. ] dip ] reduce nip ;
diff --git a/basis/math/polynomials/polynomials-docs.factor b/basis/math/polynomials/polynomials-docs.factor
index 9c16bf8a7e..3b8885cc88 100644
--- a/basis/math/polynomials/polynomials-docs.factor
+++ b/basis/math/polynomials/polynomials-docs.factor
@@ -36,12 +36,12 @@ HELP: p=
{ $examples { $example "USING: math.polynomials prettyprint ;" "{ 0 1 } { 0 1 0 } p= ." "t" } } ;
HELP: ptrim
-{ $values { "p" "a polynomial" } { "p" "a polynomial" } }
+{ $values { "p" "a polynomial" } { "q" "a polynomial" } }
{ $description "Trims excess zeros from a polynomial." }
{ $examples { $example "USING: math.polynomials prettyprint ;" "{ 0 1 0 0 } ptrim ." "{ 0 1 }" } } ;
HELP: 2ptrim
-{ $values { "p" "a polynomial" } { "q" "a polynomial" } { "p" "a polynomial" } { "q" "a polynomial" } }
+{ $values { "p" "a polynomial" } { "q" "a polynomial" } { "p'" "a polynomial" } { "q'" "a polynomial" } }
{ $description "Trims excess zeros from two polynomials." }
{ $examples { $example "USING: kernel math.polynomials prettyprint ;" "{ 0 1 0 0 } { 1 0 0 } 2ptrim [ . ] bi@" "{ 0 1 }\n{ 1 }" } } ;
@@ -61,7 +61,7 @@ HELP: n*p
{ $examples { $example "USING: math.polynomials prettyprint ;" "4 { 3 0 1 } n*p ." "{ 12 0 4 }" } } ;
HELP: pextend-conv
-{ $values { "p" "a polynomial" } { "q" "a polynomial" } { "p" "a polynomial" } { "q" "a polynomial" } }
+{ $values { "p" "a polynomial" } { "q" "a polynomial" } { "p'" "a polynomial" } { "q'" "a polynomial" } }
{ $description "Convulution, extending to " { $snippet "p_m + q_n - 1" } "." }
{ $examples { $example "USING: kernel math.polynomials prettyprint ;" "{ 1 0 1 } { 0 1 } pextend-conv [ . ] bi@" "V{ 1 0 1 0 }\nV{ 0 1 0 0 }" } } ;
diff --git a/basis/math/polynomials/polynomials.factor b/basis/math/polynomials/polynomials.factor
index b994410283..31152016ea 100644
--- a/basis/math/polynomials/polynomials.factor
+++ b/basis/math/polynomials/polynomials.factor
@@ -20,15 +20,15 @@ PRIVATE>
: p= ( p q -- ? ) pextend = ;
-: ptrim ( p -- p )
+: ptrim ( p -- q )
dup length 1 = [ [ zero? ] trim-tail ] unless ;
-: 2ptrim ( p q -- p q ) [ ptrim ] bi@ ;
+: 2ptrim ( p q -- p' q' ) [ ptrim ] bi@ ;
: p+ ( p q -- r ) pextend v+ ;
: p- ( p q -- r ) pextend v- ;
: n*p ( n p -- n*p ) n*v ;
-: pextend-conv ( p q -- p q )
+: pextend-conv ( p q -- p' q' )
2dup [ length ] bi@ + 1 - 2pad-tail [ >vector ] bi@ ;
: p* ( p q -- r )
diff --git a/basis/math/quaternions/quaternions-docs.factor b/basis/math/quaternions/quaternions-docs.factor
index 1a381c6287..d3bead7dea 100644
--- a/basis/math/quaternions/quaternions-docs.factor
+++ b/basis/math/quaternions/quaternions-docs.factor
@@ -30,7 +30,7 @@ HELP: q/
{ $examples { $example "USING: math.quaternions prettyprint ;" "{ 0 0 0 1 } { 0 0 1 0 } q/ ." "{ 0 1 0 0 }" } } ;
HELP: q*n
-{ $values { "q" "a quaternion" } { "n" real } { "q" "a quaternion" } }
+{ $values { "q" "a quaternion" } { "n" real } { "r" "a quaternion" } }
{ $description "Multiplies each element of " { $snippet "q" } " by real value " { $snippet "n" } "." }
{ $notes "To multiply a quaternion with a complex value, use " { $link c>q } " " { $link q* } "." } ;
diff --git a/basis/math/quaternions/quaternions.factor b/basis/math/quaternions/quaternions.factor
index e659cf5f61..4173507e6c 100644
--- a/basis/math/quaternions/quaternions.factor
+++ b/basis/math/quaternions/quaternions.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2005, 2007 Slava Pestov.
+! Copyright (C) 2005, 2010 Joe Groff, Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays combinators kernel locals math math.functions
math.libm math.order math.vectors sequences ;
@@ -35,10 +35,10 @@ M: object qconjugate ( u -- u' )
: q/ ( u v -- u/v )
qrecip q* ; inline
-: n*q ( q n -- q )
+: n*q ( q n -- r )
v*n ; inline
-: q*n ( q n -- q )
+: q*n ( q n -- r )
v*n ; inline
: n>q ( n -- q )
diff --git a/basis/math/statistics/statistics-docs.factor b/basis/math/statistics/statistics-docs.factor
index 6fa7d79f77..f7d108dddb 100644
--- a/basis/math/statistics/statistics-docs.factor
+++ b/basis/math/statistics/statistics-docs.factor
@@ -87,7 +87,6 @@ HELP: histogram
HELP: histogram!
{ $values
{ "hashtable" hashtable } { "seq" sequence }
- { "hashtable" hashtable }
}
{ $examples
{ $example "! Count the number of times the elements of two sequences appear."
@@ -128,7 +127,6 @@ HELP: sequence>assoc
HELP: sequence>assoc!
{ $values
{ "assoc" assoc } { "seq" sequence } { "quot" quotation }
- { "assoc" assoc }
}
{ $examples
{ $example "! Iterate over a sequence and add the counts to an existing assoc"
diff --git a/basis/math/vectors/conversion/conversion.factor b/basis/math/vectors/conversion/conversion.factor
index 6148962ee0..9d60dd03d4 100644
--- a/basis/math/vectors/conversion/conversion.factor
+++ b/basis/math/vectors/conversion/conversion.factor
@@ -1,10 +1,10 @@
! (c)Joe Groff bsd license
-USING: accessors alien.c-types arrays assocs classes combinators
-combinators.short-circuit fry kernel locals math
-math.vectors math.vectors.simd math.vectors.simd.intrinsics sequences ;
+USING: accessors alien arrays assocs classes combinators
+combinators.short-circuit fry kernel locals math math.vectors
+math.vectors.simd math.vectors.simd.intrinsics sequences ;
FROM: alien.c-types =>
char uchar short ushort int uint longlong ulonglong
- float double ;
+ float double heap-size ;
IN: math.vectors.conversion
ERROR: bad-vconvert from-type to-type ;
diff --git a/basis/math/vectors/simd/simd-docs.factor b/basis/math/vectors/simd/simd-docs.factor
index 540838bdd5..bcc05564fc 100644
--- a/basis/math/vectors/simd/simd-docs.factor
+++ b/basis/math/vectors/simd/simd-docs.factor
@@ -8,7 +8,7 @@ ARTICLE: "math.vectors.simd.intro" "Introduction to SIMD support"
$nl
"SIMD support in the processor takes the form of instruction sets which operate on vector registers. By operating on multiple scalar values at the same time, code which operates on points, colors, and other vector data can be sped up."
$nl
-"In Factor, SIMD support is exposed in the form of special-purpose SIMD " { $link "sequence-protocol" } " implementations. These are fixed-length, homogeneous sequences. They are referred to as vectors, but should not be confused with Factor's " { $link "vectors" } ", which can hold any type of object and can be resized.)."
+"In Factor, SIMD support is exposed in the form of special-purpose SIMD " { $link "sequence-protocol" } " implementations. These are fixed-length, homogeneous sequences. They are referred to as vectors, but should not be confused with Factor's " { $link "vectors" } ", which can hold any type of object and can be resized."
$nl
"The words in the " { $vocab-link "math.vectors" } " vocabulary, which can be used with any sequence of numbers, are special-cased by the compiler. If the compiler can prove that only SIMD vectors are used, it expands " { $link "math-vectors" } " into " { $link "math.vectors.simd.intrinsics" } ". While in the general case, SIMD intrinsics operate on heap-allocated SIMD vectors, that too can be optimized since in many cases the compiler unbox SIMD vectors, storing them directly in registers."
$nl
@@ -36,7 +36,7 @@ $nl
ARTICLE: "math.vectors.simd.types" "SIMD vector types"
"Each SIMD vector type is named " { $snippet "scalar-count" } ", where " { $snippet "scalar" } " is a scalar C type and " { $snippet "count" } " is a vector dimension."
$nl
-"The following vector types are available:"
+"The following 128-bit vector types are defined in the " { $vocab-link "math.vectors.simd" } " vocabulary:"
{ $code
"char-16"
"uchar-16"
@@ -48,6 +48,19 @@ $nl
"ulonglong-2"
"float-4"
"double-2"
+}
+"Double-width 256-bit vector types are defined in the " { $vocab-link "math.vectors.simd.cords" } " vocabulary:"
+{ $code
+ "char-32"
+ "uchar-32"
+ "short-16"
+ "ushort-16"
+ "int-8"
+ "uint-8"
+ "longlong-4"
+ "ulonglong-4"
+ "float-8"
+ "double-4"
} ;
ARTICLE: "math.vectors.simd.words" "SIMD vector words"
@@ -142,7 +155,12 @@ M\\ actor advance optimized."""
"""USE: compiler.tree.debugger
M\\ actor advance test-mr mr.""" }
-"An example of a high-performance algorithm that uses SIMD primitives can be found in the " { $vocab-link "benchmark.nbody-simd" } " vocabulary." ;
+"Example of a high-performance algorithms that use SIMD primitives can be found in the following vocabularies:"
+{ $list
+ { $vocab-link "benchmark.nbody-simd" }
+ { $vocab-link "benchmark.raytracer-simd" }
+ { $vocab-link "random.sfmt" }
+} ;
ARTICLE: "math.vectors.simd.intrinsics" "Low-level SIMD primitives"
"The words in the " { $vocab-link "math.vectors.simd.intrinsics" } " vocabulary are used to implement SIMD support. These words have three disadvantages compared to the higher-level " { $link "math-vectors" } " words:"
diff --git a/basis/math/vectors/simd/simd.factor b/basis/math/vectors/simd/simd.factor
index acf13599c1..8d804247d3 100644
--- a/basis/math/vectors/simd/simd.factor
+++ b/basis/math/vectors/simd/simd.factor
@@ -1,9 +1,9 @@
-USING: accessors alien.c-types arrays byte-arrays classes combinators
+USING: accessors alien arrays byte-arrays classes combinators
cpu.architecture effects fry functors generalizations generic
generic.parser kernel lexer literals macros math math.functions
-math.vectors math.vectors.private math.vectors.simd.intrinsics namespaces parser
-prettyprint.custom quotations sequences sequences.private vocabs
-vocabs.loader words ;
+math.vectors math.vectors.private math.vectors.simd.intrinsics
+namespaces parser prettyprint.custom quotations sequences
+sequences.private vocabs vocabs.loader words ;
QUALIFIED-WITH: alien.c-types c
IN: math.vectors.simd
@@ -107,7 +107,7 @@ PRIVATE>
M: simd-128 hashcode* underlying>> hashcode* ; inline
M: simd-128 clone [ clone ] change-underlying ; inline
-M: simd-128 c:byte-length drop 16 ; inline
+M: simd-128 byte-length drop 16 ; inline
M: simd-128 new-sequence
2dup length =
@@ -243,7 +243,7 @@ A{ DEFINES ${T}{
ELT [ A-rep rep-component-type ]
N [ A-rep rep-length ]
-COERCER [ ELT c-type-class "coercer" word-prop [ ] or ]
+COERCER [ ELT c:c-type-class "coercer" word-prop [ ] or ]
SET-NTH [ ELT dup c:c-setter c:array-accessor ]
@@ -251,7 +251,7 @@ BOA-EFFECT [ N "n" { "v" } ]
WHERE
-TUPLE: A < simd-128 ;
+TUPLE: A < simd-128 ; final
M: A new-underlying drop \ A boa ; inline
M: A simd-rep drop A-rep ; inline
diff --git a/basis/memoize/memoize.factor b/basis/memoize/memoize.factor
index c949c34684..71f9fe1942 100644
--- a/basis/memoize/memoize.factor
+++ b/basis/memoize/memoize.factor
@@ -1,8 +1,8 @@
-! Copyright (C) 2007, 2009 Slava Pestov, Daniel Ehrenberg.
+! Copyright (C) 2007, 2010 Slava Pestov, Daniel Ehrenberg.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel hashtables sequences sequences.private arrays
-words namespaces make parser math assocs effects definitions
-quotations summary accessors fry ;
+words namespaces make parser effects.parser math assocs effects
+definitions quotations summary accessors fry ;
IN: memoize
short ;
IN: opengl.gl
@@ -22,7 +22,9 @@ TYPEDEF: float GLfloat
TYPEDEF: float GLclampf
TYPEDEF: double GLdouble
TYPEDEF: double GLclampd
-TYPEDEF: void* GLvoid*
+C-TYPE: GLvoid
+
+TYPEDEF: c-string[ascii] GLstring
! Constants
@@ -668,7 +670,7 @@ FUNCTION: void glPopClientAttrib ( ) ;
FUNCTION: GLint glRenderMode ( GLenum mode ) ;
FUNCTION: GLenum glGetError ( ) ;
-FUNCTION: char* glGetString ( GLenum name ) ;
+FUNCTION: GLstring glGetString ( GLenum name ) ;
FUNCTION: void glFinish ( ) ;
FUNCTION: void glFlush ( ) ;
FUNCTION: void glHint ( GLenum target, GLenum mode ) ;
@@ -1587,10 +1589,8 @@ CONSTANT: GL_STENCIL_BACK_VALUE_MASK HEX: 8CA4
CONSTANT: GL_STENCIL_BACK_WRITEMASK HEX: 8CA5
ALIAS: GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION
-TYPEDEF: char GLchar
-
GL-FUNCTION: void glAttachShader { glAttachObjectARB } ( GLuint program, GLuint shader ) ;
-GL-FUNCTION: void glBindAttribLocation { glBindAttribLocationARB } ( GLuint program, GLuint index, GLchar* name ) ;
+GL-FUNCTION: void glBindAttribLocation { glBindAttribLocationARB } ( GLuint program, GLuint index, GLstring name ) ;
GL-FUNCTION: void glBlendEquationSeparate { glBlendEquationSeparateEXT } ( GLenum modeRGB, GLenum modeAlpha ) ;
GL-FUNCTION: void glCompileShader { glCompileShaderARB } ( GLuint shader ) ;
GL-FUNCTION: GLuint glCreateProgram { glCreateProgramObjectARB } ( ) ;
@@ -1601,16 +1601,16 @@ GL-FUNCTION: void glDetachShader { glDetachObjectARB } ( GLuint program, GLuint
GL-FUNCTION: void glDisableVertexAttribArray { glDisableVertexAttribArrayARB } ( GLuint index ) ;
GL-FUNCTION: void glDrawBuffers { glDrawBuffersARB glDrawBuffersATI } ( GLsizei n, GLenum* bufs ) ;
GL-FUNCTION: void glEnableVertexAttribArray { glEnableVertexAttribArrayARB } ( GLuint index ) ;
-GL-FUNCTION: void glGetActiveAttrib { glGetActiveAttribARB } ( GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name ) ;
-GL-FUNCTION: void glGetActiveUniform { glGetActiveUniformARB } ( GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name ) ;
+GL-FUNCTION: void glGetActiveAttrib { glGetActiveAttribARB } ( GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLstring name ) ;
+GL-FUNCTION: void glGetActiveUniform { glGetActiveUniformARB } ( GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLstring name ) ;
GL-FUNCTION: void glGetAttachedShaders { glGetAttachedObjectsARB } ( GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders ) ;
-GL-FUNCTION: GLint glGetAttribLocation { glGetAttribLocationARB } ( GLuint program, GLchar* name ) ;
-GL-FUNCTION: void glGetProgramInfoLog { glGetInfoLogARB } ( GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog ) ;
+GL-FUNCTION: GLint glGetAttribLocation { glGetAttribLocationARB } ( GLuint program, GLstring name ) ;
+GL-FUNCTION: void glGetProgramInfoLog { glGetInfoLogARB } ( GLuint program, GLsizei bufSize, GLsizei* length, GLstring infoLog ) ;
GL-FUNCTION: void glGetProgramiv { glGetObjectParameterivARB } ( GLuint program, GLenum pname, GLint* param ) ;
-GL-FUNCTION: void glGetShaderInfoLog { glGetInfoLogARB } ( GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog ) ;
-GL-FUNCTION: void glGetShaderSource { glGetShaderSourceARB } ( GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source ) ;
+GL-FUNCTION: void glGetShaderInfoLog { glGetInfoLogARB } ( GLuint shader, GLsizei bufSize, GLsizei* length, GLstring infoLog ) ;
+GL-FUNCTION: void glGetShaderSource { glGetShaderSourceARB } ( GLint obj, GLsizei maxLength, GLsizei* length, GLstring source ) ;
GL-FUNCTION: void glGetShaderiv { glGetObjectParameterivARB } ( GLuint shader, GLenum pname, GLint* param ) ;
-GL-FUNCTION: GLint glGetUniformLocation { glGetUniformLocationARB } ( GLint programObj, GLchar* name ) ;
+GL-FUNCTION: GLint glGetUniformLocation { glGetUniformLocationARB } ( GLint programObj, GLstring name ) ;
GL-FUNCTION: void glGetUniformfv { glGetUniformfvARB } ( GLuint program, GLint location, GLfloat* params ) ;
GL-FUNCTION: void glGetUniformiv { glGetUniformivARB } ( GLuint program, GLint location, GLint* params ) ;
GL-FUNCTION: void glGetVertexAttribPointerv { glGetVertexAttribPointervARB } ( GLuint index, GLenum pname, GLvoid** pointer ) ;
@@ -1620,7 +1620,7 @@ GL-FUNCTION: void glGetVertexAttribiv { glGetVertexAttribivARB } ( GLuint index,
GL-FUNCTION: GLboolean glIsProgram { glIsProgramARB } ( GLuint program ) ;
GL-FUNCTION: GLboolean glIsShader { glIsShaderARB } ( GLuint shader ) ;
GL-FUNCTION: void glLinkProgram { glLinkProgramARB } ( GLuint program ) ;
-GL-FUNCTION: void glShaderSource { glShaderSourceARB } ( GLuint shader, GLsizei count, GLchar** strings, GLint* lengths ) ;
+GL-FUNCTION: void glShaderSource { glShaderSourceARB } ( GLuint shader, GLsizei count, GLstring* strings, GLint* lengths ) ;
GL-FUNCTION: void glStencilFuncSeparate { glStencilFuncSeparateATI } ( GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask ) ;
GL-FUNCTION: void glStencilMaskSeparate { } ( GLenum face, GLuint mask ) ;
GL-FUNCTION: void glStencilOpSeparate { glStencilOpSeparateATI } ( GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass ) ;
@@ -1991,8 +1991,8 @@ GL-FUNCTION: void glUniform4uiv { glUniform4uivEXT } ( GLint location, GLsizei c
GL-FUNCTION: void glGetUniformuiv { glGetUniformuivEXT } ( GLuint program, GLint location, GLuint* params ) ;
-GL-FUNCTION: void glBindFragDataLocation { glBindFragDataLocationEXT } ( GLuint program, GLuint colorNumber, GLchar* name ) ;
-GL-FUNCTION: GLint glGetFragDataLocation { glGetFragDataLocationEXT } ( GLuint program, GLchar* name ) ;
+GL-FUNCTION: void glBindFragDataLocation { glBindFragDataLocationEXT } ( GLuint program, GLuint colorNumber, GLstring name ) ;
+GL-FUNCTION: GLint glGetFragDataLocation { glGetFragDataLocationEXT } ( GLuint program, GLstring name ) ;
GL-FUNCTION: void glBeginConditionalRender { glBeginConditionalRenderNV } ( GLuint id, GLenum mode ) ;
GL-FUNCTION: void glEndConditionalRender { glEndConditionalRenderNV } ( ) ;
@@ -2061,10 +2061,10 @@ GL-FUNCTION: void glBeginTransformFeedback { glBeginTransformFeedbackEXT } ( GLe
GL-FUNCTION: void glEndTransformFeedback { glEndTransformFeedbackEXT } ( ) ;
GL-FUNCTION: void glTransformFeedbackVaryings { glTransformFeedbackVaryingsEXT } ( GLuint program, GLsizei count,
- GLchar** varyings, GLenum bufferMode ) ;
+ GLstring* varyings, GLenum bufferMode ) ;
GL-FUNCTION: void glGetTransformFeedbackVarying { glGetTransformFeedbackVaryingEXT } ( GLuint program, GLuint index,
GLsizei bufSize, GLsizei* length,
- GLsizei* size, GLenum* type, GLchar* name ) ;
+ GLsizei* size, GLenum* type, GLstring name ) ;
GL-FUNCTION: void glClearBufferiv { } ( GLenum buffer, GLint drawbuffer, GLint* value ) ;
GL-FUNCTION: void glClearBufferuiv { } ( GLenum buffer, GLint drawbuffer, GLuint* value ) ;
@@ -2156,12 +2156,12 @@ GL-FUNCTION: void glDrawElementsInstanced { glDrawElementsInstancedARB } ( GLenu
GL-FUNCTION: void glTexBuffer { glTexBufferEXT } ( GLenum target, GLenum internalformat, GLuint buffer ) ;
GL-FUNCTION: void glPrimitiveRestartIndex { } ( GLuint index ) ;
-GL-FUNCTION: void glGetUniformIndices { } ( GLuint program, GLsizei uniformCount, GLchar** uniformNames, GLuint* uniformIndices ) ;
+GL-FUNCTION: void glGetUniformIndices { } ( GLuint program, GLsizei uniformCount, GLstring* uniformNames, GLuint* uniformIndices ) ;
GL-FUNCTION: void glGetActiveUniformsiv { } ( GLuint program, GLsizei uniformCount, GLuint* uniformIndices, GLenum pname, GLint* params ) ;
-GL-FUNCTION: void glGetActiveUniformName { } ( GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName ) ;
-GL-FUNCTION: GLuint glGetUniformBlockIndex { } ( GLuint program, GLchar* uniformBlockName ) ;
+GL-FUNCTION: void glGetActiveUniformName { } ( GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLstring uniformName ) ;
+GL-FUNCTION: GLuint glGetUniformBlockIndex { } ( GLuint program, GLstring uniformBlockName ) ;
GL-FUNCTION: void glGetActiveUniformBlockiv { } ( GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params ) ;
-GL-FUNCTION: void glGetActiveUniformBlockName { } ( GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName ) ;
+GL-FUNCTION: void glGetActiveUniformBlockName { } ( GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLstring uniformName ) ;
GL-FUNCTION: void glUniformBlockBinding { } ( GLuint buffer, GLuint uniformBlockIndex, GLuint uniformBlockBinding ) ;
GL-FUNCTION: void glCopyBufferSubData { glCopyBufferSubDataEXT } ( GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size ) ;
diff --git a/basis/opengl/gl/macosx/platforms.txt b/basis/opengl/gl/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/opengl/gl/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/opengl/gl/macosx/tags.txt b/basis/opengl/gl/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/opengl/gl/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/opengl/gl/unix/platforms.txt b/basis/opengl/gl/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/opengl/gl/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/opengl/gl/unix/tags.txt b/basis/opengl/gl/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/opengl/gl/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/opengl/gl/windows/platforms.txt b/basis/opengl/gl/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/opengl/gl/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/opengl/gl/windows/tags.txt b/basis/opengl/gl/windows/tags.txt
deleted file mode 100755
index 6bf68304bb..0000000000
--- a/basis/opengl/gl/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/opengl/gl/windows/windows.factor b/basis/opengl/gl/windows/windows.factor
index 5821e3f212..8bceb865e2 100644
--- a/basis/opengl/gl/windows/windows.factor
+++ b/basis/opengl/gl/windows/windows.factor
@@ -4,7 +4,7 @@ IN: opengl.gl.windows
LIBRARY: gl
FUNCTION: HGLRC wglGetCurrentContext ( ) ;
-FUNCTION: void* wglGetProcAddress ( char* name ) ;
+FUNCTION: void* wglGetProcAddress ( c-string name ) ;
: gl-function-context ( -- context ) wglGetCurrentContext ; inline
: gl-function-address ( name -- address ) wglGetProcAddress ; inline
diff --git a/basis/opengl/shaders/shaders-docs.factor b/basis/opengl/shaders/shaders-docs.factor
index 1a10071ddf..c3e4d045ef 100644
--- a/basis/opengl/shaders/shaders-docs.factor
+++ b/basis/opengl/shaders/shaders-docs.factor
@@ -52,7 +52,7 @@ HELP: delete-gl-shader
{ $description "Deletes the shader object, invalidating it and releasing any resources allocated for it by the OpenGL implementation." } ;
HELP: gl-shader-info-log
-{ $values { "shader" "A " { $link gl-shader } " object" } { "shader" "a new " { $link gl-shader } } { "log" string } }
+{ $values { "shader" "A " { $link gl-shader } " object" } { "log" string } }
{ $description "Retrieves the info log for " { $snippet "shader" } ", including any errors or warnings generated in compiling the shader object." } ;
HELP: gl-program
diff --git a/basis/opengl/textures/textures.factor b/basis/opengl/textures/textures.factor
index e53383c98b..9284a151f5 100644
--- a/basis/opengl/textures/textures.factor
+++ b/basis/opengl/textures/textures.factor
@@ -1,9 +1,9 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors assocs cache colors.constants destructors
kernel opengl opengl.gl opengl.capabilities combinators images
images.tesselation grouping sequences math math.vectors
-math.matrices generalizations fry arrays namespaces system
+generalizations fry arrays namespaces system
locals literals specialized-arrays ;
FROM: alien.c-types => float ;
SPECIALIZED-ARRAY: float
@@ -354,7 +354,7 @@ TUPLE: multi-texture < disposable grid display-list loc ;
: image-locs ( image-grid -- loc-grid )
[ first [ dim>> first ] map ] [ [ first dim>> second ] map ] bi
[ 0 [ + ] accumulate nip ] bi@
- cross-zip flip ;
+ cartesian-product flip ;
: ( image-grid loc -- grid )
[ dup image-locs ] dip
diff --git a/basis/openssl/libcrypto/libcrypto.factor b/basis/openssl/libcrypto/libcrypto.factor
index dbc5b9e43c..f9983d7813 100644
--- a/basis/openssl/libcrypto/libcrypto.factor
+++ b/basis/openssl/libcrypto/libcrypto.factor
@@ -65,9 +65,9 @@ LIBRARY: libcrypto
! bio.h
! ===============================================
-FUNCTION: bio* BIO_new_file ( char* filename, char* mode ) ;
+FUNCTION: bio* BIO_new_file ( c-string filename, c-string mode ) ;
-FUNCTION: int BIO_printf ( bio* bio, char* format ) ;
+FUNCTION: int BIO_printf ( bio* bio, c-string format ) ;
FUNCTION: long BIO_ctrl ( void* bio, int cmd, long larg, void* parg ) ;
@@ -83,17 +83,17 @@ FUNCTION: void* BIO_push ( void* bio, void* append ) ;
FUNCTION: int BIO_read ( void* b, void* buf, int len ) ;
-FUNCTION: int BIO_gets ( void* b, char* buf, int size ) ;
+FUNCTION: int BIO_gets ( void* b, c-string buf, int size ) ;
FUNCTION: int BIO_write ( void* b, void* buf, int len ) ;
-FUNCTION: int BIO_puts ( void* bp, char* buf ) ;
+FUNCTION: int BIO_puts ( void* bp, c-string buf ) ;
FUNCTION: ulong ERR_get_error ( ) ;
FUNCTION: void ERR_clear_error ( ) ;
-FUNCTION: char* ERR_error_string ( ulong e, void* buf ) ;
+FUNCTION: c-string ERR_error_string ( ulong e, void* buf ) ;
FUNCTION: void* BIO_f_buffer ( ) ;
@@ -103,7 +103,7 @@ FUNCTION: void* BIO_f_buffer ( ) ;
CONSTANT: EVP_MAX_MD_SIZE 64
-TYPEDEF: void* EVP_MD*
+C-TYPE: EVP_MD
C-TYPE: ENGINE
STRUCT: EVP_MD_CTX
@@ -120,7 +120,7 @@ FUNCTION: void OpenSSL_add_all_digests ( ) ;
! Clean them up before exiting
FUNCTION: void EVP_cleanup ( ) ;
-FUNCTION: EVP_MD* EVP_get_digestbyname ( char* name ) ;
+FUNCTION: EVP_MD* EVP_get_digestbyname ( c-string name ) ;
FUNCTION: void EVP_MD_CTX_init ( EVP_MD* ctx ) ;
@@ -166,7 +166,7 @@ FUNCTION: int RSA_print_fp ( void* fp, void* x, int offset ) ;
! objects.h
! ===============================================
-FUNCTION: int OBJ_sn2nid ( char* s ) ;
+FUNCTION: int OBJ_sn2nid ( c-string s ) ;
! ===============================================
! bn.h
diff --git a/basis/openssl/libssl/libssl.factor b/basis/openssl/libssl/libssl.factor
index 225d4b3da1..bfd59cde25 100644
--- a/basis/openssl/libssl/libssl.factor
+++ b/basis/openssl/libssl/libssl.factor
@@ -89,8 +89,8 @@ CONSTANT: SSL_ERROR_WANT_ACCEPT 8
} ;
TYPEDEF: void* ssl-method
-TYPEDEF: void* SSL_CTX*
-TYPEDEF: void* SSL_SESSION*
+C-TYPE: SSL_CTX
+C-TYPE: SSL_SESSION
C-TYPE: SSL
LIBRARY: libssl
@@ -99,8 +99,7 @@ LIBRARY: libssl
! x509.h
! ===============================================
-TYPEDEF: void* X509_NAME*
-
+C-TYPE: X509_NAME
C-TYPE: X509
FUNCTION: int X509_NAME_get_text_by_NID ( X509_NAME* name, int nid, void* buf, int len ) ;
@@ -110,7 +109,7 @@ FUNCTION: X509_NAME* X509_get_subject_name ( X509* a ) ;
! ssl.h
! ===============================================
-FUNCTION: char* SSL_get_version ( SSL* ssl ) ;
+FUNCTION: c-string SSL_get_version ( SSL* ssl ) ;
! Maps OpenSSL errors to strings
FUNCTION: void SSL_load_error_strings ( ) ;
@@ -144,7 +143,7 @@ FUNCTION: SSL_CTX* SSL_CTX_new ( ssl-method method ) ;
! Load the certificates and private keys into the SSL_CTX
FUNCTION: int SSL_CTX_use_certificate_chain_file ( SSL_CTX* ctx,
- char* file ) ; ! PEM type
+ c-string file ) ; ! PEM type
FUNCTION: SSL* SSL_new ( SSL_CTX* ctx ) ;
@@ -175,7 +174,7 @@ CONSTANT: SSL_RECEIVED_SHUTDOWN 2
FUNCTION: int SSL_get_shutdown ( SSL* ssl ) ;
-FUNCTION: int SSL_CTX_set_session_id_context ( SSL_CTX* ctx, char* sid_ctx, uint len ) ;
+FUNCTION: int SSL_CTX_set_session_id_context ( SSL_CTX* ctx, c-string sid_ctx, uint len ) ;
FUNCTION: SSL_SESSION* SSL_get1_session ( SSL* ssl ) ;
@@ -198,17 +197,17 @@ FUNCTION: void SSL_CTX_free ( SSL_CTX* ctx ) ;
FUNCTION: void RAND_seed ( void* buf, int num ) ;
-FUNCTION: int SSL_set_cipher_list ( SSL* ssl, char* str ) ;
+FUNCTION: int SSL_set_cipher_list ( SSL* ssl, c-string str ) ;
-FUNCTION: int SSL_use_RSAPrivateKey_file ( SSL* ssl, char* str ) ;
+FUNCTION: int SSL_use_RSAPrivateKey_file ( SSL* ssl, c-string str ) ;
FUNCTION: int SSL_CTX_use_RSAPrivateKey_file ( SSL_CTX* ctx, int type ) ;
FUNCTION: int SSL_use_certificate_file ( SSL* ssl,
- char* str, int type ) ;
+ c-string str, int type ) ;
-FUNCTION: int SSL_CTX_load_verify_locations ( SSL_CTX* ctx, char* CAfile,
- char* CApath ) ;
+FUNCTION: int SSL_CTX_load_verify_locations ( SSL_CTX* ctx, c-string CAfile,
+ c-string CApath ) ;
FUNCTION: int SSL_CTX_set_default_verify_paths ( SSL_CTX* ctx ) ;
@@ -221,7 +220,7 @@ FUNCTION: void SSL_CTX_set_verify ( SSL_CTX* ctx, int mode, void* callback ) ;
FUNCTION: void SSL_CTX_set_client_CA_list ( SSL_CTX* ctx, SSL* list ) ;
-FUNCTION: SSL* SSL_load_client_CA_file ( char* file ) ;
+FUNCTION: SSL* SSL_load_client_CA_file ( c-string file ) ;
! Used to manipulate settings of the SSL_CTX and SSL objects.
! This function should never be called directly
@@ -232,7 +231,7 @@ FUNCTION: void SSL_CTX_set_default_passwd_cb ( SSL_CTX* ctx, void* cb ) ;
FUNCTION: void SSL_CTX_set_default_passwd_cb_userdata ( SSL_CTX* ctx,
void* u ) ;
-FUNCTION: int SSL_CTX_use_PrivateKey_file ( SSL_CTX* ctx, char* file,
+FUNCTION: int SSL_CTX_use_PrivateKey_file ( SSL_CTX* ctx, c-string file,
int type ) ;
! Sets the maximum depth for the allowed ctx certificate chain verification
diff --git a/basis/pango/fonts/fonts.factor b/basis/pango/fonts/fonts.factor
index 31a51e3f12..c2a7ef128d 100644
--- a/basis/pango/fonts/fonts.factor
+++ b/basis/pango/fonts/fonts.factor
@@ -45,16 +45,16 @@ pango_font_description_free ( PangoFontDescription* desc ) ;
DESTRUCTOR: pango_font_description_free
FUNCTION: PangoFontDescription*
-pango_font_description_from_string ( char* str ) ;
+pango_font_description_from_string ( c-string str ) ;
-FUNCTION: char*
+FUNCTION: c-string
pango_font_description_to_string ( PangoFontDescription* desc ) ;
-FUNCTION: char*
+FUNCTION: c-string
pango_font_description_to_filename ( PangoFontDescription* desc ) ;
FUNCTION: void
-pango_font_description_set_family ( PangoFontDescription* desc, char* family ) ;
+pango_font_description_set_family ( PangoFontDescription* desc, c-string family ) ;
FUNCTION: void
pango_font_description_set_style ( PangoFontDescription* desc, PangoStyle style ) ;
@@ -68,7 +68,7 @@ pango_font_description_set_size ( PangoFontDescription* desc, gint size ) ;
FUNCTION: void
pango_font_map_list_families ( PangoFontMap* fontmap, PangoFontFamily*** families, int* n_families ) ;
-FUNCTION: char*
+FUNCTION: c-string
pango_font_family_get_name ( PangoFontFamily* family ) ;
FUNCTION: int
@@ -77,7 +77,7 @@ pango_font_family_is_monospace ( PangoFontFamily* family ) ;
FUNCTION: void
pango_font_family_list_faces ( PangoFontFamily* family, PangoFontFace*** faces, int* n_faces ) ;
-FUNCTION: char*
+FUNCTION: c-string
pango_font_face_get_face_name ( PangoFontFace* face ) ;
FUNCTION: void
diff --git a/basis/pango/layouts/layouts.factor b/basis/pango/layouts/layouts.factor
index 74b6d0b0c3..3f3b02c7c7 100644
--- a/basis/pango/layouts/layouts.factor
+++ b/basis/pango/layouts/layouts.factor
@@ -21,9 +21,9 @@ FUNCTION: PangoContext*
pango_layout_get_context ( PangoLayout* layout ) ;
FUNCTION: void
-pango_layout_set_text ( PangoLayout* layout, char* text, int length ) ;
+pango_layout_set_text ( PangoLayout* layout, c-string text, int length ) ;
-FUNCTION: char*
+FUNCTION: c-string
pango_layout_get_text ( PangoLayout* layout ) ;
FUNCTION: void
diff --git a/basis/peg/peg.factor b/basis/peg/peg.factor
index d4397627e8..a180713ccf 100644
--- a/basis/peg/peg.factor
+++ b/basis/peg/peg.factor
@@ -1,9 +1,9 @@
! Copyright (C) 2007, 2008 Chris Double.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel sequences strings fry namespaces make math assocs
-io vectors arrays math.parser math.order combinators
-classes sets unicode.categories compiler.units parser words
-quotations memoize accessors locals splitting
+io vectors arrays math.parser math.order combinators classes
+sets unicode.categories compiler.units parser effects.parser
+words quotations memoize accessors locals splitting
combinators.short-circuit generalizations ;
IN: peg
diff --git a/basis/prettyprint/config/config-docs.factor b/basis/prettyprint/config/config-docs.factor
index ccc63c61cb..7cd4b31c8b 100644
--- a/basis/prettyprint/config/config-docs.factor
+++ b/basis/prettyprint/config/config-docs.factor
@@ -1,5 +1,5 @@
USING: help.markup help.syntax io kernel
-prettyprint.sections words ;
+prettyprint.sections words quotations ;
IN: prettyprint.config
ABOUT: "prettyprint-variables"
@@ -31,3 +31,11 @@ HELP: boa-tuples?
HELP: c-object-pointers?
{ $var-description "Toggles whether C objects such as structs and direct arrays only print their underlying address. If this flag isn't set, C objects will attempt to print their contents. If a C object points to invalid memory, it will display only its address regardless." } ;
+
+HELP: with-short-limits
+{ $values { "quot" quotation } }
+{ $description "Calls a quotation in a new dynamic scope with prettyprinter limits set to produce a single line of output." } ;
+
+HELP: without-limits
+{ $values { "quot" quotation } }
+{ $description "Calls a quotation in a new dynamic scope with prettyprinter limits set to produce unlimited output." } ;
diff --git a/basis/prettyprint/config/config.factor b/basis/prettyprint/config/config.factor
index dd61e3e23d..a8848f9061 100644
--- a/basis/prettyprint/config/config.factor
+++ b/basis/prettyprint/config/config.factor
@@ -1,8 +1,6 @@
-! Copyright (C) 2003, 2008 Slava Pestov.
+! Copyright (C) 2003, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: arrays generic assocs io kernel math
-namespaces sequences strings vectors words
-continuations ;
+USING: kernel namespaces ;
IN: prettyprint.config
! Configuration
@@ -18,4 +16,28 @@ SYMBOL: c-object-pointers?
4 tab-size set-global
64 margin set-global
+15 nesting-limit set-global
+100 length-limit set-global
10 number-base set-global
+string-limit? on
+
+: with-short-limits ( quot -- )
+ [
+ 1 line-limit set
+ 15 length-limit set
+ 2 nesting-limit set
+ string-limit? on
+ boa-tuples? on
+ c-object-pointers? on
+ call
+ ] with-scope ; inline
+
+: without-limits ( quot -- )
+ [
+ nesting-limit off
+ length-limit off
+ line-limit off
+ string-limit? off
+ c-object-pointers? off
+ call
+ ] with-scope ; inline
diff --git a/basis/prettyprint/prettyprint-docs.factor b/basis/prettyprint/prettyprint-docs.factor
index bd2c4bd924..33e1857260 100644
--- a/basis/prettyprint/prettyprint-docs.factor
+++ b/basis/prettyprint/prettyprint-docs.factor
@@ -38,12 +38,9 @@ ARTICLE: "prettyprint-variables" "Prettyprint control variables"
boa-tuples?
c-object-pointers?
}
-"Note that the " { $link short. } " and " { $link pprint-short } " variables override some of these variables."
-{
- $warning "Treat the global variables as essentially being constants. Only ever rebind them in a nested scope."
- $nl
- "Some of the globals are safe to change, like the tab size and wrap margin. However setting limits globally could break code which uses the prettyprinter as a serialization mechanism."
-} ;
+"The default limits are meant to strike a balance between readability, and not producing too much output when large structures are given. There are two combinators that override the defaults:"
+{ $subsections with-short-limits without-limits }
+"That the " { $link short. } " and " { $link pprint-short } " words wrap calls to " { $link . } " and " { $link pprint } " in " { $link with-short-limits } ". Code that uses the prettyprinter for serialization should use " { $link without-limits } " to avoid producing unreadable output." ;
ARTICLE: "prettyprint-limitations" "Prettyprinter limitations"
"When using the prettyprinter as a serialization mechanism, keep the following points in mind:"
diff --git a/basis/prettyprint/prettyprint-tests.factor b/basis/prettyprint/prettyprint-tests.factor
index 8ba6e94a49..ec0e20a393 100644
--- a/basis/prettyprint/prettyprint-tests.factor
+++ b/basis/prettyprint/prettyprint-tests.factor
@@ -362,3 +362,15 @@ TUPLE: tuple-with-initial-declared-slot { x integer initial: 123 } ;
] [
[ \ tuple-with-initial-declared-slot see ] with-string-writer "\n" split
] unit-test
+
+TUPLE: final-tuple ; final
+
+[
+ {
+ "IN: prettyprint.tests"
+ "TUPLE: final-tuple ; final"
+ ""
+ }
+] [
+ [ \ final-tuple see ] with-string-writer "\n" split
+] unit-test
diff --git a/basis/prettyprint/prettyprint.factor b/basis/prettyprint/prettyprint.factor
index 7b1538b1dc..23cf956a1d 100644
--- a/basis/prettyprint/prettyprint.factor
+++ b/basis/prettyprint/prettyprint.factor
@@ -26,13 +26,7 @@ IN: prettyprint
: unparse-use ( obj -- str ) [ pprint-use ] with-string-writer ;
: pprint-short ( obj -- )
- H{
- { line-limit 1 }
- { length-limit 15 }
- { nesting-limit 2 }
- { string-limit? t }
- { boa-tuples? t }
- } clone [ pprint ] bind ;
+ [ pprint ] with-short-limits ;
: unparse-short ( obj -- str )
[ pprint-short ] with-string-writer ;
diff --git a/basis/promises/promises.factor b/basis/promises/promises.factor
index cd98827206..10d028e012 100644
--- a/basis/promises/promises.factor
+++ b/basis/promises/promises.factor
@@ -1,7 +1,7 @@
! Copyright (C) 2004, 2006 Chris Double, Matthew Willis.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays effects fry generalizations kernel math
-namespaces parser sequences words ;
+namespaces parser effects.parser sequences words ;
IN: promises
TUPLE: promise quot forced? value ;
diff --git a/basis/random/random-docs.factor b/basis/random/random-docs.factor
index 175c34ad9d..20d5dc0214 100644
--- a/basis/random/random-docs.factor
+++ b/basis/random/random-docs.factor
@@ -75,7 +75,7 @@ HELP: with-system-random
HELP: randomize
{ $values
{ "seq" sequence }
- { "seq" sequence }
+ { "randomized" sequence }
}
{ $description "Randomizes a sequence in-place with the Fisher-Yates algorithm and returns the sequence." } ;
diff --git a/basis/random/random.factor b/basis/random/random.factor
index eeaa1f8f2c..ba5d9c7ca3 100644
--- a/basis/random/random.factor
+++ b/basis/random/random.factor
@@ -67,7 +67,7 @@ M: sequence random
[ [ random ] [ 1 - ] bi [ pick exchange ] keep ]
while drop ;
-: randomize ( seq -- seq )
+: randomize ( seq -- randomized )
dup length randomize-n-last ;
ERROR: too-many-samples seq n ;
diff --git a/basis/random/unix/platforms.txt b/basis/random/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/random/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/random/unix/tags.txt b/basis/random/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/random/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/random/windows/platforms.txt b/basis/random/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/random/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/random/windows/tags.txt b/basis/random/windows/tags.txt
deleted file mode 100755
index 6bf68304bb..0000000000
--- a/basis/random/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/roman/roman-docs.factor b/basis/roman/roman-docs.factor
index c81ed0ae42..c9c3db71b5 100644
--- a/basis/roman/roman-docs.factor
+++ b/basis/roman/roman-docs.factor
@@ -39,7 +39,7 @@ HELP: roman>
{ >roman >ROMAN roman> } related-words
HELP: roman+
-{ $values { "x" string } { "x" string } { "x" string } }
+{ $values { "x" string } { "y" string } { "z" string } }
{ $description "Adds two Roman numerals." }
{ $examples
{ $example "USING: io roman ;"
@@ -49,7 +49,7 @@ HELP: roman+
} ;
HELP: roman-
-{ $values { "x" string } { "x" string } { "x" string } }
+{ $values { "x" string } { "y" string } { "z" string } }
{ $description "Subtracts two Roman numerals." }
{ $examples
{ $example "USING: io roman ;"
@@ -61,7 +61,7 @@ HELP: roman-
{ roman+ roman- } related-words
HELP: roman*
-{ $values { "x" string } { "x" string } { "x" string } }
+{ $values { "x" string } { "y" string } { "z" string } }
{ $description "Multiplies two Roman numerals." }
{ $examples
{ $example "USING: io roman ;"
@@ -71,7 +71,7 @@ HELP: roman*
} ;
HELP: roman/i
-{ $values { "x" string } { "x" string } { "x" string } }
+{ $values { "x" string } { "y" string } { "z" string } }
{ $description "Computes the integer division of two Roman numerals." }
{ $examples
{ $example "USING: io roman ;"
@@ -81,7 +81,7 @@ HELP: roman/i
} ;
HELP: roman/mod
-{ $values { "x" string } { "x" string } { "x" string } { "x" string } }
+{ $values { "x" string } { "y" string } { "z" string } { "w" string } }
{ $description "Computes the quotient and remainder of two Roman numerals." }
{ $examples
{ $example "USING: kernel io roman ;"
diff --git a/basis/roman/roman.factor b/basis/roman/roman.factor
index a783e7973c..588166829a 100644
--- a/basis/roman/roman.factor
+++ b/basis/roman/roman.factor
@@ -2,8 +2,9 @@
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs effects fry generalizations
grouping kernel lexer macros math math.order math.vectors
-namespaces parser quotations sequences sequences.private
-splitting.monotonic stack-checker strings unicode.case words ;
+namespaces parser effects.parser quotations sequences
+sequences.private splitting.monotonic stack-checker strings
+unicode.case words ;
IN: roman
SYNTAX: ROMAN-OP:
scan-word [ name>> "roman" prepend create-in ] keep
1quotation '[ _ binary-roman-op ]
- dup infer define-declared ;
+ complete-effect define-declared ;
>>
-ROMAN-OP: +
-ROMAN-OP: -
-ROMAN-OP: *
-ROMAN-OP: /i
-ROMAN-OP: /mod
+ROMAN-OP: + ( x y -- z )
+ROMAN-OP: - ( x y -- z )
+ROMAN-OP: * ( x y -- z )
+ROMAN-OP: /i ( x y -- z )
+ROMAN-OP: /mod ( x y -- z w )
SYNTAX: ROMAN: scan roman> suffix! ;
diff --git a/basis/see/see.factor b/basis/see/see.factor
index 0d2388114a..326e051219 100644
--- a/basis/see/see.factor
+++ b/basis/see/see.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs classes classes.builtin
classes.intersection classes.mixin classes.predicate classes.singleton
@@ -182,14 +182,21 @@ M: array pprint-slot-name
dup length 1 = [ first ] when
pprint-slot-name ;
+: tuple-declarations. ( class -- )
+ \ final declaration. ;
+
+: superclass. ( class -- )
+ superclass dup tuple eq? [ drop ] [ "<" text pprint-word ] if ;
+
M: tuple-class see-class*
- pprint-; block> ;
+ {
+ [ pprint-word ]
+ [ superclass. ]
+ [ pprint-; ]
+ [ tuple-declarations. ]
+ } cleave
+ block> ;
M: word see-class* drop ;
diff --git a/basis/sequences/cords/cords.factor b/basis/sequences/cords/cords.factor
index fca005fa6e..4a2d267a12 100644
--- a/basis/sequences/cords/cords.factor
+++ b/basis/sequences/cords/cords.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov, Joe Groff.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors assocs sequences sorting binary-search fry math
math.order arrays classes combinators kernel functors math.functions
@@ -8,7 +8,7 @@ IN: sequences.cords
MIXIN: cord
TUPLE: generic-cord
- { head read-only } { tail read-only } ;
+ { head read-only } { tail read-only } ; final
INSTANCE: generic-cord cord
M: cord length
@@ -34,7 +34,7 @@ T-cord DEFINES-CLASS ${C}
WHERE
TUPLE: T-cord
- { head T read-only } { tail T read-only } ;
+ { head T read-only } { tail T read-only } ; final
INSTANCE: T-cord cord
M: T cord-append
diff --git a/basis/sequences/deep/deep-docs.factor b/basis/sequences/deep/deep-docs.factor
index e8b9ddea6d..6f479e48b6 100644
--- a/basis/sequences/deep/deep-docs.factor
+++ b/basis/sequences/deep/deep-docs.factor
@@ -31,7 +31,7 @@ HELP: flatten
{ $description "Creates a sequence of all of the leaf nodes (non-sequence nodes, but including strings and numbers) in the object." } ;
HELP: deep-map!
-{ $values { "obj" object } { "quot" { $quotation "( elt -- newelt )" } } { "obj" object } }
+{ $values { "obj" object } { "quot" { $quotation "( elt -- newelt )" } } }
{ $description "Modifies each sub-node of an object in place, in preorder, and returns that object." }
{ $see-also map! } ;
diff --git a/basis/serialize/serialize-tests.factor b/basis/serialize/serialize-tests.factor
index 036356e137..9213a54004 100644
--- a/basis/serialize/serialize-tests.factor
+++ b/basis/serialize/serialize-tests.factor
@@ -4,7 +4,8 @@
USING: tools.test kernel serialize io io.streams.byte-array
alien arrays byte-arrays bit-arrays specialized-arrays
sequences math prettyprint parser classes math.constants
-io.encodings.binary random assocs serialize.private alien.c-types ;
+io.encodings.binary random assocs serialize.private alien.c-types
+combinators.short-circuit ;
SPECIALIZED-ARRAY: double
IN: serialize.tests
@@ -16,11 +17,12 @@ IN: serialize.tests
[ t ] [
100 [
drop
- 40 [ test-serialize-cell ] all-integers?
- 4 [ 40 * test-serialize-cell ] all-integers?
- 4 [ 400 * test-serialize-cell ] all-integers?
- 4 [ 4000 * test-serialize-cell ] all-integers?
- and and and
+ {
+ [ 40 [ test-serialize-cell ] all-integers? ]
+ [ 4 [ 40 * test-serialize-cell ] all-integers? ]
+ [ 4 [ 400 * test-serialize-cell ] all-integers? ]
+ [ 4 [ 4000 * test-serialize-cell ] all-integers? ]
+ } 0&&
] all-integers?
] unit-test
diff --git a/basis/simple-tokenizer/authors.txt b/basis/simple-tokenizer/authors.txt
new file mode 100644
index 0000000000..1901f27a24
--- /dev/null
+++ b/basis/simple-tokenizer/authors.txt
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/basis/simple-tokenizer/simple-tokenizer-docs.factor b/basis/simple-tokenizer/simple-tokenizer-docs.factor
new file mode 100644
index 0000000000..57e14f09ba
--- /dev/null
+++ b/basis/simple-tokenizer/simple-tokenizer-docs.factor
@@ -0,0 +1,13 @@
+USING: help.markup help.syntax strings ;
+IN: simple-tokenizer
+
+HELP: tokenize
+{ $values { "input" string } { "ast" "a sequence of strings" } }
+{ $description
+ "Tokenize a string. Supported syntax:"
+ { $list
+ { { $snippet "foo bar baz" } " - simple tokens" }
+ { { $snippet "foo\\ bar" } " - token with an escaped space"}
+ { { $snippet "\"foo bar\"" } " - quoted token" }
+ }
+} ;
diff --git a/basis/simple-tokenizer/simple-tokenizer-tests.factor b/basis/simple-tokenizer/simple-tokenizer-tests.factor
new file mode 100644
index 0000000000..3b44f03650
--- /dev/null
+++ b/basis/simple-tokenizer/simple-tokenizer-tests.factor
@@ -0,0 +1,33 @@
+IN: simple-tokenizer.tests
+USING: simple-tokenizer tools.test ;
+
+[ "" tokenize ] must-fail
+[ " " tokenize ] must-fail
+[ V{ "a" } ] [ "a" tokenize ] unit-test
+[ V{ "abc" } ] [ "abc" tokenize ] unit-test
+[ V{ "abc" } ] [ "abc " tokenize ] unit-test
+[ V{ "abc" } ] [ " abc" tokenize ] unit-test
+[ V{ "abc" "def" } ] [ "abc def" tokenize ] unit-test
+[ V{ "abc def" } ] [ "abc\\ def" tokenize ] unit-test
+[ V{ "abc\\" "def" } ] [ "abc\\\\ def" tokenize ] unit-test
+[ V{ "abc\\ def" } ] [ "\"abc\\\\ def\"" tokenize ] unit-test
+[ V{ "abc\\ def" } ] [ " \"abc\\\\ def\"" tokenize ] unit-test
+[ V{ "abc\\ def" "hey" } ] [ "\"abc\\\\ def\" hey" tokenize ] unit-test
+[ V{ "abc def" "hey" } ] [ "\"abc def\" \"hey\"" tokenize ] unit-test
+[ "\"abc def\" \"hey" tokenize ] must-fail
+[ "\"abc def" tokenize ] must-fail
+[ V{ "abc def" "h\"ey" } ] [ "\"abc def\" \"h\\\"ey\" " tokenize ] unit-test
+
+[
+ V{
+ "Hello world.app/Contents/MacOS/hello-ui"
+ "-i=boot.macosx-ppc.image"
+ "-include= math compiler ui"
+ "-deploy-vocab=hello-ui"
+ "-output-image=Hello world.app/Contents/Resources/hello-ui.image"
+ "-no-stack-traces"
+ "-no-user-init"
+ }
+] [
+ "\"Hello world.app/Contents/MacOS/hello-ui\" -i=boot.macosx-ppc.image \"-include= math compiler ui\" -deploy-vocab=hello-ui \"-output-image=Hello world.app/Contents/Resources/hello-ui.image\" -no-stack-traces -no-user-init" tokenize
+] unit-test
diff --git a/basis/io/launcher/unix/parser/parser.factor b/basis/simple-tokenizer/simple-tokenizer.factor
similarity index 62%
rename from basis/io/launcher/unix/parser/parser.factor
rename to basis/simple-tokenizer/simple-tokenizer.factor
index bcc5f965e9..f6698a65f0 100644
--- a/basis/io/launcher/unix/parser/parser.factor
+++ b/basis/simple-tokenizer/simple-tokenizer.factor
@@ -1,13 +1,9 @@
-! Copyright (C) 2008 Slava Pestov
+! Copyright (C) 2008, 2010 Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
USING: peg peg.ebnf arrays sequences strings kernel ;
-IN: io.launcher.unix.parser
+IN: simple-tokenizer
-! Our command line parser. Supported syntax:
-! foo bar baz -- simple tokens
-! foo\ bar -- escaping the space
-! "foo bar" -- quotation
-EBNF: tokenize-command
+EBNF: tokenize
space = " "
escaped-char = "\" .:ch => [[ ch ]]
quoted = '"' (escaped-char | [^"])*:a '"' => [[ a ]]
diff --git a/basis/simple-tokenizer/tags.txt b/basis/simple-tokenizer/tags.txt
new file mode 100644
index 0000000000..8e27be7d61
--- /dev/null
+++ b/basis/simple-tokenizer/tags.txt
@@ -0,0 +1 @@
+text
diff --git a/basis/specialized-arrays/specialized-arrays-tests.factor b/basis/specialized-arrays/specialized-arrays-tests.factor
index c25f8ae3b1..645606edc5 100644
--- a/basis/specialized-arrays/specialized-arrays-tests.factor
+++ b/basis/specialized-arrays/specialized-arrays-tests.factor
@@ -1,12 +1,13 @@
IN: specialized-arrays.tests
USING: tools.test alien.syntax specialized-arrays
-specialized-arrays.private sequences alien.c-types accessors
+specialized-arrays.private sequences alien accessors
kernel arrays combinators compiler compiler.units classes.struct
combinators.smart compiler.tree.debugger math libc destructors
sequences.private multiline eval words vocabs namespaces
assocs prettyprint alien.data math.vectors definitions
compiler.test ;
-FROM: alien.c-types => float ;
+FROM: alien.c-types => int float bool char float ulonglong ushort uint
+heap-size little-endian? ;
SPECIALIZED-ARRAY: int
SPECIALIZED-ARRAYS: bool ushort char uint float ulonglong ;
diff --git a/basis/specialized-arrays/specialized-arrays.factor b/basis/specialized-arrays/specialized-arrays.factor
index eda793ff22..b052becfed 100644
--- a/basis/specialized-arrays/specialized-arrays.factor
+++ b/basis/specialized-arrays/specialized-arrays.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien alien.c-types alien.data alien.parser
assocs byte-arrays classes compiler.units functors kernel lexer
@@ -19,6 +19,11 @@ ERROR: bad-byte-array-length byte-array type ;
M: bad-byte-array-length summary
drop "Byte array length doesn't divide type width" ;
+ERROR: not-a-byte-array alien ;
+
+M: not-a-byte-array summary
+ drop "Not a byte array" ;
+
: (underlying) ( n c-type -- array )
heap-size * (byte-array) ; inline
@@ -47,7 +52,7 @@ WHERE
TUPLE: A
{ underlying c-ptr read-only }
-{ length array-capacity read-only } ;
+{ length array-capacity read-only } ; final
: ( alien len -- specialized-array ) A boa ; inline
@@ -61,9 +66,11 @@ TUPLE: A
[ \ T heap-size calloc ] keep ; inline
: byte-array>A ( byte-array -- specialized-array )
- >c-ptr dup length \ T heap-size /mod 0 =
- [ drop \ T bad-byte-array-length ] unless
- ; inline
+ >c-ptr dup byte-array? [
+ dup length \ T heap-size /mod 0 =
+ [ ]
+ [ drop \ T bad-byte-array-length ] if
+ ] [ not-a-byte-array ] if ; inline
M: A clone [ underlying>> clone ] [ length>> ] bi ; inline
@@ -88,7 +95,7 @@ M: A resize
] [ drop ] 2bi
; inline
-M: A byte-length length \ T heap-size * ; inline
+M: A element-size drop \ T heap-size ; inline
M: A direct-array-syntax drop \ A@ ;
@@ -109,18 +116,19 @@ M: A v*high [ * \ T heap-size neg shift ] 2map ; inline
;FUNCTOR
-GENERIC: (underlying-type) ( c-type -- c-type' )
+GENERIC: underlying-type ( c-type -- c-type' )
-M: string (underlying-type) c-types get at ;
-M: word (underlying-type) "c-type" word-prop ;
-
-: underlying-type ( c-type -- c-type' )
- dup (underlying-type) {
+M: c-type-word underlying-type
+ dup "c-type" word-prop {
{ [ dup not ] [ drop no-c-type ] }
- { [ dup c-type-name? ] [ nip underlying-type ] }
+ { [ dup pointer? ] [ 2drop void* ] }
+ { [ dup c-type-word? ] [ nip underlying-type ] }
[ drop ]
} cond ;
+M: pointer underlying-type
+ drop void* ;
+
: specialized-array-vocab ( c-type -- vocab )
[
"specialized-arrays.instances." %
@@ -136,25 +144,29 @@ PRIVATE>
[ specialized-array-vocab ] [ '[ _ define-array ] ] bi
generate-vocab ;
-M: c-type-name require-c-array define-array-vocab drop ;
-
ERROR: specialized-array-vocab-not-loaded c-type ;
-M: c-type-name c-array-constructor
+M: c-type-word c-array-constructor
underlying-type
dup [ name>> "<" "-array>" surround ] [ specialized-array-vocab ] bi lookup
[ ] [ specialized-array-vocab-not-loaded ] ?if ; foldable
-M: c-type-name c-(array)-constructor
+M: pointer c-array-constructor drop void* c-array-constructor ;
+
+M: c-type-word c-(array)-constructor
underlying-type
dup [ name>> "(" "-array)" surround ] [ specialized-array-vocab ] bi lookup
[ ] [ specialized-array-vocab-not-loaded ] ?if ; foldable
-M: c-type-name c-direct-array-constructor
+M: pointer c-(array)-constructor drop void* c-(array)-constructor ;
+
+M: c-type-word c-direct-array-constructor
underlying-type
dup [ name>> "" surround ] [ specialized-array-vocab ] bi lookup
[ ] [ specialized-array-vocab-not-loaded ] ?if ; foldable
+M: pointer c-direct-array-constructor drop void* c-direct-array-constructor ;
+
SYNTAX: SPECIALIZED-ARRAYS:
";" parse-tokens [ parse-c-type define-array-vocab use-vocab ] each ;
diff --git a/basis/specialized-vectors/specialized-vectors.factor b/basis/specialized-vectors/specialized-vectors.factor
index 557ca25cd5..0c0569ea9d 100644
--- a/basis/specialized-vectors/specialized-vectors.factor
+++ b/basis/specialized-vectors/specialized-vectors.factor
@@ -1,8 +1,8 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.parser assocs
-compiler.units functors growable kernel lexer math namespaces parser
-prettyprint.custom sequences specialized-arrays
+USING: accessors alien alien.c-types alien.parser assocs
+compiler.units functors growable kernel lexer math namespaces
+parser prettyprint.custom sequences specialized-arrays
specialized-arrays.private strings vocabs vocabs.parser
vocabs.generated fry make ;
QUALIFIED: vectors.functor
@@ -26,7 +26,7 @@ V A vectors.functor:define-vector
M: V contract 2drop ; inline
-M: V byte-length length \ T heap-size * ; inline
+M: V element-size drop \ T heap-size ; inline
M: V pprint-delims drop \ V{ \ } ;
diff --git a/basis/stack-checker/alien/alien.factor b/basis/stack-checker/alien/alien.factor
index fdfda6dd9e..81d8a93240 100644
--- a/basis/stack-checker/alien/alien.factor
+++ b/basis/stack-checker/alien/alien.factor
@@ -3,7 +3,7 @@
USING: kernel sequences accessors combinators math namespaces
init sets words assocs alien.libraries alien alien.c-types
cpu.architecture fry stack-checker.backend stack-checker.errors
-stack-checker.visitor ;
+stack-checker.visitor stack-checker.dependencies ;
IN: stack-checker.alien
TUPLE: alien-node-params return parameters abi in-d out-d ;
@@ -16,65 +16,91 @@ TUPLE: alien-assembly-params < alien-node-params quot ;
TUPLE: alien-callback-params < alien-node-params quot xt ;
-: param-prep-quot ( node -- quot )
+: param-prep-quot ( params -- quot )
parameters>> [ c-type c-type-unboxer-quot ] map spread>quot ;
+: infer-params ( params -- )
+ param-prep-quot infer-quot-here ;
+
: alien-stack ( params extra -- )
over parameters>> length + consume-d >>in-d
dup return>> void? 0 1 ? produce-d >>out-d
drop ;
-: return-prep-quot ( node -- quot )
+: return-prep-quot ( params -- quot )
return>> [ [ ] ] [ c-type c-type-boxer-quot ] if-void ;
+: infer-return ( params -- )
+ return-prep-quot infer-quot-here ;
+
+: pop-return ( params -- params )
+ pop-literal [ depends-on-c-type ] [ nip >>return ] bi ;
+
+: pop-library ( params -- params )
+ pop-literal nip >>library ;
+
+: pop-function ( params -- params )
+ pop-literal nip >>function ;
+
+: pop-params ( params -- params )
+ pop-literal [ [ depends-on-c-type ] each ] [ nip >>parameters ] bi ;
+
+: pop-abi ( params -- params )
+ pop-literal nip >>abi ;
+
+: pop-quot ( params -- params )
+ pop-literal nip >>quot ;
+
: infer-alien-invoke ( -- )
alien-invoke-params new
! Compile-time parameters
- pop-literal nip >>parameters
- pop-literal nip >>function
- pop-literal nip >>library
- pop-literal nip >>return
- ! Quotation which coerces parameters to required types
- dup param-prep-quot infer-quot-here
+ pop-params
+ pop-function
+ pop-library
+ pop-return
! Set ABI
- dup library>> library [ abi>> ] [ "cdecl" ] if* >>abi
+ dup library>> library-abi >>abi
+ ! Quotation which coerces parameters to required types
+ dup infer-params
! Magic #: consume exactly the number of inputs
dup 0 alien-stack
! Add node to IR
dup #alien-invoke,
! Quotation which coerces return value to required type
- return-prep-quot infer-quot-here ;
+ infer-return ;
: infer-alien-indirect ( -- )
alien-indirect-params new
! Compile-time parameters
- pop-literal nip >>abi
- pop-literal nip >>parameters
- pop-literal nip >>return
+ pop-abi
+ pop-params
+ pop-return
! Quotation which coerces parameters to required types
- dup param-prep-quot '[ _ dip ] infer-quot-here
+ 1 infer->r
+ dup infer-params
+ 1 infer-r>
! Magic #: consume the function pointer, too
dup 1 alien-stack
! Add node to IR
dup #alien-indirect,
! Quotation which coerces return value to required type
- return-prep-quot infer-quot-here ;
+ infer-return ;
: infer-alien-assembly ( -- )
alien-assembly-params new
! Compile-time parameters
- pop-literal nip >>quot
- pop-literal nip >>abi
- pop-literal nip >>parameters
- pop-literal nip >>return
+ pop-quot
+ pop-abi
+ pop-params
+ pop-return
! Quotation which coerces parameters to required types
- dup param-prep-quot infer-quot-here
+ dup infer-params
! Magic #: consume exactly the number of inputs
dup 0 alien-stack
! Add node to IR
dup #alien-assembly,
! Quotation which coerces return value to required type
- return-prep-quot infer-quot-here ;
+ infer-return ;
: callback-xt ( word return-rewind -- alien )
[ callbacks get ] dip '[ _ ] cache ;
@@ -85,10 +111,10 @@ TUPLE: alien-callback-params < alien-node-params quot xt ;
: infer-alien-callback ( -- )
alien-callback-params new
- pop-literal nip >>quot
- pop-literal nip >>abi
- pop-literal nip >>parameters
- pop-literal nip >>return
+ pop-quot
+ pop-abi
+ pop-params
+ pop-return
"( callback )" >>xt
dup callback-bottom
#alien-callback, ;
diff --git a/basis/stack-checker/dependencies/dependencies.factor b/basis/stack-checker/dependencies/dependencies.factor
index d995354a52..e2f7c57593 100644
--- a/basis/stack-checker/dependencies/dependencies.factor
+++ b/basis/stack-checker/dependencies/dependencies.factor
@@ -1,8 +1,10 @@
! Copyright (C) 2009, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: assocs accessors classes.algebra fry generic kernel math
-namespaces sequences words sets combinators.short-circuit ;
+USING: arrays assocs accessors classes classes.algebra fry
+generic kernel math namespaces sequences words sets
+combinators.short-circuit classes.tuple alien.c-types ;
FROM: classes.tuple.private => tuple-layout ;
+FROM: assocs => change-at ;
IN: stack-checker.dependencies
! Words that the current quotation depends on
@@ -36,6 +38,18 @@ SYMBOLS: effect-dependency conditional-dependency definition-dependency ;
: depends-on-definition ( word -- )
definition-dependency depends-on ;
+GENERIC: depends-on-c-type ( c-type -- )
+
+M: void depends-on-c-type drop ;
+
+M: c-type-word depends-on-c-type depends-on-definition ;
+
+M: array depends-on-c-type
+ [ word? ] filter [ depends-on-definition ] each ;
+
+M: pointer depends-on-c-type
+ to>> depends-on-c-type ;
+
! Generic words that the current quotation depends on
SYMBOL: generic-dependencies
@@ -56,28 +70,26 @@ GENERIC: satisfied? ( dependency -- ? )
boa conditional-dependencies get
dup [ conjoin ] [ 2drop ] if ; inline
-TUPLE: depends-on-class<= class1 class2 ;
+TUPLE: depends-on-class-predicate class1 class2 result ;
-: depends-on-class<= ( class1 class2 -- )
- \ depends-on-class<= add-conditional-dependency ;
+: depends-on-class-predicate ( class1 class2 result -- )
+ \ depends-on-class-predicate add-conditional-dependency ;
-M: depends-on-class<= satisfied?
+M: depends-on-class-predicate satisfied?
{
- [ class1>> classoid? ]
- [ class2>> classoid? ]
- [ [ class1>> ] [ class2>> ] bi class<= ]
+ [ [ class1>> classoid? ] [ class2>> classoid? ] bi and ]
+ [ [ [ class1>> ] [ class2>> ] bi compare-classes ] [ result>> ] bi eq? ]
} 1&& ;
-TUPLE: depends-on-classes-disjoint class1 class2 ;
+TUPLE: depends-on-instance-predicate object class result ;
-: depends-on-classes-disjoint ( class1 class2 -- )
- \ depends-on-classes-disjoint add-conditional-dependency ;
+: depends-on-instance-predicate ( object class result -- )
+ \ depends-on-instance-predicate add-conditional-dependency ;
-M: depends-on-classes-disjoint satisfied?
+M: depends-on-instance-predicate satisfied?
{
- [ class1>> classoid? ]
- [ class2>> classoid? ]
- [ [ class1>> ] [ class2>> ] bi classes-intersect? not ]
+ [ class>> classoid? ]
+ [ [ [ object>> ] [ class>> ] bi instance? ] [ result>> ] bi eq? ]
} 1&& ;
TUPLE: depends-on-next-method class generic next-method ;
@@ -122,6 +134,15 @@ TUPLE: depends-on-flushable word ;
M: depends-on-flushable satisfied?
word>> flushable? ;
+TUPLE: depends-on-final class ;
+
+: depends-on-final ( word -- )
+ [ depends-on-conditionally ]
+ [ \ depends-on-final add-conditional-dependency ] bi ;
+
+M: depends-on-final satisfied?
+ class>> final-class? ;
+
: init-dependencies ( -- )
H{ } clone dependencies set
H{ } clone generic-dependencies set
diff --git a/basis/stack-checker/errors/errors-docs.factor b/basis/stack-checker/errors/errors-docs.factor
index 4b432e733f..9aa7ed0d14 100644
--- a/basis/stack-checker/errors/errors-docs.factor
+++ b/basis/stack-checker/errors/errors-docs.factor
@@ -134,10 +134,10 @@ HELP: inconsistent-recursive-call-error
} ;
ARTICLE: "inference-errors" "Stack checker errors"
-"These " { $link "inference" } " failure conditions are reported in one of two ways:"
+"Stack effect checking failure conditions are reported in one of two ways:"
{ $list
- { { $link "tools.inference" } " throws them as errors" }
- { "The " { $link "compiler" } " reports them via " { $link "tools.errors" } }
+ { { $link "tools.inference" } " report them when fed quotations interactively" }
+ { "The " { $link "compiler" } " reports them while compiling words, via the " { $link "tools.errors" } " mechanism" }
}
"Errors thrown when insufficient information is available to calculate the stack effect of a call to a combinator or macro (see " { $link "inference-combinators" } "):"
{ $subsections
diff --git a/basis/stack-checker/known-words/known-words.factor b/basis/stack-checker/known-words/known-words.factor
index 4bf7dfe0fd..e93dca9072 100644
--- a/basis/stack-checker/known-words/known-words.factor
+++ b/basis/stack-checker/known-words/known-words.factor
@@ -652,15 +652,15 @@ M: bad-executable summary
\ fgetc { alien } { object } define-primitive
-\ fwrite { string alien } { } define-primitive
+\ fwrite { c-ptr integer alien } { } define-primitive
\ fputc { object alien } { } define-primitive
-\ fread { integer string } { object } define-primitive
+\ fread { integer alien } { object } define-primitive
\ fflush { alien } { } define-primitive
-\ fseek { alien integer integer } { } define-primitive
+\ fseek { integer integer alien } { } define-primitive
\ ftell { alien } { integer } define-primitive
diff --git a/basis/syndication/syndication.factor b/basis/syndication/syndication.factor
index e30cd6826c..fe31a49265 100644
--- a/basis/syndication/syndication.factor
+++ b/basis/syndication/syndication.factor
@@ -70,7 +70,8 @@ TUPLE: entry title url description date ;
tri ;
: atom-entry-link ( tag -- url/f )
- "link" tags-named [ "rel" attr "alternate" = ] find nip
+ "link" tags-named
+ [ "rel" attr { f "alternate" } member? ] find nip
dup [ "href" attr >url ] when ;
: atom1.0-entry ( tag -- entry )
diff --git a/basis/system-info/linux/linux.factor b/basis/system-info/linux/linux.factor
index 0c21597a2f..1a565705fb 100644
--- a/basis/system-info/linux/linux.factor
+++ b/basis/system-info/linux/linux.factor
@@ -7,7 +7,7 @@ SPECIALIZED-ARRAY: char
IN: system-info.linux
: (uname) ( buf -- int )
- int f "uname" { char* } alien-invoke ;
+ int f "uname" { c-string } alien-invoke ;
: uname ( -- seq )
65536 [ (uname) io-error ] keep
diff --git a/basis/system-info/linux/platforms.txt b/basis/system-info/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/system-info/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/system-info/linux/tags.txt b/basis/system-info/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/system-info/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/system-info/macosx/platforms.txt b/basis/system-info/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/system-info/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/system-info/macosx/tags.txt b/basis/system-info/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/system-info/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/system-info/windows/ce/platforms.txt b/basis/system-info/windows/ce/platforms.txt
new file mode 100644
index 0000000000..cd0d980f6f
--- /dev/null
+++ b/basis/system-info/windows/ce/platforms.txt
@@ -0,0 +1 @@
+wince
diff --git a/basis/system-info/windows/ce/tags.txt b/basis/system-info/windows/ce/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/system-info/windows/ce/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/system-info/windows/nt/platforms.txt b/basis/system-info/windows/nt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/system-info/windows/nt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/system-info/windows/nt/tags.txt b/basis/system-info/windows/nt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/system-info/windows/nt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/system-info/windows/platforms.txt b/basis/system-info/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/system-info/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/system-info/windows/tags.txt b/basis/system-info/windows/tags.txt
deleted file mode 100755
index 6bf68304bb..0000000000
--- a/basis/system-info/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/tools/cocoa/platforms.txt b/basis/tools/cocoa/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/tools/cocoa/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/tools/cocoa/tags.txt b/basis/tools/cocoa/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/tools/cocoa/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/tools/crossref/crossref.factor b/basis/tools/crossref/crossref.factor
index 3bdf2f83ae..30ec4b2b65 100644
--- a/basis/tools/crossref/crossref.factor
+++ b/basis/tools/crossref/crossref.factor
@@ -61,18 +61,17 @@ M: pathname uses string>> source-file top-level-form>> [ uses ] [ { } ] if* ;
! To make UI browser happy
M: vocab uses drop f ;
-GENERIC: crossref-def ( defspec -- )
-
-M: object crossref-def
+: crossref-def ( defspec -- )
dup uses crossref get add-vertex ;
-M: word crossref-def
- [ call-next-method ] [ subwords [ crossref-def ] each ] bi ;
-
: defs-to-crossref ( -- seq )
[
all-words
+ [ [ generic? not ] filter ]
+ [ [ subwords ] map concat ] bi
+
all-articles [ >link ] map
+
source-files get keys [ ] map
] append-outputs ;
diff --git a/basis/tools/deploy/backend/backend.factor b/basis/tools/deploy/backend/backend.factor
index fe8049e9e3..9f25808c9e 100644
--- a/basis/tools/deploy/backend/backend.factor
+++ b/basis/tools/deploy/backend/backend.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2007, 2009 Slava Pestov.
+! Copyright (C) 2007, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: namespaces make continuations.private kernel.private init
assocs kernel vocabs words sequences memory io system arrays
@@ -7,21 +7,27 @@ summary layouts vocabs.loader prettyprint.config prettyprint debugger
io.streams.c io.files io.files.temp io.pathnames io.directories
io.directories.hierarchy io.backend quotations io.launcher
tools.deploy.config tools.deploy.config.editor bootstrap.image
-io.encodings.utf8 destructors accessors hashtables ;
+io.encodings.utf8 destructors accessors hashtables
+tools.deploy.libraries vocabs.metadata.resources ;
IN: tools.deploy.backend
: copy-vm ( executable bundle-name -- vm )
prepend-path vm over copy-file ;
-CONSTANT: theme-path "basis/ui/gadgets/theme/"
+TUPLE: vocab-manifest vocabs libraries ;
-: copy-theme ( name dir -- )
- deploy-ui? get [
- append-path
- theme-path append-path
- [ make-directories ]
- [ theme-path "resource:" prepend swap copy-tree ] bi
- ] [ 2drop ] if ;
+: copy-resources ( manifest name dir -- )
+ append-path swap vocabs>> [ copy-vocab-resources ] with each ;
+
+ERROR: can't-deploy-library-file library ;
+
+: copy-library ( dir library -- )
+ dup find-library-file
+ [ swap over file-name append-path copy-file ]
+ [ can't-deploy-library-file ] ?if ;
+
+: copy-libraries ( manifest name dir -- )
+ append-path swap libraries>> [ copy-library ] with each ;
: image-name ( vocab bundle-name -- str )
prepend-path ".image" append ;
@@ -89,7 +95,7 @@ DEFER: ?make-staging-image
[ "deploy-config-" prepend temp-file ] bi
[ utf8 set-file-contents ] keep ;
-: deploy-command-line ( image vocab config -- flags )
+: deploy-command-line ( image vocab manifest-file config -- flags )
[
bootstrap-profile ?make-staging-image
@@ -97,6 +103,7 @@ DEFER: ?make-staging-image
"-i=" bootstrap-profile staging-image-name append ,
"-resource-path=" "" resource-path append ,
"-run=tools.deploy.shaker" ,
+ "-vocab-manifest-out=" prepend ,
[ "-deploy-vocab=" prepend , ]
[ make-deploy-config "-deploy-config=" prepend , ] bi
"-output-image=" prepend ,
@@ -104,8 +111,16 @@ DEFER: ?make-staging-image
] { } make
] bind ;
-: make-deploy-image ( vm image vocab config -- )
+: parse-vocab-manifest-file ( path -- vocab-manifest )
+ utf8 file-lines
+ dup first "VOCABS:" =
+ [ { "LIBRARIES:" } split1 vocab-manifest boa ]
+ [ "invalid vocab manifest!" throw ] if ;
+
+: make-deploy-image ( vm image vocab config -- manifest )
make-boot-image
- deploy-command-line run-factor ;
+ over "vocab-manifest-" prepend temp-file
+ [ swap deploy-command-line run-factor ]
+ [ parse-vocab-manifest-file ] bi ;
HOOK: deploy* os ( vocab -- )
diff --git a/basis/tools/deploy/config/config-docs.factor b/basis/tools/deploy/config/config-docs.factor
index 1df76856ba..740abb0feb 100644
--- a/basis/tools/deploy/config/config-docs.factor
+++ b/basis/tools/deploy/config/config-docs.factor
@@ -36,7 +36,7 @@ $nl
"Off by default. During normal execution, the word definition quotation of a word compiled with the optimizing compiler is not used, so disabling this flag can save space. However, some libraries introspect word definitions dynamically (for example, " { $vocab-link "inverse" } ") and so programs using these libraries must retain word definition quotations." } ;
HELP: deploy-c-types?
-{ $description "Deploy flag. If set, the deploy tool retains the " { $link c-types } " table, otherwise this table is stripped out, saving space."
+{ $description "Deploy flag. If set, the deploy tool retains word properties containing metadata for C types and struct classes; otherwise, these properties are stripped out, saving space."
$nl
"Off by default."
$nl
@@ -49,7 +49,7 @@ $nl
{ $link malloc-object }
{ $link malloc-array }
}
-"If your program looks up C types dynamically or from words which do not have a stack effect, you must enable this flag, because in these situations the C type lookup is not folded away and the global table must be consulted at runtime." } ;
+"If your program looks up C types dynamically or from words which do not have a stack effect, you must enable this flag, because in these situations the C type lookup code is not folded away and the word properties must be consulted at runtime." } ;
HELP: deploy-math?
{ $description "Deploy flag. If set, the deployed image will contain support for " { $link ratio } " and " { $link complex } " types."
diff --git a/basis/tools/deploy/config/editor/editor.factor b/basis/tools/deploy/config/editor/editor.factor
index 78d86a4707..e10d20e8b3 100644
--- a/basis/tools/deploy/config/editor/editor.factor
+++ b/basis/tools/deploy/config/editor/editor.factor
@@ -1,7 +1,8 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: assocs io.pathnames kernel parser prettyprint sequences
-splitting tools.deploy.config vocabs.loader vocabs.metadata ;
+USING: assocs io.pathnames kernel parser prettyprint
+prettyprint.config sequences splitting tools.deploy.config
+vocabs.loader vocabs.metadata ;
IN: tools.deploy.config.editor
: deploy-config-path ( vocab -- string )
@@ -13,7 +14,7 @@ IN: tools.deploy.config.editor
parse-fresh [ first assoc-union ] unless-empty ;
: set-deploy-config ( assoc vocab -- )
- [ unparse-use string-lines ] dip
+ [ [ unparse-use ] without-limits string-lines ] dip
dup deploy-config-path set-vocab-file-contents ;
: set-deploy-flag ( value key vocab -- )
diff --git a/basis/tools/deploy/deploy-docs.factor b/basis/tools/deploy/deploy-docs.factor
old mode 100644
new mode 100755
index 948db1c833..976fc25357
--- a/basis/tools/deploy/deploy-docs.factor
+++ b/basis/tools/deploy/deploy-docs.factor
@@ -7,8 +7,14 @@ ARTICLE: "prepare-deploy" "Preparing to deploy an application"
{ $subsections
"deploy-config"
"deploy-flags"
+ "deploy-resources"
} ;
+ARTICLE: "deploy-resources" "Deployed resource files"
+"To include additional files in your deployed application, specify their names in a vocabulary's " { $snippet "resources.txt" } " file. The " { $snippet "resources.txt" } " file contains one glob pattern per line. These patterns are expanded relative to the vocabulary directory; files outside of the vocabulary directory cannot be referenced. If a file inside the vocabulary directory matches any of these patterns, it will be included in deployed applications that reference the vocabulary. If a subdirectory matches, its contents will be included recursively."
+$nl
+"If the deployed vocabulary includes an icon file for the current platform, it will be embedded in the deployed application as its GUI icon. See " { $link "vocabs.icons" } "." ;
+
ARTICLE: "tools.deploy.usage" "Deploy tool usage"
"Once the necessary deployment flags have been set, the application can be deployed:"
{ $subsections deploy }
diff --git a/basis/tools/deploy/deploy-tests.factor b/basis/tools/deploy/deploy-tests.factor
index 987b4aa8a1..4f470af202 100644
--- a/basis/tools/deploy/deploy-tests.factor
+++ b/basis/tools/deploy/deploy-tests.factor
@@ -1,125 +1,129 @@
-USING: tools.test system io io.encodings.ascii io.pathnames
-io.files io.files.info io.files.temp kernel tools.deploy.config
-tools.deploy.config.editor tools.deploy.backend math sequences
-io.launcher arrays namespaces continuations layouts accessors
-urls math.parser io.directories tools.deploy.test ;
-IN: tools.deploy.tests
-
-[ ] [ "hello-world" shake-and-bake 500000 small-enough? ] unit-test
-
-[ ] [ "sudoku" shake-and-bake 800000 small-enough? ] unit-test
-
-[ ] [ "hello-ui" shake-and-bake 1300000 small-enough? ] unit-test
-
-[ "staging.math-threads-compiler-ui.image" ] [
- "hello-ui" deploy-config
- [ bootstrap-profile staging-image-name file-name ] bind
-] unit-test
-
-[ ] [ "maze" shake-and-bake 1200000 small-enough? ] unit-test
-
-[ ] [ "tetris" shake-and-bake 1500000 small-enough? ] unit-test
-
-[ ] [ "spheres" shake-and-bake 1500000 small-enough? ] unit-test
-
-[ ] [ "terrain" shake-and-bake 1700000 small-enough? ] unit-test
-
-[ ] [ "bunny" shake-and-bake 2500000 small-enough? ] unit-test
-
-os macosx? [
- [ ] [ "webkit-demo" shake-and-bake 500000 small-enough? ] unit-test
-] when
-
-[ ] [ "benchmark.regex-dna" shake-and-bake 900000 small-enough? ] unit-test
-
-{
- "tools.deploy.test.1"
- "tools.deploy.test.2"
- "tools.deploy.test.3"
- "tools.deploy.test.4"
-} [
- [ ] swap [
- shake-and-bake
- run-temp-image
- ] curry unit-test
-] each
-
-USING: http.client http.server http.server.dispatchers
-http.server.responses http.server.static io.servers.connection ;
-
-SINGLETON: quit-responder
-
-M: quit-responder call-responder*
- 2drop stop-this-server "Goodbye" "text/html" ;
-
-: add-quot-responder ( responder -- responder )
- quit-responder "quit" add-responder ;
-
-: test-httpd ( responder -- )
- [
- main-responder set
-
- 0 >>insecure
- f >>secure
- dup start-server*
- sockets>> first addr>> port>>
- dup number>string "resource:temp/port-number" ascii set-file-contents
- ] with-scope
- "port" set ;
-
-[ ] [
-
- add-quot-responder
- "vocab:http/test" >>default
-
- test-httpd
-] unit-test
-
-[ ] [
- "tools.deploy.test.5" shake-and-bake
- run-temp-image
-] unit-test
-
-: add-port ( url -- url' )
- >url clone "port" get >>port ;
-
-[ ] [ "http://localhost/quit" add-port http-get 2drop ] unit-test
-
-{
- "tools.deploy.test.6"
- "tools.deploy.test.7"
- "tools.deploy.test.9"
- "tools.deploy.test.10"
- "tools.deploy.test.11"
- "tools.deploy.test.12"
-} [
- [ ] swap [
- shake-and-bake
- run-temp-image
- ] curry unit-test
-] each
-
-os windows? os macosx? or [
- [ ] [ "tools.deploy.test.8" shake-and-bake run-temp-image ] unit-test
-] when
-
-os macosx? [
- [ ] [ "tools.deploy.test.14" shake-and-bake run-temp-image ] unit-test
-] when
-
-[ { "a" "b" "c" } ] [
- "tools.deploy.test.15" shake-and-bake deploy-test-command
- { "a" "b" "c" } append
- ascii [ lines ] with-process-reader
- rest
-] unit-test
-
-[ ] [ "tools.deploy.test.16" shake-and-bake run-temp-image ] unit-test
-
-[ ] [ "tools.deploy.test.17" shake-and-bake run-temp-image ] unit-test
-
-[ t ] [
- "tools.deploy.test.18" shake-and-bake
- deploy-test-command ascii [ readln ] with-process-reader
- "test.image" temp-file =
-] unit-test
+USING: tools.test system io io.encodings.ascii io.pathnames
+io.files io.files.info io.files.temp kernel tools.deploy.config
+tools.deploy.config.editor tools.deploy.backend math sequences
+io.launcher arrays namespaces continuations layouts accessors
+urls math.parser io.directories tools.deploy.test ;
+IN: tools.deploy.tests
+
+[ ] [ "hello-world" shake-and-bake 500000 small-enough? ] unit-test
+
+[ ] [ "sudoku" shake-and-bake 800000 small-enough? ] unit-test
+
+[ ] [ "hello-ui" shake-and-bake 1300000 small-enough? ] unit-test
+
+[ "staging.math-threads-compiler-ui.image" ] [
+ "hello-ui" deploy-config
+ [ bootstrap-profile staging-image-name file-name ] bind
+] unit-test
+
+[ ] [ "maze" shake-and-bake 1200000 small-enough? ] unit-test
+
+[ ] [ "tetris" shake-and-bake 1500000 small-enough? ] unit-test
+
+[ ] [ "spheres" shake-and-bake 1500000 small-enough? ] unit-test
+
+[ ] [ "terrain" shake-and-bake 1700000 small-enough? ] unit-test
+
+[ ] [ "gpu.demos.raytrace" shake-and-bake 2500000 small-enough? ] unit-test
+
+[ ] [ "bunny" shake-and-bake 2500000 small-enough? ] unit-test
+
+[ ] [ "gpu.demos.bunny" shake-and-bake 3500000 small-enough? ] unit-test
+
+os macosx? [
+ [ ] [ "webkit-demo" shake-and-bake 500000 small-enough? ] unit-test
+] when
+
+[ ] [ "benchmark.regex-dna" shake-and-bake 900000 small-enough? ] unit-test
+
+{
+ "tools.deploy.test.1"
+ "tools.deploy.test.2"
+ "tools.deploy.test.3"
+ "tools.deploy.test.4"
+} [
+ [ ] swap [
+ shake-and-bake
+ run-temp-image
+ ] curry unit-test
+] each
+
+USING: http.client http.server http.server.dispatchers
+http.server.responses http.server.static io.servers.connection ;
+
+SINGLETON: quit-responder
+
+M: quit-responder call-responder*
+ 2drop stop-this-server "Goodbye" "text/html" ;
+
+: add-quot-responder ( responder -- responder )
+ quit-responder "quit" add-responder ;
+
+: test-httpd ( responder -- )
+ [
+ main-responder set
+
+ 0 >>insecure
+ f >>secure
+ dup start-server*
+ sockets>> first addr>> port>>
+ dup number>string "resource:temp/port-number" ascii set-file-contents
+ ] with-scope
+ "port" set ;
+
+[ ] [
+
+ add-quot-responder
+ "vocab:http/test" >>default
+
+ test-httpd
+] unit-test
+
+[ ] [
+ "tools.deploy.test.5" shake-and-bake
+ run-temp-image
+] unit-test
+
+: add-port ( url -- url' )
+ >url clone "port" get >>port ;
+
+[ ] [ "http://localhost/quit" add-port http-get 2drop ] unit-test
+
+{
+ "tools.deploy.test.6"
+ "tools.deploy.test.7"
+ "tools.deploy.test.9"
+ "tools.deploy.test.10"
+ "tools.deploy.test.11"
+ "tools.deploy.test.12"
+} [
+ [ ] swap [
+ shake-and-bake
+ run-temp-image
+ ] curry unit-test
+] each
+
+os windows? os macosx? or [
+ [ ] [ "tools.deploy.test.8" shake-and-bake run-temp-image ] unit-test
+] when
+
+os macosx? [
+ [ ] [ "tools.deploy.test.14" shake-and-bake run-temp-image ] unit-test
+] when
+
+[ { "a" "b" "c" } ] [
+ "tools.deploy.test.15" shake-and-bake deploy-test-command
+ { "a" "b" "c" } append
+ ascii [ lines ] with-process-reader
+ rest
+] unit-test
+
+[ ] [ "tools.deploy.test.16" shake-and-bake run-temp-image ] unit-test
+
+[ ] [ "tools.deploy.test.17" shake-and-bake run-temp-image ] unit-test
+
+[ t ] [
+ "tools.deploy.test.18" shake-and-bake
+ deploy-test-command ascii [ readln ] with-process-reader
+ "test.image" temp-file =
+] unit-test
diff --git a/basis/tools/deploy/libraries/libraries.factor b/basis/tools/deploy/libraries/libraries.factor
new file mode 100644
index 0000000000..36fe3037de
--- /dev/null
+++ b/basis/tools/deploy/libraries/libraries.factor
@@ -0,0 +1,11 @@
+! (c)2010 Joe Groff bsd license
+USING: alien.libraries io.pathnames io.pathnames.private kernel
+system vocabs.loader ;
+IN: tools.deploy.libraries
+
+HOOK: find-library-file os ( file -- path )
+
+os windows?
+"tools.deploy.libraries.windows"
+"tools.deploy.libraries.unix" ? require
+
diff --git a/basis/tools/deploy/libraries/unix/platforms.txt b/basis/tools/deploy/libraries/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/tools/deploy/libraries/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/tools/deploy/libraries/unix/unix.factor b/basis/tools/deploy/libraries/unix/unix.factor
new file mode 100644
index 0000000000..db3e9fa134
--- /dev/null
+++ b/basis/tools/deploy/libraries/unix/unix.factor
@@ -0,0 +1,16 @@
+! (c)2010 Joe Groff bsd license
+USING: io.files io.pathnames io.pathnames.private kernel
+sequences system tools.deploy.libraries ;
+IN: tools.deploy.libraries.unix
+
+! stupid hack. better ways to find the library name would be open the library,
+! note a symbol address found in the library, then call dladdr (or use
+: ?exists ( path -- path/f )
+ dup exists? [ drop f ] unless ; inline
+
+M: unix find-library-file
+ dup absolute-path? [ ?exists ] [
+ { "/lib" "/usr/lib" "/usr/local/lib" "/opt/local/lib" "resource:" }
+ [ prepend-path ?exists ] with map-find drop
+ ] if ;
+
diff --git a/basis/tools/deploy/libraries/windows/platforms.txt b/basis/tools/deploy/libraries/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/tools/deploy/libraries/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/tools/deploy/libraries/windows/windows.factor b/basis/tools/deploy/libraries/windows/windows.factor
new file mode 100644
index 0000000000..4698754f07
--- /dev/null
+++ b/basis/tools/deploy/libraries/windows/windows.factor
@@ -0,0 +1,16 @@
+! (c)2010 Joe Groff bsd license
+USING: alien.strings byte-arrays io.encodings.utf16n kernel
+specialized-arrays system tools.deploy.libraries windows.kernel32
+windows.types ;
+FROM: alien.c-types => ushort ;
+SPECIALIZED-ARRAY: ushort
+IN: tools.deploy.libraries.windows
+
+M: windows find-library-file
+ f DONT_RESOLVE_DLL_REFERENCES LoadLibraryEx [
+ [
+ 32768 (ushort-array) [ 32768 GetModuleFileName drop ] keep
+ utf16n alien>string
+ ] [ FreeLibrary drop ] bi
+ ] [ f ] if* ;
+
diff --git a/basis/tools/deploy/macosx/macosx.factor b/basis/tools/deploy/macosx/macosx.factor
index f753e38fb2..c02642ba1d 100644
--- a/basis/tools/deploy/macosx/macosx.factor
+++ b/basis/tools/deploy/macosx/macosx.factor
@@ -6,7 +6,7 @@ sequences system tools.deploy.backend tools.deploy.config
tools.deploy.config.editor assocs hashtables prettyprint
io.backend.unix cocoa io.encodings.utf8 io.backend
cocoa.application cocoa.classes cocoa.plists
-combinators ;
+combinators vocabs.metadata vocabs.loader ;
IN: tools.deploy.macosx
: bundle-dir ( -- dir )
@@ -16,7 +16,7 @@ IN: tools.deploy.macosx
[ bundle-dir prepend-path swap ] keep
"Contents" prepend-path append-path copy-tree ;
-: app-plist ( executable bundle-name -- assoc )
+: app-plist ( icon? executable bundle-name -- assoc )
[
"6.0" "CFBundleInfoDictionaryVersion" set
"APPL" "CFBundlePackageType" set
@@ -25,9 +25,11 @@ IN: tools.deploy.macosx
[ "CFBundleExecutable" set ]
[ "org.factor." prepend "CFBundleIdentifier" set ] bi
+
+ [ "Icon.icns" "CFBundleIconFile" set ] when
] H{ } make-assoc ;
-: create-app-plist ( executable bundle-name -- )
+: create-app-plist ( icon? executable bundle-name -- )
[ app-plist ] keep
"Contents/Info.plist" append-path
write-plist ;
@@ -40,17 +42,24 @@ IN: tools.deploy.macosx
"Resources/English.lproj/MiniFactor.nib" copy-bundle-dir
] [ drop ] if ;
+: copy-icns ( vocab bundle-name -- icon? )
+ swap dup vocab-mac-icon-path vocab-append-path dup exists?
+ [ swap "Contents/Resources/Icon.icns" append-path copy-file t ]
+ [ 2drop f ] if ;
+
: create-app-dir ( vocab bundle-name -- vm )
- [
- nip {
- [ copy-dll ]
- [ copy-nib ]
- [ "Contents/Resources" append-path make-directories ]
- [ "Contents/Resources" copy-theme ]
- } cleave
- ]
- [ create-app-plist ]
- [ "Contents/MacOS/" append-path copy-vm ] 2tri
+ {
+ [
+ nip {
+ [ copy-dll ]
+ [ copy-nib ]
+ [ "Contents/Resources" append-path make-directories ]
+ } cleave
+ ]
+ [ copy-icns ]
+ [ create-app-plist ]
+ [ "Contents/MacOS/" append-path copy-vm ]
+ } 2cleave
dup OCT: 755 set-file-permissions ;
: deploy.app-image ( vocab bundle-name -- str )
@@ -72,6 +81,9 @@ M: macosx deploy* ( vocab -- )
[ bundle-name create-app-dir ] keep
[ bundle-name deploy.app-image ] keep
namespace make-deploy-image
+ bundle-name
+ [ "Contents/Resources" copy-resources ]
+ [ "Contents/Frameworks" copy-libraries ] 2bi
bundle-name show-in-finder
] bind
] with-directory ;
diff --git a/basis/tools/deploy/macosx/platforms.txt b/basis/tools/deploy/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/tools/deploy/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/tools/deploy/macosx/tags.txt b/basis/tools/deploy/macosx/tags.txt
index 660d511420..ef1aab0d0e 100644
--- a/basis/tools/deploy/macosx/tags.txt
+++ b/basis/tools/deploy/macosx/tags.txt
@@ -1,2 +1 @@
-unportable
tools
diff --git a/basis/tools/deploy/shaker/shaker.factor b/basis/tools/deploy/shaker/shaker.factor
index 1060853343..9a5f89fae0 100755
--- a/basis/tools/deploy/shaker/shaker.factor
+++ b/basis/tools/deploy/shaker/shaker.factor
@@ -1,13 +1,13 @@
! Copyright (C) 2007, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: arrays accessors io.backend io.pathnames io.streams.c
-init fry namespaces math make assocs kernel parser parser.notes
-lexer strings.parser vocabs sequences sequences.deep
+USING: arrays alien.libraries accessors io.backend io.encodings.utf8 io.files
+io.streams.c init fry namespaces math make assocs kernel parser
+parser.notes lexer strings.parser vocabs sequences sequences.deep
sequences.private words memory kernel.private continuations io
vocabs.loader system strings sets vectors quotations byte-arrays
sorting compiler.units definitions generic generic.standard
generic.single tools.deploy.config combinators classes
-classes.builtin slots.private grouping command-line ;
+classes.builtin slots.private grouping command-line io.pathnames ;
QUALIFIED: bootstrap.stage2
QUALIFIED: classes.private
QUALIFIED: compiler.crossref
@@ -19,6 +19,7 @@ QUALIFIED: layouts
QUALIFIED: source-files
QUALIFIED: source-files.errors
QUALIFIED: vocabs
+FROM: alien.libraries.private => >deployed-library-path ;
IN: tools.deploy.shaker
! This file is some hairy shit.
@@ -61,6 +62,13 @@ IN: tools.deploy.shaker
run-file
] when ;
+: strip-ui-error-hook ( -- )
+ strip-debugger? deploy-ui? get and "ui" vocab and [
+ "Installing generic UI error hook" show
+ "vocab:tools/deploy/shaker/strip-ui-error-hook.factor"
+ run-file
+ ] when ;
+
: strip-libc ( -- )
"libc" vocab [
"Stripping manual memory management debug code" show
@@ -371,16 +379,8 @@ IN: tools.deploy.shaker
compiler.errors:compiler-errors
continuations:thread-error-hook
} %
-
- deploy-ui? get [
- "ui-error-hook" "ui.gadgets.worlds" lookup ,
- ] when
] when
- deploy-c-types? get [
- "c-types" "alien.c-types" lookup ,
- ] unless
-
"windows-messages" "windows.messages" lookup [ , ] when*
] { } make ;
@@ -466,7 +466,8 @@ SYMBOL: deploy-vocab
: startup-stripper ( -- )
t "quiet" set-global
- f output-stream set-global ;
+ f output-stream set-global
+ V{ "resource:" } clone vocab-roots set-global ;
: next-method* ( method -- quot )
[ "method-class" word-prop ]
@@ -502,13 +503,36 @@ SYMBOL: deploy-vocab
"Clearing megamorphic caches" show
[ clear-megamorphic-cache ] each ;
-: strip ( -- )
+: write-vocab-manifest ( vocab-manifest-out -- )
+ "Writing vocabulary manifest to " write dup print flush
+ vocabs "VOCABS:" prefix
+ deploy-libraries get [ libraries get at path>> ] map prune "LIBRARIES:" prefix append
+ swap utf8 set-file-lines ;
+
+: prepare-deploy-libraries ( -- )
+ "Preparing deployed libraries" show
+ deploy-libraries get [
+ libraries get [
+ [ path>> >deployed-library-path ] [ abi>> ] bi
+ ] change-at
+ ] each
+
+ [
+ "deploy-libraries" "alien.libraries" lookup forget
+ "deploy-library" "alien.libraries" lookup forget
+ ">deployed-library-path" "alien.libraries.private" lookup forget
+ ] with-compilation-unit ;
+
+: strip ( vocab-manifest-out -- )
+ [ write-vocab-manifest ] when*
startup-stripper
+ prepare-deploy-libraries
strip-libc
strip-destructors
strip-call
strip-cocoa
strip-debugger
+ strip-ui-error-hook
strip-specialized-arrays
compute-next-methods
strip-startup-hooks
@@ -536,7 +560,7 @@ SYMBOL: deploy-vocab
1 exit
] recover ; inline
-: (deploy) ( final-image vocab config -- )
+: (deploy) ( final-image vocab-manifest-out vocab config -- )
#! Does the actual work of a deployment in the slave
#! stage2 image
[
@@ -549,11 +573,11 @@ SYMBOL: deploy-vocab
"ui.debugger" require
] when
] unless
- deploy-vocab set
- deploy-vocab get require
- deploy-vocab get vocab-main [
- "Vocabulary has no MAIN: word." print flush 1 exit
- ] unless
+ [ deploy-vocab set ] [ require ] [
+ vocab-main [
+ "Vocabulary has no MAIN: word." print flush 1 exit
+ ] unless
+ ] tri
strip
"Saving final image" show
save-image-and-exit
@@ -562,6 +586,7 @@ SYMBOL: deploy-vocab
: do-deploy ( -- )
"output-image" get
+ "vocab-manifest-out" get
"deploy-vocab" get
"Deploying " write dup write "..." print
"deploy-config" get parse-file first
diff --git a/basis/tools/deploy/shaker/strip-ui-error-hook.factor b/basis/tools/deploy/shaker/strip-ui-error-hook.factor
new file mode 100644
index 0000000000..2525145828
--- /dev/null
+++ b/basis/tools/deploy/shaker/strip-ui-error-hook.factor
@@ -0,0 +1,7 @@
+USING: namespaces tools.deploy.config fry sequences system kernel ui ui.gadgets.worlds ;
+
+deploy-name get "Factor" or '[
+ _ " encountered an unhandled error." append
+ "The application will now exit."
+ system-alert die
+] ui-error-hook set-global
diff --git a/basis/tools/deploy/test/14/platforms.txt b/basis/tools/deploy/test/14/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/tools/deploy/test/14/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/tools/deploy/test/14/tags.txt b/basis/tools/deploy/test/14/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/tools/deploy/test/14/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/tools/deploy/test/test.factor b/basis/tools/deploy/test/test.factor
index d8414baba7..bc458dde36 100644
--- a/basis/tools/deploy/test/test.factor
+++ b/basis/tools/deploy/test/test.factor
@@ -7,7 +7,7 @@ IN: tools.deploy.test
[ "test.image" temp-file delete-file ] ignore-errors
"resource:" [
[ vm "test.image" temp-file ] dip
- dup deploy-config make-deploy-image
+ dup deploy-config make-deploy-image drop
] with-directory ;
ERROR: image-too-big actual-size max-size ;
diff --git a/basis/tools/deploy/unix/platforms.txt b/basis/tools/deploy/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/tools/deploy/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/tools/deploy/unix/tags.txt b/basis/tools/deploy/unix/tags.txt
index 660d511420..ef1aab0d0e 100644
--- a/basis/tools/deploy/unix/tags.txt
+++ b/basis/tools/deploy/unix/tags.txt
@@ -1,2 +1 @@
-unportable
tools
diff --git a/basis/tools/deploy/unix/unix.factor b/basis/tools/deploy/unix/unix.factor
index f88cf06ef7..1b6b8596e2 100644
--- a/basis/tools/deploy/unix/unix.factor
+++ b/basis/tools/deploy/unix/unix.factor
@@ -7,7 +7,6 @@ tools.deploy.config.editor assocs hashtables prettyprint ;
IN: tools.deploy.unix
: create-app-dir ( vocab bundle-name -- vm )
- dup "" copy-theme
copy-vm
dup OCT: 755 set-file-permissions ;
@@ -20,6 +19,7 @@ M: unix deploy* ( vocab -- )
[ bundle-name create-app-dir ] keep
[ bundle-name image-name ] keep
namespace make-deploy-image
+ bundle-name "" [ copy-resources ] [ copy-libraries ] 3bi
bundle-name normalize-path [ "Binary deployed to " % % "." % ] "" make print
] bind
- ] with-directory ;
\ No newline at end of file
+ ] with-directory ;
diff --git a/basis/tools/deploy/windows/ico/ico.factor b/basis/tools/deploy/windows/ico/ico.factor
new file mode 100755
index 0000000000..46610c487d
--- /dev/null
+++ b/basis/tools/deploy/windows/ico/ico.factor
@@ -0,0 +1,72 @@
+USING: accessors alien alien.c-types arrays classes.struct combinators
+io.backend kernel locals math sequences specialized-arrays
+tools.deploy.windows windows.kernel32 windows.types ;
+IN: tools.deploy.windows.ico
+
+group-directory-entry ( ico i -- group )
+ [ {
+ [ Width>> ] [ Height>> ] [ Colors>> ] [ Reserved>> ]
+ [ Planes>> ] [ BitsPerPixel>> ] [ ImageSize>> ]
+ } cleave ] [ 1 + ] bi* group-directory-entry >c-ptr ; inline
+
+: ico-icon ( directory-entry bytes -- subbytes )
+ [ [ ImageOffset>> dup ] [ ImageSize>> + ] bi ] dip subseq ; inline
+
+:: ico-group-and-icons ( bytes -- group-bytes icon-bytes )
+ bytes ico-header memory>struct :> header
+
+ ico-header heap-size bytes
+ header ImageCount>> :> directory
+
+ directory dup length iota [ ico>group-directory-entry ] { } 2map-as
+ :> group-directory
+ directory [ bytes ico-icon ] { } map-as :> icon-bytes
+
+ header clone >c-ptr group-directory concat append
+ icon-bytes ; inline
+
+PRIVATE>
+
+:: embed-icon-resource ( exe ico-bytes id -- )
+ exe normalize-path 1 BeginUpdateResource :> hUpdate
+ hUpdate [
+ ico-bytes ico-group-and-icons :> ( group icons )
+ hUpdate RT_GROUP_ICON id 0 group dup byte-length
+ UpdateResource drop
+
+ icons [| icon i |
+ hUpdate RT_ICON i 1 + MAKEINTRESOURCE 0 icon dup byte-length
+ UpdateResource drop
+ ] each-index
+
+ hUpdate 0 EndUpdateResource drop
+ ] when ;
+
diff --git a/basis/tools/deploy/windows/ico/platforms.txt b/basis/tools/deploy/windows/ico/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/tools/deploy/windows/ico/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/tools/deploy/windows/platforms.txt b/basis/tools/deploy/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/tools/deploy/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/tools/deploy/windows/tags.txt b/basis/tools/deploy/windows/tags.txt
index 660d511420..ef1aab0d0e 100755
--- a/basis/tools/deploy/windows/tags.txt
+++ b/basis/tools/deploy/windows/tags.txt
@@ -1,2 +1 @@
-unportable
tools
diff --git a/basis/tools/deploy/windows/windows.factor b/basis/tools/deploy/windows/windows.factor
old mode 100644
new mode 100755
index f21f4ac363..f52154ccd0
--- a/basis/tools/deploy/windows/windows.factor
+++ b/basis/tools/deploy/windows/windows.factor
@@ -1,11 +1,16 @@
! Copyright (C) 2007, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: io io.files io.pathnames io.directories io.encodings.ascii kernel namespaces
+USING: io io.encodings.binary io.files io.pathnames io.directories
+io.encodings.ascii kernel namespaces
sequences locals system splitting tools.deploy.backend
tools.deploy.config tools.deploy.config.editor assocs hashtables
-prettyprint combinators windows.shell32 windows.user32 ;
+prettyprint combinators windows.kernel32 windows.shell32 windows.user32
+alien.c-types vocabs.metadata vocabs.loader tools.deploy.windows.ico
+io.files.windows.nt ;
IN: tools.deploy.windows
+CONSTANT: app-icon-resource-id "APPICON"
+
: copy-dll ( bundle-name -- )
"resource:factor.dll" swap copy-file-into ;
@@ -16,20 +21,28 @@ IN: tools.deploy.windows
: create-exe-dir ( vocab bundle-name -- vm )
dup copy-dll
- deploy-ui? get [
- [ "" copy-theme ] [ ".exe" copy-vm ] bi
- ] [ ".com" copy-vm ] if ;
+ deploy-ui? get ".exe" ".com" ? copy-vm ;
+
+: open-in-explorer ( dir -- )
+ [ f "open" ] dip absolute-path normalize-separators
+ f f SW_SHOWNORMAL ShellExecute drop ;
+
+: embed-ico ( vm vocab -- )
+ dup vocab-windows-icon-path vocab-append-path dup exists?
+ [ binary file-contents app-icon-resource-id embed-icon-resource ]
+ [ 2drop ] if ;
M: winnt deploy*
"resource:" [
dup deploy-config [
deploy-name get
- [
- [ create-exe-dir ]
+ {
+ [ create-exe-dir dup ]
+ [ drop embed-ico ]
[ image-name ]
- [ drop ]
- 2tri namespace make-deploy-image
- ]
- [ nip open-in-explorer ] 2bi
+ [ drop namespace make-deploy-image ]
+ [ nip "" [ copy-resources ] [ copy-libraries ] 3bi ]
+ [ nip open-in-explorer ]
+ } 2cleave
] bind
] with-directory ;
diff --git a/basis/tools/disassembler/gdb/tags.txt b/basis/tools/disassembler/gdb/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/tools/disassembler/gdb/tags.txt
+++ b/basis/tools/disassembler/gdb/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/tools/disassembler/udis/tags.txt b/basis/tools/disassembler/udis/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/tools/disassembler/udis/tags.txt
+++ b/basis/tools/disassembler/udis/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/tools/disassembler/udis/udis.factor b/basis/tools/disassembler/udis/udis.factor
index ee77268e22..ae8827e093 100644
--- a/basis/tools/disassembler/udis/udis.factor
+++ b/basis/tools/disassembler/udis/udis.factor
@@ -32,8 +32,8 @@ STRUCT: ud
{ inp_fill uchar }
{ inp_file void* }
{ inp_ctr uchar }
- { inp_buff uchar* }
- { inp_buff_end uchar* }
+ { inp_buff c-string }
+ { inp_buff_end c-string }
{ inp_end uchar }
{ translator void* }
{ insn_offset ulonglong }
@@ -83,19 +83,19 @@ CONSTANT: UD_VENDOR_INTEL 1
FUNCTION: void ud_init ( ud* u ) ;
FUNCTION: void ud_set_mode ( ud* u, uchar mode ) ;
FUNCTION: void ud_set_pc ( ud* u, ulonglong pc ) ;
-FUNCTION: void ud_set_input_buffer ( ud* u, uchar* offset, size_t size ) ;
+FUNCTION: void ud_set_input_buffer ( ud* u, c-string offset, size_t size ) ;
FUNCTION: void ud_set_vendor ( ud* u, uint vendor ) ;
FUNCTION: void ud_set_syntax ( ud* u, void* syntax ) ;
FUNCTION: void ud_input_skip ( ud* u, size_t size ) ;
FUNCTION: int ud_input_end ( ud* u ) ;
FUNCTION: uint ud_decode ( ud* u ) ;
FUNCTION: uint ud_disassemble ( ud* u ) ;
-FUNCTION: char* ud_insn_asm ( ud* u ) ;
+FUNCTION: c-string ud_insn_asm ( ud* u ) ;
FUNCTION: void* ud_insn_ptr ( ud* u ) ;
FUNCTION: ulonglong ud_insn_off ( ud* u ) ;
-FUNCTION: char* ud_insn_hex ( ud* u ) ;
+FUNCTION: c-string ud_insn_hex ( ud* u ) ;
FUNCTION: uint ud_insn_len ( ud* u ) ;
-FUNCTION: char* ud_lookup_mnemonic ( int c ) ;
+FUNCTION: c-string ud_lookup_mnemonic ( int c ) ;
: ( -- ud )
ud malloc-struct &free
diff --git a/basis/tools/files/tags.txt b/basis/tools/files/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/tools/files/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/tools/files/unix/platforms.txt b/basis/tools/files/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/tools/files/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/tools/files/unix/tags.txt b/basis/tools/files/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/tools/files/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/tools/files/windows/platforms.txt b/basis/tools/files/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/tools/files/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/tools/files/windows/tags.txt b/basis/tools/files/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/tools/files/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/tools/scaffold/scaffold-docs.factor b/basis/tools/scaffold/scaffold-docs.factor
index f4200f8cb2..4476f5ec9f 100644
--- a/basis/tools/scaffold/scaffold-docs.factor
+++ b/basis/tools/scaffold/scaffold-docs.factor
@@ -1,6 +1,6 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: help.markup help.syntax kernel strings words vocabs ;
+USING: help.markup help.syntax kernel strings words vocabs sequences ;
IN: tools.scaffold
HELP: developer-name
@@ -23,6 +23,30 @@ HELP: scaffold-undocumented
{ scaffold-help scaffold-undocumented } related-words
+HELP: scaffold-authors
+{ $values
+ { "vocab" "a vocabulary specifier" }
+}
+{ $description "Creates an authors.txt file using the value in " { $link developer-name } ". This word only works if no authors.txt file yet exists." } ;
+
+HELP: scaffold-summary
+{ $values
+ { "vocab" "a vocabulary specifier" } { "summary" string }
+}
+{ $description "Creates a summary.txt file with the given summary. This word only works if no summary.txt file yet exists." } ;
+
+HELP: scaffold-tags
+{ $values
+ { "vocab" "a vocabulary specifier" } { "tags" string }
+}
+{ $description "Creates a tags.txt file with the given tags. This word only works if no tags.txt file yet exists." } ;
+
+HELP: scaffold-tests
+{ $values
+ { "vocab" "a vocabulary specifier" }
+}
+{ $description "Takes an existing vocabulary and creates an empty tests file help for each word. This word only works if no tests file yet exists." } ;
+
HELP: scaffold-vocab
{ $values
{ "vocab-root" "a vocabulary root string" } { "string" string } }
diff --git a/basis/tools/scaffold/scaffold.factor b/basis/tools/scaffold/scaffold.factor
index 936d388b01..8fd3e53e19 100644
--- a/basis/tools/scaffold/scaffold.factor
+++ b/basis/tools/scaffold/scaffold.factor
@@ -2,11 +2,11 @@
! See http://factorcode.org/license.txt for BSD license.
USING: assocs io.files io.pathnames io.directories
io.encodings.utf8 hashtables kernel namespaces sequences
-vocabs.loader io combinators calendar accessors math.parser
-io.streams.string ui.tools.operations quotations strings arrays
-prettyprint words vocabs sorting sets classes math alien urls
-splitting ascii combinators.short-circuit alarms words.symbol
-system summary ;
+vocabs.loader vocabs.metadata io combinators calendar accessors
+math.parser io.streams.string ui.tools.operations quotations
+strings arrays prettyprint words vocabs sorting sets classes
+math alien urls splitting ascii combinators.short-circuit alarms
+words.symbol system summary ;
IN: tools.scaffold
SYMBOL: developer-name
@@ -15,7 +15,6 @@ SYMBOL: using
ERROR: not-a-vocab-root string ;
ERROR: vocab-name-contains-separator path ;
ERROR: vocab-name-contains-dot path ;
-ERROR: no-vocab vocab ;
ERROR: bad-developer-name name ;
M: bad-developer-name summary
@@ -40,9 +39,6 @@ M: bad-developer-name summary
: check-root ( string -- string )
dup vocab-root? [ not-a-vocab-root ] unless ;
-: check-vocab ( vocab -- vocab )
- dup find-vocab-root [ no-vocab ] unless ;
-
: check-vocab-root/vocab ( vocab-root string -- vocab-root string )
[ check-root ] [ check-vocab-name ] bi* ;
@@ -63,6 +59,9 @@ M: bad-developer-name summary
: vocab-root/vocab/suffix>path ( vocab-root vocab suffix -- path )
[ vocab-root/vocab>path dup file-name append-path ] dip append ;
+: vocab/file>path ( vocab file -- path )
+ [ vocab>path ] dip append-path ;
+
: vocab/suffix>path ( vocab suffix -- path )
[ vocab>path dup file-name append-path ] dip append ;
@@ -95,7 +94,7 @@ M: bad-developer-name summary
] with-string-writer ;
: set-scaffold-main-file ( vocab path -- )
- [ main-file-string ] dip utf8 set-file-contents ;
+ [ main-file-string 1array ] dip utf8 set-file-lines ;
: scaffold-main ( vocab-root vocab -- )
[ ".factor" vocab-root/vocab/suffix>path ] keep swap scaffolding? [
@@ -104,16 +103,17 @@ M: bad-developer-name summary
2drop
] if ;
-: scaffold-authors ( vocab-root vocab -- )
- developer-name get [
- "authors.txt" vocab-root/vocab/file>path scaffolding? [
- developer-name get swap utf8 set-file-contents
+: scaffold-metadata ( vocab file contents -- )
+ [ ensure-vocab-exists ] 2dip
+ [
+ [ vocab/file>path ] dip 1array swap scaffolding? [
+ utf8 set-file-lines
] [
- drop
+ 2drop
] if
] [
2drop
- ] if ;
+ ] if* ;
: lookup-type ( string -- object/string ? )
"new" ?head drop [ { [ CHAR: ' = ] [ digit? ] } 1|| ] trim-tail
@@ -258,12 +258,24 @@ PRIVATE>
: scaffold-undocumented ( string -- )
[ interesting-words. ] [ link-vocab ] bi ;
+: scaffold-authors ( vocab -- )
+ "authors.txt" developer-name get scaffold-metadata ;
+
+: scaffold-tags ( vocab tags -- )
+ [ "tags.txt" ] dip scaffold-metadata ;
+
+: scaffold-summary ( vocab summary -- )
+ [ "summary.txt" ] dip scaffold-metadata ;
+
+: scaffold-platforms ( vocab platforms -- )
+ [ "platforms.txt" ] dip scaffold-metadata ;
+
: scaffold-vocab ( vocab-root string -- )
{
[ scaffold-directory ]
[ scaffold-main ]
- [ scaffold-authors ]
[ nip require ]
+ [ nip scaffold-authors ]
} 2cleave ;
: scaffold-core ( string -- ) "resource:core" swap scaffold-vocab ;
diff --git a/basis/tools/scaffold/windows/platforms.txt b/basis/tools/scaffold/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/tools/scaffold/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/tools/scaffold/windows/tags.txt b/basis/tools/scaffold/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/tools/scaffold/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/tuple-arrays/tuple-arrays-docs.factor b/basis/tuple-arrays/tuple-arrays-docs.factor
index 5e70e15aa7..72a5ae4df3 100644
--- a/basis/tuple-arrays/tuple-arrays-docs.factor
+++ b/basis/tuple-arrays/tuple-arrays-docs.factor
@@ -3,20 +3,24 @@ USING: help.markup help.syntax sequences ;
HELP: TUPLE-ARRAY:
{ $syntax "TUPLE-ARRAY: class" }
+{ $values { "class" "a final tuple class" } }
{ $description "Generates a new data type in the current vocabulary named " { $snippet { $emphasis "class" } "-array" } " for holding instances of " { $snippet "class" } ", which must be a tuple class word. Together with the class itself, this also generates words named " { $snippet "<" { $emphasis "class" } "-array>" } " and " { $snippet ">" { $emphasis "class" } "-array" } ", for creating new instances of this tuple array type." } ;
ARTICLE: "tuple-arrays" "Tuple arrays"
-"The " { $vocab-link "tuple-arrays" } " vocabulary implements space-efficient unboxed tuple arrays. Whereas an ordinary array of tuples would consist of pointers to heap-allocated objects, a tuple array stores its elements inline. Calling " { $link nth } " copies an element into a new tuple, and calling " { $link set-nth } " copies an existing tuple's slots into an array."
+"The " { $vocab-link "tuple-arrays" } " vocabulary implements space-efficient unboxed tuple arrays. Whereas an ordinary array of tuples would consist of references to heap-allocated objects, a tuple array stores its elements as values."
$nl
-"Since value semantics differ from reference semantics, it is best to use tuple arrays with tuples where all slots are declared " { $link read-only } "."
+"Calling " { $link nth } " copies an element into a new tuple, and calling " { $link set-nth } " copies an existing tuple's slots into an array."
+$nl
+"Since value semantics are incompatible with inheritance, the base type of a tuple array must be declared " { $link POSTPONE: final } ". A best practice that is not enforced is to have all slots in the tuple declared " { $link read-only } "."
+$nl
+"Tuple arrays do not get updated if tuples are redefined to add or remove slots, so caution should be exercised when doing interactive development on code that uses tuple arrays."
$nl
-"Tuple arrays should not be used with inheritance; storing an instance of a subclass in a tuple array will slice off the subclass slots, and getting the same value out again will yield an instance of the superclass. Also, tuple arrays do not get updated if tuples are redefined to add or remove slots, so caution should be exercised when doing interactive development on code that uses tuple arrays."
{ $subsections POSTPONE: TUPLE-ARRAY: }
"An example:"
{ $example
"USE: tuple-arrays"
"IN: scratchpad"
- "TUPLE: point x y ;"
+ "TUPLE: point x y ; final"
"TUPLE-ARRAY: point"
"{ T{ point f 1 2 } T{ point f 1 3 } T{ point f 2 3 } } >point-array first short."
"T{ point f 1 2 }"
diff --git a/basis/tuple-arrays/tuple-arrays-tests.factor b/basis/tuple-arrays/tuple-arrays-tests.factor
index 2eeae20aa1..0fbf0eeaa0 100644
--- a/basis/tuple-arrays/tuple-arrays-tests.factor
+++ b/basis/tuple-arrays/tuple-arrays-tests.factor
@@ -1,9 +1,9 @@
USING: tuple-arrays sequences tools.test namespaces kernel
-math accessors ;
+math accessors classes.tuple eval ;
IN: tuple-arrays.tests
SYMBOL: mat
-TUPLE: foo bar ;
+TUPLE: foo bar ; final
C: foo
TUPLE-ARRAY: foo
@@ -18,15 +18,27 @@ TUPLE-ARRAY: foo
[ T{ foo } ] [ mat get first ] unit-test
[ T{ foo f 1 } ] [ T{ foo f 1 } 0 mat get [ set-nth ] keep first ] unit-test
-TUPLE: baz { bing integer } bong ;
+TUPLE: baz { bing integer } bong ; final
TUPLE-ARRAY: baz
[ 0 ] [ 1 first bing>> ] unit-test
[ f ] [ 1 first bong>> ] unit-test
-TUPLE: broken x ;
+TUPLE: broken x ; final
: broken ( -- ) ;
TUPLE-ARRAY: broken
-[ 100 ] [ 100 length ] unit-test
\ No newline at end of file
+[ 100 ] [ 100 length ] unit-test
+
+! Can't define a tuple array for a non-tuple class
+[ "IN: tuple-arrays.tests USING: tuple-arrays words ; TUPLE-ARRAY: word" eval( -- ) ]
+[ error>> not-a-tuple? ]
+must-fail-with
+
+! Can't define a tuple array for a non-final class
+TUPLE: non-final x ;
+
+[ "IN: tuple-arrays.tests USE: tuple-arrays TUPLE-ARRAY: non-final" eval( -- ) ]
+[ error>> not-final? ]
+must-fail-with
\ No newline at end of file
diff --git a/basis/tuple-arrays/tuple-arrays.factor b/basis/tuple-arrays/tuple-arrays.factor
index aea51f7820..1a3091c1e2 100644
--- a/basis/tuple-arrays/tuple-arrays.factor
+++ b/basis/tuple-arrays/tuple-arrays.factor
@@ -1,11 +1,13 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays combinators.smart fry functors kernel
kernel.private macros sequences combinators sequences.private
-stack-checker parser math classes.tuple.private ;
+stack-checker parser math classes.tuple classes.tuple.private ;
FROM: inverse => undo ;
IN: tuple-arrays
+ERROR: not-final class ;
+
] ;
@@ -29,6 +31,13 @@ MACRO: write-tuple ( class -- quot )
[ tuple-arity iota [ '[ [ _ ] dip set-nth-unsafe ] ] map '[ _ cleave ] ]
bi '[ _ dip @ ] ;
+: check-final ( class -- )
+ {
+ { [ dup tuple-class? not ] [ not-a-tuple ] }
+ { [ dup final-class? not ] [ not-final ] }
+ [ drop ]
+ } cond ;
+
PRIVATE>
FUNCTOR: define-tuple-array ( CLASS -- )
@@ -43,6 +52,8 @@ CLASS-array? IS ${CLASS-array}?
WHERE
+CLASS check-final
+
TUPLE: CLASS-array
{ seq array read-only }
{ n array-capacity read-only }
diff --git a/basis/typed/typed-docs.factor b/basis/typed/typed-docs.factor
index 0b6838379c..c6f80a48bc 100644
--- a/basis/typed/typed-docs.factor
+++ b/basis/typed/typed-docs.factor
@@ -58,10 +58,18 @@ HELP: output-mismatch-error
ARTICLE: "typed" "Strongly-typed word definitions"
"The Factor compiler supports advanced compiler optimizations that take advantage of the type information it can glean from source code. The " { $vocab-link "typed" } " vocabulary provides syntax that allows words to provide checked type information about their inputs and outputs and improve the performance of compiled code."
+$nl
+"Parameters and return values of typed words where the type is declared to be a " { $link POSTPONE: final } " tuple class with all slots " { $link read-only } " are passed by value."
{ $subsections
POSTPONE: TYPED:
POSTPONE: TYPED::
+}
+"Defining typed words at run time:"
+{ $subsections
define-typed
+}
+"Errors:"
+{ $subsections
input-mismatch-error
output-mismatch-error
} ;
diff --git a/basis/typed/typed-tests.factor b/basis/typed/typed-tests.factor
index f7b853cff7..28ec2b6e86 100644
--- a/basis/typed/typed-tests.factor
+++ b/basis/typed/typed-tests.factor
@@ -1,5 +1,6 @@
USING: accessors effects eval kernel layouts math namespaces
-quotations tools.test typed words ;
+quotations tools.test typed words words.symbol
+compiler.tree.debugger prettyprint ;
IN: typed.tests
TYPED: f+ ( a: float b: float -- c: float )
@@ -14,8 +15,8 @@ TYPED: fix+ ( a: fixnum b: fixnum -- c: fixnum )
most-positive-fixnum neg 1 - 1quotation
[ most-positive-fixnum 1 fix+ ] unit-test
-TUPLE: tweedle-dee ;
-TUPLE: tweedle-dum ;
+TUPLE: tweedle-dee ; final
+TUPLE: tweedle-dum ; final
TYPED: dee ( x: tweedle-dee -- y )
drop \ tweedle-dee ;
@@ -39,11 +40,11 @@ TYPED:: f+locals ( a: float b: float -- c: float )
TUPLE: unboxable
{ x fixnum read-only }
- { y fixnum read-only } ;
+ { y fixnum read-only } ; final
TUPLE: unboxable2
{ u unboxable read-only }
- { xy fixnum read-only } ;
+ { xy fixnum read-only } ; final
TYPED: unboxy ( in: unboxable -- out: unboxable2 )
dup [ x>> ] [ y>> ] bi - unboxable2 boa ;
@@ -63,7 +64,7 @@ IN: typed.tests
TUPLE: unboxable
{ x fixnum read-only }
{ y fixnum read-only }
- { z float read-only } ;
+ { z float read-only } ; final
""" eval( -- )
"""
@@ -79,13 +80,15 @@ TYPED: no-inputs ( -- out: integer )
[ 1 ] [ no-inputs ] unit-test
TUPLE: unboxable3
- { x read-only } ;
+ { x read-only } ; final
TYPED: no-inputs-unboxable-output ( -- out: unboxable3 )
T{ unboxable3 } ;
[ T{ unboxable3 } ] [ no-inputs-unboxable-output ] unit-test
+[ f ] [ no-inputs-unboxable-output no-inputs-unboxable-output eq? ] unit-test
+
SYMBOL: buh
TYPED: no-outputs ( x: integer -- )
@@ -97,3 +100,52 @@ TYPED: no-outputs-unboxable-input ( x: unboxable3 -- )
buh set ;
[ T{ unboxable3 } ] [ T{ unboxable3 } no-outputs-unboxable-input buh get ] unit-test
+
+[ f ] [
+ T{ unboxable3 } no-outputs-unboxable-input buh get
+ T{ unboxable3 } no-outputs-unboxable-input buh get
+ eq?
+] unit-test
+
+! Reported by littledan
+TUPLE: superclass { x read-only } ;
+TUPLE: subclass < superclass { y read-only } ; final
+
+TYPED: unbox-fail ( a: superclass -- ? ) subclass? ;
+
+[ t ] [ subclass new unbox-fail ] unit-test
+
+! If a final class becomes non-final, typed words need to be recompiled
+TYPED: recompile-fail ( a: subclass -- ? ) buh get eq? ;
+
+[ f ] [ subclass new [ buh set ] [ recompile-fail ] bi ] unit-test
+
+[ ] [ "IN: typed.tests TUPLE: subclass < superclass { y read-only } ;" eval( -- ) ] unit-test
+
+[ t ] [ subclass new [ buh set ] [ recompile-fail ] bi ] unit-test
+
+! Make sure that foldable and flushable work on typed words
+TYPED: add ( a: integer b: integer -- c: integer ) + ; foldable
+
+[ [ 3 ] ] [ [ 1 2 add ] cleaned-up-tree nodes>quot ] unit-test
+
+TYPED: flush-test ( s: symbol -- ? ) on t ; flushable
+
+: flush-print-1 ( symbol -- ) flush-test drop ;
+: flush-print-2 ( symbol -- ) flush-test . ;
+
+SYMBOL: a-symbol
+
+[ f ] [
+ f a-symbol [
+ a-symbol flush-print-1
+ a-symbol get
+ ] with-variable
+] unit-test
+
+[ t ] [
+ f a-symbol [
+ a-symbol flush-print-2
+ a-symbol get
+ ] with-variable
+] unit-test
diff --git a/basis/typed/typed.factor b/basis/typed/typed.factor
index e71196e3ee..6ab4e0334d 100644
--- a/basis/typed/typed.factor
+++ b/basis/typed/typed.factor
@@ -2,7 +2,7 @@
USING: accessors arrays classes classes.tuple combinators
combinators.short-circuit definitions effects fry hints
math kernel kernel.private namespaces parser quotations
-sequences slots words locals
+sequences slots words locals effects.parser
locals.parser macros stack-checker.dependencies ;
FROM: classes.tuple.private => tuple-layout ;
IN: typed
@@ -11,8 +11,8 @@ ERROR: type-mismatch-error word expected-types ;
ERROR: input-mismatch-error < type-mismatch-error ;
ERROR: output-mismatch-error < type-mismatch-error ;
-PREDICATE: typed-gensym < word "typed-gensym" word-prop ;
-PREDICATE: typed-word < word "typed-word" word-prop ;
+PREDICATE: typed-gensym < word "typed-gensym" word-prop >boolean ;
+PREDICATE: typed-word < word "typed-word" word-prop >boolean ;
> reader-word 1quotation ]
[ class>> (unboxer) ] bi compose
@@ -52,7 +58,7 @@ PREDICATE: typed-word < word "typed-word" word-prop ;
: (unboxed-types) ( type -- types )
dup unboxable-tuple-class?
[
- dup dup tuple-layout depends-on-tuple-layout
+ dup depends-on-unboxing
all-slots [ class>> (unboxed-types) ] map concat
]
[ 1array ] if ;
@@ -81,7 +87,7 @@ DEFER: make-boxer
: boxer ( type -- quot )
dup unboxable-tuple-class?
[
- dup dup tuple-layout depends-on-tuple-layout
+ dup depends-on-unboxing
[ all-slots [ class>> ] map make-boxer ]
[ [ boa ] curry ]
bi compose
@@ -114,10 +120,10 @@ MACRO: (typed) ( word def effect -- quot )
[ effect-in-types unboxed-types [ "in" swap 2array ] map ]
[ effect-out-types unboxed-types [ "out" swap 2array ] map ] bi ;
-M: typed-gensym stack-effect
- call-next-method unboxed-effect ;
-M: typed-gensym crossref?
- "typed-gensym" word-prop crossref? ;
+M: typed-gensym stack-effect call-next-method unboxed-effect ;
+M: typed-gensym parent-word "typed-gensym" word-prop ;
+M: typed-gensym crossref? parent-word crossref? ;
+M: typed-gensym where parent-word where ;
: define-typed-gensym ( word def effect -- gensym )
[ 2drop dup ]
diff --git a/basis/ui/backend/cocoa/cocoa.factor b/basis/ui/backend/cocoa/cocoa.factor
index 8eeca89c2f..d4f9b82cff 100644
--- a/basis/ui/backend/cocoa/cocoa.factor
+++ b/basis/ui/backend/cocoa/cocoa.factor
@@ -213,6 +213,18 @@ M: cocoa-ui-backend offscreen-pixels ( world -- alien w h )
M: cocoa-ui-backend beep ( -- )
NSBeep ;
+M: cocoa-ui-backend system-alert
+ invalidate-run-loop-timers
+ NSAlert -> alloc -> init -> autorelease [
+ {
+ [ swap -> setInformativeText: ]
+ [ swap -> setMessageText: ]
+ [ "OK" -> addButtonWithTitle: drop ]
+ [ -> runModal drop ]
+ } cleave
+ ] [ 2drop ] if*
+ init-thread-timer ;
+
CLASS: {
{ +superclass+ "NSObject" }
{ +name+ "FactorApplicationDelegate" }
diff --git a/basis/ui/backend/cocoa/platforms.txt b/basis/ui/backend/cocoa/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/ui/backend/cocoa/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/ui/backend/cocoa/tags.txt b/basis/ui/backend/cocoa/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/ui/backend/cocoa/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/ui/backend/cocoa/tools/platforms.txt b/basis/ui/backend/cocoa/tools/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/ui/backend/cocoa/tools/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/ui/backend/cocoa/tools/tags.txt b/basis/ui/backend/cocoa/tools/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/ui/backend/cocoa/tools/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/ui/backend/cocoa/views/platforms.txt b/basis/ui/backend/cocoa/views/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/ui/backend/cocoa/views/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/ui/backend/cocoa/views/tags.txt b/basis/ui/backend/cocoa/views/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/ui/backend/cocoa/views/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/ui/backend/windows/platforms.txt b/basis/ui/backend/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/ui/backend/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/ui/backend/windows/tags.txt b/basis/ui/backend/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/ui/backend/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/ui/backend/windows/windows.factor b/basis/ui/backend/windows/windows.factor
index 69b09dcba0..0bf2e88468 100644
--- a/basis/ui/backend/windows/windows.factor
+++ b/basis/ui/backend/windows/windows.factor
@@ -212,7 +212,7 @@ PRIVATE>
dup win32-error=0/f
dup GlobalLock dup win32-error=0/f
- swapd byte-array>memory
+ rot binary-object memcpy
dup GlobalUnlock win32-error=0/f
CF_UNICODETEXT swap SetClipboardData win32-error=0/f
] with-clipboard ;
@@ -783,6 +783,9 @@ M: windows-ui-backend (with-ui)
M: windows-ui-backend beep ( -- )
0 MessageBeep drop ;
+M: windows-ui-backend system-alert
+ [ f ] 2dip swap MB_OK MessageBox drop ;
+
: fullscreen-RECT ( hwnd -- RECT )
MONITOR_DEFAULTTONEAREST MonitorFromWindow
MONITORINFOEX
diff --git a/basis/ui/backend/x11/tags.txt b/basis/ui/backend/x11/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/ui/backend/x11/tags.txt
+++ b/basis/ui/backend/x11/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/ui/backend/x11/x11.factor b/basis/ui/backend/x11/x11.factor
index 4c977f17a4..6a7a8d147f 100644
--- a/basis/ui/backend/x11/x11.factor
+++ b/basis/ui/backend/x11/x11.factor
@@ -1,14 +1,14 @@
! Copyright (C) 2005, 2009 Eduardo Cavazos and Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types arrays ascii assocs colors
-classes.struct combinators io.encodings.ascii
-io.encodings.string io.encodings.utf8 kernel literals math
-namespaces sequences strings ui ui.backend ui.clipboards
-ui.event-loop ui.gadgets ui.gadgets.private ui.gadgets.worlds
-ui.gestures ui.pixel-formats ui.pixel-formats.private
-ui.private x11 x11.clipboard x11.constants x11.events x11.glx
-x11.io x11.windows x11.xim x11.xlib environment command-line
-combinators.short-circuit ;
+USING: accessors alien.c-types ascii assocs classes.struct combinators
+combinators.short-circuit command-line environment io.encodings.ascii
+io.encodings.string io.encodings.utf8 kernel literals locals math
+namespaces sequences specialized-arrays.instances.alien.c-types.uchar
+strings ui ui.backend ui.clipboards ui.event-loop ui.gadgets
+ui.gadgets.private ui.gadgets.worlds ui.gestures ui.pixel-formats
+ui.pixel-formats.private ui.private x11 x11.clipboard x11.constants
+x11.events x11.glx x11.io x11.windows x11.xim x11.xlib ;
+FROM: unix.ffi => system ;
IN: ui.backend.x11
SINGLETON: x11-ui-backend
@@ -50,8 +50,7 @@ PIXEL-FORMAT-ATTRIBUTE-TABLE: glx-visual { $ GLX_USE_GL $ GLX_RGBA } H{
M: x11-ui-backend (make-pixel-format)
[ drop dpy get scr get ] dip
- >glx-visual-int-array glXChooseVisual
- XVisualInfo memory>struct ;
+ >glx-visual-int-array glXChooseVisual ;
M: x11-ui-backend (free-pixel-format)
handle>> XFree ;
@@ -328,6 +327,33 @@ M: x11-ui-backend (with-ui) ( quot -- )
M: x11-ui-backend beep ( -- )
dpy get 100 XBell drop ;
+
+
+M: x11-ui-backend system-alert
+ "\n\n" glue xmessage ;
+
+: black ( -- xcolor ) 0 0 0 0 0 0 XColor ; inline
+
+M:: x11-ui-backend (grab-input) ( handle -- )
+ handle window>> :> wnd
+ dpy get :> dpy
+ dpy wnd uchar-array{ 0 0 0 0 0 0 0 0 } 8 8 XCreateBitmapFromData :> pixmap
+ dpy pixmap dup black dup 0 0 XCreatePixmapCursor :> cursor
+
+ dpy wnd 1 NoEventMask GrabModeAsync dup wnd cursor CurrentTime XGrabPointer drop
+
+ dpy cursor XFreeCursor drop
+ dpy pixmap XFreePixmap drop ;
+
+M: x11-ui-backend (ungrab-input)
+ drop dpy get CurrentTime XUngrabPointer drop ;
+
x11-ui-backend ui-backend set-global
[ "DISPLAY" os-env "ui.tools" "listener" ? ]
diff --git a/basis/ui/gadgets/buttons/buttons.factor b/basis/ui/gadgets/buttons/buttons.factor
index 061fd8d364..d0d25a0630 100644
--- a/basis/ui/gadgets/buttons/buttons.factor
+++ b/basis/ui/gadgets/buttons/buttons.factor
@@ -5,9 +5,9 @@ colors.constants combinators combinators.short-circuit
combinators.smart fry kernel locals math math.rectangles
math.vectors models namespaces opengl opengl.gl quotations
sequences strings ui.commands ui.gadgets ui.gadgets.borders
-ui.gadgets.labels ui.gadgets.packs ui.gadgets.tracks
-ui.gadgets.worlds ui.gestures ui.pens ui.pens.image
-ui.pens.solid ui.pens.tile ;
+ui.gadgets.labels ui.gadgets.packs ui.gadgets.theme
+ui.gadgets.tracks ui.gadgets.worlds ui.gestures ui.pens
+ui.pens.image ui.pens.solid ui.pens.tile ;
FROM: models => change-model ;
IN: ui.gadgets.buttons
diff --git a/basis/ui/gadgets/corners/corners.factor b/basis/ui/gadgets/corners/corners.factor
index 7f558fca19..31b7d5db2e 100644
--- a/basis/ui/gadgets/corners/corners.factor
+++ b/basis/ui/gadgets/corners/corners.factor
@@ -1,7 +1,7 @@
! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel sequences namespaces ui.gadgets.frames
-ui.pens.image ui.gadgets.icons ui.gadgets.grids ;
+ui.pens.image ui.gadgets.icons ui.gadgets.grids ui.gadgets.theme ;
IN: ui.gadgets.corners
CONSTANT: @center { 1 1 }
@@ -40,4 +40,4 @@ SYMBOL: name
: make-corners ( class name quot -- corners )
[ [ [ 3 3 ] dip new-frame { 1 1 } >>filled-cell ] dip name ] dip
- with-variable ; inline
\ No newline at end of file
+ with-variable ; inline
diff --git a/basis/ui/gadgets/editors/editors.factor b/basis/ui/gadgets/editors/editors.factor
index f42fdf4616..da60d66aff 100644
--- a/basis/ui/gadgets/editors/editors.factor
+++ b/basis/ui/gadgets/editors/editors.factor
@@ -365,7 +365,6 @@ editor "editing" f {
{ undo-action com-undo }
{ redo-action com-redo }
{ T{ key-down f f "DELETE" } delete-next-character }
- { T{ key-down f { S+ } "DELETE" } delete-next-character }
{ T{ key-down f f "BACKSPACE" } delete-previous-character }
{ T{ key-down f { S+ } "BACKSPACE" } delete-previous-character }
{ T{ key-down f { C+ } "DELETE" } delete-previous-word }
diff --git a/basis/ui/gadgets/grids/grids.factor b/basis/ui/gadgets/grids/grids.factor
index 2e964b48b6..d103ce401c 100644
--- a/basis/ui/gadgets/grids/grids.factor
+++ b/basis/ui/gadgets/grids/grids.factor
@@ -1,9 +1,8 @@
! Copyright (C) 2006, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: arrays kernel math math.order math.matrices namespaces
-make sequences words io math.vectors ui.gadgets
-ui.baseline-alignment columns accessors strings.tables
-math.rectangles fry ;
+USING: arrays kernel math math.order namespaces make sequences
+words io math.vectors ui.gadgets ui.baseline-alignment columns
+accessors strings.tables math.rectangles fry ;
IN: ui.gadgets.grids
TUPLE: grid < gadget
@@ -90,7 +89,7 @@ M: grid pref-dim* grid-pref-dim ;
: (compute-cell-locs) ( grid-layout -- locs )
[ accumulate-cell-xs nip ]
[ accumulate-cell-ys nip ]
- bi cross-zip flip ;
+ bi cartesian-product flip ;
: adjust-for-baseline ( row-locs row-cells -- row-locs' )
align-baselines [ 0 swap 2array v+ ] 2map ;
@@ -104,7 +103,7 @@ M: grid pref-dim* grid-pref-dim ;
: cell-dims ( grid-layout -- dims )
dup fill?>>
- [ [ column-widths>> ] [ row-heights>> ] bi cross-zip flip ]
+ [ [ column-widths>> ] [ row-heights>> ] bi cartesian-product flip ]
[ grid>> [ [ pref-dim>> ] map ] map ]
if ;
diff --git a/basis/ui/gadgets/search-tables/search-tables.factor b/basis/ui/gadgets/search-tables/search-tables.factor
index dd2232df60..1da137270a 100644
--- a/basis/ui/gadgets/search-tables/search-tables.factor
+++ b/basis/ui/gadgets/search-tables/search-tables.factor
@@ -3,7 +3,7 @@
USING: accessors kernel delegate fry sequences models
combinators.short-circuit models.search models.delay calendar locals
ui.gestures ui.pens ui.pens.image ui.gadgets.editors ui.gadgets.labels
-ui.gadgets.scrollers ui.gadgets.tables ui.gadgets.tracks
+ui.gadgets.scrollers ui.gadgets.tables ui.gadgets.theme ui.gadgets.tracks
ui.gadgets.borders ui.gadgets.buttons ui.baseline-alignment ui.gadgets ;
IN: ui.gadgets.search-tables
@@ -78,4 +78,4 @@ CONSULT: table-protocol search-table table>> ;
M: search-table model-changed
nip field>> clear-search-field ;
-M: search-table focusable-child* field>> ;
\ No newline at end of file
+M: search-table focusable-child* field>> ;
diff --git a/basis/ui/gadgets/sliders/sliders.factor b/basis/ui/gadgets/sliders/sliders.factor
index b98a0d152e..6851ff4be7 100644
--- a/basis/ui/gadgets/sliders/sliders.factor
+++ b/basis/ui/gadgets/sliders/sliders.factor
@@ -4,7 +4,7 @@ USING: accessors arrays assocs kernel math namespaces sequences
vectors models models.range math.vectors math.functions quotations
colors colors.constants math.rectangles fry combinators ui.gestures
ui.pens ui.gadgets ui.gadgets.buttons ui.gadgets.tracks math.order
-ui.gadgets.icons ui.pens.tile ui.pens.image ;
+ui.gadgets.icons ui.gadgets.theme ui.pens.tile ui.pens.image ;
IN: ui.gadgets.sliders
TUPLE: slider < track elevator thumb saved line ;
diff --git a/basis/ui/gadgets/tabbed/tabbed.factor b/basis/ui/gadgets/tabbed/tabbed.factor
index 23881103a9..77ddb90270 100644
--- a/basis/ui/gadgets/tabbed/tabbed.factor
+++ b/basis/ui/gadgets/tabbed/tabbed.factor
@@ -2,8 +2,9 @@
! See http://factorcode.org/license.txt for BSD license.
USING: ui.pens ui.gadgets.tracks ui.gadgets.buttons
ui.gadgets.buttons.private ui.gadgets.books ui.gadgets.packs
-ui.gadgets.borders ui.gadgets.icons ui.gadgets ui.pens.image
-sequences models accessors kernel colors colors.constants ;
+ui.gadgets.borders ui.gadgets.icons ui.gadgets ui.gadgets.theme
+ui.pens.image sequences models accessors kernel colors
+colors.constants ;
IN: ui.gadgets.tabbed
TUPLE: tabbed-gadget < track tabs book ;
diff --git a/basis/ui/gadgets/theme/authors.txt b/basis/ui/gadgets/theme/authors.txt
index 1901f27a24..580f882c8d 100644
--- a/basis/ui/gadgets/theme/authors.txt
+++ b/basis/ui/gadgets/theme/authors.txt
@@ -1 +1,2 @@
Slava Pestov
+Joe Groff
diff --git a/basis/ui/gadgets/theme/resources.txt b/basis/ui/gadgets/theme/resources.txt
new file mode 100644
index 0000000000..72238b4d93
--- /dev/null
+++ b/basis/ui/gadgets/theme/resources.txt
@@ -0,0 +1 @@
+*.tiff
diff --git a/basis/ui/gadgets/theme/theme.factor b/basis/ui/gadgets/theme/theme.factor
new file mode 100644
index 0000000000..ab10999021
--- /dev/null
+++ b/basis/ui/gadgets/theme/theme.factor
@@ -0,0 +1,6 @@
+! (c)2009, 2010 Slava Pestov, Joe Groff bsd license
+USING: io.pathnames sequences ui.images ;
+IN: ui.gadgets.theme
+
+: theme-image ( name -- image-name )
+ "vocab:ui/gadgets/theme/" prepend-path ".tiff" append ;
diff --git a/basis/ui/gadgets/worlds/worlds-docs.factor b/basis/ui/gadgets/worlds/worlds-docs.factor
index 83d042db43..0d7e40a789 100644
--- a/basis/ui/gadgets/worlds/worlds-docs.factor
+++ b/basis/ui/gadgets/worlds/worlds-docs.factor
@@ -33,7 +33,7 @@ HELP: set-gl-context
{ $description "Selects an OpenGL context to be the implicit destination for subsequent GL rendering calls. This word is called automatically by the UI before drawing a " { $link world } "." } ;
HELP: window-resource
-{ $values { "resource" disposable } { "resource" disposable } }
+{ $values { "resource" disposable } }
{ $description "Marks " { $snippet "resource" } " to be destroyed with " { $link dispose } " when the window with the currently active OpenGL context (set by " { $link set-gl-context } ") is closed. " { $snippet "resource" } " is left unmodified at the top of the stack." } ;
HELP: flush-gl-context
diff --git a/basis/ui/gadgets/worlds/worlds.factor b/basis/ui/gadgets/worlds/worlds.factor
index 7e54b823e8..05466f4673 100644
--- a/basis/ui/gadgets/worlds/worlds.factor
+++ b/basis/ui/gadgets/worlds/worlds.factor
@@ -217,8 +217,7 @@ ui-error-hook [ [ rethrow ] ] initialize
dup [ draw-world* ] with-gl-context
flush-layout-cache-hook get call( -- )
] [
- over ui-error
- f >>active? drop
+ swap f >>active? ui-error
] recover
] with-variable
] [ drop ] if ;
@@ -230,6 +229,9 @@ action-gestures [
bi*
] H{ } assoc-map-as
H{
+ { T{ key-down f { S+ } "DELETE" } [ \ cut-action send-action ] }
+ { T{ key-down f { S+ } "INSERT" } [ \ paste-action send-action ] }
+ { T{ key-down f { C+ } "INSERT" } [ \ copy-action send-action ] }
{ T{ button-down f { C+ } 1 } [ drop T{ button-down f f 3 } button-gesture ] }
{ T{ button-down f { A+ } 1 } [ drop T{ button-down f f 2 } button-gesture ] }
{ T{ button-down f { M+ } 1 } [ drop T{ button-down f f 2 } button-gesture ] }
diff --git a/basis/ui/pens/image/image.factor b/basis/ui/pens/image/image.factor
index da253f8b0c..be37e6e129 100644
--- a/basis/ui/pens/image/image.factor
+++ b/basis/ui/pens/image/image.factor
@@ -18,5 +18,3 @@ M: image-pen draw-interior
M: image-pen pen-pref-dim nip image>> image-dim ;
-: theme-image ( name -- image-name )
- "vocab:ui/gadgets/theme/" prepend-path ".tiff" append ;
\ No newline at end of file
diff --git a/basis/ui/text/core-text/platforms.txt b/basis/ui/text/core-text/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/ui/text/core-text/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/ui/text/core-text/tags.txt b/basis/ui/text/core-text/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/ui/text/core-text/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/ui/text/pango/platforms.txt b/basis/ui/text/pango/platforms.txt
new file mode 100644
index 0000000000..b60912bb4a
--- /dev/null
+++ b/basis/ui/text/pango/platforms.txt
@@ -0,0 +1,4 @@
+linux
+freebsd
+netbsd
+openbsd
diff --git a/basis/ui/text/pango/tags.txt b/basis/ui/text/pango/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/ui/text/pango/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/ui/text/uniscribe/platforms.txt b/basis/ui/text/uniscribe/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/ui/text/uniscribe/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/ui/text/uniscribe/tags.txt b/basis/ui/text/uniscribe/tags.txt
deleted file mode 100755
index 6abe115b12..0000000000
--- a/basis/ui/text/uniscribe/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/ui/tools/listener/listener-docs.factor b/basis/ui/tools/listener/listener-docs.factor
index b762e036e6..966ac37d30 100644
--- a/basis/ui/tools/listener/listener-docs.factor
+++ b/basis/ui/tools/listener/listener-docs.factor
@@ -9,7 +9,7 @@ HELP: interactor
$nl
"Interactors are created by calling " { $link } "."
$nl
-"Interactors implement the " { $link stream-readln } ", " { $link stream-read } " and " { $link read-quot } " generic words." } ;
+"Interactors implement the " { $link stream-readln } ", " { $link stream-read } " and " { $link stream-read-quot } " generic words." } ;
ARTICLE: "ui-listener" "UI listener"
"The graphical listener adds input history and word and vocabulary completion. See " { $link "listener" } " for general information on the listener."
diff --git a/basis/ui/ui-docs.factor b/basis/ui/ui-docs.factor
index b55ea44c6b..b2f97857f6 100644
--- a/basis/ui/ui-docs.factor
+++ b/basis/ui/ui-docs.factor
@@ -81,6 +81,11 @@ HELP: with-ui
HELP: beep
{ $description "Plays the system beep sound." } ;
+HELP: system-alert
+{ $values { "caption" string } { "text" string } }
+{ $description "Displays an application-modal alert dialog box with the given caption and text." }
+{ $notes "Since the window raised by this word is modal, all processing in all Factor threads will halt until the dialog is dismissed. In an application that makes full use of the UI framework, it would be more appropriate to display a pane gadget in a Factor window. This word is meant primarily to be used to display errors in deployed applications with minimal dependencies on the UI library, such as games." } ;
+
HELP: topmost-window
{ $values { "world" world } }
{ $description "Returns the " { $link world } " representing the currently focused window." } ;
diff --git a/basis/ui/ui.factor b/basis/ui/ui.factor
index e0fa560935..824ffb8351 100644
--- a/basis/ui/ui.factor
+++ b/basis/ui/ui.factor
@@ -243,6 +243,8 @@ M: object close-window
HOOK: beep ui-backend ( -- )
+HOOK: system-alert ui-backend ( caption text -- )
+
: parse-main-window-attributes ( class -- attributes )
"{" expect dup all-slots parse-tuple-literal-slots ;
diff --git a/basis/unix/debugger/platforms.txt b/basis/unix/debugger/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/debugger/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/debugger/tags.txt b/basis/unix/debugger/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/debugger/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/ffi/bsd/bsd.factor b/basis/unix/ffi/bsd/bsd.factor
index bda99422fc..ad323bf14a 100644
--- a/basis/unix/ffi/bsd/bsd.factor
+++ b/basis/unix/ffi/bsd/bsd.factor
@@ -48,15 +48,15 @@ STRUCT: sockaddr-un
{ path char[104] } ;
STRUCT: passwd
- { pw_name char* }
- { pw_passwd char* }
+ { pw_name c-string }
+ { pw_passwd c-string }
{ pw_uid uid_t }
{ pw_gid gid_t }
{ pw_change time_t }
- { pw_class char* }
- { pw_gecos char* }
- { pw_dir char* }
- { pw_shell char* }
+ { pw_class c-string }
+ { pw_gecos c-string }
+ { pw_dir c-string }
+ { pw_shell c-string }
{ pw_expire time_t }
{ pw_fields int } ;
diff --git a/basis/unix/ffi/bsd/freebsd/freebsd.factor b/basis/unix/ffi/bsd/freebsd/freebsd.factor
index 992d1c3ad0..112758a3e8 100644
--- a/basis/unix/ffi/bsd/freebsd/freebsd.factor
+++ b/basis/unix/ffi/bsd/freebsd/freebsd.factor
@@ -9,7 +9,7 @@ STRUCT: addrinfo
{ socktype int }
{ protocol int }
{ addrlen socklen_t }
- { canonname char* }
+ { canonname c-string }
{ addr void* }
{ next addrinfo* } ;
diff --git a/basis/unix/ffi/bsd/freebsd/platforms.txt b/basis/unix/ffi/bsd/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/unix/ffi/bsd/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/unix/ffi/bsd/freebsd/tags.txt b/basis/unix/ffi/bsd/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/ffi/bsd/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/ffi/bsd/macosx/macosx.factor b/basis/unix/ffi/bsd/macosx/macosx.factor
index a2e75b6ca6..2ca1d9315d 100644
--- a/basis/unix/ffi/bsd/macosx/macosx.factor
+++ b/basis/unix/ffi/bsd/macosx/macosx.factor
@@ -11,7 +11,7 @@ STRUCT: addrinfo
{ socktype int }
{ protocol int }
{ addrlen socklen_t }
- { canonname char* }
+ { canonname c-string }
{ addr void* }
{ next addrinfo* } ;
@@ -32,7 +32,7 @@ STRUCT: utmpx
CONSTANT: __DARWIN_MAXPATHLEN 1024
CONSTANT: __DARWIN_MAXNAMELEN 255
-CONSTANT: __DARWIN_MAXNAMELEN+1 255
+CONSTANT: __DARWIN_MAXNAMELEN+1 256
STRUCT: dirent
{ d_ino ino_t }
diff --git a/basis/unix/ffi/bsd/macosx/platforms.txt b/basis/unix/ffi/bsd/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/unix/ffi/bsd/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/unix/ffi/bsd/macosx/tags.txt b/basis/unix/ffi/bsd/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/ffi/bsd/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/ffi/bsd/netbsd/netbsd.factor b/basis/unix/ffi/bsd/netbsd/netbsd.factor
index d755caf874..e15971b150 100644
--- a/basis/unix/ffi/bsd/netbsd/netbsd.factor
+++ b/basis/unix/ffi/bsd/netbsd/netbsd.factor
@@ -10,7 +10,7 @@ STRUCT: addrinfo
{ socktype int }
{ protocol int }
{ addrlen socklen_t }
- { canonname char* }
+ { canonname c-string }
{ addr void* }
{ next addrinfo* } ;
diff --git a/basis/unix/ffi/bsd/netbsd/platforms.txt b/basis/unix/ffi/bsd/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/unix/ffi/bsd/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/unix/ffi/bsd/netbsd/tags.txt b/basis/unix/ffi/bsd/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/ffi/bsd/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/ffi/bsd/openbsd/openbsd.factor b/basis/unix/ffi/bsd/openbsd/openbsd.factor
index 076dbdfd24..1f4eddef66 100644
--- a/basis/unix/ffi/bsd/openbsd/openbsd.factor
+++ b/basis/unix/ffi/bsd/openbsd/openbsd.factor
@@ -10,7 +10,7 @@ STRUCT: addrinfo
{ protocol int }
{ addrlen socklen_t }
{ addr void* }
- { canonname char* }
+ { canonname c-string }
{ next addrinfo* } ;
STRUCT: dirent
diff --git a/basis/unix/ffi/bsd/openbsd/platforms.txt b/basis/unix/ffi/bsd/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/unix/ffi/bsd/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/unix/ffi/bsd/openbsd/tags.txt b/basis/unix/ffi/bsd/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/ffi/bsd/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/ffi/bsd/platforms.txt b/basis/unix/ffi/bsd/platforms.txt
new file mode 100644
index 0000000000..df796f15d4
--- /dev/null
+++ b/basis/unix/ffi/bsd/platforms.txt
@@ -0,0 +1 @@
+bsd
diff --git a/basis/unix/ffi/bsd/tags.txt b/basis/unix/ffi/bsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/ffi/bsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/ffi/ffi.factor b/basis/unix/ffi/ffi.factor
index 3882f6fc80..555bab32e4 100644
--- a/basis/unix/ffi/ffi.factor
+++ b/basis/unix/ffi/ffi.factor
@@ -44,21 +44,21 @@ CONSTANT: DT_WHT 14
LIBRARY: libc
-FUNCTION: char* strerror ( int errno ) ;
+FUNCTION: c-string strerror ( int errno ) ;
STRUCT: group
- { gr_name char* }
- { gr_passwd char* }
+ { gr_name c-string }
+ { gr_passwd c-string }
{ gr_gid int }
- { gr_mem char** } ;
+ { gr_mem c-string* } ;
FUNCTION: int accept ( int s, void* sockaddr, socklen_t* socklen ) ;
FUNCTION: int bind ( int s, void* name, socklen_t namelen ) ;
-FUNCTION: int chdir ( char* path ) ;
-FUNCTION: int chmod ( char* path, mode_t mode ) ;
+FUNCTION: int chdir ( c-string path ) ;
+FUNCTION: int chmod ( c-string path, mode_t mode ) ;
FUNCTION: int fchmod ( int fd, mode_t mode ) ;
-FUNCTION: int chown ( char* path, uid_t owner, gid_t group ) ;
-FUNCTION: int chroot ( char* path ) ;
+FUNCTION: int chown ( c-string path, uid_t owner, gid_t group ) ;
+FUNCTION: int chroot ( c-string path ) ;
FUNCTION: int close ( int fd ) ;
FUNCTION: int closedir ( DIR* dirp ) ;
FUNCTION: int connect ( int s, void* name, socklen_t namelen ) ;
@@ -70,75 +70,76 @@ FUNCTION: int fcntl ( int fd, int cmd, int arg ) ;
FUNCTION: int flock ( int fd, int operation ) ;
FUNCTION: void freeaddrinfo ( addrinfo* ai ) ;
FUNCTION: int futimes ( int id, timeval[2] times ) ;
-FUNCTION: char* gai_strerror ( int ecode ) ;
-FUNCTION: int getaddrinfo ( char* hostname, char* servname, addrinfo* hints, addrinfo** res ) ;
-FUNCTION: char* getcwd ( char* buf, size_t size ) ;
+FUNCTION: c-string gai_strerror ( int ecode ) ;
+FUNCTION: int getaddrinfo ( c-string hostname, c-string servname, addrinfo* hints, addrinfo** res ) ;
+FUNCTION: c-string getcwd ( c-string buf, size_t size ) ;
FUNCTION: pid_t getpid ;
FUNCTION: int getdtablesize ;
FUNCTION: gid_t getegid ;
FUNCTION: uid_t geteuid ;
FUNCTION: gid_t getgid ;
-FUNCTION: char* getenv ( char* name ) ;
+FUNCTION: c-string getenv ( c-string name ) ;
-FUNCTION: int getgrgid_r ( gid_t gid, group* grp, char* buffer, size_t bufsize, group** result ) ;
-FUNCTION: int getgrnam_r ( char* name, group* grp, char* buffer, size_t bufsize, group** result ) ;
+FUNCTION: int getgrgid_r ( gid_t gid, group* grp, c-string buffer, size_t bufsize, group** result ) ;
+FUNCTION: int getgrnam_r ( c-string name, group* grp, c-string buffer, size_t bufsize, group** result ) ;
FUNCTION: passwd* getpwent ( ) ;
FUNCTION: passwd* getpwuid ( uid_t uid ) ;
-FUNCTION: passwd* getpwnam ( char* login ) ;
-FUNCTION: int getpwnam_r ( char* login, passwd* pwd, char* buffer, size_t bufsize, passwd** result ) ;
+FUNCTION: passwd* getpwnam ( c-string login ) ;
+FUNCTION: int getpwnam_r ( c-string login, passwd* pwd, c-string buffer, size_t bufsize, passwd** result ) ;
FUNCTION: int getgroups ( int gidsetlen, gid_t* gidset ) ;
-FUNCTION: int getgrouplist ( char* name, int basegid, int* groups, int* ngroups ) ;
+FUNCTION: int getgrouplist ( c-string name, int basegid, int* groups, int* ngroups ) ;
FUNCTION: int getrlimit ( int resource, rlimit* rlp ) ;
FUNCTION: int setrlimit ( int resource, rlimit* rlp ) ;
FUNCTION: int getpriority ( int which, id_t who ) ;
FUNCTION: int setpriority ( int which, id_t who, int prio ) ;
FUNCTION: int getrusage ( int who, rusage* r_usage ) ;
FUNCTION: group* getgrent ;
-FUNCTION: int gethostname ( char* name, int len ) ;
+FUNCTION: int gethostname ( c-string name, int len ) ;
FUNCTION: int getsockname ( int socket, sockaddr* address, socklen_t* address_len ) ;
FUNCTION: int getpeername ( int socket, sockaddr* address, socklen_t* address_len ) ;
FUNCTION: uid_t getuid ;
FUNCTION: uint htonl ( uint n ) ;
FUNCTION: ushort htons ( ushort n ) ;
! FUNCTION: int issetugid ;
-FUNCTION: int ioctl ( int fd, ulong request, char* argp ) ;
-FUNCTION: int lchown ( char* path, uid_t owner, gid_t group ) ;
+FUNCTION: int isatty ( int fildes ) ;
+FUNCTION: int ioctl ( int fd, ulong request, c-string argp ) ;
+FUNCTION: int lchown ( c-string path, uid_t owner, gid_t group ) ;
FUNCTION: int listen ( int s, int backlog ) ;
FUNCTION: off_t lseek ( int fildes, off_t offset, int whence ) ;
-FUNCTION: int mkdir ( char* path, mode_t mode ) ;
+FUNCTION: int mkdir ( c-string path, mode_t mode ) ;
FUNCTION: void* mmap ( void* addr, size_t len, int prot, int flags, int fd, off_t offset ) ;
FUNCTION: int munmap ( void* addr, size_t len ) ;
FUNCTION: uint ntohl ( uint n ) ;
FUNCTION: ushort ntohs ( ushort n ) ;
FUNCTION: int shutdown ( int fd, int how ) ;
-FUNCTION: int open ( char* path, int flags, int prot ) ;
-FUNCTION: DIR* opendir ( char* path ) ;
+FUNCTION: int open ( c-string path, int flags, int prot ) ;
+FUNCTION: DIR* opendir ( c-string path ) ;
STRUCT: utimbuf
{ actime time_t }
{ modtime time_t } ;
-FUNCTION: int utime ( char* path, utimbuf* buf ) ;
+FUNCTION: int utime ( c-string path, utimbuf* buf ) ;
FUNCTION: int pclose ( void* file ) ;
FUNCTION: int pipe ( int* filedes ) ;
-FUNCTION: void* popen ( char* command, char* type ) ;
+FUNCTION: void* popen ( c-string command, c-string type ) ;
FUNCTION: ssize_t read ( int fd, void* buf, size_t nbytes ) ;
FUNCTION: dirent* readdir ( DIR* dirp ) ;
FUNCTION: int readdir_r ( void* dirp, dirent* entry, dirent** result ) ;
-FUNCTION: ssize_t readlink ( char* path, char* buf, size_t bufsize ) ;
+FUNCTION: ssize_t readlink ( c-string path, c-string buf, size_t bufsize ) ;
CONSTANT: PATH_MAX 1024
FUNCTION: ssize_t recv ( int s, void* buf, size_t nbytes, int flags ) ;
FUNCTION: ssize_t recvfrom ( int s, void* buf, size_t nbytes, int flags, sockaddr-in* from, socklen_t* fromlen ) ;
-FUNCTION: int rename ( char* from, char* to ) ;
-FUNCTION: int rmdir ( char* path ) ;
+FUNCTION: int rename ( c-string from, c-string to ) ;
+FUNCTION: int rmdir ( c-string path ) ;
FUNCTION: int select ( int nfds, void* readfds, void* writefds, void* exceptfds, timeval* timeout ) ;
FUNCTION: ssize_t sendto ( int s, void* buf, size_t len, int flags, sockaddr-in* to, socklen_t tolen ) ;
-FUNCTION: int setenv ( char* name, char* value, int overwrite ) ;
-FUNCTION: int unsetenv ( char* name ) ;
+FUNCTION: int setenv ( c-string name, c-string value, int overwrite ) ;
+FUNCTION: int unsetenv ( c-string name ) ;
FUNCTION: int setegid ( gid_t egid ) ;
FUNCTION: int seteuid ( uid_t euid ) ;
FUNCTION: int setgid ( gid_t gid ) ;
@@ -148,11 +149,11 @@ FUNCTION: int setreuid ( uid_t ruid, uid_t euid ) ;
FUNCTION: int setsockopt ( int s, int level, int optname, void* optval, socklen_t optlen ) ;
FUNCTION: int setuid ( uid_t uid ) ;
FUNCTION: int socket ( int domain, int type, int protocol ) ;
-FUNCTION: int symlink ( char* path1, char* path2 ) ;
-FUNCTION: int link ( char* path1, char* path2 ) ;
-FUNCTION: int system ( char* command ) ;
-FUNCTION: int unlink ( char* path ) ;
-FUNCTION: int utimes ( char* path, timeval[2] times ) ;
+FUNCTION: int symlink ( c-string path1, c-string path2 ) ;
+FUNCTION: int link ( c-string path1, c-string path2 ) ;
+FUNCTION: int system ( c-string command ) ;
+FUNCTION: int unlink ( c-string path ) ;
+FUNCTION: int utimes ( c-string path, timeval[2] times ) ;
FUNCTION: ssize_t write ( int fd, void* buf, size_t nbytes ) ;
"librt" "librt.so" "cdecl" add-library
diff --git a/basis/unix/ffi/linux/linux.factor b/basis/unix/ffi/linux/linux.factor
index 260796b5e4..3f19e18c14 100644
--- a/basis/unix/ffi/linux/linux.factor
+++ b/basis/unix/ffi/linux/linux.factor
@@ -38,7 +38,7 @@ STRUCT: addrinfo
{ protocol int }
{ addrlen socklen_t }
{ addr void* }
- { canonname char* }
+ { canonname c-string }
{ next addrinfo* } ;
STRUCT: sockaddr-in
@@ -83,13 +83,13 @@ CONSTANT: SEEK_CUR 1
CONSTANT: SEEK_END 2
STRUCT: passwd
- { pw_name char* }
- { pw_passwd char* }
+ { pw_name c-string }
+ { pw_passwd c-string }
{ pw_uid uid_t }
{ pw_gid gid_t }
- { pw_gecos char* }
- { pw_dir char* }
- { pw_shell char* } ;
+ { pw_gecos c-string }
+ { pw_dir c-string }
+ { pw_shell c-string } ;
! dirent64
STRUCT: dirent
@@ -99,7 +99,7 @@ STRUCT: dirent
{ d_type uchar }
{ d_name char[256] } ;
-FUNCTION: int open64 ( char* path, int flags, int prot ) ;
+FUNCTION: int open64 ( c-string path, int flags, int prot ) ;
FUNCTION: dirent* readdir64 ( DIR* dirp ) ;
FUNCTION: int readdir64_r ( void* dirp, dirent* entry, dirent** result ) ;
diff --git a/basis/unix/ffi/linux/platforms.txt b/basis/unix/ffi/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/unix/ffi/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/unix/ffi/linux/tags.txt b/basis/unix/ffi/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/ffi/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/ffi/platforms.txt b/basis/unix/ffi/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/ffi/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/ffi/solaris/platforms.txt b/basis/unix/ffi/solaris/platforms.txt
new file mode 100644
index 0000000000..613a93b535
--- /dev/null
+++ b/basis/unix/ffi/solaris/platforms.txt
@@ -0,0 +1 @@
+solaris
diff --git a/basis/unix/ffi/solaris/solaris.factor b/basis/unix/ffi/solaris/solaris.factor
index d641961a25..a08785823a 100644
--- a/basis/unix/ffi/solaris/solaris.factor
+++ b/basis/unix/ffi/solaris/solaris.factor
@@ -35,7 +35,7 @@ STRUCT: addrinfo
! int _ai_pad;
! #endif
{ addrlen int }
- { canonname char* }
+ { canonname c-string }
{ addr void* }
{ next void* } ;
diff --git a/basis/unix/ffi/solaris/tags.txt b/basis/unix/ffi/solaris/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/ffi/solaris/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/ffi/tags.txt b/basis/unix/ffi/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/ffi/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/getfsstat/freebsd/platforms.txt b/basis/unix/getfsstat/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/unix/getfsstat/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/unix/getfsstat/freebsd/tags.txt b/basis/unix/getfsstat/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/getfsstat/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/getfsstat/macosx/platforms.txt b/basis/unix/getfsstat/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/unix/getfsstat/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/unix/getfsstat/macosx/tags.txt b/basis/unix/getfsstat/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/getfsstat/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/getfsstat/netbsd/platforms.txt b/basis/unix/getfsstat/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/unix/getfsstat/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/unix/getfsstat/netbsd/tags.txt b/basis/unix/getfsstat/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/getfsstat/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/getfsstat/openbsd/platforms.txt b/basis/unix/getfsstat/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/unix/getfsstat/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/unix/getfsstat/openbsd/tags.txt b/basis/unix/getfsstat/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/getfsstat/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/groups/groups.factor b/basis/unix/groups/groups.factor
index b009fe529f..7be124ced4 100644
--- a/basis/unix/groups/groups.factor
+++ b/basis/unix/groups/groups.factor
@@ -83,7 +83,7 @@ M: integer user-groups ( id -- seq )
user-name (user-groups) ;
: all-groups ( -- seq )
- [ unix.ffi:getgrent dup ] [ \ unix.ffi:group memory>struct group-struct>group ] produce nip ;
+ [ unix.ffi:getgrent dup ] [ group-struct>group ] produce nip ;
: ( -- assoc )
all-groups [ [ id>> ] keep ] H{ } map>assoc ;
diff --git a/basis/unix/groups/platforms.txt b/basis/unix/groups/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/groups/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/groups/tags.txt b/basis/unix/groups/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/groups/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/kqueue/freebsd/platforms.txt b/basis/unix/kqueue/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/unix/kqueue/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/unix/kqueue/freebsd/tags.txt b/basis/unix/kqueue/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/kqueue/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/kqueue/macosx/platforms.txt b/basis/unix/kqueue/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/unix/kqueue/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/unix/kqueue/macosx/tags.txt b/basis/unix/kqueue/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/kqueue/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/kqueue/netbsd/platforms.txt b/basis/unix/kqueue/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/unix/kqueue/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/unix/kqueue/netbsd/tags.txt b/basis/unix/kqueue/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/kqueue/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/kqueue/openbsd/platforms.txt b/basis/unix/kqueue/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/unix/kqueue/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/unix/kqueue/openbsd/tags.txt b/basis/unix/kqueue/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/kqueue/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/kqueue/platforms.txt b/basis/unix/kqueue/platforms.txt
new file mode 100644
index 0000000000..df796f15d4
--- /dev/null
+++ b/basis/unix/kqueue/platforms.txt
@@ -0,0 +1 @@
+bsd
diff --git a/basis/unix/kqueue/tags.txt b/basis/unix/kqueue/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/kqueue/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/linux/epoll/platforms.txt b/basis/unix/linux/epoll/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/unix/linux/epoll/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/unix/linux/epoll/tags.txt b/basis/unix/linux/epoll/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/linux/epoll/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/linux/inotify/inotify.factor b/basis/unix/linux/inotify/inotify.factor
index f589c17e28..c296cc8166 100644
--- a/basis/unix/linux/inotify/inotify.factor
+++ b/basis/unix/linux/inotify/inotify.factor
@@ -52,5 +52,5 @@ CONSTANT: IN_ONESHOT HEX: 80000000 ! only send event once
} flags ; foldable
FUNCTION: int inotify_init ( ) ;
-FUNCTION: int inotify_add_watch ( int fd, char* name, uint mask ) ;
+FUNCTION: int inotify_add_watch ( int fd, c-string name, uint mask ) ;
FUNCTION: int inotify_rm_watch ( int fd, uint wd ) ;
diff --git a/basis/unix/linux/inotify/platforms.txt b/basis/unix/linux/inotify/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/unix/linux/inotify/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/unix/linux/inotify/tags.txt b/basis/unix/linux/inotify/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/linux/inotify/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/linux/platforms.txt b/basis/unix/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/unix/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/unix/linux/tags.txt b/basis/unix/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/platforms.txt b/basis/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/process/platforms.txt b/basis/unix/process/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/process/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/process/process.factor b/basis/unix/process/process.factor
index ab10aef3ea..4b33c37d07 100644
--- a/basis/unix/process/process.factor
+++ b/basis/unix/process/process.factor
@@ -11,9 +11,9 @@ FUNCTION: pid_t fork ( ) ;
: fork-process ( -- pid ) [ fork ] unix-system-call ;
-FUNCTION: int execv ( char* path, char** argv ) ;
-FUNCTION: int execvp ( char* path, char** argv ) ;
-FUNCTION: int execve ( char* path, char** argv, char** envp ) ;
+FUNCTION: int execv ( c-string path, c-string* argv ) ;
+FUNCTION: int execvp ( c-string path, c-string* argv ) ;
+FUNCTION: int execve ( c-string path, c-string* argv, c-string* envp ) ;
: exec ( pathname argv -- int )
[ utf8 malloc-string ] [ utf8 strings>alien ] bi* execv ;
diff --git a/basis/unix/process/tags.txt b/basis/unix/process/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/process/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/stat/freebsd/freebsd.factor b/basis/unix/stat/freebsd/freebsd.factor
index 04f884e496..93ed1a42db 100644
--- a/basis/unix/stat/freebsd/freebsd.factor
+++ b/basis/unix/stat/freebsd/freebsd.factor
@@ -24,5 +24,5 @@ STRUCT: stat
{ st_birthtimespec timespec }
{ pad0 __int32_t[2] } ;
-FUNCTION: int stat ( char* pathname, stat* buf ) ;
-FUNCTION: int lstat ( char* pathname, stat* buf ) ;
+FUNCTION: int stat ( c-string pathname, stat* buf ) ;
+FUNCTION: int lstat ( c-string pathname, stat* buf ) ;
diff --git a/basis/unix/stat/freebsd/platforms.txt b/basis/unix/stat/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/unix/stat/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/unix/stat/freebsd/tags.txt b/basis/unix/stat/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/stat/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/stat/linux/32/32.factor b/basis/unix/stat/linux/32/32.factor
index f01140ff4b..b3becff240 100644
--- a/basis/unix/stat/linux/32/32.factor
+++ b/basis/unix/stat/linux/32/32.factor
@@ -21,8 +21,8 @@ STRUCT: stat
{ st_ctimespec timespec }
{ st_ino ulonglong } ;
-FUNCTION: int __xstat64 ( int ver, char* pathname, stat* buf ) ;
-FUNCTION: int __lxstat64 ( int ver, char* pathname, stat* buf ) ;
+FUNCTION: int __xstat64 ( int ver, c-string pathname, stat* buf ) ;
+FUNCTION: int __lxstat64 ( int ver, c-string pathname, stat* buf ) ;
: stat ( pathname buf -- int ) [ 1 ] 2dip __xstat64 ;
: lstat ( pathname buf -- int ) [ 1 ] 2dip __lxstat64 ;
diff --git a/basis/unix/stat/linux/32/tags.txt b/basis/unix/stat/linux/32/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/unix/stat/linux/32/tags.txt
+++ b/basis/unix/stat/linux/32/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/unix/stat/linux/64/64.factor b/basis/unix/stat/linux/64/64.factor
index bb16133c76..0862bf82a0 100644
--- a/basis/unix/stat/linux/64/64.factor
+++ b/basis/unix/stat/linux/64/64.factor
@@ -21,8 +21,8 @@ STRUCT: stat
{ st_ctimespec timespec }
{ __unused0 long[3] } ;
-FUNCTION: int __xstat64 ( int ver, char* pathname, stat* buf ) ;
-FUNCTION: int __lxstat64 ( int ver, char* pathname, stat* buf ) ;
+FUNCTION: int __xstat64 ( int ver, c-string pathname, stat* buf ) ;
+FUNCTION: int __lxstat64 ( int ver, c-string pathname, stat* buf ) ;
: stat ( pathname buf -- int ) [ 1 ] 2dip __xstat64 ;
: lstat ( pathname buf -- int ) [ 1 ] 2dip __lxstat64 ;
diff --git a/basis/unix/stat/linux/64/tags.txt b/basis/unix/stat/linux/64/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/unix/stat/linux/64/tags.txt
+++ b/basis/unix/stat/linux/64/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/unix/stat/linux/platforms.txt b/basis/unix/stat/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/unix/stat/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/unix/stat/linux/tags.txt b/basis/unix/stat/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/stat/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/stat/macosx/macosx.factor b/basis/unix/stat/macosx/macosx.factor
index 4e6b2dfb21..024cd317e8 100644
--- a/basis/unix/stat/macosx/macosx.factor
+++ b/basis/unix/stat/macosx/macosx.factor
@@ -26,8 +26,8 @@ STRUCT: stat
{ st_qspare0 __int64_t }
{ st_qspare1 __int64_t } ;
-FUNCTION: int stat64 ( char* pathname, stat* buf ) ;
-FUNCTION: int lstat64 ( char* pathname, stat* buf ) ;
+FUNCTION: int stat64 ( c-string pathname, stat* buf ) ;
+FUNCTION: int lstat64 ( c-string pathname, stat* buf ) ;
: stat ( path buf -- n ) stat64 ;
: lstat ( path buf -- n ) lstat64 ;
diff --git a/basis/unix/stat/macosx/platforms.txt b/basis/unix/stat/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/unix/stat/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/unix/stat/macosx/tags.txt b/basis/unix/stat/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/stat/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/stat/netbsd/32/32.factor b/basis/unix/stat/netbsd/32/32.factor
index fb0d61b7e9..bb0a403751 100644
--- a/basis/unix/stat/netbsd/32/32.factor
+++ b/basis/unix/stat/netbsd/32/32.factor
@@ -23,8 +23,8 @@ STRUCT: stat
{ st_gen uint32_t }
{ st_qspare uint32_t[2] } ;
-FUNCTION: int __stat30 ( char* pathname, stat* buf ) ;
-FUNCTION: int __lstat30 ( char* pathname, stat* buf ) ;
+FUNCTION: int __stat30 ( c-string pathname, stat* buf ) ;
+FUNCTION: int __lstat30 ( c-string pathname, stat* buf ) ;
: stat ( pathname buf -- n ) __stat30 ;
: lstat ( pathname buf -- n ) __lstat30 ;
diff --git a/basis/unix/stat/netbsd/32/tags.txt b/basis/unix/stat/netbsd/32/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/unix/stat/netbsd/32/tags.txt
+++ b/basis/unix/stat/netbsd/32/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/unix/stat/netbsd/64/64.factor b/basis/unix/stat/netbsd/64/64.factor
index 47c4e0c129..010dcca724 100644
--- a/basis/unix/stat/netbsd/64/64.factor
+++ b/basis/unix/stat/netbsd/64/64.factor
@@ -23,8 +23,8 @@ STRUCT: stat
{ st_spare0 uint32_t }
{ st_birthtimespec timespec } ;
-FUNCTION: int __stat13 ( char* pathname, stat* buf ) ;
-FUNCTION: int __lstat13 ( char* pathname, stat* buf ) ;
+FUNCTION: int __stat13 ( c-string pathname, stat* buf ) ;
+FUNCTION: int __lstat13 ( c-string pathname, stat* buf ) ;
: stat ( pathname buf -- n ) __stat13 ;
: lstat ( pathname buf -- n ) __lstat13 ;
diff --git a/basis/unix/stat/netbsd/64/tags.txt b/basis/unix/stat/netbsd/64/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/unix/stat/netbsd/64/tags.txt
+++ b/basis/unix/stat/netbsd/64/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/unix/stat/netbsd/platforms.txt b/basis/unix/stat/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/unix/stat/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/unix/stat/netbsd/tags.txt b/basis/unix/stat/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/stat/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/stat/openbsd/openbsd.factor b/basis/unix/stat/openbsd/openbsd.factor
index 2702e60f6c..b562d085b3 100644
--- a/basis/unix/stat/openbsd/openbsd.factor
+++ b/basis/unix/stat/openbsd/openbsd.factor
@@ -25,5 +25,5 @@ STRUCT: stat
{ st_birthtimespec timespec }
{ st_qspare int64_t[2] } ;
-FUNCTION: int stat ( char* pathname, stat* buf ) ;
-FUNCTION: int lstat ( char* pathname, stat* buf ) ;
+FUNCTION: int stat ( c-string pathname, stat* buf ) ;
+FUNCTION: int lstat ( c-string pathname, stat* buf ) ;
diff --git a/basis/unix/stat/openbsd/platforms.txt b/basis/unix/stat/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/unix/stat/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/unix/stat/openbsd/tags.txt b/basis/unix/stat/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/stat/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/stat/platforms.txt b/basis/unix/stat/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/stat/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/stat/tags.txt b/basis/unix/stat/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/stat/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statfs/freebsd/freebsd.factor b/basis/unix/statfs/freebsd/freebsd.factor
index ae418e6eb4..f12473da92 100644
--- a/basis/unix/statfs/freebsd/freebsd.factor
+++ b/basis/unix/statfs/freebsd/freebsd.factor
@@ -31,4 +31,4 @@ STRUCT: statfs
{ f_mntfromname { char MNAMELEN } }
{ f_mntonname { char MNAMELEN } } ;
-FUNCTION: int statfs ( char* path, statfs* buf ) ;
+FUNCTION: int statfs ( c-string path, statfs* buf ) ;
diff --git a/basis/unix/statfs/freebsd/platforms.txt b/basis/unix/statfs/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/unix/statfs/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/unix/statfs/freebsd/tags.txt b/basis/unix/statfs/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statfs/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statfs/linux/linux.factor b/basis/unix/statfs/linux/linux.factor
index ab37ab9605..2cf2541a10 100644
--- a/basis/unix/statfs/linux/linux.factor
+++ b/basis/unix/statfs/linux/linux.factor
@@ -16,4 +16,4 @@ STRUCT: statfs64
{ f_frsize __SWORD_TYPE }
{ f_spare __SWORD_TYPE[5] } ;
-FUNCTION: int statfs64 ( char* path, statfs64* buf ) ;
+FUNCTION: int statfs64 ( c-string path, statfs64* buf ) ;
diff --git a/basis/unix/statfs/linux/platforms.txt b/basis/unix/statfs/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/unix/statfs/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/unix/statfs/linux/tags.txt b/basis/unix/statfs/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statfs/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statfs/macosx/macosx.factor b/basis/unix/statfs/macosx/macosx.factor
index 56c8989895..75b231da96 100644
--- a/basis/unix/statfs/macosx/macosx.factor
+++ b/basis/unix/statfs/macosx/macosx.factor
@@ -116,5 +116,5 @@ STRUCT: statfs64
{ f_mntfromname { char MAXPATHLEN } }
{ f_reserved uint32_t[8] } ;
-FUNCTION: int statfs64 ( char* path, statfs64* buf ) ;
+FUNCTION: int statfs64 ( c-string path, statfs64* buf ) ;
FUNCTION: int getmntinfo64 ( statfs64** mntbufp, int flags ) ;
diff --git a/basis/unix/statfs/macosx/platforms.txt b/basis/unix/statfs/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/unix/statfs/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/unix/statfs/macosx/tags.txt b/basis/unix/statfs/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statfs/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statfs/openbsd/openbsd.factor b/basis/unix/statfs/openbsd/openbsd.factor
index 4e65e74c2c..9c63bfa96b 100644
--- a/basis/unix/statfs/openbsd/openbsd.factor
+++ b/basis/unix/statfs/openbsd/openbsd.factor
@@ -31,4 +31,4 @@ STRUCT: statfs
{ f_mntfromname { char MNAMELEN } }
{ mount_info char[160] } ;
-FUNCTION: int statfs ( char* path, statfs* buf ) ;
+FUNCTION: int statfs ( c-string path, statfs* buf ) ;
diff --git a/basis/unix/statfs/openbsd/platforms.txt b/basis/unix/statfs/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/unix/statfs/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/unix/statfs/openbsd/tags.txt b/basis/unix/statfs/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statfs/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statvfs/freebsd/freebsd.factor b/basis/unix/statvfs/freebsd/freebsd.factor
index c2834736b7..5e66a7daf9 100644
--- a/basis/unix/statvfs/freebsd/freebsd.factor
+++ b/basis/unix/statvfs/freebsd/freebsd.factor
@@ -20,4 +20,4 @@ STRUCT: statvfs
CONSTANT: ST_RDONLY HEX: 1 ! Read-only file system
CONSTANT: ST_NOSUID HEX: 2 ! Does not honor setuid/setgid
-FUNCTION: int statvfs ( char* path, statvfs* buf ) ;
+FUNCTION: int statvfs ( c-string path, statvfs* buf ) ;
diff --git a/basis/unix/statvfs/freebsd/platforms.txt b/basis/unix/statvfs/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/unix/statvfs/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/unix/statvfs/freebsd/tags.txt b/basis/unix/statvfs/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statvfs/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statvfs/linux/linux.factor b/basis/unix/statvfs/linux/linux.factor
index d7139d84b2..bda1eb9605 100644
--- a/basis/unix/statvfs/linux/linux.factor
+++ b/basis/unix/statvfs/linux/linux.factor
@@ -17,7 +17,7 @@ STRUCT: statvfs64
{ f_namemax ulong }
{ __f_spare int[6] } ;
-FUNCTION: int statvfs64 ( char* path, statvfs64* buf ) ;
+FUNCTION: int statvfs64 ( c-string path, statvfs64* buf ) ;
CONSTANT: ST_RDONLY 1 ! Mount read-only.
CONSTANT: ST_NOSUID 2 ! Ignore suid and sgid bits.
diff --git a/basis/unix/statvfs/linux/platforms.txt b/basis/unix/statvfs/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/unix/statvfs/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/unix/statvfs/linux/tags.txt b/basis/unix/statvfs/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statvfs/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statvfs/macosx/macosx.factor b/basis/unix/statvfs/macosx/macosx.factor
index 3fe44a28d0..18b794acbf 100644
--- a/basis/unix/statvfs/macosx/macosx.factor
+++ b/basis/unix/statvfs/macosx/macosx.factor
@@ -20,4 +20,4 @@ STRUCT: statvfs
CONSTANT: ST_RDONLY HEX: 1 ! Read-only file system
CONSTANT: ST_NOSUID HEX: 2 ! Does not honor setuid/setgid
-FUNCTION: int statvfs ( char* path, statvfs* buf ) ;
+FUNCTION: int statvfs ( c-string path, statvfs* buf ) ;
diff --git a/basis/unix/statvfs/macosx/platforms.txt b/basis/unix/statvfs/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/unix/statvfs/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/unix/statvfs/macosx/tags.txt b/basis/unix/statvfs/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statvfs/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statvfs/netbsd/netbsd.factor b/basis/unix/statvfs/netbsd/netbsd.factor
index a76774b656..f53d72f02e 100644
--- a/basis/unix/statvfs/netbsd/netbsd.factor
+++ b/basis/unix/statvfs/netbsd/netbsd.factor
@@ -33,4 +33,4 @@ STRUCT: statvfs
{ f_mntonname { char _VFS_MNAMELEN } }
{ f_mntfromname { char _VFS_MNAMELEN } } ;
-FUNCTION: int statvfs ( char* path, statvfs* buf ) ;
+FUNCTION: int statvfs ( c-string path, statvfs* buf ) ;
diff --git a/basis/unix/statvfs/netbsd/platforms.txt b/basis/unix/statvfs/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/unix/statvfs/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/unix/statvfs/netbsd/tags.txt b/basis/unix/statvfs/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statvfs/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statvfs/openbsd/openbsd.factor b/basis/unix/statvfs/openbsd/openbsd.factor
index d5b2ee30a8..146db770ef 100644
--- a/basis/unix/statvfs/openbsd/openbsd.factor
+++ b/basis/unix/statvfs/openbsd/openbsd.factor
@@ -19,4 +19,4 @@ STRUCT: statvfs
CONSTANT: ST_RDONLY 1
CONSTANT: ST_NOSUID 2
-FUNCTION: int statvfs ( char* path, statvfs* buf ) ;
+FUNCTION: int statvfs ( c-string path, statvfs* buf ) ;
diff --git a/basis/unix/statvfs/openbsd/platforms.txt b/basis/unix/statvfs/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/unix/statvfs/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/unix/statvfs/openbsd/tags.txt b/basis/unix/statvfs/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statvfs/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/statvfs/platforms.txt b/basis/unix/statvfs/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/statvfs/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/statvfs/tags.txt b/basis/unix/statvfs/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/statvfs/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/tags.txt b/basis/unix/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/unix/tags.txt
+++ b/basis/unix/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/unix/time/platforms.txt b/basis/unix/time/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/time/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/time/tags.txt b/basis/unix/time/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/time/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/time/time.factor b/basis/unix/time/time.factor
index 0a63965c20..72132bb132 100644
--- a/basis/unix/time/time.factor
+++ b/basis/unix/time/time.factor
@@ -35,7 +35,7 @@ STRUCT: tm
{ yday int }
{ isdst int }
{ gmtoff long }
- { zone char* } ;
+ { zone c-string } ;
FUNCTION: time_t time ( time_t* t ) ;
FUNCTION: tm* localtime ( time_t* clock ) ;
diff --git a/basis/unix/types/freebsd/platforms.txt b/basis/unix/types/freebsd/platforms.txt
new file mode 100644
index 0000000000..edfe86017d
--- /dev/null
+++ b/basis/unix/types/freebsd/platforms.txt
@@ -0,0 +1 @@
+freebsd
diff --git a/basis/unix/types/freebsd/tags.txt b/basis/unix/types/freebsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/types/freebsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/types/linux/platforms.txt b/basis/unix/types/linux/platforms.txt
new file mode 100644
index 0000000000..a08e1f35eb
--- /dev/null
+++ b/basis/unix/types/linux/platforms.txt
@@ -0,0 +1 @@
+linux
diff --git a/basis/unix/types/linux/tags.txt b/basis/unix/types/linux/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/types/linux/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/types/macosx/platforms.txt b/basis/unix/types/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/unix/types/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/unix/types/macosx/tags.txt b/basis/unix/types/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/types/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/types/netbsd/32/tags.txt b/basis/unix/types/netbsd/32/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/unix/types/netbsd/32/tags.txt
+++ b/basis/unix/types/netbsd/32/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/unix/types/netbsd/64/tags.txt b/basis/unix/types/netbsd/64/tags.txt
index 6bf68304bb..5d77766703 100644
--- a/basis/unix/types/netbsd/64/tags.txt
+++ b/basis/unix/types/netbsd/64/tags.txt
@@ -1 +1 @@
-unportable
+untested
diff --git a/basis/unix/types/netbsd/platforms.txt b/basis/unix/types/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/unix/types/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/unix/types/netbsd/tags.txt b/basis/unix/types/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/types/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/types/openbsd/platforms.txt b/basis/unix/types/openbsd/platforms.txt
new file mode 100644
index 0000000000..389b028aca
--- /dev/null
+++ b/basis/unix/types/openbsd/platforms.txt
@@ -0,0 +1 @@
+openbsd
diff --git a/basis/unix/types/openbsd/tags.txt b/basis/unix/types/openbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/types/openbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/types/platforms.txt b/basis/unix/types/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/types/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/types/tags.txt b/basis/unix/types/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/types/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/users/bsd/platforms.txt b/basis/unix/users/bsd/platforms.txt
new file mode 100644
index 0000000000..df796f15d4
--- /dev/null
+++ b/basis/unix/users/bsd/platforms.txt
@@ -0,0 +1 @@
+bsd
diff --git a/basis/unix/users/bsd/tags.txt b/basis/unix/users/bsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/users/bsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/users/platforms.txt b/basis/unix/users/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/unix/users/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/unix/users/tags.txt b/basis/unix/users/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/users/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/users/users.factor b/basis/unix/users/users.factor
index 5de176e242..0575538b87 100644
--- a/basis/unix/users/users.factor
+++ b/basis/unix/users/users.factor
@@ -37,7 +37,7 @@ PRIVATE>
: all-users ( -- seq )
[
- [ unix.ffi:getpwent dup ] [ unix.ffi:passwd memory>struct passwd>new-passwd ] produce nip
+ [ unix.ffi:getpwent dup ] [ passwd>new-passwd ] produce nip
] with-pwent ;
SYMBOL: user-cache
@@ -52,10 +52,10 @@ GENERIC: user-passwd ( obj -- passwd/f )
M: integer user-passwd ( id -- passwd/f )
user-cache get
- [ at ] [ unix.ffi:getpwuid [ unix.ffi:passwd memory>struct passwd>new-passwd ] [ f ] if* ] if* ;
+ [ at ] [ unix.ffi:getpwuid [ passwd>new-passwd ] [ f ] if* ] if* ;
M: string user-passwd ( string -- passwd/f )
- unix.ffi:getpwnam dup [ unix.ffi:passwd memory>struct passwd>new-passwd ] when ;
+ unix.ffi:getpwnam dup [ passwd>new-passwd ] when ;
: user-name ( id -- string )
dup user-passwd
diff --git a/basis/unix/utilities/tags.txt b/basis/unix/utilities/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/utilities/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/utmpx/macosx/macosx.factor b/basis/unix/utmpx/macosx/macosx.factor
index 92a0d9e3a4..faae29ffa4 100644
--- a/basis/unix/utmpx/macosx/macosx.factor
+++ b/basis/unix/utmpx/macosx/macosx.factor
@@ -1,6 +1,6 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: alien.syntax unix.bsd.macosx ;
+USING: alien.syntax unix.ffi.bsd.macosx ;
IN: unix.utmpx.macosx
! empty
diff --git a/basis/unix/utmpx/macosx/platforms.txt b/basis/unix/utmpx/macosx/platforms.txt
new file mode 100644
index 0000000000..6e806f449e
--- /dev/null
+++ b/basis/unix/utmpx/macosx/platforms.txt
@@ -0,0 +1 @@
+macosx
diff --git a/basis/unix/utmpx/macosx/tags.txt b/basis/unix/utmpx/macosx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/utmpx/macosx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/utmpx/netbsd/netbsd.factor b/basis/unix/utmpx/netbsd/netbsd.factor
index 40fce746b1..93092a7cbf 100644
--- a/basis/unix/utmpx/netbsd/netbsd.factor
+++ b/basis/unix/utmpx/netbsd/netbsd.factor
@@ -1,22 +1,20 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: alien.syntax unix.utmpx unix.bsd.netbsd accessors
-unix.utmpx system kernel unix combinators ;
+USING: alien.syntax unix unix.utmpx unix.ffi.bsd.netbsd accessors
+system kernel combinators ;
IN: unix.utmpx.netbsd
-TUPLE: netbsd-utmpx-record < utmpx-record termination exit
-sockaddr ;
-
+TUPLE: netbsd-utmpx-record < utmpx-record
+termination exit sockaddr ;
+
M: netbsd new-utmpx-record ( -- utmpx-record )
- netbsd-utmpx-record new ;
-
+ netbsd-utmpx-record new ;
+
M: netbsd utmpx>utmpx-record ( utmpx -- record )
- [ new-utmpx-record ] keep
- {
- [
- utmpx-ut_exit
- [ exit_struct-e_termination >>termination ]
- [ exit_struct-e_exit >>exit ] bi
- ]
- [ utmpx-ut_ss >>sockaddr ]
- } cleave ;
+ [ new-utmpx-record ] dip
+ [
+ ut_exit>>
+ [ e_termination>> >>termination ]
+ [ e_exit>> >>exit ] bi
+ ]
+ [ ut_ss>> >>sockaddr ] bi ;
diff --git a/basis/unix/utmpx/netbsd/platforms.txt b/basis/unix/utmpx/netbsd/platforms.txt
new file mode 100644
index 0000000000..dccfe71042
--- /dev/null
+++ b/basis/unix/utmpx/netbsd/platforms.txt
@@ -0,0 +1 @@
+netbsd
diff --git a/basis/unix/utmpx/netbsd/tags.txt b/basis/unix/utmpx/netbsd/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/utmpx/netbsd/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/utmpx/platforms.txt b/basis/unix/utmpx/platforms.txt
new file mode 100644
index 0000000000..abe56c1458
--- /dev/null
+++ b/basis/unix/utmpx/platforms.txt
@@ -0,0 +1,2 @@
+macosx
+netbsd
diff --git a/basis/unix/utmpx/tags.txt b/basis/unix/utmpx/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/unix/utmpx/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/unix/utmpx/utmpx.factor b/basis/unix/utmpx/utmpx.factor
index 6083776fc6..1d6dfdedec 100644
--- a/basis/unix/utmpx/utmpx.factor
+++ b/basis/unix/utmpx/utmpx.factor
@@ -2,8 +2,8 @@
! See http://factorcode.org/license.txt for BSD license.
USING: alien.c-types alien.data alien.syntax combinators
continuations io.encodings.string io.encodings.utf8 kernel
-sequences strings unix calendar system accessors unix.time
-calendar.unix vocabs.loader classes.struct ;
+sequences strings calendar system accessors unix unix.time
+unix.ffi calendar.unix vocabs.loader classes.struct ;
IN: unix.utmpx
CONSTANT: EMPTY 0
@@ -19,6 +19,8 @@ CONSTANT: ACCOUNTING 9
CONSTANT: SIGNATURE 10
CONSTANT: SHUTDOWN_TIME 11
+C-TYPE: utmpx
+
FUNCTION: void setutxent ( ) ;
FUNCTION: void endutxent ( ) ;
FUNCTION: utmpx* getutxent ( ) ;
@@ -39,7 +41,7 @@ M: unix new-utmpx-record
utmpx-record new ;
M: unix utmpx>utmpx-record ( utmpx -- utmpx-record )
- [ new-utmpx-record ] dip \ utmpx memory>struct
+ [ new-utmpx-record ] dip
{
[ ut_user>> _UTX_USERSIZE memory>string >>user ]
[ ut_id>> _UTX_IDSIZE memory>string >>id ]
diff --git a/basis/vocabs/files/files-docs.factor b/basis/vocabs/files/files-docs.factor
index e2c6a5f373..61a2e68707 100644
--- a/basis/vocabs/files/files-docs.factor
+++ b/basis/vocabs/files/files-docs.factor
@@ -1,6 +1,14 @@
USING: help.markup help.syntax strings ;
IN: vocabs.files
+HELP: vocab-tests-file
+{ $values { "vocab" "a vocabulary specifier" } { "path" "pathname string to test file" } }
+{ $description "Outputs a pathname where the unit test file is located." } ;
+
+HELP: vocab-tests-dir
+{ $values { "vocab" "a vocabulary specifier" } { "paths" "a sequence of pathname strings" } }
+{ $description "Outputs a sequence of pathnames for the tests in the test directory." } ;
+
HELP: vocab-files
{ $values { "vocab" "a vocabulary specifier" } { "seq" "a sequence of pathname strings" } }
{ $description "Outputs a sequence of files comprising this vocabulary, or " { $link f } " if the vocabulary does not have a directory on disk." } ;
diff --git a/basis/vocabs/files/files.factor b/basis/vocabs/files/files.factor
index c1d7dcfd59..1c3e3731bd 100644
--- a/basis/vocabs/files/files.factor
+++ b/basis/vocabs/files/files.factor
@@ -4,8 +4,6 @@ USING: io.directories io.files io.pathnames kernel make
sequences vocabs.loader ;
IN: vocabs.files
-
-
: vocab-tests ( vocab -- tests )
[
[ vocab-tests-file [ , ] when* ]
@@ -31,4 +27,4 @@ PRIVATE>
[ vocab-source-path [ , ] when* ]
[ vocab-docs-path [ , ] when* ]
[ vocab-tests % ] tri
- ] { } make ;
\ No newline at end of file
+ ] { } make ;
diff --git a/basis/vocabs/metadata/authors.txt b/basis/vocabs/metadata/authors.txt
index d4f5d6b3ae..1ad6ff84f7 100644
--- a/basis/vocabs/metadata/authors.txt
+++ b/basis/vocabs/metadata/authors.txt
@@ -1 +1,2 @@
-Slava Pestov
\ No newline at end of file
+Slava Pestov
+Joe Groff
\ No newline at end of file
diff --git a/basis/vocabs/metadata/metadata-docs.factor b/basis/vocabs/metadata/metadata-docs.factor
index 66041e249c..c3dce45c09 100644
--- a/basis/vocabs/metadata/metadata-docs.factor
+++ b/basis/vocabs/metadata/metadata-docs.factor
@@ -2,22 +2,40 @@ USING: help.markup help.syntax strings ;
IN: vocabs.metadata
ARTICLE: "vocabs.metadata" "Vocabulary metadata"
-"Vocabulary summaries:"
+"Vocabulary directories can contain text files with metadata:"
+{ $list
+ { { $snippet "authors.txt" } " - a series of lines, with one author name per line. These are listed under " { $link "vocab-authors" } "." }
+ { { $snippet "platforms.txt" } " - a series of lines, with one operating system name per line." }
+ { { $snippet "resources.txt" } " - a series of lines, with one file glob pattern per line. Files inside the vocabulary directory whose names match any of these glob patterns will be included with the compiled application as " { $link "deploy-resources" } "." }
+ { { $snippet "summary.txt" } " - a one-line description." }
+ { { $snippet "tags.txt" } " - a series of lines, with one tag per line. Tags help classify the vocabulary. Consult " { $link "vocab-tags" } " for a list of existing tags you can reuse." }
+}
+"Words for reading and writing " { $snippet "summary.txt" } ":"
{ $subsections
vocab-summary
set-vocab-summary
}
-"Vocabulary authors:"
+"Words for reading and writing " { $snippet "authors.txt" } ":"
{ $subsections
vocab-authors
set-vocab-authors
}
-"Vocabulary tags:"
+"Words for reading and writing " { $snippet "tags.txt" } ":"
{ $subsections
vocab-tags
set-vocab-tags
add-vocab-tags
}
+"Words for reading and writing " { $snippet "platforms.txt" } ":"
+{ $subsections
+ vocab-platforms
+ set-vocab-platforms
+}
+"Words for reading and writing " { $snippet "resources.txt" } ":"
+{ $subsections
+ vocab-resources
+ set-vocab-resources
+}
"Getting and setting arbitrary vocabulary metadata:"
{ $subsections
vocab-file-contents
@@ -50,3 +68,21 @@ HELP: set-vocab-tags
{ $values { "tags" "a sequence of strings" } { "vocab" "a vocabulary specifier" } }
{ $description "Stores a list of short tags classifying the vocabulary to the " { $snippet "tags.txt" } " file in the vocabulary's directory." } ;
+HELP: vocab-platforms
+{ $values { "vocab" "a vocabulary specifier" } { "platforms" "a sequence of operating system symbols" } }
+{ $description "Outputs a list of operating systems supported by " { $snippet "vocab" } ", as specified by the " { $snippet "platforms.txt" } " file in the vocabulary's directory. Outputs an empty array if the file doesn't exist." }
+{ $notes "Operating system symbols are defined in the " { $vocab-link "system" } " vocabulary." } ;
+
+HELP: set-vocab-platforms
+{ $values { "platforms" "a sequence of operating system symbols" } { "vocab" "a vocabulary specifier" } }
+{ $description "Stores a list of operating systems supported by " { $snippet "vocab" } " to the " { $snippet "platforms.txt" } " file in the vocabulary's directory." }
+{ $notes "Operating system symbols are defined in the " { $vocab-link "system" } " vocabulary." } ;
+
+HELP: vocab-resources
+{ $values { "vocab" "a vocabulary specifier" } { "patterns" "a sequence of glob patterns" } }
+{ $description "Outputs a list of glob patterns matching files that will be deployed with an application that includes " { $snippet "vocab" } ", as specified by the " { $snippet "resources.txt" } " file in the vocabulary's directory. Outputs an empty array if the file doesn't exist." }
+{ $notes "The " { $vocab-link "vocabs.metadata.resources" } " vocabulary contains words that will expand the glob patterns and directory names in " { $snippet "patterns" } " and return all the matching files." } ;
+
+HELP: set-vocab-resources
+{ $values { "patterns" "a sequence of glob patterns" } { "vocab" "a vocabulary specifier" } }
+{ $description "Stores a list of glob patterns matching files that will be deployed with an application that includes " { $snippet "vocab" } " to the " { $snippet "resources.txt" } " file in the vocabulary's directory." } ;
diff --git a/basis/vocabs/metadata/metadata.factor b/basis/vocabs/metadata/metadata.factor
index 85a503c7f0..09ca012fcc 100644
--- a/basis/vocabs/metadata/metadata.factor
+++ b/basis/vocabs/metadata/metadata.factor
@@ -1,23 +1,41 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov, Joe Groff.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays assocs io.encodings.utf8 io.files
-io.pathnames kernel make math.parser memoize sequences sets
-sorting summary vocabs vocabs.loader ;
+USING: accessors arrays assocs io.directories io.encodings.utf8
+io.files io.pathnames kernel make math.parser memoize sequences
+sets sorting summary vocabs vocabs.loader words system
+classes.algebra combinators.short-circuit fry continuations
+namespaces ;
IN: vocabs.metadata
+: check-vocab ( vocab -- vocab )
+ dup find-vocab-root [ no-vocab ] unless ;
+
MEMO: vocab-file-contents ( vocab name -- seq )
vocab-append-path dup
[ dup exists? [ utf8 file-lines ] [ drop f ] if ] when ;
+: ?delete-file ( pathname -- ) '[ _ delete-file ] ignore-errors ;
+
: set-vocab-file-contents ( seq vocab name -- )
dupd vocab-append-path [
- utf8 set-file-lines
+ swap [ ?delete-file ] [ swap utf8 set-file-lines ] if-empty
\ vocab-file-contents reset-memoized
- ] [
- "The " swap vocab-name
- " vocabulary was not loaded from the file system"
- 3append throw
- ] ?if ;
+ ] [ vocab-name no-vocab ] ?if ;
+
+: vocab-windows-icon-path ( vocab -- string )
+ vocab-dir "icon.ico" append-path ;
+
+: vocab-mac-icon-path ( vocab -- string )
+ vocab-dir "icon.icns" append-path ;
+
+: vocab-resources-path ( vocab -- string )
+ vocab-dir "resources.txt" append-path ;
+
+: vocab-resources ( vocab -- patterns )
+ dup vocab-resources-path vocab-file-contents harvest ;
+
+: set-vocab-resources ( patterns vocab -- )
+ dup vocab-resources-path set-vocab-file-contents ;
: vocab-summary-path ( vocab -- string )
vocab-dir "summary.txt" append-path ;
@@ -57,6 +75,9 @@ M: vocab-link summary vocab-summary ;
: add-vocab-tags ( tags vocab -- )
[ vocab-tags append prune ] keep set-vocab-tags ;
+: remove-vocab-tags ( tags vocab -- )
+ [ vocab-tags swap diff ] keep set-vocab-tags ;
+
: vocab-authors-path ( vocab -- string )
vocab-dir "authors.txt" append-path ;
@@ -66,5 +87,37 @@ M: vocab-link summary vocab-summary ;
: set-vocab-authors ( authors vocab -- )
dup vocab-authors-path set-vocab-file-contents ;
+: vocab-platforms-path ( vocab -- string )
+ vocab-dir "platforms.txt" append-path ;
+
+ERROR: bad-platform name ;
+
+: vocab-platforms ( vocab -- platforms )
+ dup vocab-platforms-path vocab-file-contents
+ [ dup "system" lookup [ ] [ bad-platform ] ?if ] map ;
+
+: set-vocab-platforms ( platforms vocab -- )
+ [ [ name>> ] map ] dip
+ dup vocab-platforms-path set-vocab-file-contents ;
+
+: supported-platform? ( platforms -- ? )
+ [ t ] [ [ os swap class<= ] any? ] if-empty ;
+
: unportable? ( vocab -- ? )
- vocab-tags "unportable" swap member? ;
\ No newline at end of file
+ {
+ [ vocab-tags "untested" swap member? ]
+ [ vocab-platforms supported-platform? not ]
+ } 1|| ;
+
+TUPLE: unsupported-platform vocab requires ;
+
+: unsupported-platform ( vocab requires -- )
+ \ unsupported-platform boa throw-continue ;
+
+M: unsupported-platform summary
+ drop "Current operating system not supported by this vocabulary" ;
+
+[
+ dup vocab-platforms dup supported-platform?
+ [ 2drop ] [ [ vocab-name ] dip unsupported-platform ] if
+] check-vocab-hook set-global
diff --git a/basis/vocabs/metadata/resources/resources-docs.factor b/basis/vocabs/metadata/resources/resources-docs.factor
new file mode 100644
index 0000000000..a20775e937
--- /dev/null
+++ b/basis/vocabs/metadata/resources/resources-docs.factor
@@ -0,0 +1,26 @@
+! (c)2010 Joe Groff bsd license
+USING: help.markup help.syntax kernel ;
+IN: vocabs.metadata.resources
+
+HELP: expand-vocab-resource-files
+{ $values
+ { "vocab" "a vocabulary specifier" } { "resource-glob-strings" "a sequence of glob patterns" }
+ { "filenames" "a sequence of filenames" }
+}
+{ $description "Matches all the glob patterns in " { $snippet "resource-glob-strings" } " to the set of files inside " { $snippet "vocab" } "'s directory and outputs a sequence containing the individual files and directories that match. Any matching directories will also have their contents recursively included in the output. The paths in the output will be relative to " { $snippet "vocab" } "'s directory." } ;
+
+HELP: vocab-resource-files
+{ $values
+ { "vocab" "a vocabulary specifier" }
+ { "filenames" "a sequence of filenames" }
+}
+{ $description "Outputs a sequence containing the individual resource files and directories that match the patterns specified in " { $snippet "vocab" } "'s " { $snippet "resources.txt" } " file. Any matching directories will also have their contents recursively included in the output. The paths in the output will be relative to " { $snippet "vocab" } "'s directory." } ;
+
+ARTICLE: "vocabs.metadata.resources" "Vocabulary resource metadata"
+"The " { $vocab-link "vocabs.metadata.resources" } " vocabulary contains words to retrieve the full list of files that match the patterns specified in a vocabulary's " { $snippet "resources.txt" } " file."
+{ $subsections
+ vocab-resource-files
+ expand-vocab-resource-files
+} ;
+
+ABOUT: "vocabs.metadata.resources"
diff --git a/basis/vocabs/metadata/resources/resources-tests.factor b/basis/vocabs/metadata/resources/resources-tests.factor
new file mode 100644
index 0000000000..5c50406a26
--- /dev/null
+++ b/basis/vocabs/metadata/resources/resources-tests.factor
@@ -0,0 +1,18 @@
+! (c)2010 Joe Groff bsd license
+USING: sorting tools.test vocabs.metadata.resources ;
+IN: vocabs.metadata.resources.tests
+
+[ { "bar" "bas" "foo" } ]
+[ "vocabs.metadata.resources.test.1" vocab-resource-files natural-sort ] unit-test
+
+[ { "bar.wtf" "foo.wtf" } ]
+[ "vocabs.metadata.resources.test.2" vocab-resource-files natural-sort ] unit-test
+
+[ {
+ "resource-dir"
+ "resource-dir/bar"
+ "resource-dir/bas"
+ "resource-dir/bas/zang"
+ "resource-dir/bas/zim"
+ "resource-dir/foo"
+} ] [ "vocabs.metadata.resources.test.3" vocab-resource-files natural-sort ] unit-test
diff --git a/basis/vocabs/metadata/resources/resources.factor b/basis/vocabs/metadata/resources/resources.factor
new file mode 100644
index 0000000000..d8f9bdcffd
--- /dev/null
+++ b/basis/vocabs/metadata/resources/resources.factor
@@ -0,0 +1,45 @@
+! (c)2010 Joe Groff bsd license
+USING: arrays fry globs io.directories io.files.info
+io.pathnames kernel regexp sequences vocabs.loader
+vocabs.metadata ;
+IN: vocabs.metadata.resources
+
+
+
+: vocab-dir-in-root ( vocab -- dir )
+ [ find-vocab-root ] [ vocab-dir ] bi append-path ;
+
+: expand-vocab-resource-files ( vocab resource-glob-strings -- filenames )
+ [ vocab-dir-in-root ] dip [ ] map '[
+ _ filter-resources
+ [ (expand-vocab-resource) ] map concat
+ ] with-directory-tree-files ;
+
+: vocab-resource-files ( vocab -- filenames )
+ dup vocab-resources
+ [ drop f ] [ expand-vocab-resource-files ] if-empty ;
+
+: copy-vocab-resources ( dir vocab -- )
+ dup vocab-resource-files
+ [ 2drop ] [
+ [ [ vocab-dir append-path ] [ vocab-dir-in-root ] bi ] dip
+ [ 2drop make-directories ]
+ [ [ copy-vocab-resource ] with with each ] 3bi
+ ] if-empty ;
+
diff --git a/basis/vocabs/metadata/resources/test/1/1.factor b/basis/vocabs/metadata/resources/test/1/1.factor
new file mode 100644
index 0000000000..dddc0ddd58
--- /dev/null
+++ b/basis/vocabs/metadata/resources/test/1/1.factor
@@ -0,0 +1,6 @@
+USING: io kernel ;
+IN: vocabs.metadata.resources.test.1
+
+: main ( -- ) "Resources test 1" print ;
+
+MAIN: main
diff --git a/basis/vocabs/metadata/resources/test/1/bar b/basis/vocabs/metadata/resources/test/1/bar
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/1/bas b/basis/vocabs/metadata/resources/test/1/bas
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/1/foo b/basis/vocabs/metadata/resources/test/1/foo
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/1/resources.txt b/basis/vocabs/metadata/resources/test/1/resources.txt
new file mode 100644
index 0000000000..ce0f4c956c
--- /dev/null
+++ b/basis/vocabs/metadata/resources/test/1/resources.txt
@@ -0,0 +1,3 @@
+foo
+bar
+bas
diff --git a/basis/vocabs/metadata/resources/test/2/2.factor b/basis/vocabs/metadata/resources/test/2/2.factor
new file mode 100644
index 0000000000..82a5a11d18
--- /dev/null
+++ b/basis/vocabs/metadata/resources/test/2/2.factor
@@ -0,0 +1,6 @@
+USING: io kernel ;
+IN: vocabs.metadata.resources.test.2
+
+: main ( -- ) "Resources test 2" print ;
+
+MAIN: main
diff --git a/basis/vocabs/metadata/resources/test/2/bar.wtf b/basis/vocabs/metadata/resources/test/2/bar.wtf
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/2/bas.ftw b/basis/vocabs/metadata/resources/test/2/bas.ftw
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/2/foo.wtf b/basis/vocabs/metadata/resources/test/2/foo.wtf
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/2/no-resources-here/zim.wtf b/basis/vocabs/metadata/resources/test/2/no-resources-here/zim.wtf
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/2/resources.txt b/basis/vocabs/metadata/resources/test/2/resources.txt
new file mode 100644
index 0000000000..8dfd81c911
--- /dev/null
+++ b/basis/vocabs/metadata/resources/test/2/resources.txt
@@ -0,0 +1 @@
+*.wtf
diff --git a/basis/vocabs/metadata/resources/test/3/3.factor b/basis/vocabs/metadata/resources/test/3/3.factor
new file mode 100644
index 0000000000..a81fd707c5
--- /dev/null
+++ b/basis/vocabs/metadata/resources/test/3/3.factor
@@ -0,0 +1,6 @@
+USING: io kernel ;
+IN: vocabs.metadata.resources.test.3
+
+: main ( -- ) "Resources test 3" print ;
+
+MAIN: main
diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bar b/basis/vocabs/metadata/resources/test/3/resource-dir/bar
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zang b/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zang
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zim b/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zim
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/foo b/basis/vocabs/metadata/resources/test/3/resource-dir/foo
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/basis/vocabs/metadata/resources/test/3/resources.txt b/basis/vocabs/metadata/resources/test/3/resources.txt
new file mode 100644
index 0000000000..c27d538826
--- /dev/null
+++ b/basis/vocabs/metadata/resources/test/3/resources.txt
@@ -0,0 +1 @@
+resource-dir
diff --git a/basis/windows/advapi32/advapi32.factor b/basis/windows/advapi32/advapi32.factor
index fa478b03ed..d5fe33b745 100644
--- a/basis/windows/advapi32/advapi32.factor
+++ b/basis/windows/advapi32/advapi32.factor
@@ -405,7 +405,7 @@ CONSTANT: KEY_READ HEX: 20019
CONSTANT: KEY_WOW64_32KEY HEX: 0200
CONSTANT: KEY_WOW64_64KEY HEX: 0100
CONSTANT: KEY_WRITE HEX: 20006
-CONSTANT: KEY_EXECUTE KEY_READ
+ALIAS: KEY_EXECUTE KEY_READ
CONSTANT: KEY_ALL_ACCESS HEX: F003F
CONSTANT: REG_NONE 0
@@ -423,6 +423,9 @@ CONSTANT: REG_RESOURCE_REQUIREMENTS_LIST 10
CONSTANT: REG_QWORD 11
CONSTANT: REG_QWORD_LITTLE_ENDIAN 11
+CONSTANT: REG_CREATED_NEW_KEY 1
+CONSTANT: REG_OPENED_EXISTING_KEY 2
+
TYPEDEF: DWORD REGSAM
! : I_ScGetCurrentGroupStateW ;
@@ -926,6 +929,7 @@ FUNCTION: LONG RegCloseKey ( HKEY hKey ) ;
! : RegCreateKeyA ;
! : RegCreateKeyExA ;
FUNCTION: LONG RegCreateKeyExW ( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved, LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition ) ;
+ALIAS: RegCreateKeyEx RegCreateKeyExW
! : RegCreateKeyW
! : RegDeleteKeyA ;
! : RegDeleteKeyW ;
@@ -949,6 +953,7 @@ ALIAS: RegDeleteKeyEx RegDeleteKeyExW
! : RegDisablePredefinedCache ;
! : RegEnumKeyA ;
! : RegEnumKeyExA ;
+
FUNCTION: LONG RegEnumKeyExW (
HKEY hKey,
DWORD dwIndex,
@@ -959,6 +964,8 @@ FUNCTION: LONG RegEnumKeyExW (
LPDWORD lpcClass,
PFILETIME lpftLastWriteTime
) ;
+ALIAS: RegEnumKeyEx RegEnumKeyExW
+
! : RegEnumKeyW ;
! : RegEnumValueA ;
@@ -1023,7 +1030,8 @@ ALIAS: RegQueryValueEx RegQueryValueExW
! : RegSetValueA ;
! : RegSetValueExA ;
! : RegSetValueExW ;
-! : RegSetValueW ;
+FUNCTION: LONG RegSetValueExW ( HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, BYTE* lpData, DWORD cbData ) ;
+ALIAS: RegSetValueEx RegSetValueExW
! : RegUnLoadKeyA ;
! : RegUnLoadKeyW ;
! : RegisterEventSourceA ;
diff --git a/basis/windows/advapi32/platforms.txt b/basis/windows/advapi32/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/advapi32/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/advapi32/tags.txt b/basis/windows/advapi32/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/advapi32/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/ce/platforms.txt b/basis/windows/ce/platforms.txt
new file mode 100644
index 0000000000..cd0d980f6f
--- /dev/null
+++ b/basis/windows/ce/platforms.txt
@@ -0,0 +1 @@
+wince
diff --git a/basis/windows/ce/tags.txt b/basis/windows/ce/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/ce/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/com/com-tests.factor b/basis/windows/com/com-tests.factor
index 329a84ef13..fdc48adfbe 100644
--- a/basis/windows/com/com-tests.factor
+++ b/basis/windows/com/com-tests.factor
@@ -1,5 +1,5 @@
USING: kernel windows.com windows.com.syntax windows.ole32
-alien alien.syntax tools.test libc alien.c-types
+windows.types alien alien.syntax tools.test libc alien.c-types
namespaces arrays continuations accessors math windows.com.wrapper
windows.com.wrapper.private destructors effects compiler.units ;
IN: windows.com.tests
@@ -16,6 +16,9 @@ COM-INTERFACE: IUnrelated IUnknown {b06ac3f4-30e4-406b-a7cd-c29cead4552c}
int xPlus ( int y )
int xMulAdd ( int mul, int add ) ;
+COM-INTERFACE: ISelfReferential IUnknown {d4f45bf8-f720-4701-a09d-e8e341981121}
+ ISelfReferential* selfReference ( ) ;
+
{ GUID: {216fb341-0eb2-44b1-8edb-60b76e353abc} } [ ISimple-iid ] unit-test
{ GUID: {9620ecec-8438-423b-bb14-86f835aa40dd} } [ IInherited-iid ] unit-test
{ GUID: {00000000-0000-0000-C000-000000000046} } [ IUnknown-iid ] unit-test
diff --git a/basis/windows/com/com.factor b/basis/windows/com/com.factor
index 33164f52c4..094859009d 100644
--- a/basis/windows/com/com.factor
+++ b/basis/windows/com/com.factor
@@ -11,6 +11,8 @@ COM-INTERFACE: IUnknown f {00000000-0000-0000-C000-000000000046}
ULONG Release ( ) ;
C-TYPE: IAdviseSink
+C-TYPE: IEnumFORMATETC
+C-TYPE: IEnumSTATDATA
COM-INTERFACE: IDataObject IUnknown {0000010E-0000-0000-C000-000000000046}
HRESULT GetData ( FORMATETC* pFormatetc, STGMEDIUM* pmedium )
diff --git a/basis/windows/com/platforms.txt b/basis/windows/com/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/com/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/com/prettyprint/platforms.txt b/basis/windows/com/prettyprint/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/com/prettyprint/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/com/prettyprint/prettyprint.factor b/basis/windows/com/prettyprint/prettyprint.factor
index c75f43f560..ef79a58600 100644
--- a/basis/windows/com/prettyprint/prettyprint.factor
+++ b/basis/windows/com/prettyprint/prettyprint.factor
@@ -1,7 +1,7 @@
! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: windows.com windows.kernel32 windows.ole32
-prettyprint.custom prettyprint.sections sequences ;
+USING: windows.kernel32 windows.ole32 prettyprint.custom
+prettyprint.sections sequences ;
IN: windows.com.prettyprint
M: GUID pprint* guid>string "GUID: " prepend text ;
diff --git a/basis/windows/com/prettyprint/tags.txt b/basis/windows/com/prettyprint/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/com/prettyprint/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/com/syntax/platforms.txt b/basis/windows/com/syntax/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/com/syntax/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/com/syntax/syntax.factor b/basis/windows/com/syntax/syntax.factor
index fc7d986cbc..5230d9497e 100644
--- a/basis/windows/com/syntax/syntax.factor
+++ b/basis/windows/com/syntax/syntax.factor
@@ -3,6 +3,7 @@ effects kernel windows.ole32 parser lexer splitting grouping
sequences namespaces assocs quotations generalizations
accessors words macros alien.syntax fry arrays layouts math
classes.struct windows.kernel32 ;
+FROM: alien.parser.private => return-type-name ;
IN: windows.com.syntax
;
: (define-word-for-function) ( function interface n -- )
@@ -83,17 +84,16 @@ ERROR: no-com-interface interface ;
: define-words-for-com-interface ( definition -- )
[ [ (iid-word) ] [ iid>> 1quotation ] bi (( -- iid )) define-declared ]
- [ word>> void* swap typedef ]
[
dup family-tree-functions
[ (define-word-for-function) ] with each-index
- ]
- tri ;
+ ] bi ;
PRIVATE>
SYNTAX: COM-INTERFACE:
CREATE-C-TYPE
+ void* over typedef
scan-object find-com-interface-definition
scan string>guid
parse-com-functions
diff --git a/basis/windows/com/syntax/tags.txt b/basis/windows/com/syntax/tags.txt
index 2320bdd648..bb863cf9a0 100755
--- a/basis/windows/com/syntax/tags.txt
+++ b/basis/windows/com/syntax/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/com/tags.txt b/basis/windows/com/tags.txt
index 2320bdd648..40fc52b29b 100755
--- a/basis/windows/com/tags.txt
+++ b/basis/windows/com/tags.txt
@@ -1,2 +1,2 @@
-unportable
bindings
+ffi
diff --git a/basis/windows/com/wrapper/platforms.txt b/basis/windows/com/wrapper/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/com/wrapper/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/com/wrapper/tags.txt b/basis/windows/com/wrapper/tags.txt
index 2320bdd648..bb863cf9a0 100755
--- a/basis/windows/com/wrapper/tags.txt
+++ b/basis/windows/com/wrapper/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/com/wrapper/wrapper.factor b/basis/windows/com/wrapper/wrapper.factor
index 696902439c..623a9c8db3 100644
--- a/basis/windows/com/wrapper/wrapper.factor
+++ b/basis/windows/com/wrapper/wrapper.factor
@@ -49,8 +49,7 @@ unless
: (make-query-interface) ( interfaces -- quot )
(query-interface-cases)
'[
- swap GUID memory>struct
- _ case
+ swap _ case
[
void* heap-size * rot com-add-ref
swap 0 set-alien-cell S_OK
diff --git a/basis/windows/ddk/hid/authors.txt b/basis/windows/ddk/hid/authors.txt
new file mode 100644
index 0000000000..67cf648cf5
--- /dev/null
+++ b/basis/windows/ddk/hid/authors.txt
@@ -0,0 +1 @@
+Erik Charlebois
\ No newline at end of file
diff --git a/basis/windows/ddk/hid/hid.factor b/basis/windows/ddk/hid/hid.factor
new file mode 100644
index 0000000000..9c8a55ee7c
--- /dev/null
+++ b/basis/windows/ddk/hid/hid.factor
@@ -0,0 +1,805 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.c-types alien.libraries alien.syntax classes.struct
+kernel math windows.types windows.ole32 ;
+IN: windows.ddk.hid
+
+<< "hid" "hid.dll" "stdcall" add-library >>
+LIBRARY: hid
+
+TYPEDEF: LONG NTSTATUS
+TYPEDEF: USHORT USAGE
+TYPEDEF: USAGE* PUSAGE
+
+CONSTANT: HID_USAGE_PAGE_UNDEFINED HEX: 00
+CONSTANT: HID_USAGE_PAGE_GENERIC HEX: 01
+CONSTANT: HID_USAGE_PAGE_SIMULATION HEX: 02
+CONSTANT: HID_USAGE_PAGE_VR HEX: 03
+CONSTANT: HID_USAGE_PAGE_SPORT HEX: 04
+CONSTANT: HID_USAGE_PAGE_GAME HEX: 05
+CONSTANT: HID_USAGE_PAGE_KEYBOARD HEX: 07
+CONSTANT: HID_USAGE_PAGE_LED HEX: 08
+CONSTANT: HID_USAGE_PAGE_BUTTON HEX: 09
+CONSTANT: HID_USAGE_PAGE_ORDINAL HEX: 0A
+CONSTANT: HID_USAGE_PAGE_TELEPHONY HEX: 0B
+CONSTANT: HID_USAGE_PAGE_CONSUMER HEX: 0C
+CONSTANT: HID_USAGE_PAGE_DIGITIZER HEX: 0D
+CONSTANT: HID_USAGE_PAGE_UNICODE HEX: 10
+CONSTANT: HID_USAGE_PAGE_ALPHANUMERIC HEX: 14
+
+CONSTANT: HID_USAGE_PAGE_MICROSOFT_BLUETOOTH_HANDSFREE HEX: FFF3
+
+CONSTANT: HID_USAGE_GENERIC_POINTER HEX: 01
+CONSTANT: HID_USAGE_GENERIC_MOUSE HEX: 02
+CONSTANT: HID_USAGE_GENERIC_JOYSTICK HEX: 04
+CONSTANT: HID_USAGE_GENERIC_GAMEPAD HEX: 05
+CONSTANT: HID_USAGE_GENERIC_KEYBOARD HEX: 06
+CONSTANT: HID_USAGE_GENERIC_KEYPAD HEX: 07
+CONSTANT: HID_USAGE_GENERIC_SYSTEM_CTL HEX: 80
+
+CONSTANT: HID_USAGE_GENERIC_X HEX: 30
+CONSTANT: HID_USAGE_GENERIC_Y HEX: 31
+CONSTANT: HID_USAGE_GENERIC_Z HEX: 32
+CONSTANT: HID_USAGE_GENERIC_RX HEX: 33
+CONSTANT: HID_USAGE_GENERIC_RY HEX: 34
+CONSTANT: HID_USAGE_GENERIC_RZ HEX: 35
+CONSTANT: HID_USAGE_GENERIC_SLIDER HEX: 36
+CONSTANT: HID_USAGE_GENERIC_DIAL HEX: 37
+CONSTANT: HID_USAGE_GENERIC_WHEEL HEX: 38
+CONSTANT: HID_USAGE_GENERIC_HATSWITCH HEX: 39
+CONSTANT: HID_USAGE_GENERIC_COUNTED_BUFFER HEX: 3A
+CONSTANT: HID_USAGE_GENERIC_BYTE_COUNT HEX: 3B
+CONSTANT: HID_USAGE_GENERIC_MOTION_WAKEUP HEX: 3C
+CONSTANT: HID_USAGE_GENERIC_VX HEX: 40
+CONSTANT: HID_USAGE_GENERIC_VY HEX: 41
+CONSTANT: HID_USAGE_GENERIC_VZ HEX: 42
+CONSTANT: HID_USAGE_GENERIC_VBRX HEX: 43
+CONSTANT: HID_USAGE_GENERIC_VBRY HEX: 44
+CONSTANT: HID_USAGE_GENERIC_VBRZ HEX: 45
+CONSTANT: HID_USAGE_GENERIC_VNO HEX: 46
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_POWER HEX: 81
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_SLEEP HEX: 82
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_WAKE HEX: 83
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU HEX: 84
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_MAIN_MENU HEX: 85
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_APP_MENU HEX: 86
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_HELP_MENU HEX: 87
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_MENU_EXIT HEX: 88
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_MENU_SELECT HEX: 89
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT HEX: 8A
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_MENU_LEFT HEX: 8B
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_MENU_UP HEX: 8C
+CONSTANT: HID_USAGE_GENERIC_SYSCTL_MENU_DOWN HEX: 8D
+
+CONSTANT: HID_USAGE_SIMULATION_RUDDER HEX: BA
+CONSTANT: HID_USAGE_SIMULATION_THROTTLE HEX: BB
+
+CONSTANT: HID_USAGE_KEYBOARD_NOEVENT HEX: 00
+CONSTANT: HID_USAGE_KEYBOARD_ROLLOVER HEX: 01
+CONSTANT: HID_USAGE_KEYBOARD_POSTFAIL HEX: 02
+CONSTANT: HID_USAGE_KEYBOARD_UNDEFINED HEX: 03
+
+CONSTANT: HID_USAGE_KEYBOARD_aA HEX: 04
+CONSTANT: HID_USAGE_KEYBOARD_zZ HEX: 1D
+CONSTANT: HID_USAGE_KEYBOARD_ONE HEX: 1E
+CONSTANT: HID_USAGE_KEYBOARD_ZERO HEX: 27
+CONSTANT: HID_USAGE_KEYBOARD_LCTRL HEX: E0
+CONSTANT: HID_USAGE_KEYBOARD_LSHFT HEX: E1
+CONSTANT: HID_USAGE_KEYBOARD_LALT HEX: E2
+CONSTANT: HID_USAGE_KEYBOARD_LGUI HEX: E3
+CONSTANT: HID_USAGE_KEYBOARD_RCTRL HEX: E4
+CONSTANT: HID_USAGE_KEYBOARD_RSHFT HEX: E5
+CONSTANT: HID_USAGE_KEYBOARD_RALT HEX: E6
+CONSTANT: HID_USAGE_KEYBOARD_RGUI HEX: E7
+CONSTANT: HID_USAGE_KEYBOARD_SCROLL_LOCK HEX: 47
+CONSTANT: HID_USAGE_KEYBOARD_NUM_LOCK HEX: 53
+CONSTANT: HID_USAGE_KEYBOARD_CAPS_LOCK HEX: 39
+CONSTANT: HID_USAGE_KEYBOARD_F1 HEX: 3A
+CONSTANT: HID_USAGE_KEYBOARD_F12 HEX: 45
+CONSTANT: HID_USAGE_KEYBOARD_RETURN HEX: 28
+CONSTANT: HID_USAGE_KEYBOARD_ESCAPE HEX: 29
+CONSTANT: HID_USAGE_KEYBOARD_DELETE HEX: 2A
+CONSTANT: HID_USAGE_KEYBOARD_PRINT_SCREEN HEX: 46
+
+CONSTANT: HID_USAGE_LED_NUM_LOCK HEX: 01
+CONSTANT: HID_USAGE_LED_CAPS_LOCK HEX: 02
+CONSTANT: HID_USAGE_LED_SCROLL_LOCK HEX: 03
+CONSTANT: HID_USAGE_LED_COMPOSE HEX: 04
+CONSTANT: HID_USAGE_LED_KANA HEX: 05
+CONSTANT: HID_USAGE_LED_POWER HEX: 06
+CONSTANT: HID_USAGE_LED_SHIFT HEX: 07
+CONSTANT: HID_USAGE_LED_DO_NOT_DISTURB HEX: 08
+CONSTANT: HID_USAGE_LED_MUTE HEX: 09
+CONSTANT: HID_USAGE_LED_TONE_ENABLE HEX: 0A
+CONSTANT: HID_USAGE_LED_HIGH_CUT_FILTER HEX: 0B
+CONSTANT: HID_USAGE_LED_LOW_CUT_FILTER HEX: 0C
+CONSTANT: HID_USAGE_LED_EQUALIZER_ENABLE HEX: 0D
+CONSTANT: HID_USAGE_LED_SOUND_FIELD_ON HEX: 0E
+CONSTANT: HID_USAGE_LED_SURROUND_FIELD_ON HEX: 0F
+CONSTANT: HID_USAGE_LED_REPEAT HEX: 10
+CONSTANT: HID_USAGE_LED_STEREO HEX: 11
+CONSTANT: HID_USAGE_LED_SAMPLING_RATE_DETECT HEX: 12
+CONSTANT: HID_USAGE_LED_SPINNING HEX: 13
+CONSTANT: HID_USAGE_LED_CAV HEX: 14
+CONSTANT: HID_USAGE_LED_CLV HEX: 15
+CONSTANT: HID_USAGE_LED_RECORDING_FORMAT_DET HEX: 16
+CONSTANT: HID_USAGE_LED_OFF_HOOK HEX: 17
+CONSTANT: HID_USAGE_LED_RING HEX: 18
+CONSTANT: HID_USAGE_LED_MESSAGE_WAITING HEX: 19
+CONSTANT: HID_USAGE_LED_DATA_MODE HEX: 1A
+CONSTANT: HID_USAGE_LED_BATTERY_OPERATION HEX: 1B
+CONSTANT: HID_USAGE_LED_BATTERY_OK HEX: 1C
+CONSTANT: HID_USAGE_LED_BATTERY_LOW HEX: 1D
+CONSTANT: HID_USAGE_LED_SPEAKER HEX: 1E
+CONSTANT: HID_USAGE_LED_HEAD_SET HEX: 1F
+CONSTANT: HID_USAGE_LED_HOLD HEX: 20
+CONSTANT: HID_USAGE_LED_MICROPHONE HEX: 21
+CONSTANT: HID_USAGE_LED_COVERAGE HEX: 22
+CONSTANT: HID_USAGE_LED_NIGHT_MODE HEX: 23
+CONSTANT: HID_USAGE_LED_SEND_CALLS HEX: 24
+CONSTANT: HID_USAGE_LED_CALL_PICKUP HEX: 25
+CONSTANT: HID_USAGE_LED_CONFERENCE HEX: 26
+CONSTANT: HID_USAGE_LED_STAND_BY HEX: 27
+CONSTANT: HID_USAGE_LED_CAMERA_ON HEX: 28
+CONSTANT: HID_USAGE_LED_CAMERA_OFF HEX: 29
+CONSTANT: HID_USAGE_LED_ON_LINE HEX: 2A
+CONSTANT: HID_USAGE_LED_OFF_LINE HEX: 2B
+CONSTANT: HID_USAGE_LED_BUSY HEX: 2C
+CONSTANT: HID_USAGE_LED_READY HEX: 2D
+CONSTANT: HID_USAGE_LED_PAPER_OUT HEX: 2E
+CONSTANT: HID_USAGE_LED_PAPER_JAM HEX: 2F
+CONSTANT: HID_USAGE_LED_REMOTE HEX: 30
+CONSTANT: HID_USAGE_LED_FORWARD HEX: 31
+CONSTANT: HID_USAGE_LED_REVERSE HEX: 32
+CONSTANT: HID_USAGE_LED_STOP HEX: 33
+CONSTANT: HID_USAGE_LED_REWIND HEX: 34
+CONSTANT: HID_USAGE_LED_FAST_FORWARD HEX: 35
+CONSTANT: HID_USAGE_LED_PLAY HEX: 36
+CONSTANT: HID_USAGE_LED_PAUSE HEX: 37
+CONSTANT: HID_USAGE_LED_RECORD HEX: 38
+CONSTANT: HID_USAGE_LED_ERROR HEX: 39
+CONSTANT: HID_USAGE_LED_SELECTED_INDICATOR HEX: 3A
+CONSTANT: HID_USAGE_LED_IN_USE_INDICATOR HEX: 3B
+CONSTANT: HID_USAGE_LED_MULTI_MODE_INDICATOR HEX: 3C
+CONSTANT: HID_USAGE_LED_INDICATOR_ON HEX: 3D
+CONSTANT: HID_USAGE_LED_INDICATOR_FLASH HEX: 3E
+CONSTANT: HID_USAGE_LED_INDICATOR_SLOW_BLINK HEX: 3F
+CONSTANT: HID_USAGE_LED_INDICATOR_FAST_BLINK HEX: 40
+CONSTANT: HID_USAGE_LED_INDICATOR_OFF HEX: 41
+CONSTANT: HID_USAGE_LED_FLASH_ON_TIME HEX: 42
+CONSTANT: HID_USAGE_LED_SLOW_BLINK_ON_TIME HEX: 43
+CONSTANT: HID_USAGE_LED_SLOW_BLINK_OFF_TIME HEX: 44
+CONSTANT: HID_USAGE_LED_FAST_BLINK_ON_TIME HEX: 45
+CONSTANT: HID_USAGE_LED_FAST_BLINK_OFF_TIME HEX: 46
+CONSTANT: HID_USAGE_LED_INDICATOR_COLOR HEX: 47
+CONSTANT: HID_USAGE_LED_RED HEX: 48
+CONSTANT: HID_USAGE_LED_GREEN HEX: 49
+CONSTANT: HID_USAGE_LED_AMBER HEX: 4A
+CONSTANT: HID_USAGE_LED_GENERIC_INDICATOR HEX: 4B
+
+CONSTANT: HID_USAGE_TELEPHONY_PHONE HEX: 01
+CONSTANT: HID_USAGE_TELEPHONY_ANSWERING_MACHINE HEX: 02
+CONSTANT: HID_USAGE_TELEPHONY_MESSAGE_CONTROLS HEX: 03
+CONSTANT: HID_USAGE_TELEPHONY_HANDSET HEX: 04
+CONSTANT: HID_USAGE_TELEPHONY_HEADSET HEX: 05
+CONSTANT: HID_USAGE_TELEPHONY_KEYPAD HEX: 06
+CONSTANT: HID_USAGE_TELEPHONY_PROGRAMMABLE_BUTTON HEX: 07
+CONSTANT: HID_USAGE_TELEPHONY_REDIAL HEX: 24
+CONSTANT: HID_USAGE_TELEPHONY_TRANSFER HEX: 25
+CONSTANT: HID_USAGE_TELEPHONY_DROP HEX: 26
+CONSTANT: HID_USAGE_TELEPHONY_LINE HEX: 2A
+CONSTANT: HID_USAGE_TELEPHONY_RING_ENABLE HEX: 2D
+CONSTANT: HID_USAGE_TELEPHONY_SEND HEX: 31
+CONSTANT: HID_USAGE_TELEPHONY_KEYPAD_0 HEX: B0
+CONSTANT: HID_USAGE_TELEPHONY_KEYPAD_D HEX: BF
+CONSTANT: HID_USAGE_TELEPHONY_HOST_AVAILABLE HEX: F1
+
+CONSTANT: HID_USAGE_MS_BTH_HF_DIALNUMBER HEX: 21
+CONSTANT: HID_USAGE_MS_BTH_HF_DIALMEMORY HEX: 22
+
+CONSTANT: HID_USAGE_CONSUMERCTRL HEX: 01
+CONSTANT: HID_USAGE_DIGITIZER_PEN HEX: 02
+CONSTANT: HID_USAGE_DIGITIZER_IN_RANGE HEX: 32
+CONSTANT: HID_USAGE_DIGITIZER_TIP_SWITCH HEX: 42
+CONSTANT: HID_USAGE_DIGITIZER_BARREL_SWITCH HEX: 44
+
+CONSTANT: HIDP_LINK_COLLECTION_ROOT -1
+CONSTANT: HIDP_LINK_COLLECTION_UNSPECIFIED 0
+
+C-ENUM:
+ HidP_Input
+ HidP_Output
+ HidP_Feature ;
+TYPEDEF: int HIDP_REPORT_TYPE
+
+STRUCT: USAGE_AND_PAGE
+ { Usage USAGE }
+ { UsagePage USAGE } ;
+TYPEDEF: USAGE_AND_PAGE* PUSAGE_AND_PAGE
+
+: HidP_IsSameUsageAndPage ( u1 u2 -- ? ) = ; inline
+
+STRUCT: HIDP_BUTTONS_CAPS_range
+ { UsageMin USAGE }
+ { UsageMax USAGE }
+ { StringMin USHORT }
+ { StringMax USHORT }
+ { DesignatorMin USHORT }
+ { DesignatorMax USHORT }
+ { DataIndexMin USHORT }
+ { DataIndexMax USHORT } ;
+
+STRUCT: HIDP_BUTTONS_CAPS_not_range
+ { Usage USAGE }
+ { Reserved1 USAGE }
+ { StringIndex USHORT }
+ { Reserved2 USHORT }
+ { DesignatorIndex USHORT }
+ { Reserved3 USHORT }
+ { DataIndex USHORT }
+ { Reserved4 USHORT } ;
+
+UNION-STRUCT: HIDP_BUTTONS_CAPS_union
+ { Range HIDP_BUTTONS_CAPS_range }
+ { NotRange HIDP_BUTTONS_CAPS_not_range } ;
+
+STRUCT: HIDP_BUTTON_CAPS
+ { UsagePage USAGE }
+ { ReportID UCHAR }
+ { IsAlias BOOLEAN }
+ { BitField USHORT }
+ { LinkCollection USHORT }
+ { LinkUsage USAGE }
+ { LinkUsagePage USAGE }
+ { IsRange BOOLEAN }
+ { IsStringRange BOOLEAN }
+ { IsDesignatorRange BOOLEAN }
+ { IsAbsolute BOOLEAN }
+ { Reserved ULONG[10] }
+ { Union HIDP_BUTTONS_CAPS_union } ;
+TYPEDEF: HIDP_BUTTON_CAPS* PHIDP_BUTTON_CAPS
+
+STRUCT: HIDP_VALUE_CAPS_range
+ { UsageMin USAGE }
+ { UsageMax USAGE }
+ { StringMin USHORT }
+ { StringMax USHORT }
+ { DesignatorMin USHORT }
+ { DesignatorMax USHORT }
+ { DataIndexMin USHORT }
+ { DataIndexMax USHORT } ;
+
+STRUCT: HIDP_VALUE_CAPS_not_range
+ { Usage USAGE }
+ { Reserved1 USAGE }
+ { StringIndex USHORT }
+ { Reserved2 USHORT }
+ { DesignatorIndex USHORT }
+ { Reserved3 USHORT }
+ { DataIndex USHORT }
+ { Reserved4 USHORT } ;
+
+UNION-STRUCT: HIDP_VALUE_CAPS_union
+ { Range HIDP_VALUE_CAPS_range }
+ { NotRange HIDP_VALUE_CAPS_not_range } ;
+
+STRUCT: HIDP_VALUE_CAPS
+ { UsagePage USAGE }
+ { ReportID UCHAR }
+ { IsAlias BOOLEAN }
+ { BitField USHORT }
+ { LinkCollection USHORT }
+ { LinkUsage USAGE }
+ { LinkUsagePage USAGE }
+ { IsRange BOOLEAN }
+ { IsStringRange BOOLEAN }
+ { IsDesignatorRange BOOLEAN }
+ { IsAbsolute BOOLEAN }
+ { HasNull BOOLEAN }
+ { Reserved UCHAR }
+ { BitSize USHORT }
+ { ReportCount USHORT }
+ { Reserved2 USHORT[5] }
+ { UnitsExp ULONG }
+ { Units ULONG }
+ { LogicalMin LONG }
+ { LogicalMax LONG }
+ { PhysicalMin LONG }
+ { PhysicalMax LONG }
+ { Union HIDP_VALUE_CAPS_union } ;
+TYPEDEF: HIDP_VALUE_CAPS* PHIDP_VALUE_CAPS
+
+STRUCT: HIDP_LINK_COLLECTION_NODE
+ { LinkUsage USAGE }
+ { LinkUsagePage USAGE }
+ { Parent USHORT }
+ { NumberOfChildren USHORT }
+ { NextSibling USHORT }
+ { FirstChild USHORT }
+ { CollectionTypeIsAliasBitfield ULONG }
+ { UserContext PVOID } ;
+TYPEDEF: HIDP_LINK_COLLECTION_NODE* PHIDP_LINK_COLLECTION_NODE
+
+TYPEDEF: PUCHAR PHIDP_REPORT_DESCRIPTOR
+C-TYPE: HIDP_PREPARSED_DATA
+TYPEDEF: HIDP_PREPARSED_DATA* PHIDP_PREPARSED_DATA
+
+STRUCT: HIDP_CAPS
+ { Usage USAGE }
+ { UsagePage USAGE }
+ { InputReportByteLength USHORT }
+ { OutputReportByteLength USHORT }
+ { FeatureReportByteLength USHORT }
+ { Reserved USHORT[17] }
+ { NumberLinkCollectionNodes USHORT }
+ { NumberInputButtonCaps USHORT }
+ { NumberInputValueCaps USHORT }
+ { NumberInputDataIndices USHORT }
+ { NumberOutputButtonCaps USHORT }
+ { NumberOutputValueCaps USHORT }
+ { NumberOutputDataIndices USHORT }
+ { NumberFeatureButtonCaps USHORT }
+ { NumberFeatureValueCaps USHORT }
+ { NumberFeatureDataIndices USHORT } ;
+TYPEDEF: HIDP_CAPS* PHIDP_CAPS
+
+STRUCT: HIDP_DATA
+ { DataIndex USHORT }
+ { Reserved USHORT }
+ { RawValue ULONG } ;
+TYPEDEF: HIDP_DATA* PHIDP_DATA
+
+STRUCT: HIDP_UNKNOWN_TOKEN
+ { Token UCHAR }
+ { Reserved UCHAR[3] }
+ { BitField ULONG } ;
+TYPEDEF: HIDP_UNKNOWN_TOKEN* PHIDP_UNKNOWN_TOKEN
+
+STRUCT: HIDP_EXTENDED_ATTRIBUTES
+ { NumGlobalUnknowns UCHAR }
+ { Reserved UCHAR[3] }
+ { GlobalUnknowns PHIDP_UNKNOWN_TOKEN }
+ { Data ULONG[1] } ;
+TYPEDEF: HIDP_EXTENDED_ATTRIBUTES* PHIDP_EXTENDED_ATTRIBUTES
+
+FUNCTION: NTSTATUS
+HidP_GetCaps (
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PHIDP_CAPS Capabilities
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_GetLinkCollectionNodes (
+ PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes,
+ PULONG LinkCollectionNodesLength,
+ PHIDP_PREPARSED_DATA PreparsedData
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_GetSpecificButtonCaps (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ USAGE Usage,
+ PHIDP_BUTTON_CAPS ButtonCaps,
+ PUSHORT ButtonCapsLength,
+ PHIDP_PREPARSED_DATA PreparsedData
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_GetButtonCaps (
+ HIDP_REPORT_TYPE ReportType,
+ PHIDP_BUTTON_CAPS ButtonCaps,
+ PUSHORT ButtonCapsLength,
+ PHIDP_PREPARSED_DATA PreparsedData
+) ;
+
+FUNCTION: NTSTATUS
+HidP_GetSpecificValueCaps (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ USAGE Usage,
+ PHIDP_VALUE_CAPS ValueCaps,
+ PUSHORT ValueCapsLength,
+ PHIDP_PREPARSED_DATA PreparsedData
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_GetValueCaps (
+ HIDP_REPORT_TYPE ReportType,
+ PHIDP_VALUE_CAPS ValueCaps,
+ PUSHORT ValueCapsLength,
+ PHIDP_PREPARSED_DATA PreparsedData
+) ;
+
+FUNCTION: NTSTATUS
+HidP_GetExtendedAttributes (
+ HIDP_REPORT_TYPE ReportType,
+ USHORT DataIndex,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PHIDP_EXTENDED_ATTRIBUTES Attributes,
+ PULONG LengthAttributes
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_InitializeReportForID (
+ HIDP_REPORT_TYPE ReportType,
+ UCHAR ReportID,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_SetData (
+ HIDP_REPORT_TYPE ReportType,
+ PHIDP_DATA DataList,
+ PULONG DataLength,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_GetData (
+ HIDP_REPORT_TYPE ReportType,
+ PHIDP_DATA DataList,
+ PULONG DataLength,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+FUNCTION: ULONG
+HidP_MaxDataListLength (
+ HIDP_REPORT_TYPE ReportType,
+ PHIDP_PREPARSED_DATA PreparsedData
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_SetUsages (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ PUSAGE UsageList,
+ PULONG UsageLength,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+ALIAS: HidP_SetButtons HidP_SetUsages
+
+FUNCTION: NTSTATUS
+HidP_UnsetUsages (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ PUSAGE UsageList,
+ PULONG UsageLength,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+ALIAS: HidP_UnsetButtons HidP_UnsetUsages
+
+FUNCTION: NTSTATUS
+HidP_GetUsages (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ PUSAGE UsageList,
+ PULONG UsageLength,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+ALIAS: HidP_GetButtons HidP_GetUsages
+
+FUNCTION: NTSTATUS
+HidP_GetUsagesEx (
+ HIDP_REPORT_TYPE ReportType,
+ USHORT LinkCollection,
+ PUSAGE_AND_PAGE ButtonList,
+ ULONG* UsageLength,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+ALIAS: HidP_GetButtonsEx HidP_GetUsagesEx
+
+FUNCTION: ULONG
+HidP_MaxUsageListLength (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ PHIDP_PREPARSED_DATA PreparsedData
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_SetUsageValue (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ USAGE Usage,
+ ULONG UsageValue,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_SetScaledUsageValue (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ USAGE Usage,
+ LONG UsageValue,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_SetUsageValueArray (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ USAGE Usage,
+ PCHAR UsageValue,
+ USHORT UsageValueByteLength,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+
+FUNCTION: NTSTATUS
+HidP_GetUsageValue (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ USAGE Usage,
+ PULONG UsageValue,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_GetScaledUsageValue (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ USAGE Usage,
+ PLONG UsageValue,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_GetUsageValueArray (
+ HIDP_REPORT_TYPE ReportType,
+ USAGE UsagePage,
+ USHORT LinkCollection,
+ USAGE Usage,
+ PCHAR UsageValue,
+ USHORT UsageValueByteLength,
+ PHIDP_PREPARSED_DATA PreparsedData,
+ PCHAR Report,
+ ULONG ReportLength
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_UsageListDifference (
+ PUSAGE PreviousUsageList,
+ PUSAGE CurrentUsageList,
+ PUSAGE BreakUsageList,
+ PUSAGE MakeUsageList,
+ ULONG UsageListLength
+ ) ;
+
+FUNCTION: NTSTATUS
+HidP_UsageAndPageListDifference (
+ PUSAGE_AND_PAGE PreviousUsageList,
+ PUSAGE_AND_PAGE CurrentUsageList,
+ PUSAGE_AND_PAGE BreakUsageList,
+ PUSAGE_AND_PAGE MakeUsageList,
+ ULONG UsageListLength
+ ) ;
+
+C-ENUM:
+ HidP_Keyboard_Break
+ HidP_Keyboard_Make ;
+TYPEDEF: int HIDP_KEYBOARD_DIRECTION
+
+STRUCT: HIDP_KEYBOARD_MODIFIER_STATE
+ { ul ULONG } ;
+TYPEDEF: HIDP_KEYBOARD_MODIFIER_STATE* PHIDP_KEYBOARD_MODIFIER_STATE
+
+CALLBACK: BOOLEAN PHIDP_INSERT_SCANCODES (
+ PVOID Context,
+ PCHAR NewScanCodes,
+ ULONG Length ) ;
+
+FUNCTION: NTSTATUS
+HidP_TranslateUsageAndPagesToI8042ScanCodes (
+ PUSAGE_AND_PAGE ChangedUsageList,
+ ULONG UsageListLength,
+ HIDP_KEYBOARD_DIRECTION KeyAction,
+ PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
+ PHIDP_INSERT_SCANCODES InsertCodesProcedure,
+ PVOID InsertCodesContext
+ ) ;
+
+
+FUNCTION: NTSTATUS
+HidP_TranslateUsagesToI8042ScanCodes (
+ PUSAGE ChangedUsageList,
+ ULONG UsageListLength,
+ HIDP_KEYBOARD_DIRECTION KeyAction,
+ PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
+ PHIDP_INSERT_SCANCODES InsertCodesProcedure,
+ PVOID InsertCodesContext
+ ) ;
+
+CONSTANT: FACILITY_HID_ERROR_CODE HEX: 11
+: HIDP_ERROR_CODES ( SEV CODE -- HRESULT )
+ [ 28 shift ] dip bitor FACILITY_HID_ERROR_CODE 16 shift bitor ; inline
+: HIDP_STATUS_SUCCESS ( -- HRESULT ) HEX: 0 HEX: 0 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_NULL ( -- HRESULT ) HEX: 8 HEX: 1 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_INVALID_PREPARSED_DATA ( -- HRESULT ) HEX: C HEX: 1 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_INVALID_REPORT_TYPE ( -- HRESULT ) HEX: C HEX: 2 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_INVALID_REPORT_LENGTH ( -- HRESULT ) HEX: C HEX: 3 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_USAGE_NOT_FOUND ( -- HRESULT ) HEX: C HEX: 4 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_VALUE_OUT_OF_RANGE ( -- HRESULT ) HEX: C HEX: 5 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_BAD_LOG_PHY_VALUES ( -- HRESULT ) HEX: C HEX: 6 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_BUFFER_TOO_SMALL ( -- HRESULT ) HEX: C HEX: 7 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_INTERNAL_ERROR ( -- HRESULT ) HEX: C HEX: 8 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_I8042_TRANS_UNKNOWN ( -- HRESULT ) HEX: C HEX: 9 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_INCOMPATIBLE_REPORT_ID ( -- HRESULT ) HEX: C HEX: A HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_NOT_VALUE_ARRAY ( -- HRESULT ) HEX: C HEX: B HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_IS_VALUE_ARRAY ( -- HRESULT ) HEX: C HEX: C HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_DATA_INDEX_NOT_FOUND ( -- HRESULT ) HEX: C HEX: D HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE ( -- HRESULT ) HEX: C HEX: E HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_BUTTON_NOT_PRESSED ( -- HRESULT ) HEX: C HEX: F HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_REPORT_DOES_NOT_EXIST ( -- HRESULT ) HEX: C HEX: 10 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_NOT_IMPLEMENTED ( -- HRESULT ) HEX: C HEX: 20 HIDP_ERROR_CODES ; inline
+: HIDP_STATUS_I8242_TRANS_UNKNOWN ( -- HRESULT ) HIDP_STATUS_I8042_TRANS_UNKNOWN ; inline
+
+STRUCT: HIDD_CONFIGURATION
+ { cookie PVOID }
+ { size ULONG }
+ { RingBufferSize ULONG } ;
+TYPEDEF: HIDD_CONFIGURATION* PHIDD_CONFIGURATION
+
+STRUCT: HIDD_ATTRIBUTES
+ { Size ULONG }
+ { VendorID USHORT }
+ { ProductID USHORT }
+ { VersionNumber USHORT } ;
+TYPEDEF: HIDD_ATTRIBUTES* PHIDD_ATTRIBUTES
+
+FUNCTION: BOOLEAN
+HidD_GetAttributes (
+ HANDLE HidDeviceObject,
+ PHIDD_ATTRIBUTES Attributes
+ ) ;
+
+FUNCTION: void
+HidD_GetHidGuid (
+ LPGUID HidGuid
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetPreparsedData (
+ HANDLE HidDeviceObject,
+ PHIDP_PREPARSED_DATA* PreparsedData
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_FreePreparsedData (
+ PHIDP_PREPARSED_DATA PreparsedData
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_FlushQueue (
+ HANDLE HidDeviceObject
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetConfiguration (
+ HANDLE HidDeviceObject,
+ PHIDD_CONFIGURATION Configuration,
+ ULONG ConfigurationLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_SetConfiguration (
+ HANDLE HidDeviceObject,
+ PHIDD_CONFIGURATION Configuration,
+ ULONG ConfigurationLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetFeature (
+ HANDLE HidDeviceObject,
+ PVOID ReportBuffer,
+ ULONG ReportBufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_SetFeature (
+ HANDLE HidDeviceObject,
+ PVOID ReportBuffer,
+ ULONG ReportBufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetInputReport (
+ HANDLE HidDeviceObject,
+ PVOID ReportBuffer,
+ ULONG ReportBufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_SetOutputReport (
+ HANDLE HidDeviceObject,
+ PVOID ReportBuffer,
+ ULONG ReportBufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetNumInputBuffers (
+ HANDLE HidDeviceObject,
+ PULONG NumberBuffers
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_SetNumInputBuffers (
+ HANDLE HidDeviceObject,
+ ULONG NumberBuffers
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetPhysicalDescriptor (
+ HANDLE HidDeviceObject,
+ PVOID Buffer,
+ ULONG BufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetManufacturerString (
+ HANDLE HidDeviceObject,
+ PVOID Buffer,
+ ULONG BufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetProductString (
+ HANDLE HidDeviceObject,
+ PVOID Buffer,
+ ULONG BufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetIndexedString (
+ HANDLE HidDeviceObject,
+ ULONG StringIndex,
+ PVOID Buffer,
+ ULONG BufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetSerialNumberString (
+ HANDLE HidDeviceObject,
+ PVOID Buffer,
+ ULONG BufferLength
+ ) ;
+
+FUNCTION: BOOLEAN
+HidD_GetMsGenreDescriptor (
+ HANDLE HidDeviceObject,
+ PVOID Buffer,
+ ULONG BufferLength
+ ) ;
diff --git a/basis/windows/ddk/hid/platforms.txt b/basis/windows/ddk/hid/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/ddk/hid/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/ddk/hid/summary.txt b/basis/windows/ddk/hid/summary.txt
new file mode 100644
index 0000000000..71ad299177
--- /dev/null
+++ b/basis/windows/ddk/hid/summary.txt
@@ -0,0 +1 @@
+Bindings to the HID section of the Windows DDK
\ No newline at end of file
diff --git a/basis/windows/ddk/hid/tags.txt b/basis/windows/ddk/hid/tags.txt
new file mode 100644
index 0000000000..fdce1614de
--- /dev/null
+++ b/basis/windows/ddk/hid/tags.txt
@@ -0,0 +1 @@
+unportable bindings
\ No newline at end of file
diff --git a/basis/windows/ddk/setupapi/authors.txt b/basis/windows/ddk/setupapi/authors.txt
new file mode 100644
index 0000000000..f596342efa
--- /dev/null
+++ b/basis/windows/ddk/setupapi/authors.txt
@@ -0,0 +1 @@
+Erik Charlebois
diff --git a/basis/windows/ddk/setupapi/platforms.txt b/basis/windows/ddk/setupapi/platforms.txt
new file mode 100644
index 0000000000..d2e9c5bf45
--- /dev/null
+++ b/basis/windows/ddk/setupapi/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/ddk/setupapi/setupapi.factor b/basis/windows/ddk/setupapi/setupapi.factor
new file mode 100644
index 0000000000..06d32725f7
--- /dev/null
+++ b/basis/windows/ddk/setupapi/setupapi.factor
@@ -0,0 +1,2033 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http://factorcode.org/license.txt for BSD license.
+USING: literals windows.kernel32 math alien.syntax windows.types classes.struct
+alien.c-types windows.errors windows.ole32 windows.advapi32 alien.libraries ;
+IN: windows.ddk.setupapi
+
+<< "setupapi" "setupapi.dll" "stdcall" add-library >>
+LIBRARY: setupapi
+
+TYPEDEF: DWORDLONG SP_LOG_TOKEN
+TYPEDEF: DWORDLONG* PSP_LOG_TOKEN
+
+CONSTANT: LOGTOKEN_TYPE_MASK 3
+CONSTANT: LOGTOKEN_UNSPECIFIED 0
+CONSTANT: LOGTOKEN_NO_LOG 1
+CONSTANT: LOGTOKEN_SETUPAPI_APPLOG 2
+CONSTANT: LOGTOKEN_SETUPAPI_DEVLOG 3
+
+CONSTANT: TXTLOG_SETUPAPI_DEVLOG HEX: 00000001
+CONSTANT: TXTLOG_SETUPAPI_CMDLINE HEX: 00000002
+CONSTANT: TXTLOG_SETUPAPI_BITS HEX: 00000003
+
+CONSTANT: TXTLOG_ERROR HEX: 1
+CONSTANT: TXTLOG_WARNING HEX: 2
+CONSTANT: TXTLOG_SYSTEM_STATE_CHANGE HEX: 3
+CONSTANT: TXTLOG_SUMMARY HEX: 4
+CONSTANT: TXTLOG_DETAILS HEX: 5
+CONSTANT: TXTLOG_VERBOSE HEX: 6
+CONSTANT: TXTLOG_VERY_VERBOSE HEX: 7
+
+CONSTANT: TXTLOG_RESERVED_FLAGS HEX: 0000FFF0
+
+CONSTANT: TXTLOG_TIMESTAMP HEX: 00010000
+CONSTANT: TXTLOG_DEPTH_INCR HEX: 00020000
+CONSTANT: TXTLOG_DEPTH_DECR HEX: 00040000
+CONSTANT: TXTLOG_TAB_1 HEX: 00080000
+CONSTANT: TXTLOG_FLUSH_FILE HEX: 00100000
+
+: TXTLOG_LEVEL ( flags -- n ) HEX: f bitand ; inline
+
+CONSTANT: TXTLOG_DEVINST HEX: 00000001
+CONSTANT: TXTLOG_INF HEX: 00000002
+CONSTANT: TXTLOG_FILEQ HEX: 00000004
+CONSTANT: TXTLOG_COPYFILES HEX: 00000008
+CONSTANT: TXTLOG_SIGVERIF HEX: 00000020
+CONSTANT: TXTLOG_BACKUP HEX: 00000080
+CONSTANT: TXTLOG_UI HEX: 00000100
+CONSTANT: TXTLOG_UTIL HEX: 00000200
+CONSTANT: TXTLOG_INFDB HEX: 00000400
+CONSTANT: TXTLOG_POLICY HEX: 00800000
+CONSTANT: TXTLOG_NEWDEV HEX: 01000000
+CONSTANT: TXTLOG_UMPNPMGR HEX: 02000000
+CONSTANT: TXTLOG_DRIVER_STORE HEX: 04000000
+CONSTANT: TXTLOG_SETUP HEX: 08000000
+CONSTANT: TXTLOG_CMI HEX: 10000000
+CONSTANT: TXTLOG_DEVMGR HEX: 20000000
+CONSTANT: TXTLOG_INSTALLER HEX: 40000000
+CONSTANT: TXTLOG_VENDOR HEX: 80000000
+
+TYPEDEF: void* HPROPSHEETPAGE
+TYPEDEF: void* HIMAGELIST
+C-TYPE: DEVPROPKEY
+TYPEDEF: ULONG DEVPROPTYPE
+TYPEDEF: DEVPROPTYPE* PDEVPROPTYPE
+TYPEDEF: void* LPPROPSHEETHEADERA
+TYPEDEF: void* LPPROPSHEETHEADERW
+
+CONSTANT: LINE_LEN 256
+CONSTANT: LINE_LEN*2 512
+CONSTANT: MAX_INF_STRING_LENGTH 4096
+CONSTANT: MAX_INF_SECTION_NAME_LENGTH 255
+CONSTANT: MAX_TITLE_LEN 60
+CONSTANT: MAX_INSTRUCTION_LEN 256
+CONSTANT: MAX_LABEL_LEN 30
+CONSTANT: MAX_SERVICE_NAME_LEN 256
+CONSTANT: MAX_SUBTITLE_LEN 256
+CONSTANT: SP_MAX_MACHINENAME_LENGTH $[ MAX_PATH 3 + ]
+
+TYPEDEF: PVOID HINF
+
+STRUCT: INFCONTEXT
+ { Inf PVOID }
+ { CurrentInf PVOID }
+ { Section UINT }
+ { Line UINT } ;
+TYPEDEF: INFCONTEXT* PINFCONTEXT
+
+STRUCT: SP_INF_INFORMATION
+ { InfStyle DWORD }
+ { InfCount DWORD }
+ { VersionDat BYTE[ANYSIZE_ARRAY] } ;
+TYPEDEF: SP_INF_INFORMATION* PSP_INF_INFORMATION
+
+STRUCT: SP_ALTPLATFORM_INFO_V2
+ { cbSize DWORD }
+ { Platform DWORD }
+ { MajorVersion DWORD }
+ { MinorVersion DWORD }
+ { ProcessorArchitecture WORD }
+ { Flags WORD }
+ { FirstValidatedMajorVersion DWORD }
+ { FirstValidatedMinorVersion DWORD } ;
+TYPEDEF: SP_ALTPLATFORM_INFO_V2* PSP_ALTPLATFORM_INFO_V2
+
+STRUCT: SP_ALTPLATFORM_INFO_V1
+ { cbSize DWORD }
+ { Platform DWORD }
+ { MajorVersion DWORD }
+ { MinorVersion DWORD }
+ { ProcessorArchitecture WORD }
+ { Reserved WORD } ;
+TYPEDEF: SP_ALTPLATFORM_INFO_V1* PSP_ALTPLATFORM_INFO_V1
+TYPEDEF: SP_ALTPLATFORM_INFO_V2 SP_ALTPLATFORM_INFO
+TYPEDEF: PSP_ALTPLATFORM_INFO_V2 PSP_ALTPLATFORM_INFO
+
+CONSTANT: SP_ALTPLATFORM_FLAGS_VERSION_RANGE 1
+
+STRUCT: SP_ORIGINAL_FILE_INFO_A
+ { cbSize DWORD }
+ { OriginalInfName CHAR[MAX_PATH] }
+ { OriginalCatalogName CHAR[MAX_PATH] } ;
+TYPEDEF: SP_ORIGINAL_FILE_INFO_A* PSP_ORIGINAL_FILE_INFO_A
+STRUCT: SP_ORIGINAL_FILE_INFO_W
+ { cbSize DWORD }
+ { OriginalInfName WCHAR[MAX_PATH] }
+ { OriginalCatalogName WCHAR[MAX_PATH] } ;
+TYPEDEF: SP_ORIGINAL_FILE_INFO_W* PSP_ORIGINAL_FILE_INFO_W
+TYPEDEF: SP_ORIGINAL_FILE_INFO_W SP_ORIGINAL_FILE_INFO
+TYPEDEF: PSP_ORIGINAL_FILE_INFO_W PSP_ORIGINAL_FILE_INFO
+
+CONSTANT: INF_STYLE_NONE HEX: 00000000
+CONSTANT: INF_STYLE_OLDNT HEX: 00000001
+CONSTANT: INF_STYLE_WIN4 HEX: 00000002
+CONSTANT: INF_STYLE_CACHE_ENABLE HEX: 00000010
+CONSTANT: INF_STYLE_CACHE_DISABLE HEX: 00000020
+CONSTANT: INF_STYLE_CACHE_IGNORE HEX: 00000040
+CONSTANT: DIRID_ABSOLUTE -1
+CONSTANT: DIRID_ABSOLUTE_16BIT HEX: ffff
+CONSTANT: DIRID_NULL 0
+CONSTANT: DIRID_SRCPATH 1
+CONSTANT: DIRID_WINDOWS 10
+CONSTANT: DIRID_SYSTEM 11
+CONSTANT: DIRID_DRIVERS 12
+CONSTANT: DIRID_IOSUBSYS $ DIRID_DRIVERS
+CONSTANT: DIRID_INF 17
+CONSTANT: DIRID_HELP 18
+CONSTANT: DIRID_FONTS 20
+CONSTANT: DIRID_VIEWERS 21
+CONSTANT: DIRID_COLOR 23
+CONSTANT: DIRID_APPS 24
+CONSTANT: DIRID_SHARED 25
+CONSTANT: DIRID_BOOT 30
+CONSTANT: DIRID_SYSTEM16 50
+CONSTANT: DIRID_SPOOL 51
+CONSTANT: DIRID_SPOOLDRIVERS 52
+CONSTANT: DIRID_USERPROFILE 53
+CONSTANT: DIRID_LOADER 54
+CONSTANT: DIRID_PRINTPROCESSOR 55
+CONSTANT: DIRID_DEFAULT $ DIRID_SYSTEM
+CONSTANT: DIRID_COMMON_STARTMENU 16406
+CONSTANT: DIRID_COMMON_PROGRAMS 16407
+CONSTANT: DIRID_COMMON_STARTUP 16408
+CONSTANT: DIRID_COMMON_DESKTOPDIRECTORY 16409
+CONSTANT: DIRID_COMMON_FAVORITES 16415
+CONSTANT: DIRID_COMMON_APPDATA 16419
+CONSTANT: DIRID_PROGRAM_FILES 16422
+CONSTANT: DIRID_SYSTEM_X86 16425
+CONSTANT: DIRID_PROGRAM_FILES_X86 16426
+CONSTANT: DIRID_PROGRAM_FILES_COMMON 16427
+CONSTANT: DIRID_PROGRAM_FILES_COMMONX86 16428
+CONSTANT: DIRID_COMMON_TEMPLATES 16429
+CONSTANT: DIRID_COMMON_DOCUMENTS 16430
+CONSTANT: DIRID_USER HEX: 8000
+CALLBACK: UINT PSP_FILE_CALLBACK_A ( PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2 ) ;
+CALLBACK: UINT PSP_FILE_CALLBACK_W ( PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2 ) ;
+TYPEDEF: PSP_FILE_CALLBACK_W PSP_FILE_CALLBACK
+CONSTANT: SPFILENOTIFY_STARTQUEUE HEX: 00000001
+CONSTANT: SPFILENOTIFY_ENDQUEUE HEX: 00000002
+CONSTANT: SPFILENOTIFY_STARTSUBQUEUE HEX: 00000003
+CONSTANT: SPFILENOTIFY_ENDSUBQUEUE HEX: 00000004
+CONSTANT: SPFILENOTIFY_STARTDELETE HEX: 00000005
+CONSTANT: SPFILENOTIFY_ENDDELETE HEX: 00000006
+CONSTANT: SPFILENOTIFY_DELETEERROR HEX: 00000007
+CONSTANT: SPFILENOTIFY_STARTRENAME HEX: 00000008
+CONSTANT: SPFILENOTIFY_ENDRENAME HEX: 00000009
+CONSTANT: SPFILENOTIFY_RENAMEERROR HEX: 0000000a
+CONSTANT: SPFILENOTIFY_STARTCOPY HEX: 0000000b
+CONSTANT: SPFILENOTIFY_ENDCOPY HEX: 0000000c
+CONSTANT: SPFILENOTIFY_COPYERROR HEX: 0000000d
+CONSTANT: SPFILENOTIFY_NEEDMEDIA HEX: 0000000e
+CONSTANT: SPFILENOTIFY_QUEUESCAN HEX: 0000000f
+CONSTANT: SPFILENOTIFY_CABINETINFO HEX: 00000010
+CONSTANT: SPFILENOTIFY_FILEINCABINET HEX: 00000011
+CONSTANT: SPFILENOTIFY_NEEDNEWCABINET HEX: 00000012
+CONSTANT: SPFILENOTIFY_FILEEXTRACTED HEX: 00000013
+CONSTANT: SPFILENOTIFY_FILEOPDELAYED HEX: 00000014
+CONSTANT: SPFILENOTIFY_STARTBACKUP HEX: 00000015
+CONSTANT: SPFILENOTIFY_BACKUPERROR HEX: 00000016
+CONSTANT: SPFILENOTIFY_ENDBACKUP HEX: 00000017
+CONSTANT: SPFILENOTIFY_QUEUESCAN_EX HEX: 00000018
+CONSTANT: SPFILENOTIFY_STARTREGISTRATION HEX: 00000019
+CONSTANT: SPFILENOTIFY_ENDREGISTRATION HEX: 00000020
+CONSTANT: SPFILENOTIFY_QUEUESCAN_SIGNERINFO HEX: 00000040
+CONSTANT: SPFILENOTIFY_LANGMISMATCH HEX: 00010000
+CONSTANT: SPFILENOTIFY_TARGETEXISTS HEX: 00020000
+CONSTANT: SPFILENOTIFY_TARGETNEWER HEX: 00040000
+CONSTANT: FILEOP_COPY 0
+CONSTANT: FILEOP_RENAME 1
+CONSTANT: FILEOP_DELETE 2
+CONSTANT: FILEOP_BACKUP 3
+CONSTANT: FILEOP_ABORT 0
+CONSTANT: FILEOP_DOIT 1
+CONSTANT: FILEOP_SKIP 2
+CONSTANT: FILEOP_RETRY $ FILEOP_DOIT
+CONSTANT: FILEOP_NEWPATH 4
+CONSTANT: COPYFLG_WARN_IF_SKIP HEX: 00000001
+CONSTANT: COPYFLG_NOSKIP HEX: 00000002
+CONSTANT: COPYFLG_NOVERSIONCHECK HEX: 00000004
+CONSTANT: COPYFLG_FORCE_FILE_IN_USE HEX: 00000008
+CONSTANT: COPYFLG_NO_OVERWRITE HEX: 00000010
+CONSTANT: COPYFLG_NO_VERSION_DIALOG HEX: 00000020
+CONSTANT: COPYFLG_OVERWRITE_OLDER_ONLY HEX: 00000040
+CONSTANT: COPYFLG_PROTECTED_WINDOWS_DRIVER_FILE HEX: 00000100
+CONSTANT: COPYFLG_REPLACEONLY HEX: 00000400
+CONSTANT: COPYFLG_NODECOMP HEX: 00000800
+CONSTANT: COPYFLG_REPLACE_BOOT_FILE HEX: 00001000
+CONSTANT: COPYFLG_NOPRUNE HEX: 00002000
+CONSTANT: COPYFLG_IN_USE_TRY_RENAME HEX: 00004000
+CONSTANT: DELFLG_IN_USE HEX: 00000001
+CONSTANT: DELFLG_IN_USE1 HEX: 00010000
+STRUCT: FILEPATHS_A
+ { Target PCSTR }
+ { Source PCSTR }
+ { Win32Error UINT }
+ { Flags DWORD } ;
+TYPEDEF: FILEPATHS_A* PFILEPATHS_A
+STRUCT: FILEPATHS_W
+ { Target PCWSTR }
+ { Source PCWSTR }
+ { Win32Error UINT }
+ { Flags DWORD } ;
+TYPEDEF: FILEPATHS_W* PFILEPATHS_W
+TYPEDEF: FILEPATHS_W FILEPATHS
+TYPEDEF: PFILEPATHS_W PFILEPATHS
+STRUCT: FILEPATHS_SIGNERINFO_A
+ { Target PCSTR }
+ { Source PCSTR }
+ { Win32Error UINT }
+ { Flags DWORD }
+ { DigitalSigner PCSTR }
+ { Version PCSTR }
+ { CatalogFile PCSTR } ;
+TYPEDEF: FILEPATHS_SIGNERINFO_A* PFILEPATHS_SIGNERINFO_A
+STRUCT: FILEPATHS_SIGNERINFO_W
+ { Target PCWSTR }
+ { Source PCWSTR }
+ { Win32Error UINT }
+ { Flags DWORD }
+ { DigitalSigner PCWSTR }
+ { Version PCWSTR }
+ { CatalogFile PCWSTR } ;
+TYPEDEF: FILEPATHS_SIGNERINFO_W* PFILEPATHS_SIGNERINFO_W
+TYPEDEF: FILEPATHS_SIGNERINFO_W FILEPATHS_SIGNERINFO
+TYPEDEF: PFILEPATHS_SIGNERINFO_W PFILEPATHS_SIGNERINFO
+
+STRUCT: SOURCE_MEDIA_A
+ { Reserved PCSTR }
+ { Tagfile PCSTR }
+ { Description PCSTR }
+ { SourcePath PCSTR }
+ { SourceFile PCSTR }
+ { Flags DWORD } ;
+TYPEDEF: SOURCE_MEDIA_A* PSOURCE_MEDIA_A
+STRUCT: SOURCE_MEDIA_W
+ { Reserved PCWSTR }
+ { Tagfile PCWSTR }
+ { Description PCWSTR }
+ { SourcePath PCWSTR }
+ { SourceFile PCWSTR }
+ { Flags DWORD } ;
+TYPEDEF: SOURCE_MEDIA_W* PSOURCE_MEDIA_W
+TYPEDEF: SOURCE_MEDIA_W SOURCE_MEDIA
+TYPEDEF: PSOURCE_MEDIA_W PSOURCE_MEDIA
+
+STRUCT: CABINET_INFO_A
+ { CabinetPath PCSTR }
+ { CabinetFile PCSTR }
+ { DiskName PCSTR }
+ { SetId USHORT }
+ { CabinetNumber USHORT } ;
+TYPEDEF: CABINET_INFO_A* PCABINET_INFO_A
+STRUCT: CABINET_INFO_W
+ { CabinetPath PCWSTR }
+ { CabinetFile PCWSTR }
+ { DiskName PCWSTR }
+ { SetId USHORT }
+ { CabinetNumber USHORT } ;
+TYPEDEF: CABINET_INFO_W* PCABINET_INFO_W
+TYPEDEF: CABINET_INFO_W CABINET_INFO
+TYPEDEF: PCABINET_INFO_W PCABINET_INFO
+
+STRUCT: FILE_IN_CABINET_INFO_A
+ { NameInCabinet PCSTR }
+ { FileSize DWORD }
+ { Win32Error DWORD }
+ { DosDate WORD }
+ { DosTime WORD }
+ { DosAttribs WORD }
+ { FullTargetName CHAR[MAX_PATH] } ;
+TYPEDEF: FILE_IN_CABINET_INFO_A* PFILE_IN_CABINET_INFO_A
+STRUCT: FILE_IN_CABINET_INFO_W
+ { NameInCabinet PCWSTR }
+ { FileSize DWORD }
+ { Win32Error DWORD }
+ { DosDate WORD }
+ { DosTime WORD }
+ { DosAttribs WORD }
+ { FullTargetName WCHAR[MAX_PATH] } ;
+TYPEDEF: FILE_IN_CABINET_INFO_W* PFILE_IN_CABINET_INFO_W
+TYPEDEF: FILE_IN_CABINET_INFO_W FILE_IN_CABINET_INFO
+TYPEDEF: PFILE_IN_CABINET_INFO_W PFILE_IN_CABINET_INFO
+
+STRUCT: SP_REGISTER_CONTROL_STATUSA
+ { cbSize DWORD }
+ { FileName PCSTR }
+ { Win32Error DWORD }
+ { FailureCode DWORD } ;
+TYPEDEF: SP_REGISTER_CONTROL_STATUSA* PSP_REGISTER_CONTROL_STATUSA
+STRUCT: SP_REGISTER_CONTROL_STATUSW
+ { cbSize DWORD }
+ { FileName PCWSTR }
+ { Win32Error DWORD }
+ { FailureCode DWORD } ;
+TYPEDEF: SP_REGISTER_CONTROL_STATUSW* PSP_REGISTER_CONTROL_STATUSW
+
+TYPEDEF: SP_REGISTER_CONTROL_STATUSW SP_REGISTER_CONTROL_STATUS
+TYPEDEF: PSP_REGISTER_CONTROL_STATUSW PSP_REGISTER_CONTROL_STATUS
+
+CONSTANT: SPREG_SUCCESS HEX: 00000000
+CONSTANT: SPREG_LOADLIBRARY HEX: 00000001
+CONSTANT: SPREG_GETPROCADDR HEX: 00000002
+CONSTANT: SPREG_REGSVR HEX: 00000003
+CONSTANT: SPREG_DLLINSTALL HEX: 00000004
+CONSTANT: SPREG_TIMEOUT HEX: 00000005
+CONSTANT: SPREG_UNKNOWN HEX: FFFFFFFF
+
+TYPEDEF: PVOID HSPFILEQ
+
+STRUCT: SP_FILE_COPY_PARAMS_A
+ { cbSize DWORD }
+ { QueueHandle HSPFILEQ }
+ { SourceRootPath PCSTR }
+ { SourcePath PCSTR }
+ { SourceFilename PCSTR }
+ { SourceDescription PCSTR }
+ { SourceTagfile PCSTR }
+ { TargetDirectory PCSTR }
+ { TargetFilename PCSTR }
+ { CopyStyle DWORD }
+ { LayoutInf HINF }
+ { SecurityDescriptor PCSTR } ;
+TYPEDEF: SP_FILE_COPY_PARAMS_A* PSP_FILE_COPY_PARAMS_A
+STRUCT: SP_FILE_COPY_PARAMS_W
+ { cbSize DWORD }
+ { QueueHandle HSPFILEQ }
+ { SourceRootPath PCWSTR }
+ { SourcePath PCWSTR }
+ { SourceFilename PCWSTR }
+ { SourceDescription PCWSTR }
+ { SourceTagfile PCWSTR }
+ { TargetDirectory PCWSTR }
+ { TargetFilename PCWSTR }
+ { CopyStyle DWORD }
+ { LayoutInf HINF }
+ { SecurityDescriptor PCWSTR } ;
+TYPEDEF: SP_FILE_COPY_PARAMS_W* PSP_FILE_COPY_PARAMS_W
+
+TYPEDEF: SP_FILE_COPY_PARAMS_W SP_FILE_COPY_PARAMS
+TYPEDEF: PSP_FILE_COPY_PARAMS_W PSP_FILE_COPY_PARAMS
+
+TYPEDEF: PVOID HDSKSPC
+TYPEDEF: PVOID HDEVINFO
+
+STRUCT: SP_DEVINFO_DATA
+ { cbSize DWORD }
+ { ClassGuid GUID }
+ { DevInst DWORD }
+ { Reserved ULONG_PTR } ;
+TYPEDEF: SP_DEVINFO_DATA* PSP_DEVINFO_DATA
+STRUCT: SP_DEVICE_INTERFACE_DATA
+ { cbSize DWORD }
+ { InterfaceClassGuid GUID }
+ { Flags DWORD }
+ { Reserved ULONG_PTR } ;
+TYPEDEF: SP_DEVICE_INTERFACE_DATA* PSP_DEVICE_INTERFACE_DATA
+
+CONSTANT: SPINT_ACTIVE HEX: 00000001
+CONSTANT: SPINT_DEFAULT HEX: 00000002
+CONSTANT: SPINT_REMOVED HEX: 00000004
+TYPEDEF: SP_DEVICE_INTERFACE_DATA SP_INTERFACE_DEVICE_DATA
+TYPEDEF: PSP_DEVICE_INTERFACE_DATA PSP_INTERFACE_DEVICE_DAT
+CONSTANT: SPID_ACTIVE $ SPINT_ACTIVE
+CONSTANT: SPID_DEFAULT $ SPINT_DEFAULT
+CONSTANT: SPID_REMOVED $ SPINT_REMOVED
+
+STRUCT: SP_DEVICE_INTERFACE_DETAIL_DATA_A
+ { cbSize DWORD }
+ { DevicePath CHAR[ANYSIZE_ARRAY] } ;
+TYPEDEF: SP_DEVICE_INTERFACE_DETAIL_DATA_A* PSP_DEVICE_INTERFACE_DETAIL_DATA_A
+STRUCT: SP_DEVICE_INTERFACE_DETAIL_DATA_W
+ { cbSize DWORD }
+ { DevicePath WCHAR[ANYSIZE_ARRAY] } ;
+TYPEDEF: SP_DEVICE_INTERFACE_DETAIL_DATA_W* PSP_DEVICE_INTERFACE_DETAIL_DATA_W
+TYPEDEF: SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_DEVICE_INTERFACE_DETAIL_DATA
+TYPEDEF: PSP_DEVICE_INTERFACE_DETAIL_DATA_W PSP_DEVICE_INTERFACE_DETAIL_DATA
+TYPEDEF: SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_INTERFACE_DEVICE_DETAIL_DATA_W
+TYPEDEF: PSP_DEVICE_INTERFACE_DETAIL_DATA_W PSP_INTERFACE_DEVICE_DETAIL_DATA_W
+TYPEDEF: SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_INTERFACE_DEVICE_DETAIL_DATA_A
+TYPEDEF: PSP_DEVICE_INTERFACE_DETAIL_DATA_A PSP_INTERFACE_DEVICE_DETAIL_DATA_A
+
+TYPEDEF: SP_INTERFACE_DEVICE_DETAIL_DATA_W SP_INTERFACE_DEVICE_DETAIL_DATA
+TYPEDEF: PSP_INTERFACE_DEVICE_DETAIL_DATA_W PSP_INTERFACE_DEVICE_DETAIL_DATA
+
+STRUCT: SP_DEVINFO_LIST_DETAIL_DATA_A
+ { cbSize DWORD }
+ { ClassGuid GUID }
+ { RemoteMachineHandle HANDLE }
+ { RemoteMachineName CHAR[SP_MAX_MACHINENAME_LENGTH] } ;
+TYPEDEF: SP_DEVINFO_LIST_DETAIL_DATA_A* PSP_DEVINFO_LIST_DETAIL_DATA_A
+STRUCT: SP_DEVINFO_LIST_DETAIL_DATA_W
+ { cbSize DWORD }
+ { ClassGuid GUID }
+ { RemoteMachineHandle HANDLE }
+ { RemoteMachineName WCHAR[SP_MAX_MACHINENAME_LENGTH] } ;
+TYPEDEF: SP_DEVINFO_LIST_DETAIL_DATA_W* PSP_DEVINFO_LIST_DETAIL_DATA_W
+
+TYPEDEF: SP_DEVINFO_LIST_DETAIL_DATA_W SP_DEVINFO_LIST_DETAIL_DATA
+TYPEDEF: PSP_DEVINFO_LIST_DETAIL_DATA_W PSP_DEVINFO_LIST_DETAIL_DATA
+
+CONSTANT: DIF_SELECTDEVICE HEX: 00000001
+CONSTANT: DIF_INSTALLDEVICE HEX: 00000002
+CONSTANT: DIF_ASSIGNRESOURCES HEX: 00000003
+CONSTANT: DIF_PROPERTIES HEX: 00000004
+CONSTANT: DIF_REMOVE HEX: 00000005
+CONSTANT: DIF_FIRSTTIMESETUP HEX: 00000006
+CONSTANT: DIF_FOUNDDEVICE HEX: 00000007
+CONSTANT: DIF_SELECTCLASSDRIVERS HEX: 00000008
+CONSTANT: DIF_VALIDATECLASSDRIVERS HEX: 00000009
+CONSTANT: DIF_INSTALLCLASSDRIVERS HEX: 0000000A
+CONSTANT: DIF_CALCDISKSPACE HEX: 0000000B
+CONSTANT: DIF_DESTROYPRIVATEDATA HEX: 0000000C
+CONSTANT: DIF_VALIDATEDRIVER HEX: 0000000D
+CONSTANT: DIF_DETECT HEX: 0000000F
+CONSTANT: DIF_INSTALLWIZARD HEX: 00000010
+CONSTANT: DIF_DESTROYWIZARDDATA HEX: 00000011
+CONSTANT: DIF_PROPERTYCHANGE HEX: 00000012
+CONSTANT: DIF_ENABLECLASS HEX: 00000013
+CONSTANT: DIF_DETECTVERIFY HEX: 00000014
+CONSTANT: DIF_INSTALLDEVICEFILES HEX: 00000015
+CONSTANT: DIF_UNREMOVE HEX: 00000016
+CONSTANT: DIF_SELECTBESTCOMPATDRV HEX: 00000017
+CONSTANT: DIF_ALLOW_INSTALL HEX: 00000018
+CONSTANT: DIF_REGISTERDEVICE HEX: 00000019
+CONSTANT: DIF_NEWDEVICEWIZARD_PRESELECT HEX: 0000001A
+CONSTANT: DIF_NEWDEVICEWIZARD_SELECT HEX: 0000001B
+CONSTANT: DIF_NEWDEVICEWIZARD_PREANALYZE HEX: 0000001C
+CONSTANT: DIF_NEWDEVICEWIZARD_POSTANALYZE HEX: 0000001D
+CONSTANT: DIF_NEWDEVICEWIZARD_FINISHINSTALL HEX: 0000001E
+CONSTANT: DIF_UNUSED1 HEX: 0000001F
+CONSTANT: DIF_INSTALLINTERFACES HEX: 00000020
+CONSTANT: DIF_DETECTCANCEL HEX: 00000021
+CONSTANT: DIF_REGISTER_COINSTALLERS HEX: 00000022
+CONSTANT: DIF_ADDPROPERTYPAGE_ADVANCED HEX: 00000023
+CONSTANT: DIF_ADDPROPERTYPAGE_BASIC HEX: 00000024
+CONSTANT: DIF_RESERVED1 HEX: 00000025
+CONSTANT: DIF_TROUBLESHOOTER HEX: 00000026
+CONSTANT: DIF_POWERMESSAGEWAKE HEX: 00000027
+CONSTANT: DIF_ADDREMOTEPROPERTYPAGE_ADVANCED HEX: 00000028
+CONSTANT: DIF_UPDATEDRIVER_UI HEX: 00000029
+CONSTANT: DIF_FINISHINSTALL_ACTION HEX: 0000002A
+CONSTANT: DIF_RESERVED2 HEX: 00000030
+CONSTANT: DIF_MOVEDEVICE HEX: 0000000E
+TYPEDEF: UINT DI_FUNCTION
+
+STRUCT: SP_DEVINSTALL_PARAMS_A
+ { cbSize DWORD }
+ { Flags DWORD }
+ { FlagsEx DWORD }
+ { hwndParent HWND }
+ { InstallMsgHandler PSP_FILE_CALLBACK }
+ { InstallMsgHandlerContext PVOID }
+ { FileQueue HSPFILEQ }
+ { ClassInstallReserved ULONG_PTR }
+ { Reserved DWORD }
+ { DriverPath CHAR[MAX_PATH] } ;
+TYPEDEF: SP_DEVINSTALL_PARAMS_A* PSP_DEVINSTALL_PARAMS_A
+STRUCT: SP_DEVINSTALL_PARAMS_W
+ { cbSize DWORD }
+ { Flags DWORD }
+ { FlagsEx DWORD }
+ { hwndParent HWND }
+ { InstallMsgHandler PSP_FILE_CALLBACK }
+ { InstallMsgHandlerContext PVOID }
+ { FileQueue HSPFILEQ }
+ { ClassInstallReserved ULONG_PTR }
+ { Reserved DWORD }
+ { DriverPath WCHAR[MAX_PATH] } ;
+TYPEDEF: SP_DEVINSTALL_PARAMS_W* PSP_DEVINSTALL_PARAMS_W
+TYPEDEF: SP_DEVINSTALL_PARAMS_W SP_DEVINSTALL_PARAMS
+TYPEDEF: PSP_DEVINSTALL_PARAMS_W PSP_DEVINSTALL_PARAMS
+
+CONSTANT: DI_SHOWOEM HEX: 00000001
+CONSTANT: DI_SHOWCOMPAT HEX: 00000002
+CONSTANT: DI_SHOWCLASS HEX: 00000004
+CONSTANT: DI_SHOWALL HEX: 00000007
+CONSTANT: DI_NOVCP HEX: 00000008
+CONSTANT: DI_DIDCOMPAT HEX: 00000010
+CONSTANT: DI_DIDCLASS HEX: 00000020
+CONSTANT: DI_AUTOASSIGNRES HEX: 00000040
+CONSTANT: DI_NEEDRESTART HEX: 00000080
+CONSTANT: DI_NEEDREBOOT HEX: 00000100
+CONSTANT: DI_NOBROWSE HEX: 00000200
+CONSTANT: DI_MULTMFGS HEX: 00000400
+CONSTANT: DI_DISABLED HEX: 00000800
+CONSTANT: DI_GENERALPAGE_ADDED HEX: 00001000
+CONSTANT: DI_RESOURCEPAGE_ADDED HEX: 00002000
+CONSTANT: DI_PROPERTIES_CHANGE HEX: 00004000
+CONSTANT: DI_INF_IS_SORTED HEX: 00008000
+CONSTANT: DI_ENUMSINGLEINF HEX: 00010000
+CONSTANT: DI_DONOTCALLCONFIGMG HEX: 00020000
+CONSTANT: DI_INSTALLDISABLED HEX: 00040000
+CONSTANT: DI_COMPAT_FROM_CLASS HEX: 00080000
+CONSTANT: DI_CLASSINSTALLPARAMS HEX: 00100000
+CONSTANT: DI_NODI_DEFAULTACTION HEX: 00200000
+CONSTANT: DI_QUIETINSTALL HEX: 00800000
+CONSTANT: DI_NOFILECOPY HEX: 01000000
+CONSTANT: DI_FORCECOPY HEX: 02000000
+CONSTANT: DI_DRIVERPAGE_ADDED HEX: 04000000
+CONSTANT: DI_USECI_SELECTSTRINGS HEX: 08000000
+CONSTANT: DI_OVERRIDE_INFFLAGS HEX: 10000000
+CONSTANT: DI_PROPS_NOCHANGEUSAGE HEX: 20000000
+CONSTANT: DI_NOSELECTICONS HEX: 40000000
+CONSTANT: DI_NOWRITE_IDS HEX: 80000000
+CONSTANT: DI_FLAGSEX_RESERVED2 HEX: 00000001
+CONSTANT: DI_FLAGSEX_RESERVED3 HEX: 00000002
+CONSTANT: DI_FLAGSEX_CI_FAILED HEX: 00000004
+CONSTANT: DI_FLAGSEX_FINISHINSTALL_ACTION HEX: 00000008
+CONSTANT: DI_FLAGSEX_DIDINFOLIST HEX: 00000010
+CONSTANT: DI_FLAGSEX_DIDCOMPATINFO HEX: 00000020
+CONSTANT: DI_FLAGSEX_FILTERCLASSES HEX: 00000040
+CONSTANT: DI_FLAGSEX_SETFAILEDINSTALL HEX: 00000080
+CONSTANT: DI_FLAGSEX_DEVICECHANGE HEX: 00000100
+CONSTANT: DI_FLAGSEX_ALWAYSWRITEIDS HEX: 00000200
+CONSTANT: DI_FLAGSEX_PROPCHANGE_PENDING HEX: 00000400
+CONSTANT: DI_FLAGSEX_ALLOWEXCLUDEDDRVS HEX: 00000800
+CONSTANT: DI_FLAGSEX_NOUIONQUERYREMOVE HEX: 00001000
+CONSTANT: DI_FLAGSEX_USECLASSFORCOMPAT HEX: 00002000
+CONSTANT: DI_FLAGSEX_RESERVED4 HEX: 00004000
+CONSTANT: DI_FLAGSEX_NO_DRVREG_MODIFY HEX: 00008000
+CONSTANT: DI_FLAGSEX_IN_SYSTEM_SETUP HEX: 00010000
+CONSTANT: DI_FLAGSEX_INET_DRIVER HEX: 00020000
+CONSTANT: DI_FLAGSEX_APPENDDRIVERLIST HEX: 00040000
+CONSTANT: DI_FLAGSEX_PREINSTALLBACKUP HEX: 00080000
+CONSTANT: DI_FLAGSEX_BACKUPONREPLACE HEX: 00100000
+CONSTANT: DI_FLAGSEX_DRIVERLIST_FROM_URL HEX: 00200000
+CONSTANT: DI_FLAGSEX_RESERVED1 HEX: 00400000
+CONSTANT: DI_FLAGSEX_EXCLUDE_OLD_INET_DRIVERS HEX: 00800000
+CONSTANT: DI_FLAGSEX_POWERPAGE_ADDED HEX: 01000000
+CONSTANT: DI_FLAGSEX_FILTERSIMILARDRIVERS HEX: 02000000
+CONSTANT: DI_FLAGSEX_INSTALLEDDRIVER HEX: 04000000
+CONSTANT: DI_FLAGSEX_NO_CLASSLIST_NODE_MERGE HEX: 08000000
+CONSTANT: DI_FLAGSEX_ALTPLATFORM_DRVSEARCH HEX: 10000000
+CONSTANT: DI_FLAGSEX_RESTART_DEVICE_ONLY HEX: 20000000
+CONSTANT: DI_FLAGSEX_RECURSIVESEARCH HEX: 40000000
+CONSTANT: DI_FLAGSEX_SEARCH_PUBLISHED_INFS HEX: 80000000
+
+STRUCT: SP_CLASSINSTALL_HEADER
+ { cbSize DWORD }
+ { InstallFunction DI_FUNCTION } ;
+TYPEDEF: SP_CLASSINSTALL_HEADER* PSP_CLASSINSTALL_HEADER
+
+STRUCT: SP_ENABLECLASS_PARAMS
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { ClassGuid GUID }
+ { EnableMessage DWORD } ;
+TYPEDEF: SP_ENABLECLASS_PARAMS* PSP_ENABLECLASS_PARAMS
+
+CONSTANT: ENABLECLASS_QUERY 0
+CONSTANT: ENABLECLASS_SUCCESS 1
+CONSTANT: ENABLECLASS_FAILURE 2
+CONSTANT: DICS_ENABLE HEX: 00000001
+CONSTANT: DICS_DISABLE HEX: 00000002
+CONSTANT: DICS_PROPCHANGE HEX: 00000003
+CONSTANT: DICS_START HEX: 00000004
+CONSTANT: DICS_STOP HEX: 00000005
+CONSTANT: DICS_FLAG_GLOBAL HEX: 00000001
+CONSTANT: DICS_FLAG_CONFIGSPECIFIC HEX: 00000002
+CONSTANT: DICS_FLAG_CONFIGGENERAL HEX: 00000004
+
+STRUCT: SP_PROPCHANGE_PARAMS
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { StateChange DWORD }
+ { Scope DWORD }
+ { HwProfile DWORD } ;
+TYPEDEF: SP_PROPCHANGE_PARAMS* PSP_PROPCHANGE_PARAMS
+
+STRUCT: SP_REMOVEDEVICE_PARAMS
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { Scope DWORD }
+ { HwProfile DWORD } ;
+TYPEDEF: SP_REMOVEDEVICE_PARAMS* PSP_REMOVEDEVICE_PARAMS
+
+CONSTANT: DI_REMOVEDEVICE_GLOBAL HEX: 00000001
+CONSTANT: DI_REMOVEDEVICE_CONFIGSPECIFIC HEX: 00000002
+
+STRUCT: SP_UNREMOVEDEVICE_PARAMS
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { Scope DWORD }
+ { HwProfile DWORD } ;
+TYPEDEF: SP_UNREMOVEDEVICE_PARAMS* PSP_UNREMOVEDEVICE_PARAMS
+
+CONSTANT: DI_UNREMOVEDEVICE_CONFIGSPECIFIC HEX: 00000002
+
+STRUCT: SP_SELECTDEVICE_PARAMS_A
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { Title CHAR[MAX_TITLE_LEN] }
+ { Instructions CHAR[MAX_INSTRUCTION_LEN] }
+ { ListLabel CHAR[MAX_LABEL_LEN] }
+ { SubTitle CHAR[MAX_SUBTITLE_LEN] }
+ { Reserved BYTE[2] } ;
+TYPEDEF: SP_SELECTDEVICE_PARAMS_A* PSP_SELECTDEVICE_PARAMS_A
+STRUCT: SP_SELECTDEVICE_PARAMS_W
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { Title WCHAR[MAX_TITLE_LEN] }
+ { Instructions WCHAR[MAX_INSTRUCTION_LEN] }
+ { ListLabel WCHAR[MAX_LABEL_LEN] }
+ { SubTitle WCHAR[MAX_SUBTITLE_LEN] } ;
+TYPEDEF: SP_SELECTDEVICE_PARAMS_W* PSP_SELECTDEVICE_PARAMS_W
+TYPEDEF: SP_SELECTDEVICE_PARAMS_W SP_SELECTDEVICE_PARAMS
+TYPEDEF: PSP_SELECTDEVICE_PARAMS_W PSP_SELECTDEVICE_PARAMS
+
+CALLBACK: BOOL PDETECT_PROGRESS_NOTIFY ( PVOID ProgressNotifyParam, DWORD DetectComplete ) ;
+
+STRUCT: SP_DETECTDEVICE_PARAMS
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { DetectProgressNotify PDETECT_PROGRESS_NOTIFY }
+ { ProgressNotifyParam PVOID } ;
+TYPEDEF: SP_DETECTDEVICE_PARAMS* PSP_DETECTDEVICE_PARAMS
+
+CONSTANT: MAX_INSTALLWIZARD_DYNAPAGES 20
+
+STRUCT: SP_INSTALLWIZARD_DATA
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { Flags DWORD }
+ { DynamicPages HPROPSHEETPAGE[MAX_INSTALLWIZARD_DYNAPAGES] }
+ { NumDynamicPages DWORD }
+ { DynamicPageFlags DWORD }
+ { PrivateFlags DWORD }
+ { PrivateData LPARAM }
+ { hwndWizardDlg HWND } ;
+TYPEDEF: SP_INSTALLWIZARD_DATA* PSP_INSTALLWIZARD_DATA
+
+CONSTANT: NDW_INSTALLFLAG_DIDFACTDEFS HEX: 00000001
+CONSTANT: NDW_INSTALLFLAG_HARDWAREALLREADYIN HEX: 00000002
+CONSTANT: NDW_INSTALLFLAG_NEEDRESTART $ DI_NEEDRESTART
+CONSTANT: NDW_INSTALLFLAG_NEEDREBOOT $ DI_NEEDREBOOT
+CONSTANT: NDW_INSTALLFLAG_NEEDSHUTDOWN HEX: 00000200
+CONSTANT: NDW_INSTALLFLAG_EXPRESSINTRO HEX: 00000400
+CONSTANT: NDW_INSTALLFLAG_SKIPISDEVINSTALLED HEX: 00000800
+CONSTANT: NDW_INSTALLFLAG_NODETECTEDDEVS HEX: 00001000
+CONSTANT: NDW_INSTALLFLAG_INSTALLSPECIFIC HEX: 00002000
+CONSTANT: NDW_INSTALLFLAG_SKIPCLASSLIST HEX: 00004000
+CONSTANT: NDW_INSTALLFLAG_CI_PICKED_OEM HEX: 00008000
+CONSTANT: NDW_INSTALLFLAG_PCMCIAMODE HEX: 00010000
+CONSTANT: NDW_INSTALLFLAG_PCMCIADEVICE HEX: 00020000
+CONSTANT: NDW_INSTALLFLAG_USERCANCEL HEX: 00040000
+CONSTANT: NDW_INSTALLFLAG_KNOWNCLASS HEX: 00080000
+CONSTANT: DYNAWIZ_FLAG_PAGESADDED HEX: 00000001
+CONSTANT: DYNAWIZ_FLAG_ANALYZE_HANDLECONFLICT HEX: 00000008
+CONSTANT: DYNAWIZ_FLAG_INSTALLDET_NEXT HEX: 00000002
+CONSTANT: DYNAWIZ_FLAG_INSTALLDET_PREV HEX: 00000004
+CONSTANT: MIN_IDD_DYNAWIZ_RESOURCE_ID 10000
+CONSTANT: MAX_IDD_DYNAWIZ_RESOURCE_ID 11000
+CONSTANT: IDD_DYNAWIZ_FIRSTPAGE 10000
+CONSTANT: IDD_DYNAWIZ_SELECT_PREVPAGE 10001
+CONSTANT: IDD_DYNAWIZ_SELECT_NEXTPAGE 10002
+CONSTANT: IDD_DYNAWIZ_ANALYZE_PREVPAGE 10003
+CONSTANT: IDD_DYNAWIZ_ANALYZE_NEXTPAGE 10004
+CONSTANT: IDD_DYNAWIZ_SELECTDEV_PAGE 10009
+CONSTANT: IDD_DYNAWIZ_ANALYZEDEV_PAGE 10010
+CONSTANT: IDD_DYNAWIZ_INSTALLDETECTEDDEVS_PAGE 10011
+CONSTANT: IDD_DYNAWIZ_SELECTCLASS_PAGE 10012
+CONSTANT: IDD_DYNAWIZ_INSTALLDETECTED_PREVPAGE 10006
+CONSTANT: IDD_DYNAWIZ_INSTALLDETECTED_NEXTPAGE 10007
+CONSTANT: IDD_DYNAWIZ_INSTALLDETECTED_NODEVS 10008
+
+STRUCT: SP_NEWDEVICEWIZARD_DATA
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { Flags DWORD }
+ { DynamicPages HPROPSHEETPAGE[MAX_INSTALLWIZARD_DYNAPAGES] }
+ { NumDynamicPages DWORD }
+ { hwndWizardDlg HWND } ;
+TYPEDEF: SP_NEWDEVICEWIZARD_DATA* PSP_NEWDEVICEWIZARD_DATA
+TYPEDEF: SP_NEWDEVICEWIZARD_DATA SP_ADDPROPERTYPAGE_DATA
+TYPEDEF: PSP_NEWDEVICEWIZARD_DATA PSP_ADDPROPERTYPAGE_DATA
+
+STRUCT: SP_TROUBLESHOOTER_PARAMS_A
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { ChmFile CHAR[MAX_PATH] }
+ { HtmlTroubleShooter CHAR[MAX_PATH] } ;
+TYPEDEF: SP_TROUBLESHOOTER_PARAMS_A* PSP_TROUBLESHOOTER_PARAMS_A
+STRUCT: SP_TROUBLESHOOTER_PARAMS_W
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { ChmFile WCHAR[MAX_PATH] }
+ { HtmlTroubleShooter WCHAR[MAX_PATH] } ;
+TYPEDEF: SP_TROUBLESHOOTER_PARAMS_W* PSP_TROUBLESHOOTER_PARAMS_W
+TYPEDEF: SP_TROUBLESHOOTER_PARAMS_W SP_TROUBLESHOOTER_PARAMS
+TYPEDEF: PSP_TROUBLESHOOTER_PARAMS_W PSP_TROUBLESHOOTER_PARAMS
+
+STRUCT: SP_POWERMESSAGEWAKE_PARAMS_A
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { PowerMessageWake CHAR[LINE_LEN*2] } ;
+TYPEDEF: SP_POWERMESSAGEWAKE_PARAMS_A* PSP_POWERMESSAGEWAKE_PARAMS_A
+STRUCT: SP_POWERMESSAGEWAKE_PARAMS_W
+ { ClassInstallHeader SP_CLASSINSTALL_HEADER }
+ { PowerMessageWake WCHAR[LINE_LEN*2] } ;
+TYPEDEF: SP_POWERMESSAGEWAKE_PARAMS_W* PSP_POWERMESSAGEWAKE_PARAMS_W
+TYPEDEF: SP_POWERMESSAGEWAKE_PARAMS_W SP_POWERMESSAGEWAKE_PARAMS
+TYPEDEF: PSP_POWERMESSAGEWAKE_PARAMS_W PSP_POWERMESSAGEWAKE_PARAMS
+
+STRUCT: SP_DRVINFO_DATA_V2_A
+ { cbSize DWORD }
+ { DriverType DWORD }
+ { Reserved ULONG_PTR }
+ { Description CHAR[LINE_LEN] }
+ { MfgName CHAR[LINE_LEN] }
+ { ProviderName CHAR[LINE_LEN] }
+ { DriverDate FILETIME }
+ { DriverVersion DWORDLONG } ;
+TYPEDEF: SP_DRVINFO_DATA_V2_A* PSP_DRVINFO_DATA_V2_A
+STRUCT: SP_DRVINFO_DATA_V2_W
+ { cbSize DWORD }
+ { DriverType DWORD }
+ { Reserved ULONG_PTR }
+ { Description WCHAR[LINE_LEN] }
+ { MfgName WCHAR[LINE_LEN] }
+ { ProviderName WCHAR[LINE_LEN] }
+ { DriverDate FILETIME }
+ { DriverVersion DWORDLONG } ;
+TYPEDEF: SP_DRVINFO_DATA_V2_W* PSP_DRVINFO_DATA_V2_W
+STRUCT: SP_DRVINFO_DATA_V1_A
+ { cbSize DWORD }
+ { DriverType DWORD }
+ { Reserved ULONG_PTR }
+ { Description CHAR[LINE_LEN] }
+ { MfgName CHAR[LINE_LEN] }
+ { ProviderName CHAR[LINE_LEN] } ;
+TYPEDEF: SP_DRVINFO_DATA_V1_A* PSP_DRVINFO_DATA_V1_A
+STRUCT: SP_DRVINFO_DATA_V1_W
+ { cbSize DWORD }
+ { DriverType DWORD }
+ { Reserved ULONG_PTR }
+ { Description WCHAR[LINE_LEN] }
+ { MfgName WCHAR[LINE_LEN] }
+ { ProviderName WCHAR[LINE_LEN] } ;
+TYPEDEF: SP_DRVINFO_DATA_V1_W* PSP_DRVINFO_DATA_V1_W
+TYPEDEF: SP_DRVINFO_DATA_V1_W SP_DRVINFO_DATA_V1
+TYPEDEF: PSP_DRVINFO_DATA_V1_W PSP_DRVINFO_DATA_V1
+TYPEDEF: SP_DRVINFO_DATA_V2_W SP_DRVINFO_DATA_V2
+TYPEDEF: PSP_DRVINFO_DATA_V2_W PSP_DRVINFO_DATA_V2
+TYPEDEF: SP_DRVINFO_DATA_V2_A SP_DRVINFO_DATA_A
+TYPEDEF: PSP_DRVINFO_DATA_V2_A PSP_DRVINFO_DATA_A
+TYPEDEF: SP_DRVINFO_DATA_V2_W SP_DRVINFO_DATA_W
+TYPEDEF: PSP_DRVINFO_DATA_V2_W PSP_DRVINFO_DATA_W
+TYPEDEF: SP_DRVINFO_DATA_V2 SP_DRVINFO_DATA
+TYPEDEF: PSP_DRVINFO_DATA_V2 PSP_DRVINFO_DATA
+
+STRUCT: SP_DRVINFO_DETAIL_DATA_A
+ { cbSize DWORD }
+ { InfDate FILETIME }
+ { CompatIDsOffset DWORD }
+ { CompatIDsLength DWORD }
+ { Reserved ULONG_PTR }
+ { SectionName CHAR[LINE_LEN] }
+ { InfFileName CHAR[MAX_PATH] }
+ { DrvDescription CHAR[LINE_LEN] }
+ { HardwareID CHAR[ANYSIZE_ARRAY] } ;
+TYPEDEF: SP_DRVINFO_DETAIL_DATA_A* PSP_DRVINFO_DETAIL_DATA_A
+STRUCT: SP_DRVINFO_DETAIL_DATA_W
+ { cbSize DWORD }
+ { InfDate FILETIME }
+ { CompatIDsOffset DWORD }
+ { CompatIDsLength DWORD }
+ { Reserved ULONG_PTR }
+ { SectionName WCHAR[LINE_LEN] }
+ { InfFileName WCHAR[MAX_PATH] }
+ { DrvDescription WCHAR[LINE_LEN] }
+ { HardwareID WCHAR[ANYSIZE_ARRAY] } ;
+TYPEDEF: SP_DRVINFO_DETAIL_DATA_W* PSP_DRVINFO_DETAIL_DATA_W
+
+TYPEDEF: SP_DRVINFO_DETAIL_DATA_W SP_DRVINFO_DETAIL_DATA
+TYPEDEF: PSP_DRVINFO_DETAIL_DATA_W PSP_DRVINFO_DETAIL_DATA
+
+STRUCT: SP_DRVINSTALL_PARAMS
+ { cbSize DWORD }
+ { Rank DWORD }
+ { Flags DWORD }
+ { PrivateData DWORD_PTR }
+ { Reserved DWORD } ;
+TYPEDEF: SP_DRVINSTALL_PARAMS* PSP_DRVINSTALL_PARAMS
+
+CONSTANT: DNF_DUPDESC HEX: 00000001
+CONSTANT: DNF_OLDDRIVER HEX: 00000002
+CONSTANT: DNF_EXCLUDEFROMLIST HEX: 00000004
+CONSTANT: DNF_NODRIVER HEX: 00000008
+CONSTANT: DNF_LEGACYINF HEX: 00000010
+CONSTANT: DNF_CLASS_DRIVER HEX: 00000020
+CONSTANT: DNF_COMPATIBLE_DRIVER HEX: 00000040
+CONSTANT: DNF_INET_DRIVER HEX: 00000080
+CONSTANT: DNF_UNUSED1 HEX: 00000100
+CONSTANT: DNF_UNUSED2 HEX: 00000200
+CONSTANT: DNF_OLD_INET_DRIVER HEX: 00000400
+CONSTANT: DNF_BAD_DRIVER HEX: 00000800
+CONSTANT: DNF_DUPPROVIDER HEX: 00001000
+CONSTANT: DNF_INF_IS_SIGNED HEX: 00002000
+CONSTANT: DNF_OEM_F6_INF HEX: 00004000
+CONSTANT: DNF_DUPDRIVERVER HEX: 00008000
+CONSTANT: DNF_BASIC_DRIVER HEX: 00010000
+CONSTANT: DNF_AUTHENTICODE_SIGNED HEX: 00020000
+CONSTANT: DNF_INSTALLEDDRIVER HEX: 00040000
+CONSTANT: DNF_ALWAYSEXCLUDEFROMLIST HEX: 00080000
+CONSTANT: DNF_INBOX_DRIVER HEX: 00100000
+CONSTANT: DNF_REQUESTADDITIONALSOFTWARE HEX: 00200000
+CONSTANT: DNF_UNUSED_22 HEX: 00400000
+CONSTANT: DNF_UNUSED_23 HEX: 00800000
+CONSTANT: DNF_UNUSED_24 HEX: 01000000
+CONSTANT: DNF_UNUSED_25 HEX: 02000000
+CONSTANT: DNF_UNUSED_26 HEX: 04000000
+CONSTANT: DNF_UNUSED_27 HEX: 08000000
+CONSTANT: DNF_UNUSED_28 HEX: 10000000
+CONSTANT: DNF_UNUSED_29 HEX: 20000000
+CONSTANT: DNF_UNUSED_30 HEX: 40000000
+CONSTANT: DNF_UNUSED_31 HEX: 80000000
+CONSTANT: DRIVER_HARDWAREID_RANK HEX: 00000FFF
+CONSTANT: DRIVER_HARDWAREID_MASK HEX: 80000FFF
+CONSTANT: DRIVER_UNTRUSTED_RANK HEX: 80000000
+CONSTANT: DRIVER_W9X_SUSPECT_RANK HEX: C0000000
+
+CALLBACK: DWORD PSP_DETSIG_CMPPROC ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA NewDeviceData, PSP_DEVINFO_DATA ExistingDeviceData, PVOID CompareContext ) ;
+
+STRUCT: COINSTALLER_CONTEXT_DATA
+ { PostProcessing BOOL }
+ { InstallResult DWORD }
+ { PrivateData PVOID } ;
+TYPEDEF: COINSTALLER_CONTEXT_DATA* PCOINSTALLER_CONTEXT_DATA
+
+STRUCT: SP_CLASSIMAGELIST_DATA
+ { cbSize DWORD }
+ { ImageList HIMAGELIST }
+ { Reserved ULONG_PTR } ;
+TYPEDEF: SP_CLASSIMAGELIST_DATA* PSP_CLASSIMAGELIST_DATA
+
+STRUCT: SP_PROPSHEETPAGE_REQUEST
+ { cbSize DWORD }
+ { PageRequested DWORD }
+ { DeviceInfoSet HDEVINFO }
+ { DeviceInfoData PSP_DEVINFO_DATA } ;
+TYPEDEF: SP_PROPSHEETPAGE_REQUEST* PSP_PROPSHEETPAGE_REQUEST
+
+CONSTANT: SPPSR_SELECT_DEVICE_RESOURCES 1
+CONSTANT: SPPSR_ENUM_BASIC_DEVICE_PROPERTIES 2
+CONSTANT: SPPSR_ENUM_ADV_DEVICE_PROPERTIES 3
+
+STRUCT: SP_BACKUP_QUEUE_PARAMS_V2_A
+ { cbSize DWORD }
+ { FullInfPath CHAR[MAX_PATH] }
+ { FilenameOffset INT }
+ { ReinstallInstance CHAR[MAX_PATH] } ;
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V2_A* PSP_BACKUP_QUEUE_PARAMS_V2_A
+
+STRUCT: SP_BACKUP_QUEUE_PARAMS_V2_W
+ { cbSize DWORD }
+ { FullInfPath WCHAR[MAX_PATH] }
+ { FilenameOffset INT }
+ { ReinstallInstance WCHAR[MAX_PATH] } ;
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V2_W* PSP_BACKUP_QUEUE_PARAMS_V2_W
+
+STRUCT: SP_BACKUP_QUEUE_PARAMS_V1_A
+ { cbSize DWORD }
+ { FullInfPath CHAR[MAX_PATH] }
+ { FilenameOffset INT } ;
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V1_A* PSP_BACKUP_QUEUE_PARAMS_V1_A
+
+STRUCT: SP_BACKUP_QUEUE_PARAMS_V1_W
+ { cbSize DWORD }
+ { FullInfPath WCHAR[MAX_PATH] }
+ { FilenameOffset INT } ;
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V1_W* PSP_BACKUP_QUEUE_PARAMS_V1_W
+
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V1_W SP_BACKUP_QUEUE_PARAMS_V1
+TYPEDEF: PSP_BACKUP_QUEUE_PARAMS_V1_W PSP_BACKUP_QUEUE_PARAMS_V1
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V2_W SP_BACKUP_QUEUE_PARAMS_V2
+TYPEDEF: PSP_BACKUP_QUEUE_PARAMS_V2_W PSP_BACKUP_QUEUE_PARAMS_V2
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V2_A SP_BACKUP_QUEUE_PARAMS_A
+TYPEDEF: PSP_BACKUP_QUEUE_PARAMS_V2_A PSP_BACKUP_QUEUE_PARAMS_A
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V2_W SP_BACKUP_QUEUE_PARAMS_W
+TYPEDEF: PSP_BACKUP_QUEUE_PARAMS_V2_W PSP_BACKUP_QUEUE_PARAMS_W
+TYPEDEF: SP_BACKUP_QUEUE_PARAMS_V2 SP_BACKUP_QUEUE_PARAMS
+TYPEDEF: PSP_BACKUP_QUEUE_PARAMS_V2 PSP_BACKUP_QUEUE_PARAMS
+
+CONSTANT: ERROR_EXPECTED_SECTION_NAME $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR 0 bitor bitor ]
+CONSTANT: ERROR_BAD_SECTION_NAME_LINE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR 1 bitor bitor ]
+CONSTANT: ERROR_SECTION_NAME_TOO_LONG $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR 2 bitor bitor ]
+CONSTANT: ERROR_GENERAL_SYNTAX $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR 3 bitor bitor ]
+CONSTANT: ERROR_WRONG_INF_STYLE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 100 bitor bitor ]
+CONSTANT: ERROR_SECTION_NOT_FOUND $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 101 bitor bitor ]
+CONSTANT: ERROR_LINE_NOT_FOUND $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 102 bitor bitor ]
+CONSTANT: ERROR_NO_BACKUP $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 103 bitor bitor ]
+CONSTANT: ERROR_NO_ASSOCIATED_CLASS $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 200 bitor bitor ]
+CONSTANT: ERROR_CLASS_MISMATCH $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 201 bitor bitor ]
+CONSTANT: ERROR_DUPLICATE_FOUND $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 202 bitor bitor ]
+CONSTANT: ERROR_NO_DRIVER_SELECTED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 203 bitor bitor ]
+CONSTANT: ERROR_KEY_DOES_NOT_EXIST $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 204 bitor bitor ]
+CONSTANT: ERROR_INVALID_DEVINST_NAME $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 205 bitor bitor ]
+CONSTANT: ERROR_INVALID_CLASS $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 206 bitor bitor ]
+CONSTANT: ERROR_DEVINST_ALREADY_EXISTS $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 207 bitor bitor ]
+CONSTANT: ERROR_DEVINFO_NOT_REGISTERED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 208 bitor bitor ]
+CONSTANT: ERROR_INVALID_REG_PROPERTY $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 209 bitor bitor ]
+CONSTANT: ERROR_NO_INF $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 20A bitor bitor ]
+CONSTANT: ERROR_NO_SUCH_DEVINST $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 20B bitor bitor ]
+CONSTANT: ERROR_CANT_LOAD_CLASS_ICON $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 20C bitor bitor ]
+CONSTANT: ERROR_INVALID_CLASS_INSTALLER $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 20D bitor bitor ]
+CONSTANT: ERROR_DI_DO_DEFAULT $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 20E bitor bitor ]
+CONSTANT: ERROR_DI_NOFILECOPY $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 20F bitor bitor ]
+CONSTANT: ERROR_INVALID_HWPROFILE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 210 bitor bitor ]
+CONSTANT: ERROR_NO_DEVICE_SELECTED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 211 bitor bitor ]
+CONSTANT: ERROR_DEVINFO_LIST_LOCKED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 212 bitor bitor ]
+CONSTANT: ERROR_DEVINFO_DATA_LOCKED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 213 bitor bitor ]
+CONSTANT: ERROR_DI_BAD_PATH $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 214 bitor bitor ]
+CONSTANT: ERROR_NO_CLASSINSTALL_PARAMS $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 215 bitor bitor ]
+CONSTANT: ERROR_FILEQUEUE_LOCKED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 216 bitor bitor ]
+CONSTANT: ERROR_BAD_SERVICE_INSTALLSECT $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 217 bitor bitor ]
+CONSTANT: ERROR_NO_CLASS_DRIVER_LIST $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 218 bitor bitor ]
+CONSTANT: ERROR_NO_ASSOCIATED_SERVICE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 219 bitor bitor ]
+CONSTANT: ERROR_NO_DEFAULT_DEVICE_INTERFACE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 21A bitor bitor ]
+CONSTANT: ERROR_DEVICE_INTERFACE_ACTIVE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 21B bitor bitor ]
+CONSTANT: ERROR_DEVICE_INTERFACE_REMOVED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 21C bitor bitor ]
+CONSTANT: ERROR_BAD_INTERFACE_INSTALLSECT $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 21D bitor bitor ]
+CONSTANT: ERROR_NO_SUCH_INTERFACE_CLASS $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 21E bitor bitor ]
+CONSTANT: ERROR_INVALID_REFERENCE_STRING $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 21F bitor bitor ]
+CONSTANT: ERROR_INVALID_MACHINENAME $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 220 bitor bitor ]
+CONSTANT: ERROR_REMOTE_COMM_FAILURE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 221 bitor bitor ]
+CONSTANT: ERROR_MACHINE_UNAVAILABLE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 222 bitor bitor ]
+CONSTANT: ERROR_NO_CONFIGMGR_SERVICES $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 223 bitor bitor ]
+CONSTANT: ERROR_INVALID_PROPPAGE_PROVIDER $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 224 bitor bitor ]
+CONSTANT: ERROR_NO_SUCH_DEVICE_INTERFACE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 225 bitor bitor ]
+CONSTANT: ERROR_DI_POSTPROCESSING_REQUIRED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 226 bitor bitor ]
+CONSTANT: ERROR_INVALID_COINSTALLER $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 227 bitor bitor ]
+CONSTANT: ERROR_NO_COMPAT_DRIVERS $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 228 bitor bitor ]
+CONSTANT: ERROR_NO_DEVICE_ICON $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 229 bitor bitor ]
+CONSTANT: ERROR_INVALID_INF_LOGCONFIG $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 22A bitor bitor ]
+CONSTANT: ERROR_DI_DONT_INSTALL $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 22B bitor bitor ]
+CONSTANT: ERROR_INVALID_FILTER_DRIVER $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 22C bitor bitor ]
+CONSTANT: ERROR_NON_WINDOWS_NT_DRIVER $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 22D bitor bitor ]
+CONSTANT: ERROR_NON_WINDOWS_DRIVER $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 22E bitor bitor ]
+CONSTANT: ERROR_NO_CATALOG_FOR_OEM_INF $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 22F bitor bitor ]
+CONSTANT: ERROR_DEVINSTALL_QUEUE_NONNATIVE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 230 bitor bitor ]
+CONSTANT: ERROR_NOT_DISABLEABLE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 231 bitor bitor ]
+CONSTANT: ERROR_CANT_REMOVE_DEVINST $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 232 bitor bitor ]
+CONSTANT: ERROR_INVALID_TARGET $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 233 bitor bitor ]
+CONSTANT: ERROR_DRIVER_NONNATIVE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 234 bitor bitor ]
+CONSTANT: ERROR_IN_WOW64 $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 235 bitor bitor ]
+CONSTANT: ERROR_SET_SYSTEM_RESTORE_POINT $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 236 bitor bitor ]
+CONSTANT: ERROR_SCE_DISABLED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 238 bitor bitor ]
+CONSTANT: ERROR_UNKNOWN_EXCEPTION $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 239 bitor bitor ]
+CONSTANT: ERROR_PNP_REGISTRY_ERROR $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 23A bitor bitor ]
+CONSTANT: ERROR_REMOTE_REQUEST_UNSUPPORTED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 23B bitor bitor ]
+CONSTANT: ERROR_NOT_AN_INSTALLED_OEM_INF $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 23C bitor bitor ]
+CONSTANT: ERROR_INF_IN_USE_BY_DEVICES $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 23D bitor bitor ]
+CONSTANT: ERROR_DI_FUNCTION_OBSOLETE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 23E bitor bitor ]
+CONSTANT: ERROR_NO_AUTHENTICODE_CATALOG $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 23F bitor bitor ]
+CONSTANT: ERROR_AUTHENTICODE_DISALLOWED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 240 bitor bitor ]
+CONSTANT: ERROR_AUTHENTICODE_TRUSTED_PUBLISHER $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 241 bitor bitor ]
+CONSTANT: ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 242 bitor bitor ]
+CONSTANT: ERROR_AUTHENTICODE_PUBLISHER_NOT_TRUSTED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 243 bitor bitor ]
+CONSTANT: ERROR_SIGNATURE_OSATTRIBUTE_MISMATCH $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 244 bitor bitor ]
+CONSTANT: ERROR_ONLY_VALIDATE_VIA_AUTHENTICODE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 245 bitor bitor ]
+CONSTANT: ERROR_DEVICE_INSTALLER_NOT_READY $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 246 bitor bitor ]
+CONSTANT: ERROR_DRIVER_STORE_ADD_FAILED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 247 bitor bitor ]
+CONSTANT: ERROR_DEVICE_INSTALL_BLOCKED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 248 bitor bitor ]
+CONSTANT: ERROR_DRIVER_INSTALL_BLOCKED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 249 bitor bitor ]
+CONSTANT: ERROR_WRONG_INF_TYPE $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 24A bitor bitor ]
+CONSTANT: ERROR_FILE_HASH_NOT_IN_CATALOG $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 24B bitor bitor ]
+CONSTANT: ERROR_DRIVER_STORE_DELETE_FAILED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 24C bitor bitor ]
+CONSTANT: ERROR_UNRECOVERABLE_STACK_OVERFLOW $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 300 bitor bitor ]
+CONSTANT: EXCEPTION_SPAPI_UNRECOVERABLE_STACK_OVERFLOW $ ERROR_UNRECOVERABLE_STACK_OVERFLOW
+CONSTANT: ERROR_NO_DEFAULT_INTERFACE_DEVICE $ ERROR_NO_DEFAULT_DEVICE_INTERFACE
+CONSTANT: ERROR_INTERFACE_DEVICE_ACTIVE $ ERROR_DEVICE_INTERFACE_ACTIVE
+CONSTANT: ERROR_INTERFACE_DEVICE_REMOVED $ ERROR_DEVICE_INTERFACE_REMOVED
+CONSTANT: ERROR_NO_SUCH_INTERFACE_DEVICE $ ERROR_NO_SUCH_DEVICE_INTERFACE
+CONSTANT: ERROR_NOT_INSTALLED $[ APPLICATION_ERROR_MASK ERROR_SEVERITY_ERROR HEX: 1000 bitor bitor ]
+
+FUNCTION: BOOL SetupGetInfInformationA ( LPCVOID InfSpec, DWORD SearchControl, PSP_INF_INFORMATION ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetInfInformationW ( LPCVOID InfSpec, DWORD SearchControl, PSP_INF_INFORMATION ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+CONSTANT: INFINFO_INF_SPEC_IS_HINF 1
+CONSTANT: INFINFO_INF_NAME_IS_ABSOLUTE 2
+CONSTANT: INFINFO_DEFAULT_SEARCH 3
+CONSTANT: INFINFO_REVERSE_DEFAULT_SEARCH 4
+CONSTANT: INFINFO_INF_PATH_LIST_SEARCH 5
+ALIAS: SetupGetInfInformation SetupGetInfInformationW
+
+FUNCTION: BOOL SetupQueryInfFileInformationA ( PSP_INF_INFORMATION InfInformation, UINT InfIndex, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupQueryInfFileInformationW ( PSP_INF_INFORMATION InfInformation, UINT InfIndex, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupQueryInfFileInformation SetupQueryInfFileInformationW
+
+FUNCTION: BOOL SetupQueryInfOriginalFileInformationA ( PSP_INF_INFORMATION InfInformation, UINT InfIndex, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PSP_ORIGINAL_FILE_INFO_A OriginalFileInfo ) ;
+FUNCTION: BOOL SetupQueryInfOriginalFileInformationW ( PSP_INF_INFORMATION InfInformation, UINT InfIndex, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PSP_ORIGINAL_FILE_INFO_W OriginalFileInfo ) ;
+ALIAS: SetupQueryInfOriginalFileInformation SetupQueryInfOriginalFileInformationW
+
+FUNCTION: BOOL SetupQueryInfVersionInformationA ( PSP_INF_INFORMATION InfInformation, UINT InfIndex, PCSTR Key, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupQueryInfVersionInformationW ( PSP_INF_INFORMATION InfInformation, UINT InfIndex, PCWSTR Key, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupQueryInfVersionInformation SetupQueryInfVersionInformationW
+
+FUNCTION: BOOL SetupGetInfDriverStoreLocationA ( PCSTR FileName, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PCSTR LocaleName, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetInfDriverStoreLocationW ( PCWSTR FileName, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PCWSTR LocaleName, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupGetInfDriverStoreLocation SetupGetInfDriverStoreLocationW
+
+FUNCTION: BOOL SetupGetInfPublishedNameA ( PCSTR DriverStoreLocation, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetInfPublishedNameW ( PCWSTR DriverStoreLocation, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupGetInfPublishedName SetupGetInfPublishedNameW
+
+FUNCTION: BOOL SetupGetInfFileListA ( PCSTR DirectoryPath, DWORD InfStyle, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetInfFileListW ( PCWSTR DirectoryPath, DWORD InfStyle, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupGetInfFileList SetupGetInfFileListW
+
+FUNCTION: HINF SetupOpenInfFileW ( PCWSTR FileName, PCWSTR InfClass, DWORD InfStyle, PUINT ErrorLine ) ;
+FUNCTION: HINF SetupOpenInfFileA ( PCSTR FileName, PCSTR InfClass, DWORD InfStyle, PUINT ErrorLine ) ;
+ALIAS: SetupOpenInfFile SetupOpenInfFileW
+
+FUNCTION: HINF SetupOpenMasterInf ( ) ;
+
+FUNCTION: BOOL SetupOpenAppendInfFileW ( PCWSTR FileName, HINF InfHandle, PUINT ErrorLine ) ;
+FUNCTION: BOOL SetupOpenAppendInfFileA ( PCSTR FileName, HINF InfHandle, PUINT ErrorLine ) ;
+ALIAS: SetupOpenAppendInfFile SetupOpenAppendInfFileW
+
+FUNCTION: void SetupCloseInfFile ( HINF InfHandle ) ;
+FUNCTION: BOOL SetupFindFirstLineA ( HINF InfHandle, PCSTR Section, PCSTR Key, PINFCONTEXT Context ) ;
+FUNCTION: BOOL SetupFindFirstLineW ( HINF InfHandle, PCWSTR Section, PCWSTR Key, PINFCONTEXT Context ) ;
+ALIAS: SetupFindFirstLine SetupFindFirstLineW
+
+FUNCTION: BOOL SetupFindNextLine ( PINFCONTEXT ContextIn, PINFCONTEXT ContextOut ) ;
+FUNCTION: BOOL SetupFindNextMatchLineA ( PINFCONTEXT ContextIn, PCSTR Key, PINFCONTEXT ContextOut ) ;
+FUNCTION: BOOL SetupFindNextMatchLineW ( PINFCONTEXT ContextIn, PCWSTR Key, PINFCONTEXT ContextOut ) ;
+ALIAS: SetupFindNextMatchLine SetupFindNextMatchLineW
+
+FUNCTION: BOOL SetupGetLineByIndexA ( HINF InfHandle, PCSTR Section, DWORD Index, PINFCONTEXT Context ) ;
+FUNCTION: BOOL SetupGetLineByIndexW ( HINF InfHandle, PCWSTR Section, DWORD Index, PINFCONTEXT Context ) ;
+ALIAS: SetupGetLineByIndex SetupGetLineByIndexW
+
+FUNCTION: LONG SetupGetLineCountA ( HINF InfHandle, PCSTR Section ) ;
+FUNCTION: LONG SetupGetLineCountW ( HINF InfHandle, PCWSTR Section ) ;
+ALIAS: SetupGetLineCount SetupGetLineCountW
+
+FUNCTION: BOOL SetupGetLineTextA ( PINFCONTEXT Context, HINF InfHandle, PCSTR Section, PCSTR Key, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetLineTextW ( PINFCONTEXT Context, HINF InfHandle, PCWSTR Section, PCWSTR Key, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupGetLineText SetupGetLineTextW
+
+FUNCTION: DWORD SetupGetFieldCount ( PINFCONTEXT Context ) ;
+FUNCTION: BOOL SetupGetStringFieldA ( PINFCONTEXT Context, DWORD FieldIndex, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetStringFieldW ( PINFCONTEXT Context, DWORD FieldIndex, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupGetStringField SetupGetStringFieldW
+
+FUNCTION: BOOL SetupGetIntField ( PINFCONTEXT Context, DWORD FieldIndex, PINT IntegerValue ) ;
+FUNCTION: BOOL SetupGetMultiSzFieldA ( PINFCONTEXT Context, DWORD FieldIndex, PSTR ReturnBuffer, DWORD ReturnBufferSize, LPDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetMultiSzFieldW ( PINFCONTEXT Context, DWORD FieldIndex, PWSTR ReturnBuffer, DWORD ReturnBufferSize, LPDWORD RequiredSize ) ;
+ALIAS: SetupGetMultiSzField SetupGetMultiSzFieldW
+
+FUNCTION: BOOL SetupGetBinaryField ( PINFCONTEXT Context, DWORD FieldIndex, PBYTE ReturnBuffer, DWORD ReturnBufferSize, LPDWORD RequiredSize ) ;
+FUNCTION: DWORD SetupGetFileCompressionInfoA ( PCSTR SourceFileName, PSTR* ActualSourceFileName, PDWORD SourceFileSize, PDWORD TargetFileSize, PUINT CompressionType ) ;
+FUNCTION: DWORD SetupGetFileCompressionInfoW ( PCWSTR SourceFileName, PWSTR* ActualSourceFileName, PDWORD SourceFileSize, PDWORD TargetFileSize, PUINT CompressionType ) ;
+ALIAS: SetupGetFileCompressionInfo SetupGetFileCompressionInfoW
+
+FUNCTION: BOOL SetupGetFileCompressionInfoExA ( PCSTR SourceFileName, PSTR ActualSourceFileNameBuffer, DWORD ActualSourceFileNameBufferLen, PDWORD RequiredBufferLen, PDWORD SourceFileSize, PDWORD TargetFileSize, PUINT CompressionType ) ;
+FUNCTION: BOOL SetupGetFileCompressionInfoExW ( PCWSTR SourceFileName, PWSTR ActualSourceFileNameBuffer, DWORD ActualSourceFileNameBufferLen, PDWORD RequiredBufferLen, PDWORD SourceFileSize, PDWORD TargetFileSize, PUINT CompressionType ) ;
+ALIAS: SetupGetFileCompressionInfoEx SetupGetFileCompressionInfoExW
+
+CONSTANT: FILE_COMPRESSION_NONE 0
+CONSTANT: FILE_COMPRESSION_WINLZA 1
+CONSTANT: FILE_COMPRESSION_MSZIP 2
+CONSTANT: FILE_COMPRESSION_NTCAB 3
+
+FUNCTION: DWORD SetupDecompressOrCopyFileA ( PCSTR SourceFileName, PCSTR TargetFileName, PUINT CompressionType ) ;
+FUNCTION: DWORD SetupDecompressOrCopyFileW ( PCWSTR SourceFileName, PCWSTR TargetFileName, PUINT CompressionType ) ;
+ALIAS: SetupDecompressOrCopyFile SetupDecompressOrCopyFileW
+
+FUNCTION: BOOL SetupGetSourceFileLocationA ( HINF InfHandle, PINFCONTEXT InfContext, PCSTR FileName, PUINT SourceId, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetSourceFileLocationW ( HINF InfHandle, PINFCONTEXT InfContext, PCWSTR FileName, PUINT SourceId, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupGetSourceFileLocation SetupGetSourceFileLocationW
+
+FUNCTION: BOOL SetupGetSourceFileSizeA ( HINF InfHandle, PINFCONTEXT InfContext, PCSTR FileName, PCSTR Section, PDWORD FileSize, UINT RoundingFactor ) ;
+FUNCTION: BOOL SetupGetSourceFileSizeW ( HINF InfHandle, PINFCONTEXT InfContext, PCWSTR FileName, PCWSTR Section, PDWORD FileSize, UINT RoundingFactor ) ;
+ALIAS: SetupGetSourceFileSize SetupGetSourceFileSizeW
+
+FUNCTION: BOOL SetupGetTargetPathA ( HINF InfHandle, PINFCONTEXT InfContext, PCSTR Section, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetTargetPathW ( HINF InfHandle, PINFCONTEXT InfContext, PCWSTR Section, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupGetTargetPath SetupGetTargetPathW
+
+CONSTANT: SRCLIST_TEMPORARY HEX: 00000001
+CONSTANT: SRCLIST_NOBROWSE HEX: 00000002
+CONSTANT: SRCLIST_SYSTEM HEX: 00000010
+CONSTANT: SRCLIST_USER HEX: 00000020
+CONSTANT: SRCLIST_SYSIFADMIN HEX: 00000040
+CONSTANT: SRCLIST_SUBDIRS HEX: 00000100
+CONSTANT: SRCLIST_APPEND HEX: 00000200
+CONSTANT: SRCLIST_NOSTRIPPLATFORM HEX: 00000400
+
+FUNCTION: BOOL SetupSetSourceListA ( DWORD Flags, PCSTR* SourceList, UINT SourceCount ) ;
+FUNCTION: BOOL SetupSetSourceListW ( DWORD Flags, PCWSTR* SourceList, UINT SourceCount ) ;
+ALIAS: SetupSetSourceList SetupSetSourceListW
+
+FUNCTION: BOOL SetupCancelTemporarySourceList( ) ;
+FUNCTION: BOOL SetupAddToSourceListA ( DWORD Flags, PCSTR Source ) ;
+FUNCTION: BOOL SetupAddToSourceListW ( DWORD Flags, PCWSTR Source ) ;
+ALIAS: SetupAddToSourceList SetupAddToSourceListW
+
+FUNCTION: BOOL SetupRemoveFromSourceListA ( DWORD Flags, PCSTR Source ) ;
+FUNCTION: BOOL SetupRemoveFromSourceListW ( DWORD Flags, PCWSTR Source ) ;
+ALIAS: SetupRemoveFromSourceList SetupRemoveFromSourceListW
+
+FUNCTION: BOOL SetupQuerySourceListA ( DWORD Flags, PCSTR** List, PUINT Count ) ;
+FUNCTION: BOOL SetupQuerySourceListW ( DWORD Flags, PCWSTR** List, PUINT Count ) ;
+ALIAS: SetupQuerySourceList SetupQuerySourceListW
+
+FUNCTION: BOOL SetupFreeSourceListA ( PCSTR** List, UINT Count ) ;
+FUNCTION: BOOL SetupFreeSourceListW ( PCWSTR** List, UINT Count ) ;
+ALIAS: SetupFreeSourceList SetupFreeSourceListW
+
+FUNCTION: UINT SetupPromptForDiskA ( HWND hwndParent, PCSTR DialogTitle, PCSTR DiskName, PCSTR PathToSource, PCSTR FileSought, PCSTR TagFile, DWORD DiskPromptStyle, PSTR PathBuffer, DWORD PathBufferSize, PDWORD PathRequiredSize ) ;
+FUNCTION: UINT SetupPromptForDiskW ( HWND hwndParent, PCWSTR DialogTitle, PCWSTR DiskName, PCWSTR PathToSource, PCWSTR FileSought, PCWSTR TagFile, DWORD DiskPromptStyle, PWSTR PathBuffer, DWORD PathBufferSize, PDWORD PathRequiredSize ) ;
+ALIAS: SetupPromptForDisk SetupPromptForDiskW
+
+FUNCTION: UINT SetupCopyErrorA ( HWND hwndParent, PCSTR DialogTitle, PCSTR DiskName, PCSTR PathToSource, PCSTR SourceFile, PCSTR TargetPathFile, UINT Win32ErrorCode, DWORD Style, PSTR PathBuffer, DWORD PathBufferSize, PDWORD PathRequiredSize ) ;
+FUNCTION: UINT SetupCopyErrorW ( HWND hwndParent, PCWSTR DialogTitle, PCWSTR DiskName, PCWSTR PathToSource, PCWSTR SourceFile, PCWSTR TargetPathFile, UINT Win32ErrorCode, DWORD Style, PWSTR PathBuffer, DWORD PathBufferSize, PDWORD PathRequiredSize ) ;
+ALIAS: SetupCopyError SetupCopyErrorW
+
+FUNCTION: UINT SetupRenameErrorA ( HWND hwndParent, PCSTR DialogTitle, PCSTR SourceFile, PCSTR TargetFile, UINT Win32ErrorCode, DWORD Style ) ;
+FUNCTION: UINT SetupRenameErrorW ( HWND hwndParent, PCWSTR DialogTitle, PCWSTR SourceFile, PCWSTR TargetFile, UINT Win32ErrorCode, DWORD Style ) ;
+ALIAS: SetupRenameError SetupRenameErrorW
+
+FUNCTION: UINT SetupDeleteErrorA ( HWND hwndParent, PCSTR DialogTitle, PCSTR File, UINT Win32ErrorCode, DWORD Style ) ;
+FUNCTION: UINT SetupDeleteErrorW ( HWND hwndParent, PCWSTR DialogTitle, PCWSTR File, UINT Win32ErrorCode, DWORD Style ) ;
+ALIAS: SetupDeleteError SetupDeleteErrorW
+
+FUNCTION: UINT SetupBackupErrorA ( HWND hwndParent, PCSTR DialogTitle, PCSTR SourceFile, PCSTR TargetFile, UINT Win32ErrorCode, DWORD Style ) ;
+FUNCTION: UINT SetupBackupErrorW ( HWND hwndParent, PCWSTR DialogTitle, PCWSTR SourceFile, PCWSTR TargetFile, UINT Win32ErrorCode, DWORD Style ) ;
+ALIAS: SetupBackupError SetupBackupErrorW
+
+CONSTANT: IDF_NOBROWSE HEX: 00000001
+CONSTANT: IDF_NOSKIP HEX: 00000002
+CONSTANT: IDF_NODETAILS HEX: 00000004
+CONSTANT: IDF_NOCOMPRESSED HEX: 00000008
+CONSTANT: IDF_CHECKFIRST HEX: 00000100
+CONSTANT: IDF_NOBEEP HEX: 00000200
+CONSTANT: IDF_NOFOREGROUND HEX: 00000400
+CONSTANT: IDF_WARNIFSKIP HEX: 00000800
+CONSTANT: IDF_NOREMOVABLEMEDIAPROMPT HEX: 00001000
+CONSTANT: IDF_USEDISKNAMEASPROMPT HEX: 00002000
+CONSTANT: IDF_OEMDISK HEX: 80000000
+
+CONSTANT: DPROMPT_SUCCESS 0
+CONSTANT: DPROMPT_CANCEL 1
+CONSTANT: DPROMPT_SKIPFILE 2
+CONSTANT: DPROMPT_BUFFERTOOSMALL 3
+CONSTANT: DPROMPT_OUTOFMEMORY 4
+
+FUNCTION: BOOL SetupSetDirectoryIdA ( HINF InfHandle, DWORD Id, PCSTR Directory ) ;
+FUNCTION: BOOL SetupSetDirectoryIdW ( HINF InfHandle, DWORD Id, PCWSTR Directory ) ;
+ALIAS: SetupSetDirectoryId SetupSetDirectoryIdW
+
+FUNCTION: BOOL SetupSetDirectoryIdExA ( HINF InfHandle, DWORD Id, PCSTR Directory, DWORD Flags, DWORD Reserved1, PVOID Reserved2 ) ;
+FUNCTION: BOOL SetupSetDirectoryIdExW ( HINF InfHandle, DWORD Id, PCWSTR Directory, DWORD Flags, DWORD Reserved1, PVOID Reserved2 ) ;
+ALIAS: SetupSetDirectoryIdEx SetupSetDirectoryIdExW
+
+CONSTANT: SETDIRID_NOT_FULL_PATH HEX: 00000001
+
+FUNCTION: BOOL SetupGetSourceInfoA ( HINF InfHandle, UINT SourceId, UINT InfoDesired, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupGetSourceInfoW ( HINF InfHandle, UINT SourceId, UINT InfoDesired, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupGetSourceInfo SetupGetSourceInfoW
+
+CONSTANT: SRCINFO_PATH 1
+CONSTANT: SRCINFO_TAGFILE 2
+CONSTANT: SRCINFO_DESCRIPTION 3
+CONSTANT: SRCINFO_FLAGS 4
+CONSTANT: SRCINFO_TAGFILE2 5
+CONSTANT: SRC_FLAGS_CABFILE HEX: 0010
+
+FUNCTION: BOOL SetupInstallFileA ( HINF InfHandle, PINFCONTEXT InfContext, PCSTR SourceFile, PCSTR SourcePathRoot, PCSTR DestinationName, DWORD CopyStyle, PSP_FILE_CALLBACK_A CopyMsgHandler, PVOID Context ) ;
+FUNCTION: BOOL SetupInstallFileW ( HINF InfHandle, PINFCONTEXT InfContext, PCWSTR SourceFile, PCWSTR SourcePathRoot, PCWSTR DestinationName, DWORD CopyStyle, PSP_FILE_CALLBACK_W CopyMsgHandler, PVOID Context ) ;
+ALIAS: SetupInstallFile SetupInstallFileW
+
+FUNCTION: BOOL SetupInstallFileExA ( HINF InfHandle, PINFCONTEXT InfContext, PCSTR SourceFile, PCSTR SourcePathRoot, PCSTR DestinationName, DWORD CopyStyle, PSP_FILE_CALLBACK_A CopyMsgHandler, PVOID Context, PBOOL FileWasInUse ) ;
+FUNCTION: BOOL SetupInstallFileExW ( HINF InfHandle, PINFCONTEXT InfContext, PCWSTR SourceFile, PCWSTR SourcePathRoot, PCWSTR DestinationName, DWORD CopyStyle, PSP_FILE_CALLBACK_W CopyMsgHandler, PVOID Context, PBOOL FileWasInUse ) ;
+ALIAS: SetupInstallFileEx SetupInstallFileExW
+
+CONSTANT: SP_COPY_DELETESOURCE HEX: 0000001
+CONSTANT: SP_COPY_REPLACEONLY HEX: 0000002
+CONSTANT: SP_COPY_NEWER HEX: 0000004
+CONSTANT: SP_COPY_NEWER_OR_SAME $ SP_COPY_NEWER
+CONSTANT: SP_COPY_NOOVERWRITE HEX: 0000008
+CONSTANT: SP_COPY_NODECOMP HEX: 0000010
+CONSTANT: SP_COPY_LANGUAGEAWARE HEX: 0000020
+CONSTANT: SP_COPY_SOURCE_ABSOLUTE HEX: 0000040
+CONSTANT: SP_COPY_SOURCEPATH_ABSOLUTE HEX: 0000080
+CONSTANT: SP_COPY_IN_USE_NEEDS_REBOOT HEX: 0000100
+CONSTANT: SP_COPY_FORCE_IN_USE HEX: 0000200
+CONSTANT: SP_COPY_NOSKIP HEX: 0000400
+CONSTANT: SP_FLAG_CABINETCONTINUATION HEX: 0000800
+CONSTANT: SP_COPY_FORCE_NOOVERWRITE HEX: 0001000
+CONSTANT: SP_COPY_FORCE_NEWER HEX: 0002000
+CONSTANT: SP_COPY_WARNIFSKIP HEX: 0004000
+CONSTANT: SP_COPY_NOBROWSE HEX: 0008000
+CONSTANT: SP_COPY_NEWER_ONLY HEX: 0010000
+CONSTANT: SP_COPY_RESERVED HEX: 0020000
+CONSTANT: SP_COPY_OEMINF_CATALOG_ONLY HEX: 0040000
+CONSTANT: SP_COPY_REPLACE_BOOT_FILE HEX: 0080000
+CONSTANT: SP_COPY_NOPRUNE HEX: 0100000
+CONSTANT: SP_COPY_OEM_F6_INF HEX: 0200000
+CONSTANT: SP_COPY_ALREADYDECOMP HEX: 0400000
+CONSTANT: SP_COPY_WINDOWS_SIGNED HEX: 1000000
+CONSTANT: SP_COPY_PNPLOCKED HEX: 2000000
+CONSTANT: SP_COPY_IN_USE_TRY_RENAME HEX: 4000000
+CONSTANT: SP_COPY_INBOX_INF HEX: 8000000
+CONSTANT: SP_COPY_HARDLINK HEX: 10000000
+
+CONSTANT: SP_BACKUP_BACKUPPASS HEX: 00000001
+CONSTANT: SP_BACKUP_DEMANDPASS HEX: 00000002
+CONSTANT: SP_BACKUP_SPECIAL HEX: 00000004
+CONSTANT: SP_BACKUP_BOOTFILE HEX: 00000008
+
+FUNCTION: HSPFILEQ SetupOpenFileQueue ( ) ;
+FUNCTION: BOOL SetupCloseFileQueue ( HSPFILEQ QueueHandle ) ;
+FUNCTION: BOOL SetupSetFileQueueAlternatePlatformA ( HSPFILEQ QueueHandle, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PCSTR AlternateDefaultCatalogFile ) ;
+FUNCTION: BOOL SetupSetFileQueueAlternatePlatformW ( HSPFILEQ QueueHandle, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PCWSTR AlternateDefaultCatalogFile ) ;
+ALIAS: SetupSetFileQueueAlternatePlatform SetupSetFileQueueAlternatePlatformW
+
+FUNCTION: BOOL SetupSetPlatformPathOverrideA ( PCSTR Override ) ;
+FUNCTION: BOOL SetupSetPlatformPathOverrideW ( PCWSTR Override ) ;
+ALIAS: SetupSetPlatformPathOverride SetupSetPlatformPathOverrideW
+
+FUNCTION: BOOL SetupQueueCopyA ( HSPFILEQ QueueHandle, PCSTR SourceRootPath, PCSTR SourcePath, PCSTR SourceFilename, PCSTR SourceDescription, PCSTR SourceTagfile, PCSTR TargetDirectory, PCSTR TargetFilename, DWORD CopyStyle ) ;
+FUNCTION: BOOL SetupQueueCopyW ( HSPFILEQ QueueHandle, PCWSTR SourceRootPath, PCWSTR SourcePath, PCWSTR SourceFilename, PCWSTR SourceDescription, PCWSTR SourceTagfile, PCWSTR TargetDirectory, PCWSTR TargetFilename, DWORD CopyStyle ) ;
+ALIAS: SetupQueueCopy SetupQueueCopyW
+
+FUNCTION: BOOL SetupQueueCopyIndirectA ( PSP_FILE_COPY_PARAMS_A CopyParams ) ;
+FUNCTION: BOOL SetupQueueCopyIndirectW ( PSP_FILE_COPY_PARAMS_W CopyParams ) ;
+ALIAS: SetupQueueCopyIndirect SetupQueueCopyIndirectW
+
+FUNCTION: BOOL SetupQueueDefaultCopyA ( HSPFILEQ QueueHandle, HINF InfHandle, PCSTR SourceRootPath, PCSTR SourceFilename, PCSTR TargetFilename, DWORD CopyStyle ) ;
+FUNCTION: BOOL SetupQueueDefaultCopyW ( HSPFILEQ QueueHandle, HINF InfHandle, PCWSTR SourceRootPath, PCWSTR SourceFilename, PCWSTR TargetFilename, DWORD CopyStyle ) ;
+ALIAS: SetupQueueDefaultCopy SetupQueueDefaultCopyW
+
+FUNCTION: BOOL SetupQueueCopySectionA ( HSPFILEQ QueueHandle, PCSTR SourceRootPath, HINF InfHandle, HINF ListInfHandle, PCSTR Section, DWORD CopyStyle ) ;
+FUNCTION: BOOL SetupQueueCopySectionW ( HSPFILEQ QueueHandle, PCWSTR SourceRootPath, HINF InfHandle, HINF ListInfHandle, PCWSTR Section, DWORD CopyStyle ) ;
+ALIAS: SetupQueueCopySection SetupQueueCopySectionW
+
+FUNCTION: BOOL SetupQueueDeleteA ( HSPFILEQ QueueHandle, PCSTR PathPart1, PCSTR PathPart2 ) ;
+FUNCTION: BOOL SetupQueueDeleteW ( HSPFILEQ QueueHandle, PCWSTR PathPart1, PCWSTR PathPart2 ) ;
+ALIAS: SetupQueueDelete SetupQueueDeleteW
+
+FUNCTION: BOOL SetupQueueDeleteSectionA ( HSPFILEQ QueueHandle, HINF InfHandle, HINF ListInfHandle, PCSTR Section ) ;
+FUNCTION: BOOL SetupQueueDeleteSectionW ( HSPFILEQ QueueHandle, HINF InfHandle, HINF ListInfHandle, PCWSTR Section ) ;
+ALIAS: SetupQueueDeleteSection SetupQueueDeleteSectionW
+
+FUNCTION: BOOL SetupQueueRenameA ( HSPFILEQ QueueHandle, PCSTR SourcePath, PCSTR SourceFilename, PCSTR TargetPath, PCSTR TargetFilename ) ;
+FUNCTION: BOOL SetupQueueRenameW ( HSPFILEQ QueueHandle, PCWSTR SourcePath, PCWSTR SourceFilename, PCWSTR TargetPath, PCWSTR TargetFilename ) ;
+ALIAS: SetupQueueRename SetupQueueRenameW
+
+FUNCTION: BOOL SetupQueueRenameSectionA ( HSPFILEQ QueueHandle, HINF InfHandle, HINF ListInfHandle, PCSTR Section ) ;
+FUNCTION: BOOL SetupQueueRenameSectionW ( HSPFILEQ QueueHandle, HINF InfHandle, HINF ListInfHandle, PCWSTR Section ) ;
+ALIAS: SetupQueueRenameSection SetupQueueRenameSectionW
+
+FUNCTION: BOOL SetupCommitFileQueueA ( HWND Owner, HSPFILEQ QueueHandle, PSP_FILE_CALLBACK_A MsgHandler, PVOID Context ) ;
+FUNCTION: BOOL SetupCommitFileQueueW ( HWND Owner, HSPFILEQ QueueHandle, PSP_FILE_CALLBACK_W MsgHandler, PVOID Context ) ;
+ALIAS: SetupCommitFileQueue SetupCommitFileQueueW
+
+FUNCTION: BOOL SetupScanFileQueueA ( HSPFILEQ FileQueue, DWORD Flags, HWND Window, PSP_FILE_CALLBACK_A CallbackRoutine, PVOID CallbackContext, PDWORD Result ) ;
+FUNCTION: BOOL SetupScanFileQueueW ( HSPFILEQ FileQueue, DWORD Flags, HWND Window, PSP_FILE_CALLBACK_W CallbackRoutine, PVOID CallbackContext, PDWORD Result ) ;
+ALIAS: SetupScanFileQueue SetupScanFileQueueW
+
+CONSTANT: SPQ_SCAN_FILE_PRESENCE HEX: 00000001
+CONSTANT: SPQ_SCAN_FILE_VALIDITY HEX: 00000002
+CONSTANT: SPQ_SCAN_USE_CALLBACK HEX: 00000004
+CONSTANT: SPQ_SCAN_USE_CALLBACKEX HEX: 00000008
+CONSTANT: SPQ_SCAN_INFORM_USER HEX: 00000010
+CONSTANT: SPQ_SCAN_PRUNE_COPY_QUEUE HEX: 00000020
+CONSTANT: SPQ_SCAN_USE_CALLBACK_SIGNERINFO HEX: 00000040
+CONSTANT: SPQ_SCAN_PRUNE_DELREN HEX: 00000080
+CONSTANT: SPQ_SCAN_FILE_PRESENCE_WITHOUT_SOURCE HEX: 00000100
+CONSTANT: SPQ_SCAN_FILE_COMPARISON HEX: 00000200
+CONSTANT: SPQ_SCAN_ACTIVATE_DRP HEX: 00000400
+CONSTANT: SPQ_DELAYED_COPY HEX: 00000001
+
+FUNCTION: BOOL SetupGetFileQueueCount ( HSPFILEQ FileQueue, UINT SubQueueFileOp, PUINT NumOperations ) ;
+FUNCTION: BOOL SetupGetFileQueueFlags ( HSPFILEQ FileQueue, PDWORD Flags ) ;
+FUNCTION: BOOL SetupSetFileQueueFlags ( HSPFILEQ FileQueue, DWORD FlagMask, DWORD Flags ) ;
+
+CONSTANT: SPQ_FLAG_BACKUP_AWARE HEX: 00000001
+CONSTANT: SPQ_FLAG_ABORT_IF_UNSIGNED HEX: 00000002
+CONSTANT: SPQ_FLAG_FILES_MODIFIED HEX: 00000004
+CONSTANT: SPQ_FLAG_DO_SHUFFLEMOVE HEX: 00000008
+CONSTANT: SPQ_FLAG_VALID HEX: 0000000F
+
+CONSTANT: SPOST_NONE 0
+CONSTANT: SPOST_PATH 1
+CONSTANT: SPOST_URL 2
+CONSTANT: SPOST_MAX 3
+
+FUNCTION: BOOL SetupCopyOEMInfA ( PCSTR SourceInfFileName, PCSTR OEMSourceMediaLocation, DWORD OEMSourceMediaType, DWORD CopyStyle, PSTR DestinationInfFileName, DWORD DestinationInfFileNameSize, PDWORD RequiredSize, PSTR* DestinationInfFileNameComponent ) ;
+FUNCTION: BOOL SetupCopyOEMInfW ( PCWSTR SourceInfFileName, PCWSTR OEMSourceMediaLocation, DWORD OEMSourceMediaType, DWORD CopyStyle, PWSTR DestinationInfFileName, DWORD DestinationInfFileNameSize, PDWORD RequiredSize, PWSTR* DestinationInfFileNameComponent ) ;
+ALIAS: SetupCopyOEMInf SetupCopyOEMInfW
+
+CONSTANT: SUOI_FORCEDELETE HEX: 00000001
+CONSTANT: SUOI_INTERNAL1 HEX: 00000002
+
+FUNCTION: BOOL SetupUninstallOEMInfA ( PCSTR InfFileName, DWORD Flags, PVOID Reserved ) ;
+FUNCTION: BOOL SetupUninstallOEMInfW ( PCWSTR InfFileName, DWORD Flags, PVOID Reserved ) ;
+ALIAS: SetupUninstallOEMInf SetupUninstallOEMInfW
+
+FUNCTION: BOOL SetupUninstallNewlyCopiedInfs( HSPFILEQ FileQueue, DWORD Flags, PVOID Reserved ) ;
+
+FUNCTION: HDSKSPC SetupCreateDiskSpaceListA ( PVOID Reserved1, DWORD Reserved2, UINT Flags ) ;
+FUNCTION: HDSKSPC SetupCreateDiskSpaceListW ( PVOID Reserved1, DWORD Reserved2, UINT Flags ) ;
+ALIAS: SetupCreateDiskSpaceList SetupCreateDiskSpaceListW
+
+CONSTANT: SPDSL_IGNORE_DISK HEX: 00000001
+CONSTANT: SPDSL_DISALLOW_NEGATIVE_ADJUST HEX: 00000002
+
+FUNCTION: HDSKSPC SetupDuplicateDiskSpaceListA ( HDSKSPC DiskSpace, PVOID Reserved1, DWORD Reserved2, UINT Flags ) ;
+FUNCTION: HDSKSPC SetupDuplicateDiskSpaceListW ( HDSKSPC DiskSpace, PVOID Reserved1, DWORD Reserved2, UINT Flags ) ;
+ALIAS: SetupDuplicateDiskSpaceList SetupDuplicateDiskSpaceListW
+
+FUNCTION: BOOL SetupDestroyDiskSpaceList( HDSKSPC DiskSpace ) ;
+FUNCTION: BOOL SetupQueryDrivesInDiskSpaceListA ( HDSKSPC DiskSpace, PSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupQueryDrivesInDiskSpaceListW ( HDSKSPC DiskSpace, PWSTR ReturnBuffer, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupQueryDrivesInDiskSpaceList SetupQueryDrivesInDiskSpaceListW
+
+FUNCTION: BOOL SetupQuerySpaceRequiredOnDriveA ( HDSKSPC DiskSpace, PCSTR DriveSpec, LONGLONG* SpaceRequired, PVOID Reserved1, UINT Reserved2 ) ;
+FUNCTION: BOOL SetupQuerySpaceRequiredOnDriveW ( HDSKSPC DiskSpace, PCWSTR DriveSpec, LONGLONG* SpaceRequired, PVOID Reserved1, UINT Reserved2 ) ;
+ALIAS: SetupQuerySpaceRequiredOnDrive SetupQuerySpaceRequiredOnDriveW
+
+FUNCTION: BOOL SetupAdjustDiskSpaceListA ( HDSKSPC DiskSpace, LPCSTR DriveRoot, LONGLONG Amount, PVOID Reserved1, UINT Reserved2 ) ;
+FUNCTION: BOOL SetupAdjustDiskSpaceListW ( HDSKSPC DiskSpace, LPCWSTR DriveRoot, LONGLONG Amount, PVOID Reserved1, UINT Reserved2 ) ;
+ALIAS: SetupAdjustDiskSpaceList SetupAdjustDiskSpaceListW
+
+FUNCTION: BOOL SetupAddToDiskSpaceListA ( HDSKSPC DiskSpace, PCSTR TargetFilespec, LONGLONG FileSize, UINT Operation, PVOID Reserved1, UINT Reserved2 ) ;
+FUNCTION: BOOL SetupAddToDiskSpaceListW ( HDSKSPC DiskSpace, PCWSTR TargetFilespec, LONGLONG FileSize, UINT Operation, PVOID Reserved1, UINT Reserved2 ) ;
+ALIAS: SetupAddToDiskSpaceList SetupAddToDiskSpaceListW
+
+FUNCTION: BOOL SetupAddSectionToDiskSpaceListA ( HDSKSPC DiskSpace, HINF InfHandle, HINF ListInfHandle, PCSTR SectionName, UINT Operation, PVOID Reserved1, UINT Reserved2 ) ;
+FUNCTION: BOOL SetupAddSectionToDiskSpaceListW ( HDSKSPC DiskSpace, HINF InfHandle, HINF ListInfHandle, PCWSTR SectionName, UINT Operation, PVOID Reserved1, UINT Reserved2 ) ;
+ALIAS: SetupAddSectionToDiskSpaceList SetupAddSectionToDiskSpaceListW
+
+FUNCTION: BOOL SetupAddInstallSectionToDiskSpaceListA ( HDSKSPC DiskSpace, HINF InfHandle, HINF LayoutInfHandle, PCSTR SectionName, PVOID Reserved1, UINT Reserved2 ) ;
+FUNCTION: BOOL SetupAddInstallSectionToDiskSpaceListW ( HDSKSPC DiskSpace, HINF InfHandle, HINF LayoutInfHandle, PCWSTR SectionName, PVOID Reserved1, UINT Reserved2 ) ;
+ALIAS: SetupAddInstallSectionToDiskSpaceList SetupAddInstallSectionToDiskSpaceListW
+
+FUNCTION: BOOL SetupRemoveFromDiskSpaceListA ( HDSKSPC DiskSpace, PCSTR TargetFilespec, UINT Operation, PVOID Reserved1, UINT Reserved2 ) ;
+FUNCTION: BOOL SetupRemoveFromDiskSpaceListW ( HDSKSPC DiskSpace, PCWSTR TargetFilespec, UINT Operation, PVOID Reserved1, UINT Reserved2 ) ;
+ALIAS: SetupRemoveFromDiskSpaceList SetupRemoveFromDiskSpaceListW
+
+FUNCTION: BOOL SetupRemoveSectionFromDiskSpaceListA ( HDSKSPC DiskSpace, HINF InfHandle, HINF ListInfHandle, PCSTR SectionName, UINT Operation, PVOID Reserved1, UINT Reserved2 ) ;
+FUNCTION: BOOL SetupRemoveSectionFromDiskSpaceListW ( HDSKSPC DiskSpace, HINF InfHandle, HINF ListInfHandle, PCWSTR SectionName, UINT Operation, PVOID Reserved1, UINT Reserved2 ) ;
+ALIAS: SetupRemoveSectionFromDiskSpaceList SetupRemoveSectionFromDiskSpaceListW
+
+FUNCTION: BOOL SetupRemoveInstallSectionFromDiskSpaceListA ( HDSKSPC DiskSpace, HINF InfHandle, HINF LayoutInfHandle, PCSTR SectionName, PVOID Reserved1, UINT Reserved2 ) ;
+FUNCTION: BOOL SetupRemoveInstallSectionFromDiskSpaceListW ( HDSKSPC DiskSpace, HINF InfHandle, HINF LayoutInfHandle, PCWSTR SectionName, PVOID Reserved1, UINT Reserved2 ) ;
+ALIAS: SetupRemoveInstallSectionFromDiskSpaceList SetupRemoveInstallSectionFromDiskSpaceListW
+
+FUNCTION: BOOL SetupIterateCabinetA ( PCSTR CabinetFile, DWORD Reserved, PSP_FILE_CALLBACK_A MsgHandler, PVOID Context ) ;
+FUNCTION: BOOL SetupIterateCabinetW ( PCWSTR CabinetFile, DWORD Reserved, PSP_FILE_CALLBACK_W MsgHandler, PVOID Context ) ;
+ALIAS: SetupIterateCabinet SetupIterateCabinetW
+
+FUNCTION: INT SetupPromptReboot ( HSPFILEQ FileQueue, HWND Owner, BOOL ScanOnly ) ;
+
+CONSTANT: SPFILEQ_FILE_IN_USE HEX: 00000001
+CONSTANT: SPFILEQ_REBOOT_RECOMMENDED HEX: 00000002
+CONSTANT: SPFILEQ_REBOOT_IN_PROGRESS HEX: 00000004
+
+FUNCTION: PVOID SetupInitDefaultQueueCallback ( HWND OwnerWindow ) ;
+FUNCTION: PVOID SetupInitDefaultQueueCallbackEx ( HWND OwnerWindow, HWND AlternateProgressWindow, UINT ProgressMessage, DWORD Reserved1, PVOID Reserved2 ) ;
+FUNCTION: void SetupTermDefaultQueueCallback ( PVOID Context ) ;
+
+FUNCTION: UINT SetupDefaultQueueCallbackA ( PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2 ) ;
+FUNCTION: UINT SetupDefaultQueueCallbackW ( PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2 ) ;
+ALIAS: SetupDefaultQueueCallback SetupDefaultQueueCallbackW
+
+CONSTANT: FLG_ADDREG_DELREG_BIT HEX: 00008000
+CONSTANT: FLG_ADDREG_BINVALUETYPE HEX: 00000001
+CONSTANT: FLG_ADDREG_NOCLOBBER HEX: 00000002
+CONSTANT: FLG_ADDREG_DELVAL HEX: 00000004
+CONSTANT: FLG_ADDREG_APPEND HEX: 00000008
+CONSTANT: FLG_ADDREG_KEYONLY HEX: 00000010
+CONSTANT: FLG_ADDREG_OVERWRITEONLY HEX: 00000020
+CONSTANT: FLG_ADDREG_64BITKEY HEX: 00001000
+CONSTANT: FLG_ADDREG_KEYONLY_COMMON HEX: 00002000
+CONSTANT: FLG_ADDREG_32BITKEY HEX: 00004000
+CONSTANT: FLG_ADDREG_TYPE_MASK HEX: FFFF0001
+CONSTANT: FLG_ADDREG_TYPE_SZ HEX: 00000000
+CONSTANT: FLG_ADDREG_TYPE_MULTI_SZ HEX: 00010000
+CONSTANT: FLG_ADDREG_TYPE_EXPAND_SZ HEX: 00020000
+CONSTANT: FLG_ADDREG_TYPE_BINARY HEX: 00000001
+CONSTANT: FLG_ADDREG_TYPE_DWORD HEX: 00010001
+CONSTANT: FLG_ADDREG_TYPE_NONE HEX: 00020001
+CONSTANT: FLG_DELREG_VALUE HEX: 00000000
+CONSTANT: FLG_DELREG_TYPE_MASK $ FLG_ADDREG_TYPE_MASK
+CONSTANT: FLG_DELREG_TYPE_SZ $ FLG_ADDREG_TYPE_SZ
+CONSTANT: FLG_DELREG_TYPE_MULTI_SZ $ FLG_ADDREG_TYPE_MULTI_SZ
+CONSTANT: FLG_DELREG_TYPE_EXPAND_SZ $ FLG_ADDREG_TYPE_EXPAND_SZ
+CONSTANT: FLG_DELREG_TYPE_BINARY $ FLG_ADDREG_TYPE_BINARY
+CONSTANT: FLG_DELREG_TYPE_DWORD $ FLG_ADDREG_TYPE_DWORD
+CONSTANT: FLG_DELREG_TYPE_NONE $ FLG_ADDREG_TYPE_NONE
+CONSTANT: FLG_DELREG_64BITKEY $ FLG_ADDREG_64BITKEY
+CONSTANT: FLG_DELREG_KEYONLY_COMMON $ FLG_ADDREG_KEYONLY_COMMON
+CONSTANT: FLG_DELREG_32BITKEY $ FLG_ADDREG_32BITKEY
+CONSTANT: FLG_DELREG_OPERATION_MASK HEX: 000000FE
+CONSTANT: FLG_DELREG_MULTI_SZ_DELSTRING HEX: 00018002
+CONSTANT: FLG_BITREG_CLEARBITS HEX: 00000000
+CONSTANT: FLG_BITREG_SETBITS HEX: 00000001
+CONSTANT: FLG_BITREG_64BITKEY HEX: 00001000
+CONSTANT: FLG_BITREG_32BITKEY HEX: 00004000
+CONSTANT: FLG_INI2REG_64BITKEY HEX: 00001000
+CONSTANT: FLG_INI2REG_32BITKEY HEX: 00004000
+CONSTANT: FLG_REGSVR_DLLREGISTER HEX: 00000001
+CONSTANT: FLG_REGSVR_DLLINSTALL HEX: 00000002
+CONSTANT: FLG_PROFITEM_CURRENTUSER HEX: 00000001
+CONSTANT: FLG_PROFITEM_DELETE HEX: 00000002
+CONSTANT: FLG_PROFITEM_GROUP HEX: 00000004
+CONSTANT: FLG_PROFITEM_CSIDL HEX: 00000008
+CONSTANT: FLG_ADDPROPERTY_NOCLOBBER HEX: 00000001
+CONSTANT: FLG_ADDPROPERTY_OVERWRITEONLY HEX: 00000002
+CONSTANT: FLG_ADDPROPERTY_APPEND HEX: 00000004
+CONSTANT: FLG_ADDPROPERTY_OR HEX: 00000008
+CONSTANT: FLG_ADDPROPERTY_AND HEX: 00000010
+CONSTANT: FLG_DELPROPERTY_MULTI_SZ_DELSTRING HEX: 00000001
+
+FUNCTION: BOOL SetupInstallFromInfSectionA ( HWND Owner, HINF InfHandle, PCSTR SectionName, UINT Flags, HKEY RelativeKeyRoot, PCSTR SourceRootPath, UINT CopyFlags, PSP_FILE_CALLBACK_A MsgHandler, PVOID Context, HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupInstallFromInfSectionW ( HWND Owner, HINF InfHandle, PCWSTR SectionName, UINT Flags, HKEY RelativeKeyRoot, PCWSTR SourceRootPath, UINT CopyFlags, PSP_FILE_CALLBACK_W MsgHandler, PVOID Context, HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+ALIAS: SetupInstallFromInfSection SetupInstallFromInfSectionW
+
+CONSTANT: SPINST_LOGCONFIG HEX: 00000001
+CONSTANT: SPINST_INIFILES HEX: 00000002
+CONSTANT: SPINST_REGISTRY HEX: 00000004
+CONSTANT: SPINST_INI2REG HEX: 00000008
+CONSTANT: SPINST_FILES HEX: 00000010
+CONSTANT: SPINST_BITREG HEX: 00000020
+CONSTANT: SPINST_REGSVR HEX: 00000040
+CONSTANT: SPINST_UNREGSVR HEX: 00000080
+CONSTANT: SPINST_PROFILEITEMS HEX: 00000100
+CONSTANT: SPINST_COPYINF HEX: 00000200
+CONSTANT: SPINST_PROPERTIES HEX: 00000400
+CONSTANT: SPINST_ALL HEX: 000007ff
+CONSTANT: SPINST_SINGLESECTION HEX: 00010000
+CONSTANT: SPINST_LOGCONFIG_IS_FORCED HEX: 00020000
+CONSTANT: SPINST_LOGCONFIGS_ARE_OVERRIDES HEX: 00040000
+CONSTANT: SPINST_REGISTERCALLBACKAWARE HEX: 00080000
+CONSTANT: SPINST_DEVICEINSTALL HEX: 00100000
+
+FUNCTION: BOOL SetupInstallFilesFromInfSectionA ( HINF InfHandle, HINF LayoutInfHandle, HSPFILEQ FileQueue, PCSTR SectionName, PCSTR SourceRootPath, UINT CopyFlags ) ;
+FUNCTION: BOOL SetupInstallFilesFromInfSectionW ( HINF InfHandle, HINF LayoutInfHandle, HSPFILEQ FileQueue, PCWSTR SectionName, PCWSTR SourceRootPath, UINT CopyFlags ) ;
+ALIAS: SetupInstallFilesFromInfSection SetupInstallFilesFromInfSectionW
+
+CONSTANT: SPSVCINST_TAGTOFRONT HEX: 00000001
+CONSTANT: SPSVCINST_ASSOCSERVICE HEX: 00000002
+CONSTANT: SPSVCINST_DELETEEVENTLOGENTRY HEX: 00000004
+CONSTANT: SPSVCINST_NOCLOBBER_DISPLAYNAME HEX: 00000008
+CONSTANT: SPSVCINST_NOCLOBBER_STARTTYPE HEX: 00000010
+CONSTANT: SPSVCINST_NOCLOBBER_ERRORCONTROL HEX: 00000020
+CONSTANT: SPSVCINST_NOCLOBBER_LOADORDERGROUP HEX: 00000040
+CONSTANT: SPSVCINST_NOCLOBBER_DEPENDENCIES HEX: 00000080
+CONSTANT: SPSVCINST_NOCLOBBER_DESCRIPTION HEX: 00000100
+CONSTANT: SPSVCINST_STOPSERVICE HEX: 00000200
+CONSTANT: SPSVCINST_CLOBBER_SECURITY HEX: 00000400
+CONSTANT: SPSVCINST_STARTSERVICE HEX: 00000800
+CONSTANT: SPSVCINST_NOCLOBBER_REQUIREDPRIVILEGES HEX: 00001000
+
+FUNCTION: BOOL SetupInstallServicesFromInfSectionA ( HINF InfHandle, PCSTR SectionName, DWORD Flags ) ;
+FUNCTION: BOOL SetupInstallServicesFromInfSectionW ( HINF InfHandle, PCWSTR SectionName, DWORD Flags ) ;
+ALIAS: SetupInstallServicesFromInfSection SetupInstallServicesFromInfSectionW
+
+FUNCTION: BOOL SetupInstallServicesFromInfSectionExA ( HINF InfHandle, PCSTR SectionName, DWORD Flags, HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PVOID Reserved1, PVOID Reserved2 ) ;
+FUNCTION: BOOL SetupInstallServicesFromInfSectionExW ( HINF InfHandle, PCWSTR SectionName, DWORD Flags, HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PVOID Reserved1, PVOID Reserved2 ) ;
+ALIAS: SetupInstallServicesFromInfSectionEx SetupInstallServicesFromInfSectionExW
+
+FUNCTION: void InstallHinfSectionA ( HWND Window, HINSTANCE ModuleHandle, PCSTR CommandLine, INT ShowCommand ) ;
+FUNCTION: void InstallHinfSectionW ( HWND Window, HINSTANCE ModuleHandle, PCWSTR CommandLine, INT ShowCommand ) ;
+ALIAS: InstallHinfSection InstallHinfSectionW
+
+TYPEDEF: PVOID HSPFILELOG
+
+FUNCTION: HSPFILELOG SetupInitializeFileLogA ( PCSTR LogFileName, DWORD Flags ) ;
+FUNCTION: HSPFILELOG SetupInitializeFileLogW ( PCWSTR LogFileName, DWORD Flags ) ;
+ALIAS: SetupInitializeFileLog SetupInitializeFileLogW
+
+CONSTANT: SPFILELOG_SYSTEMLOG HEX: 00000001
+CONSTANT: SPFILELOG_FORCENEW HEX: 00000002
+CONSTANT: SPFILELOG_QUERYONLY HEX: 00000004
+
+FUNCTION: BOOL SetupTerminateFileLog ( HSPFILELOG FileLogHandle ) ;
+FUNCTION: BOOL SetupLogFileA ( HSPFILELOG FileLogHandle, PCSTR LogSectionName, PCSTR SourceFilename, PCSTR TargetFilename, DWORD Checksum, PCSTR DiskTagfile, PCSTR DiskDescription, PCSTR OtherInfo, DWORD Flags ) ;
+FUNCTION: BOOL SetupLogFileW ( HSPFILELOG FileLogHandle, PCWSTR LogSectionName, PCWSTR SourceFilename, PCWSTR TargetFilename, DWORD Checksum, PCWSTR DiskTagfile, PCWSTR DiskDescription, PCWSTR OtherInfo, DWORD Flags ) ;
+ALIAS: SetupLogFile SetupLogFileW
+
+CONSTANT: SPFILELOG_OEMFILE HEX: 00000001
+FUNCTION: BOOL SetupRemoveFileLogEntryA ( HSPFILELOG FileLogHandle, PCSTR LogSectionName, PCSTR TargetFilename ) ;
+FUNCTION: BOOL SetupRemoveFileLogEntryW ( HSPFILELOG FileLogHandle, PCWSTR LogSectionName, PCWSTR TargetFilename ) ;
+ALIAS: SetupRemoveFileLogEntry SetupRemoveFileLogEntryW
+
+C-ENUM:
+ SetupFileLogSourceFilename
+ SetupFileLogChecksum
+ SetupFileLogDiskTagfile
+ SetupFileLogDiskDescription
+ SetupFileLogOtherInfo
+ SetupFileLogMax ;
+TYPEDEF: int SetupFileLogInfo
+
+FUNCTION: BOOL SetupQueryFileLogA ( HSPFILELOG FileLogHandle, PCSTR LogSectionName, PCSTR TargetFilename, SetupFileLogInfo DesiredInfo, PSTR DataOut, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupQueryFileLogW ( HSPFILELOG FileLogHandle, PCWSTR LogSectionName, PCWSTR TargetFilename, SetupFileLogInfo DesiredInfo, PWSTR DataOut, DWORD ReturnBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupQueryFileLog SetupQueryFileLogW
+
+TYPEDEF: DWORD LogSeverity
+CONSTANT: LogSevInformation HEX: 00000000
+CONSTANT: LogSevWarning HEX: 00000001
+CONSTANT: LogSevError HEX: 00000002
+CONSTANT: LogSevFatalError HEX: 00000003
+CONSTANT: LogSevMaximum HEX: 00000004
+
+FUNCTION: BOOL SetupOpenLog ( BOOL Erase ) ;
+FUNCTION: BOOL SetupLogErrorA ( LPCSTR MessageString, LogSeverity Severity ) ;
+FUNCTION: BOOL SetupLogErrorW ( LPCWSTR MessageString, LogSeverity Severity ) ;
+ALIAS: SetupLogError SetupLogErrorW
+
+FUNCTION: void SetupCloseLog ( ) ;
+FUNCTION: SP_LOG_TOKEN SetupGetThreadLogToken ( ) ;
+FUNCTION: void SetupSetThreadLogToken ( SP_LOG_TOKEN LogToken ) ;
+! Unavailable until FFI to vargargs is supported.
+! FUNCTION: void SetupWriteTextLog ( SP_LOG_TOKEN LogToken, DWORD Category, DWORD Flags, PCSTR MessageStr, ... ) ;
+! FUNCTION: void SetupWriteTextLogError ( SP_LOG_TOKEN LogToken, DWORD Category, DWORD LogFlags, DWORD Error, PCSTR MessageStr, ... ) ;
+FUNCTION: void SetupWriteTextLogInfLine ( SP_LOG_TOKEN LogToken, DWORD Flags, HINF InfHandle, PINFCONTEXT Context ) ;
+
+FUNCTION: BOOL SetupGetBackupInformationA ( HSPFILEQ QueueHandle, PSP_BACKUP_QUEUE_PARAMS_A BackupParams ) ;
+FUNCTION: BOOL SetupGetBackupInformationW ( HSPFILEQ QueueHandle, PSP_BACKUP_QUEUE_PARAMS_W BackupParams ) ;
+ALIAS: SetupGetBackupInformation SetupGetBackupInformationW
+
+FUNCTION: BOOL SetupPrepareQueueForRestoreA ( HSPFILEQ QueueHandle, PCSTR BackupPath, DWORD RestoreFlags ) ;
+FUNCTION: BOOL SetupPrepareQueueForRestoreW ( HSPFILEQ QueueHandle, PCWSTR BackupPath, DWORD RestoreFlags ) ;
+ALIAS: SetupPrepareQueueForRestore SetupPrepareQueueForRestoreW
+
+FUNCTION: BOOL SetupSetNonInteractiveMode ( BOOL NonInteractiveFlag ) ;
+FUNCTION: BOOL SetupGetNonInteractiveMode ( ) ;
+
+FUNCTION: HDEVINFO SetupDiCreateDeviceInfoList ( GUID* ClassGuid, HWND hwndParent ) ;
+FUNCTION: HDEVINFO SetupDiCreateDeviceInfoListExA ( GUID* ClassGuid, HWND hwndParent, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: HDEVINFO SetupDiCreateDeviceInfoListExW ( GUID* ClassGuid, HWND hwndParent, PCWSTR MachineName, PVOID Reserved ) ;
+
+ALIAS: SetupDiCreateDeviceInfoListEx SetupDiCreateDeviceInfoListExW
+
+FUNCTION: BOOL SetupDiGetDeviceInfoListClass( HDEVINFO DeviceInfoSet, LPGUID ClassGuid ) ;
+FUNCTION: BOOL SetupDiGetDeviceInfoListDetailA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_LIST_DETAIL_DATA_A DeviceInfoSetDetailData ) ;
+FUNCTION: BOOL SetupDiGetDeviceInfoListDetailW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_LIST_DETAIL_DATA_W DeviceInfoSetDetailData ) ;
+ALIAS: SetupDiGetDeviceInfoListDetail SetupDiGetDeviceInfoListDetailW
+
+CONSTANT: DICD_GENERATE_ID HEX: 00000001
+CONSTANT: DICD_INHERIT_CLASSDRVS HEX: 00000002
+
+FUNCTION: BOOL SetupDiCreateDeviceInfoA ( HDEVINFO DeviceInfoSet, PCSTR DeviceName, GUID* ClassGuid, PCSTR DeviceDescription, HWND hwndParent, DWORD CreationFlags, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiCreateDeviceInfoW ( HDEVINFO DeviceInfoSet, PCWSTR DeviceName, GUID* ClassGuid, PCWSTR DeviceDescription, HWND hwndParent, DWORD CreationFlags, PSP_DEVINFO_DATA DeviceInfoData ) ;
+ALIAS: SetupDiCreateDeviceInfo SetupDiCreateDeviceInfoW
+
+CONSTANT: DIOD_INHERIT_CLASSDRVS HEX: 00000002
+CONSTANT: DIOD_CANCEL_REMOVE HEX: 00000004
+
+FUNCTION: BOOL SetupDiOpenDeviceInfoA ( HDEVINFO DeviceInfoSet, PCSTR DeviceInstanceId, HWND hwndParent, DWORD OpenFlags, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiOpenDeviceInfoW ( HDEVINFO DeviceInfoSet, PCWSTR DeviceInstanceId, HWND hwndParent, DWORD OpenFlags, PSP_DEVINFO_DATA DeviceInfoData ) ;
+ALIAS: SetupDiOpenDeviceInfo SetupDiOpenDeviceInfoW
+
+FUNCTION: BOOL SetupDiGetDeviceInstanceIdA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSTR DeviceInstanceId, DWORD DeviceInstanceIdSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiGetDeviceInstanceIdW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PWSTR DeviceInstanceId, DWORD DeviceInstanceIdSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiGetDeviceInstanceId SetupDiGetDeviceInstanceIdW
+
+FUNCTION: BOOL SetupDiDeleteDeviceInfo ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiEnumDeviceInfo ( HDEVINFO DeviceInfoSet, DWORD MemberIndex, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiDestroyDeviceInfoList ( HDEVINFO DeviceInfoSet ) ;
+FUNCTION: BOOL SetupDiEnumDeviceInterfaces ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, GUID* InterfaceClassGuid, DWORD MemberIndex, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ) ;
+ALIAS: SetupDiEnumInterfaceDevice SetupDiEnumDeviceInterfaces
+
+FUNCTION: BOOL SetupDiCreateDeviceInterfaceA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, GUID* InterfaceClassGuid, PCSTR ReferenceString, DWORD CreationFlags, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ) ;
+FUNCTION: BOOL SetupDiCreateDeviceInterfaceW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, GUID* InterfaceClassGuid, PCWSTR ReferenceString, DWORD CreationFlags, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ) ;
+ALIAS: SetupDiCreateDeviceInterface SetupDiCreateDeviceInterfaceW
+
+ALIAS: SetupDiCreateInterfaceDeviceW SetupDiCreateDeviceInterfaceW
+ALIAS: SetupDiCreateInterfaceDeviceA SetupDiCreateDeviceInterfaceA
+
+ALIAS: SetupDiCreateInterfaceDevice SetupDiCreateDeviceInterfaceW
+
+CONSTANT: DIODI_NO_ADD HEX: 00000001
+
+FUNCTION: BOOL SetupDiOpenDeviceInterfaceA ( HDEVINFO DeviceInfoSet, PCSTR DevicePath, DWORD OpenFlags, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ) ;
+FUNCTION: BOOL SetupDiOpenDeviceInterfaceW ( HDEVINFO DeviceInfoSet, PCWSTR DevicePath, DWORD OpenFlags, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ) ;
+ALIAS: SetupDiOpenDeviceInterface SetupDiOpenDeviceInterfaceW
+
+ALIAS: SetupDiOpenInterfaceDeviceW SetupDiOpenDeviceInterfaceW
+ALIAS: SetupDiOpenInterfaceDeviceA SetupDiOpenDeviceInterfaceA
+
+ALIAS: SetupDiOpenInterfaceDevice SetupDiOpenDeviceInterfaceW
+
+FUNCTION: BOOL SetupDiGetDeviceInterfaceAlias ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, GUID* AliasInterfaceClassGuid, PSP_DEVICE_INTERFACE_DATA AliasDeviceInterfaceData ) ;
+ALIAS: SetupDiGetInterfaceDeviceAlias SetupDiGetDeviceInterfaceAlias
+
+FUNCTION: BOOL SetupDiDeleteDeviceInterfaceData ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ) ;
+ALIAS: SetupDiDeleteInterfaceDeviceData SetupDiDeleteDeviceInterfaceData
+
+FUNCTION: BOOL SetupDiRemoveDeviceInterface ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ) ;
+ALIAS: SetupDiRemoveInterfaceDevice SetupDiRemoveDeviceInterface
+
+FUNCTION: BOOL SetupDiGetDeviceInterfaceDetailA ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData, DWORD DeviceInterfaceDetailDataSize, PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiGetDeviceInterfaceDetailW ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, DWORD DeviceInterfaceDetailDataSize, PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData ) ;
+ALIAS: SetupDiGetDeviceInterfaceDetail SetupDiGetDeviceInterfaceDetailW
+
+ALIAS: SetupDiGetInterfaceDeviceDetailW SetupDiGetDeviceInterfaceDetailW
+ALIAS: SetupDiGetInterfaceDeviceDetailA SetupDiGetDeviceInterfaceDetailA
+
+ALIAS: SetupDiGetInterfaceDeviceDetail SetupDiGetDeviceInterfaceDetailW
+
+FUNCTION: BOOL SetupDiInstallDeviceInterfaces ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+ALIAS: SetupDiInstallInterfaceDevices SetupDiInstallDeviceInterfaces
+
+FUNCTION: BOOL SetupDiSetDeviceInterfaceDefault ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Flags, PVOID Reserved ) ;
+
+CONSTANT: SPRDI_FIND_DUPS HEX: 00000001
+
+FUNCTION: BOOL SetupDiRegisterDeviceInfo ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Flags, PSP_DETSIG_CMPPROC CompareProc, PVOID CompareContext, PSP_DEVINFO_DATA DupDeviceInfoData ) ;
+
+CONSTANT: SPDIT_NODRIVER HEX: 00000000
+CONSTANT: SPDIT_CLASSDRIVER HEX: 00000001
+CONSTANT: SPDIT_COMPATDRIVER HEX: 00000002
+
+FUNCTION: BOOL SetupDiBuildDriverInfoList ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD DriverType ) ;
+FUNCTION: BOOL SetupDiCancelDriverInfoSearch ( HDEVINFO DeviceInfoSet ) ;
+FUNCTION: BOOL SetupDiEnumDriverInfoA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD DriverType, DWORD MemberIndex, PSP_DRVINFO_DATA_A DriverInfoData ) ;
+FUNCTION: BOOL SetupDiEnumDriverInfoW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD DriverType, DWORD MemberIndex, PSP_DRVINFO_DATA_W DriverInfoData ) ;
+ALIAS: SetupDiEnumDriverInfo SetupDiEnumDriverInfoW
+
+FUNCTION: BOOL SetupDiGetSelectedDriverA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_A DriverInfoData ) ;
+FUNCTION: BOOL SetupDiGetSelectedDriverW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_W DriverInfoData ) ;
+ALIAS: SetupDiGetSelectedDriver SetupDiGetSelectedDriverW
+
+FUNCTION: BOOL SetupDiSetSelectedDriverA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_A DriverInfoData ) ;
+FUNCTION: BOOL SetupDiSetSelectedDriverW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_W DriverInfoData ) ;
+ALIAS: SetupDiSetSelectedDriver SetupDiSetSelectedDriverW
+
+FUNCTION: BOOL SetupDiGetDriverInfoDetailA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_A DriverInfoData, PSP_DRVINFO_DETAIL_DATA_A DriverInfoDetailData, DWORD DriverInfoDetailDataSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiGetDriverInfoDetailW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_W DriverInfoData, PSP_DRVINFO_DETAIL_DATA_W DriverInfoDetailData, DWORD DriverInfoDetailDataSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiGetDriverInfoDetail SetupDiGetDriverInfoDetailW
+
+FUNCTION: BOOL SetupDiDestroyDriverInfoList ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD DriverType ) ;
+
+CONSTANT: DIGCF_DEFAULT HEX: 00000001
+CONSTANT: DIGCF_PRESENT HEX: 00000002
+CONSTANT: DIGCF_ALLCLASSES HEX: 00000004
+CONSTANT: DIGCF_PROFILE HEX: 00000008
+CONSTANT: DIGCF_DEVICEINTERFACE HEX: 00000010
+CONSTANT: DIGCF_INTERFACEDEVICE $ DIGCF_DEVICEINTERFACE
+
+FUNCTION: HDEVINFO SetupDiGetClassDevsA ( GUID* ClassGuid, PCSTR Enumerator, HWND hwndParent, DWORD Flags ) ;
+FUNCTION: HDEVINFO SetupDiGetClassDevsW ( GUID* ClassGuid, PCWSTR Enumerator, HWND hwndParent, DWORD Flags ) ;
+ALIAS: SetupDiGetClassDevs SetupDiGetClassDevsW
+
+FUNCTION: HDEVINFO SetupDiGetClassDevsExA ( GUID* ClassGuid, PCSTR Enumerator, HWND hwndParent, DWORD Flags, HDEVINFO DeviceInfoSet, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: HDEVINFO SetupDiGetClassDevsExW ( GUID* ClassGuid, PCWSTR Enumerator, HWND hwndParent, DWORD Flags, HDEVINFO DeviceInfoSet, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiGetClassDevsEx SetupDiGetClassDevsExW
+
+FUNCTION: BOOL SetupDiGetINFClassA ( PCSTR InfName, LPGUID ClassGuid, PSTR ClassName, DWORD ClassNameSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiGetINFClassW ( PCWSTR InfName, LPGUID ClassGuid, PWSTR ClassName, DWORD ClassNameSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiGetINFClass SetupDiGetINFClassW
+
+CONSTANT: DIBCI_NOINSTALLCLASS HEX: 00000001
+CONSTANT: DIBCI_NODISPLAYCLASS HEX: 00000002
+
+FUNCTION: BOOL SetupDiBuildClassInfoList ( DWORD Flags, LPGUID ClassGuidList, DWORD ClassGuidListSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiBuildClassInfoListExA ( DWORD Flags, LPGUID ClassGuidList, DWORD ClassGuidListSize, PDWORD RequiredSize, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiBuildClassInfoListExW ( DWORD Flags, LPGUID ClassGuidList, DWORD ClassGuidListSize, PDWORD RequiredSize, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiBuildClassInfoListEx SetupDiBuildClassInfoListExW
+
+FUNCTION: BOOL SetupDiGetClassDescriptionA ( GUID* ClassGuid, PSTR ClassDescription, DWORD ClassDescriptionSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiGetClassDescriptionW ( GUID* ClassGuid, PWSTR ClassDescription, DWORD ClassDescriptionSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiGetClassDescription SetupDiGetClassDescriptionW
+
+FUNCTION: BOOL SetupDiGetClassDescriptionExA ( GUID* ClassGuid, PSTR ClassDescription, DWORD ClassDescriptionSize, PDWORD RequiredSize, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiGetClassDescriptionExW ( GUID* ClassGuid, PWSTR ClassDescription, DWORD ClassDescriptionSize, PDWORD RequiredSize, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiGetClassDescriptionEx SetupDiGetClassDescriptionExW
+
+FUNCTION: BOOL SetupDiCallClassInstaller ( DI_FUNCTION InstallFunction, HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiSelectDevice ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiSelectBestCompatDrv ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiInstallDevice ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiInstallDriverFiles ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiRegisterCoDeviceInstallers( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiRemoveDevice ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiUnremoveDevice ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiRestartDevices ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiChangeState ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiFinishInstallAction ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+
+FUNCTION: BOOL SetupDiInstallClassA ( HWND hwndParent, PCSTR InfFileName, DWORD Flags, HSPFILEQ FileQueue ) ;
+FUNCTION: BOOL SetupDiInstallClassW ( HWND hwndParent, PCWSTR InfFileName, DWORD Flags, HSPFILEQ FileQueue ) ;
+ALIAS: SetupDiInstallClass SetupDiInstallClassW
+
+FUNCTION: BOOL SetupDiInstallClassExA ( HWND hwndParent, PCSTR InfFileName, DWORD Flags, HSPFILEQ FileQueue, GUID* InterfaceClassGuid, PVOID Reserved1, PVOID Reserved2 ) ;
+FUNCTION: BOOL SetupDiInstallClassExW ( HWND hwndParent, PCWSTR InfFileName, DWORD Flags, HSPFILEQ FileQueue, GUID* InterfaceClassGuid, PVOID Reserved1, PVOID Reserved2 ) ;
+ALIAS: SetupDiInstallClassEx SetupDiInstallClassExW
+
+FUNCTION: HKEY SetupDiOpenClassRegKey ( GUID* ClassGuid, REGSAM samDesired ) ;
+
+CONSTANT: DIOCR_INSTALLER HEX: 00000001
+CONSTANT: DIOCR_INTERFACE HEX: 00000002
+
+FUNCTION: HKEY SetupDiOpenClassRegKeyExA ( GUID* ClassGuid, REGSAM samDesired, DWORD Flags, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: HKEY SetupDiOpenClassRegKeyExW ( GUID* ClassGuid, REGSAM samDesired, DWORD Flags, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiOpenClassRegKeyEx SetupDiOpenClassRegKeyExW
+
+FUNCTION: HKEY SetupDiCreateDeviceInterfaceRegKeyA ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Reserved, REGSAM samDesired, HINF InfHandle, PCSTR InfSectionName ) ;
+FUNCTION: HKEY SetupDiCreateDeviceInterfaceRegKeyW ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Reserved, REGSAM samDesired, HINF InfHandle, PCWSTR InfSectionName ) ;
+ALIAS: SetupDiCreateDeviceInterfaceRegKey SetupDiCreateDeviceInterfaceRegKeyW
+ALIAS: SetupDiCreateInterfaceDeviceRegKeyW SetupDiCreateDeviceInterfaceRegKeyW
+ALIAS: SetupDiCreateInterfaceDeviceRegKeyA SetupDiCreateDeviceInterfaceRegKeyA
+ALIAS: SetupDiCreateInterfaceDeviceRegKey SetupDiCreateDeviceInterfaceRegKeyW
+
+FUNCTION: HKEY SetupDiOpenDeviceInterfaceRegKey ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Reserved, REGSAM samDesired ) ;
+ALIAS: SetupDiOpenInterfaceDeviceRegKey SetupDiOpenDeviceInterfaceRegKey
+
+FUNCTION: BOOL SetupDiDeleteDeviceInterfaceRegKey ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Reserved ) ;
+ALIAS: SetupDiDeleteInterfaceDeviceRegKey SetupDiDeleteDeviceInterfaceRegKey
+
+CONSTANT: DIREG_DEV HEX: 00000001
+CONSTANT: DIREG_DRV HEX: 00000002
+CONSTANT: DIREG_BOTH HEX: 00000004
+
+FUNCTION: HKEY SetupDiCreateDevRegKeyA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Scope, DWORD HwProfile, DWORD KeyType, HINF InfHandle, PCSTR InfSectionName ) ;
+FUNCTION: HKEY SetupDiCreateDevRegKeyW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Scope, DWORD HwProfile, DWORD KeyType, HINF InfHandle, PCWSTR InfSectionName ) ;
+ALIAS: SetupDiCreateDevRegKey SetupDiCreateDevRegKeyW
+
+FUNCTION: HKEY SetupDiOpenDevRegKey ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Scope, DWORD HwProfile, DWORD KeyType, REGSAM samDesired ) ;
+FUNCTION: BOOL SetupDiDeleteDevRegKey ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Scope, DWORD HwProfile, DWORD KeyType ) ;
+FUNCTION: BOOL SetupDiGetHwProfileList ( PDWORD HwProfileList, DWORD HwProfileListSize, PDWORD RequiredSize, PDWORD CurrentlyActiveIndex ) ;
+FUNCTION: BOOL SetupDiGetHwProfileListExA ( PDWORD HwProfileList, DWORD HwProfileListSize, PDWORD RequiredSize, PDWORD CurrentlyActiveIndex, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiGetHwProfileListExW ( PDWORD HwProfileList, DWORD HwProfileListSize, PDWORD RequiredSize, PDWORD CurrentlyActiveIndex, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiGetHwProfileListEx SetupDiGetHwProfileListExW
+
+FUNCTION: BOOL SetupDiGetDevicePropertyKeys ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DEVPROPKEY* PropertyKeyArray, DWORD PropertyKeyCount, PDWORD RequiredPropertyKeyCount, DWORD Flags ) ;
+FUNCTION: BOOL SetupDiGetDevicePropertyW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DEVPROPKEY* PropertyKey, DEVPROPTYPE* PropertyType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize, DWORD Flags ) ;
+ALIAS: SetupDiGetDeviceProperty SetupDiGetDevicePropertyW
+
+FUNCTION: BOOL SetupDiSetDevicePropertyW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DEVPROPKEY* PropertyKey, DEVPROPTYPE PropertyType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, DWORD Flags ) ;
+ALIAS: SetupDiSetDeviceProperty SetupDiSetDevicePropertyW
+
+FUNCTION: BOOL SetupDiGetDeviceInterfacePropertyKeys ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DEVPROPKEY* PropertyKeyArray, DWORD PropertyKeyCount, PDWORD RequiredPropertyKeyCount, DWORD Flags ) ;
+FUNCTION: BOOL SetupDiGetDeviceInterfacePropertyW ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DEVPROPKEY* PropertyKey, DEVPROPTYPE* PropertyType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize, DWORD Flags ) ;
+ALIAS: SetupDiGetDeviceInterfaceProperty SetupDiGetDeviceInterfacePropertyW
+
+FUNCTION: BOOL SetupDiSetDeviceInterfacePropertyW ( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DEVPROPKEY* PropertyKey, DEVPROPTYPE PropertyType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, DWORD Flags ) ;
+ALIAS: SetupDiSetDeviceInterfaceProperty SetupDiSetDeviceInterfacePropertyW
+
+CONSTANT: DICLASSPROP_INSTALLER HEX: 00000001
+CONSTANT: DICLASSPROP_INTERFACE HEX: 00000002
+
+FUNCTION: BOOL SetupDiGetClassPropertyKeys ( GUID* ClassGuid, DEVPROPKEY* PropertyKeyArray, DWORD PropertyKeyCount, PDWORD RequiredPropertyKeyCount, DWORD Flags ) ;
+FUNCTION: BOOL SetupDiGetClassPropertyKeysExW ( GUID* ClassGuid, DEVPROPKEY* PropertyKeyArray, DWORD PropertyKeyCount, PDWORD RequiredPropertyKeyCount, DWORD Flags, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiGetClassPropertyKeysEx SetupDiGetClassPropertyKeysExW
+
+FUNCTION: BOOL SetupDiGetClassPropertyW ( GUID* ClassGuid, DEVPROPKEY* PropertyKey, DEVPROPTYPE* PropertyType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize, DWORD Flags ) ;
+ALIAS: SetupDiGetClassProperty SetupDiGetClassPropertyW
+
+FUNCTION: BOOL SetupDiGetClassPropertyExW ( GUID* ClassGuid, DEVPROPKEY* PropertyKey, DEVPROPTYPE* PropertyType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize, DWORD Flags, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiGetClassPropertyEx SetupDiGetClassPropertyExW
+
+FUNCTION: BOOL SetupDiSetClassPropertyW ( GUID* ClassGuid, DEVPROPKEY* PropertyKey, DEVPROPTYPE PropertyType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, DWORD Flags ) ;
+ALIAS: SetupDiSetClassProperty SetupDiSetClassPropertyW
+
+FUNCTION: BOOL SetupDiSetClassPropertyExW ( GUID* ClassGuid, DEVPROPKEY* PropertyKey, DEVPROPTYPE PropertyType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, DWORD Flags, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiSetClassPropertyEx SetupDiSetClassPropertyExW
+
+CONSTANT: SPDRP_DEVICEDESC HEX: 00000000
+CONSTANT: SPDRP_HARDWAREID HEX: 00000001
+CONSTANT: SPDRP_COMPATIBLEIDS HEX: 00000002
+CONSTANT: SPDRP_UNUSED0 HEX: 00000003
+CONSTANT: SPDRP_SERVICE HEX: 00000004
+CONSTANT: SPDRP_UNUSED1 HEX: 00000005
+CONSTANT: SPDRP_UNUSED2 HEX: 00000006
+CONSTANT: SPDRP_CLASS HEX: 00000007
+CONSTANT: SPDRP_CLASSGUID HEX: 00000008
+CONSTANT: SPDRP_DRIVER HEX: 00000009
+CONSTANT: SPDRP_CONFIGFLAGS HEX: 0000000A
+CONSTANT: SPDRP_MFG HEX: 0000000B
+CONSTANT: SPDRP_FRIENDLYNAME HEX: 0000000C
+CONSTANT: SPDRP_LOCATION_INFORMATION HEX: 0000000D
+CONSTANT: SPDRP_PHYSICAL_DEVICE_OBJECT_NAME HEX: 0000000E
+CONSTANT: SPDRP_CAPABILITIES HEX: 0000000F
+CONSTANT: SPDRP_UI_NUMBER HEX: 00000010
+CONSTANT: SPDRP_UPPERFILTERS HEX: 00000011
+CONSTANT: SPDRP_LOWERFILTERS HEX: 00000012
+CONSTANT: SPDRP_BUSTYPEGUID HEX: 00000013
+CONSTANT: SPDRP_LEGACYBUSTYPE HEX: 00000014
+CONSTANT: SPDRP_BUSNUMBER HEX: 00000015
+CONSTANT: SPDRP_ENUMERATOR_NAME HEX: 00000016
+CONSTANT: SPDRP_SECURITY HEX: 00000017
+CONSTANT: SPDRP_SECURITY_SDS HEX: 00000018
+CONSTANT: SPDRP_DEVTYPE HEX: 00000019
+CONSTANT: SPDRP_EXCLUSIVE HEX: 0000001A
+CONSTANT: SPDRP_CHARACTERISTICS HEX: 0000001B
+CONSTANT: SPDRP_ADDRESS HEX: 0000001C
+CONSTANT: SPDRP_UI_NUMBER_DESC_FORMAT HEX: 0000001D
+CONSTANT: SPDRP_DEVICE_POWER_DATA HEX: 0000001E
+CONSTANT: SPDRP_REMOVAL_POLICY HEX: 0000001F
+CONSTANT: SPDRP_REMOVAL_POLICY_HW_DEFAULT HEX: 00000020
+CONSTANT: SPDRP_REMOVAL_POLICY_OVERRIDE HEX: 00000021
+CONSTANT: SPDRP_INSTALL_STATE HEX: 00000022
+CONSTANT: SPDRP_LOCATION_PATHS HEX: 00000023
+CONSTANT: SPDRP_BASE_CONTAINERID HEX: 00000024
+CONSTANT: SPDRP_MAXIMUM_PROPERTY HEX: 00000025
+CONSTANT: SPCRP_UPPERFILTERS HEX: 00000011
+CONSTANT: SPCRP_LOWERFILTERS HEX: 00000012
+CONSTANT: SPCRP_SECURITY HEX: 00000017
+CONSTANT: SPCRP_SECURITY_SDS HEX: 00000018
+CONSTANT: SPCRP_DEVTYPE HEX: 00000019
+CONSTANT: SPCRP_EXCLUSIVE HEX: 0000001A
+CONSTANT: SPCRP_CHARACTERISTICS HEX: 0000001B
+CONSTANT: SPCRP_MAXIMUM_PROPERTY HEX: 0000001C
+
+FUNCTION: BOOL SetupDiGetDeviceRegistryPropertyA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiGetDeviceRegistryPropertyW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiGetDeviceRegistryProperty SetupDiGetDeviceRegistryPropertyW
+
+FUNCTION: BOOL SetupDiGetClassRegistryPropertyA ( GUID* ClassGuid, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiGetClassRegistryPropertyW ( GUID* ClassGuid, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiGetClassRegistryProperty SetupDiGetClassRegistryPropertyW
+
+FUNCTION: BOOL SetupDiSetDeviceRegistryPropertyA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, BYTE* PropertyBuffer, DWORD PropertyBufferSize ) ;
+FUNCTION: BOOL SetupDiSetDeviceRegistryPropertyW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, BYTE* PropertyBuffer, DWORD PropertyBufferSize ) ;
+ALIAS: SetupDiSetDeviceRegistryProperty SetupDiSetDeviceRegistryPropertyW
+
+FUNCTION: BOOL SetupDiSetClassRegistryPropertyA ( GUID* ClassGuid, DWORD Property, BYTE* PropertyBuffer, DWORD PropertyBufferSize, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiSetClassRegistryPropertyW ( GUID* ClassGuid, DWORD Property, BYTE* PropertyBuffer, DWORD PropertyBufferSize, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiSetClassRegistryProperty SetupDiSetClassRegistryPropertyW
+
+FUNCTION: BOOL SetupDiGetDeviceInstallParamsA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DEVINSTALL_PARAMS_A DeviceInstallParams ) ;
+FUNCTION: BOOL SetupDiGetDeviceInstallParamsW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DEVINSTALL_PARAMS_W DeviceInstallParams ) ;
+ALIAS: SetupDiGetDeviceInstallParams SetupDiGetDeviceInstallParamsW
+
+FUNCTION: BOOL SetupDiGetClassInstallParamsA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_CLASSINSTALL_HEADER ClassInstallParams, DWORD ClassInstallParamsSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiGetClassInstallParamsW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_CLASSINSTALL_HEADER ClassInstallParams, DWORD ClassInstallParamsSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiGetClassInstallParams SetupDiGetClassInstallParamsW
+
+FUNCTION: BOOL SetupDiSetDeviceInstallParamsA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DEVINSTALL_PARAMS_A DeviceInstallParams ) ;
+FUNCTION: BOOL SetupDiSetDeviceInstallParamsW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DEVINSTALL_PARAMS_W DeviceInstallParams ) ;
+ALIAS: SetupDiSetDeviceInstallParams SetupDiSetDeviceInstallParamsW
+
+FUNCTION: BOOL SetupDiSetClassInstallParamsA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_CLASSINSTALL_HEADER ClassInstallParams, DWORD ClassInstallParamsSize ) ;
+FUNCTION: BOOL SetupDiSetClassInstallParamsW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_CLASSINSTALL_HEADER ClassInstallParams, DWORD ClassInstallParamsSize ) ;
+ALIAS: SetupDiSetClassInstallParams SetupDiSetClassInstallParamsW
+
+FUNCTION: BOOL SetupDiGetDriverInstallParamsA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_A DriverInfoData, PSP_DRVINSTALL_PARAMS DriverInstallParams ) ;
+FUNCTION: BOOL SetupDiGetDriverInstallParamsW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_W DriverInfoData, PSP_DRVINSTALL_PARAMS DriverInstallParams ) ;
+ALIAS: SetupDiGetDriverInstallParams SetupDiGetDriverInstallParamsW
+
+FUNCTION: BOOL SetupDiSetDriverInstallParamsA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_A DriverInfoData, PSP_DRVINSTALL_PARAMS DriverInstallParams ) ;
+FUNCTION: BOOL SetupDiSetDriverInstallParamsW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DRVINFO_DATA_W DriverInfoData, PSP_DRVINSTALL_PARAMS DriverInstallParams ) ;
+ALIAS: SetupDiSetDriverInstallParams SetupDiSetDriverInstallParamsW
+
+FUNCTION: BOOL SetupDiLoadClassIcon ( GUID* ClassGuid, HICON* LargeIcon, PINT MiniIconIndex ) ;
+FUNCTION: BOOL SetupDiLoadDeviceIcon ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, UINT cxIcon, UINT cyIcon, DWORD Flags, HICON* hIcon ) ;
+
+CONSTANT: DMI_MASK HEX: 00000001
+CONSTANT: DMI_BKCOLOR HEX: 00000002
+CONSTANT: DMI_USERECT HEX: 00000004
+
+FUNCTION: INT SetupDiDrawMiniIcon ( HDC hdc, RECT rc, INT MiniIconIndex, DWORD Flags ) ;
+FUNCTION: BOOL SetupDiGetClassBitmapIndex ( GUID* ClassGuid, PINT MiniIconIndex ) ;
+FUNCTION: BOOL SetupDiGetClassImageList ( PSP_CLASSIMAGELIST_DATA ClassImageListData ) ;
+FUNCTION: BOOL SetupDiGetClassImageListExA ( PSP_CLASSIMAGELIST_DATA ClassImageListData, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiGetClassImageListExW ( PSP_CLASSIMAGELIST_DATA ClassImageListData, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiGetClassImageListEx SetupDiGetClassImageListExW
+
+FUNCTION: BOOL SetupDiGetClassImageIndex ( PSP_CLASSIMAGELIST_DATA ClassImageListData, GUID* ClassGuid, PINT ImageIndex ) ;
+FUNCTION: BOOL SetupDiDestroyClassImageList ( PSP_CLASSIMAGELIST_DATA ClassImageListData ) ;
+
+CONSTANT: DIGCDP_FLAG_BASIC HEX: 00000001
+CONSTANT: DIGCDP_FLAG_ADVANCED HEX: 00000002
+CONSTANT: DIGCDP_FLAG_REMOTE_BASIC HEX: 00000003
+CONSTANT: DIGCDP_FLAG_REMOTE_ADVANCED HEX: 00000004
+
+FUNCTION: BOOL SetupDiGetClassDevPropertySheetsA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, LPPROPSHEETHEADERA PropertySheetHeader, DWORD PropertySheetHeaderPageListSize, PDWORD RequiredSize, DWORD PropertySheetType ) ;
+FUNCTION: BOOL SetupDiGetClassDevPropertySheetsW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, LPPROPSHEETHEADERW PropertySheetHeader, DWORD PropertySheetHeaderPageListSize, PDWORD RequiredSize, DWORD PropertySheetType ) ;
+ALIAS: SetupDiGetClassDevPropertySheets SetupDiGetClassDevPropertySheetsW
+
+CONSTANT: IDI_RESOURCEFIRST 159
+CONSTANT: IDI_RESOURCE 159
+CONSTANT: IDI_RESOURCELAST 161
+CONSTANT: IDI_RESOURCEOVERLAYFIRST 161
+CONSTANT: IDI_RESOURCEOVERLAYLAST 161
+CONSTANT: IDI_CONFLICT 161
+CONSTANT: IDI_CLASSICON_OVERLAYFIRST 500
+CONSTANT: IDI_CLASSICON_OVERLAYLAST 502
+CONSTANT: IDI_PROBLEM_OVL 500
+CONSTANT: IDI_DISABLED_OVL 501
+CONSTANT: IDI_FORCED_OVL 502
+
+FUNCTION: BOOL SetupDiAskForOEMDisk ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiSelectOEMDrv ( HWND hwndParent, HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiClassNameFromGuidA ( GUID* ClassGuid, PSTR ClassName, DWORD ClassNameSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiClassNameFromGuidW ( GUID* ClassGuid, PWSTR ClassName, DWORD ClassNameSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiClassNameFromGuid SetupDiClassNameFromGuidW
+
+FUNCTION: BOOL SetupDiClassNameFromGuidExA ( GUID* ClassGuid, PSTR ClassName, DWORD ClassNameSize, PDWORD RequiredSize, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiClassNameFromGuidExW ( GUID* ClassGuid, PWSTR ClassName, DWORD ClassNameSize, PDWORD RequiredSize, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiClassNameFromGuidEx SetupDiClassNameFromGuidExW
+
+FUNCTION: BOOL SetupDiClassGuidsFromNameA ( PCSTR ClassName, LPGUID ClassGuidList, DWORD ClassGuidListSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiClassGuidsFromNameW ( PCWSTR ClassName, LPGUID ClassGuidList, DWORD ClassGuidListSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiClassGuidsFromName SetupDiClassGuidsFromNameW
+
+FUNCTION: BOOL SetupDiClassGuidsFromNameExA ( PCSTR ClassName, LPGUID ClassGuidList, DWORD ClassGuidListSize, PDWORD RequiredSize, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiClassGuidsFromNameExW ( PCWSTR ClassName, LPGUID ClassGuidList, DWORD ClassGuidListSize, PDWORD RequiredSize, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiClassGuidsFromNameEx SetupDiClassGuidsFromNameExW
+
+FUNCTION: BOOL SetupDiGetHwProfileFriendlyNameA ( DWORD HwProfile, PSTR FriendlyName, DWORD FriendlyNameSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiGetHwProfileFriendlyNameW ( DWORD HwProfile, PWSTR FriendlyName, DWORD FriendlyNameSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiGetHwProfileFriendlyName SetupDiGetHwProfileFriendlyNameW
+
+FUNCTION: BOOL SetupDiGetHwProfileFriendlyNameExA ( DWORD HwProfile, PSTR FriendlyName, DWORD FriendlyNameSize, PDWORD RequiredSize, PCSTR MachineName, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiGetHwProfileFriendlyNameExW ( DWORD HwProfile, PWSTR FriendlyName, DWORD FriendlyNameSize, PDWORD RequiredSize, PCWSTR MachineName, PVOID Reserved ) ;
+ALIAS: SetupDiGetHwProfileFriendlyNameEx SetupDiGetHwProfileFriendlyNameExW
+
+CONSTANT: SPWPT_SELECTDEVICE HEX: 00000001
+CONSTANT: SPWP_USE_DEVINFO_DATA HEX: 00000001
+
+FUNCTION: HPROPSHEETPAGE SetupDiGetWizardPage ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_INSTALLWIZARD_DATA InstallWizardData, DWORD PageType, DWORD Flags ) ;
+FUNCTION: BOOL SetupDiGetSelectedDevice ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+FUNCTION: BOOL SetupDiSetSelectedDevice ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData ) ;
+
+FUNCTION: BOOL SetupDiGetActualModelsSectionA ( PINFCONTEXT Context, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiGetActualModelsSectionW ( PINFCONTEXT Context, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PWSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PVOID Reserved ) ;
+
+ALIAS: SetupDiGetActualModelsSection SetupDiGetActualModelsSectionW
+
+FUNCTION: BOOL SetupDiGetActualSectionToInstallA ( HINF InfHandle, PCSTR InfSectionName, PSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PSTR* Extension ) ;
+FUNCTION: BOOL SetupDiGetActualSectionToInstallW ( HINF InfHandle, PCWSTR InfSectionName, PWSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PWSTR* Extension ) ;
+ALIAS: SetupDiGetActualSectionToInstall SetupDiGetActualSectionToInstallW
+
+FUNCTION: BOOL SetupDiGetActualSectionToInstallExA ( HINF InfHandle, PCSTR InfSectionName, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PSTR* Extension, PVOID Reserved ) ;
+FUNCTION: BOOL SetupDiGetActualSectionToInstallExW ( HINF InfHandle, PCWSTR InfSectionName, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PWSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PWSTR* Extension, PVOID Reserved ) ;
+ALIAS: SetupDiGetActualSectionToInstallEx SetupDiGetActualSectionToInstallExW
+
+FUNCTION: BOOL SetupEnumInfSectionsA ( HINF InfHandle, UINT Index, PSTR Buffer, UINT Size, UINT* SizeNeeded ) ;
+FUNCTION: BOOL SetupEnumInfSectionsW ( HINF InfHandle, UINT Index, PWSTR Buffer, UINT Size, UINT* SizeNeeded ) ;
+ALIAS: SetupEnumInfSections SetupEnumInfSectionsW
+
+STRUCT: SP_INF_SIGNER_INFO_V1_A
+ { cbSize DWORD }
+ { CatalogFile CHAR[MAX_PATH] }
+ { DigitalSigner CHAR[MAX_PATH] }
+ { DigitalSignerVersion CHAR[MAX_PATH] } ;
+TYPEDEF: SP_INF_SIGNER_INFO_V1_A* PSP_INF_SIGNER_INFO_V1_A
+STRUCT: SP_INF_SIGNER_INFO_V1_W
+ { cbSize DWORD }
+ { CatalogFile WCHAR[MAX_PATH] }
+ { DigitalSigner WCHAR[MAX_PATH] }
+ { DigitalSignerVersion WCHAR[MAX_PATH] } ;
+TYPEDEF: SP_INF_SIGNER_INFO_V1_W* PSP_INF_SIGNER_INFO_V1_W
+TYPEDEF: SP_INF_SIGNER_INFO_V1_W SP_INF_SIGNER_INFO_V1
+TYPEDEF: PSP_INF_SIGNER_INFO_V1_W PSP_INF_SIGNER_INFO_V1
+
+STRUCT: SP_INF_SIGNER_INFO_V2_A
+ { cbSize DWORD }
+ { CatalogFile CHAR[MAX_PATH] }
+ { DigitalSigner CHAR[MAX_PATH] }
+ { DigitalSignerVersion CHAR[MAX_PATH] }
+ { SignerScore DWORD } ;
+TYPEDEF: SP_INF_SIGNER_INFO_V2_A* PSP_INF_SIGNER_INFO_V2_A
+STRUCT: SP_INF_SIGNER_INFO_V2_W
+ { cbSize DWORD }
+ { CatalogFile WCHAR[MAX_PATH] }
+ { DigitalSigner WCHAR[MAX_PATH] }
+ { DigitalSignerVersion WCHAR[MAX_PATH] }
+ { SignerScore DWORD } ;
+TYPEDEF: SP_INF_SIGNER_INFO_V2_W* PSP_INF_SIGNER_INFO_V2_W
+
+TYPEDEF: SP_INF_SIGNER_INFO_V2_W SP_INF_SIGNER_INFO_V2
+TYPEDEF: PSP_INF_SIGNER_INFO_V2_W PSP_INF_SIGNER_INFO_V2
+
+CONSTANT: SIGNERSCORE_UNKNOWN HEX: FF000000
+CONSTANT: SIGNERSCORE_W9X_SUSPECT HEX: C0000000
+CONSTANT: SIGNERSCORE_UNSIGNED HEX: 80000000
+CONSTANT: SIGNERSCORE_AUTHENTICODE HEX: 0F000000
+CONSTANT: SIGNERSCORE_WHQL HEX: 0D000005
+CONSTANT: SIGNERSCORE_UNCLASSIFIED HEX: 0D000004
+CONSTANT: SIGNERSCORE_INBOX HEX: 0D000003
+CONSTANT: SIGNERSCORE_LOGO_STANDARD HEX: 0D000002
+CONSTANT: SIGNERSCORE_LOGO_PREMIUM HEX: 0D000001
+CONSTANT: SIGNERSCORE_MASK HEX: FF000000
+CONSTANT: SIGNERSCORE_SIGNED_MASK HEX: F0000000
+
+TYPEDEF: SP_INF_SIGNER_INFO_V2_A SP_INF_SIGNER_INFO_A
+TYPEDEF: PSP_INF_SIGNER_INFO_V2_A PSP_INF_SIGNER_INFO_A
+TYPEDEF: SP_INF_SIGNER_INFO_V2_W SP_INF_SIGNER_INFO_W
+TYPEDEF: PSP_INF_SIGNER_INFO_V2_W PSP_INF_SIGNER_INFO_W
+TYPEDEF: SP_INF_SIGNER_INFO_V2 SP_INF_SIGNER_INFO
+TYPEDEF: PSP_INF_SIGNER_INFO_V2 PSP_INF_SIGNER_INFO
+
+FUNCTION: BOOL SetupVerifyInfFileA ( PCSTR InfName, PSP_ALTPLATFORM_INFO AltPlatformInfo, PSP_INF_SIGNER_INFO_A InfSignerInfo ) ;
+FUNCTION: BOOL SetupVerifyInfFileW ( PCWSTR InfName, PSP_ALTPLATFORM_INFO AltPlatformInfo, PSP_INF_SIGNER_INFO_W InfSignerInfo ) ;
+ALIAS: SetupVerifyInfFile SetupVerifyInfFileW
+
+CONSTANT: DICUSTOMDEVPROP_MERGE_MULTISZ HEX: 00000001
+FUNCTION: BOOL SetupDiGetCustomDevicePropertyA ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PCSTR CustomPropertyName, DWORD Flags, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize ) ;
+FUNCTION: BOOL SetupDiGetCustomDevicePropertyW ( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PCWSTR CustomPropertyName, DWORD Flags, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize ) ;
+ALIAS: SetupDiGetCustomDeviceProperty SetupDiGetCustomDevicePropertyW
+
+CONSTANT: SCWMI_CLOBBER_SECURITY HEX: 00000001
+FUNCTION: BOOL SetupConfigureWmiFromInfSectionA ( HINF InfHandle, PCSTR SectionName, DWORD Flags ) ;
+FUNCTION: BOOL SetupConfigureWmiFromInfSectionW ( HINF InfHandle, PCWSTR SectionName, DWORD Flags ) ;
+ALIAS: SetupConfigureWmiFromInfSection SetupConfigureWmiFromInfSectionW
+
diff --git a/basis/windows/ddk/setupapi/summary.txt b/basis/windows/ddk/setupapi/summary.txt
new file mode 100644
index 0000000000..3a6ad610e7
--- /dev/null
+++ b/basis/windows/ddk/setupapi/summary.txt
@@ -0,0 +1 @@
+Bindings to the SetupAPI section of the Windows DDK.
diff --git a/basis/windows/ddk/setupapi/tags.txt b/basis/windows/ddk/setupapi/tags.txt
new file mode 100644
index 0000000000..25fe231655
--- /dev/null
+++ b/basis/windows/ddk/setupapi/tags.txt
@@ -0,0 +1 @@
+unportable bindings
diff --git a/basis/windows/ddk/winusb/authors.txt b/basis/windows/ddk/winusb/authors.txt
new file mode 100644
index 0000000000..6f03a12101
--- /dev/null
+++ b/basis/windows/ddk/winusb/authors.txt
@@ -0,0 +1 @@
+Erik Charlebois
diff --git a/basis/windows/ddk/winusb/platforms.txt b/basis/windows/ddk/winusb/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/ddk/winusb/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/ddk/winusb/summary.txt b/basis/windows/ddk/winusb/summary.txt
new file mode 100644
index 0000000000..0d95f10574
--- /dev/null
+++ b/basis/windows/ddk/winusb/summary.txt
@@ -0,0 +1 @@
+Bindings to the USB section of the Windows DDK.
diff --git a/basis/windows/ddk/winusb/tags.txt b/basis/windows/ddk/winusb/tags.txt
new file mode 100644
index 0000000000..ee46b6bc1f
--- /dev/null
+++ b/basis/windows/ddk/winusb/tags.txt
@@ -0,0 +1 @@
+unportable bindings
diff --git a/basis/windows/ddk/winusb/winusb.factor b/basis/windows/ddk/winusb/winusb.factor
new file mode 100644
index 0000000000..3b98e7e8ca
--- /dev/null
+++ b/basis/windows/ddk/winusb/winusb.factor
@@ -0,0 +1,66 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.c-types alien.syntax classes.struct windows.kernel32
+windows.types alien.libraries ;
+IN: windows.ddk.winusb
+
+<< "winusb" "winusb.dll" "stdcall" add-library >>
+LIBRARY: winusb
+
+TYPEDEF: PVOID WINUSB_INTERFACE_HANDLE
+TYPEDEF: WINUSB_INTERFACE_HANDLE* PWINUSB_INTERFACE_HANDLE
+
+STRUCT: USB_INTERFACE_DESCRIPTOR
+ { bLength UCHAR }
+ { bDescriptorType UCHAR }
+ { bInterfaceNumber UCHAR }
+ { bAlternateSetting UCHAR }
+ { bNumEndpoints UCHAR }
+ { bInterfaceClass UCHAR }
+ { bInterfaceSubClass UCHAR }
+ { bInterfaceProtocol UCHAR }
+ { iInterface UCHAR } ;
+TYPEDEF: USB_INTERFACE_DESCRIPTOR* PUSB_INTERFACE_DESCRIPTOR
+
+C-ENUM:
+ UsbdPipeTypeControl
+ UsbdPipeTypeIsochronous
+ UsbdPipeTypeBulk
+ UsbdPipeTypeInterrupt ;
+TYPEDEF: int USBD_PIPE_TYPE
+
+STRUCT: WINUSB_PIPE_INFORMATION
+ { PipeType USBD_PIPE_TYPE }
+ { PipeId UCHAR }
+ { MaximumPacketSize USHORT }
+ { Interval UCHAR } ;
+TYPEDEF: WINUSB_PIPE_INFORMATION* PWINUSB_PIPE_INFORMATION
+
+STRUCT: WINUSB_SETUP_PACKET
+ { RequestType UCHAR }
+ { Request UCHAR }
+ { Value USHORT }
+ { Index USHORT }
+ { Length USHORT } ;
+TYPEDEF: WINUSB_SETUP_PACKET* PWINUSB_SETUP_PACKET
+
+FUNCTION: BOOL WinUsb_AbortPipe ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID ) ;
+FUNCTION: BOOL WinUsb_FlushPipe ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID ) ;
+FUNCTION: BOOL WinUsb_ControlTransfer ( WINUSB_INTERFACE_HANDLE InterfaceHandle, WINUSB_SETUP_PACKET SetupPacket, PUCHAR Buffer, ULONG BufferLength, PULONG LengthTransferred, LPOVERLAPPED Overlapped ) ;
+FUNCTION: BOOL WinUsb_Initialize ( HANDLE DeviceHandle, PWINUSB_INTERFACE_HANDLE InterfaceHandle ) ;
+FUNCTION: BOOL WinUsb_Free ( WINUSB_INTERFACE_HANDLE InterfaceHandle ) ;
+FUNCTION: BOOL WinUsb_GetAssociatedInterface ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR AssociatedInterfaceIndex, PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle ) ;
+FUNCTION: BOOL WinUsb_GetCurrentAlternateSetting ( WINUSB_INTERFACE_HANDLE InterfaceHandle, PUCHAR SettingNumber ) ;
+FUNCTION: BOOL WinUsb_GetDescriptor ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR DescriptorType, UCHAR Index, USHORT LanguageID, PUCHAR Buffer, ULONG BufferLength, PULONG LengthTransferred ) ;
+FUNCTION: BOOL WinUsb_GetPowerPolicy ( WINUSB_INTERFACE_HANDLE InterfaceHandle, ULONG PolicyType, PULONG ValueLength, PVOID Value ) ;
+FUNCTION: BOOL WinUsb_GetOverlappedResult ( WINUSB_INTERFACE_HANDLE InterfaceHandle, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait ) ;
+FUNCTION: BOOL WinUsb_GetPipePolicy ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, ULONG PolicyType, PULONG ValueLength, PVOID Value ) ;
+FUNCTION: BOOL WinUsb_QueryInterfaceSettings ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR AlternateInterfaceNumber, PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor ) ;
+FUNCTION: BOOL WinUsb_QueryDeviceInformation ( WINUSB_INTERFACE_HANDLE InterfaceHandle, ULONG InformationType, PULONG BufferLength, PVOID Buffer ) ;
+FUNCTION: BOOL WinUsb_QueryPipe ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR AlternateInterfaceNumber, UCHAR PipeIndex, PWINUSB_PIPE_INFORMATION PipeInformation ) ;
+FUNCTION: BOOL WinUsb_ReadPipe ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, PUCHAR Buffer, ULONG BufferLength, PULONG LengthTransferred, LPOVERLAPPED Overlapped ) ;
+FUNCTION: BOOL WinUsb_ResetPipe ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID ) ;
+FUNCTION: BOOL WinUsb_SetCurrentAlternateSetting ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR SettingNumber ) ;
+FUNCTION: BOOL WinUsb_SetPowerPolicy ( WINUSB_INTERFACE_HANDLE InterfaceHandle, ULONG PolicyType, ULONG ValueLength, PVOID Value ) ;
+FUNCTION: BOOL WinUsb_SetPipePolicy ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, ULONG PolicyType, ULONG ValueLength, PVOID Value ) ;
+FUNCTION: BOOL WinUsb_WritePipe ( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, PUCHAR Buffer, ULONG BufferLength, PULONG LengthTransferred, LPOVERLAPPED Overlapped ) ;
diff --git a/basis/windows/directx/audiodefs/platforms.txt b/basis/windows/directx/audiodefs/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/audiodefs/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/audiodefs/tags.txt b/basis/windows/directx/audiodefs/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/audiodefs/tags.txt
+++ b/basis/windows/directx/audiodefs/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d2d1/d2d1.factor b/basis/windows/directx/d2d1/d2d1.factor
index cf9e5a3a98..4a8b44f63d 100644
--- a/basis/windows/directx/d2d1/d2d1.factor
+++ b/basis/windows/directx/d2d1/d2d1.factor
@@ -303,6 +303,9 @@ TYPEDEF: int D2D1_FACTORY_TYPE
STRUCT: D2D1_FACTORY_OPTIONS
{ debugLevel D2D1_DEBUG_LEVEL } ;
+C-TYPE: ID2D1Factory
+C-TYPE: ID2D1BitmapRenderTarget
+
COM-INTERFACE: ID2D1Resource IUnknown {2cd90691-12e2-11dc-9fed-001143a055f9}
void GetFactory ( ID2D1Factory** factory ) ;
diff --git a/basis/windows/directx/d2d1/platforms.txt b/basis/windows/directx/d2d1/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d2d1/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d2d1/tags.txt b/basis/windows/directx/d2d1/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d2d1/tags.txt
+++ b/basis/windows/directx/d2d1/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d2dbasetypes/platforms.txt b/basis/windows/directx/d2dbasetypes/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d2dbasetypes/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d2dbasetypes/tags.txt b/basis/windows/directx/d2dbasetypes/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d2dbasetypes/tags.txt
+++ b/basis/windows/directx/d2dbasetypes/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d2derr/platforms.txt b/basis/windows/directx/d2derr/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d2derr/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d2derr/tags.txt b/basis/windows/directx/d2derr/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d2derr/tags.txt
+++ b/basis/windows/directx/d2derr/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d10/d3d10.factor b/basis/windows/directx/d3d10/d3d10.factor
index 561aa47acd..4f23d41218 100644
--- a/basis/windows/directx/d3d10/d3d10.factor
+++ b/basis/windows/directx/d3d10/d3d10.factor
@@ -382,6 +382,7 @@ STRUCT: D3D10_BOX
{ bottom UINT }
{ back UINT } ;
+C-TYPE: ID3D10Device
COM-INTERFACE: ID3D10DeviceChild IUnknown {9B7E4C00-342C-4106-A19F-4F2704F689F0}
void GetDevice ( ID3D10Device** ppDevice )
HRESULT GetPrivateData ( LPGUID guid, UINT* pDataSize, void* pData )
diff --git a/basis/windows/directx/d3d10/platforms.txt b/basis/windows/directx/d3d10/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d10/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d10/tags.txt b/basis/windows/directx/d3d10/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d10/tags.txt
+++ b/basis/windows/directx/d3d10/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d10_1/platforms.txt b/basis/windows/directx/d3d10_1/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d10_1/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d10_1/tags.txt b/basis/windows/directx/d3d10_1/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d10_1/tags.txt
+++ b/basis/windows/directx/d3d10_1/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d10_1shader/platforms.txt b/basis/windows/directx/d3d10_1shader/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d10_1shader/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d10_1shader/tags.txt b/basis/windows/directx/d3d10_1shader/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d10_1shader/tags.txt
+++ b/basis/windows/directx/d3d10_1shader/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d10effect/d3d10effect.factor b/basis/windows/directx/d3d10effect/d3d10effect.factor
index 5b4fbb4ca5..873f8e26e8 100644
--- a/basis/windows/directx/d3d10effect/d3d10effect.factor
+++ b/basis/windows/directx/d3d10effect/d3d10effect.factor
@@ -1,5 +1,5 @@
USING: alien.c-types alien.syntax classes.struct windows.com
-windows.com.syntax windows.directx.d3d10
+windows.com.syntax windows.directx.d3d10 windows.directx.d3d10misc
windows.directx.d3d10shader windows.types ;
IN: windows.directx.d3d10effect
@@ -113,6 +113,20 @@ STRUCT: D3D10_EFFECT_VARIABLE_DESC
{ BufferOffset UINT }
{ ExplicitBindPoint UINT } ;
+C-TYPE: ID3D10EffectConstantBuffer
+C-TYPE: ID3D10EffectScalarVariable
+C-TYPE: ID3D10EffectVectorVariable
+C-TYPE: ID3D10EffectMatrixVariable
+C-TYPE: ID3D10EffectStringVariable
+C-TYPE: ID3D10EffectShaderResourceVariable
+C-TYPE: ID3D10EffectRenderTargetViewVariable
+C-TYPE: ID3D10EffectDepthStencilViewVariable
+C-TYPE: ID3D10EffectShaderVariable
+C-TYPE: ID3D10EffectBlendVariable
+C-TYPE: ID3D10EffectDepthStencilVariable
+C-TYPE: ID3D10EffectRasterizerVariable
+C-TYPE: ID3D10EffectSamplerVariable
+
COM-INTERFACE: ID3D10EffectVariable f {AE897105-00E6-45bf-BB8E-281DD6DB8E1B}
BOOL IsValid ( )
ID3D10EffectType* GetType ( )
diff --git a/basis/windows/directx/d3d10effect/platforms.txt b/basis/windows/directx/d3d10effect/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d10effect/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d10effect/tags.txt b/basis/windows/directx/d3d10effect/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d10effect/tags.txt
+++ b/basis/windows/directx/d3d10effect/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d10misc/d3d10misc.factor b/basis/windows/directx/d3d10misc/d3d10misc.factor
index b6f5f12bce..a5809009ea 100644
--- a/basis/windows/directx/d3d10misc/d3d10misc.factor
+++ b/basis/windows/directx/d3d10misc/d3d10misc.factor
@@ -1,5 +1,5 @@
USING: alien.c-types alien.syntax windows.com windows.com.syntax
-windows.directx.dxgi windows.types alien.libraries ;
+windows.directx.d3d10 windows.directx.dxgi windows.types ;
IN: windows.directx.d3d10misc
LIBRARY: d3d10
diff --git a/basis/windows/directx/d3d10misc/platforms.txt b/basis/windows/directx/d3d10misc/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d10misc/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d10misc/tags.txt b/basis/windows/directx/d3d10misc/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d10misc/tags.txt
+++ b/basis/windows/directx/d3d10misc/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d10shader/d3d10shader.factor b/basis/windows/directx/d3d10shader/d3d10shader.factor
index 4507441fd0..787698e503 100644
--- a/basis/windows/directx/d3d10shader/d3d10shader.factor
+++ b/basis/windows/directx/d3d10shader/d3d10shader.factor
@@ -1,5 +1,6 @@
-USING: alien.syntax alien.c-types classes.struct windows.types windows.com
-windows.com.syntax windows.directx.d3d10 ;
+USING: alien.c-types alien.syntax classes.struct windows.com
+windows.com.syntax windows.directx.d3d10 windows.directx.d3d10misc
+windows.types ;
IN: windows.directx.d3d10shader
LIBRARY: d3d10
diff --git a/basis/windows/directx/d3d10shader/platforms.txt b/basis/windows/directx/d3d10shader/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d10shader/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d10shader/tags.txt b/basis/windows/directx/d3d10shader/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d10shader/tags.txt
+++ b/basis/windows/directx/d3d10shader/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d11/d3d11.factor b/basis/windows/directx/d3d11/d3d11.factor
index 505ac4bc67..8382c11dc2 100644
--- a/basis/windows/directx/d3d11/d3d11.factor
+++ b/basis/windows/directx/d3d11/d3d11.factor
@@ -634,6 +634,9 @@ STRUCT: D3D11_BOX
{ bottom UINT }
{ back UINT } ;
+C-TYPE: ID3D11Device
+C-TYPE: ID3D11ClassLinkage
+
COM-INTERFACE: ID3D11DeviceChild IUnknown {1841e5c8-16b0-489b-bcc8-44cfb0d5deae}
void GetDevice ( ID3D11Device** ppDevice )
HRESULT GetPrivateData ( REFGUID guid, UINT* pDataSize, void* pData )
diff --git a/basis/windows/directx/d3d11/platforms.txt b/basis/windows/directx/d3d11/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d11/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d11/tags.txt b/basis/windows/directx/d3d11/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d11/tags.txt
+++ b/basis/windows/directx/d3d11/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d11shader/d3d11shader.factor b/basis/windows/directx/d3d11shader/d3d11shader.factor
index a0437e3e65..02ab9bb177 100644
--- a/basis/windows/directx/d3d11shader/d3d11shader.factor
+++ b/basis/windows/directx/d3d11shader/d3d11shader.factor
@@ -152,6 +152,9 @@ COM-INTERFACE: ID3D11ShaderReflectionType f {6E6FFA6A-9BAE-4613-A51E-91652D508C2
HRESULT IsOfType ( ID3D11ShaderReflectionType* pType )
HRESULT ImplementsInterface ( ID3D11ShaderReflectionType* pBase ) ;
+C-TYPE: ID3D11ShaderReflectionType
+C-TYPE: ID3D11ShaderReflectionConstantBuffer
+
COM-INTERFACE: ID3D11ShaderReflectionVariable f {51F23923-F3E5-4BD1-91CB-606177D8DB4C}
HRESULT GetDesc ( D3D11_SHADER_VARIABLE_DESC* pDesc )
ID3D11ShaderReflectionType* GetType ( )
diff --git a/basis/windows/directx/d3d11shader/platforms.txt b/basis/windows/directx/d3d11shader/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d11shader/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d11shader/tags.txt b/basis/windows/directx/d3d11shader/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d11shader/tags.txt
+++ b/basis/windows/directx/d3d11shader/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d9/d3d9.factor b/basis/windows/directx/d3d9/d3d9.factor
index cedfefc103..d4e06ae8c9 100644
--- a/basis/windows/directx/d3d9/d3d9.factor
+++ b/basis/windows/directx/d3d9/d3d9.factor
@@ -23,6 +23,8 @@ FUNCTION: BOOL D3DPERF_QueryRepeatFrame ( ) ;
FUNCTION: void D3DPERF_SetOptions ( DWORD dwOptions ) ;
FUNCTION: DWORD D3DPERF_GetStatus ( ) ;
+C-TYPE: IDirect3DDevice9
+
COM-INTERFACE: IDirect3D9 IUnknown {81BDCBCA-64D4-426d-AE8D-AD0147F4275C}
HRESULT RegisterSoftwareDevice ( void* pInitializeFunction )
UINT GetAdapterCount ( )
@@ -51,6 +53,17 @@ C-TYPE: IDirect3DVertexDeclaration9
C-TYPE: IDirect3DVertexShader9
C-TYPE: IDirect3DIndexBuffer9
C-TYPE: IDirect3DPixelShader9
+C-TYPE: IDirect3DSwapChain9
+C-TYPE: IDirect3DTexture9
+C-TYPE: IDirect3DVolumeTexture9
+C-TYPE: IDirect3DCubeTexture9
+C-TYPE: IDirect3DStateBlock9
+C-TYPE: IDirect3DQuery9
+C-TYPE: IDirect3DVolume9
+C-TYPE: IDirect3D9Ex
+C-TYPE: IDirect3DDevice9Ex
+C-TYPE: IDirect3DAuthenticatedChannel9
+C-TYPE: IDirect3DCryptoSession9
COM-INTERFACE: IDirect3DDevice9 IUnknown {D0223B96-BF7A-43fd-92BD-A43B0D82B9EB}
HRESULT TestCooperativeLevel ( )
diff --git a/basis/windows/directx/d3d9/platforms.txt b/basis/windows/directx/d3d9/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d9/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d9/tags.txt b/basis/windows/directx/d3d9/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d9/tags.txt
+++ b/basis/windows/directx/d3d9/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d9caps/platforms.txt b/basis/windows/directx/d3d9caps/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d9caps/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d9caps/tags.txt b/basis/windows/directx/d3d9caps/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d9caps/tags.txt
+++ b/basis/windows/directx/d3d9caps/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3d9types/d3d9types.factor b/basis/windows/directx/d3d9types/d3d9types.factor
index 9f4358f658..dc02849553 100644
--- a/basis/windows/directx/d3d9types/d3d9types.factor
+++ b/basis/windows/directx/d3d9types/d3d9types.factor
@@ -900,12 +900,6 @@ CONSTANT: D3DMULTISAMPLE_14_SAMPLES 14
CONSTANT: D3DMULTISAMPLE_15_SAMPLES 15
CONSTANT: D3DMULTISAMPLE_16_SAMPLES 16
CONSTANT: D3DMULTISAMPLE_FORCE_DWORD HEX: 7fffffff
-
-:: MAKEFOURCC ( ch0 ch1 ch2 ch3 -- n )
- ch3 HEX: ff bitand 24 shift
- ch2 HEX: ff bitand 16 shift
- ch1 HEX: ff bitand 8 shift
- ch0 HEX: ff bitand bitor bitor bitor ; inline
TYPEDEF: int D3DFORMAT
CONSTANT: D3DFMT_UNKNOWN 0
@@ -937,15 +931,15 @@ CONSTANT: D3DFMT_X8L8V8U8 62
CONSTANT: D3DFMT_Q8W8V8U8 63
CONSTANT: D3DFMT_V16U16 64
CONSTANT: D3DFMT_A2W10V10U10 67
-#! : D3DFMT_UYVY ( -- n ) 'U' 'Y' 'V' 'Y' MAKEFOURCC
-#! D3DFMT_R8G8_B8G8 = MAKEFOURCC('R', 'G', 'B', 'G'),
-#! D3DFMT_YUY2 = MAKEFOURCC('Y', 'U', 'Y', '2'),
-#! D3DFMT_G8R8_G8B8 = MAKEFOURCC('G', 'R', 'G', 'B'),
-#! D3DFMT_DXT1 = MAKEFOURCC('D', 'X', 'T', '1'),
-#! D3DFMT_DXT2 = MAKEFOURCC('D', 'X', 'T', '2'),
-#! D3DFMT_DXT3 = MAKEFOURCC('D', 'X', 'T', '3'),
-#! D3DFMT_DXT4 = MAKEFOURCC('D', 'X', 'T', '4'),
-#! D3DFMT_DXT5 = MAKEFOURCC('D', 'X', 'T', '5'),
+CONSTANT: D3DFMT_UYVY HEX: 55595659
+CONSTANT: D3DFMT_R8G8_B8G8 HEX: 52474247
+CONSTANT: D3DFMT_YUY2 HEX: 59555932
+CONSTANT: D3DFMT_G8R8_G8B8 HEX: 47524742
+CONSTANT: D3DFMT_DXT1 HEX: 44585431
+CONSTANT: D3DFMT_DXT2 HEX: 44585432
+CONSTANT: D3DFMT_DXT3 HEX: 44585433
+CONSTANT: D3DFMT_DXT4 HEX: 44585434
+CONSTANT: D3DFMT_DXT5 HEX: 44585435
CONSTANT: D3DFMT_D16_LOCKABLE 70
CONSTANT: D3DFMT_D32 71
CONSTANT: D3DFMT_D15S1 73
@@ -962,7 +956,7 @@ CONSTANT: D3DFMT_VERTEXDATA 100
CONSTANT: D3DFMT_INDEX16 101
CONSTANT: D3DFMT_INDEX32 102
CONSTANT: D3DFMT_Q16W16V16U16 110
-#! D3DFMT_MULTI2_ARGB8 = MAKEFOURCC('M', 'E', 'T', '1'),
+CONSTANT: D3DFMT_MULTI2_ARGB8 HEX: 4d455431
CONSTANT: D3DFMT_R16F 111
CONSTANT: D3DFMT_G16R16F 112
CONSTANT: D3DFMT_A16B16G16R16F 113
diff --git a/basis/windows/directx/d3d9types/platforms.txt b/basis/windows/directx/d3d9types/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3d9types/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3d9types/tags.txt b/basis/windows/directx/d3d9types/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3d9types/tags.txt
+++ b/basis/windows/directx/d3d9types/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dcommon/platforms.txt b/basis/windows/directx/d3dcommon/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dcommon/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dcommon/tags.txt b/basis/windows/directx/d3dcommon/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dcommon/tags.txt
+++ b/basis/windows/directx/d3dcommon/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dcompiler/platforms.txt b/basis/windows/directx/d3dcompiler/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dcompiler/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dcompiler/tags.txt b/basis/windows/directx/d3dcompiler/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dcompiler/tags.txt
+++ b/basis/windows/directx/d3dcompiler/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dcsx/platforms.txt b/basis/windows/directx/d3dcsx/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dcsx/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dcsx/tags.txt b/basis/windows/directx/d3dcsx/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dcsx/tags.txt
+++ b/basis/windows/directx/d3dcsx/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx10/platforms.txt b/basis/windows/directx/d3dx10/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx10/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx10/tags.txt b/basis/windows/directx/d3dx10/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx10/tags.txt
+++ b/basis/windows/directx/d3dx10/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx10async/d3dx10async.factor b/basis/windows/directx/d3dx10async/d3dx10async.factor
index e2165302f4..e7fbcf573e 100644
--- a/basis/windows/directx/d3dx10async/d3dx10async.factor
+++ b/basis/windows/directx/d3dx10async/d3dx10async.factor
@@ -1,5 +1,5 @@
-USING: alien.syntax windows.directx.d3d10 windows.directx.d3d10shader
-windows.types ;
+USING: alien.syntax windows.directx.d3d10 windows.directx.d3d10misc
+windows.directx.d3d10shader windows.directx.d3dx10core windows.types ;
IN: windows.directx.d3dx10async
LIBRARY: d3dx10
@@ -8,6 +8,7 @@ C-TYPE: ID3DX10ThreadPump
C-TYPE: ID3D10EffectPool
C-TYPE: D3DX10_IMAGE_LOAD_INFO
C-TYPE: D3DX10_IMAGE_INFO
+C-TYPE: ID3D10Effect
FUNCTION: HRESULT D3DX10CompileFromFileA ( LPCSTR pSrcFile, D3D10_SHADER_MACRO* pDefines, LPD3D10INCLUDE pInclude,
LPCSTR pFunctionName, LPCSTR pProfile, UINT Flags1, UINT Flags2, ID3DX10ThreadPump* pPump, ID3D10Blob** ppShader, ID3D10Blob** ppErrorMsgs, HRESULT* pHResult ) ;
diff --git a/basis/windows/directx/d3dx10async/platforms.txt b/basis/windows/directx/d3dx10async/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx10async/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx10async/tags.txt b/basis/windows/directx/d3dx10async/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx10async/tags.txt
+++ b/basis/windows/directx/d3dx10async/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx10core/platforms.txt b/basis/windows/directx/d3dx10core/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx10core/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx10core/tags.txt b/basis/windows/directx/d3dx10core/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx10core/tags.txt
+++ b/basis/windows/directx/d3dx10core/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx10math/platforms.txt b/basis/windows/directx/d3dx10math/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx10math/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx10math/tags.txt b/basis/windows/directx/d3dx10math/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx10math/tags.txt
+++ b/basis/windows/directx/d3dx10math/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx10mesh/platforms.txt b/basis/windows/directx/d3dx10mesh/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx10mesh/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx10mesh/tags.txt b/basis/windows/directx/d3dx10mesh/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx10mesh/tags.txt
+++ b/basis/windows/directx/d3dx10mesh/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx10tex/platforms.txt b/basis/windows/directx/d3dx10tex/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx10tex/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx10tex/tags.txt b/basis/windows/directx/d3dx10tex/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx10tex/tags.txt
+++ b/basis/windows/directx/d3dx10tex/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx11/platforms.txt b/basis/windows/directx/d3dx11/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx11/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx11/tags.txt b/basis/windows/directx/d3dx11/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx11/tags.txt
+++ b/basis/windows/directx/d3dx11/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx11async/d3dx11async.factor b/basis/windows/directx/d3dx11async/d3dx11async.factor
index 369ffd6683..bea30ecb1a 100644
--- a/basis/windows/directx/d3dx11async/d3dx11async.factor
+++ b/basis/windows/directx/d3dx11async/d3dx11async.factor
@@ -1,6 +1,6 @@
-USING: alien.syntax alien.c-types classes.struct windows.types
-windows.directx.d3d10shader windows.directx.d3dx11core
-windows.directx.d3d11 windows.directx.d3dx11tex ;
+USING: alien.syntax windows.directx.d3d10misc
+windows.directx.d3d10shader windows.directx.d3d11
+windows.directx.d3dx11core windows.directx.d3dx11tex windows.types ;
IN: windows.directx.d3dx11async
LIBRARY: d3dx11
diff --git a/basis/windows/directx/d3dx11async/platforms.txt b/basis/windows/directx/d3dx11async/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx11async/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx11async/tags.txt b/basis/windows/directx/d3dx11async/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx11async/tags.txt
+++ b/basis/windows/directx/d3dx11async/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx11core/platforms.txt b/basis/windows/directx/d3dx11core/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx11core/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx11core/tags.txt b/basis/windows/directx/d3dx11core/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx11core/tags.txt
+++ b/basis/windows/directx/d3dx11core/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx11tex/d3dx11tex.factor b/basis/windows/directx/d3dx11tex/d3dx11tex.factor
index d21fa0c72a..19425535e8 100644
--- a/basis/windows/directx/d3dx11tex/d3dx11tex.factor
+++ b/basis/windows/directx/d3dx11tex/d3dx11tex.factor
@@ -1,6 +1,6 @@
-USING: alien.syntax alien.c-types classes.struct windows.types
-windows.directx.dxgiformat windows.directx.d3d11
-windows.directx.d3dx11core ;
+USING: alien.c-types alien.syntax classes.struct
+windows.directx.d3d10misc windows.directx.d3d11
+windows.directx.d3dx11core windows.directx.dxgiformat windows.types ;
IN: windows.directx.d3dx11tex
LIBRARY: d3dx11
diff --git a/basis/windows/directx/d3dx11tex/platforms.txt b/basis/windows/directx/d3dx11tex/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx11tex/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx11tex/tags.txt b/basis/windows/directx/d3dx11tex/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx11tex/tags.txt
+++ b/basis/windows/directx/d3dx11tex/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9/platforms.txt b/basis/windows/directx/d3dx9/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9/tags.txt b/basis/windows/directx/d3dx9/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9/tags.txt
+++ b/basis/windows/directx/d3dx9/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9anim/platforms.txt b/basis/windows/directx/d3dx9anim/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9anim/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9anim/tags.txt b/basis/windows/directx/d3dx9anim/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9anim/tags.txt
+++ b/basis/windows/directx/d3dx9anim/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9core/platforms.txt b/basis/windows/directx/d3dx9core/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9core/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9core/tags.txt b/basis/windows/directx/d3dx9core/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9core/tags.txt
+++ b/basis/windows/directx/d3dx9core/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9effect/platforms.txt b/basis/windows/directx/d3dx9effect/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9effect/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9effect/tags.txt b/basis/windows/directx/d3dx9effect/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9effect/tags.txt
+++ b/basis/windows/directx/d3dx9effect/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9math/platforms.txt b/basis/windows/directx/d3dx9math/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9math/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9math/tags.txt b/basis/windows/directx/d3dx9math/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9math/tags.txt
+++ b/basis/windows/directx/d3dx9math/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9mesh/platforms.txt b/basis/windows/directx/d3dx9mesh/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9mesh/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9mesh/tags.txt b/basis/windows/directx/d3dx9mesh/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9mesh/tags.txt
+++ b/basis/windows/directx/d3dx9mesh/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9shader/platforms.txt b/basis/windows/directx/d3dx9shader/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9shader/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9shader/tags.txt b/basis/windows/directx/d3dx9shader/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9shader/tags.txt
+++ b/basis/windows/directx/d3dx9shader/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9shape/platforms.txt b/basis/windows/directx/d3dx9shape/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9shape/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9shape/tags.txt b/basis/windows/directx/d3dx9shape/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9shape/tags.txt
+++ b/basis/windows/directx/d3dx9shape/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9tex/platforms.txt b/basis/windows/directx/d3dx9tex/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9tex/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9tex/tags.txt b/basis/windows/directx/d3dx9tex/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9tex/tags.txt
+++ b/basis/windows/directx/d3dx9tex/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/d3dx9xof/platforms.txt b/basis/windows/directx/d3dx9xof/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/d3dx9xof/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/d3dx9xof/tags.txt b/basis/windows/directx/d3dx9xof/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/d3dx9xof/tags.txt
+++ b/basis/windows/directx/d3dx9xof/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/dcommon/platforms.txt b/basis/windows/directx/dcommon/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/dcommon/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/dcommon/tags.txt b/basis/windows/directx/dcommon/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/dcommon/tags.txt
+++ b/basis/windows/directx/dcommon/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/dinput/constants/constants.factor b/basis/windows/directx/dinput/constants/constants.factor
index 26f9da00ec..ba4d750174 100644
--- a/basis/windows/directx/dinput/constants/constants.factor
+++ b/basis/windows/directx/dinput/constants/constants.factor
@@ -72,10 +72,7 @@ M: array array-base-type first ;
call swap set-global ; inline
: (malloc-guid-symbol) ( symbol guid -- )
- '[
- _ execute( -- value )
- [ byte-length malloc ] [ over byte-array>memory ] bi
- ] initialize ;
+ '[ _ execute( -- value ) malloc-byte-array ] initialize ;
: define-guid-constants ( -- )
{
diff --git a/basis/windows/directx/dinput/constants/platforms.txt b/basis/windows/directx/dinput/constants/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/dinput/constants/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/dinput/constants/tags.txt b/basis/windows/directx/dinput/constants/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/directx/dinput/constants/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/directx/dinput/platforms.txt b/basis/windows/directx/dinput/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/dinput/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/dinput/tags.txt b/basis/windows/directx/dinput/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/dinput/tags.txt
+++ b/basis/windows/directx/dinput/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/dwrite/platforms.txt b/basis/windows/directx/dwrite/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/dwrite/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/dwrite/tags.txt b/basis/windows/directx/dwrite/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/dwrite/tags.txt
+++ b/basis/windows/directx/dwrite/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/dxfile/platforms.txt b/basis/windows/directx/dxfile/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/dxfile/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/dxfile/tags.txt b/basis/windows/directx/dxfile/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/dxfile/tags.txt
+++ b/basis/windows/directx/dxfile/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/dxgi/dxgi.factor b/basis/windows/directx/dxgi/dxgi.factor
index 6537de885f..5d2ae5b990 100644
--- a/basis/windows/directx/dxgi/dxgi.factor
+++ b/basis/windows/directx/dxgi/dxgi.factor
@@ -119,6 +119,7 @@ COM-INTERFACE: IDXGISurface1 IDXGISurface {4AE63092-6327-4c1b-80AE-BFE12EA32B86}
HRESULT GetDC ( BOOL Discard, HDC* phdc )
HRESULT ReleaseDC ( RECT* pDirtyRect ) ;
+C-TYPE: IDXGIOutput
COM-INTERFACE: IDXGIAdapter IDXGIObject {2411e7e1-12ac-4ccf-bd14-9798e8534dc0}
HRESULT EnumOutputs ( UINT Output, IDXGIOutput** ppOutput )
HRESULT GetDesc ( DXGI_ADAPTER_DESC* pDesc )
@@ -201,13 +202,13 @@ STRUCT: DXGI_DISPLAY_COLOR_SPACE
{ PrimaryCoordinates FLOAT[8][2] }
{ WhitePoints FLOAT[16][2] } ;
+COM-INTERFACE: IDXGIAdapter1 IDXGIAdapter {29038f61-3839-4626-91fd-086879011a05}
+HRESULT GetDesc1 ( DXGI_ADAPTER_DESC1* pDesc ) ;
+
COM-INTERFACE: IDXGIFactory1 IDXGIFactory {770aae78-f26f-4dba-a829-253c83d1b387}
HRESULT EnumAdapters1 ( UINT Adapter, IDXGIAdapter1** ppAdapter )
BOOL IsCurrent ( ) ;
-COM-INTERFACE: IDXGIAdapter1 IDXGIAdapter {29038f61-3839-4626-91fd-086879011a05}
-HRESULT GetDesc1 ( DXGI_ADAPTER_DESC1* pDesc ) ;
-
COM-INTERFACE: IDXGIDevice1 IDXGIDevice {77db970f-6276-48ba-ba28-070143b4392c}
HRESULT SetMaximumFrameLatency ( UINT MaxLatency )
HRESULT GetMaximumFrameLatency ( UINT* pMaxLatency ) ;
diff --git a/basis/windows/directx/dxgi/platforms.txt b/basis/windows/directx/dxgi/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/dxgi/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/dxgi/tags.txt b/basis/windows/directx/dxgi/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/dxgi/tags.txt
+++ b/basis/windows/directx/dxgi/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/dxgiformat/platforms.txt b/basis/windows/directx/dxgiformat/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/dxgiformat/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/dxgiformat/tags.txt b/basis/windows/directx/dxgiformat/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/dxgiformat/tags.txt
+++ b/basis/windows/directx/dxgiformat/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/dxgitype/platforms.txt b/basis/windows/directx/dxgitype/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/dxgitype/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/dxgitype/tags.txt b/basis/windows/directx/dxgitype/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/dxgitype/tags.txt
+++ b/basis/windows/directx/dxgitype/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/x3daudio/platforms.txt b/basis/windows/directx/x3daudio/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/x3daudio/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/x3daudio/tags.txt b/basis/windows/directx/x3daudio/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/x3daudio/tags.txt
+++ b/basis/windows/directx/x3daudio/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/xact3/platforms.txt b/basis/windows/directx/xact3/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/xact3/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/xact3/tags.txt b/basis/windows/directx/xact3/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/xact3/tags.txt
+++ b/basis/windows/directx/xact3/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/xapo/platforms.txt b/basis/windows/directx/xapo/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/xapo/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/xapo/tags.txt b/basis/windows/directx/xapo/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/xapo/tags.txt
+++ b/basis/windows/directx/xapo/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/xapofx/platforms.txt b/basis/windows/directx/xapofx/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/xapofx/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/xapofx/tags.txt b/basis/windows/directx/xapofx/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/xapofx/tags.txt
+++ b/basis/windows/directx/xapofx/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/xapofx/xapofx.factor b/basis/windows/directx/xapofx/xapofx.factor
index 1255880c4c..594ad9ecbe 100644
--- a/basis/windows/directx/xapofx/xapofx.factor
+++ b/basis/windows/directx/xapofx/xapofx.factor
@@ -1,5 +1,5 @@
-USING: alien.c-types alien.syntax classes.struct windows.ole32
-windows.types ;
+USING: alien.c-types alien.syntax classes.struct windows.com
+windows.ole32 windows.types ;
IN: windows.directx.xapofx
LIBRARY: xapofx
diff --git a/basis/windows/directx/xaudio2/platforms.txt b/basis/windows/directx/xaudio2/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/xaudio2/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/xaudio2/tags.txt b/basis/windows/directx/xaudio2/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/xaudio2/tags.txt
+++ b/basis/windows/directx/xaudio2/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/xaudio2/xaudio2.factor b/basis/windows/directx/xaudio2/xaudio2.factor
index 67a9234367..303eaf26b1 100644
--- a/basis/windows/directx/xaudio2/xaudio2.factor
+++ b/basis/windows/directx/xaudio2/xaudio2.factor
@@ -203,6 +203,9 @@ CONSTANT: XAUDIO2_LOG_STREAMING HEX: 1000
C-TYPE: IXAudio2EngineCallback
C-TYPE: IXAudio2VoiceCallback
+C-TYPE: IXAudio2SourceVoice
+C-TYPE: IXAudio2SubmixVoice
+C-TYPE: IXAudio2MasteringVoice
COM-INTERFACE: IXAudio2 IUnknown {8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb}
HRESULT GetDeviceCount ( UINT32* pCount )
diff --git a/basis/windows/directx/xaudio2fx/platforms.txt b/basis/windows/directx/xaudio2fx/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/xaudio2fx/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/xaudio2fx/tags.txt b/basis/windows/directx/xaudio2fx/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/xaudio2fx/tags.txt
+++ b/basis/windows/directx/xaudio2fx/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/directx/xinput/platforms.txt b/basis/windows/directx/xinput/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/directx/xinput/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/directx/xinput/tags.txt b/basis/windows/directx/xinput/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/directx/xinput/tags.txt
+++ b/basis/windows/directx/xinput/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/dragdrop-listener/tags.txt b/basis/windows/dragdrop-listener/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/dragdrop-listener/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/dwmapi/platforms.txt b/basis/windows/dwmapi/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/dwmapi/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/dwmapi/tags.txt b/basis/windows/dwmapi/tags.txt
index 43bc035447..8e1a55995e 100755
--- a/basis/windows/dwmapi/tags.txt
+++ b/basis/windows/dwmapi/tags.txt
@@ -1,2 +1 @@
windows
-unportable
diff --git a/basis/windows/errors/errors.factor b/basis/windows/errors/errors.factor
index a7a41433f7..c5dedb090a 100644
--- a/basis/windows/errors/errors.factor
+++ b/basis/windows/errors/errors.factor
@@ -5,6 +5,12 @@ arrays literals windows.types specialized-arrays ;
SPECIALIZED-ARRAY: TCHAR
IN: windows.errors
+CONSTANT: APPLICATION_ERROR_MASK HEX: 20000000
+CONSTANT: ERROR_SEVERITY_SUCCESS HEX: 00000000
+CONSTANT: ERROR_SEVERITY_INFORMATIONAL HEX: 40000000
+CONSTANT: ERROR_SEVERITY_WARNING HEX: 80000000
+CONSTANT: ERROR_SEVERITY_ERROR HEX: C0000000
+
CONSTANT: ERROR_SUCCESS 0
CONSTANT: ERROR_INVALID_FUNCTION 1
CONSTANT: ERROR_FILE_NOT_FOUND 2
diff --git a/basis/windows/errors/platforms.txt b/basis/windows/errors/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/errors/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/errors/tags.txt b/basis/windows/errors/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/errors/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/fonts/platforms.txt b/basis/windows/fonts/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/fonts/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/fonts/tags.txt b/basis/windows/fonts/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/fonts/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/gdi32/platforms.txt b/basis/windows/gdi32/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/gdi32/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/gdi32/tags.txt b/basis/windows/gdi32/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/gdi32/tags.txt
+++ b/basis/windows/gdi32/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/kernel32/kernel32.factor b/basis/windows/kernel32/kernel32.factor
index 80f50ef2b0..c2622cbf48 100644
--- a/basis/windows/kernel32/kernel32.factor
+++ b/basis/windows/kernel32/kernel32.factor
@@ -1,7 +1,7 @@
! Copyright (C) 2005, 2006 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: alien alien.c-types alien.syntax kernel windows.types
-multiline classes.struct ;
+math multiline classes.struct ;
IN: windows.kernel32
CONSTANT: MAX_PATH 260
@@ -90,6 +90,8 @@ CONSTANT: FILE_ACTION_MODIFIED 3
CONSTANT: FILE_ACTION_RENAMED_OLD_NAME 4
CONSTANT: FILE_ACTION_RENAMED_NEW_NAME 5
+CONSTANT: DONT_RESOLVE_DLL_REFERENCES 1
+
STRUCT: FILE_NOTIFY_INFORMATION
{ NextEntryOffset DWORD }
{ Action DWORD }
@@ -787,6 +789,30 @@ CONSTANT: STATUS_CONTROL_C_EXIT HEX: C000013A
CONSTANT: STATUS_FLOAT_MULTIPLE_FAULTS HEX: C00002B4
CONSTANT: STATUS_FLOAT_MULTIPLE_TRAPS HEX: C00002B5
+! Resource IDs
+: MAKEINTRESOURCE ( int -- resource ) HEX: ffff bitand ; inline
+
+: RT_CURSOR ( -- id ) 1 MAKEINTRESOURCE ; inline
+: RT_BITMAP ( -- id ) 2 MAKEINTRESOURCE ; inline
+: RT_ICON ( -- id ) 3 MAKEINTRESOURCE ; inline
+: RT_MENU ( -- id ) 4 MAKEINTRESOURCE ; inline
+: RT_DIALOG ( -- id ) 5 MAKEINTRESOURCE ; inline
+: RT_STRING ( -- id ) 6 MAKEINTRESOURCE ; inline
+: RT_FONTDIR ( -- id ) 7 MAKEINTRESOURCE ; inline
+: RT_FONT ( -- id ) 8 MAKEINTRESOURCE ; inline
+: RT_ACCELERATOR ( -- id ) 9 MAKEINTRESOURCE ; inline
+: RT_RCDATA ( -- id ) 10 MAKEINTRESOURCE ; inline
+: RT_MESSAGETABLE ( -- id ) 11 MAKEINTRESOURCE ; inline
+: RT_GROUP_CURSOR ( -- id ) 12 MAKEINTRESOURCE ; inline
+: RT_GROUP_ICON ( -- id ) 14 MAKEINTRESOURCE ; inline
+: RT_VERSION ( -- id ) 16 MAKEINTRESOURCE ; inline
+: RT_DLGINCLUDE ( -- id ) 17 MAKEINTRESOURCE ; inline
+: RT_PLUGPLAY ( -- id ) 19 MAKEINTRESOURCE ; inline
+: RT_VXD ( -- id ) 20 MAKEINTRESOURCE ; inline
+: RT_ANICURSOR ( -- id ) 21 MAKEINTRESOURCE ; inline
+: RT_ANIICON ( -- id ) 22 MAKEINTRESOURCE ; inline
+: RT_MANIFEST ( -- id ) 24 MAKEINTRESOURCE ; inline
+
LIBRARY: kernel32
! FUNCTION: _hread
! FUNCTION: _hwrite
@@ -826,7 +852,8 @@ FUNCTION: BOOL AllocConsole ( ) ;
! FUNCTION: BaseUpdateAppcompatCache
! FUNCTION: Beep
! FUNCTION: BeginUpdateResourceA
-! FUNCTION: BeginUpdateResourceW
+FUNCTION: HANDLE BeginUpdateResourceW ( LPCTSTR pFileName, BOOL bDeleteExistingResources ) ;
+ALIAS: BeginUpdateResource BeginUpdateResourceW
! FUNCTION: BindIoCompletionCallback
! FUNCTION: BuildCommDCBA
! FUNCTION: BuildCommDCBAndTimeoutsA
@@ -1013,7 +1040,8 @@ CONSTANT: DUPLICATE_SAME_ACCESS 2
! FUNCTION: EncodePointer
! FUNCTION: EncodeSystemPointer
! FUNCTION: EndUpdateResourceA
-! FUNCTION: EndUpdateResourceW
+FUNCTION: BOOL EndUpdateResourceW ( HANDLE hUpdate, BOOL fDiscard ) ;
+ALIAS: EndUpdateResource EndUpdateResourceW
! FUNCTION: EnterCriticalSection
! FUNCTION: EnumCalendarInfoA
! FUNCTION: EnumCalendarInfoExA
@@ -1141,7 +1169,7 @@ FUNCTION: BOOL FreeConsole ( ) ;
! FUNCTION: FreeEnvironmentStringsA
FUNCTION: BOOL FreeEnvironmentStringsW ( LPTCH lpszEnvironmentBlock ) ;
ALIAS: FreeEnvironmentStrings FreeEnvironmentStringsW
-! FUNCTION: FreeLibrary
+FUNCTION: BOOL FreeLibrary ( HMODULE hModule ) ;
! FUNCTION: FreeLibraryAndExitThread
! FUNCTION: FreeResource
! FUNCTION: FreeUserPhysicalPages
@@ -1288,7 +1316,8 @@ FUNCTION: DWORD GetLogicalDrives ( ) ;
! FUNCTION: GetLongPathNameW
! FUNCTION: GetMailslotInfo
! FUNCTION: GetModuleFileNameA
-! FUNCTION: GetModuleFileNameW
+FUNCTION: DWORD GetModuleFileNameW ( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ) ;
+ALIAS: GetModuleFileName GetModuleFileNameW
FUNCTION: HMODULE GetModuleHandleW ( LPCWSTR lpModuleName ) ;
ALIAS: GetModuleHandle GetModuleHandleW
! FUNCTION: GetModuleHandleExA
@@ -1323,7 +1352,7 @@ FUNCTION: DWORD GetPriorityClass ( HANDLE hProcess ) ;
! FUNCTION: GetPrivateProfileStringW
! FUNCTION: GetPrivateProfileStructA
! FUNCTION: GetPrivateProfileStructW
-FUNCTION: LPVOID GetProcAddress ( HMODULE hModule, char* lpProcName ) ;
+FUNCTION: LPVOID GetProcAddress ( HMODULE hModule, c-string lpProcName ) ;
! FUNCTION: GetProcessAffinityMask
! FUNCTION: GetProcessHandleCount
! FUNCTION: GetProcessHeap
@@ -1831,7 +1860,8 @@ FUNCTION: BOOL UnmapViewOfFile ( LPCVOID lpBaseAddress ) ;
! FUNCTION: UnregisterWait
! FUNCTION: UnregisterWaitEx
! FUNCTION: UpdateResourceA
-! FUNCTION: UpdateResourceW
+FUNCTION: BOOL UpdateResourceW ( HANDLE hUpdate, LPCTSTR lpType, LPCTSTR lpName, WORD wLanguage, LPVOID lpData, DWORD cbData ) ;
+ALIAS: UpdateResource UpdateResourceW
! FUNCTION: UTRegister
! FUNCTION: UTUnRegister
! FUNCTION: ValidateLCType
diff --git a/basis/windows/kernel32/platforms.txt b/basis/windows/kernel32/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/kernel32/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/kernel32/tags.txt b/basis/windows/kernel32/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/kernel32/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/messages/platforms.txt b/basis/windows/messages/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/messages/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/messages/tags.txt b/basis/windows/messages/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/messages/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/nt/platforms.txt b/basis/windows/nt/platforms.txt
new file mode 100644
index 0000000000..205e64323d
--- /dev/null
+++ b/basis/windows/nt/platforms.txt
@@ -0,0 +1 @@
+winnt
diff --git a/basis/windows/nt/tags.txt b/basis/windows/nt/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/nt/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/offscreen/platforms.txt b/basis/windows/offscreen/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/offscreen/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/offscreen/tags.txt b/basis/windows/offscreen/tags.txt
deleted file mode 100755
index 6abe115b12..0000000000
--- a/basis/windows/offscreen/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/ole32/ole32.factor b/basis/windows/ole32/ole32.factor
index 6e90cae89a..538a142878 100644
--- a/basis/windows/ole32/ole32.factor
+++ b/basis/windows/ole32/ole32.factor
@@ -10,8 +10,8 @@ LIBRARY: ole32
TYPEDEF: GUID* REFGUID
TYPEDEF: void* LPUNKNOWN
-TYPEDEF: wchar_t* LPOLESTR
-TYPEDEF: wchar_t* LPCOLESTR
+TYPEDEF: LPWSTR LPOLESTR
+TYPEDEF: LPWSTR LPCOLESTR
TYPEDEF: REFGUID LPGUID
TYPEDEF: REFGUID REFIID
diff --git a/basis/windows/ole32/platforms.txt b/basis/windows/ole32/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/ole32/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/ole32/tags.txt b/basis/windows/ole32/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/ole32/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/opengl32/opengl32.factor b/basis/windows/opengl32/opengl32.factor
index 63f705263c..32e067a200 100644
--- a/basis/windows/opengl32/opengl32.factor
+++ b/basis/windows/opengl32/opengl32.factor
@@ -57,7 +57,7 @@ FUNCTION: BOOL wglMakeCurrent ( HDC hDC, HGLRC hglrc ) ;
! WGL_ARB_extensions_string extension
-GL-FUNCTION: char* wglGetExtensionsStringARB { } ( HDC hDC ) ;
+GL-FUNCTION: c-string wglGetExtensionsStringARB { } ( HDC hDC ) ;
! WGL_ARB_pixel_format extension
diff --git a/basis/windows/opengl32/platforms.txt b/basis/windows/opengl32/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/opengl32/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/opengl32/tags.txt b/basis/windows/opengl32/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/opengl32/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/platforms.txt b/basis/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/psapi/platforms.txt b/basis/windows/psapi/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/psapi/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/psapi/tags.txt b/basis/windows/psapi/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/psapi/tags.txt
+++ b/basis/windows/psapi/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/shell32/platforms.txt b/basis/windows/shell32/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/shell32/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/shell32/shell32.factor b/basis/windows/shell32/shell32.factor
index 08474d4bdd..30104e7723 100644
--- a/basis/windows/shell32/shell32.factor
+++ b/basis/windows/shell32/shell32.factor
@@ -87,9 +87,6 @@ ALIAS: SHGetFolderPath SHGetFolderPathW
FUNCTION: HINSTANCE ShellExecuteW ( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ) ;
ALIAS: ShellExecute ShellExecuteW
-: open-in-explorer ( dir -- )
- [ f "open" ] dip absolute-path f f SW_SHOWNORMAL ShellExecute drop ;
-
: shell32-directory ( n -- str )
f swap f SHGFP_TYPE_DEFAULT
MAX_UNICODE_PATH
diff --git a/basis/windows/shell32/tags.txt b/basis/windows/shell32/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/shell32/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/tags.txt b/basis/windows/tags.txt
index 2320bdd648..bb863cf9a0 100755
--- a/basis/windows/tags.txt
+++ b/basis/windows/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/time/platforms.txt b/basis/windows/time/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/time/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/time/tags.txt b/basis/windows/time/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/time/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/types/platforms.txt b/basis/windows/types/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/types/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/types/tags.txt b/basis/windows/types/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/types/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/types/types.factor b/basis/windows/types/types.factor
index 9e322d9cde..e2e4b113a4 100644
--- a/basis/windows/types/types.factor
+++ b/basis/windows/types/types.factor
@@ -11,11 +11,6 @@ TYPEDEF: uchar UCHAR
TYPEDEF: uchar BYTE
TYPEDEF: ushort wchar_t
-SYMBOL: wchar_t*
-<<
-{ char* utf16n } \ wchar_t* typedef
-\ wchar_t \ wchar_t* "pointer-c-type" set-word-prop
->>
TYPEDEF: wchar_t WCHAR
@@ -74,8 +69,8 @@ TYPEDEF: ULARGE_INTEGER* PULARGE_INTEGER
TYPEDEF: size_t SIZE_T
TYPEDEF: ptrdiff_t SSIZE_T
-TYPEDEF: wchar_t* LPCSTR
-TYPEDEF: wchar_t* LPWSTR
+TYPEDEF: { c-string utf16n } LPCSTR
+TYPEDEF: { c-string utf16n } LPWSTR
TYPEDEF: WCHAR TCHAR
TYPEDEF: LPWSTR LPTCH
TYPEDEF: LPWSTR PTCH
@@ -129,14 +124,14 @@ TYPEDEF: DWORD LGRPID
TYPEDEF: LONG_PTR LPARAM
TYPEDEF: BOOL* LPBOOL
TYPEDEF: BYTE* LPBYTE
-TYPEDEF: WCHAR* LPCWSTR
+TYPEDEF: { c-string utf16n } LPCWSTR
! TYPEDEF: WCHAR* LPWSTR
-TYPEDEF: WCHAR* LPSTR
-TYPEDEF: wchar_t* LPCTSTR
-TYPEDEF: wchar_t* LPWTSTR
+TYPEDEF: { c-string utf16n } LPSTR
+TYPEDEF: { c-string utf16n } LPCTSTR
+TYPEDEF: { c-string utf16n } LPWTSTR
-TYPEDEF: wchar_t* LPTSTR
+TYPEDEF: { c-string utf16n } LPTSTR
TYPEDEF: LPCSTR PCTSTR
TYPEDEF: LPSTR PTSTR
@@ -149,7 +144,7 @@ TYPEDEF: BOOLEAN* PBOOLEAN
TYPEDEF: BYTE* PBYTE
TYPEDEF: CHAR* PCHAR
TYPEDEF: CHAR* PCSTR
-TYPEDEF: WCHAR* PCWSTR
+TYPEDEF: { c-string utf16n } PCWSTR
TYPEDEF: DWORD* PDWORD
TYPEDEF: DWORDLONG* PDWORDLONG
TYPEDEF: DWORD_PTR* PDWORD_PTR
@@ -186,9 +181,9 @@ TYPEDEF: ULONG_PTR* PULONG_PTR
TYPEDEF: ULONG32* PULONG32
TYPEDEF: ULONG64* PULONG64
TYPEDEF: USHORT* PUSHORT
-TYPEDEF: WCHAR* PWCHAR
+TYPEDEF: { c-string utf16n } PWCHAR
TYPEDEF: WORD* PWORD
-TYPEDEF: WCHAR* PWSTR
+TYPEDEF: { c-string utf16n } PWSTR
TYPEDEF: HANDLE SC_HANDLE
TYPEDEF: LPVOID SC_LOCK
TYPEDEF: HANDLE SERVICE_STATUS_HANDLE
@@ -354,7 +349,7 @@ STRUCT: LVITEM
STRUCT: LVFINDINFO
{ flags uint }
- { psz char* }
+ { psz c-string }
{ lParam long }
{ pt POINT }
{ vkDirection uint } ;
diff --git a/basis/windows/uniscribe/platforms.txt b/basis/windows/uniscribe/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/uniscribe/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/uniscribe/tags.txt b/basis/windows/uniscribe/tags.txt
deleted file mode 100755
index 6abe115b12..0000000000
--- a/basis/windows/uniscribe/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/uniscribe/uniscribe.factor b/basis/windows/uniscribe/uniscribe.factor
index 87540dc24f..2783840df0 100644
--- a/basis/windows/uniscribe/uniscribe.factor
+++ b/basis/windows/uniscribe/uniscribe.factor
@@ -82,7 +82,6 @@ TUPLE: script-string < disposable font string metrics ssa size image ;
: script-string-size ( script-string -- dim )
ssa>> ScriptString_pSize
dup win32-error=0/f
- SIZE memory>struct
[ cx>> ] [ cy>> ] bi 2array ;
: dc-metrics ( dc -- metrics )
diff --git a/basis/windows/user32/platforms.txt b/basis/windows/user32/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/user32/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/user32/tags.txt b/basis/windows/user32/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/user32/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/user32/user32.factor b/basis/windows/user32/user32.factor
index 15eb9ba2f5..b9d5cc95c4 100644
--- a/basis/windows/user32/user32.factor
+++ b/basis/windows/user32/user32.factor
@@ -608,6 +608,150 @@ CONSTANT: MF_HELP HEX: 4000
CONSTANT: MF_RIGHTJUSTIFY HEX: 4000
CONSTANT: MF_MOUSESELECT HEX: 8000
+CONSTANT: SPI_GETBEEP 1
+CONSTANT: SPI_SETBEEP 2
+CONSTANT: SPI_GETMOUSE 3
+CONSTANT: SPI_SETMOUSE 4
+CONSTANT: SPI_GETBORDER 5
+CONSTANT: SPI_SETBORDER 6
+CONSTANT: SPI_GETKEYBOARDSPEED 10
+CONSTANT: SPI_SETKEYBOARDSPEED 11
+CONSTANT: SPI_LANGDRIVER 12
+CONSTANT: SPI_ICONHORIZONTALSPACING 13
+CONSTANT: SPI_GETSCREENSAVETIMEOUT 14
+CONSTANT: SPI_SETSCREENSAVETIMEOUT 15
+CONSTANT: SPI_GETSCREENSAVEACTIVE 16
+CONSTANT: SPI_SETSCREENSAVEACTIVE 17
+CONSTANT: SPI_GETGRIDGRANULARITY 18
+CONSTANT: SPI_SETGRIDGRANULARITY 19
+CONSTANT: SPI_SETDESKWALLPAPER 20
+CONSTANT: SPI_SETDESKPATTERN 21
+CONSTANT: SPI_GETKEYBOARDDELAY 22
+CONSTANT: SPI_SETKEYBOARDDELAY 23
+CONSTANT: SPI_ICONVERTICALSPACING 24
+CONSTANT: SPI_GETICONTITLEWRAP 25
+CONSTANT: SPI_SETICONTITLEWRAP 26
+CONSTANT: SPI_GETMENUDROPALIGNMENT 27
+CONSTANT: SPI_SETMENUDROPALIGNMENT 28
+CONSTANT: SPI_SETDOUBLECLKWIDTH 29
+CONSTANT: SPI_SETDOUBLECLKHEIGHT 30
+CONSTANT: SPI_GETICONTITLELOGFONT 31
+CONSTANT: SPI_SETDOUBLECLICKTIME 32
+CONSTANT: SPI_SETMOUSEBUTTONSWAP 33
+CONSTANT: SPI_SETICONTITLELOGFONT 34
+CONSTANT: SPI_GETFASTTASKSWITCH 35
+CONSTANT: SPI_SETFASTTASKSWITCH 36
+CONSTANT: SPI_SETDRAGFULLWINDOWS 37
+CONSTANT: SPI_GETDRAGFULLWINDOWS 38
+
+CONSTANT: SPI_GETFILTERKEYS 50
+CONSTANT: SPI_SETFILTERKEYS 51
+CONSTANT: SPI_GETTOGGLEKEYS 52
+CONSTANT: SPI_SETTOGGLEKEYS 53
+CONSTANT: SPI_GETMOUSEKEYS 54
+CONSTANT: SPI_SETMOUSEKEYS 55
+CONSTANT: SPI_GETSHOWSOUNDS 56
+CONSTANT: SPI_SETSHOWSOUNDS 57
+CONSTANT: SPI_GETSTICKYKEYS 58
+CONSTANT: SPI_SETSTICKYKEYS 59
+CONSTANT: SPI_GETACCESSTIMEOUT 60
+CONSTANT: SPI_SETACCESSTIMEOUT 61
+
+CONSTANT: SPI_GETSOUNDSENTRY 64
+CONSTANT: SPI_SETSOUNDSENTRY 65
+
+! WINVER >= 0x0400
+CONSTANT: SPI_GETNONCLIENTMETRICS 41
+CONSTANT: SPI_SETNONCLIENTMETRICS 42
+CONSTANT: SPI_GETMINIMIZEDMETRICS 43
+CONSTANT: SPI_SETMINIMIZEDMETRICS 44
+CONSTANT: SPI_GETICONMETRICS 45
+CONSTANT: SPI_SETICONMETRICS 46
+CONSTANT: SPI_SETWORKAREA 47
+CONSTANT: SPI_GETWORKAREA 48
+CONSTANT: SPI_SETPENWINDOWS 49
+
+CONSTANT: SPI_GETSERIALKEYS 62
+CONSTANT: SPI_SETSERIALKEYS 63
+CONSTANT: SPI_GETHIGHCONTRAST 66
+CONSTANT: SPI_SETHIGHCONTRAST 67
+CONSTANT: SPI_GETKEYBOARDPREF 68
+CONSTANT: SPI_SETKEYBOARDPREF 69
+CONSTANT: SPI_GETSCREENREADER 70
+CONSTANT: SPI_SETSCREENREADER 71
+CONSTANT: SPI_GETANIMATION 72
+CONSTANT: SPI_SETANIMATION 73
+CONSTANT: SPI_GETFONTSMOOTHING 74
+CONSTANT: SPI_SETFONTSMOOTHING 75
+CONSTANT: SPI_SETDRAGWIDTH 76
+CONSTANT: SPI_SETDRAGHEIGHT 77
+CONSTANT: SPI_SETHANDHELD 78
+CONSTANT: SPI_GETLOWPOWERTIMEOUT 79
+CONSTANT: SPI_GETPOWEROFFTIMEOUT 80
+CONSTANT: SPI_SETLOWPOWERTIMEOUT 81
+CONSTANT: SPI_SETPOWEROFFTIMEOUT 82
+CONSTANT: SPI_GETLOWPOWERACTIVE 83
+CONSTANT: SPI_GETPOWEROFFACTIVE 84
+CONSTANT: SPI_SETLOWPOWERACTIVE 85
+CONSTANT: SPI_SETPOWEROFFACTIVE 86
+CONSTANT: SPI_SETCURSORS 87
+CONSTANT: SPI_SETICONS 88
+CONSTANT: SPI_GETDEFAULTINPUTLANG 89
+CONSTANT: SPI_SETDEFAULTINPUTLANG 90
+CONSTANT: SPI_SETLANGTOGGLE 91
+CONSTANT: SPI_GETWINDOWSEXTENSION 92
+CONSTANT: SPI_SETMOUSETRAILS 93
+CONSTANT: SPI_GETMOUSETRAILS 94
+CONSTANT: SPI_SETSCREENSAVERRUNNING 97
+ALIAS: SPI_SCREENSAVERRUNNING SPI_SETSCREENSAVERRUNNING
+
+! WIN32_WINNT >= 0x0400 || WIN32_WINDOWS > 0x0400
+CONSTANT: SPI_GETMOUSEHOVERWIDTH 98
+CONSTANT: SPI_SETMOUSEHOVERWIDTH 99
+CONSTANT: SPI_GETMOUSEHOVERHEIGHT 100
+CONSTANT: SPI_SETMOUSEHOVERHEIGHT 101
+CONSTANT: SPI_GETMOUSEHOVERTIME 102
+CONSTANT: SPI_SETMOUSEHOVERTIME 103
+CONSTANT: SPI_GETWHEELSCROLLLINES 104
+CONSTANT: SPI_SETWHEELSCROLLLINES 105
+
+CONSTANT: SPI_GETSHOWIMEUI 110
+CONSTANT: SPI_SETSHOWIMEUI 111
+
+! WINVER >= 0x0500
+CONSTANT: SPI_GETMOUSESPEED 112
+CONSTANT: SPI_SETMOUSESPEED 113
+CONSTANT: SPI_GETSCREENSAVERRUNNING 114
+
+CONSTANT: SPI_GETACTIVEWINDOWTRACKING HEX: 1000
+CONSTANT: SPI_SETACTIVEWINDOWTRACKING HEX: 1001
+CONSTANT: SPI_GETMENUANIMATION HEX: 1002
+CONSTANT: SPI_SETMENUANIMATION HEX: 1003
+CONSTANT: SPI_GETCOMBOBOXANIMATION HEX: 1004
+CONSTANT: SPI_SETCOMBOBOXANIMATION HEX: 1005
+CONSTANT: SPI_GETLISTBOXSMOOTHSCROLLING HEX: 1006
+CONSTANT: SPI_SETLISTBOXSMOOTHSCROLLING HEX: 1007
+CONSTANT: SPI_GETGRADIENTCAPTIONS HEX: 1008
+CONSTANT: SPI_SETGRADIENTCAPTIONS HEX: 1009
+CONSTANT: SPI_GETMENUUNDERLINES HEX: 100A
+CONSTANT: SPI_SETMENUUNDERLINES HEX: 100B
+CONSTANT: SPI_GETACTIVEWNDTRKZORDER HEX: 100C
+CONSTANT: SPI_SETACTIVEWNDTRKZORDER HEX: 100D
+CONSTANT: SPI_GETHOTTRACKING HEX: 100E
+CONSTANT: SPI_SETHOTTRACKING HEX: 100F
+CONSTANT: SPI_GETFOREGROUNDLOCKTIMEOUT HEX: 2000
+CONSTANT: SPI_SETFOREGROUNDLOCKTIMEOUT HEX: 2001
+CONSTANT: SPI_GETACTIVEWNDTRKTIMEOUT HEX: 2002
+CONSTANT: SPI_SETACTIVEWNDTRKTIMEOUT HEX: 2003
+CONSTANT: SPI_GETFOREGROUNDFLASHCOUNT HEX: 2004
+CONSTANT: SPI_SETFOREGROUNDFLASHCOUNT HEX: 2005
+
+! SystemParamInfo Flags
+CONSTANT: SPIF_UPDATEINIFILE 1
+CONSTANT: SPIF_SENDWININICHANGE 2
+ALIAS: SPIF_SENDCHANGE SPIF_SENDWININICHANGE
+
+
TYPEDEF: HANDLE HRAWINPUT
: GET_RAWINPUT_CODE_WPARAM ( wParam -- n ) HEX: ff bitand ; inline
@@ -783,6 +927,87 @@ STRUCT: RAWINPUTDEVICELIST
{ dwType DWORD } ;
TYPEDEF: RAWINPUTDEVICELIST* PRAWINPUTDEVICELIST
+CONSTANT: CCHFORMNAME 32
+
+CONSTANT: CDS_UPDATEREGISTRY HEX: 00000001
+CONSTANT: CDS_TEST HEX: 00000002
+CONSTANT: CDS_FULLSCREEN HEX: 00000004
+CONSTANT: CDS_GLOBAL HEX: 00000008
+CONSTANT: CDS_SET_PRIMARY HEX: 00000010
+CONSTANT: CDS_RESET HEX: 40000000
+CONSTANT: CDS_SETRECT HEX: 20000000
+CONSTANT: CDS_NORESET HEX: 10000000
+
+CONSTANT: DISP_CHANGE_SUCCESSFUL 0
+CONSTANT: DISP_CHANGE_RESTART 1
+CONSTANT: DISP_CHANGE_FAILED -1
+CONSTANT: DISP_CHANGE_BADMODE -2
+CONSTANT: DISP_CHANGE_NOTUPDATED -3
+CONSTANT: DISP_CHANGE_BADFLAGS -4
+CONSTANT: DISP_CHANGE_BADPARAM -5
+
+
+
+STRUCT: DEVMODE
+ { dmDeviceName TCHAR[CCHDEVICENAME] }
+ { dmSpecVersion WORD }
+ { dmDriverVersion WORD }
+ { dmSize WORD }
+ { dmDriverExtra WORD }
+ { dmFields DWORD }
+
+ { dmOrientation short }
+ { dmPaperSize short }
+ { dmPaperLength short }
+ { dmPaperWidth short }
+ { dmScale short }
+ { dmCopies short }
+ { dmDefaultSource short }
+ { dmPrintQuality short }
+
+ { dmColor short }
+ { dmDuplex short }
+ { dmYResolution short }
+ { dmTTOption short }
+ { dmCollate short }
+ { dmFormName TCHAR[CCHFORMNAME] }
+ { dmLogPixels WORD }
+ { dmBitsPerPel DWORD }
+ { dmPelsWidth DWORD }
+ { dmPelsHeight DWORD }
+ { dmDisplayFlags DWORD }
+ { dmDisplayFrequency DWORD }
+ { dmiCMMethod DWORD }
+ { dmICMIntent DWORD }
+
+ { dmMediaType DWORD }
+ { dmDitherType DWORD }
+ { dmReserved1 DWORD }
+ { dmReserved2 DWORD }
+ { dmPanningWidth DWORD } ;
+
+! union { DWORD dmDisplayFlags; DWORD dmNup; } ;
+ ! union {
+ ! struct {
+ ! short dmOrientation;
+ ! short dmPaperSize;
+ ! short dmPaperLength;
+ ! short dmPaperWidth;
+ ! short dmScale;
+ ! short dmCopies;
+ ! short dmDefaultSource;
+ ! short dmPrintQuality;
+ ! } ;
+ ! struct {
+ ! POINTL dmPosition;
+ ! DWORD dmDisplayOrientation;
+ ! DWORD dmDisplayFixedOutput;
+ ! } ;
+ ! } ;
+
+TYPEDEF: DEVMODE* PDEVMODE
+TYPEDEF: DEVMODE* LPDEVMODE
+
LIBRARY: user32
FUNCTION: HKL ActivateKeyboardLayout ( HKL hkl, UINT Flags ) ;
@@ -821,10 +1046,10 @@ FUNCTION: HDC BeginPaint ( HWND hwnd, LPPAINTSTRUCT lpPaint ) ;
! FUNCTION: CascadeChildWindows
! FUNCTION: CascadeWindows
! FUNCTION: ChangeClipboardChain
-! FUNCTION: ChangeDisplaySettingsA
-! FUNCTION: ChangeDisplaySettingsExA
-! FUNCTION: ChangeDisplaySettingsExW
-! FUNCTION: ChangeDisplaySettingsW
+FUNCTION: LONG ChangeDisplaySettingsExW ( LPCTSTR lpszDeviceName, DEVMODE *lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam ) ;
+FUNCTION: LONG ChangeDisplaySettingsW ( DEVMODE *lpDevMode, DWORD dwFlags ) ;
+ALIAS: ChangeDisplaySettingsEx ChangeDisplaySettingsExW
+ALIAS: ChangeDisplaySettings ChangeDisplaySettingsW
! FUNCTION: ChangeMenuA
! FUNCTION: ChangeMenuW
! FUNCTION: CharLowerA
@@ -1029,7 +1254,8 @@ FUNCTION: UINT EnumClipboardFormats ( UINT format ) ;
! FUNCTION: EnumDisplaySettingsA
! FUNCTION: EnumDisplaySettingsExA
! FUNCTION: EnumDisplaySettingsExW
-! FUNCTION: EnumDisplaySettingsW
+FUNCTION: BOOL EnumDisplaySettingsW ( LPCTSTR lpszDeviceName, DWORD iModeNum, DEVMODE *lpDevMode ) ;
+ALIAS: EnumDisplaySettings EnumDisplaySettingsW
! FUNCTION: EnumPropsA
! FUNCTION: EnumPropsExA
! FUNCTION: EnumPropsExW
@@ -1042,8 +1268,8 @@ FUNCTION: UINT EnumClipboardFormats ( UINT format ) ;
! FUNCTION: ExcludeUpdateRgn
! FUNCTION: ExitWindowsEx
FUNCTION: int FillRect ( HDC hDC, RECT* lprc, HBRUSH hbr ) ;
-FUNCTION: HWND FindWindowA ( char* lpClassName, char* lpWindowName ) ;
-FUNCTION: HWND FindWindowExA ( HWND hwndParent, HWND childAfter, char* lpClassName, char* lpWindowName ) ;
+FUNCTION: HWND FindWindowA ( c-string lpClassName, c-string lpWindowName ) ;
+FUNCTION: HWND FindWindowExA ( HWND hwndParent, HWND childAfter, c-string lpClassName, c-string lpWindowName ) ;
! FUNCTION: FindWindowExW
! FUNCTION: FindWindowW
! FUNCTION: FlashWindow
@@ -1092,7 +1318,7 @@ FUNCTION: DWORD GetClipboardSequenceNumber ( ) ;
! FUNCTION: GetCursorPos
FUNCTION: HDC GetDC ( HWND hWnd ) ;
FUNCTION: HDC GetDCEx ( HWND hWnd, HRGN hrgnClip, DWORD flags ) ;
-! FUNCTION: GetDesktopWindow
+FUNCTION: HWND GetDesktopWindow ( ) ;
! FUNCTION: GetDialogBaseUnits
! FUNCTION: GetDlgCtrlID
! FUNCTION: GetDlgItem
@@ -1201,6 +1427,8 @@ FUNCTION: HWND GetWindow ( HWND hWnd, UINT uCmd ) ;
! FUNCTION: GetWindowLongW
FUNCTION: LONG_PTR GetWindowLongW ( HANDLE hWnd, int index ) ;
ALIAS: GetWindowLong GetWindowLongW
+
+FUNCTION: LONG_PTR GetWindowLongPtr ( HWND hWnd, int nIndex ) ;
! FUNCTION: GetWindowModuleFileName
! FUNCTION: GetWindowModuleFileNameA
! FUNCTION: GetWindowModuleFileNameW
@@ -1548,6 +1776,8 @@ ALIAS: SetWindowLong SetWindowLongW
! FUNCTION: SetWindowPlacement
FUNCTION: BOOL SetWindowPos ( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags ) ;
+FUNCTION: LONG_PTR SetWindowLongPtr ( HWND hWnd, int nIndex, LONG_PTR dwNewLong ) ;
+
: HWND_BOTTOM ( -- alien ) 1 ;
: HWND_NOTOPMOST ( -- alien ) -2 ;
CONSTANT: HWND_TOP f
@@ -1578,7 +1808,10 @@ FUNCTION: BOOL ShowWindow ( HWND hWnd, int nCmdShow ) ;
! FUNCTION: SwitchDesktop
! FUNCTION: SwitchToThisWindow
! FUNCTION: SystemParametersInfoA
-! FUNCTION: SystemParametersInfoW
+
+FUNCTION: BOOL SystemParametersInfoW ( UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni ) ;
+ALIAS: SystemParametersInfo SystemParametersInfoW
+
! FUNCTION: TabbedTextOutA
! FUNCTION: TabbedTextOutW
! FUNCTION: TileChildWindows
diff --git a/basis/windows/usp10/platforms.txt b/basis/windows/usp10/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/usp10/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/usp10/tags.txt b/basis/windows/usp10/tags.txt
index 2320bdd648..bb863cf9a0 100644
--- a/basis/windows/usp10/tags.txt
+++ b/basis/windows/usp10/tags.txt
@@ -1,2 +1 @@
-unportable
bindings
diff --git a/basis/windows/usp10/usp10.factor b/basis/windows/usp10/usp10.factor
index 57702d8780..1c33aaf940 100644
--- a/basis/windows/usp10/usp10.factor
+++ b/basis/windows/usp10/usp10.factor
@@ -57,7 +57,7 @@ SCRIPT_JUSTIFFY_RESERVED4 ;
STRUCT: SCRIPT_VISATTR
{ flags WORD } ;
-TYPEDEF: void* SCRIPT_CACHE*
+C-TYPE: SCRIPT_CACHE
C-TYPE: ABC
FUNCTION: HRESULT ScriptShape (
diff --git a/basis/windows/winsock/platforms.txt b/basis/windows/winsock/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/basis/windows/winsock/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/basis/windows/winsock/tags.txt b/basis/windows/winsock/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/windows/winsock/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/windows/winsock/winsock.factor b/basis/windows/winsock/winsock.factor
index b8d1f099d2..b58cbcacbd 100644
--- a/basis/windows/winsock/winsock.factor
+++ b/basis/windows/winsock/winsock.factor
@@ -121,7 +121,7 @@ STRUCT: sockaddr-in6
{ scopeid uint } ;
STRUCT: hostent
- { name char* }
+ { name c-string }
{ aliases void* }
{ addrtype short }
{ length short }
@@ -133,7 +133,7 @@ STRUCT: addrinfo
{ socktype int }
{ protocol int }
{ addrlen size_t }
- { canonname char* }
+ { canonname c-string }
{ addr sockaddr* }
{ next addrinfo* } ;
@@ -141,33 +141,33 @@ STRUCT: timeval
{ sec long }
{ usec long } ;
-TYPEDEF: void* fd_set*
+C-TYPE: fd_set
LIBRARY: winsock
-FUNCTION: int setsockopt ( SOCKET s, int level, int optname, char* optval, int optlen ) ;
+FUNCTION: int setsockopt ( SOCKET s, int level, int optname, c-string optval, int optlen ) ;
FUNCTION: ushort htons ( ushort n ) ;
FUNCTION: ushort ntohs ( ushort n ) ;
FUNCTION: int bind ( void* socket, sockaddr-in* sockaddr, int len ) ;
FUNCTION: int listen ( void* socket, int backlog ) ;
-FUNCTION: char* inet_ntoa ( int in-addr ) ;
-FUNCTION: int getaddrinfo ( char* nodename,
- char* servername,
+FUNCTION: c-string inet_ntoa ( int in-addr ) ;
+FUNCTION: int getaddrinfo ( c-string nodename,
+ c-string servername,
addrinfo* hints,
addrinfo** res ) ;
FUNCTION: void freeaddrinfo ( addrinfo* ai ) ;
-FUNCTION: hostent* gethostbyname ( char* name ) ;
-FUNCTION: int gethostname ( char* name, int len ) ;
+FUNCTION: hostent* gethostbyname ( c-string name ) ;
+FUNCTION: int gethostname ( c-string name, int len ) ;
FUNCTION: int connect ( void* socket, sockaddr-in* sockaddr, int addrlen ) ;
FUNCTION: int select ( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout ) ;
FUNCTION: int closesocket ( SOCKET s ) ;
FUNCTION: int shutdown ( SOCKET s, int how ) ;
-FUNCTION: int send ( SOCKET s, char* buf, int len, int flags ) ;
-FUNCTION: int recv ( SOCKET s, char* buf, int len, int flags ) ;
+FUNCTION: int send ( SOCKET s, c-string buf, int len, int flags ) ;
+FUNCTION: int recv ( SOCKET s, c-string buf, int len, int flags ) ;
FUNCTION: int getsockname ( SOCKET s, sockaddr-in* address, int* addrlen ) ;
FUNCTION: int getpeername ( SOCKET s, sockaddr-in* address, int* addrlen ) ;
diff --git a/basis/x11/glx/glx.factor b/basis/x11/glx/glx.factor
index 5bc58e5f0a..d095853913 100644
--- a/basis/x11/glx/glx.factor
+++ b/basis/x11/glx/glx.factor
@@ -55,9 +55,9 @@ X-FUNCTION: void glXSwapBuffers ( Display* dpy, GLXDrawable drawable ) ;
X-FUNCTION: void glXUseXFont ( Font font, int first, int count, int listBase ) ;
X-FUNCTION: void glXWaitGL ( ) ;
X-FUNCTION: void glXWaitX ( ) ;
-X-FUNCTION: char* glXGetClientString ( Display* dpy, int name ) ;
-X-FUNCTION: char* glXQueryServerString ( Display* dpy, int screen, int name ) ;
-X-FUNCTION: char* glXQueryExtensionsString ( Display* dpy, int screen ) ;
+X-FUNCTION: c-string glXGetClientString ( Display* dpy, int name ) ;
+X-FUNCTION: c-string glXQueryServerString ( Display* dpy, int screen, int name ) ;
+X-FUNCTION: c-string glXQueryExtensionsString ( Display* dpy, int screen ) ;
! New for GLX 1.3
X-FUNCTION: GLXFBConfig* glXGetFBConfigs ( Display* dpy, int screen, int* nelements ) ;
@@ -80,10 +80,10 @@ X-FUNCTION: void glXSelectEvent ( Display* dpy, GLXDrawable draw, ulong event_ma
X-FUNCTION: void glXGetSelectedEvent ( Display* dpy, GLXDrawable draw, ulong* event_mask ) ;
! GLX 1.4 and later
-X-FUNCTION: void* glXGetProcAddress ( char* procname ) ;
+X-FUNCTION: void* glXGetProcAddress ( c-string procname ) ;
! GLX_ARB_get_proc_address extension
-X-FUNCTION: void* glXGetProcAddressARB ( char* procname ) ;
+X-FUNCTION: void* glXGetProcAddressARB ( c-string procname ) ;
! GLX_ARB_multisample
CONSTANT: GLX_SAMPLE_BUFFERS 100000
diff --git a/basis/x11/io/unix/platforms.txt b/basis/x11/io/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/x11/io/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/x11/io/unix/tags.txt b/basis/x11/io/unix/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/x11/io/unix/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/x11/windows/platforms.txt b/basis/x11/windows/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/basis/x11/windows/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/basis/x11/windows/tags.txt b/basis/x11/windows/tags.txt
deleted file mode 100644
index 6bf68304bb..0000000000
--- a/basis/x11/windows/tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-unportable
diff --git a/basis/x11/xlib/xlib.factor b/basis/x11/xlib/xlib.factor
index a6097c9dad..e86bb5e8c3 100644
--- a/basis/x11/xlib/xlib.factor
+++ b/basis/x11/xlib/xlib.factor
@@ -30,7 +30,7 @@ TYPEDEF: XID KeySym
TYPEDEF: ulong Atom
-TYPEDEF: char* XPointer
+TYPEDEF: c-string XPointer
C-TYPE: Screen
TYPEDEF: void* GC
C-TYPE: Visual
@@ -256,13 +256,13 @@ X-FUNCTION: Bool XQueryPointer ( Display* display, Window w, Window* root_return
! 4.3 - Properties and Atoms
-X-FUNCTION: Atom XInternAtom ( Display* display, char* atom_name, Bool only_if_exists ) ;
+X-FUNCTION: Atom XInternAtom ( Display* display, c-string atom_name, Bool only_if_exists ) ;
-X-FUNCTION: char* XGetAtomName ( Display* display, Atom atom ) ;
+X-FUNCTION: c-string XGetAtomName ( Display* display, Atom atom ) ;
! 4.4 - Obtaining and Changing Window Properties
-X-FUNCTION: int XGetWindowProperty ( Display* display, Window w, Atom property, long long_offset, long long_length, Bool delete, Atom req_type, Atom* actual_type_return, int* actual_format_return, ulong* nitems_return, ulong* bytes_after_return, char** prop_return ) ;
+X-FUNCTION: int XGetWindowProperty ( Display* display, Window w, Atom property, long long_offset, long long_length, Bool delete, Atom req_type, Atom* actual_type_return, int* actual_format_return, ulong* nitems_return, ulong* bytes_after_return, c-string* prop_return ) ;
X-FUNCTION: int XChangeProperty ( Display* display, Window w, Atom property, Atom type, int format, int mode, void* data, int nelements ) ;
@@ -284,6 +284,11 @@ X-FUNCTION: int XConvertSelection ( Display* display, Atom selection, Atom targe
X-FUNCTION: Pixmap XCreatePixmap ( Display* display, Drawable d, uint width, uint height, uint depth ) ;
X-FUNCTION: int XFreePixmap ( Display* display, Pixmap pixmap ) ;
+! 5.2 - Creating, Recoloring, and Freeing Cursors
+
+C-TYPE: XColor
+X-FUNCTION: Cursor XCreatePixmapCursor ( Display* display, Pixmap source, Pixmap mask, XColor* foreground_color, XColor* background_color, uint x, uint y ) ;
+X-FUNCTION: int XFreeCursor ( Display* display, Cursor cursor ) ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! 6 - Color Management Functions
@@ -297,7 +302,7 @@ STRUCT: XColor
{ flags char }
{ pad char } ;
-X-FUNCTION: Status XLookupColor ( Display* display, Colormap colormap, char* color_name, XColor* exact_def_return, XColor* screen_def_return ) ;
+X-FUNCTION: Status XLookupColor ( Display* display, Colormap colormap, c-string color_name, XColor* exact_def_return, XColor* screen_def_return ) ;
X-FUNCTION: Status XAllocColor ( Display* display, Colormap colormap, XColor* screen_in_out ) ;
X-FUNCTION: Status XQueryColor ( Display* display, Colormap colormap, XColor* def_in_out ) ;
@@ -425,11 +430,11 @@ STRUCT: XFontStruct
{ ascent int }
{ descent int } ;
-X-FUNCTION: Font XLoadFont ( Display* display, char* name ) ;
+X-FUNCTION: Font XLoadFont ( Display* display, c-string name ) ;
X-FUNCTION: XFontStruct* XQueryFont ( Display* display, XID font_ID ) ;
-X-FUNCTION: XFontStruct* XLoadQueryFont ( Display* display, char* name ) ;
+X-FUNCTION: XFontStruct* XLoadQueryFont ( Display* display, c-string name ) ;
-X-FUNCTION: int XTextWidth ( XFontStruct* font_struct, char* string, int count ) ;
+X-FUNCTION: int XTextWidth ( XFontStruct* font_struct, c-string string, int count ) ;
! 8.6 - Drawing Text
@@ -439,7 +444,7 @@ X-FUNCTION: Status XDrawString (
GC gc,
int x,
int y,
- char* string,
+ c-string string,
int length ) ;
! 8.7 - Transferring Images between Client and Server
@@ -459,7 +464,7 @@ STRUCT: XImage
{ height int }
{ xoffset int }
{ format int }
-{ data char* }
+{ data uchar* }
{ byte_order int }
{ bitmap_unit int }
{ bitmap_bit_order int }
@@ -1005,14 +1010,7 @@ STRUCT: XKeymapEvent
{ send_event Bool }
{ display Display* }
{ window Window }
-{ pad int }
-{ pad int }
-{ pad int }
-{ pad int }
-{ pad int }
-{ pad int }
-{ pad int }
-{ pad int } ;
+{ pad int[8] } ;
UNION-STRUCT: XEvent
{ int int }
@@ -1096,6 +1094,7 @@ X-FUNCTION: int XGrabPointer (
X-FUNCTION: Status XUngrabPointer ( Display* display, Time time ) ;
X-FUNCTION: Status XChangeActivePointerGrab ( Display* display, uint event_mask, Cursor cursor, Time time ) ;
X-FUNCTION: Status XGrabKey ( Display* display, int keycode, uint modifiers, Window grab_window, Bool owner_events, int pointer_mode, int keyboard_mode ) ;
+X-FUNCTION: int XGrabKeyboard ( Display* display, Window grab_window, Bool owner_events, int pointer_mode, int keyboard_mode, Time time ) ;
X-FUNCTION: Status XSetInputFocus ( Display* display, Window focus, int revert_to, Time time ) ;
X-FUNCTION: Status XGetInputFocus ( Display* display,
@@ -1110,7 +1109,7 @@ X-FUNCTION: Status XWarpPointer ( Display* display, Window src_w, Window dest_w,
! 14.1 Client to Window Manager Communication
-X-FUNCTION: Status XFetchName ( Display* display, Window w, char** window_name_return ) ;
+X-FUNCTION: Status XFetchName ( Display* display, Window w, c-string* window_name_return ) ;
X-FUNCTION: Status XGetTransientForHint ( Display* display, Window w, Window* prop_window_return ) ;
! 14.1.1. Manipulating Top-Level Windows
@@ -1210,6 +1209,14 @@ STRUCT: XVisualInfo
{ colormap_size int }
{ bits_per_rgb int } ;
+! 16.9 Manipulating Bitmaps
+X-FUNCTION: Pixmap XCreateBitmapFromData (
+ Display* display,
+ Drawable d,
+ c-string data,
+ uint width,
+ uint height ) ;
+
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Appendix D - Compatibility Functions
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1217,10 +1224,10 @@ STRUCT: XVisualInfo
X-FUNCTION: Status XSetStandardProperties (
Display* display,
Window w,
- char* window_name,
- char* icon_name,
+ c-string window_name,
+ c-string icon_name,
Pixmap icon_pixmap,
- char** argv,
+ c-string* argv,
int argc,
XSizeHints* hints ) ;
@@ -1302,7 +1309,7 @@ CONSTANT: XA_LAST_PREDEFINED 68
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
X-FUNCTION: void XFree ( void* data ) ;
-X-FUNCTION: int XStoreName ( Display* display, Window w, char* window_name ) ;
+X-FUNCTION: int XStoreName ( Display* display, Window w, c-string window_name ) ;
X-FUNCTION: void XSetWMNormalHints ( Display* display, Window w, XSizeHints* hints ) ;
X-FUNCTION: int XBell ( Display* display, int percent ) ;
@@ -1370,11 +1377,11 @@ CONSTANT: XLookupBoth 4
X-FUNCTION: Bool XFilterEvent ( XEvent* event, Window w ) ;
-X-FUNCTION: XIM XOpenIM ( Display* dpy, void* rdb, char* res_name, char* res_class ) ;
+X-FUNCTION: XIM XOpenIM ( Display* dpy, void* rdb, c-string res_name, c-string res_class ) ;
X-FUNCTION: Status XCloseIM ( XIM im ) ;
-X-FUNCTION: XIC XCreateIC ( XIM im, char* key1, Window value1, char* key2, Window value2, char* key3, int value3, char* key4, char* value4, char* key5, char* value5, int key6 ) ;
+X-FUNCTION: XIC XCreateIC ( XIM im, c-string key1, Window value1, c-string key2, Window value2, c-string key3, int value3, c-string key4, c-string value4, c-string key5, c-string value5, int key6 ) ;
X-FUNCTION: void XDestroyIC ( XIC ic ) ;
@@ -1384,7 +1391,7 @@ X-FUNCTION: void XUnsetICFocus ( XIC ic ) ;
X-FUNCTION: int XwcLookupString ( XIC ic, XKeyPressedEvent* event, ulong* buffer_return, int bytes_buffer, KeySym* keysym_return, Status* status_return ) ;
-X-FUNCTION: int Xutf8LookupString ( XIC ic, XKeyPressedEvent* event, char* buffer_return, int bytes_buffer, KeySym* keysym_return, Status* status_return ) ;
+X-FUNCTION: int Xutf8LookupString ( XIC ic, XKeyPressedEvent* event, c-string buffer_return, int bytes_buffer, KeySym* keysym_return, Status* status_return ) ;
! !!! category of setlocale
CONSTANT: LC_ALL 0
@@ -1394,8 +1401,8 @@ CONSTANT: LC_MONETARY 3
CONSTANT: LC_NUMERIC 4
CONSTANT: LC_TIME 5
-X-FUNCTION: char* setlocale ( int category, char* name ) ;
+X-FUNCTION: c-string setlocale ( int category, c-string name ) ;
X-FUNCTION: Bool XSupportsLocale ( ) ;
-X-FUNCTION: char* XSetLocaleModifiers ( char* modifier_list ) ;
+X-FUNCTION: c-string XSetLocaleModifiers ( c-string modifier_list ) ;
diff --git a/basis/xml-rpc/xml-rpc-docs.factor b/basis/xml-rpc/xml-rpc-docs.factor
index 113fc00407..aeb29c5d07 100644
--- a/basis/xml-rpc/xml-rpc-docs.factor
+++ b/basis/xml-rpc/xml-rpc-docs.factor
@@ -49,7 +49,7 @@ HELP: rpc-fault
HELP: post-rpc
{ $values { "rpc" "an XML-RPC input tuple" } { "url" "a URL" }
- { "rpc" "an XML-RPC output tuple" } }
+ { "rpc'" "an XML-RPC output tuple" } }
{ $description "posts an XML-RPC document to the specified URL, receives the response and parses it as XML-RPC, returning the tuple" } ;
ARTICLE: { "xml-rpc" "intro" } "XML-RPC"
diff --git a/basis/xml-rpc/xml-rpc.factor b/basis/xml-rpc/xml-rpc.factor
index 370c778787..4c6570c4de 100644
--- a/basis/xml-rpc/xml-rpc.factor
+++ b/basis/xml-rpc/xml-rpc.factor
@@ -186,7 +186,7 @@ TAG: array xml>item
PRIVATE>
-: post-rpc ( rpc url -- rpc )
+: post-rpc ( rpc url -- rpc' )
! This needs to do something in the event of an error
rpc-post-request http-request nip string>xml receive-rpc ;
diff --git a/basis/xml/traversal/traversal-docs.factor b/basis/xml/traversal/traversal-docs.factor
index bb7ce7ce31..d8032d99fc 100644
--- a/basis/xml/traversal/traversal-docs.factor
+++ b/basis/xml/traversal/traversal-docs.factor
@@ -58,7 +58,7 @@ HELP: children-tags
{ $see-also first-child-tag } ;
HELP: first-child-tag
-{ $values { "tag" "an XML tag or document" } { "tag" tag } }
+{ $values { "tag" "an XML tag or document" } { "child" tag } }
{ $description "Returns the first child of the given tag that is a tag." }
{ $see-also children-tags } ;
diff --git a/basis/xml/traversal/traversal.factor b/basis/xml/traversal/traversal.factor
index b337ea1472..46a5896814 100644
--- a/basis/xml/traversal/traversal.factor
+++ b/basis/xml/traversal/traversal.factor
@@ -18,7 +18,7 @@ IN: xml.traversal
: children-tags ( tag -- sequence )
children>> [ tag? ] filter ;
-: first-child-tag ( tag -- tag )
+: first-child-tag ( tag -- child )
children>> [ tag? ] find nip ;
: tag-named? ( name elem -- ? )
diff --git a/build-support/factor.sh b/build-support/factor.sh
index a02a2fad7e..3a5fb4e253 100755
--- a/build-support/factor.sh
+++ b/build-support/factor.sh
@@ -107,6 +107,7 @@ check_installed_programs() {
ensure_program_installed git
ensure_program_installed wget curl
ensure_program_installed gcc
+ ensure_program_installed g++ cl
ensure_program_installed make gmake
ensure_program_installed md5sum md5
ensure_program_installed cut
diff --git a/core/alien/alien-docs.factor b/core/alien/alien-docs.factor
index 98292b8728..99f3a2b0f4 100644
--- a/core/alien/alien-docs.factor
+++ b/core/alien/alien-docs.factor
@@ -1,9 +1,25 @@
USING: byte-arrays arrays help.syntax help.markup
alien.syntax compiler definitions math libc eval
debugger parser io io.backend system alien.accessors
-alien.libraries alien.c-types quotations ;
+alien.libraries alien.c-types quotations kernel
+sequences ;
IN: alien
+HELP: >c-ptr
+{ $values { "obj" object } { "c-ptr" c-ptr } }
+{ $contract "Outputs a pointer to the binary data of this object." } ;
+
+HELP: byte-length
+{ $values { "obj" object } { "n" "a non-negative integer" } }
+{ $contract "Outputs the number of bytes of binary data that will be output by " { $link >c-ptr } "." } ;
+
+HELP: element-size
+{ $values { "seq" sequence } { "n" "a non-negative integer" } }
+{ $contract "Outputs the number of bytes used for each element of the sequence." }
+{ $notes "If a sequence class implements " { $link element-size } " and " { $link >c-ptr } ", then instances of this sequence, as well as slices of this sequence, can be used as binary objects." } ;
+
+{ >c-ptr element-size byte-length } related-words
+
HELP: alien
{ $class-description "The class of alien pointers. See " { $link "syntax-aliens" } " for syntax and " { $link "c-data" } " for general information." } ;
@@ -42,7 +58,7 @@ HELP:
{ $notes "Alien objects are invalidated between image saves and loads." } ;
HELP: c-ptr
-{ $class-description "Class of objects consisting of aliens, byte arrays and " { $link f } ". These objects can convert to pointer C types, which are all aliases of " { $snippet "void*" } "." } ;
+{ $class-description "Class of objects consisting of aliens, byte arrays and " { $link f } ". These objects all can be used as values of " { $link pointer } " C types." } ;
HELP: alien-invoke-error
{ $error-description "Thrown if the word calling " { $link alien-invoke } " was not compiled with the optimizing compiler. This may be a result of one of several failure conditions:"
@@ -136,7 +152,7 @@ ARTICLE: "aliens" "Alien addresses"
}
"Anywhere that a " { $link alien } " instance is accepted, the " { $link f } " singleton may be passed in to denote a null pointer."
$nl
-"Usually alien objects do not have to created and dereferenced directly; instead declaring C function parameters and return values as having a pointer type such as " { $snippet "void*" } " takes care of the details."
+"Usually alien objects do not have to created and dereferenced directly; instead declaring C function parameters and return values as having a " { $link pointer } " type such as " { $snippet "void*" } " takes care of the details."
{ $subsections
"syntax-aliens"
"alien-expiry"
diff --git a/core/alien/alien.factor b/core/alien/alien.factor
index 16c33fc1c3..3802147838 100644
--- a/core/alien/alien.factor
+++ b/core/alien/alien.factor
@@ -1,21 +1,42 @@
! Copyright (C) 2004, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors assocs kernel math namespaces sequences system
-kernel.private byte-arrays arrays init ;
+kernel.private byte-arrays byte-vectors arrays init ;
IN: alien
PREDICATE: pinned-alien < alien underlying>> not ;
UNION: pinned-c-ptr pinned-alien POSTPONE: f ;
-GENERIC: >c-ptr ( obj -- c-ptr )
+GENERIC: element-size ( seq -- n ) flushable
+
+M: byte-array element-size drop 1 ; inline
+
+M: byte-vector element-size drop 1 ; inline
+
+M: slice element-size seq>> element-size ; inline
+
+M: f element-size drop 1 ; inline
+
+GENERIC: byte-length ( obj -- n ) flushable
+
+M: object byte-length [ length ] [ element-size ] bi * ; inline
+
+GENERIC: >c-ptr ( obj -- c-ptr ) flushable
M: c-ptr >c-ptr ; inline
+M: slice >c-ptr
+ [ [ from>> ] [ element-size ] bi * ] [ seq>> >c-ptr ] bi
+ ; inline
+
SLOT: underlying
M: object >c-ptr underlying>> ; inline
+: binary-object ( obj -- c-ptr n )
+ [ >c-ptr ] [ byte-length ] bi ; inline
+
GENERIC: expired? ( c-ptr -- ? ) flushable
M: alien expired? expired>> ;
diff --git a/core/alien/strings/strings.factor b/core/alien/strings/strings.factor
index 15e0370ba0..0ad4f6c85a 100644
--- a/core/alien/strings/strings.factor
+++ b/core/alien/strings/strings.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays sequences kernel kernel.private accessors math
alien.accessors byte-arrays io io.encodings io.encodings.utf8
@@ -37,17 +37,16 @@ M: string string>alien
M: tuple string>alien drop underlying>> ;
-HOOK: alien>native-string os ( alien -- string )
+HOOK: native-string-encoding os ( -- encoding ) foldable
-M: windows alien>native-string utf16n alien>string ;
+M: unix native-string-encoding utf8 ;
+M: windows native-string-encoding utf16n ;
-M: unix alien>native-string utf8 alien>string ;
+: alien>native-string ( alien -- string )
+ native-string-encoding alien>string ; inline
-HOOK: native-string>alien os ( string -- alien )
-
-M: windows native-string>alien utf16n string>alien ;
-
-M: unix native-string>alien utf8 string>alien ;
+: native-string>alien ( string -- alien )
+ native-string-encoding string>alien ; inline
: dll-path ( dll -- string )
path>> alien>native-string ;
diff --git a/core/alien/tags.txt b/core/alien/tags.txt
index 86a7c8e637..7ea420feed 100644
--- a/core/alien/tags.txt
+++ b/core/alien/tags.txt
@@ -1 +1,2 @@
compiler
+ffi
diff --git a/core/arrays/arrays.factor b/core/arrays/arrays.factor
index fa4d4b2f69..62a0774444 100644
--- a/core/arrays/arrays.factor
+++ b/core/arrays/arrays.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2005, 2008 Slava Pestov.
+! Copyright (C) 2005, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel kernel.private math math.private
sequences sequences.private ;
@@ -9,24 +9,16 @@ M: array length length>> ; inline
M: array nth-unsafe [ >fixnum ] dip array-nth ; inline
M: array set-nth-unsafe [ >fixnum ] dip set-array-nth ; inline
M: array resize resize-array ; inline
-
-: >array ( seq -- array ) { } clone-like ;
-
+M: array equal? over array? [ sequence= ] [ 2drop f ] if ;
M: object new-sequence drop 0 ; inline
-
M: f new-sequence drop [ f ] [ 0 ] if-zero ; inline
-M: array equal?
- over array? [ sequence= ] [ 2drop f ] if ;
-
INSTANCE: array sequence
+: >array ( seq -- array ) { } clone-like ;
: 1array ( x -- array ) 1 swap ; inline
-
: 2array ( x y -- array ) { } 2sequence ; inline
-
: 3array ( x y z -- array ) { } 3sequence ; inline
-
: 4array ( w x y z -- array ) { } 4sequence ; inline
PREDICATE: pair < array length 2 number= ;
diff --git a/core/assocs/assocs-docs.factor b/core/assocs/assocs-docs.factor
index 0d5a884832..8f93c5a9d1 100644
--- a/core/assocs/assocs-docs.factor
+++ b/core/assocs/assocs-docs.factor
@@ -221,7 +221,7 @@ HELP: assoc-size
HELP: assoc-like
{ $values { "assoc" assoc } { "exemplar" assoc } { "newassoc" "a new assoc" } }
-{ $contract "Creates a new assoc having the same entries as "{ $snippet "assoc" } " and the same type as " { $snippet "exemplar" } "." } ;
+{ $contract "Creates a new assoc having the same entries as " { $snippet "assoc" } " and the same type as " { $snippet "exemplar" } "." } ;
HELP: assoc-empty?
{ $values { "assoc" assoc } { "?" "a boolean" } }
@@ -383,7 +383,7 @@ HELP: cache
{ $side-effects "assoc" } ;
HELP: 2cache
-{ $values { "key1" "a key" } { "key2" "a key" } { "assoc" assoc } { "quot" { $quotation "( key -- value )" } } { "value" "a previously-retained or freshly-computed value" } }
+{ $values { "key1" "a key" } { "key2" "a key" } { "assoc" assoc } { "quot" { $quotation "( key1 key2 -- value )" } } { "value" "a previously-retained or freshly-computed value" } }
{ $description "If a single key composed of the input keys is present in the assoc, outputs the associated value, otherwise calls the quotation to produce a value and stores the keys/value pair into the assoc. Returns the value stored in the assoc. Returns a value either looked up or newly stored in the assoc." }
{ $side-effects "assoc" } ;
@@ -432,7 +432,7 @@ HELP: assoc-combine
HELP: assoc-map-as
{ $values
- { "assoc" assoc } { "quot" quotation } { "exemplar" assoc }
+ { "assoc" assoc } { "quot" { $quotation "( key value -- newkey newvalue )" } } { "exemplar" assoc }
{ "newassoc" assoc } }
{ $description "Applies the quotation to each entry in the input assoc and collects the results in a new assoc of the stame type as the exemplar." }
{ $examples { $example "USING: prettyprint assocs hashtables math ;" " H{ { 1 2 } { 3 4 } } [ sq ] { } assoc-map-as ." "{ { 1 4 } { 3 16 } }" } } ;
diff --git a/core/bootstrap/primitives.factor b/core/bootstrap/primitives.factor
index 367dc4d942..43aeb6bd70 100644
--- a/core/bootstrap/primitives.factor
+++ b/core/bootstrap/primitives.factor
@@ -434,7 +434,7 @@ tuple
{ "fread" "io.streams.c" "primitive_fread" (( n alien -- str/f )) }
{ "fseek" "io.streams.c" "primitive_fseek" (( alien offset whence -- )) }
{ "ftell" "io.streams.c" "primitive_ftell" (( alien -- n )) }
- { "fwrite" "io.streams.c" "primitive_fwrite" (( string alien -- )) }
+ { "fwrite" "io.streams.c" "primitive_fwrite" (( data length alien -- )) }
{ "(clone)" "kernel" "primitive_clone" (( obj -- newobj )) }
{ "" "kernel" "primitive_wrapper" (( obj -- wrapper )) }
{ "callstack" "kernel" "primitive_callstack" (( -- cs )) }
diff --git a/core/bootstrap/syntax.factor b/core/bootstrap/syntax.factor
index bb159f04df..1870f4ac1b 100644
--- a/core/bootstrap/syntax.factor
+++ b/core/bootstrap/syntax.factor
@@ -49,6 +49,7 @@ IN: bootstrap.syntax
"SYMBOLS:"
"CONSTANT:"
"TUPLE:"
+ "final"
"SLOT:"
"T{"
"UNION:"
diff --git a/core/classes/algebra/algebra.factor b/core/classes/algebra/algebra.factor
index 69289600e4..f9aaf3eaa5 100644
--- a/core/classes/algebra/algebra.factor
+++ b/core/classes/algebra/algebra.factor
@@ -234,3 +234,12 @@ ERROR: topological-sort-failed ;
: flatten-class ( class -- assoc )
[ (flatten-class) ] H{ } make-assoc ;
+
+SYMBOL: +incomparable+
+
+: compare-classes ( class1 class2 -- ? )
+ {
+ { [ 2dup class<= ] [ t ] }
+ { [ 2dup classes-intersect? not ] [ f ] }
+ [ +incomparable+ ]
+ } cond 2nip ;
diff --git a/core/classes/parser/parser.factor b/core/classes/parser/parser.factor
index 8233d8cff3..41ce32105d 100644
--- a/core/classes/parser/parser.factor
+++ b/core/classes/parser/parser.factor
@@ -8,8 +8,9 @@ IN: classes.parser
: create-class-in ( string -- word )
current-vocab create
+ dup set-word
dup save-class-location
- dup create-predicate-word dup set-word save-location ;
+ dup create-predicate-word save-location ;
: CREATE-CLASS ( -- word )
scan create-class-in ;
diff --git a/core/classes/tuple/tuple-docs.factor b/core/classes/tuple/tuple-docs.factor
index 2b3e80da1d..7f6078e321 100644
--- a/core/classes/tuple/tuple-docs.factor
+++ b/core/classes/tuple/tuple-docs.factor
@@ -191,6 +191,8 @@ $nl
"tuple-inheritance-example"
"tuple-inheritance-anti-example"
}
+"Declaring a tuple class final prohibits other classes from subclassing it:"
+{ $subsections POSTPONE: final }
{ $see-also "call-next-method" "parametrized-constructors" "unions" "mixins" } ;
ARTICLE: "tuple-introspection" "Tuple introspection"
@@ -441,3 +443,6 @@ HELP: boa
{ $description "Creates a new instance of " { $snippet "class" } " and fill in the slots from the stack, with the top-most stack element being stored in the right-most slot." }
{ $notes "The name " { $snippet "boa" } " is shorthand for “by order of arguments”, and “BOA constructor” is a pun on “boa constrictor”." }
{ $errors "Throws an error if the slot values do not match class declarations on slots (see" { $link "tuple-declarations" } ")." } ;
+
+HELP: bad-superclass
+{ $error-description "Thrown if an attempt is made to subclass a class that is not a tuple class, or a tuple class declared " { $link POSTPONE: final } "." } ;
diff --git a/core/classes/tuple/tuple-tests.factor b/core/classes/tuple/tuple-tests.factor
index 36d402c61d..1609c1eeca 100644
--- a/core/classes/tuple/tuple-tests.factor
+++ b/core/classes/tuple/tuple-tests.factor
@@ -267,7 +267,7 @@ test-server-slot-values
] unit-test
[
- "IN: classes.tuple.tests TUPLE: bad-superclass < word ;" eval( -- )
+ "IN: classes.tuple.tests TUPLE: invalid-superclass < word ;" eval( -- )
] must-fail
! Dynamically changing inheritance hierarchy
@@ -770,3 +770,30 @@ TUPLE: tuple-predicate-redefine-test ;
[ ] [ "IN: classes.tuple.tests TUPLE: tuple-predicate-redefine-test ;" eval( -- ) ] unit-test
[ t ] [ \ tuple-predicate-redefine-test? predicate? ] unit-test
+
+! Final classes
+TUPLE: final-superclass ;
+TUPLE: final-subclass < final-superclass ;
+
+[ final-superclass ] [ final-subclass superclass ] unit-test
+
+! Making the superclass final should change the superclass of the subclass
+[ ] [ "IN: classes.tuple.tests TUPLE: final-superclass ; final" eval( -- ) ] unit-test
+
+[ tuple ] [ final-subclass superclass ] unit-test
+
+[ f ] [ \ final-subclass final-class? ] unit-test
+
+! Subclassing a final class should fail
+[ "IN: classes.tuple.tests TUPLE: final-subclass < final-superclass ;" eval( -- ) ]
+[ error>> bad-superclass? ] must-fail-with
+
+! Making a final class non-final should work
+[ ] [ "IN: classes.tuple.tests TUPLE: final-superclass ;" eval( -- ) ] unit-test
+
+[ ] [ "IN: classes.tuple.tests TUPLE: final-subclass < final-superclass ; final" eval( -- ) ] unit-test
+
+! Changing a superclass should not change the final status of a subclass
+[ ] [ "IN: classes.tuple.tests TUPLE: final-superclass x ;" eval( -- ) ] unit-test
+
+[ t ] [ \ final-subclass final-class? ] unit-test
diff --git a/core/classes/tuple/tuple.factor b/core/classes/tuple/tuple.factor
index 363c2879e9..64c34d221a 100644
--- a/core/classes/tuple/tuple.factor
+++ b/core/classes/tuple/tuple.factor
@@ -93,6 +93,14 @@ ERROR: bad-superclass class ;
] [ 2drop f ] if
] [ 2drop f ] if ; inline
+GENERIC: final-class? ( class -- ? )
+
+M: tuple-class final-class? "final" word-prop ;
+
+M: builtin-class final-class? tuple eq? not ;
+
+M: class final-class? drop t ;
+
: define-tuple-class ( class superclass slots -- )
@@ -268,10 +275,18 @@ PRIVATE>
over prepare-slots
(define-tuple-class) ;
+GENERIC: make-final ( class -- )
+
+M: tuple-class make-final
+ [ dup class-usage keys ?metaclass-changed ]
+ [ t "final" set-word-prop ]
+ bi ;
+
M: word (define-tuple-class)
define-new-tuple-class ;
M: tuple-class (define-tuple-class)
+ pick reset-final
3dup tuple-class-unchanged?
[ 2drop ?define-symbol ] [ redefine-tuple-class ] if ;
@@ -301,7 +316,7 @@ M: tuple-class reset-class
] with each
] [
[ call-next-method ]
- [ { "layout" "slots" "boa-check" "prototype" } reset-props ]
+ [ { "layout" "slots" "boa-check" "prototype" "final" } reset-props ]
bi
] bi ;
diff --git a/core/combinators/combinators-docs.factor b/core/combinators/combinators-docs.factor
index 02114496f4..31183a629e 100644
--- a/core/combinators/combinators-docs.factor
+++ b/core/combinators/combinators-docs.factor
@@ -176,15 +176,15 @@ ARTICLE: "conditionals" "Conditional combinators"
{ $subsections "conditionals-boolean-equivalence" }
{ $see-also "booleans" "bitwise-arithmetic" both? either? } ;
-ARTICLE: "dataflow-combinators" "Data flow combinators"
-"Data flow combinators express common dataflow patterns such as performing a operation while preserving its inputs, applying multiple operations to a single value, applying a set of operations to a set of values, or applying a single operation to multiple values."
+ARTICLE: "dataflow-combinators" "Dataflow combinators"
+"Dataflow combinators express common dataflow patterns such as performing a operation while preserving its inputs, applying multiple operations to a single value, applying a set of operations to a set of values, or applying a single operation to multiple values."
{ $subsections
"dip-keep-combinators"
"cleave-combinators"
"spread-combinators"
"apply-combinators"
}
-"More intricate data flow can be constructed by composing " { $link "curried-dataflow" } "." ;
+"More intricate dataflow can be constructed by composing " { $link "curried-dataflow" } "." ;
ARTICLE: "combinators-quot" "Quotation construction utilities"
"Some words for creating quotations which can be useful for implementing method combinations and compiler transforms:"
diff --git a/core/combinators/combinators.factor b/core/combinators/combinators.factor
index 95b62fc3f3..7b9481825b 100644
--- a/core/combinators/combinators.factor
+++ b/core/combinators/combinators.factor
@@ -5,6 +5,10 @@ kernel kernel.private math assocs quotations vectors
hashtables sorting words sets math.order make ;
IN: combinators
+! Most of these combinators have compile-time expansions in
+! the optimizing compiler. See stack-checker.transforms and
+! compiler.tree.propagation.call-effect
+
-ERROR: wrong-values quot effect ;
+ERROR: wrong-values quot call-site ;
! We can't USE: effects here so we forward reference slots instead
SLOT: in
diff --git a/core/compiler/units/units.factor b/core/compiler/units/units.factor
index 9582ebadb6..b024ed2c65 100644
--- a/core/compiler/units/units.factor
+++ b/core/compiler/units/units.factor
@@ -12,8 +12,7 @@ SYMBOL: new-definitions
TUPLE: redefine-error def ;
: redefine-error ( definition -- )
- \ redefine-error boa
- { { "Continue" t } } throw-restarts drop ;
+ \ redefine-error boa throw-continue ;
condition ( error restarts cc -- condition )
: rethrow-restarts ( error restarts -- restart )
[ rethrow ] callcc1 2nip ;
+: throw-continue ( error -- )
+ { { "Continue" t } } throw-restarts drop ;
+
TUPLE: restart name obj continuation ;
C: