Added SILC Thread Queue API
[silc.git] / lib / silcutil / silcconfig.h
index 87db1cf84fdaec31326dd283d39c1e159a740284..c58bd28a32c4cbe6901036814126c4c697146324 100644 (file)
@@ -2,14 +2,13 @@
 
   silcconfig.h
 
-  Author: Johnny Mnemonic <johnny@themnemonic.org>
+  Author: Giovanni Giacobbi <giovanni@giacobbi.net>
 
-  Copyright (C) 1997 - 2002 Pekka Riikonen
+  Copyright (C) 2002 - 2003 Giovanni Giacobbi
 
   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 2 of the License, or
-  (at your option) any later version.
+  the Free Software Foundation; version 2 of the License.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +17,7 @@
 
 */
 
-/****h* silcutil/SilcConfigAPI
+/****h* silcutil/SILC Config Interface
  *
  * DESCRIPTION
  *
  * (or File object) and SilcConfigEntity (or Entity).  The File objects are
  * structs directly corresponding to the real files in the filesystem, while
  * Entities are a little more abstract.
+ *
  * An Entity is composed by delimited area on a File object (it can take the
  * whole File object or just part of it), plus a group of known options.
- *
  * In order to parse this file, first you need to create a File object with
  * the silc_config_open() function, and then you need to create the Entity
  * with the silc_config_init() function.
+ *
  * Now you can use the newly created Entity to register a group of expected
  * known options and sub-blocks, and then you can call the main parsing loop
- * with the silc_config_main() function.
- * When silc_config_main() will return, if some error encoured the object file
- * will point to the file that caused this error (this can be different from
- * the originally opened file if it contained `Include' directives).  If no
- * errors encoured then the File objects will still point to the original
- * file.
+ * with the silc_config_main() function. When silc_config_main() will 
+ * return, if some error encoured the object file will point to the file 
+ * that caused this error (this can be different from the originally 
+ * opened file if it contained `Include' directives).  If no errors 
+ * encoured then the File objects will still point to the original file.
+ *
  * While silc_config_main() will take care of destroying Entities before
  * returning, you need to take care that the File object you created is freed
  * with the silc_config_close() function.
@@ -51,6 +51,7 @@
  * The config file syntax is pretty straightforward.  All lines starting
  * with `#' will be skipped, while sub-blocks are delimited by braces (see
  * the example below).
+ *
  * Options with argument must have the `=' character between the option
  * name and the value.  Simple words and numbers does not require quoting.
  * There is a special built-in directive "Include" which allows you to include
@@ -74,7 +75,7 @@
 #ifndef SILCCONFIG_H
 #define SILCCONFIG_H
 
-/****d* silcutil/SilcConfigAPI/errno
+/****d* silcutil/SilcConfigAPI/SilcConfigErrno
  *
  * NAME
  *
@@ -92,6 +93,7 @@
 enum {
   SILC_CONFIG_OK,              /* OK */
   SILC_CONFIG_ESILENT,         /* Error defined by callback function */
+  SILC_CONFIG_EPRINTLINE,      /* Error defined by callback function */
   SILC_CONFIG_EGENERIC,                /* Invalid syntax */
   SILC_CONFIG_EINTERNAL,       /* Internal Error (caused by developer) */
   SILC_CONFIG_ECANTOPEN,       /* Can't open specified file */
@@ -104,7 +106,7 @@ enum {
   SILC_CONFIG_EEXPECTED,       /* Expected data but not found */
   SILC_CONFIG_EEXPECTEDEQUAL,  /* Expected '=' */
   SILC_CONFIG_EUNEXPECTED,     /* Unexpected data */
-  SILC_CONFIG_EMISSFIELDS,     /* Missing needed fields */
+  SILC_CONFIG_EMISSFIELDS,     /* Missing mandatory fields */
   SILC_CONFIG_EMISSCOLON,      /* Missing ';' */
 };
 /***/
@@ -141,7 +143,8 @@ typedef enum {
  * SYNOPSIS
  *
  *    typedef int (*SilcConfigCallback)(SilcConfigType type, const char *name,
- *                                      uint32 line, void *val, void *context);
+ *                                      SilcUInt32 line, void *val,
+ *                                      void *context);
  * DESCRIPTION
  *
  *    This is the callback prototype for the options handler.  The pointer
@@ -152,7 +155,7 @@ typedef enum {
  *
  ***/
 typedef int (*SilcConfigCallback)(SilcConfigType type, const char *name,
-                                 uint32 line, void *val, void *context);
+                                 SilcUInt32 line, void *val, void *context);
 
 /****s* silcutil/SilcConfigAPI/SilcConfigTable
  *
@@ -204,7 +207,7 @@ typedef struct SilcConfigTableStruct {
  *
  * SYNOPSIS
  *
- *    typedef struct { ... } SilcConfigFile;
+ *    typedef struct SilcConfigFileObject SilcConfigFile;
  *
  * DESCRIPTION
  *
@@ -220,7 +223,7 @@ typedef struct SilcConfigFileObject SilcConfigFile;
  *
  * SYNOPSIS
  *
- *    typedef struct { ... } SilcConfigEntity;
+ *    typedef struct SilcConfigEntityObject *SilcConfigEntity;
  *
  * DESCRIPTION
  *
@@ -247,7 +250,7 @@ typedef struct SilcConfigEntityObject *SilcConfigEntity;
  */
 #define SILC_CONFIG_CALLBACK(func)                             \
 static int func(SilcConfigType type, const char *name,         \
-               uint32 line, void *val, void *context)
+               SilcUInt32 line, void *val, void *context)
 /***/
 
 /* Prototypes */
