/* block-level tags for passing html blocks through the blender */ #define __WITHOUT_AMALLOC 1 #include "cstring.h" #include "tags.h" STRING(struct kw) extratags; /* the standard collection of tags are built and sorted when * discount is configured, so all we need to do is pull them * in and use them. * * Additional tags still need to be allocated, sorted, and deallocated. */ #include "blocktags" /* define an additional html block tag */ void mkd_define_tag(char *id, int selfclose) { struct kw *p; /* only add the new tag if it doesn't exist in * either the standard or extra tag tables. */ if ( !(p = mkd_search_tags(id, strlen(id))) ) { /* extratags could be deallocated */ if ( S(extratags) == 0 ) CREATE(extratags); p = &EXPAND(extratags); p->id = id; p->size = strlen(id); p->selfclose = selfclose; } } /* case insensitive string sort (for qsort() and bsearch() of block tags) */ static int casort(struct kw *a, struct kw *b) { if ( a->size != b->size ) return a->size - b->size; return strncasecmp(a->id, b->id, b->size); } /* stupid cast to make gcc shut up about the function types being * passed into qsort() and bsearch() */ typedef int (*stfu)(const void*,const void*); /* sort the list of extra html block tags for later searching */ void mkd_sort_tags() { qsort(T(extratags), S(extratags), sizeof(struct kw), (stfu)casort); } /* look for a token in the html block tag list */ struct kw* mkd_search_tags(char *pat, int len) { struct kw key; struct kw *ret; key.id = pat; key.size = len; if ( (ret=bsearch(&key,blocktags,NR_blocktags,sizeof key,(stfu)casort)) ) return ret; if ( S(extratags) ) return bsearch(&key,T(extratags),S(extratags),sizeof key,(stfu)casort); return 0; } /* destroy the extratags list (for shared libraries) */ void mkd_deallocate_tags() { if ( S(extratags) > 0 ) DELETE(extratags); } /* mkd_deallocate_tags */