1 /* Handling strings that are given partially in the source encoding and
2 partially in Unicode.
3 Copyright (C) 2001-2018 Free Software Foundation, Inc.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17
18 #ifndef _XGETTEXT_MIXED_STRING_H
19 #define _XGETTEXT_MIXED_STRING_H
20
21 #include <stdbool.h>
22 #include <stddef.h>
23
24 #include "xg-encoding.h"
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30
31 /* A string that contains segments in the xgettext_current_source_encoding
32 and segments in UTF-8, in an alternating way. */
33
34 enum segment_type
35 {
36 source_encoded,
37 utf8_encoded
38 };
39
40 struct mixed_string_segment
41 {
42 /*enum segment_type*/ unsigned char type;
43 size_t length;
44 char contents[FLEXIBLE_ARRAY_MEMBER];
45 };
46
47 typedef struct mixed_string mixed_string_ty;
48 struct mixed_string
49 {
50 /* The alternating segments. */
51 struct mixed_string_segment **segments;
52 size_t nsegments;
53 /* The lexical context. Used only for error message purposes. */
54 lexical_context_ty lcontext;
55 const char *logical_file_name;
56 int line_number;
57 };
58
59 /* Creates a mixed_string that contains just a string in the
60 xgettext_current_source_encoding. */
61 extern mixed_string_ty *
62 mixed_string_alloc_simple (const char *string,
63 lexical_context_ty lcontext,
64 const char *logical_file_name,
65 int line_number);
66
67 /* Creates a mixed_string that contains just a UTF-8 string. */
68 extern mixed_string_ty *
69 mixed_string_alloc_utf8 (const char *string,
70 lexical_context_ty lcontext,
71 const char *logical_file_name,
72 int line_number);
73
74 /* Creates a copy of a mixed_string. */
75 extern mixed_string_ty *
76 mixed_string_clone (const mixed_string_ty *ms1);
77
78 /* Returns the contents of a mixed_string as an UTF-8 encoded string.
79 This may provoke an error if no source encoding has been specified
80 through --from-code. The result is freshly allocated. */
81 extern char *
82 mixed_string_contents (const mixed_string_ty *ms);
83
84 /* Frees a mixed_string. */
85 extern void
86 mixed_string_free (mixed_string_ty *ms);
87
88 /* Returns the contents of a mixed_string as an UTF-8 encoded string,
89 and frees the argument. */
90 extern char *
91 mixed_string_contents_free1 (mixed_string_ty *ms);
92
93 /* Concatenates two mixed_strings. */
94 extern mixed_string_ty *
95 mixed_string_concat (const mixed_string_ty *ms1,
96 const mixed_string_ty *ms2);
97 /* Concatenates two mixed_strings, and frees the first argument. */
98 extern mixed_string_ty *
99 mixed_string_concat_free1 (mixed_string_ty *ms1,
100 const mixed_string_ty *ms2);
101
102
103 /* A string buffer type that allows appending bytes (in the
104 xgettext_current_source_encoding) or Unicode characters.
105 When done, it returns the entire string as a mixed_string. */
106
107 struct mixed_string_buffer
108 {
109 /* The alternating segments that are already finished. */
110 struct mixed_string_segment **segments;
111 size_t nsegments;
112 size_t nsegments_allocated;
113 /* The segment that is being accumulated. */
114 int curr_type; /* An enum segment_type, or -1. */
115 char *curr_buffer;
116 size_t curr_buflen;
117 size_t curr_allocated;
118 /* The first half of an UTF-16 surrogate character. */
119 unsigned short utf16_surr;
120 /* The lexical context. Used only for error message purposes. */
121 lexical_context_ty lcontext;
122 const char *logical_file_name;
123 int line_number;
124 };
125
126 /* Initializes a mixed_string_buffer. */
127 extern void
128 mixed_string_buffer_init (struct mixed_string_buffer *bp,
129 lexical_context_ty lcontext,
130 const char *logical_file_name,
131 int line_number);
132
133 /* Determines whether a mixed_string_buffer is still empty. */
134 extern bool
135 mixed_string_buffer_is_empty (const struct mixed_string_buffer *bp);
136
137 /* Appends a character to a mixed_string_buffer. */
138 extern void
139 mixed_string_buffer_append_char (struct mixed_string_buffer *bp, int c);
140
141 /* Appends a Unicode character to a mixed_string_buffer. */
142 extern void
143 mixed_string_buffer_append_unicode (struct mixed_string_buffer *bp,
144 int c);
145
146 /* Frees the memory pointed to by a 'struct mixed_string_buffer' and
147 discards the accumulated string. */
148 extern void
149 mixed_string_buffer_destroy (struct mixed_string_buffer *bp);
150
151 /* Frees the memory pointed to by a 'struct mixed_string_buffer'
152 and returns the accumulated string. */
153 extern mixed_string_ty *
154 mixed_string_buffer_result (struct mixed_string_buffer *bp);
155
156
157 #ifdef __cplusplus
158 }
159 #endif
160
161
162 #endif /* _XGETTEXT_MIXED_STRING_H */