<p>George Joseph <strong>submitted</strong> this change.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/16317">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Sean Bright: Looks good to me, but someone else must approve
George Joseph: Looks good to me, approved
Joshua Colp: Approved for Submit
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">conf2ael: Remove deprecated application.<br><br>ASTERISK-29599<br><br>Change-Id: I75dc77162926fb17e7c6caf8f04e3aabd792fb0c<br>---<br>A doc/UPGRADE-staging/conf2ael_removal.txt<br>M utils/.gitignore<br>M utils/Makefile<br>D utils/conf2ael.c<br>M utils/utils.xml<br>5 files changed, 7 insertions(+), 741 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/UPGRADE-staging/conf2ael_removal.txt b/doc/UPGRADE-staging/conf2ael_removal.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..73c300c</span><br><span>--- /dev/null</span><br><span>+++ b/doc/UPGRADE-staging/conf2ael_removal.txt</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: conf2ael</span><br><span style="color: hsl(120, 100%, 40%);">+Master-Only: True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This application was deprecated in Asterisk 16</span><br><span style="color: hsl(120, 100%, 40%);">+and is now being removed in accordance with</span><br><span style="color: hsl(120, 100%, 40%);">+the Asterisk Module Deprecation policy.</span><br><span>diff --git a/utils/.gitignore b/utils/.gitignore</span><br><span>index 7840265..fb3bf54 100644</span><br><span>--- a/utils/.gitignore</span><br><span>+++ b/utils/.gitignore</span><br><span>@@ -11,7 +11,6 @@</span><br><span> check_expr</span><br><span> check_expr2</span><br><span> check_expr2.dSYM/</span><br><span style="color: hsl(0, 100%, 40%);">-conf2ael</span><br><span> db1-ast/libdb1.a</span><br><span> hashtab.c</span><br><span> lock.c</span><br><span>diff --git a/utils/Makefile b/utils/Makefile</span><br><span>index 3a1e218..0471441 100644</span><br><span>--- a/utils/Makefile</span><br><span>+++ b/utils/Makefile</span><br><span>@@ -67,7 +67,6 @@</span><br><span> </span><br><span> ifneq ($(filter pbx_ael,$(MENUSELECT_PBX)),)</span><br><span> UTILS:=$(filter-out aelparse,$(UTILS))</span><br><span style="color: hsl(0, 100%, 40%);">- UTILS:=$(filter-out conf2ael,$(UTILS))</span><br><span> endif</span><br><span> </span><br><span> all: $(UTILS)</span><br><span>@@ -87,7 +86,7 @@</span><br><span> rm -f .*.d</span><br><span> rm -f *.s *.i</span><br><span> rm -f astmm.c md5.c strcompat.c ast_expr2.c ast_expr2.h ast_expr2f.c pbx_ael.c pval.c hashtab.c lock.c</span><br><span style="color: hsl(0, 100%, 40%);">- rm -f aelparse.c aelbison.c conf2ael</span><br><span style="color: hsl(120, 100%, 40%);">+ rm -f aelparse.c aelbison.c</span><br><span> rm -f threadstorage.c</span><br><span> rm -f utils.c strings.c poll.c version.c sha1.c astobj2.c refcounter</span><br><span> rm -f db1-ast/.*.d</span><br><span>@@ -175,9 +174,6 @@</span><br><span> extconf.o: _ASTCFLAGS+=$(call get_menuselect_cflags,DETECT_DEADLOCKS)</span><br><span> extconf.o: extconf.c</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-conf2ael: LIBS+=$(AST_CLANG_BLOCKS_LIBS)</span><br><span style="color: hsl(0, 100%, 40%);">-conf2ael: conf2ael.o ast_expr2f.o ast_expr2.o hashtab.o lock.o aelbison.o aelparse.o pbx_ael.o pval.o extconf.o strcompat.o astmm.o</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> check_expr2: $(ASTTOPDIR)/main/ast_expr2f.c $(ASTTOPDIR)/main/ast_expr2.c $(ASTTOPDIR)/main/ast_expr2.h astmm.o</span><br><span> $(ECHO_PREFIX) echo " [CC] ast_expr2f.c -> ast_expr2fz.o"</span><br><span> $(CC) -g -c -I$(ASTTOPDIR)/include $(_ASTCFLAGS) -DYY_NO_INPUT $(ASTTOPDIR)/main/ast_expr2f.c -o ast_expr2fz.o</span><br><span>diff --git a/utils/conf2ael.c b/utils/conf2ael.c</span><br><span>deleted file mode 100644</span><br><span>index f668c3f..0000000</span><br><span>--- a/utils/conf2ael.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,731 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Asterisk -- An open source telephony toolkit.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2007, Digium, Inc.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Steve Murphy <murf@digium.com></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * See http://www.asterisk.org for more information about</span><br><span style="color: hsl(0, 100%, 40%);">- * the Asterisk project. Please do not directly contact</span><br><span style="color: hsl(0, 100%, 40%);">- * any of the maintainers of this project for assistance;</span><br><span style="color: hsl(0, 100%, 40%);">- * the project provides a web site, mailing lists and IRC</span><br><span style="color: hsl(0, 100%, 40%);">- * channels for your use.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software, distributed under the terms of</span><br><span style="color: hsl(0, 100%, 40%);">- * the GNU General Public License Version 2. See the LICENSE file</span><br><span style="color: hsl(0, 100%, 40%);">- * at the top of the source tree.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Reverse compile extensions.conf code into prototype AEL code</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*** MODULEINFO</span><br><span style="color: hsl(0, 100%, 40%);">- <depend>res_ael_share</depend></span><br><span style="color: hsl(0, 100%, 40%);">- <support_level>deprecated</support_level></span><br><span style="color: hsl(0, 100%, 40%);">- <deprecated_in>16</deprecated_in></span><br><span style="color: hsl(0, 100%, 40%);">- <removed_in>19</removed_in></span><br><span style="color: hsl(0, 100%, 40%);">- ***/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define ASTMM_LIBC ASTMM_IGNORE</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/paths.h" /* CONFIG_DIR */</span><br><span style="color: hsl(0, 100%, 40%);">-#include <locale.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <ctype.h></span><br><span style="color: hsl(0, 100%, 40%);">-#if !defined(SOLARIS) && !defined(__CYGWIN__)</span><br><span style="color: hsl(0, 100%, 40%);">-#include <err.h></span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-#include <regex.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/pbx.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/ast_expr.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/channel.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/chanvars.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/module.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/app.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/config.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/options.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/callerid.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/lock.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/hashtab.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/ael_structs.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/devicestate.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/stringfields.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/pval.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/extconf.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-const char *ast_config_AST_CONFIG_DIR = "/etc/asterisk"; /* placeholder */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void get_start_stop(unsigned int *word, int bitsperword, int totalbits, int *start, int *end);</span><br><span style="color: hsl(0, 100%, 40%);">-int all_bits_set(unsigned int *word, int bitsperword, int totalbits);</span><br><span style="color: hsl(0, 100%, 40%);">-extern char *days[];</span><br><span style="color: hsl(0, 100%, 40%);">-extern char *months[];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-char *config = "extensions.conf";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">-static char *registrar = "conf2ael";</span><br><span style="color: hsl(0, 100%, 40%);">-static char userscontext[AST_MAX_EXTENSION] = "default";</span><br><span style="color: hsl(0, 100%, 40%);">-static int static_config = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-static int write_protect_config = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-static int autofallthrough_config = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-static int clearglobalvars_config = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-char ast_config_AST_SYSTEM_NAME[20] = ""; */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* static AST_RWLIST_HEAD_STATIC(acf_root, ast_custom_function); */</span><br><span style="color: hsl(0, 100%, 40%);">-//extern char ast_config_AST_CONFIG_DIR[PATH_MAX];</span><br><span style="color: hsl(0, 100%, 40%);">-int option_debug = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-int option_verbose = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_add_profile(const char *x, uint64_t scale) { return 0;}</span><br><span style="color: hsl(0, 100%, 40%);">-/* Our own version of ast_log, since the expr parser uses it. -- stolen from utils/check_expr.c */</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) __attribute__((format(printf,5,6)));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- va_list vars;</span><br><span style="color: hsl(0, 100%, 40%);">- va_start(vars,fmt);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("LOG: lev:%d file:%s line:%d func: %s ",</span><br><span style="color: hsl(0, 100%, 40%);">- level, file, line, function);</span><br><span style="color: hsl(0, 100%, 40%);">- vprintf(fmt, vars);</span><br><span style="color: hsl(0, 100%, 40%);">- fflush(stdout);</span><br><span style="color: hsl(0, 100%, 40%);">- va_end(vars);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* stolen from pbx.c */</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_context;</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_app;</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef LOW_MEMORY</span><br><span style="color: hsl(0, 100%, 40%);">-#define EXT_DATA_SIZE 256</span><br><span style="color: hsl(0, 100%, 40%);">-#else</span><br><span style="color: hsl(0, 100%, 40%);">-#define EXT_DATA_SIZE 8192</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define SWITCH_DATA_LENGTH 256</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define VAR_BUF_SIZE 4096</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define VAR_NORMAL 1</span><br><span style="color: hsl(0, 100%, 40%);">-#define VAR_SOFTTRAN 2</span><br><span style="color: hsl(0, 100%, 40%);">-#define VAR_HARDTRAN 3</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define BACKGROUND_SKIP (1 << 0)</span><br><span style="color: hsl(0, 100%, 40%);">-#define BACKGROUND_NOANSWER (1 << 1)</span><br><span style="color: hsl(0, 100%, 40%);">-#define BACKGROUND_MATCHEXTEN (1 << 2)</span><br><span style="color: hsl(0, 100%, 40%);">-#define BACKGROUND_PLAYBACK (1 << 3)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- \brief ast_exten: An extension</span><br><span style="color: hsl(0, 100%, 40%);">- The dialplan is saved as a linked list with each context</span><br><span style="color: hsl(0, 100%, 40%);">- having it's own linked list of extensions - one item per</span><br><span style="color: hsl(0, 100%, 40%);">- priority.</span><br><span style="color: hsl(0, 100%, 40%);">-*/</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_exten {</span><br><span style="color: hsl(0, 100%, 40%);">- char *exten; /*!< Extension name */</span><br><span style="color: hsl(0, 100%, 40%);">- int matchcid; /*!< Match caller id ? */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *cidmatch; /*!< Caller id to match for this extension */</span><br><span style="color: hsl(0, 100%, 40%);">- int priority; /*!< Priority */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *label; /*!< Label */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_context *parent; /*!< The context this extension belongs to */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *app; /*!< Application to execute */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_app *cached_app; /*!< Cached location of application */</span><br><span style="color: hsl(0, 100%, 40%);">- void *data; /*!< Data to use (arguments) */</span><br><span style="color: hsl(0, 100%, 40%);">- void (*datad)(void *); /*!< Data destructor */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_exten *peer; /*!< Next higher priority with our extension */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *registrar; /*!< Registrar */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_exten *next; /*!< Extension with a greater ID */</span><br><span style="color: hsl(0, 100%, 40%);">- char stuff[0];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief ast_include: include= support in extensions.conf */</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_include {</span><br><span style="color: hsl(0, 100%, 40%);">- const char *name;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *rname; /*!< Context to include */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *registrar; /*!< Registrar */</span><br><span style="color: hsl(0, 100%, 40%);">- int hastime; /*!< If time construct exists */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_timing timing; /*!< time construct */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_include *next; /*!< Link them together */</span><br><span style="color: hsl(0, 100%, 40%);">- char stuff[0];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief ast_sw: Switch statement in extensions.conf */</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_sw {</span><br><span style="color: hsl(0, 100%, 40%);">- char *name;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *registrar; /*!< Registrar */</span><br><span style="color: hsl(0, 100%, 40%);">- char *data; /*!< Data load */</span><br><span style="color: hsl(0, 100%, 40%);">- int eval;</span><br><span style="color: hsl(0, 100%, 40%);">- AST_LIST_ENTRY(ast_sw) list;</span><br><span style="color: hsl(0, 100%, 40%);">- char *tmpdata;</span><br><span style="color: hsl(0, 100%, 40%);">- char stuff[0];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief ast_ignorepat: Ignore patterns in dial plan */</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_ignorepat {</span><br><span style="color: hsl(0, 100%, 40%);">- const char *registrar;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_ignorepat *next;</span><br><span style="color: hsl(0, 100%, 40%);">- const char pattern[0];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief ast_context: An extension context */</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_context {</span><br><span style="color: hsl(0, 100%, 40%);">- ast_rwlock_t lock; /*!< A lock to prevent multiple threads from clobbering the context */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_exten *root; /*!< The root of the list of extensions */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_context *next; /*!< Link them together */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_include *includes; /*!< Include other contexts */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_ignorepat *ignorepats; /*!< Patterns for which to continue playing dialtone */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *registrar; /*!< Registrar */</span><br><span style="color: hsl(0, 100%, 40%);">- AST_LIST_HEAD_NOLOCK(, ast_sw) alts; /*!< Alternative switches */</span><br><span style="color: hsl(0, 100%, 40%);">- ast_mutex_t macrolock; /*!< A lock to implement "exclusive" macros - held whilst a call is executing in the macro */</span><br><span style="color: hsl(0, 100%, 40%);">- char name[0]; /*!< Name of the context */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief ast_app: A registered application */</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_app {</span><br><span style="color: hsl(0, 100%, 40%);">- int (*execute)(struct ast_channel *chan, void *data);</span><br><span style="color: hsl(0, 100%, 40%);">- const char *synopsis; /*!< Synopsis text for 'show applications' */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *description; /*!< Description (help text) for 'show application <name>' */</span><br><span style="color: hsl(0, 100%, 40%);">- AST_RWLIST_ENTRY(ast_app) list; /*!< Next app in list */</span><br><span style="color: hsl(0, 100%, 40%);">- struct module *module; /*!< Module this app belongs to */</span><br><span style="color: hsl(0, 100%, 40%);">- char name[0]; /*!< Name of the application */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief ast_state_cb: An extension state notify register item */</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_state_cb {</span><br><span style="color: hsl(0, 100%, 40%);">- int id;</span><br><span style="color: hsl(0, 100%, 40%);">- void *data;</span><br><span style="color: hsl(0, 100%, 40%);">- ast_state_cb_type callback;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_state_cb *next;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Structure for dial plan hints</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- \note Hints are pointers from an extension in the dialplan to one or</span><br><span style="color: hsl(0, 100%, 40%);">- more devices (tech/name)</span><br><span style="color: hsl(0, 100%, 40%);">- - See \ref AstExtState</span><br><span style="color: hsl(0, 100%, 40%);">-*/</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_hint {</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_exten *exten; /*!< Extension */</span><br><span style="color: hsl(0, 100%, 40%);">- int laststate; /*!< Last known state */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_state_cb *callbacks; /*!< Callback list for this extension */</span><br><span style="color: hsl(0, 100%, 40%);">- AST_RWLIST_ENTRY(ast_hint) list;/*!< Pointer to next hint in list */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct store_hint {</span><br><span style="color: hsl(0, 100%, 40%);">- char *context;</span><br><span style="color: hsl(0, 100%, 40%);">- char *exten;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_state_cb *callbacks;</span><br><span style="color: hsl(0, 100%, 40%);">- int laststate;</span><br><span style="color: hsl(0, 100%, 40%);">- AST_LIST_ENTRY(store_hint) list;</span><br><span style="color: hsl(0, 100%, 40%);">- char data[1];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AST_LIST_HEAD(store_hints, store_hint);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define STATUS_NO_CONTEXT 1</span><br><span style="color: hsl(0, 100%, 40%);">-#define STATUS_NO_EXTENSION 2</span><br><span style="color: hsl(0, 100%, 40%);">-#define STATUS_NO_PRIORITY 3</span><br><span style="color: hsl(0, 100%, 40%);">-#define STATUS_NO_LABEL 4</span><br><span style="color: hsl(0, 100%, 40%);">-#define STATUS_SUCCESS 5</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern struct ast_context *local_contexts;</span><br><span style="color: hsl(0, 100%, 40%);">-extern struct ast_context *contexts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_custom_function *ast_custom_function_find(const char *name);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_custom_function *ast_custom_function_find(const char *name)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return 0; /* in "standalone" mode, functions are just not avail */</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct profile_entry {</span><br><span style="color: hsl(0, 100%, 40%);">- const char *name;</span><br><span style="color: hsl(0, 100%, 40%);">- uint64_t scale; /* if non-zero, values are scaled by this */</span><br><span style="color: hsl(0, 100%, 40%);">- int64_t mark;</span><br><span style="color: hsl(0, 100%, 40%);">- int64_t value;</span><br><span style="color: hsl(0, 100%, 40%);">- int64_t events;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct profile_data {</span><br><span style="color: hsl(0, 100%, 40%);">- int entries;</span><br><span style="color: hsl(0, 100%, 40%);">- int max_size;</span><br><span style="color: hsl(0, 100%, 40%);">- struct profile_entry e[0];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int bit_at(unsigned int *word, int bitsperword, int bitnum)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return word[bitnum/bitsperword] & (1 << (bitnum % bitsperword));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void get_start_stop(unsigned int *word, int bitsperword, int totalbits, int *start, int *end)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int i;</span><br><span style="color: hsl(0, 100%, 40%);">- int thisbit, thatbit = bit_at(word, bitsperword, totalbits-1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (i=0; i<totalbits; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- thisbit = bit_at(word, bitsperword, i);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (thisbit != thatbit ) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (thisbit) {</span><br><span style="color: hsl(0, 100%, 40%);">- *start = i;</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- *end = i;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- thatbit = thisbit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int all_bits_set(unsigned int *word, int bitsperword, int totalbits )</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- int i, total=totalbits/bitsperword,bitmask = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (i=0; i<bitsperword; i++)</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- bitmask |= (1 << i);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (i=0; i<total; i++)</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- if (word[i] != bitmask)</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_context *tmp;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_exten *e, *eroot;</span><br><span style="color: hsl(0, 100%, 40%);">- pval *tree, *tmptree, *sws;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_include *tmpi;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_sw *sw = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_ignorepat *ipi;</span><br><span style="color: hsl(0, 100%, 40%);">- pval *incl=0;</span><br><span style="color: hsl(0, 100%, 40%);">- int localdir = 0, i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- tree = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- tmptree = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* process the command line args */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i=1; i<argc; i++)</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- if (strcmp(argv[i],"-d")==0)</span><br><span style="color: hsl(0, 100%, 40%);">- localdir =1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* 3 simple steps: */</span><br><span style="color: hsl(0, 100%, 40%);">- /* 1. read in the extensions.conf config file</span><br><span style="color: hsl(0, 100%, 40%);">- * 2. traverse, and build an AEL tree</span><br><span style="color: hsl(0, 100%, 40%);">- * 3. Output the AEL tree into a file</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("WARNING: This is an EXTREMELY preliminary version of a program\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" that will someday hopefully do a thoughful and intelligent\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" job of transforming your extensions.conf file into an\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" extensions.ael file.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" This version has absolutely no intelligence, and pretty\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" much just does a direct conversion\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" The result will most likely need careful attention to\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" finish the job!!!!!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!localdir)</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" (You could use -d the use the extensions.conf in the current directory!)\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Loading %s/%s...\n", ast_config_AST_CONFIG_DIR, config);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!localdir)</span><br><span style="color: hsl(0, 100%, 40%);">- localized_use_conf_dir();</span><br><span style="color: hsl(0, 100%, 40%);">- localized_pbx_load_module();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("... Done!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- tmp = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while ((tmp = localized_walk_contexts(tmp)) ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Context: %s\n", tmp->name);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- printf("=========\n");</span><br><span style="color: hsl(0, 100%, 40%);">- tmp = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while ((tmp = localized_walk_contexts(tmp)) ) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* printf("Context: %s\n", tmp->name); */</span><br><span style="color: hsl(0, 100%, 40%);">- tmptree = pvalCreateNode(PV_CONTEXT);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!tree)</span><br><span style="color: hsl(0, 100%, 40%);">- tree = tmptree;</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- pvalTopLevAddObject(tree, tmptree);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pvalContextSetName(tmptree, ast_strdup(tmp->name));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (tmp->includes) {</span><br><span style="color: hsl(0, 100%, 40%);">- incl = pvalCreateNode(PV_INCLUDES);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalContextAddStatement(tmptree, incl);</span><br><span style="color: hsl(0, 100%, 40%);">- for (tmpi = tmp->includes; tmpi; ) { /* includes */</span><br><span style="color: hsl(0, 100%, 40%);">- if (strchr(tmpi->name,'|')==0) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (tmpi->hastime)</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- char timerange[15];</span><br><span style="color: hsl(0, 100%, 40%);">- char dowrange[10];</span><br><span style="color: hsl(0, 100%, 40%);">- char domrange[10];</span><br><span style="color: hsl(0, 100%, 40%);">- char monrange[10];</span><br><span style="color: hsl(0, 100%, 40%);">- int startbit=0, endbit=0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (all_bits_set(tmpi->timing.minmask, 30, 720))</span><br><span style="color: hsl(0, 100%, 40%);">- strcpy(timerange, "*");</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- int hr, min;</span><br><span style="color: hsl(0, 100%, 40%);">- char tbuf[20];</span><br><span style="color: hsl(0, 100%, 40%);">- get_start_stop(tmpi->timing.minmask, 30, 720, &startbit, &endbit);</span><br><span style="color: hsl(0, 100%, 40%);">- hr = startbit/30;</span><br><span style="color: hsl(0, 100%, 40%);">- min = (startbit % 30) * 2;</span><br><span style="color: hsl(0, 100%, 40%);">- sprintf(tbuf,"%02d:%02d", hr, min);</span><br><span style="color: hsl(0, 100%, 40%);">- strcpy(timerange, tbuf);</span><br><span style="color: hsl(0, 100%, 40%);">- hr = endbit/30;</span><br><span style="color: hsl(0, 100%, 40%);">- min = (endbit % 30) * 2;</span><br><span style="color: hsl(0, 100%, 40%);">- sprintf(tbuf,"%02d:%02d", hr, min);</span><br><span style="color: hsl(0, 100%, 40%);">- strcat(timerange,"-");</span><br><span style="color: hsl(0, 100%, 40%);">- strcat(timerange,tbuf);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (all_bits_set(&tmpi->timing.dowmask, 7, 7))</span><br><span style="color: hsl(0, 100%, 40%);">- strcpy(dowrange, "*");</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- get_start_stop(&tmpi->timing.dowmask, 7, 7, &startbit, &endbit);</span><br><span style="color: hsl(0, 100%, 40%);">- strcpy(dowrange, days[startbit]);</span><br><span style="color: hsl(0, 100%, 40%);">- strcat(dowrange,"-");</span><br><span style="color: hsl(0, 100%, 40%);">- strcat(dowrange, days[endbit]);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (all_bits_set(&tmpi->timing.monthmask, 12, 12))</span><br><span style="color: hsl(0, 100%, 40%);">- strcpy(monrange, "*");</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- get_start_stop(&tmpi->timing.monthmask, 12, 12, &startbit, &endbit);</span><br><span style="color: hsl(0, 100%, 40%);">- strcpy(monrange, months[startbit]);</span><br><span style="color: hsl(0, 100%, 40%);">- strcat(monrange,"-");</span><br><span style="color: hsl(0, 100%, 40%);">- strcat(monrange, months[endbit]);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (all_bits_set(&tmpi->timing.daymask, 31, 31))</span><br><span style="color: hsl(0, 100%, 40%);">- strcpy(domrange, "*");</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- char tbuf[20];</span><br><span style="color: hsl(0, 100%, 40%);">- get_start_stop(&tmpi->timing.daymask, 31, 31, &startbit, &endbit);</span><br><span style="color: hsl(0, 100%, 40%);">- sprintf(tbuf,"%d", startbit);</span><br><span style="color: hsl(0, 100%, 40%);">- strcpy(domrange, tbuf);</span><br><span style="color: hsl(0, 100%, 40%);">- strcat(domrange,"-");</span><br><span style="color: hsl(0, 100%, 40%);">- sprintf(tbuf,"%d", endbit);</span><br><span style="color: hsl(0, 100%, 40%);">- strcat(domrange, tbuf);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* now all 4 fields are set; what do we do? */</span><br><span style="color: hsl(0, 100%, 40%);">- pvalIncludesAddIncludeWithTimeConstraints(incl, strdup(tmpi->name), strdup(timerange), strdup(domrange), strdup(dowrange), strdup(monrange));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- pvalIncludesAddInclude(incl, strdup(tmpi->name));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- } else { /* it appears the timing constraint info is tacked onto the name, carve it up and divvy it out */</span><br><span style="color: hsl(0, 100%, 40%);">- char *dow,*dom,*mon;</span><br><span style="color: hsl(0, 100%, 40%);">- char *all = strdup(tmpi->name);</span><br><span style="color: hsl(0, 100%, 40%);">- char *hr = strchr(all,'|');</span><br><span style="color: hsl(0, 100%, 40%);">- if (hr) {</span><br><span style="color: hsl(0, 100%, 40%);">- *hr++ = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- dow = strchr(hr,'|');</span><br><span style="color: hsl(0, 100%, 40%);">- if (dow) {</span><br><span style="color: hsl(0, 100%, 40%);">- *dow++ = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- dom = strchr(dow,'|');</span><br><span style="color: hsl(0, 100%, 40%);">- if (dom) {</span><br><span style="color: hsl(0, 100%, 40%);">- *dom++ = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- mon = strchr(dom,'|');</span><br><span style="color: hsl(0, 100%, 40%);">- if (mon) {</span><br><span style="color: hsl(0, 100%, 40%);">- *mon++ = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- /* now all 4 fields are set; what do we do? */</span><br><span style="color: hsl(0, 100%, 40%);">- pvalIncludesAddIncludeWithTimeConstraints(incl, strdup(all), strdup(hr), strdup(dow), strdup(dom), strdup(mon));</span><br><span style="color: hsl(0, 100%, 40%);">- /* the original data is always best to keep (no 2-min rounding) */</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- ast_log(LOG_ERROR,"No month spec attached to include!\n");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- ast_log(LOG_ERROR,"No day of month spec attached to include!\n");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- ast_log(LOG_ERROR,"No day of week spec attached to include!\n");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- free(all);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- tmpi = tmpi->next;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- for (ipi = tmp->ignorepats; ipi; ) { /* ignorepats */</span><br><span style="color: hsl(0, 100%, 40%);">- incl = pvalCreateNode(PV_IGNOREPAT);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalIgnorePatSetPattern(incl,(char *)ipi->pattern);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalContextAddStatement(tmptree, incl);</span><br><span style="color: hsl(0, 100%, 40%);">- ipi = ipi->next;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- eroot=0;</span><br><span style="color: hsl(0, 100%, 40%);">- while ( (eroot = localized_walk_context_extensions(tmp, eroot)) ) {</span><br><span style="color: hsl(0, 100%, 40%);">- pval *exten = pvalCreateNode(PV_EXTENSION);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalContextAddStatement(tmptree, exten);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalExtenSetName(exten, ast_strdup(eroot->exten));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (eroot->peer) {</span><br><span style="color: hsl(0, 100%, 40%);">- pval *block = pvalCreateNode(PV_STATEMENTBLOCK);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalExtenSetStatement(exten, block);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- e = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while ( (e = localized_walk_extension_priorities(eroot, e)) ) {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pval *statemnt = pvalCreateNode(PV_APPLICATION_CALL);</span><br><span style="color: hsl(0, 100%, 40%);">- pval *args = pvalCreateNode(PV_WORD);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* printf(" %s(%s)\n", e->app, (char*)e->data); */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pvalAppCallSetAppName(statemnt, ast_strdup(e->app));</span><br><span style="color: hsl(0, 100%, 40%);">- pvalWordSetString(args, ast_strdup(e->data));</span><br><span style="color: hsl(0, 100%, 40%);">- pvalAppCallAddArg(statemnt, args);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pvalStatementBlockAddStatement(block, statemnt);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (eroot->priority == -1) {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pval *statemnt = pvalCreateNode(PV_APPLICATION_CALL);</span><br><span style="color: hsl(0, 100%, 40%);">- pval *args = pvalCreateNode(PV_WORD);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* printf("Mike, we have a hint on exten %s with data %s\n", eroot->exten, eroot->app); */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pvalAppCallSetAppName(statemnt, "NoOp");</span><br><span style="color: hsl(0, 100%, 40%);">- pvalWordSetString(args, ast_strdup(eroot->app));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pvalExtenSetStatement(exten, statemnt);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalExtenSetHints(exten, ast_strdup(eroot->app));</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pval *statemnt = pvalCreateNode(PV_APPLICATION_CALL);</span><br><span style="color: hsl(0, 100%, 40%);">- pval *args = pvalCreateNode(PV_WORD);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* printf(" %s (%s)\n", eroot->app, (char *)eroot->data); */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pvalAppCallSetAppName(statemnt, ast_strdup(eroot->app));</span><br><span style="color: hsl(0, 100%, 40%);">- pvalWordSetString(args, ast_strdup(eroot->data));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pvalAppCallAddArg(statemnt, args);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalExtenSetStatement(exten, statemnt);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* printf(" extension: %s\n", eroot->exten); */</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (AST_LIST_FIRST(&tmp->alts)) {</span><br><span style="color: hsl(0, 100%, 40%);">- sws = pvalCreateNode(PV_SWITCHES);</span><br><span style="color: hsl(0, 100%, 40%);">- pvalContextAddStatement(tmptree,sws);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- sw = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while ((sw = localized_walk_context_switches(tmp,sw)) ) {</span><br><span style="color: hsl(0, 100%, 40%);">- pvalSwitchesAddSwitch(sws, ast_strdup(sw->name));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Generating aelout.ael file...\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ael2_print("aelout.ael", tree);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("...Done!\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* ==================================== for linking internal stuff to external stuff */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int pbx_builtin_setvar(struct ast_channel *chan, const char *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_pbx_builtin_setvar(chan, data);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void pbx_substitute_variables_helper(struct ast_channel *c,const char *cp1,char *cp2,int count);</span><br><span style="color: hsl(0, 100%, 40%);">-void pbx_substitute_variables_helper(struct ast_channel *c,const char *cp1,char *cp2,int count)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (cp1 && *cp1)</span><br><span style="color: hsl(0, 100%, 40%);">- strncpy(cp2,cp1,AST_MAX_EXTENSION); /* Right now, this routine is ONLY being called for</span><br><span style="color: hsl(0, 100%, 40%);">- a possible var substitution on extension names,</span><br><span style="color: hsl(0, 100%, 40%);">- so....! */</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- *cp2 = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_add_extension2(struct ast_context *con,</span><br><span style="color: hsl(0, 100%, 40%);">- int replace, const char *extension, int priority, const char *label, const char *callerid,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *application, void *data, void (*datad)(void *),</span><br><span style="color: hsl(0, 100%, 40%);">- const char *registrar, const char *registrar_file, int registrar_line)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_add_extension2(con, replace, extension, priority, label, callerid, application, data, datad, registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_context_add_ignorepat2(con, value, registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_context_add_switch2(struct ast_context *con, const char *value,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *data, int eval, const char *registrar)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_context_add_switch2(con, value, data, eval, registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_context_add_include2(struct ast_context *con, const char *value,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *registrar)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_context_add_include2(con, value,registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *name, const char *registrar)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- printf("find/Creating context %s, registrar=%s\n", name, registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_context_find_or_create(extcontexts, exttable, name, registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void __ast_cli_register_multiple(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void __ast_cli_register_multiple(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_module_register(const struct ast_module_info *x)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_module_unregister(const struct ast_module_info *x)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_cli_unregister_multiple(void);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_cli_unregister_multiple(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_context *ast_walk_contexts(struct ast_context *con);</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_context *ast_walk_contexts(struct ast_context *con)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_walk_contexts(con);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_context_destroy(struct ast_context *con, const char *registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_context_destroy(struct ast_context *con, const char *registrar)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_context_destroy(con, registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_context_verify_includes(struct ast_context *con);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_context_verify_includes(struct ast_context *con)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_context_verify_includes(con);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *registrar)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- localized_merge_contexts_and_delete(extcontexts, exttable, registrar);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-const char *ast_get_context_name(struct ast_context *con);</span><br><span style="color: hsl(0, 100%, 40%);">-const char *ast_get_context_name(struct ast_context *con)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return con ? con->name : NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_exten *ast_walk_context_extensions(struct ast_context *con, struct ast_exten *exten);</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_exten *ast_walk_context_extensions(struct ast_context *con, struct ast_exten *exten)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-const struct ast_include *ast_walk_context_includes(const struct ast_context *con, const struct ast_include *inc);</span><br><span style="color: hsl(0, 100%, 40%);">-const struct ast_include *ast_walk_context_includes(const struct ast_context *con, const struct ast_include *inc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_exten *pbx_find_extension(struct ast_channel *chan,</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_context *bypass,</span><br><span style="color: hsl(0, 100%, 40%);">- struct pbx_find_info *q,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *context,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *exten,</span><br><span style="color: hsl(0, 100%, 40%);">- int priority,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *label,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *callerid,</span><br><span style="color: hsl(0, 100%, 40%);">- enum ext_match_t action);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_exten *pbx_find_extension(struct ast_channel *chan,</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_context *bypass,</span><br><span style="color: hsl(0, 100%, 40%);">- struct pbx_find_info *q,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *context,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *exten,</span><br><span style="color: hsl(0, 100%, 40%);">- int priority,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *label,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *callerid,</span><br><span style="color: hsl(0, 100%, 40%);">- enum ext_match_t action)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return localized_find_extension(bypass, q, context, exten, priority, label, callerid, action);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_hashtab_compare_contexts(const void *ah_a, const void *ah_b);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int ast_hashtab_compare_contexts(const void *ah_a, const void *ah_b)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-unsigned int ast_hashtab_hash_contexts(const void *obj);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-unsigned int ast_hashtab_hash_contexts(const void *obj)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef DEBUG_THREADS</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_mark_lock_acquired(void *lock_addr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_remove_lock_info(void *lock_addr, struct ast_bt *bt)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_store_lock_info(enum ast_lock_type type, const char *filename,</span><br><span style="color: hsl(0, 100%, 40%);">- int line_num, const char *func, const char *lock_name, void *lock_addr, struct ast_bt *bt)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_BKTR</span><br><span style="color: hsl(0, 100%, 40%);">-int __ast_bt_get_addresses(struct ast_bt *bt)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ast_vector_string *__ast_bt_get_symbols(void **addresses, size_t num_frames)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif /* HAVE_BKTR */</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_suspend_lock_info(void *lock_addr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-void ast_restore_lock_info(void *lock_addr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif /* DEBUG_THREADS */</span><br><span>diff --git a/utils/utils.xml b/utils/utils.xml</span><br><span>index 777789a..ae72bac 100644</span><br><span>--- a/utils/utils.xml</span><br><span>+++ b/utils/utils.xml</span><br><span>@@ -28,10 +28,6 @@</span><br><span> <defaultenabled>no</defaultenabled></span><br><span> <support_level>extended</support_level></span><br><span> </member></span><br><span style="color: hsl(0, 100%, 40%);">- <member name="conf2ael"></span><br><span style="color: hsl(0, 100%, 40%);">- <defaultenabled>no</defaultenabled></span><br><span style="color: hsl(0, 100%, 40%);">- <support_level>deprecated</support_level></span><br><span style="color: hsl(0, 100%, 40%);">- </member></span><br><span> <member name="muted"></span><br><span> <defaultenabled>no</defaultenabled></span><br><span> <support_level>deprecated</support_level></span><br><span></span><br></pre><div style="white-space:pre-wrap"></div><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/16317">change 16317</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/16317"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I75dc77162926fb17e7c6caf8f04e3aabd792fb0c </div>
<div style="display:none"> Gerrit-Change-Number: 16317 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-Reviewer: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Sean Bright <sean@seanbright.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>