Browse code

make NSPropertyListSerialization+MullePlistReader read NSData. let mulle-plist-fix use that code as well

Nat! authored on 15/08/2015 18:42:12
Showing 3 changed files
... ...
@@ -8,244 +8,322 @@
8 8
 @implementation NSPropertyListSerialization ( MullePlistReader)
9 9
 
10 10
 
11
+/* this is really very, very old code, that has been resurrected */
12
+
13
+#define TRY_VALIANTLY_TO_CONVERT  0
14
+
15
+struct parse_context
16
+{
17
+   char         *s;
18
+   NSUInteger   len;
19
+};
20
+
21
+
11 22
 static inline int   iswhite( int c)
12 23
 {
13 24
    return( c == ' ' || c == '\n' || c == '\r' || c == '\t');
14 25
 }
15 26
 
16 27
 
17
-static id  _parse_object( char **s, NSUInteger *len);
18
-
19
-static int   skip_white( char **s, NSUInteger *len)
28
+static inline int   hexify( int c)
20 29
 {
21
-    while( *len)
22
-    {
23
-        if( ! iswhite( **s))
24
-            return( 0);
25
-        ++*s;
26
-        --*len;
27
-    }
28
-    return( -1);
30
+   if( c >= '0' && c <= '9')
31
+      return( c - '0');
32
+   if( c >= 'a' && c <= 'f')
33
+      return( c - 'A' + 10);
34
+   if( c >= 'A' && c <= 'F')
35
+      return( c - 'A' + 10);
36
+   return( -1);
29 37
 }
30 38
 
31
-/*
32
-static NSString  *slurp_identifier( char **s, unsigned int *len)
39
+
40
+
41
+static id  _parse_object( struct parse_context *p);
42
+
43
+static int   skip_white( struct parse_context *p)
33 44
 {
34
-    int    c;
35
-    char   *memo;
36
-
37
-    memo = *s;
38
-    while( *len)
39
-    {
40
-        c = **s;
41
-        if( ! (isalnum( c) || c == '_'))
42
-           break;
43
-        ++*s;
44
-        --*len;
45
-    }
46
-    return( [NSString stringWithCString:memo
47
-                                 length:*s - memo]);
45
+   while( p->len)
46
+   {
47
+      if( ! iswhite( *p->s))
48
+         return( 0);
49
+      
50
+      ++p->s;
51
+      --p->len;
52
+   }
53
+   return( -1);
48 54
 }
49
-*/
50 55
 
51
-static id   _parse_value( char **s, NSUInteger *len)
56
+/*
57
+ static NSString  p->slurp_identifier( char *p->s, unsigned int p->len)
58
+ {
59
+ int    c;
60
+ char   *memo;
61
+ 
62
+ memo = p->s;
63
+ while( p->len)
64
+ {
65
+ c = *p->s;
66
+ if( ! (isalnum( c) || c == '_'))
67
+ break;
68
+ ++p->s;
69
+ --p->len;
70
+ }
71
+ return( [NSString stringWithCString:memo
72
+ length:p->s - memo]);
73
+ }
74
+ */
75
+
76
+static id   _parse_value( struct parse_context *p)
52 77
 {
53
-    int        c;
54
-    char       *memo;
55
-    int        quoted;
56
-    NSString   *string;
57
-    
58
-    quoted = **s == '"';
59
-    if( quoted)
60
-    {
61
-        ++*s;
62
-        --*len;
63
-    }
64
-    
65
-    memo = *s;
66
-    while( *len)
67
-    {
68
-        c = **s;
69
-        if( quoted)
70
-        {
71
-            if( c == '"')
72
-                break;
73
-        }
74
-        else
75
-        {
76
-            if( iswhite( c) || c == ',' || c == ';')
77
-                break;
78
-        }
79
-        ++*s;
80
-        --*len;
81
-    }
82
-    
83
-
84
-    string = [NSString stringWithCString:memo
85
-                                  length:*s - memo];
86
-    if( quoted)
87
-    {
88
-        ++*s;
89
-        --*len;
90
-    }
91
-
92
-// brute force, try NSCalendarDate first    
93
-// then NSDecimalNumber Number 
94
-// finally stay as NSString
78
+   int        c;
79
+   int        d;
80
+   char       *memo;
81
+   int        quoted;
82
+   NSString   *s;
83
+   
84
+   quoted = *p->s == '"';
85
+   if( quoted)
86
+   {
87
+      ++p->s;
88
+      --p->len;
89
+   }
90
+   
91
+   c    = 0;
92
+   memo = p->s;
93
+   while( p->len)
94
+   {
95
+      d = c;
96
+      c = *p->s;
97
+
98
+      if( quoted)
99
+      {
100
+         if( c == '"' && d != '\\')
101
+            break;
102
+      }
103
+      else
104
+      {
105
+         if( iswhite( c) || c == ',' || c == ';' || c == ')' || c == '}')
106
+            break;
107
+      }
108
+      ++p->s;
109
+      --p->len;
110
+   }
111
+   
112
+   s = [NSString stringWithCString:memo
113
+                            length:p->s - memo];
114
+   if( quoted)
115
+   {
116
+      ++p->s;
117
+      --p->len;
118
+   }
119
+   
120
+   // brute force, try NSCalendarDate first
121
+   // then NSDecimalNumber Number
122
+   // finally stay as NSString
95 123
 #if TRY_VALIANTLY_TO_CONVERT
96
-    if( isdigit( *memo))
97
-    {
98
-        if( value = [NSDecimalNumber decimalNumberWithString:string])
99
-            return( value);
100
-    }
101
-    
102
-    if( value = [NSCalendarDate dateWithString:string])
103
-        return( value);
124
+   if( isdigit( *memo))
125
+   {
126
+      if( value = [NSDecimalNumber decimalNumberWithString:string])
127
+         return( value);
128
+   }
129
+   
130
+   if( value = [NSCalendarDate dateWithString:string])
131
+      return( value);
104 132
 #endif
105
-        
106
-    return( string);
133
+   
134
+   return( s);
107 135
 }
