summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTilghman Lesher <tilghman@meg.abyt.es>2008-03-26 19:19:31 +0000
committerTilghman Lesher <tilghman@meg.abyt.es>2008-03-26 19:19:31 +0000
commite6fc9ae52cceaf321d8ed834d6e191d83212b422 (patch)
tree055f1fd6797ddb44d8650d54d9e4f0eda5fb5836
parentdd2700d0b12fd4b37615137462b9c805172b1569 (diff)
Add a linkedlist macro that maintains a sorted list
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@111036 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--CHANGES9
-rw-r--r--include/asterisk/linkedlists.h33
-rw-r--r--main/config.c4
3 files changed, 41 insertions, 5 deletions
diff --git a/CHANGES b/CHANGES
index 33c74ff13..61c0b80da 100644
--- a/CHANGES
+++ b/CHANGES
@@ -31,6 +31,12 @@ SIP Changes
* The ATTENDED_TRANSFER_COMPLETE_SOUND can now be set using setvar to cause a given
audio file to be played upon completion of an attended transfer.
+CLI Changes
+-----------
+ * New CLI command, "config reload <file.conf>" which reloads any module that
+ references that particular configuration file. Also added "config list"
+ which shows which configuration files are in use.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 1.4.X to Asterisk 1.6.0 -------------
------------------------------------------------------------------------------
@@ -135,9 +141,6 @@ CLI Changes
* Added a CLI command, "devstate change", which allows you to set custom device
states from the func_devstate module that provides the DEVICE_STATE() function
and handling of the "Custom:" devices.
- * New CLI command, "config reload <file.conf>" which reloads any module that
- references that particular configuration file. Also added "config list"
- which shows which configuration files are in use.
SIP changes
-----------
diff --git a/include/asterisk/linkedlists.h b/include/asterisk/linkedlists.h
index 1f3285dfa..32d0cbe0b 100644
--- a/include/asterisk/linkedlists.h
+++ b/include/asterisk/linkedlists.h
@@ -456,6 +456,7 @@ struct { \
\li AST_LIST_INSERT_AFTER()
\li AST_LIST_INSERT_HEAD()
\li AST_LIST_INSERT_TAIL()
+ \li AST_LIST_INSERT_SORTALPHA()
*/
#define AST_LIST_TRAVERSE(head,var,field) \
for((var) = (head)->first; (var); (var) = (var)->field.next)
@@ -695,6 +696,38 @@ struct { \
#define AST_RWLIST_INSERT_TAIL AST_LIST_INSERT_TAIL
/*!
+ * \brief Inserts a list entry into a alphabetically sorted list
+ * \param head Pointer to the list head structure
+ * \param elm Pointer to the entry to be inserted
+ * \param field Name of the list entry field (declared using AST_LIST_ENTRY())
+ * \param sortfield Name of the field on which the list is sorted
+ */
+#define AST_LIST_INSERT_SORTALPHA(head, elm, field, sortfield) do { \
+ if (!(head)->first) { \
+ (head)->first = (elm); \
+ (head)->last = (elm); \
+ } else { \
+ typeof((head)->first) cur = (head)->first, prev = NULL; \
+ while (cur && strcmp(cur->sortfield, elm->sortfield) < 0) { \
+ prev = cur; \
+ cur = cur->field.next; \
+ } \
+ if (!prev) { /* Same as INSERT_HEAD */ \
+ (elm)->field.next = (head)->first; \
+ (head)->first = (elm); \
+ } else if (!cur) { /* Same as INSERT_TAIL */ \
+ (head)->last->field.next = (elm); \
+ (head)->last = (elm); \
+ } else { \
+ (elm)->field.next = cur; \
+ (prev)->field.next = (elm); \
+ } \
+ } \
+} while (0)
+
+#define AST_RWLIST_INSERT_SORTALPHA AST_LIST_INSERT_SORTALPHA
+
+/*!
\brief Appends a whole list to the tail of a list.
\param head This is a pointer to the list head structure
\param list This is a pointer to the list to be appended.
diff --git a/main/config.c b/main/config.c
index 29e2e123e..ec917d3e3 100644
--- a/main/config.c
+++ b/main/config.c
@@ -878,7 +878,7 @@ static void config_cache_attribute(const char *configfile, enum config_cache_att
cfmtime->who_asked = cfmtime->filename + strlen(configfile) + 1;
strcpy(cfmtime->who_asked, who_asked);
/* Note that the file mtime is initialized to 0, i.e. 1970 */
- AST_LIST_INSERT_TAIL(&cfmtime_head, cfmtime, list);
+ AST_LIST_INSERT_SORTALPHA(&cfmtime_head, cfmtime, list, filename);
}
if (!stat(configfile, &statbuf))
@@ -1211,7 +1211,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
cfmtime->who_asked = cfmtime->filename + strlen(fn) + 1;
strcpy(cfmtime->who_asked, who_asked);
/* Note that the file mtime is initialized to 0, i.e. 1970 */
- AST_LIST_INSERT_TAIL(&cfmtime_head, cfmtime, list);
+ AST_LIST_INSERT_SORTALPHA(&cfmtime_head, cfmtime, list, filename);
}
}