Skip to content

Cannot parse some sort of NeXT Step style Property List #67

@manicmaniac

Description

@manicmaniac

CFPropertyList::List raises an error when the following types of Property List.

1. Dictionary without surrounding { }

require 'cfpropertylist'

data = 'foo = bar;'
CFPropertyList::List.new(data: data)
/path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb:25:in `load': content after root object (CFFormatError)
	from /path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb:321:in `load_str'
	from /path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb:239:in `initialize'
	from /var/folders/tm/wy8sj46s6yq4rlfgsxyvd1l80000gn/T/vdeL7YX/205:5:in `new'
	from /var/folders/tm/wy8sj46s6yq4rlfgsxyvd1l80000gn/T/vdeL7YX/205:5:in `<main>'

I cannot find the specification but I think it is a valid format because of some reasons.

Details
  1. plutil can parse it.
$ echo 'foo = bar;' | plutil -p -
{
  "foo" => "bar"
}
  1. pl can parse it.
$ echo 'foo = bar;' | pl
{
    foo = bar;
}
  1. Foundation classes can parse it.
import Foundation

try! "foo = bar;".write(toFile: "foobar.plist", atomically: false, encoding: .utf8)
print(NSDictionary(contentsOfFile: "foobar.plist")!)
// prints
// {
//     foo = bar;
// }

And also, .strings format, which is often used as iOS localized string file, is encoded as this kind of Property List.

Whitespaces at the end

require 'cfpropertylist'

data = "foo\n"
CFPropertyList::List.new(data: data)
/path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb:25:in `load': content after root object (CFFormatError)
	from /path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb:321:in `load_str'
	from /path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb:239:in `initialize'
	from /var/folders/tm/wy8sj46s6yq4rlfgsxyvd1l80000gn/T/vdeL7YX/188:5:in `new'
	from /var/folders/tm/wy8sj46s6yq4rlfgsxyvd1l80000gn/T/vdeL7YX/188:5:in `<main>'

I think it is also valid because of the following reasons.

Details
  1. plutil can parse it.
$ printf 'foo\n' | plutil -p -
"foo"
  1. pl can parse it.
$ printf 'foo\n' | pl
foo
  1. Foundation classes can parse it.
import Foundation

try! "foo\n".write(toFile: "foobar.plist", atomically: false, encoding: .utf8)
print(try! NSString(contentsOfFile: "foobar.plist", encoding: String.Encoding.utf8.rawValue))
// prints foo

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions