1 /*******************************************************************
2 uLan Utilities Library - C library of basic reusable constructions
4 ul_logreg.c - registration of logging domains
6 (C) Copyright 2006 by Pavel Pisa - Originator
8 The uLan utilities library can be used, copied and modified under
10 - GPL - GNU General Public License
11 - LGPL - GNU Lesser General Public License
12 - MPL - Mozilla Public License
13 - and other licenses added by project originators
14 Code can be modified and re-distributed under any combination
15 of the above listed licenses. If contributor does not agree with
16 some of the licenses, he/she can delete appropriate line.
17 Warning, if you delete all lines, you are not allowed to
18 distribute source code and/or binaries utilizing code.
20 See files COPYING and README for details.
22 *******************************************************************/
29 #include <ul_logbase.h>
30 #include <ul_logreg.h>
31 #include <ul_gsacust.h>
34 typedef struct ul_log_domains_t {
35 #ifdef UL_LOG_DOMAINS_STATIC
36 /*gsa_static_array_field_t domains;*/
38 ul_log_domain_t * const* items;
41 #else /*UL_LOG_DOMAINS_STATIC*/
42 gsa_array_field_t domains;
43 #endif /*UL_LOG_DOMAINS_STATIC*/
46 typedef const char *ul_log_domains_key_t;
49 ul_log_domains_cmp_fnc(const ul_log_domains_key_t *a, const ul_log_domains_key_t *b)
54 /* Custom array declarations */
55 #ifdef UL_LOG_DOMAINS_STATIC
57 GSA_STATIC_CUST_DEC(ul_log_domains, ul_log_domains_t, ul_log_domain_t, ul_log_domains_key_t,
58 domains, name, ul_log_domains_cmp_fnc)
60 GSA_STATIC_CUST_IMP(ul_log_domains, ul_log_domains_t, ul_log_domain_t, ul_log_domains_key_t,
61 domains, name, ul_log_domains_cmp_fnc, 0)
63 #else /*UL_LOG_DOMAINS_STATIC*/
65 GSA_CUST_DEC(ul_log_domains, ul_log_domains_t, ul_log_domain_t, ul_log_domains_key_t,
66 domains, name, ul_log_domains_cmp_fnc)
68 GSA_CUST_IMP(ul_log_domains, ul_log_domains_t, ul_log_domain_t, ul_log_domains_key_t,
69 domains, name, ul_log_domains_cmp_fnc, 0)
71 #endif /*UL_LOG_DOMAINS_STATIC*/
73 ul_log_domains_t ul_log_domains;
76 extern int ul_log_cutoff_level;
78 int ul_log_domain_setlevel(const char *name, int setlevel)
82 ul_log_domains_it_t it;
83 ul_log_domain_t *domain=NULL;
88 if(setlevel>UL_LOGL_MAX)
94 all_fl=!strcmp(name,"all") || !strcmp(name,"ALL");
97 domain=ul_log_domains_find(&ul_log_domains,&name);
101 domain->level=setlevel;
103 ul_for_each_it(ul_log_domains, &ul_log_domains, it){
104 domain=ul_log_domains_it2item(&it);
105 domain->level=setlevel;
112 int ul_log_domain_getlevel(const char *name)
114 ul_log_domain_t *domain=NULL;
119 domain=ul_log_domains_find(&ul_log_domains,&name);
124 return domain->level;
127 #ifndef UL_MAX_DOMAIN_NAME
128 #define UL_MAX_DOMAIN_NAME 20
129 #endif /*UL_MAX_DOMAIN_NAME*/
131 int ul_log_domain_arg2levels(const char *arg)
136 char name[UL_MAX_DOMAIN_NAME+1];
146 while(isalnum(*p)||(*p=='_')) p++;
148 if(l>UL_MAX_DOMAIN_NAME)
149 l=UL_MAX_DOMAIN_NAME;
152 if(*p&&(*p!='.')&&(*p!='='))
157 l=strtol(r,(char**)&p,0);
158 if(!p||(p==r)||(*p&&(*p!=':')&&(*p!=',')))
160 if(ul_log_domain_setlevel(name, l)<0)
169 int ul_logreg_domain(ul_log_domain_t *domain)
171 ul_log_check_default_output();
173 domain->level=ul_log_cutoff_level;
174 return ul_log_domains_insert(&ul_log_domains,domain);
177 int ul_logreg_domains_static(ul_log_domain_t *const *domains, int count)
179 if(!ul_log_domains.domains.items && !ul_log_domains.domains.alloc_count){
180 ul_log_domains.domains.items=(void**)domains;
181 ul_log_domains.domains.count=count;
182 ul_log_check_default_output();
184 if(!(*domains)->level)
185 (*domains)->level=ul_log_cutoff_level;
191 if(ul_logreg_domain(*(domains++))<0)
197 void ul_logreg_for_each_domain(ul_logreg_domain_cb_t *callback, void *context)
199 ul_log_domains_it_t it;
200 ul_log_domain_t *domain;
201 ul_for_each_it(ul_log_domains, &ul_log_domains, it) {
202 domain=ul_log_domains_it2item(&it);
205 ret = callback(domain, context);