1*041394f3SDevin Teske /*- 2*041394f3SDevin Teske * Copyright (c) 2002-2014 Devin Teske <dteske@FreeBSD.org> 3*041394f3SDevin Teske * All rights reserved. 4*041394f3SDevin Teske * 5*041394f3SDevin Teske * Redistribution and use in source and binary forms, with or without 6*041394f3SDevin Teske * modification, are permitted provided that the following conditions 7*041394f3SDevin Teske * are met: 8*041394f3SDevin Teske * 1. Redistributions of source code must retain the above copyright 9*041394f3SDevin Teske * notice, this list of conditions and the following disclaimer. 10*041394f3SDevin Teske * 2. Redistributions in binary form must reproduce the above copyright 11*041394f3SDevin Teske * notice, this list of conditions and the following disclaimer in the 12*041394f3SDevin Teske * documentation and/or other materials provided with the distribution. 13*041394f3SDevin Teske * 14*041394f3SDevin Teske * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*041394f3SDevin Teske * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*041394f3SDevin Teske * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*041394f3SDevin Teske * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*041394f3SDevin Teske * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*041394f3SDevin Teske * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*041394f3SDevin Teske * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*041394f3SDevin Teske * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*041394f3SDevin Teske * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*041394f3SDevin Teske * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*041394f3SDevin Teske * SUCH DAMAGE. 25*041394f3SDevin Teske * 26*041394f3SDevin Teske * $FreeBSD$ 27*041394f3SDevin Teske */ 28*041394f3SDevin Teske 29*041394f3SDevin Teske #ifndef _FIGPAR_H_ 30*041394f3SDevin Teske #define _FIGPAR_H_ 31*041394f3SDevin Teske 32*041394f3SDevin Teske #include <sys/types.h> 33*041394f3SDevin Teske 34*041394f3SDevin Teske /* 35*041394f3SDevin Teske * Union for storing various types of data in a single common container. 36*041394f3SDevin Teske */ 37*041394f3SDevin Teske union fp_cfgvalue { 38*041394f3SDevin Teske void *data; /* Pointer to NUL-terminated string */ 39*041394f3SDevin Teske char *str; /* Pointer to NUL-terminated string */ 40*041394f3SDevin Teske char **strarray; /* Pointer to an array of strings */ 41*041394f3SDevin Teske int32_t num; /* Signed 32-bit integer value */ 42*041394f3SDevin Teske uint32_t u_num; /* Unsigned 32-bit integer value */ 43*041394f3SDevin Teske uint32_t boolean:1; /* Boolean integer value (0 or 1) */ 44*041394f3SDevin Teske }; 45*041394f3SDevin Teske 46*041394f3SDevin Teske /* 47*041394f3SDevin Teske * Option types (based on above cfgvalue union) 48*041394f3SDevin Teske */ 49*041394f3SDevin Teske enum fp_cfgtype { 50*041394f3SDevin Teske FP_TYPE_NONE = 0x0000, /* for directives with no value */ 51*041394f3SDevin Teske FP_TYPE_BOOL = 0x0001, /* boolean */ 52*041394f3SDevin Teske FP_TYPE_INT = 0x0002, /* signed 32 bit integer */ 53*041394f3SDevin Teske FP_TYPE_UINT = 0x0004, /* unsigned 32 bit integer */ 54*041394f3SDevin Teske FP_TYPE_STR = 0x0008, /* string pointer */ 55*041394f3SDevin Teske FP_TYPE_STRARRAY = 0x0010, /* string array pointer */ 56*041394f3SDevin Teske FP_TYPE_DATA1 = 0x0020, /* void data type-1 (whatever) */ 57*041394f3SDevin Teske FP_TYPE_DATA2 = 0x0040, /* void data type-2 (whatever) */ 58*041394f3SDevin Teske FP_TYPE_DATA3 = 0x0080, /* void data type-3 (whatever) */ 59*041394f3SDevin Teske FP_TYPE_RESERVED1 = 0x0100, /* reserved data type-1 (future) */ 60*041394f3SDevin Teske FP_TYPE_RESERVED2 = 0x0200, /* reserved data type-2 (future) */ 61*041394f3SDevin Teske FP_TYPE_RESERVED3 = 0x0400, /* reserved data type-3 (future) */ 62*041394f3SDevin Teske }; 63*041394f3SDevin Teske 64*041394f3SDevin Teske /* 65*041394f3SDevin Teske * Options to parse_config() for processing_options bitmask 66*041394f3SDevin Teske */ 67*041394f3SDevin Teske #define FP_BREAK_ON_EQUALS 0x0001 /* stop reading directive at `=' */ 68*041394f3SDevin Teske #define FP_BREAK_ON_SEMICOLON 0x0002 /* `;' starts a new line */ 69*041394f3SDevin Teske #define FP_CASE_SENSITIVE 0x0004 /* directives are case sensitive */ 70*041394f3SDevin Teske #define FP_REQUIRE_EQUALS 0x0008 /* assignment directives only */ 71*041394f3SDevin Teske #define FP_STRICT_EQUALS 0x0010 /* `=' must be part of directive */ 72*041394f3SDevin Teske 73*041394f3SDevin Teske /* 74*041394f3SDevin Teske * Anatomy of a config file option 75*041394f3SDevin Teske */ 76*041394f3SDevin Teske struct fp_config { 77*041394f3SDevin Teske enum fp_cfgtype type; /* Option value type */ 78*041394f3SDevin Teske const char *directive; /* config file keyword */ 79*041394f3SDevin Teske union fp_cfgvalue value; /* NB: set by action */ 80*041394f3SDevin Teske 81*041394f3SDevin Teske /* 82*041394f3SDevin Teske * Function pointer; action to be taken when the directive is found 83*041394f3SDevin Teske */ 84*041394f3SDevin Teske int (*action)(struct fp_config *option, uint32_t line, char *directive, 85*041394f3SDevin Teske char *value); 86*041394f3SDevin Teske }; 87*041394f3SDevin Teske extern struct fp_config fp_dummy_config; 88*041394f3SDevin Teske 89*041394f3SDevin Teske __BEGIN_DECLS 90*041394f3SDevin Teske int parse_config(struct fp_config _options[], 91*041394f3SDevin Teske const char *_path, 92*041394f3SDevin Teske int (*_unknown)(struct fp_config *_option, 93*041394f3SDevin Teske uint32_t _line, char *_directive, char *_value), 94*041394f3SDevin Teske uint16_t _processing_options); 95*041394f3SDevin Teske struct fp_config *get_config_option(struct fp_config _options[], 96*041394f3SDevin Teske const char *_directive); 97*041394f3SDevin Teske __END_DECLS 98*041394f3SDevin Teske 99*041394f3SDevin Teske #endif /* _FIGPAR_H_ */ 100