/* Keeping track of the flags that apply to a string extracted in a certain context. Copyright (C) 2001-2018, 2020 Free Software Foundation, Inc. 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 3 of the License, 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, see . */ #ifndef _XGETTEXT_ARGLIST_CONTEXT_H #define _XGETTEXT_ARGLIST_CONTEXT_H #include #include "mem-hash-map.h" #include "message.h" #ifdef __cplusplus extern "C" { #endif /* Context representing some flags. */ typedef struct flag_context_ty flag_context_ty; struct flag_context_ty { /* Regarding the primary formatstring type. */ /*enum is_format*/ unsigned int is_format1 : 3; /*bool*/ unsigned int pass_format1 : 1; /* Regarding the secondary formatstring type. */ /*enum is_format*/ unsigned int is_format2 : 3; /*bool*/ unsigned int pass_format2 : 1; /* Regarding the tertiary formatstring type. */ /*enum is_format*/ unsigned int is_format3 : 3; /*bool*/ unsigned int pass_format3 : 1; }; /* Null context. */ extern flag_context_ty null_context; /* Transparent context. */ extern flag_context_ty passthrough_context; /* Compute an inherited context. The outer_context is assumed to have all pass_format* flags = false. The result will then also have all pass_format* flags = false. */ extern flag_context_ty inherited_context (flag_context_ty outer_context, flag_context_ty modifier_context); /* Context representing some flags, for each possible argument number. This is a linked list, sorted according to the argument number. */ typedef struct flag_context_list_ty flag_context_list_ty; struct flag_context_list_ty { int argnum; /* current argument number, > 0 */ flag_context_ty flags; /* flags for current argument */ flag_context_list_ty *next; }; /* Iterator through a flag_context_list_ty. */ typedef struct flag_context_list_iterator_ty flag_context_list_iterator_ty; struct flag_context_list_iterator_ty { int argnum; /* current argument number, > 0 */ const flag_context_list_ty* head; /* tail of list */ }; extern flag_context_list_iterator_ty null_context_list_iterator; extern flag_context_list_iterator_ty passthrough_context_list_iterator; extern flag_context_list_iterator_ty flag_context_list_iterator (flag_context_list_ty *list); extern flag_context_ty flag_context_list_iterator_advance (flag_context_list_iterator_ty *iter); /* For nearly each backend, we have a separate table mapping a keyword to a flag_context_list_ty *. */ typedef hash_table /* char[] -> flag_context_list_ty * */ flag_context_list_table_ty; extern flag_context_list_ty * flag_context_list_table_lookup (flag_context_list_table_ty *flag_table, const void *key, size_t keylen); extern void flag_context_list_table_add (flag_context_list_table_ty *table, unsigned int index, const char *name_start, const char *name_end, int argnum, enum is_format value, bool pass); #ifdef __cplusplus } #endif #endif /* _XGETTEXT_ARGLIST_CONTEXT_H */