108 136
 
109 137
 
110
-static int   _parse_key_value_into_dictionary( char **s, NSUInteger *len, NSMutableDictionary *dictionary)
138
+static int   _parse_key_value_into_dictionary( struct parse_context *p, NSMutableDictionary *dictionary)
111 139
 {
112
-    id   key;
113
-    id   value;
114
-    
115
-    key = _parse_value( s, len);
116
-    if( ! key)
117
-        return( -1);
118
-    
119
-    if( skip_white( s, len))
120
-    {
121
-       NSLog( @"Malformed key value pair, only key %@ present", key);
122
-       return( -2);
123
-    }
124
-
125
-    if( **s != '=')
126
-    {
127
-       NSLog( @"Malformed key value pair, = missing after key %@", key);
128
-       return( -3);
129
-    }
130
-    
131
-    ++*s;
132
-    --*len;
133
-    
134
-    if( skip_white( s, len))
135
-    {
136
-       NSLog( @"Malformed key value pair, missing value after key %@", key);
137
-       return( -4);
138
-    }
140
+   id   key;
141
+   id   value;
142
+   
143
+   key = _parse_value( p);
144
+   if( ! key)
145
+      return( -1);
146
+   
147
+   if( skip_white( p))
148
+   {
149
+      NSLog( @"Malformed key value pair, only key %@ present", key);
150
+      return( -2);
151
+   }
152
+   
153
+   if( *p->s != '=')
154
+   {
155
+      NSLog( @"Malformed key value pair, = missing after key %@", key);
156
+      return( -3);
157
+   }
158
+   
159
+   ++p->s;
160
+   --p->len;
139 161
    
140
-    value = _parse_object( s, len);
141
-    if( ! value)
142
-    {
143
-       NSLog( @"Malformed key value pair, missing value after key %@", key);
144
-       return( -4);
145
-    }
146
-    [dictionary setObject:value
147
-                   forKey:key];
148
-                   
149
-    return( 0);
162
+   if( skip_white( p))
163
+   {
164
+      NSLog( @"Malformed key value pair, missing value after key %@", key);
165
+      return( -4);
166
+   }
167
+   
168
+   value = _parse_object( p);
169
+   if( ! value)
170
+   {
171
+      NSLog( @"Malformed key value pair, missing value after key %@", key);
172
+      return( -4);
173
+   }
174
+
175
+   [dictionary setObject:value
176
+                  forKey:key];
177
+   
178
+   if( ! skip_white( p) && p->len)
179
+   {
180
+      if( *p->s == ';')
181
+      {
182
+         ++p->s;
183
+         --p->len;
184
+      }
185
+   }
186
+   
187
+   return( 0);
150 188
 }
