Files
glibc/locale/programs/linereader.h
T

149 lines
3.3 KiB
C
Raw Normal View History

2003-06-11 21:57:23 +00:00
/* Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
1997-02-15 04:31:36 +00:00
This file is part of the GNU C Library.
1999-08-31 07:04:41 +00:00
Contributed by Ulrich Drepper, <drepper@gnu.org>.
1997-02-15 04:31:36 +00:00
The GNU C Library is free software; you can redistribute it and/or
2001-07-06 04:58:11 +00:00
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
1997-02-15 04:31:36 +00:00
The GNU C Library 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
2001-07-06 04:58:11 +00:00
Lesser General Public License for more details.
2001-07-06 04:58:11 +00:00
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#ifndef _LINEREADER_H
#define _LINEREADER_H 1
#include <ctype.h>
#include <libintl.h>
1999-08-31 07:04:41 +00:00
#include <stdint.h>
#include <stdio.h>
1999-08-31 07:04:41 +00:00
#include "charmap.h"
#include "error.h"
#include "locfile-token.h"
1999-08-31 07:04:41 +00:00
#include "repertoire.h"
1999-08-31 07:04:41 +00:00
typedef const struct keyword_t *(*kw_hash_fct_t) (const char *, unsigned int);
struct charset_t;
2001-12-10 01:37:56 +00:00
struct localedef_t;
struct token
{
enum token_t tok;
union
{
struct
{
1999-08-31 07:04:41 +00:00
char *startmb;
size_t lenmb;
uint32_t *startwc;
size_t lenwc;
} str;
unsigned long int num;
struct
{
1999-08-31 07:04:41 +00:00
/* This element is sized on the safe expectation that no single
character in any character set uses more then 16 bytes. */
unsigned char bytes[16];
int nbytes;
} charcode;
1999-08-31 07:04:41 +00:00
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;
1999-08-31 07:04:41 +00:00
int return_widestr;
kw_hash_fct_t hash_fct;
};
/* Functions defined in linereader.c. */
1999-08-31 07:04:41 +00:00
extern struct linereader *lr_open (const char *fname, kw_hash_fct_t hf);
2001-12-10 01:37:56 +00:00
extern struct linereader *lr_create (FILE *fp, const char *fname,
kw_hash_fct_t hf);
1999-08-31 07:04:41 +00:00
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,
2001-12-10 01:37:56 +00:00
struct localedef_t *locale,
2001-02-05 05:57:24 +00:00
const struct repertoire_t *repertoire,
int verbose);
2003-06-11 21:57:23 +00:00
extern void lr_ignore_rest (struct linereader *lr, int verbose);
#define lr_error(lr, fmt, args...) \
2002-02-05 23:29:24 +00:00
WITH_CUR_LOCALE (error_at_line (0, 0, lr->fname, lr->lineno, fmt, ## args))
static inline int
2003-06-11 21:57:23 +00:00
__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
2003-06-11 21:57:23 +00:00
__attribute ((always_inline))
lr_ungetc (struct linereader *lr, int ch)
{
if (lr->idx == 0)
return -1;
2001-02-09 17:02:23 +00:00
if (ch != EOF)
lr->buf[--lr->idx] = ch;
return 0;
}
static inline int
1996-10-31 02:57:12 +00:00
lr_ungetn (struct linereader *lr, size_t n)
{
if (lr->idx < n)
return -1;
lr->idx -= n;
return 0;
}
#endif /* linereader.h */