Skip to content

Commit

Permalink
[nfcd] Added nfc_ndef_rec_t_lang_match(). JB#43873
Browse files Browse the repository at this point in the history
  • Loading branch information
monich committed Jul 18, 2019
1 parent 62331ee commit 39e0792
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 0 deletions.
12 changes: 12 additions & 0 deletions core/include/nfc_ndef.h
Expand Up @@ -144,6 +144,13 @@ typedef enum nfc_ndef_rec_t_enc {
NFC_NDEF_REC_T_ENC_UTF16LE
} NFC_NDEF_REC_T_ENC;

typedef enum nfc_lang_match {
NFC_LANG_MATCH_NONE = 0x00,
NFC_LANG_MATCH_TERRITORY = 0x01,
NFC_LANG_MATCH_LANGUAGE = 0x02,
NFC_LANG_MATCH_FULL = NFC_LANG_MATCH_LANGUAGE | NFC_LANG_MATCH_TERRITORY
} NFC_LANG_MATCH; /* Since 1.0.15 */

NfcNdefRecT*
nfc_ndef_rec_t_new_enc(
const char* text,
Expand All @@ -153,6 +160,11 @@ nfc_ndef_rec_t_new_enc(
#define nfc_ndef_rec_t_new(text,lang) \
nfc_ndef_rec_t_new_enc(text, lang, NFC_NDEF_REC_T_ENC_UTF8)

NFC_LANG_MATCH
nfc_ndef_rec_t_lang_match(
NfcNdefRecT* rec,
const NfcLanguage* lang); /* Since 1.0.15 */

/* These are not yet implemented: */

typedef struct nfc_ndef_rec_sp NfcNdefRecSp; /* Smart poster */
Expand Down
30 changes: 30 additions & 0 deletions core/src/nfc_ndef_rec_t.c
Expand Up @@ -248,6 +248,36 @@ nfc_ndef_rec_t_new_enc(
return NULL;
}

NFC_LANG_MATCH
nfc_ndef_rec_t_lang_match(
NfcNdefRecT* rec,
const NfcLanguage* lang) /* Since 1.0.15 */
{
NFC_LANG_MATCH match = NFC_LANG_MATCH_NONE;

if (G_LIKELY(rec) && G_LIKELY(lang) && G_LIKELY(lang->language)) {
const char* sep = strchr(rec->lang, '-');

if (sep) {
const gsize lang_len = sep - rec->lang;

if (strlen(lang->language) == lang_len &&
!g_ascii_strncasecmp(rec->lang, lang->language, lang_len)) {
match |= NFC_LANG_MATCH_LANGUAGE;
}
if (lang->territory && lang->territory[0] &&
!g_ascii_strcasecmp(sep + 1, lang->territory)) {
match |= NFC_LANG_MATCH_TERRITORY;
}
} else {
if (!g_ascii_strcasecmp(rec->lang, lang->language)) {
match |= NFC_LANG_MATCH_LANGUAGE;
}
}
}
return match;
}

/*==========================================================================*
* Internals
*==========================================================================*/
Expand Down
66 changes: 66 additions & 0 deletions unit/core_ndef_rec_t/test_core_ndef_rec_t.c
Expand Up @@ -35,6 +35,7 @@

#include "nfc_util.h"
#include "nfc_ndef_p.h"
#include "nfc_system.h"

static TestOpt test_opt;
static const char* test_system_locale = NULL;
Expand Down Expand Up @@ -133,6 +134,70 @@ test_locale(
nfc_ndef_rec_unref(&trec->rec);
}

/*==========================================================================*
* lang_match
*==========================================================================*/

static
void
test_lang_match(
void)
{
NfcNdefRecT* t;
NfcLanguage l;

test_system_locale = "en_US.UTF-8";
t = nfc_ndef_rec_t_new(NULL, NULL);
g_assert(t);

/* Test NULL tolerance */
memset(&l, 0, sizeof(l));
g_assert(!nfc_ndef_rec_t_lang_match(NULL, NULL));
g_assert(!nfc_ndef_rec_t_lang_match(t, NULL));
g_assert(!nfc_ndef_rec_t_lang_match(t, &l));

/* Test matching */
l.language = "foo";
g_assert(!nfc_ndef_rec_t_lang_match(t, &l));

l.language = "ru";
g_assert(!nfc_ndef_rec_t_lang_match(t, &l));

l.language = "EN";
g_assert(nfc_ndef_rec_t_lang_match(t, &l) == NFC_LANG_MATCH_LANGUAGE);

l.territory = "";
g_assert(nfc_ndef_rec_t_lang_match(t, &l) == NFC_LANG_MATCH_LANGUAGE);

l.territory = "BR";
g_assert(nfc_ndef_rec_t_lang_match(t, &l) == NFC_LANG_MATCH_LANGUAGE);

l.territory = "US";
g_assert(nfc_ndef_rec_t_lang_match(t, &l) == NFC_LANG_MATCH_FULL);

nfc_ndef_rec_unref(&t->rec);

/* And again, this time without territory */
test_system_locale = "en";
t = nfc_ndef_rec_t_new(NULL, NULL);
g_assert(t);

memset(&l, 0, sizeof(l));
l.language = "foo";
g_assert(!nfc_ndef_rec_t_lang_match(t, &l));

l.language = "ru";
g_assert(!nfc_ndef_rec_t_lang_match(t, &l));

l.language = "en";
g_assert(nfc_ndef_rec_t_lang_match(t, &l) == NFC_LANG_MATCH_LANGUAGE);

l.territory = "us";
g_assert(nfc_ndef_rec_t_lang_match(t, &l) == NFC_LANG_MATCH_LANGUAGE);

nfc_ndef_rec_unref(&t->rec);
}

/*==========================================================================*
* utf16
*==========================================================================*/
Expand Down Expand Up @@ -480,6 +545,7 @@ int main(int argc, char* argv[])
g_test_add_func(TEST_("invalid_text"), test_invalid_text);
g_test_add_func(TEST_("default_lang"), test_default_lang);
g_test_add_func(TEST_("locale"), test_locale);
g_test_add_func(TEST_("lang_match"), test_lang_match);

for (i = 0; i < G_N_ELEMENTS(tests_invalid); i++) {
const TestInvalid* test = tests_invalid + i;
Expand Down

0 comments on commit 39e0792

Please sign in to comment.