151 189
 
152 190
 
153
-static id   _parse_array( char **s, NSUInteger *len)
191
+static id   _parse_array( struct parse_context *p)
154 192
 {
155
-    NSMutableArray   *array;
156
-    id               parsed;
157
-    
158
-    array = [NSMutableArray array];
159
-    while( *len)
160
-    {
161
-        if( skip_white( s, len))
162
-            return( nil);
163
-    
164
-        if( **s == ',')
165
-        {
166
-           ++*s;
167
-           --*len;
168
-           continue;
169
-        }
170
-
171
-        if( **s == ')')
172
-        {
173
-           ++*s;
174
-           --*len;
175
-           return( array);
176
-        }
177
-
178
-        parsed = _parse_object( s, len);
179
-        if( ! parsed)
180
-            break;
181
-        [array addObject:parsed];
182
-    }
183
-    NSLog( @"Array truncated");
184
-    return( nil);
193
+   NSMutableArray   *array;
194
+   id               parsed;
195
+   
196
+   array = [NSMutableArray array];
197
+   while( p->len)
198
+   {
199
+      if( skip_white( p))
200
+         return( nil);
201
+      
202
+      if( *p->s == ',')
203
+      {
204
+         ++p->s;
205
+         --p->len;
206
+         continue;
207
+      }
208
+      
209
+      if( *p->s == ')')
210
+      {
211
+         ++p->s;
212
+         --p->len;
213
+         return( array);
214
+      }
215
+      
216
+      parsed = _parse_object( p);
217
+      if( ! parsed)
218
+         break;
219
+
220
+      [array addObject:parsed];
221
+   }
222
+   NSLog( @"Array truncated");
223
+   return( nil);
185 224
 }
186 225
 
187 226
 
188
-static id   _parse_dictionary( char **s, NSUInteger *len)
227
+static id   _parse_data( struct parse_context *p)
189 228
 {
190
-    NSMutableDictionary   *dictionary;
191
-    
192
-    dictionary = [NSMutableDictionary dictionary];
193
-    while( *len)
194
-    {
195
-        if( skip_white( s, len))
196
-            break;
197
-                
198
-        if( **s == ';')
199
-        {
200
-           ++*s;
201
-           --*len;
202
-           continue;
203
-        }
204
-        
205
-        if( **s == '}')
206
-        {
207
-           ++*s;
208
-           --*len;
209
-           return( dictionary);
210
-        }
211
-        
212
-        if( _parse_key_value_into_dictionary( s, len, dictionary) < 0)
213
-            return( nil);
214
-    }
215
-    NSLog( @"Dictionary truncated");
216
-    return( nil);
217
-}
229
+   NSMutableData   *data;
230
+   unsigned char   byte;
231
+   int             c, d;
232
+   
233
+   data = [NSMutableData data];
234
+   while( p->len)
235
+   {
236
+      if( skip_white( p))
237
+         return( nil);
238
+      
239
+      if( *p->s == '>')
240
+      {
241
+         ++p->s;
242
+         --p->len;
243
+         return( data);
244
+      }
245
+      
246
+      if( p->len < 2)
247
+         break;
248
+      
249
+      c = hexify( p->s[ 0]);
250
+      d = hexify( p->s[ 1]);
251
+      if( c < 0 || d < 0)
252
+         break;
253
+      
254
+      byte = ((unsigned char) c << 4) | (unsigned char) d;
218 255
 
256
+      p->len -= 2;
257
+      p->s   += 2;
258
+      
259
+      // terribly inefficient
260
+      [data appendBytes:&byte
261
+                 length:byte];
262
+   }
263
+   NSLog( @"NSData truncated");
264
+   return( nil);
265
+}
219 266
 
