├── .github └── workflows │ ├── branch-check.yml │ ├── publish.yml │ └── stale.yml ├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── dev-requirements.txt ├── openstep_parser ├── __init__.py └── openstep_parser.py ├── pytest.ini ├── requirements.txt ├── setup.py └── tests ├── TestParsing.py └── samples ├── cloud-search.pbxproj ├── collection-view.pbxproj ├── metal-image-processing.pbxproj ├── music-cube.pbxproj └── no_whitespace.pbxproj /.github/workflows/branch-check.yml: -------------------------------------------------------------------------------- 1 | name: branch-check 2 | 3 | on: 4 | push: 5 | branches: 6 | - '*' 7 | pull_request: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | matrix: 17 | python: ['3.8', '3.9', '3.10', '3.11', '3.x'] 18 | 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | id: checkout 23 | 24 | - name: Setup 25 | uses: actions/setup-python@v5 26 | with: 27 | python-version: ${{ matrix.python }} 28 | 29 | - name: Dependencies 30 | run: pip install -r dev-requirements.txt 31 | 32 | - name: Test 33 | run: make coverage 34 | 35 | - name: SonarCloud Scan 36 | uses: SonarSource/sonarcloud-github-action@master 37 | if: github.event_name == 'pull_request' && matrix.python == '3.x' && github.event.pull_request.head.repo.full_name != github.repository 38 | with: 39 | args: > 40 | -Dsonar.projectVersion=${{ env.VERSION }} 41 | -Dsonar.pullrequest.key=${{ github.event.number }} 42 | -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} 43 | -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} 44 | -Dsonar.organization=kronenthaler 45 | -Dsonar.projectKey=kronenthaler_openstep-parser 46 | -Dsonar.projectName=openstep-parser 47 | -Dsonar.python.version=3 48 | -Dsonar.python.coverage.reportPaths=tests/coverage.xml 49 | -Dsonar.sources=openstep_parser/ 50 | -Dsonar.tests=tests/ 51 | -Dsonar.verbose=true 52 | -Dsonar.c.file.suffixes=- 53 | -Dsonar.cpp.file.suffixes=- 54 | -Dsonar.objc.file.suffixes=- 55 | env: 56 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any 57 | SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 58 | 59 | - name: SonarCloud Scan 60 | uses: SonarSource/sonarcloud-github-action@master 61 | if: github.event_name == 'push' && matrix.python == '3.x' && github.event.pull_request.head.repo.full_name != github.repository 62 | with: 63 | args: > 64 | -Dsonar.projectVersion=${{ env.VERSION }} 65 | -Dsonar.branch.name=${{ github.ref_name }} 66 | -Dsonar.organization=kronenthaler 67 | -Dsonar.projectKey=kronenthaler_openstep-parser 68 | -Dsonar.projectName=openstep-parser 69 | -Dsonar.python.version=3 70 | -Dsonar.python.coverage.reportPaths=tests/coverage.xml 71 | -Dsonar.sources=openstep_parser/ 72 | -Dsonar.tests=tests/ 73 | -Dsonar.verbose=true 74 | -Dsonar.c.file.suffixes=- 75 | -Dsonar.cpp.file.suffixes=- 76 | -Dsonar.objc.file.suffixes=- 77 | env: 78 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any 79 | SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 80 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: publish 2 | 3 | on: 4 | push: 5 | tags: 6 | - '*' 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | 15 | - name: Setup 16 | uses: actions/setup-python@v5 17 | with: 18 | python-version: '3.x' 19 | 20 | - name: Dependencies 21 | run: | 22 | pip install . 23 | pip install setuptools wheel twine 24 | 25 | - name: Deploy 26 | run: | 27 | python setup.py sdist bdist_wheel 28 | twine upload dist/* 29 | env: 30 | TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} 31 | TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} 32 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: "close-stale-issues" 2 | 3 | on: 4 | schedule: 5 | - cron: "0 0 1 * *" 6 | 7 | jobs: 8 | stale: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/stale@v1 12 | with: 13 | repo-token: ${{ secrets.GITHUB_TOKEN }} 14 | days-before-stale: 60 15 | days-before-close: 10 16 | stale-issue-message: 'This issue has become stale, the required information has not been provided and it is been marked for closure in the next 10 days' 17 | stale-issue-label: 'not-enough-info' 18 | exempt-issue-label: 'enhancement' 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | *.egg-info/ 23 | .installed.cfg 24 | *.egg 25 | 26 | # PyInstaller 27 | # Usually these files are written by a python script from a template 28 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 29 | *.manifest 30 | *.spec 31 | 32 | # Installer logs 33 | pip-log.txt 34 | pip-delete-this-directory.txt 35 | 36 | # Unit test / coverage reports 37 | htmlcov/ 38 | .tox/ 39 | .coverage 40 | .coverage.* 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | *,cover 45 | 46 | # Translations 47 | *.mo 48 | *.pot 49 | 50 | # Django stuff: 51 | *.log 52 | 53 | # Sphinx documentation 54 | docs/_build/ 55 | 56 | # PyBuilder 57 | target/ 58 | .idea 59 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, Ignacio Calderon 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 18 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 20 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 21 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 22 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 | 25 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: coverage coverage-term test install-dependencies 2 | 3 | coverage: install-dependencies 4 | pytest --cov-report=xml --cov=../ --cov-branch 5 | rm -rf .coverage 6 | 7 | coverage-term: install-dependencies 8 | pytest --cov-report=term --cov=../ --cov-branch 9 | rm -rf .coverage 10 | 11 | test: 12 | pytest 13 | 14 | install-dependencies: 15 | pip3 install -r dev-requirements.txt 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/kronenthaler/openstep-parser/branch-check/master?logo=github&style=flat-square)](https://github.com/kronenthaler/openstep-parser/actions?query=workflow%3Abranch-check) 2 | [![Codacy branch coverage](https://img.shields.io/codacy/coverage/d5402a91aa7b4234bd1c19b5e86a63be/master?logo=codacy&style=flat-square)](https://www.codacy.com/app/kronenthaler/pbxproj?utm_source=github.com&utm_medium=referral&utm_content=kronenthaler/pbxproj&utm_campaign=badger) 3 | [![Codacy grade](https://img.shields.io/codacy/grade/d5402a91aa7b4234bd1c19b5e86a63be?logo=codacy&style=flat-square)](https://www.codacy.com/app/kronenthaler/openstep-parser?utm_source=github.com&utm_medium=referral&utm_content=kronenthaler/openstep-parser&utm_campaign=badger) 4 | [![PyPI](https://img.shields.io/pypi/v/openstep-parser?color=97cb02&logo=python&logoColor=ffffff&style=flat-square)](https://pypi.python.org/pypi/openstep_parser) 5 | [![PyPI - Downloads](https://img.shields.io/pypi/dm/openstep-parser?color=97cb02&logo=python&logoColor=ffffff&style=flat-square)](https://pypi.python.org/pypi/openstep_parser/) 6 | [![PyPI - License](https://img.shields.io/pypi/l/openstep-parser?color=97cb02&logo=python&logoColor=ffffff&style=flat-square)](LICENSE) 7 | 8 | # OpenStep Parser 9 | 10 | Parse Xcode projects directly using python. It doesn't require system command utilities. 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /dev-requirements.txt: -------------------------------------------------------------------------------- 1 | -r requirements.txt 2 | pytest 3 | pytest-cov -------------------------------------------------------------------------------- /openstep_parser/__init__.py: -------------------------------------------------------------------------------- 1 | from .openstep_parser import OpenStepDecoder 2 | 3 | __version__ = '2.0.1' 4 | -------------------------------------------------------------------------------- /openstep_parser/openstep_parser.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Ignacio Calderon 2 | # All rights reserved. 3 | # 4 | # Redistribution and use in source and binary forms, with or without 5 | # modification, are permitted provided that the following conditions are met: 6 | # 7 | # * Redistributions of source code must retain the above copyright notice, this 8 | # list of conditions and the following disclaimer. 9 | # 10 | # * Redistributions in binary form must reproduce the above copyright notice, 11 | # this list of conditions and the following disclaimer in the documentation 12 | # and/or other materials provided with the distribution. 13 | # 14 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 | # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 18 | # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 | # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 20 | # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 21 | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 22 | # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 | 25 | 26 | import sys 27 | 28 | 29 | _WHITESPACE = frozenset(' \t\n\r') 30 | _UNQUOTED_LITERAL_ENDER = frozenset(';,})').union(_WHITESPACE) 31 | _KEY_ENDER = frozenset(';=').union(_WHITESPACE) 32 | _LITERAL_ESCAPES = {'\\"': '"', "\\'": "'", "\\0": "\0", "\\\\": "\\", "\\n": "\n", "\\t": "\t"} 33 | 34 | 35 | class OpenStepDecoder(object): 36 | @classmethod 37 | def ParseFromFile(cls, fp): 38 | # Check the python version to support unicode files in python 2 39 | if sys.version_info > (3, 0): 40 | return cls.ParseFromString(fp.read()) 41 | else: 42 | return cls.ParseFromString(fp.read().decode('UTF-8')) 43 | 44 | @classmethod 45 | def ParseFromString(cls, str): 46 | return OpenStepDecoder()._parse(str) 47 | 48 | def _parse(self, str): 49 | # parse the comment if any 50 | index = 0 51 | if str[0] == '/' and str[1] == '/': 52 | while str[index] != '{': 53 | index += 1 54 | 55 | result, index = self._parse_dictionary(str, index) 56 | return result 57 | 58 | def _parse_dictionary(self, str, index): 59 | obj = {} 60 | 61 | if str[index] != '{': 62 | raise Exception("Expected { as dictionary start") 63 | 64 | index = self._parse_padding(str, index + 1) 65 | 66 | while str[index] != '}': 67 | index = self._parse_dictionary_entry(str, index, obj) 68 | index = self._parse_padding(str, index) 69 | 70 | index = self._parse_padding(str, index + 1) 71 | 72 | return obj, index 73 | 74 | def _parse_array(self, str, index): 75 | obj = [] 76 | 77 | if str[index] != '(': 78 | raise Exception("Expected ( as dictionary start") 79 | 80 | index = self._parse_padding(str, index + 1) 81 | while str[index] != ')': 82 | index = self._parse_array_entry(str, index, obj) 83 | index = self._parse_padding(str, index) 84 | 85 | index = self._parse_padding(str, index + 1) 86 | 87 | return obj, index 88 | 89 | def _parse_dictionary_entry(self, str, index, dictionary): 90 | # adds a entry to the given dictionary 91 | key, index = self._parse_key(str, index) 92 | 93 | if str[index] != '=': 94 | raise Exception("Expected = after a key. Found {1} @ {0}".format(index, str[index])) 95 | 96 | index = self._parse_padding(str, index + 1) 97 | value, index = self._parse_value(str, index) 98 | 99 | dictionary[key] = value 100 | 101 | if str[index] == '}': 102 | # Let the caller know we're finished by NOT skipping the "}" from the stream. 103 | return index 104 | 105 | if str[index] != ';': 106 | raise Exception("Expected ; after a value. Found {1} @ {0}".format(index, str[index])) 107 | 108 | # Skip the ";" character. 109 | return index + 1 110 | 111 | def _parse_array_entry(self, str, index, array): 112 | # parse a: dict, array or value until the ',' 113 | value, index = self._parse_value(str, index) 114 | 115 | array.append(value) 116 | 117 | if str[index] == ')': 118 | # Let the caller know we're finished by NOT skipping the ")" from the stream. 119 | return index 120 | 121 | if str[index] != ',': 122 | raise Exception("Expected , after a value. Found {1} @ {0} = {2}".format(index, str[index], value)) 123 | 124 | return index + 1 125 | 126 | def _parse_padding(self, str, index): 127 | str_len = len(str) 128 | 129 | # Ignore whitespace 130 | while index < str_len and str[index] in _WHITESPACE: 131 | index += 1 132 | 133 | # Ignore comment 134 | if index + 1 < str_len and str[index] == '/' and str[index + 1] == '*': 135 | # move after the first character in the comment 136 | index += 2 137 | 138 | while not (str[index] == '*' and str[index + 1] == '/'): 139 | index += 1 140 | 141 | # move after the first character after the comment 142 | index += 2 143 | 144 | # Ignore whitespace 145 | while index < str_len and str[index] in _WHITESPACE: 146 | index += 1 147 | 148 | return index 149 | 150 | def _parse_key(self, str, index): 151 | # returns the key and the last index. 152 | index = self._parse_padding(str, index) 153 | 154 | start_index = index 155 | if str[index] == '"': 156 | index += 1 157 | while str[index] != '"': 158 | index += 1 159 | start_index += 1 160 | end_index = index 161 | index += 1 162 | else: 163 | while str[index] not in _KEY_ENDER: 164 | index += 1 165 | end_index = index 166 | 167 | key = str[start_index:end_index] 168 | 169 | index = self._parse_padding(str, index) 170 | return key, index 171 | 172 | def _parse_literal(self, str, index): 173 | # returns the key and the last index. 174 | index = self._parse_padding(str, index) 175 | 176 | if str[index] == '"': 177 | index += 1 178 | # if the literal starts with " then spaces are allowed 179 | start_index = index 180 | while str[index] != '"' or str[index - 1] == "\\": 181 | index += 1 182 | key = str[start_index:index] 183 | for escaped_value, real_value in _LITERAL_ESCAPES.items(): 184 | key = key.replace(escaped_value, real_value) 185 | index += 1 186 | else: 187 | # otherwise stop in the spaces. 188 | start_index = index 189 | while str[index] not in _UNQUOTED_LITERAL_ENDER: 190 | index += 1 191 | key = str[start_index:index] 192 | 193 | index = self._parse_padding(str, index) 194 | return key, index 195 | 196 | def _parse_value(self, str, index): 197 | # return an object depending on the value of the first character. 198 | 199 | if str[index] == '{': 200 | value, index = self._parse_dictionary(str, index) 201 | elif str[index] == '(': 202 | value, index = self._parse_array(str, index) 203 | else: 204 | value, index = self._parse_literal(str, index) 205 | 206 | return value, index 207 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | python_files = Test*.py 3 | pythonpath = . 4 | testpaths = tests 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | setuptools -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from setuptools import setup, find_packages 3 | 4 | try: 5 | long_description = open("README.md").read() 6 | except IOError: 7 | long_description = "" 8 | 9 | def find_version(*file_paths): 10 | def read(*parts): 11 | import codecs 12 | import os 13 | here = os.path.abspath(os.path.dirname(__file__)) 14 | with codecs.open(os.path.join(here, *parts), 'r') as fp: 15 | return fp.read() 16 | 17 | import re 18 | version_file = read(*file_paths) 19 | version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", 20 | version_file, re.M) 21 | if version_match: 22 | return version_match.group(1) 23 | raise RuntimeError("Unable to find version string.") 24 | 25 | 26 | setup( 27 | name='openstep_parser', 28 | author='Ignacio Calderon', 29 | description='OpenStep plist reader into python objects', 30 | long_description=long_description, 31 | long_description_content_type='text/markdown', 32 | url="http://github.com/kronenthaler/openstep-parser", 33 | version=find_version("openstep_parser", "__init__.py"), 34 | license='BSD License', 35 | python_requires='>=3.8', 36 | packages=find_packages(exclude=['tests']) 37 | ) 38 | -------------------------------------------------------------------------------- /tests/TestParsing.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Ignacio Calderon 2 | # All rights reserved. 3 | # 4 | # Redistribution and use in source and binary forms, with or without 5 | # modification, are permitted provided that the following conditions are met: 6 | # 7 | # * Redistributions of source code must retain the above copyright notice, this 8 | # list of conditions and the following disclaimer. 9 | # 10 | # * Redistributions in binary form must reproduce the above copyright notice, 11 | # this list of conditions and the following disclaimer in the documentation 12 | # and/or other materials provided with the distribution. 13 | # 14 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 | # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 18 | # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 | # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 20 | # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 21 | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 22 | # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 | 25 | 26 | import os 27 | from os.path import join 28 | import unittest 29 | 30 | from openstep_parser import openstep_parser as osp 31 | 32 | 33 | class ParsingTest(unittest.TestCase): 34 | PWD = os.path.dirname(os.path.abspath(__file__)) 35 | 36 | def testParseNestedDictionary(self): 37 | line = '''{ a = { b = b1; }; };''' 38 | result = osp.OpenStepDecoder()._parse_dictionary(line, 0) 39 | assert result 40 | 41 | def testParseFileSample1(self): 42 | result = osp.OpenStepDecoder.ParseFromFile(open(join(self.PWD, 'samples/music-cube.pbxproj'))) 43 | assert result 44 | 45 | def testParseFileSample2(self): 46 | result = osp.OpenStepDecoder.ParseFromFile(open(join(self.PWD, 'samples/cloud-search.pbxproj'))) 47 | assert result 48 | 49 | def testParseFileSample3(self): 50 | result = osp.OpenStepDecoder.ParseFromFile(open(join(self.PWD, 'samples/collection-view.pbxproj'))) 51 | assert result 52 | 53 | def testParseFileSample4(self): 54 | result = osp.OpenStepDecoder.ParseFromFile(open(join(self.PWD, 'samples/metal-image-processing.pbxproj'))) 55 | assert result 56 | 57 | def testParseFileSample5(self): 58 | result = osp.OpenStepDecoder.ParseFromFile(open(join(self.PWD, 'samples/no_whitespace.pbxproj'))) 59 | assert result 60 | 61 | def testIgnoreWhitespacesFromBeginning(self): 62 | parser = osp.OpenStepDecoder() 63 | index = parser._parse_padding(' 3 ', 0) 64 | assert index == 3 65 | 66 | def testIgnoreWhitespacesInTheMiddle(self): 67 | parser = osp.OpenStepDecoder() 68 | index = parser._parse_padding('0 3 ', 1) 69 | assert index == 4 70 | 71 | def testIgnoreComment(self): 72 | parser = osp.OpenStepDecoder() 73 | index = parser._parse_padding('/*12345/67890*/ a', 0) 74 | assert index == 16 75 | 76 | def testIgnoreFakeComment(self): 77 | parser = osp.OpenStepDecoder() 78 | index = parser._parse_padding('/bin/sh/ ', 0) 79 | assert index == 0 80 | 81 | def testParsingKey(self): 82 | parser = osp.OpenStepDecoder() 83 | line = ' /* some comments */ KEY-NAME ' 84 | key, index = parser._parse_key(line, 0) 85 | assert key == 'KEY-NAME' 86 | assert index == len(line) 87 | 88 | def testParsingKeyQuoted(self): 89 | parser = osp.OpenStepDecoder() 90 | line = ' /* some comments */ "KEY-NAME" ' 91 | key, index = parser._parse_key(line, 0) 92 | assert key == 'KEY-NAME' 93 | assert index == len(line) 94 | 95 | def testDictionaryEntry(self): 96 | parser = osp.OpenStepDecoder() 97 | line = ' /* some comments */ KEY-NAME /* asd */ = /* adfasdf */ value-1234 /* adfasdf */ ;' 98 | result = {} 99 | index = parser._parse_dictionary_entry(line, 0, result) 100 | 101 | assert result['KEY-NAME'] == 'value-1234' 102 | 103 | def testDictionaryEntryQuoted(self): 104 | parser = osp.OpenStepDecoder() 105 | line = ' /* some comments */ KEY-NAME /* asd */ = /* adfasdf */ "value\\n\\"1234\\"" /* adfasdf */ ;' 106 | result = {} 107 | index = parser._parse_dictionary_entry(line, 0, result) 108 | 109 | assert result['KEY-NAME'] == 'value\n"1234"' 110 | 111 | def testDictionaryEntryTabQuoted(self): 112 | parser = osp.OpenStepDecoder() 113 | line = ' /* some comments */ KEY-NAME /* asd */ = /* adfasdf */ "\\t pre\\t \\tsuf pre\\tsuf \\t" /* adfasdf */ ;' 114 | result = {} 115 | index = parser._parse_dictionary_entry(line, 0, result) 116 | 117 | assert result['KEY-NAME'] == '\t pre\t \tsuf pre\tsuf \t' 118 | 119 | def testDictionaryEntryMissingEqual(self): 120 | parser = osp.OpenStepDecoder() 121 | line = ' /* some comments */ KEY-NAME /* asd */ /* adfasdf */ value-1234 /* adfasdf */ ;' 122 | result = {} 123 | try: 124 | index = parser._parse_dictionary_entry(line, 0, result) 125 | assert 1 == 0 126 | except Exception: 127 | pass 128 | 129 | def testDictionaryEntryMissingSemicolon(self): 130 | parser = osp.OpenStepDecoder() 131 | line = ' /* some comments */ KEY-NAME /* asd */ = /* adfasdf */ value-1234 /* adfasdf */ ' 132 | result = {} 133 | try: 134 | index = parser._parse_dictionary_entry(line, 0, result) 135 | assert 1 == 0 136 | except Exception: 137 | pass 138 | 139 | def testFullDictionary(self): 140 | parser = osp.OpenStepDecoder() 141 | line = '{ ' \ 142 | ' /* some comments */ KEY-NAME1 /* asd */ = /* adfasdf */ value-1234 /* adfasdf */ ; ' \ 143 | ' /* some comments */ KEY-NAME2 /* asd */ = /* adfasdf */ value-5678 /* adfasdf */ ; ' \ 144 | '}' 145 | result, index = parser._parse_dictionary(line, 0) 146 | assert len(result) == 2 147 | assert result['KEY-NAME1'] == 'value-1234' 148 | assert result['KEY-NAME2'] == 'value-5678' 149 | 150 | def testFullDictionaryWithoutEndingSemicolon(self): 151 | # Note that there's no semicolon between value-5678 and "}". 152 | parser = osp.OpenStepDecoder() 153 | line = '{ ' \ 154 | ' /* some comments */ KEY-NAME1 /* asd */ = /* adfasdf */ value-1234 /* adfasdf */ ; ' \ 155 | ' /* some comments */ KEY-NAME2 /* asd */ = /* adfasdf */ value-5678' \ 156 | '}' 157 | result, index = parser._parse_dictionary(line, 0) 158 | assert len(result) == 2 159 | assert result['KEY-NAME1'] == 'value-1234' 160 | assert result['KEY-NAME2'] == 'value-5678' 161 | 162 | def testArrayEntry(self): 163 | parser = osp.OpenStepDecoder() 164 | line = ' /* some comments */ KEY-NAME /* asd */ , ' 165 | result = [] 166 | index = parser._parse_array_entry(line, 0, result) 167 | assert result[0] == 'KEY-NAME' 168 | assert len(result) == 1 169 | 170 | def testFullArray(self): 171 | parser = osp.OpenStepDecoder() 172 | line = '( ' \ 173 | ' ABC,' \ 174 | ' DEF,' \ 175 | ' GHI,' \ 176 | ')' 177 | result, index = parser._parse_array(line, 0) 178 | assert len(result) == 3 179 | assert result[0] == 'ABC' 180 | assert result[1] == 'DEF' 181 | assert result[2] == 'GHI' 182 | 183 | def testFullArrayWithoutEndingComma(self): 184 | # Note that there's no comma between GHI and ")". 185 | parser = osp.OpenStepDecoder() 186 | line = '( ' \ 187 | ' ABC,' \ 188 | ' DEF,' \ 189 | ' GHI' \ 190 | ')' 191 | result, index = parser._parse_array(line, 0) 192 | assert len(result) == 3 193 | assert result[0] == 'ABC' 194 | assert result[1] == 'DEF' 195 | assert result[2] == 'GHI' 196 | 197 | def testParseWithComment(self): 198 | line = '// utf-8 \n{}' 199 | expected = {} 200 | result = osp.OpenStepDecoder.ParseFromString(line) 201 | assert result == expected 202 | -------------------------------------------------------------------------------- /tests/samples/cloud-search.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 11 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 12 | 532909C41AE81CF300EFD5C2 /* AAPLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 532909C11AE81CF300EFD5C2 /* AAPLAppDelegate.m */; }; 13 | 532909C51AE81CF300EFD5C2 /* AAPLTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532909C31AE81CF300EFD5C2 /* AAPLTableViewController.m */; }; 14 | 532909C81AE81D8500EFD5C2 /* AAPLCloudDocumentsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 532909C71AE81D8500EFD5C2 /* AAPLCloudDocumentsController.m */; }; 15 | 536B4A951AEEB48F00ACE4AE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 536B4A931AEEB48F00ACE4AE /* Localizable.strings */; }; 16 | 5393AB331AE816F6006612A4 /* AAPLFilterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393AB321AE816F6006612A4 /* AAPLFilterViewController.m */; }; 17 | 53D6CA1F1AD7059500F05766 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53D6CA1E1AD7059500F05766 /* Images.xcassets */; }; 18 | 53D6CA291AD705C300F05766 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53D6CA241AD705C300F05766 /* main.m */; }; 19 | 53D6CA2D1AD7060A00F05766 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53D6CA2B1AD7060A00F05766 /* MainStoryboard.storyboard */; }; 20 | 53D6CA361AD708FA00F05766 /* HTML Document.html in Resources */ = {isa = PBXBuildFile; fileRef = 53D6CA301AD708FA00F05766 /* HTML Document.html */; }; 21 | 53D6CA371AD708FA00F05766 /* Image Document.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 53D6CA311AD708FA00F05766 /* Image Document.jpg */; }; 22 | 53D6CA381AD708FA00F05766 /* PDF Document.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 53D6CA321AD708FA00F05766 /* PDF Document.pdf */; }; 23 | 53D6CA391AD708FB00F05766 /* Text Document1.txt in Resources */ = {isa = PBXBuildFile; fileRef = 53D6CA331AD708FA00F05766 /* Text Document1.txt */; }; 24 | 53D6CA3A1AD708FB00F05766 /* Text Document2.txt in Resources */ = {isa = PBXBuildFile; fileRef = 53D6CA341AD708FA00F05766 /* Text Document2.txt */; }; 25 | 53D6CA3B1AD708FB00F05766 /* Text Document3.txt in Resources */ = {isa = PBXBuildFile; fileRef = 53D6CA351AD708FA00F05766 /* Text Document3.txt */; }; 26 | /* End PBXBuildFile section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 30 | 1D6058910D05DD3D006BFB54 /* CloudSearch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CloudSearch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 32 | 532909C01AE81CF300EFD5C2 /* AAPLAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AAPLAppDelegate.h; path = CloudSearch/AAPLAppDelegate.h; sourceTree = ""; }; 33 | 532909C11AE81CF300EFD5C2 /* AAPLAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AAPLAppDelegate.m; path = CloudSearch/AAPLAppDelegate.m; sourceTree = ""; }; 34 | 532909C21AE81CF300EFD5C2 /* AAPLTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AAPLTableViewController.h; path = CloudSearch/AAPLTableViewController.h; sourceTree = ""; }; 35 | 532909C31AE81CF300EFD5C2 /* AAPLTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AAPLTableViewController.m; path = CloudSearch/AAPLTableViewController.m; sourceTree = ""; }; 36 | 532909C61AE81D8500EFD5C2 /* AAPLCloudDocumentsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLCloudDocumentsController.h; sourceTree = ""; }; 37 | 532909C71AE81D8500EFD5C2 /* AAPLCloudDocumentsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAPLCloudDocumentsController.m; sourceTree = ""; }; 38 | 533BCC631AE048D900183312 /* CloudSearch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = CloudSearch.entitlements; path = CloudSearch/CloudSearch.entitlements; sourceTree = ""; }; 39 | 536B4A941AEEB48F00ACE4AE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = CloudSearch/en.lproj/Localizable.strings; sourceTree = ""; }; 40 | 5393AB311AE816F6006612A4 /* AAPLFilterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AAPLFilterViewController.h; path = CloudSearch/AAPLFilterViewController.h; sourceTree = ""; }; 41 | 5393AB321AE816F6006612A4 /* AAPLFilterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AAPLFilterViewController.m; path = CloudSearch/AAPLFilterViewController.m; sourceTree = ""; }; 42 | 53D6CA1E1AD7059500F05766 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = CloudSearch/Images.xcassets; sourceTree = ""; }; 43 | 53D6CA201AD705A800F05766 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = CloudSearch/Info.plist; sourceTree = ""; }; 44 | 53D6CA241AD705C300F05766 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = CloudSearch/main.m; sourceTree = ""; }; 45 | 53D6CA271AD705C300F05766 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Prefix.pch; path = CloudSearch/Prefix.pch; sourceTree = ""; }; 46 | 53D6CA2E1AD7067D00F05766 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = CloudSearch/Base.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 47 | 53D6CA301AD708FA00F05766 /* HTML Document.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "HTML Document.html"; sourceTree = ""; }; 48 | 53D6CA311AD708FA00F05766 /* Image Document.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "Image Document.jpg"; sourceTree = ""; }; 49 | 53D6CA321AD708FA00F05766 /* PDF Document.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "PDF Document.pdf"; sourceTree = ""; }; 50 | 53D6CA331AD708FA00F05766 /* Text Document1.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Text Document1.txt"; sourceTree = ""; }; 51 | 53D6CA341AD708FA00F05766 /* Text Document2.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Text Document2.txt"; sourceTree = ""; }; 52 | 53D6CA351AD708FA00F05766 /* Text Document3.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Text Document3.txt"; sourceTree = ""; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 61 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | /* End PBXFrameworksBuildPhase section */ 66 | 67 | /* Begin PBXGroup section */ 68 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 1D6058910D05DD3D006BFB54 /* CloudSearch.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | 533BCC631AE048D900183312 /* CloudSearch.entitlements */, 80 | 53AF8AEC0D9C50B700726DBA /* Sources */, 81 | 29B97317FDCFA39411CA2CEA /* Resources */, 82 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 83 | 19C28FACFE9D520D11CA2CBB /* Products */, 84 | ); 85 | name = CustomTemplate; 86 | sourceTree = ""; 87 | }; 88 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | 53D6CA2B1AD7060A00F05766 /* MainStoryboard.storyboard */, 92 | 53D6CA201AD705A800F05766 /* Info.plist */, 93 | 536B4A931AEEB48F00ACE4AE /* Localizable.strings */, 94 | 53D6CA1E1AD7059500F05766 /* Images.xcassets */, 95 | 53D6CA2F1AD708FA00F05766 /* SampleDocs */, 96 | ); 97 | name = Resources; 98 | sourceTree = ""; 99 | }; 100 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 104 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 105 | ); 106 | name = Frameworks; 107 | sourceTree = ""; 108 | }; 109 | 53AF8AEC0D9C50B700726DBA /* Sources */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 53D6CA271AD705C300F05766 /* Prefix.pch */, 113 | 53D6CA241AD705C300F05766 /* main.m */, 114 | 532909C01AE81CF300EFD5C2 /* AAPLAppDelegate.h */, 115 | 532909C11AE81CF300EFD5C2 /* AAPLAppDelegate.m */, 116 | 532909C21AE81CF300EFD5C2 /* AAPLTableViewController.h */, 117 | 532909C31AE81CF300EFD5C2 /* AAPLTableViewController.m */, 118 | 5393AB311AE816F6006612A4 /* AAPLFilterViewController.h */, 119 | 5393AB321AE816F6006612A4 /* AAPLFilterViewController.m */, 120 | 53D6CA3C1AD7090300F05766 /* Shared */, 121 | ); 122 | name = Sources; 123 | sourceTree = ""; 124 | }; 125 | 53D6CA2F1AD708FA00F05766 /* SampleDocs */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | 53D6CA301AD708FA00F05766 /* HTML Document.html */, 129 | 53D6CA311AD708FA00F05766 /* Image Document.jpg */, 130 | 53D6CA321AD708FA00F05766 /* PDF Document.pdf */, 131 | 53D6CA331AD708FA00F05766 /* Text Document1.txt */, 132 | 53D6CA341AD708FA00F05766 /* Text Document2.txt */, 133 | 53D6CA351AD708FA00F05766 /* Text Document3.txt */, 134 | ); 135 | name = SampleDocs; 136 | path = ../SampleDocs; 137 | sourceTree = ""; 138 | }; 139 | 53D6CA3C1AD7090300F05766 /* Shared */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 532909C61AE81D8500EFD5C2 /* AAPLCloudDocumentsController.h */, 143 | 532909C71AE81D8500EFD5C2 /* AAPLCloudDocumentsController.m */, 144 | ); 145 | name = Shared; 146 | path = ../Shared; 147 | sourceTree = ""; 148 | }; 149 | /* End PBXGroup section */ 150 | 151 | /* Begin PBXNativeTarget section */ 152 | 1D6058900D05DD3D006BFB54 /* CloudSearch */ = { 153 | isa = PBXNativeTarget; 154 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CloudSearch" */; 155 | buildPhases = ( 156 | 1D60588D0D05DD3D006BFB54 /* Resources */, 157 | 1D60588E0D05DD3D006BFB54 /* Sources */, 158 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 159 | ); 160 | buildRules = ( 161 | ); 162 | dependencies = ( 163 | ); 164 | name = CloudSearch; 165 | productName = IBTest; 166 | productReference = 1D6058910D05DD3D006BFB54 /* CloudSearch.app */; 167 | productType = "com.apple.product-type.application"; 168 | }; 169 | /* End PBXNativeTarget section */ 170 | 171 | /* Begin PBXProject section */ 172 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 173 | isa = PBXProject; 174 | attributes = { 175 | LastUpgradeCheck = 0500; 176 | TargetAttributes = { 177 | 1D6058900D05DD3D006BFB54 = { 178 | SystemCapabilities = { 179 | com.apple.iCloud = { 180 | enabled = 1; 181 | }; 182 | }; 183 | }; 184 | }; 185 | }; 186 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CloudSearch" */; 187 | compatibilityVersion = "Xcode 3.2"; 188 | developmentRegion = English; 189 | hasScannedForEncodings = 1; 190 | knownRegions = ( 191 | English, 192 | Japanese, 193 | French, 194 | German, 195 | en, 196 | Base, 197 | ); 198 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 199 | projectDirPath = ""; 200 | projectRoot = ""; 201 | targets = ( 202 | 1D6058900D05DD3D006BFB54 /* CloudSearch */, 203 | ); 204 | }; 205 | /* End PBXProject section */ 206 | 207 | /* Begin PBXResourcesBuildPhase section */ 208 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 209 | isa = PBXResourcesBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | 53D6CA2D1AD7060A00F05766 /* MainStoryboard.storyboard in Resources */, 213 | 53D6CA391AD708FB00F05766 /* Text Document1.txt in Resources */, 214 | 53D6CA361AD708FA00F05766 /* HTML Document.html in Resources */, 215 | 53D6CA381AD708FA00F05766 /* PDF Document.pdf in Resources */, 216 | 536B4A951AEEB48F00ACE4AE /* Localizable.strings in Resources */, 217 | 53D6CA1F1AD7059500F05766 /* Images.xcassets in Resources */, 218 | 53D6CA3A1AD708FB00F05766 /* Text Document2.txt in Resources */, 219 | 53D6CA371AD708FA00F05766 /* Image Document.jpg in Resources */, 220 | 53D6CA3B1AD708FB00F05766 /* Text Document3.txt in Resources */, 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | }; 224 | /* End PBXResourcesBuildPhase section */ 225 | 226 | /* Begin PBXSourcesBuildPhase section */ 227 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 228 | isa = PBXSourcesBuildPhase; 229 | buildActionMask = 2147483647; 230 | files = ( 231 | 53D6CA291AD705C300F05766 /* main.m in Sources */, 232 | 5393AB331AE816F6006612A4 /* AAPLFilterViewController.m in Sources */, 233 | 532909C51AE81CF300EFD5C2 /* AAPLTableViewController.m in Sources */, 234 | 532909C41AE81CF300EFD5C2 /* AAPLAppDelegate.m in Sources */, 235 | 532909C81AE81D8500EFD5C2 /* AAPLCloudDocumentsController.m in Sources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | /* End PBXSourcesBuildPhase section */ 240 | 241 | /* Begin PBXVariantGroup section */ 242 | 536B4A931AEEB48F00ACE4AE /* Localizable.strings */ = { 243 | isa = PBXVariantGroup; 244 | children = ( 245 | 536B4A941AEEB48F00ACE4AE /* en */, 246 | ); 247 | name = Localizable.strings; 248 | sourceTree = ""; 249 | }; 250 | 53D6CA2B1AD7060A00F05766 /* MainStoryboard.storyboard */ = { 251 | isa = PBXVariantGroup; 252 | children = ( 253 | 53D6CA2E1AD7067D00F05766 /* Base */, 254 | ); 255 | name = MainStoryboard.storyboard; 256 | sourceTree = ""; 257 | }; 258 | /* End PBXVariantGroup section */ 259 | 260 | /* Begin XCBuildConfiguration section */ 261 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 262 | isa = XCBuildConfiguration; 263 | buildSettings = { 264 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 265 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 266 | CLANG_ENABLE_OBJC_ARC = YES; 267 | CODE_SIGN_ENTITLEMENTS = CloudSearch/CloudSearch.entitlements; 268 | CODE_SIGN_IDENTITY = "iPhone Developer"; 269 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 270 | COPY_PHASE_STRIP = NO; 271 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 272 | GCC_DYNAMIC_NO_PIC = NO; 273 | GCC_OPTIMIZATION_LEVEL = 0; 274 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 275 | GCC_PREFIX_HEADER = CloudSearch/Prefix.pch; 276 | INFOPLIST_FILE = CloudSearch/Info.plist; 277 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 278 | PRODUCT_NAME = CloudSearch; 279 | PROVISIONING_PROFILE = ""; 280 | }; 281 | name = Debug; 282 | }; 283 | 1D6058950D05DD3E006BFB54 /* Release */ = { 284 | isa = XCBuildConfiguration; 285 | buildSettings = { 286 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 287 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 288 | CLANG_ENABLE_OBJC_ARC = YES; 289 | CODE_SIGN_ENTITLEMENTS = CloudSearch/CloudSearch.entitlements; 290 | CODE_SIGN_IDENTITY = "iPhone Developer"; 291 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 292 | COPY_PHASE_STRIP = YES; 293 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 294 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 295 | GCC_PREFIX_HEADER = CloudSearch/Prefix.pch; 296 | INFOPLIST_FILE = CloudSearch/Info.plist; 297 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 298 | PRODUCT_NAME = CloudSearch; 299 | PROVISIONING_PROFILE = ""; 300 | }; 301 | name = Release; 302 | }; 303 | C01FCF4F08A954540054247B /* Debug */ = { 304 | isa = XCBuildConfiguration; 305 | buildSettings = { 306 | ALWAYS_SEARCH_USER_PATHS = NO; 307 | CLANG_ENABLE_MODULES = YES; 308 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 309 | GCC_C_LANGUAGE_STANDARD = c99; 310 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 311 | GCC_WARN_UNUSED_VARIABLE = YES; 312 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 313 | ONLY_ACTIVE_ARCH = YES; 314 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 315 | SDKROOT = iphoneos; 316 | TARGETED_DEVICE_FAMILY = 1; 317 | }; 318 | name = Debug; 319 | }; 320 | C01FCF5008A954540054247B /* Release */ = { 321 | isa = XCBuildConfiguration; 322 | buildSettings = { 323 | ALWAYS_SEARCH_USER_PATHS = NO; 324 | CLANG_ENABLE_MODULES = YES; 325 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 326 | GCC_C_LANGUAGE_STANDARD = c99; 327 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 328 | GCC_WARN_UNUSED_VARIABLE = YES; 329 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 330 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 331 | SDKROOT = iphoneos; 332 | TARGETED_DEVICE_FAMILY = 1; 333 | }; 334 | name = Release; 335 | }; 336 | /* End XCBuildConfiguration section */ 337 | 338 | /* Begin XCConfigurationList section */ 339 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CloudSearch" */ = { 340 | isa = XCConfigurationList; 341 | buildConfigurations = ( 342 | 1D6058940D05DD3E006BFB54 /* Debug */, 343 | 1D6058950D05DD3E006BFB54 /* Release */, 344 | ); 345 | defaultConfigurationIsVisible = 0; 346 | defaultConfigurationName = Release; 347 | }; 348 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CloudSearch" */ = { 349 | isa = XCConfigurationList; 350 | buildConfigurations = ( 351 | C01FCF4F08A954540054247B /* Debug */, 352 | C01FCF5008A954540054247B /* Release */, 353 | ); 354 | defaultConfigurationIsVisible = 0; 355 | defaultConfigurationName = Release; 356 | }; 357 | /* End XCConfigurationList section */ 358 | }; 359 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 360 | } 361 | -------------------------------------------------------------------------------- /tests/samples/collection-view.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 041E93BF1B4C3CE900DE90AB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 041E93BE1B4C3CE900DE90AB /* Images.xcassets */; }; 11 | 0439594B1B4C3446000A4305 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 043959491B4C3446000A4305 /* LaunchScreen.xib */; }; 12 | 53113E7D159E787A00E1FBC5 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53113E7C159E787A00E1FBC5 /* DetailViewController.m */; }; 13 | 53C4ED36159E740C0019285D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53C4ED35159E740C0019285D /* UIKit.framework */; }; 14 | 53C4ED38159E740C0019285D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53C4ED37159E740C0019285D /* Foundation.framework */; }; 15 | 53C4ED3A159E740C0019285D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53C4ED39159E740C0019285D /* CoreGraphics.framework */; }; 16 | 53C4ED42159E740C0019285D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C4ED41159E740C0019285D /* main.m */; }; 17 | 53C4ED46159E740C0019285D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C4ED45159E740C0019285D /* AppDelegate.m */; }; 18 | 53C4ED49159E740D0019285D /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53C4ED47159E740D0019285D /* MainStoryboard.storyboard */; }; 19 | 53C4ED4C159E740D0019285D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C4ED4B159E740D0019285D /* ViewController.m */; }; 20 | 53C4ED54159E75F40019285D /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C4ED53159E75F40019285D /* Cell.m */; }; 21 | 53E25AA115A399EC0004F894 /* CustomCellBackground.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E25AA015A399EC0004F894 /* CustomCellBackground.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 041E93BE1B4C3CE900DE90AB /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 26 | 041E93C01B4C3FDC00DE90AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 27 | 041E93C11B4C3FDC00DE90AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 28 | 53113E7B159E787A00E1FBC5 /* DetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = ""; }; 29 | 53113E7C159E787A00E1FBC5 /* DetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = ""; }; 30 | 53C4ED31159E740C0019285D /* CollViewSmpl.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CollViewSmpl.app; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | 53C4ED35159E740C0019285D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 32 | 53C4ED37159E740C0019285D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 33 | 53C4ED39159E740C0019285D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 34 | 53C4ED3D159E740C0019285D /* CollectionView-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CollectionView-Info.plist"; sourceTree = ""; }; 35 | 53C4ED41159E740C0019285D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 36 | 53C4ED43159E740C0019285D /* CollectionView-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CollectionView-Prefix.pch"; sourceTree = ""; }; 37 | 53C4ED44159E740C0019285D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 38 | 53C4ED45159E740C0019285D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 39 | 53C4ED4A159E740D0019285D /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 40 | 53C4ED4B159E740D0019285D /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 41 | 53C4ED52159E75F40019285D /* Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cell.h; sourceTree = ""; }; 42 | 53C4ED53159E75F40019285D /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Cell.m; sourceTree = ""; }; 43 | 53E25A9F15A399EC0004F894 /* CustomCellBackground.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomCellBackground.h; sourceTree = ""; }; 44 | 53E25AA015A399EC0004F894 /* CustomCellBackground.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomCellBackground.m; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 53C4ED2E159E740C0019285D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | 53C4ED36159E740C0019285D /* UIKit.framework in Frameworks */, 53 | 53C4ED38159E740C0019285D /* Foundation.framework in Frameworks */, 54 | 53C4ED3A159E740C0019285D /* CoreGraphics.framework in Frameworks */, 55 | ); 56 | runOnlyForDeploymentPostprocessing = 0; 57 | }; 58 | /* End PBXFrameworksBuildPhase section */ 59 | 60 | /* Begin PBXGroup section */ 61 | 53C4ED26159E740C0019285D = { 62 | isa = PBXGroup; 63 | children = ( 64 | 53C4ED3B159E740C0019285D /* CollectionView */, 65 | 53C4ED34159E740C0019285D /* Frameworks */, 66 | 53C4ED32159E740C0019285D /* Products */, 67 | ); 68 | sourceTree = ""; 69 | }; 70 | 53C4ED32159E740C0019285D /* Products */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | 53C4ED31159E740C0019285D /* CollViewSmpl.app */, 74 | ); 75 | name = Products; 76 | sourceTree = ""; 77 | }; 78 | 53C4ED34159E740C0019285D /* Frameworks */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 53C4ED35159E740C0019285D /* UIKit.framework */, 82 | 53C4ED37159E740C0019285D /* Foundation.framework */, 83 | 53C4ED39159E740C0019285D /* CoreGraphics.framework */, 84 | ); 85 | name = Frameworks; 86 | sourceTree = ""; 87 | }; 88 | 53C4ED3B159E740C0019285D /* CollectionView */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | 53C4ED44159E740C0019285D /* AppDelegate.h */, 92 | 53C4ED45159E740C0019285D /* AppDelegate.m */, 93 | 53C4ED4A159E740D0019285D /* ViewController.h */, 94 | 53C4ED4B159E740D0019285D /* ViewController.m */, 95 | 53113E7B159E787A00E1FBC5 /* DetailViewController.h */, 96 | 53113E7C159E787A00E1FBC5 /* DetailViewController.m */, 97 | 53C4ED52159E75F40019285D /* Cell.h */, 98 | 53C4ED53159E75F40019285D /* Cell.m */, 99 | 53E25A9F15A399EC0004F894 /* CustomCellBackground.h */, 100 | 53E25AA015A399EC0004F894 /* CustomCellBackground.m */, 101 | 53C4ED3C159E740C0019285D /* Supporting Files */, 102 | ); 103 | path = CollectionView; 104 | sourceTree = ""; 105 | }; 106 | 53C4ED3C159E740C0019285D /* Supporting Files */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 041E93BE1B4C3CE900DE90AB /* Images.xcassets */, 110 | 53C4ED41159E740C0019285D /* main.m */, 111 | 53C4ED3D159E740C0019285D /* CollectionView-Info.plist */, 112 | 53C4ED43159E740C0019285D /* CollectionView-Prefix.pch */, 113 | 043959491B4C3446000A4305 /* LaunchScreen.xib */, 114 | 53C4ED47159E740D0019285D /* MainStoryboard.storyboard */, 115 | ); 116 | name = "Supporting Files"; 117 | sourceTree = ""; 118 | }; 119 | /* End PBXGroup section */ 120 | 121 | /* Begin PBXNativeTarget section */ 122 | 53C4ED30159E740C0019285D /* CollViewSmpl */ = { 123 | isa = PBXNativeTarget; 124 | buildConfigurationList = 53C4ED4F159E740D0019285D /* Build configuration list for PBXNativeTarget "CollViewSmpl" */; 125 | buildPhases = ( 126 | 53C4ED2D159E740C0019285D /* Sources */, 127 | 53C4ED2E159E740C0019285D /* Frameworks */, 128 | 53C4ED2F159E740C0019285D /* Resources */, 129 | ); 130 | buildRules = ( 131 | ); 132 | dependencies = ( 133 | ); 134 | name = CollViewSmpl; 135 | productName = CollectionView; 136 | productReference = 53C4ED31159E740C0019285D /* CollViewSmpl.app */; 137 | productType = "com.apple.product-type.application"; 138 | }; 139 | /* End PBXNativeTarget section */ 140 | 141 | /* Begin PBXProject section */ 142 | 53C4ED28159E740C0019285D /* Project object */ = { 143 | isa = PBXProject; 144 | attributes = { 145 | LastUpgradeCheck = 0700; 146 | }; 147 | buildConfigurationList = 53C4ED2B159E740C0019285D /* Build configuration list for PBXProject "CollectionView" */; 148 | compatibilityVersion = "Xcode 3.2"; 149 | developmentRegion = English; 150 | hasScannedForEncodings = 0; 151 | knownRegions = ( 152 | en, 153 | Base, 154 | ); 155 | mainGroup = 53C4ED26159E740C0019285D; 156 | productRefGroup = 53C4ED32159E740C0019285D /* Products */; 157 | projectDirPath = ""; 158 | projectRoot = ""; 159 | targets = ( 160 | 53C4ED30159E740C0019285D /* CollViewSmpl */, 161 | ); 162 | }; 163 | /* End PBXProject section */ 164 | 165 | /* Begin PBXResourcesBuildPhase section */ 166 | 53C4ED2F159E740C0019285D /* Resources */ = { 167 | isa = PBXResourcesBuildPhase; 168 | buildActionMask = 2147483647; 169 | files = ( 170 | 53C4ED49159E740D0019285D /* MainStoryboard.storyboard in Resources */, 171 | 0439594B1B4C3446000A4305 /* LaunchScreen.xib in Resources */, 172 | 041E93BF1B4C3CE900DE90AB /* Images.xcassets in Resources */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | /* End PBXResourcesBuildPhase section */ 177 | 178 | /* Begin PBXSourcesBuildPhase section */ 179 | 53C4ED2D159E740C0019285D /* Sources */ = { 180 | isa = PBXSourcesBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | 53C4ED42159E740C0019285D /* main.m in Sources */, 184 | 53C4ED46159E740C0019285D /* AppDelegate.m in Sources */, 185 | 53C4ED4C159E740D0019285D /* ViewController.m in Sources */, 186 | 53C4ED54159E75F40019285D /* Cell.m in Sources */, 187 | 53113E7D159E787A00E1FBC5 /* DetailViewController.m in Sources */, 188 | 53E25AA115A399EC0004F894 /* CustomCellBackground.m in Sources */, 189 | ); 190 | runOnlyForDeploymentPostprocessing = 0; 191 | }; 192 | /* End PBXSourcesBuildPhase section */ 193 | 194 | /* Begin PBXVariantGroup section */ 195 | 043959491B4C3446000A4305 /* LaunchScreen.xib */ = { 196 | isa = PBXVariantGroup; 197 | children = ( 198 | 041E93C01B4C3FDC00DE90AB /* Base */, 199 | ); 200 | name = LaunchScreen.xib; 201 | sourceTree = ""; 202 | }; 203 | 53C4ED47159E740D0019285D /* MainStoryboard.storyboard */ = { 204 | isa = PBXVariantGroup; 205 | children = ( 206 | 041E93C11B4C3FDC00DE90AB /* Base */, 207 | ); 208 | name = MainStoryboard.storyboard; 209 | sourceTree = ""; 210 | }; 211 | /* End PBXVariantGroup section */ 212 | 213 | /* Begin XCBuildConfiguration section */ 214 | 53C4ED4D159E740D0019285D /* Debug */ = { 215 | isa = XCBuildConfiguration; 216 | buildSettings = { 217 | ALWAYS_SEARCH_USER_PATHS = NO; 218 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 219 | CLANG_ENABLE_OBJC_ARC = YES; 220 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 221 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 222 | COPY_PHASE_STRIP = NO; 223 | ENABLE_TESTABILITY = YES; 224 | GCC_C_LANGUAGE_STANDARD = gnu99; 225 | GCC_DYNAMIC_NO_PIC = NO; 226 | GCC_OPTIMIZATION_LEVEL = 0; 227 | GCC_PREPROCESSOR_DEFINITIONS = ( 228 | "DEBUG=1", 229 | "$(inherited)", 230 | ); 231 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 232 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 233 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 234 | GCC_WARN_UNUSED_VARIABLE = YES; 235 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 236 | ONLY_ACTIVE_ARCH = YES; 237 | SDKROOT = iphoneos; 238 | TARGETED_DEVICE_FAMILY = "1,2"; 239 | }; 240 | name = Debug; 241 | }; 242 | 53C4ED4E159E740D0019285D /* Release */ = { 243 | isa = XCBuildConfiguration; 244 | buildSettings = { 245 | ALWAYS_SEARCH_USER_PATHS = NO; 246 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 247 | CLANG_ENABLE_OBJC_ARC = YES; 248 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 249 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 250 | COPY_PHASE_STRIP = YES; 251 | GCC_C_LANGUAGE_STANDARD = gnu99; 252 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 253 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 254 | GCC_WARN_UNUSED_VARIABLE = YES; 255 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 256 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 257 | SDKROOT = iphoneos; 258 | TARGETED_DEVICE_FAMILY = "1,2"; 259 | VALIDATE_PRODUCT = YES; 260 | }; 261 | name = Release; 262 | }; 263 | 53C4ED50159E740D0019285D /* Debug */ = { 264 | isa = XCBuildConfiguration; 265 | buildSettings = { 266 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 267 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 268 | CLANG_ENABLE_MODULES = YES; 269 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 270 | GCC_PREFIX_HEADER = "CollectionView/CollectionView-Prefix.pch"; 271 | INFOPLIST_FILE = "CollectionView/CollectionView-Info.plist"; 272 | PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_NAME:rfc1034identifier}"; 273 | PRODUCT_NAME = "$(TARGET_NAME)"; 274 | TARGETED_DEVICE_FAMILY = "1,2"; 275 | WRAPPER_EXTENSION = app; 276 | }; 277 | name = Debug; 278 | }; 279 | 53C4ED51159E740D0019285D /* Release */ = { 280 | isa = XCBuildConfiguration; 281 | buildSettings = { 282 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 283 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 284 | CLANG_ENABLE_MODULES = YES; 285 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 286 | GCC_PREFIX_HEADER = "CollectionView/CollectionView-Prefix.pch"; 287 | INFOPLIST_FILE = "CollectionView/CollectionView-Info.plist"; 288 | PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_NAME:rfc1034identifier}"; 289 | PRODUCT_NAME = "$(TARGET_NAME)"; 290 | TARGETED_DEVICE_FAMILY = "1,2"; 291 | WRAPPER_EXTENSION = app; 292 | }; 293 | name = Release; 294 | }; 295 | /* End XCBuildConfiguration section */ 296 | 297 | /* Begin XCConfigurationList section */ 298 | 53C4ED2B159E740C0019285D /* Build configuration list for PBXProject "CollectionView" */ = { 299 | isa = XCConfigurationList; 300 | buildConfigurations = ( 301 | 53C4ED4D159E740D0019285D /* Debug */, 302 | 53C4ED4E159E740D0019285D /* Release */, 303 | ); 304 | defaultConfigurationIsVisible = 0; 305 | defaultConfigurationName = Release; 306 | }; 307 | 53C4ED4F159E740D0019285D /* Build configuration list for PBXNativeTarget "CollViewSmpl" */ = { 308 | isa = XCConfigurationList; 309 | buildConfigurations = ( 310 | 53C4ED50159E740D0019285D /* Debug */, 311 | 53C4ED51159E740D0019285D /* Release */, 312 | ); 313 | defaultConfigurationIsVisible = 0; 314 | defaultConfigurationName = Release; 315 | }; 316 | /* End XCConfigurationList section */ 317 | }; 318 | rootObject = 53C4ED28159E740C0019285D /* Project object */; 319 | } 320 | -------------------------------------------------------------------------------- /tests/samples/metal-image-processing.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 362ADEF2195A0A5200CA3671 /* AAPLQuad.mm in Sources */ = {isa = PBXBuildFile; fileRef = 362ADEF1195A0A5200CA3671 /* AAPLQuad.mm */; }; 11 | 368AEDE71A00562A002E4617 /* GrayscaleShader.metal in Sources */ = {isa = PBXBuildFile; fileRef = 368AEDE61A00562A002E4617 /* GrayscaleShader.metal */; }; 12 | 368AEDE81A0056BF002E4617 /* TexturedQuadShader.metal in Sources */ = {isa = PBXBuildFile; fileRef = 62B7763E193438980095A4D6 /* TexturedQuadShader.metal */; }; 13 | 36A654211965FBDD008E7BA2 /* TexturedQuadShader.metal in Resources */ = {isa = PBXBuildFile; fileRef = 62B7763E193438980095A4D6 /* TexturedQuadShader.metal */; }; 14 | 6218D85E19AFB898005BC8AB /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6218D85D19AFB898005BC8AB /* LaunchScreen.xib */; }; 15 | 622A9BB219AAC7E4007F8120 /* AAPLRenderer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 622A9BB119AAC7E4007F8120 /* AAPLRenderer.mm */; }; 16 | 62B7760F193438100095A4D6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 62B7760E193438100095A4D6 /* main.m */; }; 17 | 62B7761A193438100095A4D6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 62B77618193438100095A4D6 /* Main.storyboard */; }; 18 | 62B7761C193438100095A4D6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 62B7761B193438100095A4D6 /* Images.xcassets */; }; 19 | 62B776321934388B0095A4D6 /* Default.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 62B776311934388B0095A4D6 /* Default.jpg */; }; 20 | 62B7763F193438980095A4D6 /* AAPLAppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 62B77634193438980095A4D6 /* AAPLAppDelegate.mm */; }; 21 | 62B77640193438980095A4D6 /* AAPLTexture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 62B77636193438980095A4D6 /* AAPLTexture.mm */; }; 22 | 62B77641193438980095A4D6 /* AAPLTransforms.mm in Sources */ = {isa = PBXBuildFile; fileRef = 62B77638193438980095A4D6 /* AAPLTransforms.mm */; }; 23 | 62B77642193438980095A4D6 /* AAPLView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 62B7763B193438980095A4D6 /* AAPLView.mm */; }; 24 | 62B77643193438980095A4D6 /* AAPLViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 62B7763D193438980095A4D6 /* AAPLViewController.mm */; }; 25 | 62B7764C19343A8A0095A4D6 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 62B7764B19343A8A0095A4D6 /* Metal.framework */; }; 26 | 62B7764E19343A900095A4D6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 62B7764D19343A900095A4D6 /* QuartzCore.framework */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | 362ADEF0195A0A5200CA3671 /* AAPLQuad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLQuad.h; sourceTree = ""; }; 31 | 362ADEF1195A0A5200CA3671 /* AAPLQuad.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAPLQuad.mm; sourceTree = ""; }; 32 | 368AEDE61A00562A002E4617 /* GrayscaleShader.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = GrayscaleShader.metal; sourceTree = ""; }; 33 | 6218D85D19AFB898005BC8AB /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; 34 | 622A9BB019AAC7E4007F8120 /* AAPLRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLRenderer.h; sourceTree = ""; }; 35 | 622A9BB119AAC7E4007F8120 /* AAPLRenderer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAPLRenderer.mm; sourceTree = ""; }; 36 | 62B77609193438100095A4D6 /* MetalImageProcessing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MetalImageProcessing.app; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | 62B7760D193438100095A4D6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 38 | 62B7760E193438100095A4D6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 39 | 62B77619193438100095A4D6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 40 | 62B7761B193438100095A4D6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 41 | 62B776311934388B0095A4D6 /* Default.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Default.jpg; sourceTree = ""; }; 42 | 62B77633193438980095A4D6 /* AAPLAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLAppDelegate.h; sourceTree = ""; }; 43 | 62B77634193438980095A4D6 /* AAPLAppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAPLAppDelegate.mm; sourceTree = ""; }; 44 | 62B77635193438980095A4D6 /* AAPLTexture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLTexture.h; sourceTree = ""; }; 45 | 62B77636193438980095A4D6 /* AAPLTexture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAPLTexture.mm; sourceTree = ""; }; 46 | 62B77637193438980095A4D6 /* AAPLTransforms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLTransforms.h; sourceTree = ""; }; 47 | 62B77638193438980095A4D6 /* AAPLTransforms.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAPLTransforms.mm; sourceTree = ""; }; 48 | 62B7763A193438980095A4D6 /* AAPLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLView.h; sourceTree = ""; }; 49 | 62B7763B193438980095A4D6 /* AAPLView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAPLView.mm; sourceTree = ""; }; 50 | 62B7763C193438980095A4D6 /* AAPLViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLViewController.h; sourceTree = ""; }; 51 | 62B7763D193438980095A4D6 /* AAPLViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AAPLViewController.mm; sourceTree = ""; }; 52 | 62B7763E193438980095A4D6 /* TexturedQuadShader.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = TexturedQuadShader.metal; sourceTree = ""; }; 53 | 62B7764B19343A8A0095A4D6 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; 54 | 62B7764D19343A900095A4D6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 55 | /* End PBXFileReference section */ 56 | 57 | /* Begin PBXFrameworksBuildPhase section */ 58 | 62B77606193438100095A4D6 /* Frameworks */ = { 59 | isa = PBXFrameworksBuildPhase; 60 | buildActionMask = 2147483647; 61 | files = ( 62 | 62B7764E19343A900095A4D6 /* QuartzCore.framework in Frameworks */, 63 | 62B7764C19343A8A0095A4D6 /* Metal.framework in Frameworks */, 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | /* End PBXFrameworksBuildPhase section */ 68 | 69 | /* Begin PBXGroup section */ 70 | 362ADEEF195A0A4C00CA3671 /* Quad */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | 362ADEF0195A0A5200CA3671 /* AAPLQuad.h */, 74 | 362ADEF1195A0A5200CA3671 /* AAPLQuad.mm */, 75 | ); 76 | name = Quad; 77 | sourceTree = ""; 78 | }; 79 | 3672C3C319F9960C002BFB8D /* Shaders */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | 368AEDE61A00562A002E4617 /* GrayscaleShader.metal */, 83 | 62B7763E193438980095A4D6 /* TexturedQuadShader.metal */, 84 | ); 85 | name = Shaders; 86 | sourceTree = ""; 87 | }; 88 | 622A9BAE19AAC75D007F8120 /* Common */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | 62B776451934396C0095A4D6 /* App */, 92 | 62B7764819343A020095A4D6 /* Math */, 93 | 362ADEEF195A0A4C00CA3671 /* Quad */, 94 | 62B77646193439E90095A4D6 /* Texture Loader */, 95 | ); 96 | name = Common; 97 | sourceTree = ""; 98 | }; 99 | 622A9BAF19AAC791007F8120 /* Renderer */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 622A9BB019AAC7E4007F8120 /* AAPLRenderer.h */, 103 | 622A9BB119AAC7E4007F8120 /* AAPLRenderer.mm */, 104 | ); 105 | name = Renderer; 106 | sourceTree = ""; 107 | }; 108 | 62B77600193438100095A4D6 = { 109 | isa = PBXGroup; 110 | children = ( 111 | 62B7760B193438100095A4D6 /* Project */, 112 | 62B7760A193438100095A4D6 /* Products */, 113 | ); 114 | sourceTree = ""; 115 | }; 116 | 62B7760A193438100095A4D6 /* Products */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 62B77609193438100095A4D6 /* MetalImageProcessing.app */, 120 | ); 121 | name = Products; 122 | sourceTree = ""; 123 | }; 124 | 62B7760B193438100095A4D6 /* Project */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 622A9BAE19AAC75D007F8120 /* Common */, 128 | 622A9BAF19AAC791007F8120 /* Renderer */, 129 | 3672C3C319F9960C002BFB8D /* Shaders */, 130 | 62B7760C193438100095A4D6 /* Supporting Files */, 131 | 62B7764A19343A730095A4D6 /* Frameworks */, 132 | ); 133 | name = Project; 134 | path = MetalImageProcessing; 135 | sourceTree = ""; 136 | }; 137 | 62B7760C193438100095A4D6 /* Supporting Files */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | 62B7760E193438100095A4D6 /* main.m */, 141 | 62B77618193438100095A4D6 /* Main.storyboard */, 142 | 6218D85D19AFB898005BC8AB /* LaunchScreen.xib */, 143 | 62B776311934388B0095A4D6 /* Default.jpg */, 144 | 62B7761B193438100095A4D6 /* Images.xcassets */, 145 | 62B7760D193438100095A4D6 /* Info.plist */, 146 | ); 147 | name = "Supporting Files"; 148 | sourceTree = ""; 149 | }; 150 | 62B776451934396C0095A4D6 /* App */ = { 151 | isa = PBXGroup; 152 | children = ( 153 | 62B77633193438980095A4D6 /* AAPLAppDelegate.h */, 154 | 62B77634193438980095A4D6 /* AAPLAppDelegate.mm */, 155 | 62B7763A193438980095A4D6 /* AAPLView.h */, 156 | 62B7763B193438980095A4D6 /* AAPLView.mm */, 157 | 62B7763C193438980095A4D6 /* AAPLViewController.h */, 158 | 62B7763D193438980095A4D6 /* AAPLViewController.mm */, 159 | ); 160 | name = App; 161 | sourceTree = ""; 162 | }; 163 | 62B77646193439E90095A4D6 /* Texture Loader */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | 62B77635193438980095A4D6 /* AAPLTexture.h */, 167 | 62B77636193438980095A4D6 /* AAPLTexture.mm */, 168 | ); 169 | name = "Texture Loader"; 170 | sourceTree = ""; 171 | }; 172 | 62B7764819343A020095A4D6 /* Math */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | 62B77637193438980095A4D6 /* AAPLTransforms.h */, 176 | 62B77638193438980095A4D6 /* AAPLTransforms.mm */, 177 | ); 178 | name = Math; 179 | sourceTree = ""; 180 | }; 181 | 62B7764A19343A730095A4D6 /* Frameworks */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | 62B7764D19343A900095A4D6 /* QuartzCore.framework */, 185 | 62B7764B19343A8A0095A4D6 /* Metal.framework */, 186 | ); 187 | name = Frameworks; 188 | sourceTree = ""; 189 | }; 190 | /* End PBXGroup section */ 191 | 192 | /* Begin PBXNativeTarget section */ 193 | 62B77608193438100095A4D6 /* MetalImageProcessing */ = { 194 | isa = PBXNativeTarget; 195 | buildConfigurationList = 62B7762B193438100095A4D6 /* Build configuration list for PBXNativeTarget "MetalImageProcessing" */; 196 | buildPhases = ( 197 | 62B77605193438100095A4D6 /* Sources */, 198 | 62B77606193438100095A4D6 /* Frameworks */, 199 | 62B77607193438100095A4D6 /* Resources */, 200 | ); 201 | buildRules = ( 202 | ); 203 | dependencies = ( 204 | ); 205 | name = MetalImageProcessing; 206 | productName = MetalImageProcessing; 207 | productReference = 62B77609193438100095A4D6 /* MetalImageProcessing.app */; 208 | productType = "com.apple.product-type.application"; 209 | }; 210 | /* End PBXNativeTarget section */ 211 | 212 | /* Begin PBXProject section */ 213 | 62B77601193438100095A4D6 /* Project object */ = { 214 | isa = PBXProject; 215 | attributes = { 216 | LastUpgradeCheck = 0600; 217 | ORGANIZATIONNAME = Apple; 218 | TargetAttributes = { 219 | 62B77608193438100095A4D6 = { 220 | CreatedOnToolsVersion = 6.0; 221 | }; 222 | }; 223 | }; 224 | buildConfigurationList = 62B77604193438100095A4D6 /* Build configuration list for PBXProject "MetalImageProcessing" */; 225 | compatibilityVersion = "Xcode 3.2"; 226 | developmentRegion = English; 227 | hasScannedForEncodings = 0; 228 | knownRegions = ( 229 | en, 230 | Base, 231 | ); 232 | mainGroup = 62B77600193438100095A4D6; 233 | productRefGroup = 62B7760A193438100095A4D6 /* Products */; 234 | projectDirPath = ""; 235 | projectRoot = ""; 236 | targets = ( 237 | 62B77608193438100095A4D6 /* MetalImageProcessing */, 238 | ); 239 | }; 240 | /* End PBXProject section */ 241 | 242 | /* Begin PBXResourcesBuildPhase section */ 243 | 62B77607193438100095A4D6 /* Resources */ = { 244 | isa = PBXResourcesBuildPhase; 245 | buildActionMask = 2147483647; 246 | files = ( 247 | 6218D85E19AFB898005BC8AB /* LaunchScreen.xib in Resources */, 248 | 62B7761C193438100095A4D6 /* Images.xcassets in Resources */, 249 | 36A654211965FBDD008E7BA2 /* TexturedQuadShader.metal in Resources */, 250 | 62B776321934388B0095A4D6 /* Default.jpg in Resources */, 251 | 62B7761A193438100095A4D6 /* Main.storyboard in Resources */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | /* End PBXResourcesBuildPhase section */ 256 | 257 | /* Begin PBXSourcesBuildPhase section */ 258 | 62B77605193438100095A4D6 /* Sources */ = { 259 | isa = PBXSourcesBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | 368AEDE81A0056BF002E4617 /* TexturedQuadShader.metal in Sources */, 263 | 368AEDE71A00562A002E4617 /* GrayscaleShader.metal in Sources */, 264 | 62B7763F193438980095A4D6 /* AAPLAppDelegate.mm in Sources */, 265 | 362ADEF2195A0A5200CA3671 /* AAPLQuad.mm in Sources */, 266 | 62B77640193438980095A4D6 /* AAPLTexture.mm in Sources */, 267 | 62B77641193438980095A4D6 /* AAPLTransforms.mm in Sources */, 268 | 62B77643193438980095A4D6 /* AAPLViewController.mm in Sources */, 269 | 62B77642193438980095A4D6 /* AAPLView.mm in Sources */, 270 | 622A9BB219AAC7E4007F8120 /* AAPLRenderer.mm in Sources */, 271 | 62B7760F193438100095A4D6 /* main.m in Sources */, 272 | ); 273 | runOnlyForDeploymentPostprocessing = 0; 274 | }; 275 | /* End PBXSourcesBuildPhase section */ 276 | 277 | /* Begin PBXVariantGroup section */ 278 | 62B77618193438100095A4D6 /* Main.storyboard */ = { 279 | isa = PBXVariantGroup; 280 | children = ( 281 | 62B77619193438100095A4D6 /* Base */, 282 | ); 283 | name = Main.storyboard; 284 | sourceTree = ""; 285 | }; 286 | /* End PBXVariantGroup section */ 287 | 288 | /* Begin XCBuildConfiguration section */ 289 | 62B77629193438100095A4D6 /* Debug */ = { 290 | isa = XCBuildConfiguration; 291 | buildSettings = { 292 | ALWAYS_SEARCH_USER_PATHS = NO; 293 | CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; 294 | CLANG_CXX_LIBRARY = "libc++"; 295 | CLANG_ENABLE_MODULES = YES; 296 | CLANG_ENABLE_OBJC_ARC = YES; 297 | CLANG_WARN_BOOL_CONVERSION = YES; 298 | CLANG_WARN_CONSTANT_CONVERSION = YES; 299 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 300 | CLANG_WARN_EMPTY_BODY = YES; 301 | CLANG_WARN_ENUM_CONVERSION = YES; 302 | CLANG_WARN_INT_CONVERSION = YES; 303 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 304 | CLANG_WARN_UNREACHABLE_CODE = YES; 305 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 306 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 307 | COPY_PHASE_STRIP = NO; 308 | ENABLE_STRICT_OBJC_MSGSEND = YES; 309 | GCC_C_LANGUAGE_STANDARD = c11; 310 | GCC_DYNAMIC_NO_PIC = NO; 311 | GCC_OPTIMIZATION_LEVEL = 0; 312 | GCC_PREPROCESSOR_DEFINITIONS = ( 313 | "DEBUG=1", 314 | "$(inherited)", 315 | ); 316 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 317 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 318 | GCC_WARN_UNDECLARED_SELECTOR = YES; 319 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 320 | GCC_WARN_UNUSED_FUNCTION = YES; 321 | GCC_WARN_UNUSED_VARIABLE = YES; 322 | LINKER_DISPLAYS_MANGLED_NAMES = YES; 323 | METAL_ENABLE_DEBUG_INFO = YES; 324 | ONLY_ACTIVE_ARCH = YES; 325 | SDKROOT = iphoneos; 326 | STRIP_INSTALLED_PRODUCT = NO; 327 | TARGETED_DEVICE_FAMILY = "1,2"; 328 | TOOLCHAINS = default; 329 | }; 330 | name = Debug; 331 | }; 332 | 62B7762A193438100095A4D6 /* Release */ = { 333 | isa = XCBuildConfiguration; 334 | buildSettings = { 335 | ALWAYS_SEARCH_USER_PATHS = NO; 336 | CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; 337 | CLANG_CXX_LIBRARY = "libc++"; 338 | CLANG_ENABLE_MODULES = YES; 339 | CLANG_ENABLE_OBJC_ARC = YES; 340 | CLANG_WARN_BOOL_CONVERSION = YES; 341 | CLANG_WARN_CONSTANT_CONVERSION = YES; 342 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 343 | CLANG_WARN_EMPTY_BODY = YES; 344 | CLANG_WARN_ENUM_CONVERSION = YES; 345 | CLANG_WARN_INT_CONVERSION = YES; 346 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 347 | CLANG_WARN_UNREACHABLE_CODE = YES; 348 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 349 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 350 | ENABLE_NS_ASSERTIONS = NO; 351 | ENABLE_STRICT_OBJC_MSGSEND = YES; 352 | GCC_C_LANGUAGE_STANDARD = c11; 353 | GCC_SYMBOLS_PRIVATE_EXTERN = YES; 354 | GCC_UNROLL_LOOPS = YES; 355 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 356 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 357 | GCC_WARN_UNDECLARED_SELECTOR = YES; 358 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 359 | GCC_WARN_UNUSED_FUNCTION = YES; 360 | GCC_WARN_UNUSED_VARIABLE = YES; 361 | LLVM_LTO = YES; 362 | METAL_ENABLE_DEBUG_INFO = NO; 363 | SDKROOT = iphoneos; 364 | TARGETED_DEVICE_FAMILY = "1,2"; 365 | TOOLCHAINS = default; 366 | VALIDATE_PRODUCT = YES; 367 | }; 368 | name = Release; 369 | }; 370 | 62B7762C193438100095A4D6 /* Debug */ = { 371 | isa = XCBuildConfiguration; 372 | buildSettings = { 373 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 374 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 375 | CODE_SIGN_IDENTITY = "iPhone Developer"; 376 | INFOPLIST_FILE = MetalImageProcessing/Info.plist; 377 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 378 | MTL_ENABLE_DEBUG_INFO = YES; 379 | PRODUCT_NAME = "$(TARGET_NAME)"; 380 | }; 381 | name = Debug; 382 | }; 383 | 62B7762D193438100095A4D6 /* Release */ = { 384 | isa = XCBuildConfiguration; 385 | buildSettings = { 386 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 387 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 388 | CODE_SIGN_IDENTITY = "iPhone Developer"; 389 | INFOPLIST_FILE = MetalImageProcessing/Info.plist; 390 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 391 | PRODUCT_NAME = "$(TARGET_NAME)"; 392 | }; 393 | name = Release; 394 | }; 395 | /* End XCBuildConfiguration section */ 396 | 397 | /* Begin XCConfigurationList section */ 398 | 62B77604193438100095A4D6 /* Build configuration list for PBXProject "MetalImageProcessing" */ = { 399 | isa = XCConfigurationList; 400 | buildConfigurations = ( 401 | 62B77629193438100095A4D6 /* Debug */, 402 | 62B7762A193438100095A4D6 /* Release */, 403 | ); 404 | defaultConfigurationIsVisible = 0; 405 | defaultConfigurationName = Release; 406 | }; 407 | 62B7762B193438100095A4D6 /* Build configuration list for PBXNativeTarget "MetalImageProcessing" */ = { 408 | isa = XCConfigurationList; 409 | buildConfigurations = ( 410 | 62B7762C193438100095A4D6 /* Debug */, 411 | 62B7762D193438100095A4D6 /* Release */, 412 | ); 413 | defaultConfigurationIsVisible = 0; 414 | defaultConfigurationName = Release; 415 | }; 416 | /* End XCConfigurationList section */ 417 | }; 418 | rootObject = 62B77601193438100095A4D6 /* Project object */; 419 | } 420 | -------------------------------------------------------------------------------- /tests/samples/music-cube.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1821D71411D2873300418632 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 1821D70D11D2873300418632 /* Icon-72.png */; }; 11 | 1821D71511D2873300418632 /* Icon-Small-50.png in Resources */ = {isa = PBXBuildFile; fileRef = 1821D70E11D2873300418632 /* Icon-Small-50.png */; }; 12 | 1821D71611D2873300418632 /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = 1821D70F11D2873300418632 /* Icon-Small.png */; }; 13 | 1821D71711D2873300418632 /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1821D71011D2873300418632 /* Icon-Small@2x.png */; }; 14 | 1821D71811D2873300418632 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 1821D71111D2873300418632 /* Icon.png */; }; 15 | 1821D71911D2873300418632 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1821D71211D2873300418632 /* Icon@2x.png */; }; 16 | 1821D71A11D2873300418632 /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = 1821D71311D2873300418632 /* iTunesArtwork */; }; 17 | 18313E5911CFBFA500C521F1 /* sound.wav in Resources */ = {isa = PBXBuildFile; fileRef = 18313E5211CFBFA500C521F1 /* sound.wav */; }; 18 | 18313E5A11CFBFA500C521F1 /* speaker.png in Resources */ = {isa = PBXBuildFile; fileRef = 18313E5311CFBFA500C521F1 /* speaker.png */; }; 19 | 1D3623260D0F684500981E51 /* MusicCubeAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* MusicCubeAppDelegate.m */; }; 20 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 21 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 22 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 23 | 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; 24 | 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD15070DC6FC5B0079059D /* QuartzCore.framework */; }; 25 | AF2238AF19EF299500C4D0C9 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2238AE19EF299500C4D0C9 /* AVFoundation.framework */; }; 26 | AF62C673190997D50075DD39 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AF62C671190997D50075DD39 /* MainStoryboard.storyboard */; }; 27 | AF62C676190998030075DD39 /* MusicCubeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF62C675190998030075DD39 /* MusicCubeViewController.m */; }; 28 | AF62C67819099B690075DD39 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF62C67719099B690075DD39 /* GLKit.framework */; }; 29 | AF74CA560F8D8D1300A8C113 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF74CA530F8D8D1300A8C113 /* AudioToolbox.framework */; }; 30 | AF74CA570F8D8D1300A8C113 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF74CA540F8D8D1300A8C113 /* CoreGraphics.framework */; }; 31 | AF74CA580F8D8D1300A8C113 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF74CA550F8D8D1300A8C113 /* OpenAL.framework */; }; 32 | AF74CA8F0F8D8E0900A8C113 /* MusicCubePlayback.m in Sources */ = {isa = PBXBuildFile; fileRef = AF74CA8D0F8D8E0900A8C113 /* MusicCubePlayback.m */; }; 33 | AFD2C072190AFF6E001715EB /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFD2C071190AFF6E001715EB /* Default-568h@2x.png */; }; 34 | /* End PBXBuildFile section */ 35 | 36 | /* Begin PBXFileReference section */ 37 | 1821D70D11D2873300418632 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "images/Icon-72.png"; sourceTree = ""; }; 38 | 1821D70E11D2873300418632 /* Icon-Small-50.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small-50.png"; path = "images/Icon-Small-50.png"; sourceTree = ""; }; 39 | 1821D70F11D2873300418632 /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small.png"; path = "images/Icon-Small.png"; sourceTree = ""; }; 40 | 1821D71011D2873300418632 /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small@2x.png"; path = "images/Icon-Small@2x.png"; sourceTree = ""; }; 41 | 1821D71111D2873300418632 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = images/Icon.png; sourceTree = ""; }; 42 | 1821D71211D2873300418632 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "images/Icon@2x.png"; sourceTree = ""; }; 43 | 1821D71311D2873300418632 /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; name = iTunesArtwork; path = images/iTunesArtwork; sourceTree = ""; }; 44 | 18313E5211CFBFA500C521F1 /* sound.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = sound.wav; path = images/sound.wav; sourceTree = ""; }; 45 | 18313E5311CFBFA500C521F1 /* speaker.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = speaker.png; path = images/speaker.png; sourceTree = ""; }; 46 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 47 | 1D3623240D0F684500981E51 /* MusicCubeAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MusicCubeAppDelegate.h; sourceTree = ""; }; 48 | 1D3623250D0F684500981E51 /* MusicCubeAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MusicCubeAppDelegate.m; sourceTree = ""; }; 49 | 1D6058910D05DD3D006BFB54 /* MusicCube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MusicCube.app; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 51 | 28FD14FF0DC6FC520079059D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 52 | 28FD15070DC6FC5B0079059D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 53 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 54 | 32CA4F630368D1EE00C91783 /* MusicCube_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MusicCube_Prefix.pch; sourceTree = ""; }; 55 | 8D1107310486CEB800E47090 /* MusicCube-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "MusicCube-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 56 | AF2238AE19EF299500C4D0C9 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 57 | AF28F9281061A52A00B93E5C /* ReadMe.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadMe.txt; sourceTree = ""; }; 58 | AF62C672190997D50075DD39 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 59 | AF62C674190998030075DD39 /* MusicCubeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MusicCubeViewController.h; sourceTree = ""; }; 60 | AF62C675190998030075DD39 /* MusicCubeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MusicCubeViewController.m; sourceTree = ""; }; 61 | AF62C67719099B690075DD39 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; }; 62 | AF74CA530F8D8D1300A8C113 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 63 | AF74CA540F8D8D1300A8C113 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 64 | AF74CA550F8D8D1300A8C113 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; 65 | AF74CA8C0F8D8E0900A8C113 /* MusicCubePlayback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MusicCubePlayback.h; sourceTree = ""; }; 66 | AF74CA8D0F8D8E0900A8C113 /* MusicCubePlayback.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MusicCubePlayback.m; sourceTree = ""; }; 67 | AF74CA8E0F8D8E0900A8C113 /* MyOpenALSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyOpenALSupport.h; sourceTree = ""; }; 68 | AFD2C070190AF121001715EB /* teapot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = teapot.h; path = Classes/teapot.h; sourceTree = ""; }; 69 | AFD2C071190AFF6E001715EB /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "images/Default-568h@2x.png"; sourceTree = ""; }; 70 | /* End PBXFileReference section */ 71 | 72 | /* Begin PBXFrameworksBuildPhase section */ 73 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 74 | isa = PBXFrameworksBuildPhase; 75 | buildActionMask = 2147483647; 76 | files = ( 77 | AF2238AF19EF299500C4D0C9 /* AVFoundation.framework in Frameworks */, 78 | AF62C67819099B690075DD39 /* GLKit.framework in Frameworks */, 79 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 80 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 81 | 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */, 82 | 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */, 83 | AF74CA560F8D8D1300A8C113 /* AudioToolbox.framework in Frameworks */, 84 | AF74CA570F8D8D1300A8C113 /* CoreGraphics.framework in Frameworks */, 85 | AF74CA580F8D8D1300A8C113 /* OpenAL.framework in Frameworks */, 86 | ); 87 | runOnlyForDeploymentPostprocessing = 0; 88 | }; 89 | /* End PBXFrameworksBuildPhase section */ 90 | 91 | /* Begin PBXGroup section */ 92 | 080E96DDFE201D6D7F000001 /* Classes */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | AF74CA8C0F8D8E0900A8C113 /* MusicCubePlayback.h */, 96 | AF74CA8D0F8D8E0900A8C113 /* MusicCubePlayback.m */, 97 | AF74CA8E0F8D8E0900A8C113 /* MyOpenALSupport.h */, 98 | 1D3623240D0F684500981E51 /* MusicCubeAppDelegate.h */, 99 | 1D3623250D0F684500981E51 /* MusicCubeAppDelegate.m */, 100 | AF62C674190998030075DD39 /* MusicCubeViewController.h */, 101 | AF62C675190998030075DD39 /* MusicCubeViewController.m */, 102 | ); 103 | path = Classes; 104 | sourceTree = ""; 105 | }; 106 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 1D6058910D05DD3D006BFB54 /* MusicCube.app */, 110 | ); 111 | name = Products; 112 | sourceTree = ""; 113 | }; 114 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | AF28F9281061A52A00B93E5C /* ReadMe.txt */, 118 | 080E96DDFE201D6D7F000001 /* Classes */, 119 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 120 | 29B97317FDCFA39411CA2CEA /* Resources */, 121 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 122 | 19C28FACFE9D520D11CA2CBB /* Products */, 123 | ); 124 | name = CustomTemplate; 125 | sourceTree = ""; 126 | }; 127 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | 32CA4F630368D1EE00C91783 /* MusicCube_Prefix.pch */, 131 | 29B97316FDCFA39411CA2CEA /* main.m */, 132 | AFD2C070190AF121001715EB /* teapot.h */, 133 | ); 134 | name = "Other Sources"; 135 | sourceTree = ""; 136 | }; 137 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | AF62C671190997D50075DD39 /* MainStoryboard.storyboard */, 141 | AFD2C071190AFF6E001715EB /* Default-568h@2x.png */, 142 | 1821D70D11D2873300418632 /* Icon-72.png */, 143 | 1821D70E11D2873300418632 /* Icon-Small-50.png */, 144 | 1821D70F11D2873300418632 /* Icon-Small.png */, 145 | 1821D71011D2873300418632 /* Icon-Small@2x.png */, 146 | 1821D71111D2873300418632 /* Icon.png */, 147 | 1821D71211D2873300418632 /* Icon@2x.png */, 148 | 1821D71311D2873300418632 /* iTunesArtwork */, 149 | 18313E5211CFBFA500C521F1 /* sound.wav */, 150 | 18313E5311CFBFA500C521F1 /* speaker.png */, 151 | 8D1107310486CEB800E47090 /* MusicCube-Info.plist */, 152 | ); 153 | name = Resources; 154 | sourceTree = ""; 155 | }; 156 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | AF2238AE19EF299500C4D0C9 /* AVFoundation.framework */, 160 | AF62C67719099B690075DD39 /* GLKit.framework */, 161 | AF74CA530F8D8D1300A8C113 /* AudioToolbox.framework */, 162 | AF74CA540F8D8D1300A8C113 /* CoreGraphics.framework */, 163 | AF74CA550F8D8D1300A8C113 /* OpenAL.framework */, 164 | 28FD15070DC6FC5B0079059D /* QuartzCore.framework */, 165 | 28FD14FF0DC6FC520079059D /* OpenGLES.framework */, 166 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 167 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 168 | ); 169 | name = Frameworks; 170 | sourceTree = ""; 171 | }; 172 | /* End PBXGroup section */ 173 | 174 | /* Begin PBXNativeTarget section */ 175 | 1D6058900D05DD3D006BFB54 /* MusicCube */ = { 176 | isa = PBXNativeTarget; 177 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "MusicCube" */; 178 | buildPhases = ( 179 | 1D60588D0D05DD3D006BFB54 /* Resources */, 180 | 1D60588E0D05DD3D006BFB54 /* Sources */, 181 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 182 | ); 183 | buildRules = ( 184 | ); 185 | dependencies = ( 186 | ); 187 | name = MusicCube; 188 | productName = MusicCube; 189 | productReference = 1D6058910D05DD3D006BFB54 /* MusicCube.app */; 190 | productType = "com.apple.product-type.application"; 191 | }; 192 | /* End PBXNativeTarget section */ 193 | 194 | /* Begin PBXProject section */ 195 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 196 | isa = PBXProject; 197 | attributes = { 198 | LastUpgradeCheck = 0510; 199 | }; 200 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MusicCube" */; 201 | compatibilityVersion = "Xcode 3.2"; 202 | developmentRegion = English; 203 | hasScannedForEncodings = 1; 204 | knownRegions = ( 205 | English, 206 | Japanese, 207 | French, 208 | German, 209 | en, 210 | ); 211 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 212 | projectDirPath = ""; 213 | projectRoot = ""; 214 | targets = ( 215 | 1D6058900D05DD3D006BFB54 /* MusicCube */, 216 | ); 217 | }; 218 | /* End PBXProject section */ 219 | 220 | /* Begin PBXResourcesBuildPhase section */ 221 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 222 | isa = PBXResourcesBuildPhase; 223 | buildActionMask = 2147483647; 224 | files = ( 225 | 18313E5911CFBFA500C521F1 /* sound.wav in Resources */, 226 | AFD2C072190AFF6E001715EB /* Default-568h@2x.png in Resources */, 227 | 18313E5A11CFBFA500C521F1 /* speaker.png in Resources */, 228 | 1821D71411D2873300418632 /* Icon-72.png in Resources */, 229 | 1821D71511D2873300418632 /* Icon-Small-50.png in Resources */, 230 | 1821D71611D2873300418632 /* Icon-Small.png in Resources */, 231 | 1821D71711D2873300418632 /* Icon-Small@2x.png in Resources */, 232 | 1821D71811D2873300418632 /* Icon.png in Resources */, 233 | 1821D71911D2873300418632 /* Icon@2x.png in Resources */, 234 | AF62C673190997D50075DD39 /* MainStoryboard.storyboard in Resources */, 235 | 1821D71A11D2873300418632 /* iTunesArtwork in Resources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | /* End PBXResourcesBuildPhase section */ 240 | 241 | /* Begin PBXSourcesBuildPhase section */ 242 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 243 | isa = PBXSourcesBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 247 | 1D3623260D0F684500981E51 /* MusicCubeAppDelegate.m in Sources */, 248 | AF74CA8F0F8D8E0900A8C113 /* MusicCubePlayback.m in Sources */, 249 | AF62C676190998030075DD39 /* MusicCubeViewController.m in Sources */, 250 | ); 251 | runOnlyForDeploymentPostprocessing = 0; 252 | }; 253 | /* End PBXSourcesBuildPhase section */ 254 | 255 | /* Begin PBXVariantGroup section */ 256 | AF62C671190997D50075DD39 /* MainStoryboard.storyboard */ = { 257 | isa = PBXVariantGroup; 258 | children = ( 259 | AF62C672190997D50075DD39 /* en */, 260 | ); 261 | name = MainStoryboard.storyboard; 262 | sourceTree = ""; 263 | }; 264 | /* End PBXVariantGroup section */ 265 | 266 | /* Begin XCBuildConfiguration section */ 267 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 268 | isa = XCBuildConfiguration; 269 | buildSettings = { 270 | ALWAYS_SEARCH_USER_PATHS = NO; 271 | COPY_PHASE_STRIP = NO; 272 | GCC_DYNAMIC_NO_PIC = NO; 273 | GCC_OPTIMIZATION_LEVEL = 0; 274 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 275 | GCC_PREFIX_HEADER = MusicCube_Prefix.pch; 276 | "GCC_THUMB_SUPPORT[arch=armv6]" = ""; 277 | INFOPLIST_FILE = "MusicCube-Info.plist"; 278 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 279 | PRODUCT_NAME = MusicCube; 280 | }; 281 | name = Debug; 282 | }; 283 | 1D6058950D05DD3E006BFB54 /* Release */ = { 284 | isa = XCBuildConfiguration; 285 | buildSettings = { 286 | ALWAYS_SEARCH_USER_PATHS = NO; 287 | COPY_PHASE_STRIP = YES; 288 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 289 | GCC_PREFIX_HEADER = MusicCube_Prefix.pch; 290 | "GCC_THUMB_SUPPORT[arch=armv6]" = ""; 291 | INFOPLIST_FILE = "MusicCube-Info.plist"; 292 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 293 | PRODUCT_NAME = MusicCube; 294 | }; 295 | name = Release; 296 | }; 297 | C01FCF4F08A954540054247B /* Debug */ = { 298 | isa = XCBuildConfiguration; 299 | buildSettings = { 300 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 301 | GCC_C_LANGUAGE_STANDARD = c99; 302 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 303 | GCC_WARN_UNUSED_VARIABLE = YES; 304 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 305 | ONLY_ACTIVE_ARCH = YES; 306 | PREBINDING = NO; 307 | SDKROOT = iphoneos; 308 | }; 309 | name = Debug; 310 | }; 311 | C01FCF5008A954540054247B /* Release */ = { 312 | isa = XCBuildConfiguration; 313 | buildSettings = { 314 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 315 | GCC_C_LANGUAGE_STANDARD = c99; 316 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 317 | GCC_WARN_UNUSED_VARIABLE = YES; 318 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 319 | PREBINDING = NO; 320 | SDKROOT = iphoneos; 321 | }; 322 | name = Release; 323 | }; 324 | /* End XCBuildConfiguration section */ 325 | 326 | /* Begin XCConfigurationList section */ 327 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "MusicCube" */ = { 328 | isa = XCConfigurationList; 329 | buildConfigurations = ( 330 | 1D6058940D05DD3E006BFB54 /* Debug */, 331 | 1D6058950D05DD3E006BFB54 /* Release */, 332 | ); 333 | defaultConfigurationIsVisible = 0; 334 | defaultConfigurationName = Release; 335 | }; 336 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MusicCube" */ = { 337 | isa = XCConfigurationList; 338 | buildConfigurations = ( 339 | C01FCF4F08A954540054247B /* Debug */, 340 | C01FCF5008A954540054247B /* Release */, 341 | ); 342 | defaultConfigurationIsVisible = 0; 343 | defaultConfigurationName = Release; 344 | }; 345 | /* End XCConfigurationList section */ 346 | }; 347 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 348 | } 349 | -------------------------------------------------------------------------------- /tests/samples/no_whitespace.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | {archiveVersion=1;classes={};objectVersion=45;objects={};} 3 | --------------------------------------------------------------------------------