162bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 262bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett/* 362bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett * Copyright 2012 The Android Open Source Project 462bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett * 562bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett * Use of this source code is governed by a BSD-style license that can be 662bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett * found in the LICENSE file. 762bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett */ 862bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 962bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett#include "SkLanguage.h" 1062bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 1162bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett#ifdef SK_BUILD_FOR_ANDROID // currently only for Android 1262bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 1362bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett#include "SkTDict.h" 1462bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett#include "SkThread.h" 1562bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett#include <cstring> 1662bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 1762bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly HewlettSkLanguage SkLanguage::getParent() const { 1862bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett SkASSERT(fInfo != NULL); 1962bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett const char* tag = fInfo->fTag.c_str(); 2062bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett SkASSERT(tag != NULL); 2162bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 2262bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett // strip off the rightmost "-.*" 2362bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett char* parentTagEnd = strrchr(tag, '-'); 2462bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett if (parentTagEnd == NULL) { 2562bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett return SkLanguage(""); 2662bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett } 2762bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett size_t parentTagLen = parentTagEnd - tag; 2862bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett char parentTag[parentTagLen + 1]; 2962bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett strncpy(parentTag, tag, parentTagLen); 3062bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett parentTag[parentTagLen] = '\0'; 3162bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett return SkLanguage(parentTag); 3262bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett} 3362bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 3462bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly HewlettSK_DECLARE_STATIC_MUTEX(gGetInfoMutex); 3562bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlettconst SkLanguageInfo* SkLanguage::getInfo(const char* tag) { 3662bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett SkAutoMutexAcquire lock(gGetInfoMutex); 3762bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 3862bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett static const size_t kDictSize = 128; 3962bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett static SkTDict<SkLanguageInfo*> tagToInfo(kDictSize); 4062bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 4162bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett // try a lookup 4262bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett SkLanguageInfo* info; 4362bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett if (tagToInfo.find(tag, &info)) { 4462bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett return info; 4562bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett } 4662bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 4762bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett // no match - add this language 4862bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett info = new SkLanguageInfo(tag); 4962bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett tagToInfo.set(tag, info); 5062bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett return info; 5162bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett} 5262bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett 5362bcdc699965e86196b7c4cf3d8680dfe3839b0cBilly Hewlett#endif 54