220
-static id  _parse_object( char **s, NSUInteger *len)
267
+static id   _parse_dictionary( struct parse_context *p)
221 268
 {
222
-    if( skip_white( s, len))
223
-        return( nil);
224
-        
225
-    switch( **s)
226
-    {
227
-    case '{' :
228
-        ++*s;
229
-        --*len;
230
-        return( _parse_dictionary( s, len));
231
-
232
-    case '(' :
233
-        ++*s;
234
-        --*len;
235
-        return( _parse_array( s, len));
236
-    }
237
-    return( _parse_value( s, len));
269
+   NSMutableDictionary   *dictionary;
270
+   
271
+   dictionary = [NSMutableDictionary dictionary];
272
+   while( p->len)
273
+   {
274
+      if( skip_white( p))
275
+         break;
276
+      
277
+      if( *p->s == '}')
278
+      {
279
+         ++p->s;
280
+         --p->len;
281
+         return( dictionary);
282
+      }
283
+      
284
+      if( _parse_key_value_into_dictionary( p, dictionary) < 0)
285
+         return( nil);
286
+   }
287
+   NSLog( @"Dictionary truncated");
288
+   return( nil);
238 289
 }
239 290
 
240 291
 
241
-static id  parse_old_plist( NSData *data)
292
+static id  _parse_object( struct parse_context *p)
242 293
 {
243
-   char         *s;
244
-   NSUInteger   len;
294
+   if( skip_white( p))
295
+      return( nil);
245 296
    
246
-   s   = (char *) [data bytes];
247
-   len = [data length];
248
-   return( _parse_object( &s, &len));
297
+   switch( *p->s)
298
+   {
299
+   case '(' :
300
+      ++p->s;
301
+      --p->len;
302
+      return( _parse_array( p));
303
+
304
+   case '<' :
305
+      ++p->s;
306
+      --p->len;
307
+      return( _parse_data( p));
308
+
309
+   case '{' :
310
+      ++p->s;
311
+      --p->len;
312
+      return( _parse_dictionary( p));
313
+      
314
+   }
315
+   return( _parse_value( p));
316
+}
317
+
318
+
319
+static id    parse_old_plist( NSData *data)
320
+{
321
+   struct parse_context   ctxt;
322
+
323
+   ctxt.s   = (char *) [data bytes];
324
+   ctxt.len = [data length];
325
+
326
+   return( _parse_object( &ctxt));
249 327
 }
250 328
 
251 329
 
... ...
@@ -7,255 +7,7 @@
7 7
 //
8 8
 
9 9
 #import <Foundation/Foundation.h>
