| /* Copyright (C) 1996-2014 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| Contributed by Ulrich Drepper, <drepper@gnu.org>. |
| |
| 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; version 2 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 <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef _LINEREADER_H |
| #define _LINEREADER_H 1 |
| |
| #include <ctype.h> |
| #include <libintl.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| |
| #include "third_party/glibc_locales/programs/charmap.h" |
| #include "third_party/glibc_locales/programs/locfile-token.h" |
| #include "third_party/glibc_locales/programs/repertoire.h" |
| |
| typedef const struct keyword_t *(*kw_hash_fct_t)(const char *, unsigned int); |
| struct charset_t; |
| struct localedef_t; |
| |
| struct token { |
| enum token_t tok; |
| union { |
| struct { |
| char *startmb; |
| size_t lenmb; |
| uint32_t *startwc; |
| size_t lenwc; |
| } str; |
| unsigned long int num; |
| struct { |
| /* This element is sized on the safe expectation that no single |
| character in any character set uses more than 16 bytes. */ |
| unsigned char bytes[16]; |
| int nbytes; |
| } charcode; |
| uint32_t ucs4; |
| } val; |
| }; |
| |
| struct linereader { |
| FILE *fp; |
| const char *fname; |
| char *buf; |
| size_t bufsize; |
| size_t bufact; |
| size_t lineno; |
| |
| size_t idx; |
| |
| char comment_char; |
| char escape_char; |
| |
| struct token token; |
| |
| int translate_strings; |
| int return_widestr; |
| |
| kw_hash_fct_t hash_fct; |
| }; |
| |
| /* Functions defined in linereader.c. */ |
| extern struct linereader *lr_open(const char *fname, kw_hash_fct_t hf); |
| extern struct linereader *lr_create(FILE *fp, const char *fname, |
| kw_hash_fct_t hf); |
| extern int lr_eof(struct linereader *lr); |
| extern void lr_close(struct linereader *lr); |
| extern int lr_next(struct linereader *lr); |
| extern struct token *lr_token(struct linereader *lr, |
| const struct charmap_t *charmap, |
| struct localedef_t *locale, |
| const struct repertoire_t *repertoire, |
| int verbose); |
| extern void lr_ignore_rest(struct linereader *lr, int verbose); |
| |
| #define lr_error(lr, fmt, args...) \ |
| WITH_CUR_LOCALE(error_at_line(0, 0, lr->fname, lr->lineno, fmt, ##args)) |
| |
| static inline int __attribute((always_inline)) lr_getc(struct linereader *lr) { |
| if (lr->idx == lr->bufact) { |
| if (lr->bufact != 0) |
| if (lr_next(lr) < 0) return EOF; |
| |
| if (lr->bufact == 0) return EOF; |
| } |
| |
| return lr->buf[lr->idx] == '\32' ? EOF : lr->buf[lr->idx++]; |
| } |
| |
| static inline int __attribute((always_inline)) |
| lr_ungetc(struct linereader *lr, int ch) { |
| if (lr->idx == 0) return -1; |
| |
| if (ch != EOF) lr->buf[--lr->idx] = ch; |
| return 0; |
| } |
| |
| static inline int lr_ungetn(struct linereader *lr, size_t n) { |
| if (lr->idx < n) return -1; |
| |
| lr->idx -= n; |
| return 0; |
| } |
| |
| #endif /* linereader.h */ |