@@ -266,7 +269,7 @@ static int func(SilcConfigType type, const char *name,              \
  *    silc_config_close().
  *
  ***/
-SilcConfigFile *silc_config_open(char *configfile);
+SilcConfigFile *silc_config_open(const char *configfile);
 
 /****f* silcutil/SilcConfigAPI/silc_config_close
  *
@@ -336,20 +339,20 @@ char *silc_config_get_filename(SilcConfigFile *file);
  *
  * SYNOPSIS
  *
- *    uint32 silc_config_get_line(SilcConfigFile *file);
+ *    SilcUInt32 silc_config_get_line(SilcConfigFile *file);
  *
  * DESCRIPTION
  *
  *    Returns the current line that file parsing arrived at.
  *
  ***/
-uint32 silc_config_get_line(SilcConfigFile *file);
+SilcUInt32 silc_config_get_line(SilcConfigFile *file);
 
 /****f* silcutil/SilcConfigAPI/silc_config_read_line
  *
  * SYNOPSIS
  *
- *    char *silc_config_read_line(SilcConfigFile *file, uint32 line);
+ *    char *silc_config_read_line(SilcConfigFile *file, SilcUInt32 line);
  *
  * DESCRIPTION
  *
@@ -361,7 +364,7 @@ uint32 silc_config_get_line(SilcConfigFile *file);
  *    silc_config_read_current_line
  *
  ***/
-char *silc_config_read_line(SilcConfigFile *file, uint32 line);
+char *silc_config_read_line(SilcConfigFile *file, SilcUInt32 line);
 
 /****f* silcutil/SilcConfigAPI/silc_config_read_current_line
  *
@@ -383,7 +386,7 @@ char *silc_config_read_current_line(SilcConfigFile *file);
  *
  * SYNOPSIS
  *
- *    void silc_config_register(SilcConfigEntity ent, const char *name,
+ *    SilcBool silc_config_register(SilcConfigEntity ent, const char *name,
  *                              SilcConfigType type, SilcConfigCallback cb,
  *                              const SilcConfigTable *subtable,
  *                              void *context);
@@ -393,15 +396,20 @@ char *silc_config_read_current_line(SilcConfigFile *file);
  *    Register option `name' in the entity `ent'. If `cb' is not NULL, it
  *    will be called with the *val pointer pointing to an internally
  *    allocated storage of type described by `type'.
+ *
  *    If `type' is SILC_CONFIG_ARG_BLOCK, then `subtable' must be a valid
- *    pointer to a SilcConfigTable array specified the options in the
+ *    pointer to a SilcConfigTable array specifying the options in the
  *    sub-block.
  *
+ *    If the option `name' was already registered in this sub-block or it
+ *    matches the reserved word "Include", then this function returns FALSE,
+ *    otherwise it returns TRUE.
+ *
  * SEE ALSO
  *    silc_config_register_table
  *
  ***/
-void silc_config_register(SilcConfigEntity ent, const char *name,
+SilcBool silc_config_register(SilcConfigEntity ent, const char *name,
                          SilcConfigType type, SilcConfigCallback cb,
                          const SilcConfigTable *subtable, void *context);
 
@@ -409,7 +417,7 @@ void silc_config_register(SilcConfigEntity ent, const char *name,
  *
  * SYNOPSIS
  *
- *    void silc_config_register_table(SilcConfigEntity ent,
+ *    SilcBool silc_config_register_table(SilcConfigEntity ent,
  *                                    const SilcConfigTable table[],
  *                                    void *context);
  *
@@ -418,14 +426,20 @@ void silc_config_register(SilcConfigEntity ent, const char *name,
  *    Register the tableset of options `table' automatically in the entity
  *    `ent'.  If defined in the table, the callback functions will be called
  *    all with the same context `context'.
+ *
  *    The `table' array must be terminated with an entry with the name field
  *    set to NULL.
  *
+ *    If the table contains invalid data this function returns FALSE, otherwise
+ *    it returns TRUE.  If a calling to this function failed, you must destroy
+ *    and recreate the entity before retrying, as it's impossible to detect
+ *    the point at the function stopped the registering process.
+ *
  * SEE ALSO
  *    SilcConfigTable
  *
  ***/
-void silc_config_register_table(SilcConfigEntity ent,
+SilcBool silc_config_register_table(SilcConfigEntity ent,
                                const SilcConfigTable table[], void *context);
 
 /****f* silcutil/SilcConfigAPI/silc_config_main
@@ -438,6 +452,7 @@ void silc_config_register_table(SilcConfigEntity ent,
  *
  *    Enter the main parsing loop. When this function returns the parsing
  *    is finished in the current block (and sub-blocks).
+ *
  *    When this function exits, the entity is already destroyed, because
  *    of this you should set it to NULL right after the function call.
  *