[gnumeric] ods: be more careful with quoting of text parts in formats.



commit 590c2a3b1b5ed66fd77ecbcf71386a143c6731a9
Author: Morten Welinder <terra gnome org>
Date:   Tue Jul 2 08:45:21 2019 -0400

    ods: be more careful with quoting of text parts in formats.

 NEWS                                 |   2 +-
 plugins/openoffice/ChangeLog         |   7 ++
 plugins/openoffice/openoffice-read.c | 167 ++++++++++++++++-------------------
 3 files changed, 82 insertions(+), 94 deletions(-)
---
diff --git a/NEWS b/NEWS
index f75cb0ed3..bd7dc3006 100644
--- a/NEWS
+++ b/NEWS
@@ -1,7 +1,7 @@
 Gnumeric 1.12.46
 
 Andreas:
-    * Fix format import from ODF. [#403]
+       * Fix format import from ODF. [#403]
 
 Morten:
        * Fix over-eager guessing of dates in csv.  [#401]
diff --git a/plugins/openoffice/ChangeLog b/plugins/openoffice/ChangeLog
index 7c9628227..1469a0fe5 100644
--- a/plugins/openoffice/ChangeLog
+++ b/plugins/openoffice/ChangeLog
@@ -1,3 +1,10 @@
+2019-07-02  Morten Welinder  <terra gnome org>
+
+       * openoffice-read.c (oo_format_text_append): Avoid relying on tail
+       recursion being efficient.  Be more careful about what to quote.
+       (oo_format_text_append_unquoted): Take a string instead of a
+       single character.  Use to fix a few potential string quoting bugs.
+
 2019-06-27  Andreas J. Guelzow <aguelzow pyrshep ca>
 
     * openoffice-read.c (oo_format_text_append): new, use unless we are dealing with dates or times.
diff --git a/plugins/openoffice/openoffice-read.c b/plugins/openoffice/openoffice-read.c
index 5ba89c075..2942b50b3 100644
--- a/plugins/openoffice/openoffice-read.c
+++ b/plugins/openoffice/openoffice-read.c
@@ -5168,7 +5168,7 @@ odf_embedded_text_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
 }
 
 static void
-odf_date_text_start (GsfXMLIn *xin, G_GNUC_UNUSED xmlChar const **attrs)
+odf_format_text_start (GsfXMLIn *xin, G_GNUC_UNUSED xmlChar const **attrs)
 {
        OOParseState *state = (OOParseState *)xin->user_state;
        state->cur_format.offset = 0;
@@ -5176,7 +5176,7 @@ odf_date_text_start (GsfXMLIn *xin, G_GNUC_UNUSED xmlChar const **attrs)
 }
 
 static void
-oo_date_text_append_quoted (OOParseState *state, char const *cnt, int cnt_len)
+oo_format_text_append_quoted (OOParseState *state, char const *cnt, int cnt_len)
 {
        if (!state->cur_format.string_opened)
                g_string_append_c (state->cur_format.accum, '"');
@@ -5185,60 +5185,64 @@ oo_date_text_append_quoted (OOParseState *state, char const *cnt, int cnt_len)
 }
 
 static void
-oo_date_text_append_unquoted (OOParseState *state, char cnt)
+oo_format_text_append_unquoted (OOParseState *state, char const *cnt, int cnt_len)
 {
        if (state->cur_format.string_opened)
                g_string_append_c (state->cur_format.accum, '"');
        state->cur_format.string_opened = FALSE;
-       g_string_append_c (state->cur_format.accum, cnt);
+       g_string_append_len (state->cur_format.accum, cnt, cnt_len);
 }
 
-static void
-oo_date_text_append (OOParseState *state, char const *cnt, int cnt_len)
-{
-       if (cnt_len > 0) {
-               if (NULL != strchr (" /-(),:",*cnt)) {
-                       oo_date_text_append_unquoted (state, *cnt);
-                       oo_date_text_append (state, cnt + 1, cnt_len - 1);
-                       return;
-               } else if (state->cur_format.percentage && *cnt == '%') {
-                       oo_date_text_append_unquoted  (state, '%');
-                       state->cur_format.percent_sign_seen = TRUE;
-                       oo_date_text_append (state, cnt + 1, cnt_len - 1);
-                       return;
-               } else if (*cnt == '"') {
-                       oo_date_text_append_unquoted  (state, '\\');
-                       oo_date_text_append_unquoted  (state, '"');
-                       oo_date_text_append (state, cnt + 1, cnt_len - 1);
-                       return;
-               } else {
-                       oo_date_text_append_quoted (state, cnt, 1);
-                       oo_date_text_append (state, cnt + 1, cnt_len - 1);
-               }
+// 0: must not; 1: must; -1: don't care; -2: escape outside quote
+static int
+xl_format_quoting_needs (char c, GOFormatFamily fam)
+{
+       gboolean numeric = (fam != GO_FORMAT_DATE &&
+                           fam != GO_FORMAT_TIME &&
+                           fam != GO_FORMAT_TEXT);
+
+       switch (c) {
+       case '$': case '+': case '(': case ')':
+       case ':': case '^': case '\'': case '=':
+       case '{': case '}': case '<': case '>':
+       case '-': case '!': case '&': case '~':
+       case ' ':
+               return -1;
+       case '"':
+               return -2;
+       default:
+               return 1;
+
+       case '/': case ',':
+               return numeric ? 1 : -1;
+       case '%':
+               return fam == GO_FORMAT_PERCENTAGE ? 0 : 1;
        }
 }
 
 static void
-oo_format_text_append (OOParseState *state, char const *cnt, int cnt_len)
+oo_format_text_append (OOParseState *state, char const *cnt, int cnt_len,
+                      GOFormatFamily fam)
 {
-       if (cnt_len > 0) {
-               if (NULL != strchr (" -(),:",*cnt)) {
-                       oo_date_text_append_unquoted (state, *cnt);
-                       oo_format_text_append (state, cnt + 1, cnt_len - 1);
-                       return;
-               } else if (state->cur_format.percentage && *cnt == '%') {
-                       oo_date_text_append_unquoted  (state, '%');
+       for (; cnt_len > 0; cnt++, cnt_len--) {
+               if (fam == GO_FORMAT_PERCENTAGE && *cnt == '%')
                        state->cur_format.percent_sign_seen = TRUE;
-                       oo_format_text_append (state, cnt + 1, cnt_len - 1);
-                       return;
-               } else if (*cnt == '"') {
-                       oo_date_text_append_unquoted  (state, '\\');
-                       oo_date_text_append_unquoted  (state, '"');
-                       oo_format_text_append (state, cnt + 1, cnt_len - 1);
-                       return;
-               } else {
-                       oo_date_text_append_quoted (state, cnt, 1);
-                       oo_format_text_append (state, cnt + 1, cnt_len - 1);
+
+               switch (xl_format_quoting_needs (*cnt, fam)) {
+               case 0:
+                       oo_format_text_append_unquoted (state, cnt, 1);
+                       break;
+               case 1:
+                       oo_format_text_append_quoted (state, cnt, 1);
+                       break;
+               case -2:
+                       oo_format_text_append_unquoted  (state, "\\", 1);
+                       // Fall through
+               case -1:
+                       g_string_append_c (state->cur_format.accum, *cnt);
+                       break;
+               default:
+                       g_assert_not_reached ();
                }
        }
 }
@@ -5247,37 +5251,17 @@ static void
 oo_format_text_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
 {
        OOParseState *state = (OOParseState *)xin->user_state;
+       GOFormatFamily fam = xin->node->user_data.v_int;
 
        if (state->cur_format.accum == NULL)
                return;
 
        if (xin->content->len > state->cur_format.offset)
                oo_format_text_append (state, xin->content->str + state->cur_format.offset,
-                                    xin->content->len - state->cur_format.offset);
-
-       if (state->cur_format.string_opened) {
-               g_string_append_c (state->cur_format.accum, '"');
-               state->cur_format.string_opened = FALSE;
-       }
-       state->cur_format.offset = 0;
-}
-
-static void
-oo_date_text_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
-{
-       OOParseState *state = (OOParseState *)xin->user_state;
-
-       if (state->cur_format.accum == NULL)
-               return;
+                                      xin->content->len - state->cur_format.offset,
+                                      fam);
 
-       if (xin->content->len > state->cur_format.offset)
-               oo_date_text_append (state, xin->content->str + state->cur_format.offset,
-                                    xin->content->len - state->cur_format.offset);
-
-       if (state->cur_format.string_opened) {
-               g_string_append_c (state->cur_format.accum, '"');
-               state->cur_format.string_opened = FALSE;
-       }
+       oo_format_text_append_unquoted  (state, "", 0); // Close quoting
        state->cur_format.offset = 0;
 }
 
@@ -5550,10 +5534,10 @@ odf_currency_symbol_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
        if (state->cur_format.accum == NULL)
                return;
        if (0 == strcmp (xin->content->str, "$")) {
-               g_string_append_c (state->cur_format.accum, '$');
+               oo_format_text_append_unquoted (state, "$", 1);
                return;
        }
-       g_string_append (state->cur_format.accum, "[$");
+       oo_format_text_append_unquoted (state, "[$", 2);
        go_string_append_gstring (state->cur_format.accum, xin->content);
        g_string_append_c (state->cur_format.accum, ']');
 }
@@ -5589,12 +5573,13 @@ odf_format_invisible_text (GsfXMLIn *xin, xmlChar const **attrs)
        char const *cnt = xin->content->str + state->cur_format.offset;
        int cnt_len = xin->content->len - state->cur_format.offset;
        char const *text = NULL;
+       GOFormatFamily fam = xin->node->user_data.v_int;
 
        if (cnt_len == 1) {
                state->cur_format.offset += 1;
 
        } else if (cnt_len > 1) {
-               oo_date_text_append (state, cnt, cnt_len - 1);
+               oo_format_text_append (state, cnt, cnt_len - 1, fam);
                state->cur_format.offset += cnt_len;
        }
 
@@ -5603,11 +5588,7 @@ odf_format_invisible_text (GsfXMLIn *xin, xmlChar const **attrs)
                        text = CXML2C (attrs[1]);
 
        if (text != NULL) {
-               if (state->cur_format.string_opened) {
-                       g_string_append_c (state->cur_format.accum, '"');
-                       state->cur_format.string_opened = FALSE;
-               }
-               g_string_append_c (state->cur_format.accum, '_');
+               oo_format_text_append_unquoted  (state, "_", 1);
                g_string_append (state->cur_format.accum, text);
        }
 }
@@ -5618,7 +5599,7 @@ odf_format_repeated_text_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
        OOParseState *state = (OOParseState *)xin->user_state;
 
        /* This really only works for a single character. */
-       g_string_append_c (state->cur_format.accum, '*');
+       oo_format_text_append_unquoted  (state, "*", 1);
        g_string_append (state->cur_format.accum, xin->content->str);
 }
 
@@ -5634,7 +5615,7 @@ odf_number_color (GsfXMLIn *xin, xmlChar const **attrs)
                                GOColor col = GO_COLOR_FROM_RGB (r, g, b);
                                int i = go_format_palette_index_from_color (col);
                                char *color = go_format_palette_name_of_index (i);
-                               g_string_append_c (state->cur_format.accum, '[');
+                               oo_format_text_append_unquoted  (state, "[", 1);
                                g_string_append (state->cur_format.accum, color);
                                g_string_append_c (state->cur_format.accum, ']');
                                g_free (color);
@@ -5739,7 +5720,7 @@ odf_number_style_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
        g_return_if_fail (state->cur_format.accum != NULL);
 
        if (state->cur_format.percentage && !state->cur_format.percent_sign_seen)
-               g_string_append_c (state->cur_format.accum, '%');
+               oo_format_text_append_unquoted (state, "%", 1);
        state->cur_format.percentage = FALSE;
 
        if (state->cur_format.name == NULL) {
@@ -11955,8 +11936,8 @@ GSF_XML_IN_NODE (OFFICE_DOC_STYLES, OFFICE_STYLES, OO_NS_OFFICE, "styles", GSF_X
 #endif
     GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_NUMBER, OO_NS_NUMBER,  "number", GSF_XML_NO_CONTENT, 
&odf_number, NULL),
 GSF_XML_IN_NODE (NUMBER_STYLE_NUMBER, NUMBER_EMBEDDED_TEXT, OO_NS_NUMBER, "embedded-text", GSF_XML_CONTENT, 
&odf_embedded_text_start, &odf_embedded_text_end),
-    GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_TEXT, OO_NS_NUMBER,    "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_format_text_end),
-       GSF_XML_IN_NODE (NUMBER_STYLE_TEXT, FORMAT_TEXT_INVISIBLE, OO_GNUM_NS_EXT, "invisible", 
GSF_XML_NO_CONTENT, &odf_format_invisible_text, NULL),
+    GSF_XML_IN_NODE_FULL (NUMBER_STYLE, NUMBER_STYLE_TEXT, OO_NS_NUMBER,       "text", GSF_XML_CONTENT, 
FALSE, FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_NUMBER),
+       GSF_XML_IN_NODE_FULL (NUMBER_STYLE_TEXT, FORMAT_TEXT_INVISIBLE, OO_GNUM_NS_EXT, "invisible", 
GSF_XML_NO_CONTENT, FALSE, FALSE, &odf_format_invisible_text, NULL, GO_FORMAT_NUMBER),
        GSF_XML_IN_NODE (NUMBER_STYLE_TEXT, FORMAT_TEXT_REPEATED, OO_GNUM_NS_EXT, "repeated", 
GSF_XML_NO_CONTENT, NULL, &odf_format_repeated_text_end),
     GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_FRACTION, OO_NS_NUMBER, "fraction", GSF_XML_NO_CONTENT, 
&odf_fraction, NULL),
     GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_SCI_STYLE_PROP, OO_NS_NUMBER, "scientific-number", 
GSF_XML_NO_CONTENT, &odf_scientific, NULL),
@@ -11978,7 +11959,7 @@ GSF_XML_IN_NODE (NUMBER_STYLE_NUMBER, NUMBER_EMBEDDED_TEXT, OO_NS_NUMBER, "embed
     GSF_XML_IN_NODE (DATE_STYLE, DATE_MINUTES, OO_NS_NUMBER,           "minutes", GSF_XML_NO_CONTENT, 
&oo_date_minutes, NULL),
     GSF_XML_IN_NODE (DATE_STYLE, DATE_SECONDS, OO_NS_NUMBER,           "seconds", GSF_XML_NO_CONTENT, 
&oo_date_seconds, NULL),
     GSF_XML_IN_NODE (DATE_STYLE, DATE_AM_PM, OO_NS_NUMBER,             "am-pm", GSF_XML_NO_CONTENT,    
&oo_date_am_pm, NULL),
-    GSF_XML_IN_NODE (DATE_STYLE, DATE_TEXT, OO_NS_NUMBER,              "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_date_text_end),
+    GSF_XML_IN_NODE_FULL (DATE_STYLE, DATE_TEXT, OO_NS_NUMBER,         "text", GSF_XML_CONTENT, FALSE, 
FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_DATE),
     GSF_XML_IN_NODE (DATE_STYLE, DATE_TEXT_PROP, OO_NS_STYLE,          "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
     GSF_XML_IN_NODE (DATE_STYLE, DATE_MAP, OO_NS_STYLE,                        "map", GSF_XML_NO_CONTENT, 
NULL, NULL),
     GSF_XML_IN_NODE (DATE_STYLE, DATE_FILL_CHARACTER, OO_NS_NUMBER,    "fill-character", GSF_XML_NO_CONTENT, 
NULL, NULL),
@@ -11988,7 +11969,7 @@ GSF_XML_IN_NODE (NUMBER_STYLE_NUMBER, NUMBER_EMBEDDED_TEXT, OO_NS_NUMBER, "embed
     GSF_XML_IN_NODE (TIME_STYLE, TIME_MINUTES, OO_NS_NUMBER,           "minutes", GSF_XML_NO_CONTENT, 
&oo_date_minutes, NULL),
     GSF_XML_IN_NODE (TIME_STYLE, TIME_SECONDS, OO_NS_NUMBER,           "seconds", GSF_XML_NO_CONTENT, 
&oo_date_seconds, NULL),
     GSF_XML_IN_NODE (TIME_STYLE, TIME_AM_PM, OO_NS_NUMBER,             "am-pm", GSF_XML_NO_CONTENT,    
&oo_date_am_pm, NULL),
-    GSF_XML_IN_NODE (TIME_STYLE, TIME_TEXT, OO_NS_NUMBER,              "text", GSF_XML_CONTENT,  
&odf_date_text_start, &oo_date_text_end),
+    GSF_XML_IN_NODE_FULL (TIME_STYLE, TIME_TEXT, OO_NS_NUMBER,         "text", GSF_XML_CONTENT, FALSE, 
FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_TIME),
     GSF_XML_IN_NODE (TIME_STYLE, TIME_TEXT_PROP, OO_NS_STYLE,          "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
     GSF_XML_IN_NODE (TIME_STYLE, TIME_MAP, OO_NS_STYLE,                        "map", GSF_XML_NO_CONTENT, 
NULL, NULL),
     GSF_XML_IN_NODE (TIME_STYLE, TIME_FILL_CHARACTER, OO_NS_NUMBER,    "fill-character", GSF_XML_NO_CONTENT, 
NULL, NULL),
@@ -12001,7 +11982,7 @@ GSF_XML_IN_NODE (NUMBER_STYLE_NUMBER, NUMBER_EMBEDDED_TEXT, OO_NS_NUMBER, "embed
     GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_STYLE_PROP, OO_NS_STYLE, "properties", GSF_XML_NO_CONTENT, 
NULL, NULL),
     GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_MAP, OO_NS_STYLE,                "map", GSF_XML_NO_CONTENT, 
&odf_map, NULL),
     GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_SYMBOL, OO_NS_NUMBER,    "currency-symbol", GSF_XML_CONTENT, 
NULL, &odf_currency_symbol_end),
-    GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_TEXT, OO_NS_NUMBER,      "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_format_text_end),
+    GSF_XML_IN_NODE_FULL (STYLE_CURRENCY, CURRENCY_TEXT, OO_NS_NUMBER, "text", GSF_XML_CONTENT, FALSE, 
FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_CURRENCY),
       GSF_XML_IN_NODE (CURRENCY_TEXT, FORMAT_TEXT_INVISIBLE, OO_GNUM_NS_EXT, "invisible", GSF_XML_2ND, NULL, 
NULL),
       GSF_XML_IN_NODE (CURRENCY_TEXT, FORMAT_TEXT_REPEATED, OO_GNUM_NS_EXT, "repeated", GSF_XML_2ND, NULL, 
NULL),
     GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_TEXT_PROP, OO_NS_STYLE,  "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
@@ -12009,14 +11990,14 @@ GSF_XML_IN_NODE (NUMBER_STYLE_NUMBER, NUMBER_EMBEDDED_TEXT, OO_NS_NUMBER, "embed
 
   GSF_XML_IN_NODE (OFFICE_STYLES, STYLE_PERCENTAGE, OO_NS_NUMBER, "percentage-style", GSF_XML_NO_CONTENT, 
&odf_number_percentage_style, &odf_number_style_end),
     GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_STYLE_PROP, OO_NS_NUMBER,    "number", GSF_XML_NO_CONTENT, 
&odf_number, NULL),
-    GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_TEXT, OO_NS_NUMBER,          "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_format_text_end),
+    GSF_XML_IN_NODE_FULL (STYLE_PERCENTAGE, PERCENTAGE_TEXT, OO_NS_NUMBER,             "text", 
GSF_XML_CONTENT, FALSE, FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_PERCENTAGE),
     GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_MAP, OO_NS_STYLE,            "map", GSF_XML_NO_CONTENT, 
&odf_map, NULL),
     GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_TEXT_PROP, OO_NS_STYLE,      "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
     GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_FILL_CHARACTER, OO_NS_NUMBER,        "fill-character", 
GSF_XML_NO_CONTENT, NULL, NULL),
 
   GSF_XML_IN_NODE (OFFICE_STYLES, STYLE_TEXT, OO_NS_NUMBER, "text-style", GSF_XML_NO_CONTENT, 
&odf_number_style, &odf_number_style_end),
     GSF_XML_IN_NODE (STYLE_TEXT, STYLE_TEXT_CONTENT, OO_NS_NUMBER,     "text-content", GSF_XML_NO_CONTENT,  
&odf_text_content, NULL),
-    GSF_XML_IN_NODE (STYLE_TEXT, STYLE_TEXT_PROP, OO_NS_NUMBER,                "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_format_text_end),
+GSF_XML_IN_NODE_FULL (STYLE_TEXT, STYLE_TEXT_PROP, OO_NS_NUMBER,       "text", GSF_XML_CONTENT, FALSE, 
FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_TEXT),
       GSF_XML_IN_NODE (STYLE_TEXT_PROP, FORMAT_TEXT_INVISIBLE, OO_GNUM_NS_EXT, "invisible", GSF_XML_2ND, 
NULL, NULL),
     GSF_XML_IN_NODE (STYLE_TEXT, STYLE_TEXT_MAP, OO_NS_STYLE,          "map", GSF_XML_NO_CONTENT, &odf_map, 
NULL),
     GSF_XML_IN_NODE (STYLE_TEXT, STYLE_TEXT_TEXT_PROP, OO_NS_STYLE,    "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
@@ -12128,7 +12109,7 @@ GSF_XML_IN_NODE (OFFICE_STYLES, PAGE_MASTER, OO_NS_STYLE, "page-master", GSF_XML
       GSF_XML_IN_NODE (DATE_STYLE, DATE_MINUTES, OO_NS_NUMBER,         "minutes", GSF_XML_NO_CONTENT, 
&oo_date_minutes, NULL),
       GSF_XML_IN_NODE (DATE_STYLE, DATE_SECONDS, OO_NS_NUMBER,         "seconds", GSF_XML_NO_CONTENT, 
&oo_date_seconds, NULL),
       GSF_XML_IN_NODE (DATE_STYLE, DATE_AM_PM, OO_NS_NUMBER,           "am-pm", GSF_XML_NO_CONTENT,    
&oo_date_am_pm, NULL),
-      GSF_XML_IN_NODE (DATE_STYLE, DATE_TEXT, OO_NS_NUMBER,            "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_date_text_end),
+      GSF_XML_IN_NODE_FULL (DATE_STYLE, DATE_TEXT, OO_NS_NUMBER,               "text", GSF_XML_CONTENT, 
FALSE, FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_DATE),
       GSF_XML_IN_NODE (DATE_STYLE, DATE_TEXT_PROP, OO_NS_STYLE,                "text-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
       GSF_XML_IN_NODE (DATE_STYLE, DATE_MAP, OO_NS_STYLE,              "map", GSF_XML_NO_CONTENT, NULL, 
NULL),
       GSF_XML_IN_NODE (DATE_STYLE, DATE_FILL_CHARACTER, OO_NS_NUMBER, "fill-character", GSF_XML_NO_CONTENT, 
NULL, NULL),
@@ -12138,7 +12119,7 @@ GSF_XML_IN_NODE (OFFICE_STYLES, PAGE_MASTER, OO_NS_STYLE, "page-master", GSF_XML
       GSF_XML_IN_NODE (TIME_STYLE, TIME_MINUTES, OO_NS_NUMBER,         "minutes", GSF_XML_NO_CONTENT, 
&oo_date_minutes, NULL),
       GSF_XML_IN_NODE (TIME_STYLE, TIME_SECONDS, OO_NS_NUMBER,         "seconds", GSF_XML_NO_CONTENT, 
&oo_date_seconds, NULL),
       GSF_XML_IN_NODE (TIME_STYLE, TIME_AM_PM, OO_NS_NUMBER,           "am-pm", GSF_XML_NO_CONTENT,    
&oo_date_am_pm, NULL),
-      GSF_XML_IN_NODE (TIME_STYLE, TIME_TEXT, OO_NS_NUMBER,            "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_date_text_end),
+      GSF_XML_IN_NODE_FULL (TIME_STYLE, TIME_TEXT, OO_NS_NUMBER,               "text", GSF_XML_CONTENT, 
FALSE, FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_TIME),
       GSF_XML_IN_NODE (TIME_STYLE, TIME_TEXT_PROP, OO_NS_STYLE,                "text-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
       GSF_XML_IN_NODE (TIME_STYLE, TIME_MAP, OO_NS_STYLE,              "map", GSF_XML_NO_CONTENT, NULL, 
NULL),
       GSF_XML_IN_NODE (TIME_STYLE, TIME_FILL_CHARACTER, OO_NS_NUMBER, "fill-character", GSF_XML_NO_CONTENT, 
NULL, NULL),
@@ -12253,7 +12234,7 @@ static GsfXMLInNode const opendoc_content_dtd [] =
 #endif
              GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_NUMBER, OO_NS_NUMBER,   "number", 
GSF_XML_NO_CONTENT, &odf_number, NULL),
                  GSF_XML_IN_NODE (NUMBER_STYLE_NUMBER, NUMBER_EMBEDDED_TEXT, OO_NS_NUMBER, "embedded-text", 
GSF_XML_NO_CONTENT, NULL, NULL),
-             GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_TEXT, OO_NS_NUMBER,     "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_format_text_end),
+       GSF_XML_IN_NODE_FULL (NUMBER_STYLE, NUMBER_STYLE_TEXT, OO_NS_NUMBER,  "text", GSF_XML_CONTENT, FALSE, 
FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_NUMBER),
              GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_FRACTION, OO_NS_NUMBER, "fraction", 
GSF_XML_NO_CONTENT,  &odf_fraction, NULL),
              GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_SCI_STYLE_PROP, OO_NS_NUMBER, "scientific-number", 
GSF_XML_NO_CONTENT, &odf_scientific, NULL),
              GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_MAP, OO_NS_STYLE,             "map", GSF_XML_NO_CONTENT, 
&odf_map, NULL),
@@ -12271,7 +12252,7 @@ static GsfXMLInNode const opendoc_content_dtd [] =
              GSF_XML_IN_NODE (DATE_STYLE, DATE_MINUTES, OO_NS_NUMBER,          "minutes", 
GSF_XML_NO_CONTENT, &oo_date_minutes, NULL),
              GSF_XML_IN_NODE (DATE_STYLE, DATE_SECONDS, OO_NS_NUMBER,          "seconds", 
GSF_XML_NO_CONTENT, &oo_date_seconds, NULL),
              GSF_XML_IN_NODE (DATE_STYLE, DATE_AM_PM, OO_NS_NUMBER,            "am-pm", GSF_XML_NO_CONTENT,  
  &oo_date_am_pm, NULL),
-             GSF_XML_IN_NODE (DATE_STYLE, DATE_TEXT, OO_NS_NUMBER,             "text", GSF_XML_CONTENT,  
&odf_date_text_start, &oo_date_text_end),
+              GSF_XML_IN_NODE_FULL (DATE_STYLE, DATE_TEXT, OO_NS_NUMBER, "text", GSF_XML_CONTENT, FALSE, 
FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_DATE),
              GSF_XML_IN_NODE (DATE_STYLE, DATE_TEXT_PROP, OO_NS_STYLE,         "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
              GSF_XML_IN_NODE (DATE_STYLE, DATE_MAP, OO_NS_STYLE,               "map", GSF_XML_NO_CONTENT, 
NULL, NULL),
               GSF_XML_IN_NODE (DATE_STYLE, DATE_FILL_CHARACTER, OO_NS_NUMBER, "fill-character", 
GSF_XML_NO_CONTENT, NULL, NULL),
@@ -12280,7 +12261,7 @@ static GsfXMLInNode const opendoc_content_dtd [] =
              GSF_XML_IN_NODE (TIME_STYLE, TIME_MINUTES, OO_NS_NUMBER,  "minutes", GSF_XML_NO_CONTENT, 
&oo_date_minutes, NULL),
              GSF_XML_IN_NODE (TIME_STYLE, TIME_SECONDS, OO_NS_NUMBER,  "seconds", GSF_XML_NO_CONTENT, 
&oo_date_seconds, NULL),
              GSF_XML_IN_NODE (TIME_STYLE, TIME_AM_PM, OO_NS_NUMBER,    "am-pm", GSF_XML_NO_CONTENT,    
&oo_date_am_pm, NULL),
-             GSF_XML_IN_NODE (TIME_STYLE, TIME_TEXT, OO_NS_NUMBER,     "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_date_text_end),
+             GSF_XML_IN_NODE_FULL (TIME_STYLE, TIME_TEXT, OO_NS_NUMBER, "text", GSF_XML_CONTENT, FALSE, 
FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_TIME),
              GSF_XML_IN_NODE (TIME_STYLE, TIME_TEXT_PROP, OO_NS_STYLE, "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
              GSF_XML_IN_NODE (TIME_STYLE, TIME_MAP, OO_NS_STYLE,       "map", GSF_XML_NO_CONTENT, NULL, 
NULL),
               GSF_XML_IN_NODE (TIME_STYLE, TIME_FILL_CHARACTER, OO_NS_NUMBER, "fill-character", 
GSF_XML_NO_CONTENT, NULL, NULL),
@@ -12291,12 +12272,12 @@ static GsfXMLInNode const opendoc_content_dtd [] =
              GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_STYLE_PROP, OO_NS_STYLE,"properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
              GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_MAP, OO_NS_STYLE,       "map", GSF_XML_NO_CONTENT, 
&odf_map, NULL),
              GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_SYMBOL, OO_NS_NUMBER,   "currency-symbol", 
GSF_XML_CONTENT, NULL, &odf_currency_symbol_end),
-             GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_TEXT, OO_NS_NUMBER,     "text", GSF_XML_CONTENT, 
&odf_date_text_start, &oo_format_text_end),
+       GSF_XML_IN_NODE_FULL (STYLE_CURRENCY, CURRENCY_TEXT, OO_NS_NUMBER,"text", GSF_XML_CONTENT, FALSE, 
FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_CURRENCY),
              GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_TEXT_PROP, OO_NS_STYLE, "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
               GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_FILL_CHARACTER, OO_NS_NUMBER, "fill-character", 
GSF_XML_NO_CONTENT, NULL, NULL),
            GSF_XML_IN_NODE (OFFICE_STYLES, STYLE_PERCENTAGE, OO_NS_NUMBER, "percentage-style", 
GSF_XML_NO_CONTENT, &odf_number_percentage_style, &odf_number_style_end),
              GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_STYLE_PROP, OO_NS_NUMBER,   "number", 
GSF_XML_NO_CONTENT, &odf_number, NULL),
-             GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_TEXT, OO_NS_NUMBER,         "text", 
GSF_XML_CONTENT, &odf_date_text_start, &oo_format_text_end),
+       GSF_XML_IN_NODE_FULL (STYLE_PERCENTAGE, PERCENTAGE_TEXT, OO_NS_NUMBER,  "text", GSF_XML_CONTENT, 
FALSE, FALSE, &odf_format_text_start, &oo_format_text_end, GO_FORMAT_PERCENTAGE),
              GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_MAP, OO_NS_STYLE,           "map", 
GSF_XML_NO_CONTENT, &odf_map, NULL),
              GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_TEXT_PROP, OO_NS_STYLE,     "text-properties", 
GSF_XML_NO_CONTENT, &odf_number_color, NULL),
               GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_FILL_CHARACTER, OO_NS_NUMBER, "fill-character", 
GSF_XML_NO_CONTENT, NULL, NULL),


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