[svn-commits] nadi: branch nadi/trunk-cm r44151 - in /team/nadi/trunk-cm: include/asterisk/...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Mon Oct 2 08:58:44 MST 2006


Author: nadi
Date: Mon Oct  2 10:58:43 2006
New Revision: 44151

URL: http://svn.digium.com/view/asterisk?rev=44151&view=rev
Log:
some new macros in configman.h and fixes

Modified:
    team/nadi/trunk-cm/include/asterisk/configman.h
    team/nadi/trunk-cm/include/asterisk/hash.h
    team/nadi/trunk-cm/res/res_configman.c

Modified: team/nadi/trunk-cm/include/asterisk/configman.h
URL: http://svn.digium.com/view/asterisk/team/nadi/trunk-cm/include/asterisk/configman.h?rev=44151&r1=44150&r2=44151&view=diff
==============================================================================
--- team/nadi/trunk-cm/include/asterisk/configman.h (original)
+++ team/nadi/trunk-cm/include/asterisk/configman.h Mon Oct  2 10:58:43 2006
@@ -24,7 +24,10 @@
 #ifndef _ASTERISK_CONFIGMAN_H
 #define _ASTERISK_CONFIGMAN_H
 
+#include <stdlib.h>
 #include <sys/types.h>
+
+#include "asterisk/strings.h" 
 
 typedef struct cm    cm_t;
 
@@ -80,29 +83,6 @@
  */
 void     cm_destroy (cm_t *cm);
 
-/*! \brief Get a configuration value
- * \param cm_t which cm_t to use
- * \param buf where to put the result
- * \param size size of buf
- * \param sec_id section id to use
- * \param elem_id element id to use
- * \param ... integer or string id. omit this parameter, if the underlying cm_section_t is a single section type
- * Reads a value from the cm_t data structure and copies it into buf.
- *
- * Returns non-zero on error.
- */
-int      cm_get (cm_t *cm, char *buf, size_t size, int sec_id, int elem_id, ...);
-
-/*! \brief Validate an id
- * \param cm_t which cm_t to use
- * \param sec_id section id to use
- * \param ... integer or string id
- * Validates a given id.
- *
- * Returns true on success, zero if either id or sec_id is not valid.
- */
-int      cm_id_valid (cm_t *cm, int sec_id, ...);
-
 /*! \brief Get the subsequent id
  * \param cm_t which cm_t to use
  * \param sec_id section id to use
@@ -120,6 +100,81 @@
  */
 int      cm_get_next_id (cm_t *cm, int sec_id, void *prev, void *next);
 
