1725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
2725b3e03acb91dc69296554932624b36612bd189Billy Hewlett/*
3725b3e03acb91dc69296554932624b36612bd189Billy Hewlett * Copyright 2012 The Android Open Source Project
4725b3e03acb91dc69296554932624b36612bd189Billy Hewlett *
5725b3e03acb91dc69296554932624b36612bd189Billy Hewlett * Use of this source code is governed by a BSD-style license that can be
6725b3e03acb91dc69296554932624b36612bd189Billy Hewlett * found in the LICENSE file.
7725b3e03acb91dc69296554932624b36612bd189Billy Hewlett */
8725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
9725b3e03acb91dc69296554932624b36612bd189Billy Hewlett#include "SkLanguage.h"
10725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
11725b3e03acb91dc69296554932624b36612bd189Billy Hewlett#ifdef SK_BUILD_FOR_ANDROID // currently only for Android
12725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
13725b3e03acb91dc69296554932624b36612bd189Billy Hewlett#include "SkTDict.h"
14725b3e03acb91dc69296554932624b36612bd189Billy Hewlett#include "SkThread.h"
15725b3e03acb91dc69296554932624b36612bd189Billy Hewlett#include <cstring>
16725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
17725b3e03acb91dc69296554932624b36612bd189Billy HewlettSkLanguage SkLanguage::getParent() const {
18725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    SkASSERT(fInfo != NULL);
19725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    SkASSERT(fInfo->fTag != NULL);
20725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    const char* tag = fInfo->fTag.c_str();
21725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    SkASSERT(tag != NULL);
22725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
23725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    // strip off the rightmost "-.*"
24725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    char* parentTagEnd = strrchr(tag, '-');
25725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    if (parentTagEnd == NULL) {
26725b3e03acb91dc69296554932624b36612bd189Billy Hewlett        return SkLanguage("");
27725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    }
28725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    size_t parentTagLen = parentTagEnd - tag;
29725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    char parentTag[parentTagLen + 1];
30725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    strncpy(parentTag, tag, parentTagLen);
31725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    parentTag[parentTagLen] = '\0';
32725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    return SkLanguage(parentTag);
33725b3e03acb91dc69296554932624b36612bd189Billy Hewlett}
34725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
35725b3e03acb91dc69296554932624b36612bd189Billy HewlettSK_DECLARE_STATIC_MUTEX(gGetInfoMutex);
36725b3e03acb91dc69296554932624b36612bd189Billy Hewlettconst SkLanguageInfo* SkLanguage::getInfo(const char* tag) {
37725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    SkAutoMutexAcquire lock(gGetInfoMutex);
38725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
39725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    static const size_t kDictSize = 128;
40725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    static SkTDict<SkLanguageInfo*> tagToInfo(kDictSize);
41725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
42725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    // try a lookup
43725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    SkLanguageInfo* info;
44725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    if (tagToInfo.find(tag, &info)) {
45725b3e03acb91dc69296554932624b36612bd189Billy Hewlett        return info;
46725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    }
47725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
48725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    // no match - add this language
49725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    info = new SkLanguageInfo(tag);
50725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    tagToInfo.set(tag, info);
51725b3e03acb91dc69296554932624b36612bd189Billy Hewlett    return info;
52725b3e03acb91dc69296554932624b36612bd189Billy Hewlett}
53725b3e03acb91dc69296554932624b36612bd189Billy Hewlett
54725b3e03acb91dc69296554932624b36612bd189Billy Hewlett#endif
55