Warning, /sdk/cutehmi/external/recipes/i686-w64-mingw32/gettext/0005-improve-plural-rules-detection.patch is written in an unsupported language. File is not indexed.

0001 --- a/gettext-tools/src/cldr-plurals.c  Sun Mar 20 09:37:53 2016
0002 +++ b/gettext-tools/src/cldr-plurals.c  Tue Jul 12 09:31:21 2016
0003 @@ -44,12 +44,13 @@
0004  extract_rules (FILE *fp,
0005                 const char *real_filename, const char *logical_filename,
0006                 const char *locale)
0007  {
0008    xmlDocPtr doc;
0009 -  xmlNodePtr node, n;
0010 -  size_t locale_length;
0011 +  xmlNodePtr rootNode, pluralsNode, pluralRulesNode, n;
0012 +  size_t locale_lengths[4];
0013 +  size_t locale_length, locale_lengths_count, locale_lengths_index;
0014    char *buffer = NULL, *p;
0015    size_t bufmax = 0;
0016    size_t buflen = 0;
0017  
0018    doc = xmlReadFd (fileno (fp), logical_filename, NULL,
0019 @@ -58,101 +59,130 @@
0020                     | XML_PARSE_NOERROR
0021                     | XML_PARSE_NOBLANKS);
0022    if (doc == NULL)
0023      error (EXIT_FAILURE, 0, _("memory exhausted"));
0024  
0025 -  node = xmlDocGetRootElement (doc);
0026 -  if (!node || !xmlStrEqual (node->name, BAD_CAST "supplementalData"))
0027 +  rootNode = xmlDocGetRootElement (doc);
0028 +  if (!rootNode || !xmlStrEqual (rootNode->name, BAD_CAST "supplementalData"))
0029      {
0030        error_at_line (0, 0,
0031                       logical_filename,
0032 -                     xmlGetLineNo (node),
0033 +                     xmlGetLineNo (rootNode),
0034                       _("\
0035  The root element must be <%s>"),
0036                       "supplementalData");
0037        goto out;
0038      }
0039  
0040 -  for (n = node->children; n; n = n->next)
0041 +  for (pluralsNode = NULL, n = rootNode->children; n; n = n->next)
0042      {
0043        if (n->type == XML_ELEMENT_NODE
0044            && xmlStrEqual (n->name, BAD_CAST "plurals"))
0045 -        break;
0046 +        {
0047 +          pluralsNode = n;
0048 +          break;
0049 +        }
0050      }
0051 -  if (!n)
0052 +  if (!pluralsNode)
0053      {
0054        error (0, 0, _("The element <%s> does not contain a <%s> element"),
0055               "supplementalData", "plurals");
0056        goto out;
0057      }
0058  
0059 -  locale_length = strlen (locale);
0060 -  for (n = n->children; n; n = n->next)
0061 +  locale_lengths[0] = strlen (locale);
0062 +  locale_lengths_count = 1;
0063 +  for (
0064 +    locale_lengths_index = locale_lengths[0] - 1;
0065 +    locale_lengths_index > 0 && locale_lengths_count < 4;
0066 +    locale_lengths_index--
0067 +  )
0068 +    {
0069 +      switch (locale[locale_lengths_index])
0070 +      {
0071 +        case '.':
0072 +        case '_':
0073 +        case '-':
0074 +        case '@':
0075 +          locale_lengths[locale_lengths_count++] = locale_lengths_index;
0076 +          break;
0077 +      }
0078 +    }
0079 +  for (
0080 +    pluralRulesNode = NULL, locale_lengths_index = 0;
0081 +    locale_lengths_index < locale_lengths_count;
0082 +    locale_lengths_index++
0083 +  )
0084      {
0085 -      xmlChar *locales;
0086        xmlChar *cp;
0087 -      xmlNodePtr n2;
0088 -      bool found = false;
0089 -
0090 -      if (n->type != XML_ELEMENT_NODE
0091 -          || !xmlStrEqual (n->name, BAD_CAST "pluralRules"))
0092 -        continue;
0093 -
0094 -      if (!xmlHasProp (n, BAD_CAST "locales"))
0095 +      xmlChar *locales;
0096 +      locale_length = locale_lengths[locale_lengths_index];
0097 +      for (n = pluralsNode->children; n; n = n->next)
0098          {
0099 -          error_at_line (0, 0,
0100 -                         logical_filename,
0101 -                         xmlGetLineNo (n),
0102 -                         _("\
0103 -The element <%s> does not have attribute <%s>"),
0104 -                         "pluralRules", "locales");
0105 -          continue;
0106 -        }
0107 +          if (n->type != XML_ELEMENT_NODE
0108 +              || !xmlStrEqual (n->name, BAD_CAST "pluralRules"))
0109 +            continue;
0110  
0111 -      cp = locales = xmlGetProp (n, BAD_CAST "locales");
0112 -      while (*cp != '\0')
0113 -        {
0114 -          while (c_isspace (*cp))
0115 -            cp++;
0116 -          if (xmlStrncmp (cp, BAD_CAST locale, locale_length) == 0
0117 -              && (*(cp + locale_length) == '\0'
0118 -                  || c_isspace (*(cp + locale_length))))
0119 +          if (!xmlHasProp (n, BAD_CAST "locales"))
0120              {
0121 -              found = true;
0122 -              break;
0123 +              error_at_line (0, 0,
0124 +                             logical_filename,
0125 +                             xmlGetLineNo (n),
0126 +                             _("\
0127 +  The element <%s> does not have attribute <%s>"),
0128 +                             "pluralRules", "locales");
0129 +              continue;
0130              }
0131 -          while (*cp && !c_isspace (*cp))
0132 -            cp++;
0133 -        }
0134 -      xmlFree (locales);
0135  
0136 -      if (!found)
0137 -        continue;
0138 +          cp = locales = xmlGetProp (n, BAD_CAST "locales");
0139 +          while (*cp != '\0')
0140 +            {
0141 +              while (c_isspace (*cp))
0142 +                cp++;
0143 +              if (xmlStrncmp (cp, BAD_CAST locale, locale_length) == 0
0144 +                  && (*(cp + locale_length) == '\0'
0145 +                      || c_isspace (*(cp + locale_length))))
0146 +                {
0147 +                  pluralRulesNode = n;
0148 +                  break;
0149 +                }
0150 +              while (*cp && !c_isspace (*cp))
0151 +                cp++;
0152 +            }
0153 +          xmlFree (locales);
0154  
0155 -      for (n2 = n->children; n2; n2 = n2->next)
0156 +          if (pluralRulesNode)
0157 +            break;
0158 +        }
0159 +      if (pluralRulesNode)
0160 +        break;
0161 +    }
0162 +  if (pluralRulesNode)
0163 +    {
0164 +      for (n = pluralRulesNode->children; n; n = n->next)
0165          {
0166            xmlChar *count;
0167            xmlChar *content;
0168            size_t length;
0169  
0170 -          if (n2->type != XML_ELEMENT_NODE
0171 -              || !xmlStrEqual (n2->name, BAD_CAST "pluralRule"))
0172 +          if (n->type != XML_ELEMENT_NODE
0173 +              || !xmlStrEqual (n->name, BAD_CAST "pluralRule"))
0174              continue;
0175  
0176 -          if (!xmlHasProp (n2, BAD_CAST "count"))
0177 +          if (!xmlHasProp (n, BAD_CAST "count"))
0178              {
0179                error_at_line (0, 0,
0180                               logical_filename,
0181 -                             xmlGetLineNo (n2),
0182 +                             xmlGetLineNo (n),
0183                               _("\
0184  The element <%s> does not have attribute <%s>"),
0185                               "pluralRule", "count");
0186                break;
0187              }
0188  
0189 -          count = xmlGetProp (n2, BAD_CAST "count");
0190 -          content = xmlNodeGetContent (n2);
0191 +          count = xmlGetProp (n, BAD_CAST "count");
0192 +          content = xmlNodeGetContent (n);
0193            length = xmlStrlen (count) + strlen (": ")
0194              + xmlStrlen (content) + strlen ("; ");
0195  
0196            if (buflen + length + 1 > bufmax)
0197              {