]> gitweb.factorcode.org Git - factor.git/blob - extra/cocoa/plists/plists.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / extra / cocoa / plists / plists.factor
1 ! Copyright (C) 2007, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: strings arrays hashtables assocs sequences
4 cocoa.messages cocoa.classes cocoa.application cocoa kernel
5 namespaces io.backend math cocoa.enumeration byte-arrays
6 combinators alien.c-types core-foundation ;
7 IN: cocoa.plists
8
9 GENERIC: >plist ( value -- plist )
10
11 M: number >plist
12     <NSNumber> ;
13 M: t >plist
14     <NSNumber> ;
15 M: f >plist
16     <NSNumber> ;
17 M: string >plist
18     <NSString> ;
19 M: byte-array >plist
20     <NSData> ;
21 M: hashtable >plist
22     [ [ >plist ] bi@ ] assoc-map <NSDictionary> ;
23 M: sequence >plist
24     [ >plist ] map <NSArray> ;
25
26 : write-plist ( assoc path -- )
27     [ >plist ] [ normalize-path <NSString> ] bi* 0
28     -> writeToFile:atomically:
29     [ "write-plist failed" throw ] unless ;
30
31 DEFER: plist>
32
33 : (plist-NSString>) ( NSString -- string )
34     -> UTF8String ;
35
36 : (plist-NSNumber>) ( NSNumber -- number )
37     dup -> doubleValue dup >integer =
38     [ -> longLongValue ]
39     [ -> doubleValue ] if ;
40
41 : (plist-NSData>) ( NSData -- byte-array )
42     dup -> length <byte-array> [ -> getBytes: ] keep ;
43
44 : (plist-NSArray>) ( NSArray -- vector )
45     [ plist> ] NSFastEnumeration-map ;    
46
47 : (plist-NSDictionary>) ( NSDictionary -- hashtable )
48     dup [ [ -> valueForKey: ] keep swap [ plist> ] bi@ 2array ] with
49     NSFastEnumeration-map >hashtable ;
50
51 : plist> ( plist -- value )
52     {
53         { [ dup NSString     -> isKindOfClass: c-bool> ] [ (plist-NSString>)      ] }
54         { [ dup NSNumber     -> isKindOfClass: c-bool> ] [ (plist-NSNumber>)      ] }
55         { [ dup NSData       -> isKindOfClass: c-bool> ] [ (plist-NSData>)        ] }
56         { [ dup NSArray      -> isKindOfClass: c-bool> ] [ (plist-NSArray>)       ] }
57         { [ dup NSDictionary -> isKindOfClass: c-bool> ] [ (plist-NSDictionary>)  ] }
58         [ ]
59     } cond ;
60
61 : (read-plist) ( NSData -- id )
62     NSPropertyListSerialization swap kCFPropertyListImmutable f f <void*>
63     [ -> propertyListFromData:mutabilityOption:format:errorDescription: ] keep
64     *void* [ -> release "read-plist failed" throw ] when* ;
65
66 : read-plist ( path -- assoc )
67     normalize-path <NSString>
68     NSData swap -> dataWithContentsOfFile:
69     [ (read-plist) plist> ] [ "read-plist failed" throw ] if* ;