-int      ast_configman_init (void);
+/*! \brief Get the subsequent id and rewinds if the end was reached
+ * \param cm_t which cm_t to use
+ * \param sec_id section id to use
+ * \param prev pointer to the previous id, if you want to retrieve the first id, give NULL
+ * \param next output pointer to the id after prev
+ * Gets the subsequent id of a given id. This variant succeeds and returns the first
+ * id if the last one was given as prev.
+ *
+ * Returns non-zero if next points to the id after prev, or zero if there
+ * is no subsequent id.
+ */
+int      cm_get_next_id_spin (cm_t *cm, int sec_id, void *prev, void *next);
+
+/*! \brief Validate an id
+ * \param cm_t which cm_t to use
+ * \param sec_id section id to use
+ * \param ... integer or string id
+ * Validates a given id.
+ *
+ * Returns true on success, zero if either id or sec_id is not valid.
+ */
+int      cm_id_valid (cm_t *cm, int sec_id, ...);
+
+/*! \brief Get a configuration value
+ * \param cm_t which cm_t to use
+ * \param buf where to put the result
+ * \param size size of buf
+ * \param sec_id section id to use
+ * \param elem_id element id to use
+ * \param ... integer or string id. omit this parameter, if the underlying cm_section_t is a single section type
+ * Reads a value from the cm_t data structure and copies it into buf.
+ *
+ * Returns non-zero on error.
+ */
+int      cm_get (cm_t *cm, char *buf, size_t size, int sec_id, int elem_id, ...);
+
+#define  cm_get_bool(cm,dest,sec_id,elem_id,...)	\
+({	\
+	char buf[32];	\
+	int retval = 0;		\
+	if (cm_get((cm), buf, sizeof(buf), (sec_id), (elem_id), ##__VA_ARGS__))	\
+		retval = -1;	\
+	else 	\
+		dest = ast_true(buf) ? 1 : 0;	\
+	retval;	\
+})
+
+#define  cm_get_int(cm,dest,sec_id,elem_id,...)	\
+({	\
+	char buf[32];	\
+	int retval = 0;		\
+	if (cm_get((cm), buf, sizeof(buf), (sec_id), (elem_id), ##__VA_ARGS__) ||	\
+		sscanf(buf, "%d", &(dest)) != 1)	\
+		retval = -1;	\
+	retval;	\
+})
+
+#define  cm_get_boolint(cm,dest,val_true,val_false,sec_id,elem_id,...)	\
+({	\
+	char buf[32];	\
+	int retval = 0;		\
+	if (cm_get((cm), buf, sizeof(buf), (sec_id), (elem_id), ##__VA_ARGS__))	\
+		retval = -1;	\
+	else if (sscanf(buf, "%d", &(dest)) != 1)	\
+		dest = ast_true(buf) ? val_true : val_false; \
+	retval;	\
+})
+
+#define  cm_get_strcasecmp(cm,str,sec_id,elem_id,...)	\
+({	\
+	char __buf[128];	\
+	int retval = -1;	\
+	if (!cm_get((cm), __buf, sizeof(__buf), (sec_id), (elem_id), ##__VA_ARGS__))	\
+		retval = strcasecmp((str), __buf);	\
+	retval;	\
+})
 
 #endif

Modified: team/nadi/trunk-cm/include/asterisk/hash.h
URL: http://svn.digium.com/view/asterisk/team/nadi/trunk-cm/include/asterisk/hash.h?rev=44151&r1=44150&r2=44151&view=diff
==============================================================================
--- team/nadi/trunk-cm/include/asterisk/hash.h (original)
+++ team/nadi/trunk-cm/include/asterisk/hash.h Mon Oct  2 10:58:43 2006
@@ -139,23 +139,25 @@
 
 
 
-#define AST_HASH_INSERT_NOLOCK(hash, key, val)	\
-({												\
-	int _pos = (hash)->_hash_f(key, (hash)->_size);	\
-	int _end = _pos;							\
- 	int _re = -1;								\
-	do {										\
-		if (!(hash)->_data[_pos]._used) {		\
-			(hash)->_data[_pos]._key = key;		\
-			(hash)->_data[_pos]._val = val;		\
-			(hash)->_data[_pos]._used = 1;		\
-			++(hash)->_length;					\
- 			_re = 0;							\
-			break;								\
-		}										\
-		_pos = (_pos + 1) % (hash)->_size;		\
-	} while (_pos != _end);						\
-	_re;										\
+#define AST_HASH_INSERT_NOLOCK(hash, key, val)		\
+({													\
+	int __pos = (hash)->_hash_f(key, (hash)->_size);\
+	int __end = __pos;								\
+ 	int __re = -1;									\
+	typeof(val) __valtmp = val;						\
+	if (AST_HASH_LOOKUP_NOLOCK((hash), (key), __valtmp))	\
+		do {										\
+			if (!(hash)->_data[__pos]._used) {		\
+				(hash)->_data[__pos]._key = key;	\
+				(hash)->_data[__pos]._val = val;	\
+				(hash)->_data[__pos]._used = 1;		\
+				++(hash)->_length;					\
+				__re = 0;							\
+				break;								\
+			}										\
+			__pos = (__pos + 1) % (hash)->_size;	\
+		} while (__pos != __end);					\
+	__re;											\
 })
 
 #define AST_HASH_INSERT(hash, key, val)			\
@@ -180,6 +182,7 @@
 			(hash)->_eq_f((hash)->_data[_pos]._key, key)) {	\
 			val = (hash)->_data[_pos]._val;		\
 			_re = 0;							\
+ 			break;								\
  		}										\
 		_pos = (_pos + 1) % (hash)->_size;		\
 	} while (_pos != _end);						\

Modified: team/nadi/trunk-cm/res/res_configman.c
URL: http://svn.digium.com/view/asterisk/team/nadi/trunk-cm/res/res_configman.c?rev=44151&r1=44150&r2=44151&view=diff
==============================================================================
--- team/nadi/trunk-cm/res/res_configman.c (original)
+++ team/nadi/trunk-cm/res/res_configman.c Mon Oct  2 10:58:43 2006
@@ -28,7 +28,6 @@
  */
 
 /* TODO:
- *  - write macros for easier variable access (cm_get_bool, cm_get_int, cm_get_strlist, cm_get_intlist, ...)
  *  - handle return values for *alloc, strdup, ast_cli_register
  */
 
@@ -39,7 +38,6 @@
 #include <errno.h>
 #include <stdarg.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
 
 #include "asterisk/configman.h"
@@ -477,7 +475,8 @@
 
 	LOCK(cm);
 
-	if (cm->state != CM_LOADED || sec_id >= cm->num_secs || sec_id < 0)
+	if (cm->state != CM_LOADED || sec_id >= cm->num_secs || sec_id < 0 ||
+		cm->secs[sec_id].key_type == KTYPE_NONE)
 		goto err2;
 
 	hash = cm->hashes[sec_id];
@@ -487,8 +486,6 @@
 		goto err2;
 
 	switch (cm->secs[sec_id].key_type) {
-	case KTYPE_NONE:
-		goto err2;
 	case KTYPE_INTEGER:
 		if (!prev || *(int *)prev < 0) {
 			*(int *)next = keys[0].i;
@@ -511,12 +508,19 @@
 		}
 		retval = 1;
 		break;
+	case KTYPE_NONE:
+		goto err2;
 	}
 
 err2:
 	UNLOCK(cm);
 err1:
 	return retval;
+}
+
+int cm_get_next_id_spin (cm_t *cm, int sec_id, void *prev, void *next)
+{
+	return cm_get_next_id(cm, sec_id, prev, next) || cm_get_next_id(cm, sec_id, NULL, next);
 }
 
 /* cli commands for modules */
@@ -663,6 +667,9 @@
 	cm_t * cm;
 	char * retval = NULL;
 
+	if (pos != 4)
+		return NULL;
+
 	cm = __get_cm_from_line(line);
 	if (!cm)
 		return NULL;
@@ -708,6 +715,9 @@
 {
 	cm_t * cm;
 	char * retval = NULL;
+
+	if (pos != 4)
+		return NULL;
 
 	cm = __get_cm_from_line(line);
 	if (!cm)
@@ -762,15 +772,17 @@
 	if (!cm)
 		return NULL;
 
-	LOCK(cm);
 	if (pos == 4) {
+		LOCK(cm);
 		retval = __complete_section(cm, word, state);
+		UNLOCK(cm);
 	} else if (pos == 5) {
+		LOCK(cm);
 		sec = __get_sec_from_line(cm, line);
 		if (sec && sec->key_type != KTYPE_NONE)
 			retval = __complete_keys(cm, sec, word, state);
-	}
-	UNLOCK(cm);
+		UNLOCK(cm);
+	}
 
 	return retval;
 }
@@ -799,6 +811,8 @@
 		val = cm->vals[sec_id].rows[row][i];
 		if (!val)
 			val = cm->vals[sec_id].rows[0][i];
+		if (!val)
+			val = "";
 		term_color(wval, val, COLOR_BRWHITE, 0, sizeof(wval));
 		ast_cli(fd, " -> %s: %s\n", cm->secs[sec_id].directives[i].name, wval);
 	}
@@ -1161,9 +1175,8 @@
 	AST_HASH_LOCK(&cm_obj_hash);
 
 	ast_cli(fd, "Modules using configman: %d\n", AST_HASH_LENGTH_NOLOCK(&cm_obj_hash));
-	AST_HASH_TRAVERSE_NOLOCK(&cm_obj_hash, key, cm, i) {
+	AST_HASH_TRAVERSE_NOLOCK(&cm_obj_hash, key, cm, i)
 		ast_cli(fd, " >> %s\n", key);
-	}
 
 	AST_HASH_UNLOCK(&cm_obj_hash);
 



More information about the svn-commits mailing list