summaryrefslogtreecommitdiffstats
path: root/gettext-tools/src/po-lex.h
blob: 185a24c2aabc467769eaed5ab18c752420429da6 (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
/* GNU gettext - internationalization aids
   Copyright (C) 1995-1998, 2000-2005 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 Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */

#ifndef _PO_LEX_H
#define _PO_LEX_H

#include <sys/types.h>
#include <stdio.h>
#include <stdbool.h>
#include "error.h"
#include "error-progname.h"
#include "xerror.h"
#include "po-error.h"
#include "pos.h"


#ifdef __cplusplus
extern "C" {
#endif


/* Lexical analyzer for reading PO files.  */


/* Global variables from po-lex.c.  */

/* Current position within the PO file.  */
extern DLL_VARIABLE lex_pos_ty gram_pos;
extern DLL_VARIABLE int gram_pos_column;

/* Number of parse errors within a PO file that cause the program to
   terminate.  Cf. error_message_count, declared in <error.h>.  */
extern DLL_VARIABLE unsigned int gram_max_allowed_errors;

/* True if obsolete entries shall be considered as valid.  */
extern DLL_VARIABLE bool pass_obsolete_entries;


/* Prepare lexical analysis.  */
extern void lex_start (FILE *fp, const char *real_filename,
		       const char *logical_filename);

/* Terminate lexical analysis.  */
extern void lex_end (void);

/* Return the next token in the PO file.  The return codes are defined
   in "po-gram-gen2.h".  Associated data is put in 'po_gram_lval.  */
extern int po_gram_lex (void);

/* po_gram_lex() can return comments as COMMENT.  Switch this on or off.  */
extern void po_lex_pass_comments (bool flag);

/* po_gram_lex() can return obsolete entries as if they were normal entries.
   Switch this on or off.  */
extern void po_lex_pass_obsolete_entries (bool flag);


/* ISO C 99 is smart enough to allow optimizations like this.
   Note: OpenVMS 7.3 cc pretends to support ISO C 99 but chokes on '...'.  */
#if __STDC__ && (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __DECC)

/* CAUTION: If you change this macro, you must also make identical
   changes to the function of the same name in src/po-lex.c  */

# define po_gram_error(fmt, ...)					    \
  do {									    \
    char *totalfmt = xasprintf ("%s%s", "%s:%lu:%d: ", fmt);		    \
    error_with_progname = false;					    \
    po_error (0, 0, totalfmt, gram_pos.file_name,			    \
	      (unsigned long) gram_pos.line_number, gram_pos_column + 1,    \
	      __VA_ARGS__ + 0);						    \
    error_with_progname = true;						    \
    free (totalfmt);							    \
    if (*fmt == '.')							    \
      --error_message_count;						    \
    else if (error_message_count >= gram_max_allowed_errors)		    \
      po_error (1, 0, _("too many errors, aborting"));			    \
  } while (0)

/* CAUTION: If you change this macro, you must also make identical
   changes to the function of the same name in src/po-lex.c  */

# define po_gram_error_at_line(pos, fmt, ...)				    \
  do {									    \
    error_with_progname = false;					    \
    po_error_at_line (0, 0, (pos)->file_name, (pos)->line_number,	    \
		      fmt, __VA_ARGS__ + 0);				    \
    error_with_progname = true;						    \
    if (*fmt == '.')							    \
      --error_message_count;						    \
    else if (error_message_count >= gram_max_allowed_errors)		    \
      po_error (1, 0, _("too many errors, aborting"));			    \
  } while (0)

/* GCC is also smart enough to allow optimizations like this.  */
#elif __STDC__ && defined __GNUC__ && __GNUC__ >= 2 && !(__APPLE_CC__ > 1)

/* CAUTION: If you change this macro, you must also make identical
   changes to the function of the same name in src/po-lex.c  */

# define po_gram_error(fmt, args...)					    \
  do {									    \
    char *totalfmt = xasprintf ("%s%s", "%s:%d:%d: ", fmt);		    \
    error_with_progname = false;					    \
    po_error (0, 0, totalfmt, gram_pos.file_name, gram_pos.line_number,	    \
	      gram_pos_column + 1 , ## args);				    \
    error_with_progname = true;						    \
    free (totalfmt);							    \
    if (*fmt == '.')							    \
      --error_message_count;						    \
    else if (error_message_count >= gram_max_allowed_errors)		    \
      po_error (1, 0, _("too many errors, aborting"));			    \
  } while (0)

/* CAUTION: If you change this macro, you must also make identical
   changes to the function of the same name in src/po-lex.c  */

# define po_gram_error_at_line(pos, fmt, args...)			    \
  do {									    \
    error_with_progname = false;					    \
    po_error_at_line (0, 0, (pos)->file_name, (pos)->line_number,	    \
		      fmt , ## args);					    \
    error_with_progname = true;						    \
    if (*fmt == '.')							    \
      --error_message_count;						    \
    else if (error_message_count >= gram_max_allowed_errors)		    \
      po_error (1, 0, _("too many errors, aborting"));			    \
  } while (0)

#else
extern void po_gram_error (const char *fmt, ...);
extern void po_gram_error_at_line (const lex_pos_ty *pos, const char *fmt, ...);
#endif


/* Contains information about the definition of one translation.  */
struct msgstr_def
{
  char *msgstr;
  size_t msgstr_len;
};


#ifdef __cplusplus
}
#endif


#endif