10
-#include <ctype.h>
11
-
12
-
13
-/* this is really very, very old code, that has been resurrected */
14
-
15
-#define TRY_VALIANTLY_TO_CONVERT  0
16
-
17
-
18
-
19
-static inline int   iswhite( int c)
20
-{
21
-   return( c == ' ' || c == '\n' || c == '\r' || c == '\t');
22
-}
23
-
24
-
25
-static id  _parse_object( char **s, NSUInteger *len);
26
-
27
-static int   skip_white( char **s, NSUInteger *len)
28
-{
29
-   while( *len)
30
-   {
31
-      if( ! iswhite( **s))
32
-         return( 0);
33
-      ++*s;
34
-      --*len;
35
-   }
36
-   return( -1);
37
-}
38
-
39
-/*
40
- static NSString  *slurp_identifier( char **s, unsigned int *len)
41
- {
42
- int    c;
43
- char   *memo;
44
- 
45
- memo = *s;
46
- while( *len)
47
- {
48
- c = **s;
49
- if( ! (isalnum( c) || c == '_'))
50
- break;
51
- ++*s;
52
- --*len;
53
- }
54
- return( [NSString stringWithCString:memo
55
- length:*s - memo]);
56
- }
57
- */
58
-
59
-static id   _parse_value( char **s, NSUInteger *len)
60
-{
61
-   int        c;
62
-   char       *memo;
63
-   int        quoted;
64
-   NSString   *string;
65
-   
66
-   quoted = **s == '"';
67
-   if( quoted)
68
-   {
69
-      ++*s;
70
-      --*len;
71
-   }
72
-   
73
-   memo = *s;
74
-   while( *len)
75
-   {
76
-      c = **s;
77
-      if( quoted)
78
-      {
79
-         if( c == '"')
80
-            break;
81
-      }
82
-      else
83
-      {
84
-         if( iswhite( c))
85
-            break;
86
-      }
87
-      ++*s;
88
-      --*len;
89
-   }
90
-   
91
-   
92
-   string = [NSString stringWithCString:memo
93
-                                 length:*s - memo];
94
-   if( quoted)
95
-   {
96
-      ++*s;
97
-      --*len;
98
-   }
99
-   
100
-   // brute force, try NSCalendarDate first
101
-   // then NSDecimalNumber Number
102
-   // finally stay as NSString
103
-#if TRY_VALIANTLY_TO_CONVERT
104
-   if( isdigit( *memo))
105
-   {
106
-      if( value = [NSDecimalNumber decimalNumberWithString:string])
107
-         return( value);
108
-   }
109
-   
110
-   if( value = [NSCalendarDate dateWithString:string])
111
-      return( value);
112
-#endif
113
-   
114
-   return( string);
115
-}
116
-
117
-
118
-static int   _parse_key_value_into_dictionary( char **s, NSUInteger *len, NSMutableDictionary *dictionary)
119
-{
120
-   id   key;
121
-   id   value;
122
-   
123
-   
124
-   key = _parse_value( s, len);
125
-   if( ! key)
126
-      return( -1);
127
-   
128
-   if( skip_white( s, len))
129
-   {
130
-      NSLog( @"Malformed key value pair, only key %@ present", key);
131
-      return( -2);
132
-   }
133
-   
134
-   if( **s != '=')
135
-   {
136
-      NSLog( @"Malformed key value pair, = missing after key %@", key);
137
-      return( -3);
138
-   }
139
-   
140
-   ++*s;
141
-   --*len;
142
-   
143
-   if( skip_white( s, len))
144
-   {
145
-      NSLog( @"Malformed key value pair, missing value after key %@", key);
146
-      return( -4);
147
-   }
148
-   
149
-   value = _parse_object( s, len);
150
-   if( ! value)
151
-   {
152
-      NSLog( @"Malformed key value pair, missing value after key %@", key);
153
-      return( -4);
154
-   }
155
-   [dictionary setObject:value
156
-                  forKey:key];
157
-   
158
-   return( 0);
159
-}
160
-
161
-
162
-static id   _parse_array( char **s, NSUInteger *len)
163
-{
164
-   NSMutableArray   *array;
165
-   id               parsed;
166
-   
167
-   array = [NSMutableArray array];
168
-   while( *len)
169
-   {
170
-      if( skip_white( s, len))
171
-         return( nil);
172
-      
173
-      if( **s == ',')
174
-      {
175
-         ++*s;
176
-         --*len;
177
-         continue;
178
-      }
179
-      
180
-      if( **s == ')')
181
-      {
182
-         ++*s;
183
-         --*len;
184
-         return( array);
185
-      }
186
-      
187
-      parsed = _parse_object( s, len);
188
-      if( ! parsed)
189
-         break;
190
-      [array addObject:parsed];
191
-   }
192
-   NSLog( @"Array truncated");
193
-   return( nil);
194
-}
195
-
196
-
197
-static id   _parse_dictionary( char **s, NSUInteger *len)
198
-{
199
-   NSMutableDictionary   *dictionary;
200
-   
201
-   dictionary = [NSMutableDictionary dictionary];
202
-   while( *len)
203
-   {
204
-      if( skip_white( s, len))
205
-         break;
206
-      
207
-      if( **s == ';')
208
-      {
209
-         ++*s;
210
-         --*len;
211
-         continue;
212
-      }
213
-      
214
-      if( **s == '}')
215
-      {
216
-         ++*s;
217
-         --*len;
218
-         return( dictionary);
219
-      }
220
-      
221
-      if( _parse_key_value_into_dictionary( s, len, dictionary) < 0)
222
-         return( nil);
223
-   }
224
-   NSLog( @"Dictionary truncated");
225
-   return( nil);
226
-}
227
-
228
-
229
-static id  _parse_object( char **s, NSUInteger *len)
230
-{
231
-   if( skip_white( s, len))
232
-      return( nil);
233
-   
234
-   switch( **s)
235
-   {
236
-      case '{' :
237
-         ++*s;
238
-         --*len;
239
-         return( _parse_dictionary( s, len));
240
-         
241
-      case '(' :
242
-         ++*s;
243
-         --*len;
244
-         return( _parse_array( s, len));
245
-   }
246
-   return( _parse_value( s, len));
247
-}
248
-
249
-
250
-static id    parse_old_plist( NSData *data)
251
-{
252
-   char         *s;
253
-   NSUInteger   len;
254
-   
255
-   s   = (char *) [data bytes];
256
-   len = [data length];
257
-   return( _parse_object( &s, &len));
258
-}
10
+#import "NSPropertyListSerialization+MullePlistReader.h"
259 11
 
