LCOV - code coverage report
Current view: top level - libreoffice/workdir/unxlngi6.pro/UnpackedTarball/langtag/liblangtag - lt-extlang.c (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 43 93 46.2 %
Date: 2012-12-17 Functions: 9 15 60.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
       2             : /* 
       3             :  * lt-extlang.c
       4             :  * Copyright (C) 2011-2012 Akira TAGOH
       5             :  * 
       6             :  * Authors:
       7             :  *   Akira TAGOH  <akira@tagoh.org>
       8             :  * 
       9             :  * You may distribute under the terms of either the GNU
      10             :  * Lesser General Public License or the Mozilla Public
      11             :  * License, as specified in the README file.
      12             :  */
      13             : #ifdef HAVE_CONFIG_H
      14             : #include "config.h"
      15             : #endif
      16             : 
      17             : #include <stdlib.h>
      18             : #include <string.h>
      19             : #include "lt-macros.h"
      20             : #include "lt-mem.h"
      21             : #include "lt-messages.h"
      22             : #include "lt-string.h"
      23             : #include "lt-utils.h"
      24             : #include "lt-extlang.h"
      25             : #include "lt-extlang-private.h"
      26             : 
      27             : 
      28             : /**
      29             :  * SECTION:lt-extlang
      30             :  * @Short_Description: A container class for Extlang subtag
      31             :  * @Title: Container - Extlang
      32             :  *
      33             :  * This container class provides a data access to Extlang subtag entry.
      34             :  */
      35             : struct _lt_extlang_t {
      36             :         lt_mem_t  parent;
      37             :         char     *tag;
      38             :         char     *description;
      39             :         char     *macrolanguage;
      40             :         char     *preferred_tag;
      41             :         char     *prefix;
      42             : };
      43             : 
      44             : /*< private >*/
      45             : 
      46             : /*< protected >*/
      47             : lt_extlang_t *
      48         916 : lt_extlang_create(void)
      49             : {
      50             :         lt_extlang_t *retval;
      51             : 
      52         916 :         retval = lt_mem_alloc_object(sizeof (lt_extlang_t));
      53             : 
      54         916 :         return retval;
      55             : }
      56             : 
      57             : void
      58         916 : lt_extlang_set_tag(lt_extlang_t *extlang,
      59             :                    const char   *subtag)
      60             : {
      61         916 :         lt_return_if_fail (extlang != NULL);
      62         916 :         lt_return_if_fail (subtag != NULL);
      63             : 
      64         916 :         if (extlang->tag)
      65           0 :                 lt_mem_delete_ref(&extlang->parent, extlang->tag);
      66         916 :         extlang->tag = strdup(subtag);
      67         916 :         lt_mem_add_ref(&extlang->parent, extlang->tag, free);
      68             : }
      69             : 
      70             : void
      71         908 : lt_extlang_set_preferred_tag(lt_extlang_t *extlang,
      72             :                              const char   *subtag)
      73             : {
      74         908 :         lt_return_if_fail (extlang != NULL);
      75         908 :         lt_return_if_fail (subtag != NULL);
      76             : 
      77         908 :         if (extlang->preferred_tag)
      78           0 :                 lt_mem_delete_ref(&extlang->parent, extlang->preferred_tag);
      79         908 :         extlang->preferred_tag = strdup(subtag);
      80         908 :         lt_mem_add_ref(&extlang->parent, extlang->preferred_tag, free);
      81             : }
      82             : 
      83             : void
      84         916 : lt_extlang_set_name(lt_extlang_t *extlang,
      85             :                     const char   *description)
      86             : {
      87         916 :         lt_return_if_fail (extlang != NULL);
      88         916 :         lt_return_if_fail (description != NULL);
      89             : 
      90         916 :         if (extlang->description)
      91           0 :                 lt_mem_delete_ref(&extlang->parent, extlang->description);
      92         916 :         extlang->description = strdup(description);
      93         916 :         lt_mem_add_ref(&extlang->parent, extlang->description, free);
      94             : }
      95             : 
      96             : void
      97         348 : lt_extlang_set_macro_language(lt_extlang_t *extlang,
      98             :                               const char   *macrolanguage)
      99             : {
     100         348 :         lt_return_if_fail (extlang != NULL);
     101         348 :         lt_return_if_fail (macrolanguage != NULL);
     102             : 
     103         348 :         if (extlang->macrolanguage)
     104           0 :                 lt_mem_delete_ref(&extlang->parent, extlang->macrolanguage);
     105         348 :         extlang->macrolanguage = strdup(macrolanguage);
     106         348 :         lt_mem_add_ref(&extlang->parent, extlang->macrolanguage, free);
     107             : }
     108             : 
     109             : void
     110         908 : lt_extlang_add_prefix(lt_extlang_t *extlang,
     111             :                       const char   *prefix)
     112             : {
     113         908 :         lt_return_if_fail (extlang != NULL);
     114         908 :         lt_return_if_fail (prefix != NULL);
     115             : 
     116         908 :         if (extlang->prefix)
     117           0 :                 lt_mem_delete_ref(&extlang->parent, extlang->prefix);
     118         908 :         extlang->prefix = strdup(prefix);
     119         908 :         lt_mem_add_ref(&extlang->parent, extlang->prefix, free);
     120             : }
     121             : 
     122             : /*< public >*/
     123             : /**
     124             :  * lt_extlang_ref:
     125             :  * @extlang: a #lt_extlang_t.
     126             :  *
     127             :  * Increases the reference count of @extlang.
     128             :  *
     129             :  * Returns: (transfer none): the same @extlang object.
     130             :  */
     131             : lt_extlang_t *
     132         908 : lt_extlang_ref(lt_extlang_t *extlang)
     133             : {
     134         908 :         lt_return_val_if_fail (extlang != NULL, NULL);
     135             : 
     136         908 :         return lt_mem_ref(&extlang->parent);
     137             : }
     138             : 
     139             : /**
     140             :  * lt_extlang_unref:
     141             :  * @extlang: a #lt_extlang_t.
     142             :  *
     143             :  * Decreases the reference count of @extlang. when its reference count
     144             :  * drops to 0, the object is finalized (i.e. its memory is freed).
     145             :  */
     146             : void
     147        1824 : lt_extlang_unref(lt_extlang_t *extlang)
     148             : {
     149        1824 :         if (extlang)
     150        1824 :                 lt_mem_unref(&extlang->parent);
     151        1824 : }
     152             : 
     153             : /**
     154             :  * lt_extlang_get_tag:
     155             :  * @extlang: a #lt_extlang_t.
     156             :  *
     157             :  * Obtains the subtag that is registered as ISO 639 code.
     158             :  *
     159             :  * Returns: a subtag name.
     160             :  */
     161             : const char *
     162         916 : lt_extlang_get_tag(const lt_extlang_t *extlang)
     163             : {
     164         916 :         lt_return_val_if_fail (extlang != NULL, NULL);
     165             : 
     166         916 :         return extlang->tag;
     167             : }
     168             : 
     169             : /**
     170             :  * lt_extlang_get_preferred_tag:
     171             :  * @extlang: a #lt_extlang_t.
     172             :  *
     173             :  * Obtains the preferred-value. this is available only when the subtag is
     174             :  * marked as deprecated.
     175             :  *
     176             :  * Returns: a preferred-value for the subtag or %NULL.
     177             :  */
     178             : const char *
     179           0 : lt_extlang_get_preferred_tag(const lt_extlang_t *extlang)
     180             : {
     181           0 :         lt_return_val_if_fail (extlang != NULL, NULL);
     182             : 
     183           0 :         return extlang->preferred_tag;
     184             : }
     185             : 
     186             : /**
     187             :  * lt_extlang_get_name:
     188             :  * @extlang: a #lt_extlang_t.
     189             :  *
     190             :  * Obtains the description of the subtag.
     191             :  *
     192             :  * Returns: a description string.
     193             :  */
     194             : const char *
     195           0 : lt_extlang_get_name(const lt_extlang_t *extlang)
     196             : {
     197           0 :         lt_return_val_if_fail (extlang != NULL, NULL);
     198             : 
     199           0 :         return extlang->description;
     200             : }
     201             : 
     202             : /**
     203             :  * lt_extlang_get_macro_language:
     204             :  * @extlang: a #lt_extlang_t.
     205             :  *
     206             :  * Obtains the macrolanguage being assigned for the subtag.
     207             :  * This is available only when the subtag is registered as the macrolanguage
     208             :  * in ISO 639-3.
     209             :  *
     210             :  * Returns: a macrolanguage string or %NULL.
     211             :  */
     212             : const char *
     213           0 : lt_extlang_get_macro_language(const lt_extlang_t *extlang)
     214             : {
     215           0 :         lt_return_val_if_fail (extlang != NULL, NULL);
     216             : 
     217           0 :         return extlang->macrolanguage;
     218             : }
     219             : 
     220             : /**
     221             :  * lt_extlang_get_prefix:
     222             :  * @extlang: a #lt_extlang_t.
     223             :  *
     224             :  * Obtains the prefix being assigned to the subtag.
     225             :  * This is available only when the subtag has a particular seqnence of
     226             :  * subgtags that form a meaningful tag with the subtag.
     227             :  *
     228             :  * Returns: a prefix string or %NULL.
     229             :  */
     230             : const char *
     231           0 : lt_extlang_get_prefix(const lt_extlang_t *extlang)
     232             : {
     233           0 :         lt_return_val_if_fail (extlang != NULL, NULL);
     234             : 
     235           0 :         return extlang->prefix;
     236             : }
     237             : 
     238             : /**
     239             :  * lt_extlang_dump:
     240             :  * @extlang: a #lt_extlang_t.
     241             :  *
     242             :  * Dumps the container information to the standard output.
     243             :  */
     244             : void
     245           0 : lt_extlang_dump(const lt_extlang_t *extlang)
     246             : {
     247           0 :         const char *macrolang = lt_extlang_get_macro_language(extlang);
     248           0 :         const char *preferred = lt_extlang_get_preferred_tag(extlang);
     249           0 :         const char *prefix = lt_extlang_get_prefix(extlang);
     250           0 :         lt_string_t *string = lt_string_new(NULL);
     251             : 
     252           0 :         if (macrolang) {
     253           0 :                 if (lt_string_length(string) == 0)
     254           0 :                         lt_string_append(string, " (");
     255           0 :                 lt_string_append_printf(string, "macrolanguage: %s",
     256             :                                         macrolang);
     257             :         }
     258           0 :         if (preferred) {
     259           0 :                 if (lt_string_length(string) == 0)
     260           0 :                         lt_string_append(string, " (");
     261             :                 else
     262           0 :                         lt_string_append(string, ", ");
     263           0 :                 lt_string_append_printf(string, "preferred-value: %s",
     264             :                                         preferred);
     265             :         }
     266           0 :         if (prefix) {
     267           0 :                 if (lt_string_length(string) == 0)
     268           0 :                         lt_string_append(string, " (");
     269             :                 else
     270           0 :                         lt_string_append(string, ", ");
     271           0 :                 lt_string_append_printf(string, "prefix: %s",
     272             :                                         prefix);
     273             :         }
     274           0 :         if (lt_string_length(string) > 0)
     275           0 :                 lt_string_append(string, ")");
     276           0 :         lt_info("Extlang: %s [%s]%s",
     277             :                 lt_extlang_get_tag(extlang),
     278             :                 lt_extlang_get_name(extlang),
     279             :                 lt_string_value(string));
     280             : 
     281           0 :         lt_string_unref(string);
     282           0 : }
     283             : 
     284             : /**
     285             :  * lt_extlang_compare:
     286             :  * @v1: a #lt_extlang_t.
     287             :  * @v2: a #lt_extlang_t.
     288             :  *
     289             :  * Compares if @v1 and @v2 is the same object or not.
     290             :  *
     291             :  * Returns: %TRUE if it's the same, otherwise %FALSE.
     292             :  */
     293             : lt_bool_t
     294           0 : lt_extlang_compare(const lt_extlang_t *v1,
     295             :                    const lt_extlang_t *v2)
     296             : {
     297             :         const char *s1, *s2;
     298             : 
     299           0 :         if (v1 == v2)
     300           0 :                 return TRUE;
     301             : 
     302           0 :         s1 = v1 ? lt_extlang_get_tag(v1) : NULL;
     303           0 :         s2 = v2 ? lt_extlang_get_tag(v2) : NULL;
     304             : 
     305           0 :         if (lt_strcmp0(s1, "*") == 0 ||
     306           0 :             lt_strcmp0(s2, "*") == 0)
     307           0 :                 return TRUE;
     308             : 
     309           0 :         return lt_strcmp0(s1, s2) == 0;
     310             : }

Generated by: LCOV version 1.10