From 3769eb40d6487b21f9900d95e9d2edda524c9d8f Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 15 Oct 2024 15:42:46 +0200 Subject: [PATCH] Refactor. * gettext-tools/src/msgl-header.h (header_set_charset): New declaration. * gettext-tools/src/msgl-header.c (header_set_charset): New function. * gettext-tools/src/msgl-iconv.c: Include msgl-header.h. (iconv_message_list_internal): Use header_set_charset. * gettext-tools/src/x-po.c: Include msgl-header.h. (extract): Use header_set_charset. * gettext-tools/src/FILES: Update. --- gettext-tools/src/FILES | 8 ++++---- gettext-tools/src/msgl-header.c | 24 +++++++++++++++++++++++- gettext-tools/src/msgl-header.h | 10 +++++++++- gettext-tools/src/msgl-iconv.c | 17 ++--------------- gettext-tools/src/x-po.c | 16 ++-------------- 5 files changed, 40 insertions(+), 35 deletions(-) diff --git a/gettext-tools/src/FILES b/gettext-tools/src/FILES index 9e696772d..f877e5347 100644 --- a/gettext-tools/src/FILES +++ b/gettext-tools/src/FILES @@ -123,6 +123,10 @@ xerror-handler.c | Reading of a .desktop file, returning a list-of-messages. +-------------- Reading PO files +msgl-header.h +msgl-header.c + Message list header manipulation. + msgl-iconv.h msgl-iconv.c Convert a list-of-messages to another character encoding. @@ -150,10 +154,6 @@ msgl-charset.c | +-------------- The 'msgmerge' program -msgl-header.h -msgl-header.c - Message list header manipulation. - msgcomm.c Main source for the 'msgcomm' program. msgattrib.c Main source for the 'msgattrib' program. msgcat.c Main source for the 'msgcat' program. diff --git a/gettext-tools/src/msgl-header.c b/gettext-tools/src/msgl-header.c index c7eaa21a2..0e3637533 100644 --- a/gettext-tools/src/msgl-header.c +++ b/gettext-tools/src/msgl-header.c @@ -1,5 +1,5 @@ /* Message list header manipulation. - Copyright (C) 2007, 2016-2017 Free Software Foundation, Inc. + Copyright (C) 2007-2024 Free Software Foundation, Inc. Written by Bruno Haible , 2007. This program is free software: you can redistribute it and/or modify @@ -30,6 +30,28 @@ #define SIZEOF(a) (sizeof(a) / sizeof(a[0])) +void +header_set_charset (message_ty *header_mp, const char *charsetstr, + const char *value) +{ + const char *msgstr = header_mp->msgstr; + size_t len, len1, len2, len3; + char *new_msgstr; + + len = strcspn (charsetstr, " \t\n"); + + len1 = charsetstr - msgstr; + len2 = strlen (value); + len3 = (msgstr + strlen (msgstr)) - (charsetstr + len); + new_msgstr = XNMALLOC (len1 + len2 + len3 + 1, char); + memcpy (new_msgstr, msgstr, len1); + memcpy (new_msgstr + len1, value, len2); + memcpy (new_msgstr + len1 + len2, charsetstr + len, len3 + 1); + header_mp->msgstr = new_msgstr; + header_mp->msgstr_len = len1 + len2 + len3 + 1; +} + + /* The known fields in their usual order. */ static const struct { diff --git a/gettext-tools/src/msgl-header.h b/gettext-tools/src/msgl-header.h index 9e50b8bd6..4ca5314b5 100644 --- a/gettext-tools/src/msgl-header.h +++ b/gettext-tools/src/msgl-header.h @@ -1,5 +1,5 @@ /* Message list header manipulation. - Copyright (C) 2007, 2016 Free Software Foundation, Inc. + Copyright (C) 2007-2024 Free Software Foundation, Inc. Written by Bruno Haible , 2007. This program is free software: you can redistribute it and/or modify @@ -26,6 +26,14 @@ extern "C" { #endif +/* Set the 'charset' value in the 'Content-Type:' field to the given value. + HEADER_MP is a message that satisfies the is_header() predicate. + CHARSETSTR is a pointer into its msgstr, right after the "charset=" substring. + VALUE is the new charset value. */ +extern void + header_set_charset (message_ty *header_mp, const char *charsetstr, + const char *value); + /* Set the given field to the given value. The FIELD name ends in a colon. The VALUE will have a space prepended and a newline appended by this diff --git a/gettext-tools/src/msgl-iconv.c b/gettext-tools/src/msgl-iconv.c index 05b09676d..4223c9935 100644 --- a/gettext-tools/src/msgl-iconv.c +++ b/gettext-tools/src/msgl-iconv.c @@ -38,6 +38,7 @@ #include "string-desc.h" #include "message.h" #include "po-charset.h" +#include "msgl-header.h" #include "xstriconv.h" #include "xstriconveh.h" #include "msgl-ascii.h" @@ -289,21 +290,7 @@ iconv_message_list_internal (message_list_ty *mlp, freea (charset); if (update_header) - { - size_t len1, len2, len3; - char *new_header; - - len1 = charsetstr - header; - len2 = strlen (canon_to_code); - len3 = (header + strlen (header)) - (charsetstr + len); - new_header = XNMALLOC (len1 + len2 + len3 + 1, char); - memcpy (new_header, header, len1); - memcpy (new_header + len1, canon_to_code, len2); - memcpy (new_header + len1 + len2, charsetstr + len, - len3 + 1); - mlp->item[j]->msgstr = new_header; - mlp->item[j]->msgstr_len = len1 + len2 + len3 + 1; - } + header_set_charset (mlp->item[j], charsetstr, canon_to_code); } } } diff --git a/gettext-tools/src/x-po.c b/gettext-tools/src/x-po.c index 7ddc052fe..521921583 100644 --- a/gettext-tools/src/x-po.c +++ b/gettext-tools/src/x-po.c @@ -39,6 +39,7 @@ #include "read-po.h" #include "read-properties.h" #include "read-stringtable.h" +#include "msgl-header.h" #include "msgl-iconv.h" #include "msgl-ascii.h" #include "po-charset.h" @@ -188,21 +189,8 @@ extract (FILE *fp, if (charsetstr != NULL) { - size_t len, len1, len2, len3; - char *new_header; - charsetstr += strlen ("charset="); - len = strcspn (charsetstr, " \t\n"); - - len1 = charsetstr - header; - len2 = strlen (header_charset); - len3 = (header + strlen (header)) - (charsetstr + len); - new_header = XNMALLOC (len1 + len2 + len3 + 1, char); - memcpy (new_header, header, len1); - memcpy (new_header + len1, header_charset, len2); - memcpy (new_header + len1 + len2, charsetstr + len, len3 + 1); - mp->msgstr = new_header; - mp->msgstr_len = len1 + len2 + len3 + 1; + header_set_charset (mp, charsetstr, header_charset); } } } -- 2.47.2