260 12
 
261 13
 static NSStringEncoding   encodings[] =
... ...
@@ -276,32 +28,50 @@ int main (int argc, const char * argv[])
276 276
    NSPropertyListFormat   format;
277 277
    NSString               *error;
278 278
    NSString               *s;
279
+   NSString               *path;
279 280
    id                     list;
280 281
    NSStringEncoding       *p_encoding;
281 282
    NSFileHandle           *handle;
283
+   NSFileManager          *fileManager;
282 284
    
283
-   pool   = [NSAutoreleasePool new];
284
-   handle = [NSFileHandle fileHandleWithStandardInput];
285
-   data   = [handle readDataToEndOfFile];
285
+   pool = [NSAutoreleasePool new];
286 286
    
287
+   if( argc > 1)
288
+   {
289
+      fileManager = [NSFileManager defaultManager];
290
+
291
+      path   = [fileManager stringWithFileSystemRepresentation:argv[ 1]
292
+                                                        length:strlen( argv[ 1])];
293
+      handle = [NSFileHandle fileHandleForReadingAtPath:path];
294
+   }
295
+   else
296
+      handle = [NSFileHandle fileHandleWithStandardInput];
297
+
298
+   data = [handle readDataToEndOfFile];
287 299
    if( ! [data length])
288 300
    {
289 301
       fprintf( stderr, "No data to convert\n");
290 302
       return( -1);
291 303
    }
292 304
    
293
-   list = [NSPropertyListSerialization propertyListFromData:data
294
-                                           mutabilityOption:NSPropertyListImmutable
295
-                                                     format:&format
296
-                                           errorDescription:&error];
305
+   list = [NSPropertyListSerialization mullePropertyListFromData:data
306
+                                                mutabilityOption:NSPropertyListImmutable
307
+                                                          format:&format
308
+                                                errorDescription:&error];
297 309
    if( ! list)
298 310
    {
311
+      fprintf( stderr, "retrying with different encodings...\n");
312
+      
299 313
       for( p_encoding = encodings; *p_encoding; p_encoding++)
300 314
       {
301 315
          s = [[NSString alloc] initWithData:data
302 316
                                    encoding:*p_encoding];
303 317
          
304
-         list = parse_old_plist( [s dataUsingEncoding:NSUTF8StringEncoding]);
318
+         list = [NSPropertyListSerialization mullePropertyListFromData:data
319
+                                                      mutabilityOption:NSPropertyListImmutable
320
+                                                                format:&format
321
+                                                      errorDescription:&error];
322
+         
305 323
          [s release];
306 324
          if( list)
307 325
             break;
... ...
@@ -309,11 +79,11 @@ int main (int argc, const char * argv[])
309 309
       
310 310
       if( ! list)
311 311
       {
312
-         fprintf( stderr, "Conversion of property list failed: %s\n", [error cString]);
312
+         fprintf( stderr, "Conversion of property list failed: %s\n", [error UTF8String]);
313 313
          return( -1);;
314 314
       }
315 315
    }
316 316
 
317
-   printf( "%s", [[list description] cString]);
317
+   printf( "%s", [[list description] UTF8String]);
318 318
    return( 0);
319 319
 }
... ...
@@ -33,6 +33,7 @@
33 33
 		4160067E16C6679800347385 /* NSData+ZLib.m in Sources */ = {isa = PBXBuildFile; fileRef = 4160067B16C6679800347385 /* NSData+ZLib.m */; };
34 34
 		4160067F16C6679800347385 /* NSObject+UnformattedDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 4160067D16C6679800347385 /* NSObject+UnformattedDescription.m */; };
35 35
 		4160068016C66B2F00347385 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 41E9D74A16C57766001F6DD9 /* libz.dylib */; };
36
+		4178DCDA1B7F9F130034E955 /* NSPropertyListSerialization+MullePlistReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 41BB204716CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.m */; };
36 37
 		41BB204916CE641F001FF614 /* NSDictionary+PListOldSkool.m in Sources */ = {isa = PBXBuildFile; fileRef = 41BB204516CE641F001FF614 /* NSDictionary+PListOldSkool.m */; };
