pm.c
00001 #include <u/libu.h>
00002 #include "pm.h"
00003
00004 TAILQ_HEAD(pm_list_s, pm_s);
00005 typedef struct pm_list_s pm_list_t;
00006
00007
00008 struct pm_s
00009 {
00010 TAILQ_ENTRY(pm_s) np;
00011 char *pattern;
00012
00013 pm_list_t list;
00014 };
00015
00016 int pm_free(pm_t *pm)
00017 {
00018 pm_t *item;
00019
00020 dbg_err_if(pm == NULL);
00021
00022 while((item = TAILQ_FIRST(&pm->list)) != NULL)
00023 {
00024 TAILQ_REMOVE(&pm->list, item, np);
00025 pm_free(item);
00026
00027 }
00028 if(pm->pattern)
00029 U_FREE(pm->pattern);
00030
00031 U_FREE(pm);
00032
00033 return 0;
00034 err:
00035 return ~0;
00036 }
00037
00038
00039 int pm_create(pm_t **ppm)
00040 {
00041 pm_t *pm = NULL;
00042
00043 dbg_err_if(ppm == NULL);
00044
00045 pm = u_zalloc(sizeof(pm_t));
00046 dbg_err_if(pm == NULL);
00047
00048 TAILQ_INIT(&pm->list);
00049
00050 *ppm = pm;
00051
00052 return 0;
00053 err:
00054 return ~0;
00055 }
00056
00057 int pm_add(pm_t *pm, const char *pattern)
00058 {
00059 pm_t *item = NULL;
00060
00061 dbg_err_if(pm == NULL);
00062 dbg_err_if(pattern == NULL);
00063
00064 dbg_err_if(pm_create(&item));
00065
00066 item->pattern = u_strdup(pattern);
00067 dbg_err_if(item->pattern == NULL);
00068
00069 TAILQ_INSERT_TAIL(&pm->list, item, np);
00070
00071 return 0;
00072 err:
00073 if(item)
00074 pm_free(item);
00075 return ~0;
00076 }
00077
00078 int pm_remove(pm_t *pm, const char *pattern)
00079 {
00080 pm_t *item;
00081
00082 dbg_err_if(pm == NULL);
00083 dbg_err_if(pattern == NULL);
00084
00085 TAILQ_FOREACH(item, &pm->list, np)
00086 {
00087 if(!strcmp(pattern, item->pattern))
00088 {
00089 TAILQ_REMOVE(&pm->list, item, np);
00090 pm_free(item);
00091 }
00092 }
00093
00094 return 0;
00095 err:
00096 return ~0;
00097 }
00098
00099 int pm_is_empty(pm_t *pm)
00100 {
00101 dbg_err_if(pm == NULL);
00102
00103 return TAILQ_FIRST(&pm->list) == NULL;
00104 err:
00105 return 1;
00106 }
00107
00108 int pm_match(pm_t *pm, const char *uri)
00109 {
00110 pm_t *item;
00111
00112 dbg_err_if(pm == NULL);
00113 dbg_err_if(uri == NULL);
00114
00115 TAILQ_FOREACH(item, &pm->list, np)
00116 {
00117 if(!fnmatch(item->pattern, uri, 0))
00118 return 1;
00119 }
00120
00121 err:
00122 return 0;
00123 }
00124