tags.c 1.93 KB
Newer Older
1 2 3 4 5 6
/* block-level tags for passing html blocks through the blender
 */
#define __WITHOUT_AMALLOC 1
#include "cstring.h"
#include "tags.h"

7 8 9 10 11 12 13 14 15
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"
16 17


18
/* define an additional html block tag
19 20 21 22
 */
void
mkd_define_tag(char *id, int selfclose)
{
23 24 25 26 27 28
    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))) ) {
29 30 31
	/* extratags could be deallocated */
	if ( S(extratags) == 0 )
	    CREATE(extratags);
32 33 34 35 36
	p = &EXPAND(extratags);
	p->id = id;
	p->size = strlen(id);
	p->selfclose = selfclose;
    }
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
}


/* 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*);


57
/* sort the list of extra html block tags for later searching
58 59 60 61
 */
void
mkd_sort_tags()
{
62
    qsort(T(extratags), S(extratags), sizeof(struct kw), (stfu)casort);
63 64 65 66 67 68 69 70 71
}


/* look for a token in the html block tag list
 */
struct kw*
mkd_search_tags(char *pat, int len)
{
    struct kw key;
72
    struct kw *ret;
73 74 75 76
    
    key.id = pat;
    key.size = len;
    
77 78
    if ( (ret=bsearch(&key,blocktags,NR_blocktags,sizeof key,(stfu)casort)) )
	return ret;
79

80 81 82 83 84
    if ( S(extratags) )
	return bsearch(&key,T(extratags),S(extratags),sizeof key,(stfu)casort);
    
    return 0;
}
85 86


87
/* destroy the extratags list (for shared libraries)
88 89 90 91
 */
void
mkd_deallocate_tags()
{
92 93
    if ( S(extratags) > 0 )
	DELETE(extratags);
94
} /* mkd_deallocate_tags */