1769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski/* 2769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * Copyright (C) 2015 The Android Open Source Project 3769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * 4769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * you may not use this file except in compliance with the License. 6769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * You may obtain a copy of the License at 7769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * 8769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * 10769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * See the License for the specific language governing permissions and 14769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * limitations under the License. 15769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski */ 16769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski 17769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski#ifndef AAPT_NAME_MANGLER_H 18769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski#define AAPT_NAME_MANGLER_H 19769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski 20769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski#include <string> 21769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski 22769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinskinamespace aapt { 23769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski 24769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinskistruct NameMangler { 25769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski /** 26769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * Mangles the name in `outName` with the `package` and stores the mangled 27769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * result in `outName`. The mangled name should contain symbols that are 28769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * illegal to define in XML, so that there will never be name mangling 29769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * collisions. 30769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski */ 31769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski static void mangle(const std::u16string& package, std::u16string* outName) { 32769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski *outName = package + u"$" + *outName; 33769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski } 34769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski 35769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski /** 36769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * Unmangles the name in `outName`, storing the correct name back in `outName` 37769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * and the package in `outPackage`. Returns true if the name was unmangled or 38769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski * false if the name was never mangled to begin with. 39769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski */ 40769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski static bool unmangle(std::u16string* outName, std::u16string* outPackage) { 41769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski size_t pivot = outName->find(u'$'); 42769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski if (pivot == std::string::npos) { 43769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski return false; 44769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski } 45769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski 46769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski outPackage->assign(outName->data(), pivot); 47769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski outName->assign(outName->data() + pivot + 1, outName->size() - (pivot + 1)); 48769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski return true; 49769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski } 50769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski}; 51769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski 52769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski} // namespace aapt 53769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski 54769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski#endif // AAPT_NAME_MANGLER_H 55