1 #include "../../src/bsdconv.h"
2 #include "WHITESPACE.h"
3 
cbcreate(struct bsdconv_instance * ins,struct bsdconv_hash_entry * arg)4 int cbcreate(struct bsdconv_instance *ins, struct bsdconv_hash_entry *arg){
5 	struct my_s *t;
6 	if(bsdconv_hash_has(ins, HASHKEY)){
7 		t=bsdconv_hash_get(ins, HASHKEY);
8 	}else{
9 		t=malloc(sizeof(struct my_s));
10 		bsdconv_hash_set(ins, HASHKEY, t);
11 	}
12 	t->queue=NULL;
13 	t->rerail=NULL;
14 	THIS_CODEC(ins)->priv=t;
15 	return 0;
16 }
17 
cbinit(struct bsdconv_instance * ins)18 void cbinit(struct bsdconv_instance *ins){
19 	struct my_s *t=THIS_CODEC(ins)->priv;
20 	t->offsetA=0;
21 	t->offsetB=0;
22 	t->last=&t->queue;
23 	struct data_rt *q;
24 	while(t->queue){
25 		DATUM_FREE(ins, (struct data_rt *)t->queue->data);
26 		q=t->queue;
27 		t->queue=t->queue->next;
28 		DATUM_FREE(ins, q);
29 	}
30 }
31 
cbdestroy(struct bsdconv_instance * ins)32 void cbdestroy(struct bsdconv_instance *ins){
33 	struct my_s *t=THIS_CODEC(ins)->priv;
34 	struct data_rt *q;
35 	if(bsdconv_hash_has(ins, HASHKEY)){
36 		while(t->queue){
37 			DATUM_FREE(ins, (struct data_rt *)t->queue->data);
38 			q=t->queue;
39 			t->queue=t->queue->next;
40 			DATUM_FREE(ins, q);
41 		}
42 		free(t);
43 		bsdconv_hash_del(ins, HASHKEY);
44 	}
45 }
46 
cbconv(struct bsdconv_instance * ins)47 void cbconv(struct bsdconv_instance *ins){
48 	unsigned char *data;
49 	struct bsdconv_phase *this_phase=THIS_PHASE(ins);
50 	struct my_s *t=THIS_CODEC(ins)->priv;
51 	struct data_rt *q;
52 	data=this_phase->curr->data;
53 	int i;
54 	uint32_t ucs=0;
55 
56 	this_phase->state.status=NEXTPHASE;
57 
58 	if(this_phase->curr->len>0 && data[0]==0x1){
59 		for(i=1;i<this_phase->curr->len;++i){
60 			ucs<<=8;
61 			ucs|=data[i];
62 		}
63 		if(ucs==0x09||ucs==0x0A||ucs==0x0D||ucs==0x20){
64 			DATA_MALLOC(ins, q);
65 			*(t->last)=q;
66 			q->next=NULL;
67 			q->flags=0;
68 			t->last=&q->next;
69 			q->data=(void *) dup_data_rt(ins, this_phase->curr);
70 			((struct data_rt *)q->data)->next=NULL;
71 			q->len=t->offsetA;
72 
73 			if(t->rerail){
74 				t->rerail->flags |= (F_MATCH | F_PENDING);
75 				t->rerail->match_data = NULL;
76 			}
77 
78 			return;
79 		}
80 	}
81 	t->offsetA+=1;
82 
83 	this_phase->data_tail->next=dup_data_rt(ins, this_phase->curr);
84 	this_phase->data_tail=this_phase->data_tail->next;
85 	this_phase->data_tail->next=NULL;
86 
87 	return;
88 }
89