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 /* this struct actually holds a tree but we use it as a plain linked list */
00008 struct pm_s
00009 {
00010     TAILQ_ENTRY(pm_s) np; /* next & prev pointers */
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; /* empty */
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; /* matches */
00119     }
00120 
00121 err:
00122     return 0; /* doesn't match */
00123 }
00124 

←Products
Copyright © 2005-2012 - KoanLogic S.r.l. - All rights reserved