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