37 38
 		41BB204A16CE641F001FF614 /* NSObject+PListOldSkool.m in Sources */ = {isa = PBXBuildFile; fileRef = 41BB204616CE641F001FF614 /* NSObject+PListOldSkool.m */; };
38 39
 		41BB204B16CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 41BB204716CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.m */; };
... ...
@@ -135,11 +136,11 @@
135 135
 		4160068216C67F9800347385 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.md; sourceTree = SOURCE_ROOT; };
136 136
 		41BB204116CE641F001FF614 /* NSDictionary+PListOldSkool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+PListOldSkool.h"; sourceTree = "<group>"; };
137 137
 		41BB204216CE641F001FF614 /* NSObject+PListOldSkool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+PListOldSkool.h"; sourceTree = "<group>"; };
138
-		41BB204316CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPropertyListSerialization+MullePlistReader.h"; sourceTree = "<group>"; };
138
+		41BB204316CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSPropertyListSerialization+MullePlistReader.h"; path = "../mulle-plist-compress/NSPropertyListSerialization+MullePlistReader.h"; sourceTree = "<group>"; };
139 139
 		41BB204416CE641F001FF614 /* NSPropertyListSerialization+MullePlistWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPropertyListSerialization+MullePlistWriter.h"; sourceTree = "<group>"; };
140 140
 		41BB204516CE641F001FF614 /* NSDictionary+PListOldSkool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+PListOldSkool.m"; sourceTree = "<group>"; };
141 141
 		41BB204616CE641F001FF614 /* NSObject+PListOldSkool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+PListOldSkool.m"; sourceTree = "<group>"; };
142
-		41BB204716CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPropertyListSerialization+MullePlistReader.m"; sourceTree = "<group>"; };
142
+		41BB204716CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSPropertyListSerialization+MullePlistReader.m"; path = "../mulle-plist-compress/NSPropertyListSerialization+MullePlistReader.m"; sourceTree = "<group>"; };
143 143
 		41BB204816CE641F001FF614 /* NSPropertyListSerialization+MullePlistWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPropertyListSerialization+MullePlistWriter.m"; sourceTree = "<group>"; };
144 144
 		41C74E6416C99569005FA265 /* mulle-plist-fix */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "mulle-plist-fix"; sourceTree = BUILT_PRODUCTS_DIR; };
145 145
 		41C74E6716C99569005FA265 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
... ...
@@ -241,8 +242,6 @@
241 241
 				41BB204516CE641F001FF614 /* NSDictionary+PListOldSkool.m */,
242 242
 				41BB204216CE641F001FF614 /* NSObject+PListOldSkool.h */,
243 243
 				41BB204616CE641F001FF614 /* NSObject+PListOldSkool.m */,
244
-				41BB204316CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.h */,
245
-				41BB204716CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.m */,
246 244
 				41BB204416CE641F001FF614 /* NSPropertyListSerialization+MullePlistWriter.h */,
247 245
 				41BB204816CE641F001FF614 /* NSPropertyListSerialization+MullePlistWriter.m */,
248 246
 				4160067A16C6679800347385 /* NSData+ZLib.h */,
... ...
@@ -269,6 +268,8 @@
269 269
 		41C74E6616C99569005FA265 /* mulle-plist-fix */ = {
270 270
 			isa = PBXGroup;
271 271
 			children = (
272
+				41BB204316CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.h */,
273
+				41BB204716CE641F001FF614 /* NSPropertyListSerialization+MullePlistReader.m */,
272 274
 				41C74E6716C99569005FA265 /* main.m */,
273 275
 				41C74E6B16C99569005FA265 /* mulle-plist-fix.8 */,
274 276
 				41C74E6916C99569005FA265 /* Supporting Files */,
... ...
@@ -447,6 +448,7 @@
447 447
 			buildActionMask = 2147483647;
448 448
 			files = (
449 449
 				41C74E6816C99569005FA265 /* main.m in Sources */,
450
+				4178DCDA1B7F9F130034E955 /* NSPropertyListSerialization+MullePlistReader.m in Sources */,
450 451
 			);
451 452
 			runOnlyForDeploymentPostprocessing = 0;
452 453
 		};