Imported Upstream version 0.19.7
[platform/upstream/gettext.git] / gettext-tools / src / msgl-ascii.c
1 /* Message list test for ASCII character set.
2    Copyright (C) 2001-2002, 2005-2006, 2015 Free Software Foundation,
3    Inc.
4    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
5
6    This program is free software: you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18
19
20 #ifdef HAVE_CONFIG_H
21 # include "config.h"
22 #endif
23
24 /* Specification.  */
25 #include "msgl-ascii.h"
26
27 #include "c-ctype.h"
28
29
30 /* This file's structure parallels msgl-iconv.c.  */
31
32
33 bool
34 is_ascii_string (const char *string)
35 {
36   for (; *string; string++)
37     if (!c_isascii ((unsigned char) *string))
38       return false;
39   return true;
40 }
41
42 bool
43 is_ascii_string_list (string_list_ty *slp)
44 {
45   size_t i;
46
47   if (slp != NULL)
48     for (i = 0; i < slp->nitems; i++)
49       if (!is_ascii_string (slp->item[i]))
50         return false;
51   return true;
52 }
53
54 bool
55 is_ascii_message (message_ty *mp)
56 {
57   const char *p = mp->msgstr;
58   const char *p_end = p + mp->msgstr_len;
59
60   for (; p < p_end; p++)
61     if (!c_isascii ((unsigned char) *p))
62       return false;
63
64   if (!is_ascii_string_list (mp->comment))
65     return false;
66   if (!is_ascii_string_list (mp->comment_dot))
67     return false;
68
69   /* msgid and msgid_plural are normally ASCII, so why checking?
70      Because in complete UTF-8 environments they can be UTF-8, not ASCII.  */
71   if (!is_ascii_string (mp->msgid))
72     return false;
73   if (mp->msgid_plural != NULL && !is_ascii_string (mp->msgid_plural))
74     return false;
75
76   /* Likewise for msgctxt.  */
77   if (mp->msgctxt != NULL && !is_ascii_string (mp->msgctxt))
78     return false;
79
80   /* Likewise for the prev_* fields.  */
81   if (mp->prev_msgctxt != NULL && !is_ascii_string (mp->prev_msgctxt))
82     return false;
83   if (mp->prev_msgid != NULL && !is_ascii_string (mp->prev_msgid))
84     return false;
85   if (mp->prev_msgid_plural != NULL && !is_ascii_string (mp->prev_msgid_plural))
86     return false;
87
88   return true;
89 }
90
91 bool
92 is_ascii_message_list (message_list_ty *mlp)
93 {
94   size_t j;
95
96   for (j = 0; j < mlp->nitems; j++)
97     if (!is_ascii_message (mlp->item[j]))
98       return false;
99
100   return true;
101 }
102
103 bool
104 is_ascii_msgdomain_list (msgdomain_list_ty *mdlp)
105 {
106   size_t k;
107
108   for (k = 0; k < mdlp->nitems; k++)
109     if (!is_ascii_message_list (mdlp->item[k]->messages))
110       return false;
111
112   return true;
113 }