[gexiv2/wip/58] wip: Fix ordering of XMP tags




commit d284d3a090d18f0b64f8308d53e9b456285961ed
Author: Jens Georg <mail jensge org>
Date:   Sat Nov 14 14:57:15 2020 +0100

    wip: Fix ordering of XMP tags

 gexiv2/NaturalCollate.c        | 589 +++++++++++++++++++++++++++++++++++++++++
 gexiv2/gexiv2-metadata-xmp.cpp |  10 +-
 gexiv2/meson.build             |   1 +
 3 files changed, 597 insertions(+), 3 deletions(-)
---
diff --git a/gexiv2/NaturalCollate.c b/gexiv2/NaturalCollate.c
new file mode 100644
index 0000000..c2e51b0
--- /dev/null
+++ b/gexiv2/NaturalCollate.c
@@ -0,0 +1,589 @@
+/* NaturalCollate.c generated by valac 0.48.11, the Vala compiler
+ * generated from NaturalCollate.vala, do not modify */
+
+#include <glib.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define _g_free0(var) (var = (g_free(var), NULL))
+#define _vala_assert(expr, msg)                                                                              
          \
+    if G_LIKELY (expr)                                                                                       
          \
+        ;                                                                                                    
          \
+    else                                                                                                     
          \
+        g_assertion_message_expr(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
+#define _vala_return_if_fail(expr, msg)                                                                      
          \
+    if G_LIKELY (expr)                                                                                       
          \
+        ;                                                                                                    
          \
+    else {                                                                                                   
          \
+        g_return_if_fail_warning(G_LOG_DOMAIN, G_STRFUNC, msg);                                              
          \
+        return;                                                                                              
          \
+    }
+#define _vala_return_val_if_fail(expr, msg, val)                                                             
          \
+    if G_LIKELY (expr)                                                                                       
          \
+        ;                                                                                                    
          \
+    else {                                                                                                   
          \
+        g_return_if_fail_warning(G_LOG_DOMAIN, G_STRFUNC, msg);                                              
          \
+        return val;                                                                                          
          \
+    }
+#define _vala_warn_if_fail(expr, msg)                                                                        
          \
+    if G_LIKELY (expr)                                                                                       
          \
+        ;                                                                                                    
          \
+    else                                                                                                     
          \
+        g_warn_message(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
+
+#define NATURAL_COLLATE_SUPERDIGIT ((gunichar) ':')
+#define NATURAL_COLLATE_NUM_SENTINEL ((gunichar) 0x2)
+#define NATURAL_COLLATE_COLLATION_SENTINEL "\x01\x01\x01"
+gint natural_collate_read_number(gchar* s, glong* byte_index);
+gint natural_collate_compare(const gchar* str1, const gchar* str2);
+gchar* natural_collate_collate_key(gchar* str);
+
+static gunichar string_get_char(const gchar* self, glong index) {
+    gunichar result = 0U;
+#line 1262 "glib-2.0.vapi"
+    g_return_val_if_fail(self != NULL, 0U);
+#line 1263 "glib-2.0.vapi"
+    result = g_utf8_get_char(((gchar*) self) + index);
+#line 1263 "glib-2.0.vapi"
+    return result;
+#line 35 "NaturalCollate.c"
+}
+
+static gint string_index_of_nth_char(const gchar* self, glong c) {
+    gchar* _tmp0_;
+    gint result = 0;
+#line 1282 "glib-2.0.vapi"
+    g_return_val_if_fail(self != NULL, 0);
+#line 1283 "glib-2.0.vapi"
+    _tmp0_ = g_utf8_offset_to_pointer(self, c);
+#line 1283 "glib-2.0.vapi"
+    result = (gint)(_tmp0_ - ((gchar*) self));
+#line 1283 "glib-2.0.vapi"
+    return result;
+#line 52 "NaturalCollate.c"
+}
+
+static glong string_strnlen(gchar* str, glong maxlen) {
+    gchar* end = NULL;
+    gchar* _tmp0_;
+    gchar* _tmp1_;
+    glong result = 0L;
+#line 1447 "glib-2.0.vapi"
+    _tmp0_ = memchr(str, 0, (gsize) maxlen);
+#line 1447 "glib-2.0.vapi"
+    end = _tmp0_;
+#line 1448 "glib-2.0.vapi"
+    _tmp1_ = end;
+#line 1448 "glib-2.0.vapi"
+    if (_tmp1_ == NULL) {
+#line 1449 "glib-2.0.vapi"
+        result = maxlen;
+#line 1449 "glib-2.0.vapi"
+        return result;
+#line 75 "NaturalCollate.c"
+    } else {
+        gchar* _tmp2_;
+#line 1451 "glib-2.0.vapi"
+        _tmp2_ = end;
+#line 1451 "glib-2.0.vapi"
+        result = (glong)(_tmp2_ - str);
+#line 1451 "glib-2.0.vapi"
+        return result;
+#line 84 "NaturalCollate.c"
+    }
+}
+
+static gchar* string_substring(const gchar* self, glong offset, glong len) {
+    glong string_length = 0L;
+    gboolean _tmp0_ = FALSE;
+    gchar* _tmp3_;
+    gchar* result = NULL;
+#line 1458 "glib-2.0.vapi"
+    g_return_val_if_fail(self != NULL, NULL);
+#line 1460 "glib-2.0.vapi"
+    if (offset >= ((glong) 0)) {
+#line 1460 "glib-2.0.vapi"
+        _tmp0_ = len >= ((glong) 0);
+#line 103 "NaturalCollate.c"
+    } else {
+#line 1460 "glib-2.0.vapi"
+        _tmp0_ = FALSE;
+#line 107 "NaturalCollate.c"
+    }
+#line 1460 "glib-2.0.vapi"
+    if (_tmp0_) {
+#line 1462 "glib-2.0.vapi"
+        string_length = string_strnlen((gchar*) self, offset + len);
+#line 113 "NaturalCollate.c"
+    } else {
+        gint _tmp1_;
+        gint _tmp2_;
+#line 1464 "glib-2.0.vapi"
+        _tmp1_ = strlen(self);
+#line 1464 "glib-2.0.vapi"
+        _tmp2_ = _tmp1_;
+#line 1464 "glib-2.0.vapi"
+        string_length = (glong) _tmp2_;
+#line 123 "NaturalCollate.c"
+    }
+#line 1467 "glib-2.0.vapi"
+    if (offset < ((glong) 0)) {
+#line 1468 "glib-2.0.vapi"
+        offset = string_length + offset;
+#line 1469 "glib-2.0.vapi"
+        g_return_val_if_fail(offset >= ((glong) 0), NULL);
+#line 131 "NaturalCollate.c"
+    } else {
+#line 1471 "glib-2.0.vapi"
+        g_return_val_if_fail(offset <= string_length, NULL);
+#line 135 "NaturalCollate.c"
+    }
+#line 1473 "glib-2.0.vapi"
+    if (len < ((glong) 0)) {
+#line 1474 "glib-2.0.vapi"
+        len = string_length - offset;
+#line 141 "NaturalCollate.c"
+    }
+#line 1476 "glib-2.0.vapi"
+    g_return_val_if_fail((offset + len) <= string_length, NULL);
+#line 1477 "glib-2.0.vapi"
+    _tmp3_ = g_strndup(((gchar*) self) + offset, (gsize) len);
+#line 1477 "glib-2.0.vapi"
+    result = _tmp3_;
+#line 1477 "glib-2.0.vapi"
+    return result;
+#line 151 "NaturalCollate.c"
+}
+
+gint natural_collate_read_number(gchar* s, glong* byte_index) {
+    gint number = 0;
+    gint result = 0;
+#line 23 "../test/NaturalCollate.vala"
+    g_return_val_if_fail(s != NULL, 0);
+#line 31 "../test/NaturalCollate.vala"
+    number = 0;
+#line 33 "../test/NaturalCollate.vala"
+    while (TRUE) {
+#line 166 "NaturalCollate.c"
+        gboolean _tmp0_ = FALSE;
+        gint _tmp1_;
+        gint _tmp2_;
+        gint second_char = 0;
+        gchar* _tmp3_;
+#line 33 "../test/NaturalCollate.vala"
+        _tmp1_ = strlen(s);
+#line 33 "../test/NaturalCollate.vala"
+        _tmp2_ = _tmp1_;
+#line 33 "../test/NaturalCollate.vala"
+        if (_tmp2_ != 0) {
+#line 33 "../test/NaturalCollate.vala"
+            _tmp0_ = g_unichar_isdigit(string_get_char(s, (glong) 0));
+#line 180 "NaturalCollate.c"
+        } else {
+#line 33 "../test/NaturalCollate.vala"
+            _tmp0_ = FALSE;
+#line 184 "NaturalCollate.c"
+        }
+#line 33 "../test/NaturalCollate.vala"
+        if (!_tmp0_) {
+#line 33 "../test/NaturalCollate.vala"
+            break;
+#line 190 "NaturalCollate.c"
+        }
+#line 34 "../test/NaturalCollate.vala"
+        number = number * 10;
+#line 35 "../test/NaturalCollate.vala"
+        number += g_unichar_digit_value(string_get_char(s, (glong) 0));
+#line 36 "../test/NaturalCollate.vala"
+        second_char = string_index_of_nth_char(s, (glong) 1);
+#line 37 "../test/NaturalCollate.vala"
+        _tmp3_ = string_substring(s, (glong) second_char, (glong) -1);
+#line 37 "../test/NaturalCollate.vala"
+        _g_free0(s);
+#line 37 "../test/NaturalCollate.vala"
+        s = _tmp3_;
+#line 38 "../test/NaturalCollate.vala"
+        *byte_index = (*byte_index) + second_char;
+#line 206 "NaturalCollate.c"
+    }
+#line 40 "../test/NaturalCollate.vala"
+    result = number;
+#line 40 "../test/NaturalCollate.vala"
+    _g_free0(s);
+#line 40 "../test/NaturalCollate.vala"
+    return result;
+#line 214 "NaturalCollate.c"
+}
+
+gint natural_collate_compare(const gchar* str1, const gchar* str2) {
+    GCompareFunc _tmp0_;
+    gchar* _tmp1_;
+    gchar* _tmp2_;
+    gchar* _tmp3_;
+    gchar* _tmp4_;
+    gchar* _tmp5_;
+    gchar* _tmp6_;
+    gint _tmp7_;
+    gint result = 0;
+#line 43 "../test/NaturalCollate.vala"
+    g_return_val_if_fail(str1 != NULL, 0);
+#line 43 "../test/NaturalCollate.vala"
+    g_return_val_if_fail(str2 != NULL, 0);
+#line 44 "../test/NaturalCollate.vala"
+    _tmp0_ = ((GCompareFunc) g_strcmp0);
+#line 44 "../test/NaturalCollate.vala"
+    _tmp1_ = g_strdup(str1);
+#line 44 "../test/NaturalCollate.vala"
+    _tmp2_ = natural_collate_collate_key(_tmp1_);
+#line 44 "../test/NaturalCollate.vala"
+    _tmp3_ = _tmp2_;
+#line 44 "../test/NaturalCollate.vala"
+    _tmp4_ = g_strdup(str2);
+#line 44 "../test/NaturalCollate.vala"
+    _tmp5_ = natural_collate_collate_key(_tmp4_);
+#line 44 "../test/NaturalCollate.vala"
+    _tmp6_ = _tmp5_;
+#line 44 "../test/NaturalCollate.vala"
+    _tmp7_ = _tmp0_(_tmp3_, _tmp6_);
+#line 44 "../test/NaturalCollate.vala"
+    _g_free0(_tmp6_);
+#line 44 "../test/NaturalCollate.vala"
+    _g_free0(_tmp3_);
+#line 44 "../test/NaturalCollate.vala"
+    result = _tmp7_;
+#line 44 "../test/NaturalCollate.vala"
+    return result;
+#line 258 "NaturalCollate.c"
+}
+
+static gboolean string_contains(const gchar* self, const gchar* needle) {
+    gchar* _tmp0_;
+    gboolean result = FALSE;
+#line 1530 "glib-2.0.vapi"
+    g_return_val_if_fail(self != NULL, FALSE);
+#line 1530 "glib-2.0.vapi"
+    g_return_val_if_fail(needle != NULL, FALSE);
+#line 1531 "glib-2.0.vapi"
+    _tmp0_ = strstr((gchar*) self, (gchar*) needle);
+#line 1531 "glib-2.0.vapi"
+    result = _tmp0_ != NULL;
+#line 1531 "glib-2.0.vapi"
+    return result;
+#line 277 "NaturalCollate.c"
+}
+
+static gchar* g_unichar_to_string(gunichar self) {
+    gchar* str = NULL;
+    gchar* _tmp0_;
+    gchar* result = NULL;
+#line 1071 "glib-2.0.vapi"
+    _tmp0_ = g_new0(gchar, 7);
+#line 1071 "glib-2.0.vapi"
+    str = (gchar*) _tmp0_;
+#line 1072 "glib-2.0.vapi"
+    g_unichar_to_utf8(self, str);
+#line 1073 "glib-2.0.vapi"
+    result = str;
+#line 1073 "glib-2.0.vapi"
+    return result;
+#line 296 "NaturalCollate.c"
+}
+
+gchar* natural_collate_collate_key(gchar* str) {
+    gchar* _result_ = NULL;
+    gchar* _tmp0_;
+    gboolean eos = FALSE;
+    gint _tmp1_;
+    gint _tmp2_;
+    const gchar* _tmp46_;
+    gchar* _tmp47_;
+    gchar* _tmp48_;
+    gchar* _tmp49_;
+    gchar* result = NULL;
+#line 47 "../test/NaturalCollate.vala"
+    g_return_val_if_fail(str != NULL, NULL);
+#line 53 "../test/NaturalCollate.vala"
+    _vala_assert(g_utf8_validate(str, (gssize) -1, NULL), "str.validate()");
+#line 54 "../test/NaturalCollate.vala"
+    _tmp0_ = g_strdup("");
+#line 54 "../test/NaturalCollate.vala"
+    _result_ = _tmp0_;
+#line 55 "../test/NaturalCollate.vala"
+    _tmp1_ = strlen(str);
+#line 55 "../test/NaturalCollate.vala"
+    _tmp2_ = _tmp1_;
+#line 55 "../test/NaturalCollate.vala"
+    eos = _tmp2_ == 0;
+#line 57 "../test/NaturalCollate.vala"
+    while (TRUE) {
+#line 328 "NaturalCollate.c"
+        glong position = 0L;
+        const gchar* _tmp7_;
+        gchar* _tmp8_;
+        gchar* _tmp9_;
+        gchar* _tmp10_;
+        gchar* _tmp11_;
+        gchar* _tmp12_;
+        gchar* _tmp13_;
+        gint _tmp14_;
+        gint _tmp15_;
+        gint _tmp44_;
+        gint _tmp45_;
+#line 57 "../test/NaturalCollate.vala"
+        if (!(!eos)) {
+#line 57 "../test/NaturalCollate.vala"
+            break;
+#line 345 "NaturalCollate.c"
+        }
+#line 58 "../test/NaturalCollate.vala"
+        _vala_assert(g_utf8_validate(str, (gssize) -1, NULL), "str.validate()");
+#line 59 "../test/NaturalCollate.vala"
+        position = 0L;
+#line 60 "../test/NaturalCollate.vala"
+        while (TRUE) {
+#line 353 "NaturalCollate.c"
+            gchar* _tmp3_;
+            gchar* _tmp4_;
+            gboolean _tmp5_;
+            glong _tmp6_;
+#line 60 "../test/NaturalCollate.vala"
+            _tmp3_ = g_unichar_to_string(string_get_char(str, position));
+#line 60 "../test/NaturalCollate.vala"
+            _tmp4_ = _tmp3_;
+#line 60 "../test/NaturalCollate.vala"
+            _tmp5_ = !(!string_contains("0123456789", _tmp4_));
+#line 60 "../test/NaturalCollate.vala"
+            _g_free0(_tmp4_);
+#line 60 "../test/NaturalCollate.vala"
+            if (_tmp5_) {
+#line 60 "../test/NaturalCollate.vala"
+                break;
+#line 370 "NaturalCollate.c"
+            }
+#line 62 "../test/NaturalCollate.vala"
+            _tmp6_ = position;
+#line 62 "../test/NaturalCollate.vala"
+            position = _tmp6_ + 1;
+#line 376 "NaturalCollate.c"
+        }
+#line 66 "../test/NaturalCollate.vala"
+        _tmp7_ = _result_;
+#line 66 "../test/NaturalCollate.vala"
+        _tmp8_ = string_substring(str, (glong) 0, position);
+#line 66 "../test/NaturalCollate.vala"
+        _tmp9_ = _tmp8_;
+#line 66 "../test/NaturalCollate.vala"
+        _tmp10_ = g_utf8_collate_key(_tmp9_, (gssize) -1);
+#line 66 "../test/NaturalCollate.vala"
+        _tmp11_ = _tmp10_;
+#line 66 "../test/NaturalCollate.vala"
+        _tmp12_ = g_strconcat(_tmp7_, _tmp11_, NULL);
+#line 66 "../test/NaturalCollate.vala"
+        _g_free0(_result_);
+#line 66 "../test/NaturalCollate.vala"
+        _result_ = _tmp12_;
+#line 66 "../test/NaturalCollate.vala"
+        _g_free0(_tmp11_);
+#line 66 "../test/NaturalCollate.vala"
+        _g_free0(_tmp9_);
+#line 69 "../test/NaturalCollate.vala"
+        _tmp13_ = string_substring(str, position, (glong) -1);
+#line 69 "../test/NaturalCollate.vala"
+        _g_free0(str);
+#line 69 "../test/NaturalCollate.vala"
+        str = _tmp13_;
+#line 71 "../test/NaturalCollate.vala"
+        _tmp14_ = strlen(str);
+#line 71 "../test/NaturalCollate.vala"
+        _tmp15_ = _tmp14_;
+#line 71 "../test/NaturalCollate.vala"
+        eos = _tmp15_ == 0;
+#line 72 "../test/NaturalCollate.vala"
+        position = 0L;
+#line 74 "../test/NaturalCollate.vala"
+        if (!eos) {
+#line 414 "NaturalCollate.c"
+            gint number = 0;
+            gchar* _tmp16_;
+            gint _tmp17_;
+            gchar* _tmp18_;
+            gint number_of_superdigits = 0;
+            gchar* _tmp19_;
+            gchar* _tmp20_;
+            gint _tmp21_;
+            gint _tmp22_;
+            gint _tmp23_;
+            gchar* to_append = NULL;
+            gchar* _tmp24_;
+            const gchar* _tmp31_;
+            gchar* _tmp32_;
+            gchar* _tmp33_;
+            gchar* _tmp34_;
+            const gchar* _tmp35_;
+            gchar* _tmp36_;
+            gchar* _tmp37_;
+            gchar* _tmp38_;
+            gchar* _tmp39_;
+            gchar* _tmp40_;
+            gchar* _tmp41_;
+            const gchar* _tmp42_;
+            gchar* _tmp43_;
+#line 76 "../test/NaturalCollate.vala"
+            _tmp16_ = g_strdup(str);
+#line 76 "../test/NaturalCollate.vala"
+            _tmp17_ = natural_collate_read_number(_tmp16_, &position);
+#line 76 "../test/NaturalCollate.vala"
+            number = _tmp17_;
+#line 77 "../test/NaturalCollate.vala"
+            _tmp18_ = string_substring(str, position, (glong) -1);
+#line 77 "../test/NaturalCollate.vala"
+            _g_free0(str);
+#line 77 "../test/NaturalCollate.vala"
+            str = _tmp18_;
+#line 78 "../test/NaturalCollate.vala"
+            _tmp19_ = g_strdup_printf("%i", number);
+#line 78 "../test/NaturalCollate.vala"
+            _tmp20_ = _tmp19_;
+#line 78 "../test/NaturalCollate.vala"
+            _tmp21_ = strlen(_tmp20_);
+#line 78 "../test/NaturalCollate.vala"
+            _tmp22_ = _tmp21_;
+#line 78 "../test/NaturalCollate.vala"
+            _tmp23_ = _tmp22_;
+#line 78 "../test/NaturalCollate.vala"
+            _g_free0(_tmp20_);
+#line 78 "../test/NaturalCollate.vala"
+            number_of_superdigits = _tmp23_;
+#line 79 "../test/NaturalCollate.vala"
+            _tmp24_ = g_strdup("");
+#line 79 "../test/NaturalCollate.vala"
+            to_append = _tmp24_;
+#line 470 "NaturalCollate.c"
+            {
+                gint i = 0;
+#line 80 "../test/NaturalCollate.vala"
+                i = 1;
+#line 475 "NaturalCollate.c"
+                {
+                    gboolean _tmp25_ = FALSE;
+#line 80 "../test/NaturalCollate.vala"
+                    _tmp25_ = TRUE;
+#line 80 "../test/NaturalCollate.vala"
+                    while (TRUE) {
+#line 482 "NaturalCollate.c"
+                        const gchar* _tmp27_;
+                        gchar* _tmp28_;
+                        gchar* _tmp29_;
+                        gchar* _tmp30_;
+#line 80 "../test/NaturalCollate.vala"
+                        if (!_tmp25_) {
+#line 489 "NaturalCollate.c"
+                            gint _tmp26_;
+#line 80 "../test/NaturalCollate.vala"
+                            _tmp26_ = i;
+#line 80 "../test/NaturalCollate.vala"
+                            i = _tmp26_ + 1;
+#line 495 "NaturalCollate.c"
+                        }
+#line 80 "../test/NaturalCollate.vala"
+                        _tmp25_ = FALSE;
+#line 80 "../test/NaturalCollate.vala"
+                        if (!(i < number_of_superdigits)) {
+#line 80 "../test/NaturalCollate.vala"
+                            break;
+#line 503 "NaturalCollate.c"
+                        }
+#line 82 "../test/NaturalCollate.vala"
+                        _tmp27_ = to_append;
+#line 82 "../test/NaturalCollate.vala"
+                        _tmp28_ = g_unichar_to_string(NATURAL_COLLATE_SUPERDIGIT);
+#line 82 "../test/NaturalCollate.vala"
+                        _tmp29_ = _tmp28_;
+#line 82 "../test/NaturalCollate.vala"
+                        _tmp30_ = g_strconcat(_tmp27_, _tmp29_, NULL);
+#line 82 "../test/NaturalCollate.vala"
+                        _g_free0(to_append);
+#line 82 "../test/NaturalCollate.vala"
+                        to_append = _tmp30_;
+#line 82 "../test/NaturalCollate.vala"
+                        _g_free0(_tmp29_);
+#line 519 "NaturalCollate.c"
+                    }
+                }
+            }
+#line 84 "../test/NaturalCollate.vala"
+            _tmp31_ = to_append;
+#line 84 "../test/NaturalCollate.vala"
+            _tmp32_ = g_strdup_printf("%i", number);
+#line 84 "../test/NaturalCollate.vala"
+            _tmp33_ = _tmp32_;
+#line 84 "../test/NaturalCollate.vala"
+            _tmp34_ = g_strconcat(_tmp31_, _tmp33_, NULL);
+#line 84 "../test/NaturalCollate.vala"
+            _g_free0(to_append);
+#line 84 "../test/NaturalCollate.vala"
+            to_append = _tmp34_;
+#line 84 "../test/NaturalCollate.vala"
+            _g_free0(_tmp33_);
+#line 85 "../test/NaturalCollate.vala"
+            _tmp35_ = _result_;
+#line 85 "../test/NaturalCollate.vala"
+            _tmp36_ = g_strconcat(_tmp35_, NATURAL_COLLATE_COLLATION_SENTINEL, NULL);
+#line 85 "../test/NaturalCollate.vala"
+            _tmp37_ = _tmp36_;
+#line 85 "../test/NaturalCollate.vala"
+            _tmp38_ = g_unichar_to_string(NATURAL_COLLATE_NUM_SENTINEL);
+#line 85 "../test/NaturalCollate.vala"
+            _tmp39_ = _tmp38_;
+#line 85 "../test/NaturalCollate.vala"
+            _tmp40_ = g_strconcat(_tmp37_, _tmp39_, NULL);
+#line 85 "../test/NaturalCollate.vala"
+            _tmp41_ = _tmp40_;
+#line 85 "../test/NaturalCollate.vala"
+            _tmp42_ = to_append;
+#line 85 "../test/NaturalCollate.vala"
+            _tmp43_ = g_strconcat(_tmp41_, _tmp42_, NULL);
+#line 85 "../test/NaturalCollate.vala"
+            _g_free0(_result_);
+#line 85 "../test/NaturalCollate.vala"
+            _result_ = _tmp43_;
+#line 85 "../test/NaturalCollate.vala"
+            _g_free0(_tmp41_);
+#line 85 "../test/NaturalCollate.vala"
+            _g_free0(_tmp39_);
+#line 85 "../test/NaturalCollate.vala"
+            _g_free0(_tmp37_);
+#line 74 "../test/NaturalCollate.vala"
+            _g_free0(to_append);
+#line 567 "NaturalCollate.c"
+        }
+#line 90 "../test/NaturalCollate.vala"
+        _tmp44_ = strlen(str);
+#line 90 "../test/NaturalCollate.vala"
+        _tmp45_ = _tmp44_;
+#line 90 "../test/NaturalCollate.vala"
+        eos = _tmp45_ == 0;
+#line 575 "NaturalCollate.c"
+    }
+#line 93 "../test/NaturalCollate.vala"
+    _tmp46_ = _result_;
+#line 93 "../test/NaturalCollate.vala"
+    _tmp47_ = g_unichar_to_string(NATURAL_COLLATE_NUM_SENTINEL);
+#line 93 "../test/NaturalCollate.vala"
+    _tmp48_ = _tmp47_;
+#line 93 "../test/NaturalCollate.vala"
+    _tmp49_ = g_strconcat(_tmp46_, _tmp48_, NULL);
+#line 93 "../test/NaturalCollate.vala"
+    _g_free0(_result_);
+#line 93 "../test/NaturalCollate.vala"
+    _result_ = _tmp49_;
+#line 93 "../test/NaturalCollate.vala"
+    _g_free0(_tmp48_);
+#line 96 "../test/NaturalCollate.vala"
+    result = _result_;
+#line 96 "../test/NaturalCollate.vala"
+    _g_free0(str);
+#line 96 "../test/NaturalCollate.vala"
+    return result;
+#line 597 "NaturalCollate.c"
+}
diff --git a/gexiv2/gexiv2-metadata-xmp.cpp b/gexiv2/gexiv2-metadata-xmp.cpp
index 784ad86..55e4a43 100644
--- a/gexiv2/gexiv2-metadata-xmp.cpp
+++ b/gexiv2/gexiv2-metadata-xmp.cpp
@@ -96,14 +96,15 @@ gboolean gexiv2_metadata_clear_xmp_tag(GExiv2Metadata *self, const gchar* tag) {
     return erased;
 }
 
+gint natural_collate_compare(const gchar* str1, const gchar* str2);
+
 gchar** gexiv2_metadata_get_xmp_tags (GExiv2Metadata *self) {
     g_return_val_if_fail(GEXIV2_IS_METADATA (self), NULL);
     g_return_val_if_fail(self->priv->image.get() != NULL, NULL);
     
     // get a copy of the original XmpData and sort it by key, preserving the original
     Exiv2::XmpData xmp_data = Exiv2::XmpData(self->priv->image->xmpData());
-    xmp_data.sortByKey ();
-    
+
     GSList *list = NULL;
     GSList *list_iter;
     gchar** data;
@@ -115,7 +116,10 @@ gchar** gexiv2_metadata_get_xmp_tags (GExiv2Metadata *self) {
             count++;
         }
     }
-    
+
+    list = g_slist_sort(list, reinterpret_cast<GCompareFunc>(natural_collate_compare));
+    list = g_slist_reverse(list);
+
     data = g_new (gchar*, count + 1);
     data[count --] = NULL;
     for (list_iter = list; list_iter != NULL; list_iter = list_iter->next)
diff --git a/gexiv2/meson.build b/gexiv2/meson.build
index 12abf92..c737431 100644
--- a/gexiv2/meson.build
+++ b/gexiv2/meson.build
@@ -54,6 +54,7 @@ gexiv2 = library('gexiv2',
                   'gexiv2-log-private.h',
                   'gexiv2-metadata-private.h',
                   'gexiv2-stream-io.h',
+                  'NaturalCollate.c',
                   'gexiv2-preview-properties-private.h',
                   'gexiv2-preview-image-private.h'] +
                  gexiv2_headers +


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]