File: tags.c

package info (click to toggle)
ruby-rdiscount 2.1.8-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, stretch
  • size: 412 kB
  • ctags: 578
  • sloc: ansic: 4,122; ruby: 447; makefile: 2
file content (94 lines) | stat: -rw-r--r-- 1,979 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* 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 */