summaryrefslogtreecommitdiffstats
path: root/src/message.h
blob: 74fa4a7e6cedcd9c8508063d5f3d19d27170bc6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
/* GNU gettext - internationalization aids
   Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc.

   This file was written by Peter Miller <millerp@canb.auug.org.au>

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free SoftwareFoundation,
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#ifndef _MESSAGE_H
#define _MESSAGE_H

#include "str-list.h"
#include "pos.h"
#include "hash.h"

#include <stdbool.h>

/* According to Sun's Uniforum proposal the default message domain is
   named 'messages'.  */
#define MESSAGE_DOMAIN_DEFAULT "messages"


/* Kinds of format strings.  */
enum format_type
{
  format_c,
  format_python,
  format_lisp,
  format_elisp,
  format_librep,
  format_smalltalk,
  format_java,
  format_awk,
  format_pascal,
  format_ycp
};
#define NFORMATS 10	/* Number of format_type enum values.  */
extern const char *const format_language[NFORMATS];
extern const char *const format_language_pretty[NFORMATS];

/* Is current msgid a format string?  */
enum is_format
{
  undecided,
  yes,
  no,
  possible,
  impossible
};

extern bool
       possible_format_p PARAMS ((enum is_format));


/* Is current msgid wrappable?  */
#if 0
enum is_wrap
{
  undecided,
  yes,
  no
};
#else /* HACK - C's enum concept is so stupid */
#define is_wrap is_format
#endif


typedef struct message_ty message_ty;
struct message_ty
{
  /* The msgid string.  */
  const char *msgid;

  /* The msgid's plural, if present.  */
  const char *msgid_plural;

  /* The msgstr strings.  */
  const char *msgstr;
  /* The number of bytes in msgstr, including the terminating NUL.  */
  size_t msgstr_len;

  /* Position in the source PO file.  */
  lex_pos_ty pos;

  /* Plain comments (#) appearing before the message.  */
  string_list_ty *comment;

  /* Extracted comments (#.) appearing before the message.  */
  string_list_ty *comment_dot;

  /* File position comments (#:) appearing before the message, one for
     each unique file position instance, sorted by file name and then
     by line.  */
  size_t filepos_count;
  lex_pos_ty *filepos;

  /* Informations from special comments (e.g. generated by msgmerge).  */
  bool is_fuzzy;
  enum is_format is_format[NFORMATS];

  /* Do we want the string to be wrapped in the emitted PO file?  */
  enum is_wrap do_wrap;

  /* If set the message is obsolete and while writing out it should be
     commented out.  */
  bool obsolete;

  /* Used for checking that messages have been used, in the msgcmp,
     msgmerge, msgcomm and msgcat programs.  */
  int used;

  /* Used for looking up the target message, in the msgcat program.  */
  message_ty *tmp;

  /* Used for combining alternative translations, in the msgcat program.  */
  int alternative_count;
  struct altstr
    {
      const char *msgstr;
      size_t msgstr_len;
      const char *msgstr_end;
      string_list_ty *comment;
      string_list_ty *comment_dot;
      char *id;
    }
    *alternative;
};

extern message_ty *
       message_alloc PARAMS ((const char *msgid, const char *msgid_plural,
			      const char *msgstr, size_t msgstr_len,
			      const lex_pos_ty *pp));
extern void
       message_free PARAMS ((message_ty *mp));
extern void
       message_comment_append PARAMS ((message_ty *mp, const char *comment));
extern void
       message_comment_dot_append PARAMS ((message_ty *mp,
					   const char *comment));
extern void
       message_comment_filepos PARAMS ((message_ty *mp,
					const char *name, size_t line));
extern message_ty *
       message_copy PARAMS ((message_ty *mp));


typedef struct message_list_ty message_list_ty;
struct message_list_ty
{
  message_ty **item;
  size_t nitems;
  size_t nitems_max;
  bool use_hashtable;
  hash_table htable;	/* Table mapping msgid to 'message_ty *'.  */
};

/* Create a fresh message list.
   If USE_HASHTABLE is true, a hash table will be used to speed up
   message_list_search().  USE_HASHTABLE can only be set to true if it is
   known that the message list will not contain duplicate msgids.  */
extern message_list_ty *
       message_list_alloc PARAMS ((bool use_hashtable));
extern void
       message_list_free PARAMS ((message_list_ty *mlp));
extern void
       message_list_append PARAMS ((message_list_ty *mlp, message_ty *mp));
extern void
       message_list_prepend PARAMS ((message_list_ty *mlp, message_ty *mp));
extern void
       message_list_delete_nth PARAMS ((message_list_ty *mlp, size_t n));
typedef bool message_predicate_ty PARAMS ((const message_ty *mp));
extern void
       message_list_remove_if_not PARAMS ((message_list_ty *mlp,
					   message_predicate_ty *predicate));
extern message_ty *
       message_list_search PARAMS ((message_list_ty *mlp, const char *msgid));
extern message_ty *
       message_list_search_fuzzy PARAMS ((message_list_ty *mlp,
					  const char *msgid));


typedef struct message_list_list_ty message_list_list_ty;
struct message_list_list_ty
{
  message_list_ty **item;
  size_t nitems;
  size_t nitems_max;
};

extern message_list_list_ty *
       message_list_list_alloc PARAMS ((void));
extern void
       message_list_list_free PARAMS ((message_list_list_ty *mllp));
extern void
       message_list_list_append PARAMS ((message_list_list_ty *mllp,
					 message_list_ty *mlp));
extern void
       message_list_list_append_list PARAMS ((message_list_list_ty *mllp,
					      message_list_list_ty *mllp2));
extern message_ty *
       message_list_list_search PARAMS ((message_list_list_ty *mllp,
					 const char *msgid));
extern message_ty *
       message_list_list_search_fuzzy PARAMS ((message_list_list_ty *mllp,
					       const char *msgid));


typedef struct msgdomain_ty msgdomain_ty;
struct msgdomain_ty
{
  const char *domain;
  message_list_ty *messages;
};

extern msgdomain_ty *
       msgdomain_alloc PARAMS ((const char *domain, bool use_hashtable));
extern void
       msgdomain_free PARAMS ((msgdomain_ty *mdp));


typedef struct msgdomain_list_ty msgdomain_list_ty;
struct msgdomain_list_ty
{
  msgdomain_ty **item;
  size_t nitems;
  size_t nitems_max;
  bool use_hashtable;
};

extern msgdomain_list_ty *
       msgdomain_list_alloc PARAMS ((bool use_hashtable));
extern void
       msgdomain_list_free PARAMS ((msgdomain_list_ty *mdlp));
extern void
       msgdomain_list_append PARAMS ((msgdomain_list_ty *mdlp,
				      msgdomain_ty *mdp));
extern void
       msgdomain_list_append_list PARAMS ((msgdomain_list_ty *mdlp,
					   msgdomain_list_ty *mdlp2));
extern message_list_ty *
       msgdomain_list_sublist PARAMS ((msgdomain_list_ty *mdlp,
				       const char *domain, bool create));
extern message_ty *
       msgdomain_list_search PARAMS ((msgdomain_list_ty *mdlp,
				      const char *msgid));
extern message_ty *
       msgdomain_list_search_fuzzy PARAMS ((msgdomain_list_ty *mdlp,
					    const char *msgid));


#endif /* message.h */