* Initialize the static structure to zeros, then
* apply all the default values.
*/
-static void init_resource(int type, RES_ITEM *items, int pass)
+static void init_resource(CONFIG *config, int type, RES_ITEM *items, int pass)
{
int i;
int rindex = type - r_first;
- memset((char *)&res_all, 0, res_all_size);
+ memset(config->m_res_all, 0, config->m_res_all_size);
res_all.hdr.rcode = type;
res_all.hdr.refcnt = 1;
p_resource
};
+CONFIG *new_config_parser()
+{
+ CONFIG *config;
+ config = (CONFIG *)malloc(sizeof(CONFIG));
+ memset(config, 0, sizeof(CONFIG));
+ return config;
+}
+
+void CONFIG::init(
+ const char *cf,
+ LEX_ERROR_HANDLER *scan_error,
+ int err_type,
+ void *vres_all,
+ int res_all_size,
+ int r_first,
+ int r_last,
+ RES_TABLE *resources,
+ RES **res_head)
+{
+ m_cf = cf;
+ m_scan_error = scan_error;
+ m_err_type = err_type;
+ m_res_all = vres_all;
+ m_res_all_size = res_all_size;
+ m_r_first = r_first;
+ m_r_last = r_last;
+ m_resources = resources;
+ m_res_head = res_head;
+}
+
/*********************************************************************
*
* Parse configuration file
*/
int
parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error, int err_type)
+{
+ int ok;
+ CONFIG *config = new_config_parser();
+ config->init(cf, scan_error, err_type, (void *)&res_all, res_all_size,
+ r_first, r_last, resources, res_head);
+ ok = config->parse_config();
+ free(config);
+ return ok;
+}
+
+
+bool CONFIG::parse_config()
{
LEX *lc = NULL;
int token, i, pass;
int level = 0;
static bool first = true;
int errstat;
+ const char *cf = m_cf;
+ LEX_ERROR_HANDLER *scan_error = m_scan_error;
+ int err_type = m_err_type;
if (first && (errstat=rwl_init(&res_lock)) != 0) {
berrno be;
}
state = p_resource;
res_type = resources[i].rcode;
- init_resource(res_type, items, pass);
+ init_resource(this, res_type, items, pass);
break;
}
}
#endif
}
-bool
+static bool
find_config_file(const char *config_file, char *full_path, int max_path)
{
if (first_path_separator(config_file) != NULL) {
* Free configuration resources
*
*/
+void CONFIG::free_resources()
+{
+ for (int i=m_r_first; i<=m_r_last; i++) {
+ free_resource(m_res_head[i-m_r_first], i);
+ m_res_head[i-m_r_first] = NULL;
+ }
+}
+
+RES **CONFIG::save_resources()
+{
+ int num = m_r_last - m_r_first + 1;
+ RES **res = (RES **)malloc(num*sizeof(RES *));
+ for (int i=0; i<num; i++) {
+ res[i] = m_res_head[i];
+ m_res_head[i] = NULL;
+ }
+ return res;
+}
+
+RES **CONFIG::new_res_head()
+{
+ int size = (m_r_last - m_r_first + 1) * sizeof(RES *);
+ RES **res = (RES **)malloc(size);
+ memset(res, 0, size);
+ return res;
+}
+
void free_config_resources()
{
for (int i=r_first; i<=r_last; i++) {
}
}
+#ifdef xxx
RES **save_config_resources()
{
int num = r_last - r_first + 1;
memset(res, 0, size);
return res;
}
+#endif