1cd1c6085SJohn Marino /* 2cd1c6085SJohn Marino * Copyright 2010 Nexenta Systems, Inc. All rights reserved. 3cd1c6085SJohn Marino * Copyright 2015 John Marino <draco@marino.st> 48aa2b98bSJohn Marino * 58aa2b98bSJohn Marino * This source code is derived from the illumos localedef command, and 68aa2b98bSJohn Marino * provided under BSD-style license terms by Nexenta Systems, Inc. 78aa2b98bSJohn Marino * 88aa2b98bSJohn Marino * Redistribution and use in source and binary forms, with or without 98aa2b98bSJohn Marino * modification, are permitted provided that the following conditions 108aa2b98bSJohn Marino * are met: 118aa2b98bSJohn Marino * 128aa2b98bSJohn Marino * 1. Redistributions of source code must retain the above copyright 138aa2b98bSJohn Marino * notice, this list of conditions and the following disclaimer. 148aa2b98bSJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 158aa2b98bSJohn Marino * notice, this list of conditions and the following disclaimer in the 168aa2b98bSJohn Marino * documentation and/or other materials provided with the distribution. 178aa2b98bSJohn Marino * 188aa2b98bSJohn Marino * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 198aa2b98bSJohn Marino * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 208aa2b98bSJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 218aa2b98bSJohn Marino * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 228aa2b98bSJohn Marino * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 238aa2b98bSJohn Marino * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 248aa2b98bSJohn Marino * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 258aa2b98bSJohn Marino * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 268aa2b98bSJohn Marino * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 278aa2b98bSJohn Marino * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 288aa2b98bSJohn Marino * POSSIBILITY OF SUCH DAMAGE. 29cd1c6085SJohn Marino */ 30cd1c6085SJohn Marino 31cd1c6085SJohn Marino /* 32cd1c6085SJohn Marino * POSIX localedef. 33cd1c6085SJohn Marino */ 34cd1c6085SJohn Marino 35cd1c6085SJohn Marino /* Common header files. */ 36cd1c6085SJohn Marino #include <stdio.h> 37cd1c6085SJohn Marino #include <stdlib.h> 38cd1c6085SJohn Marino #include <stdarg.h> 39cd1c6085SJohn Marino #include <sys/types.h> 40cd1c6085SJohn Marino 41*dc6f5bdfSSascha Wildner #define yylex localedef_yylex 42*dc6f5bdfSSascha Wildner 43cd1c6085SJohn Marino extern int com_char; 44cd1c6085SJohn Marino extern int esc_char; 45cd1c6085SJohn Marino extern int mb_cur_max; 46cd1c6085SJohn Marino extern int mb_cur_min; 47cd1c6085SJohn Marino extern int last_kw; 48cd1c6085SJohn Marino extern int verbose; 4901bedb5aSSascha Wildner #if YYDEBUG 50cd1c6085SJohn Marino extern int yydebug; 5101bedb5aSSascha Wildner #endif 52cd1c6085SJohn Marino extern int lineno; 53cd1c6085SJohn Marino extern int undefok; /* mostly ignore undefined symbols */ 54cd1c6085SJohn Marino extern int warnok; 55cd1c6085SJohn Marino extern int warnings; 56cd1c6085SJohn Marino 57cd1c6085SJohn Marino int yylex(void); 58cd1c6085SJohn Marino void yyerror(const char *); 596d08986dSSascha Wildner void errf(const char *, ...) __dead2; 60cd1c6085SJohn Marino void warn(const char *, ...); 61cd1c6085SJohn Marino 62cd1c6085SJohn Marino int putl_category(const char *, FILE *); 63cd1c6085SJohn Marino int wr_category(void *, size_t, FILE *); 64cd1c6085SJohn Marino FILE *open_category(void); 65cd1c6085SJohn Marino void close_category(FILE *); 66cd1c6085SJohn Marino void copy_category(char *); 67cd1c6085SJohn Marino const char *category_name(void); 68cd1c6085SJohn Marino 69cd1c6085SJohn Marino int get_category(void); 70cd1c6085SJohn Marino int get_symbol(void); 71cd1c6085SJohn Marino int get_escaped(int); 72cd1c6085SJohn Marino int get_wide(void); 73cd1c6085SJohn Marino void reset_scanner(const char *); 74cd1c6085SJohn Marino void scan_to_eol(void); 75cd1c6085SJohn Marino void add_wcs(wchar_t); 76cd1c6085SJohn Marino void add_tok(int); 77cd1c6085SJohn Marino wchar_t *get_wcs(void); 78cd1c6085SJohn Marino 79cd1c6085SJohn Marino /* charmap.c - CHARMAP handling */ 80cd1c6085SJohn Marino void init_charmap(void); 81cacd7ea7SJohn Marino void add_charmap(const char *, int); 82cd1c6085SJohn Marino void add_charmap_undefined(char *); 83cd1c6085SJohn Marino void add_charmap_posix(void); 84cd1c6085SJohn Marino void add_charmap_range(char *, char *, int); 85cacd7ea7SJohn Marino void add_charmap_char(const char *name, int val); 86cd1c6085SJohn Marino int lookup_charmap(const char *, wchar_t *); 87cd1c6085SJohn Marino int check_charmap_undefined(char *); 88cd1c6085SJohn Marino int check_charmap(wchar_t); 89cd1c6085SJohn Marino 90cd1c6085SJohn Marino /* collate.o - LC_COLLATE handling */ 91cd1c6085SJohn Marino typedef struct collelem collelem_t; 92cd1c6085SJohn Marino typedef struct collsym collsym_t; 93cd1c6085SJohn Marino void init_collate(void); 94cd1c6085SJohn Marino void define_collsym(char *); 95cd1c6085SJohn Marino void define_collelem(char *, wchar_t *); 96cd1c6085SJohn Marino void add_order_directive(void); 97cd1c6085SJohn Marino void add_order_bit(int); 98cd1c6085SJohn Marino void dump_collate(void); 99cd1c6085SJohn Marino collsym_t *lookup_collsym(char *); 100cd1c6085SJohn Marino collelem_t *lookup_collelem(char *); 101cd1c6085SJohn Marino void start_order_collelem(collelem_t *); 102cd1c6085SJohn Marino void start_order_undefined(void); 103cd1c6085SJohn Marino void start_order_symbol(char *); 104cd1c6085SJohn Marino void start_order_char(wchar_t); 105cd1c6085SJohn Marino void start_order_ellipsis(void); 106cd1c6085SJohn Marino void end_order_collsym(collsym_t *); 107cd1c6085SJohn Marino void end_order(void); 108cd1c6085SJohn Marino void add_weight(int32_t, int); 109cd1c6085SJohn Marino void add_weights(int32_t *); 110cd1c6085SJohn Marino void add_weight_num(int); 111cd1c6085SJohn Marino void add_order_collelem(collelem_t *); 112cd1c6085SJohn Marino void add_order_collsym(collsym_t *); 113cd1c6085SJohn Marino void add_order_char(wchar_t); 114cd1c6085SJohn Marino void add_order_ignore(void); 115cd1c6085SJohn Marino void add_order_ellipsis(void); 116cd1c6085SJohn Marino void add_order_symbol(char *); 117cd1c6085SJohn Marino void add_order_subst(void); 118cd1c6085SJohn Marino void add_subst_char(wchar_t); 119cd1c6085SJohn Marino void add_subst_collsym(collsym_t *); 120cd1c6085SJohn Marino void add_subst_collelem(collelem_t *); 121cd1c6085SJohn Marino void add_subst_symbol(char *); 122cd1c6085SJohn Marino int32_t get_weight(int32_t, int); 123cd1c6085SJohn Marino wchar_t * wsncpy(wchar_t *, const wchar_t *, size_t); 124cd1c6085SJohn Marino 125cd1c6085SJohn Marino 126cd1c6085SJohn Marino /* ctype.c - LC_CTYPE handling */ 127cd1c6085SJohn Marino void init_ctype(void); 128cd1c6085SJohn Marino void add_ctype(int); 129cacd7ea7SJohn Marino void add_ctype_range(wchar_t); 130cd1c6085SJohn Marino void add_width(int, int); 131cd1c6085SJohn Marino void add_width_range(int, int, int); 132cd1c6085SJohn Marino void add_caseconv(int, int); 133cd1c6085SJohn Marino void dump_ctype(void); 134cd1c6085SJohn Marino 135cd1c6085SJohn Marino /* messages.c - LC_MESSAGES handling */ 136cd1c6085SJohn Marino void init_messages(void); 137cd1c6085SJohn Marino void add_message(wchar_t *); 138cd1c6085SJohn Marino void dump_messages(void); 139cd1c6085SJohn Marino 140cd1c6085SJohn Marino /* monetary.c - LC_MONETARY handling */ 141cd1c6085SJohn Marino void init_monetary(void); 142cd1c6085SJohn Marino void add_monetary_str(wchar_t *); 143cd1c6085SJohn Marino void add_monetary_num(int); 144cd1c6085SJohn Marino void reset_monetary_group(void); 145cd1c6085SJohn Marino void add_monetary_group(int); 146cd1c6085SJohn Marino void dump_monetary(void); 147cd1c6085SJohn Marino 148cd1c6085SJohn Marino /* numeric.c - LC_NUMERIC handling */ 149cd1c6085SJohn Marino void init_numeric(void); 150cd1c6085SJohn Marino void add_numeric_str(wchar_t *); 151cd1c6085SJohn Marino void reset_numeric_group(void); 152cd1c6085SJohn Marino void add_numeric_group(int); 153cd1c6085SJohn Marino void dump_numeric(void); 154cd1c6085SJohn Marino 155cd1c6085SJohn Marino /* time.c - LC_TIME handling */ 156cd1c6085SJohn Marino void init_time(void); 157cd1c6085SJohn Marino void add_time_str(wchar_t *); 158cd1c6085SJohn Marino void reset_time_list(void); 159cd1c6085SJohn Marino void add_time_list(wchar_t *); 160cd1c6085SJohn Marino void check_time_list(void); 161cd1c6085SJohn Marino void dump_time(void); 162cd1c6085SJohn Marino 163cd1c6085SJohn Marino /* wide.c - Wide character handling. */ 164cd1c6085SJohn Marino int to_wide(wchar_t *, const char *); 165cd1c6085SJohn Marino int to_mbs(char *, wchar_t); 166cd1c6085SJohn Marino int to_mb(char *, wchar_t); 167cd1c6085SJohn Marino char *to_mb_string(const wchar_t *); 168cd1c6085SJohn Marino void set_wide_encoding(const char *); 169cd1c6085SJohn Marino void werr(const char *, ...); 170cd1c6085SJohn Marino const char *get_wide_encoding(void); 171cd1c6085SJohn Marino int max_wide(void); 172cd1c6085SJohn Marino 173cd1c6085SJohn Marino //#define _(x) gettext(x) 174cd1c6085SJohn Marino #define INTERR fprintf(stderr,"internal fault (%s:%d)", __FILE__, __LINE__) 175